深度学习之Matlab 转C++在iOS上测试CNN手型识别

1 前言

在上一篇Blog,我介绍了在iOS上运行CNN的一些方法。但是,一般来说,我们需要一个性能强劲的机器来跑CNN,我们只不过需要将得到的结果用于移动端。之前在Matlab使用UFLDL的代码修改后跑了手型识别的3层CNN,这里我们就考虑将Matlab转C之后移植到xcode中。

Step 1:Matlab 转c

首先要保证代码可以跑,可以运行,比如我这边,如下测试cnn识别手型:

>> parameters = load(‘./opt_parameters/opttheta_8epoches_cnn.mat‘);
cnnPredict(imread(‘./data/test_five1 (1).bmp‘),parameters.opttheta)
ans =

     5

大家可以看到,我识别出来是5个手指。OK,CNN没有问题。现在就是要将cnnPredict函数转c,这里大家可以看到这个函数包含了输入数据和已训练的参数。

function labels = cnnPredict(images,opttheta)

基本方式是使用Matlab自带的工具:coder。

在Command窗口输入coder:

新建一个项目:

这里我已经导入了我要转的文件cnnPredict.m,里面有两个输入变量,我需要定义其变量类型,这里我使用autodefine types,就是写一个脚本运行这个函数,就行。也就是我一开始贴的代码,识别出来后是这样:

这里大家可以看到我这边CNN的参数并不是很多,也就是19万个参数而已。

接下来就是build了,这里选择c/c++ static library,并且只输出c code:

build结果如下:

有可能你会build失败,这个时候可能是数据类型问题,可以根据具体情况进行修改到成功为止。

生成的code在文件夹的codegen文件夹中:

Step 2:将.Mat参数导出为.txt格式

在训练的时候,我们的cnn参数是存储在.mat中,因此,为了能在xcode中使用,我们需要将参数导出,这里我选择导出为.txt格式。

导出方法非常简单,一条代码;

>> save(‘opttheta.txt‘,‘opttheta‘,‘-ASCII‘); %将opt theta参数保存为opttheta.txt

Step 3: 新建iOS工程,导入cnnPredict代码

这一步很简单,把整个文件夹拉进来就OK了。

注意cnnPredict.h代码,我们要用的也就是这里面的函数了:

/*
 * File: cnnPredict.h
 *
 * MATLAB Coder version            : 2.7
 * C/C++ source code generated on  : 16-Jul-2015 16:22:01
 */

#ifndef __CNNPREDICT_H__
#define __CNNPREDICT_H__

/* Include Files */
#include <math.h>
#include <stddef.h>
#include <stdlib.h>
#include <string.h>
#include "rt_nonfinite.h"
#include "rtwtypes.h"
#include "cnnPredict_types.h"

/* Function Declarations */
extern double cnnPredict(const double images[9216], const double opttheta[195245]);

#endif

/*
 * File trailer for cnnPredict.h
 *
 * [EOF]
 */

注意的是导入运行里面有个interface文件夹会导致运行失败,应删除之,不会影响其他。

Step 4 在Xcode中导入参数

这一步就是读取txt文件中的数据并转存为double的数组,直接贴代码:

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"opttheta" ofType:@"txt"];
    NSString *testString = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
    NSMutableArray *thetaString = (NSMutableArray *)[testString componentsSeparatedByString:@"\n"];
    [thetaString removeLastObject];
    NSLog(@"Theta1 count:%lu",(unsigned long)thetaString.count);
    for (int i = 0; i < thetaString.count; i++) {
        NSString *data = [thetaString objectAtIndex:i];
        theta[i] = [data doubleValue];
    }

从代码中可以看到,就是用’\n’来分割数据,道理非常简单。

Step 5 将图片转换为double数组

为了使用函数,我们必须将图片转换为数组。我们这里显然是使用灰度图片,转换的代码如下:

UIImage *image = [UIImage imageNamed:@"one.bmp"];

CGImageRef imageRef = [image CGImage];
CGDataProviderRef provider = CGImageGetDataProvider(imageRef);
NSData *data = (id)CFBridgingRelease(CGDataProviderCopyData(provider));
NSLog(@"image:%lu",(unsigned long)data.length);
const uint8_t *bytes = [data bytes];

这里就转换为uint8的数组了,接下来我这边根据需要对图片的灰度矩阵需要进行转置:

double newBytes[9216];

    for (int y = 0; y < 96 ; y++) {
        for (int x = 0; x < 96; x++) {
            newBytes[x*96 + y] = bytes[y*96 + x];
        }
    }

Step 6: 运行cnn

有了上面的处理,这一步直接运行cnnPredict

double result = cnnPredict(newBytes, theta);

NSLog(@"result:%f",result);

直接就输出结果了:

大家看到了吗?识别出的结果为1,就是大拇指的意思。

其实看到这里,我自己都是有点激动的。特别爽是不是,iOS上运行的CNN直接识别手势,虽然这边的图片是黑白的比较简单一点。

小结

本文总结了如何将CNN的MATLAB代码转换为C++代码然后在iOS上直接运行的方法。希望对同道中人有启发!

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-02 06:34:02

深度学习之Matlab 转C++在iOS上测试CNN手型识别的相关文章

深度学习之在iOS上运行CNN

1 引言 作为曾经的iOS开发者,在研究深度学习的时候,总有一个想法就是在iPhone上运行深度学习,不管是在手机上训练还是利用训练好的数据进行测试. 因为iOS的开发环境支持C++,因此,只要你的代码是C/C++,本质上就可以在iOS上运行. 怎么才能更快更好地在iOS上运行CNN呢? 2 方法1:通过Matlab转码 Matlab自带转成c的工具,如果你研究过UFLDL的深度学习教程,就知道如何在Matlab上使用CNN,那么,转换成c后,放到iOS的开发环境中,然后将参数存成txt格式再读

21个项目玩转深度学习:基于TensorFlow的实践详解06—人脸检测和识别——数据集

书籍:<21个项目玩转深度学习:基于TensorFlow的实践详解> 人脸检测 FDDB FDDB是UMass的数据集,被用来做人脸检测(Face Detection).这个数据集比较大,比较有挑战性.而且作者提供了程序用来评估检测结果,所以在这个数据上面比较算法也相对公平. 2845 张图片,其中包含了 5171 张人脸: 包含了各种遮挡,高难度的姿态,低分辨率以及对焦模糊的人脸: 用椭圆来标定人脸区域: 同时包括灰度图和彩色图. 人脸识别 LFW 户外标记人脸数据集LFW (Labeled

【深度学习与TensorFlow 2.0】卷积神经网络(CNN)

注:在很长一段时间,MNIST数据集都是机器学习界很多分类算法的benchmark.初学深度学习,在这个数据集上训练一个有效的卷积神经网络就相当于学习编程的时候打印出一行“Hello World!”.下面基于与MNIST数据集非常类似的另一个数据集Fashion-MNIST数据集来构建一个卷积神经网络. 0. Fashion-MNIST数据集 MNIST数据集在机器学习算法中被广泛使用,下面这句话能概况其重要性和地位: In fact, MNIST is often the first data

【深度学习系列】用PaddlePaddle和Tensorflow实现经典CNN网络Vgg

上周我们讲了经典CNN网络AlexNet对图像分类的效果,2014年,在AlexNet出来的两年后,牛津大学提出了Vgg网络,并在ILSVRC 2014中的classification项目的比赛中取得了第2名的成绩(第一名是GoogLeNet,也是同年提出的).在论文<Very Deep Convolutional Networks for Large-Scale Image Recognition>中,作者提出通过缩小卷积核大小来构建更深的网络. Vgg网络结构 VGGnet是Oxford的

吴恩达《深度学习》第四门课(4)特殊应用:人脸识别和神经风格迁移

4.1什么是人脸识别 (1)人脸验证(face verification):1对1,输入一个照片或者名字或者ID,然后判断这个人是否是本人. (2)人脸识别(face recognition):1对多,判断这个人是否是系统中的某一个人. 4.2One-shot学习 (1)比如一个公司的员工,一般每个人只给一张工作照(如4个人),这时网络输出五个单元,分别代表他们以及都不是.这样设计会有两个明显的问题:第一是每个人只给了一张照片,训练样本太少:第二是如果这时候又来了一个员工,那么网络的输出得重新调

《神经网络与深度学习》笔记5-反向传播算法(上)

计算机视觉 之 在iOS上测试跟踪算法Visual Object Tracking Algorithm

前言 在计算机视觉CV领域,视觉跟踪是其中一个重要的子问题.从我的角度看,视觉跟踪就是用在机器人上,用在移动设备上,因此,何不把一些跟踪算法放在iPhone上看看实际的跟踪效果.这才是最真实的对比,使用一些视频毕竟不实际,而且关键是不能很好的对比实时性.对于移动设备而已,实时性是最重要的吧.之所以有跟踪问题的出现,也是因为绝大多数的物体检测Object Detection算法实在是太慢了,根本无法用在视频当中.因此才有了Object Tracking的问题.最终的目标也就是Real Time V

[译]深度学习(Yann LeCun)

深度学习 严恩·乐库  约书亚•本吉奥  杰弗里·希尔顿 摘要深度学习是计算模型,是由多个处理层学习多层次抽象表示的数据.这些方法极大地提高了语音识别.视觉识别.物体识别.目标检测和许多其他领域如药物发现和基因组学的最高水平.深学习发现复杂的结构,在大数据集,通过使用反向传播算法来说明如何一台机器应改变其内部参数,用于计算每个层中表示从前一层的表示.深度卷积网络在处理图像.视频.语音等方面都带来了新的突破,而递归网络在连续的数据,如文本和语音有更出彩的表现.引言机器学习技术增强了现代社会的许多方

深度学习Matlab工具箱代码详解

最近研究了几天深度学习的Matlab工具箱代码,发现作者给出的源码中注释实在是少得可怜,为了方便大家阅读,特对代码进行了注释,与大家分享. 在阅读Matlab工具箱代码之前,建议大家阅读几篇CNN方面的两篇经典材料,对卷积神经网络Matlab工具箱代码的理解有很大帮助,稍后我会将这两篇文献上传到网上与大家分享.急需的也可以留言注明,我会及时发送至邮箱的. (1)<Notes on Convolutional Neural Networks>,这篇文章是与Matlab工具箱代码配套的文献,不过文