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格式。

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

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

Step 3: 新建iOSproject。导入cnnPredict代码

这一步非常easy,把整个目录拉进来就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’来切割数据,道理非常easy。

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上直接执行的方法。

希望对同道中人有启示!

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

  1. iOS单元測试:Specta + Expecta + OCMock + OHHTTPStubs + KIF

    框架选择 參考这篇选型文章,http://zixun.github.io/blog/2015/04/11/iosdan-yuan-ce-shi-xi-lie-dan-yuan-ce-shi-kuang ...

  2. iOS 单元測试之XCTest具体解释(一)

    原创blog,转载请注明出处 blog.csdn.net/hello_hwc 欢迎关注我的iOS-SDK具体解释专栏 http://blog.csdn.net/column/details/huang ...

  3. ios单元測试之GHUnit

    1.相同创建一个測试的project, 2.通过cocoaPod来下载GHUnit框架,或者到github上下载.由于这个框架是开源的第三方框架. 同一时候加入QuartCore.framework( ...

  4. 【深度学习篇】--神经网络中的池化层和CNN架构模型

    一.前述 本文讲述池化层和经典神经网络中的架构模型. 二.池化Pooling 1.目标 降采样subsample,shrink(浓缩),减少计算负荷,减少内存使用,参数数量减少(也可防止过拟合)减少输 ...

  5. 吴恩达深度学习笔记(deeplearning.ai)之卷积神经网络(CNN)(上)

    作者:szx_spark 1. Padding 在卷积操作中,过滤器(又称核)的大小通常为奇数,如3x3,5x5.这样的好处有两点: 在特征图(二维卷积)中就会存在一个中心像素点.有一个中心像素点会十 ...

  6. 深度学习框架caffe在macOS Heigh Sierra上安装过程实录

    第一步.安装依赖库 brew install -vd snappy leveldb gflags glog szip lmdb brew tap homebrew/science brew insta ...

  7. github上热门深度学习项目

    github上热门深度学习项目 项目名 Stars 描述 TensorFlow 29622 使用数据流图进行可扩展机器学习的计算. Caffe 11799 Caffe:深度学习的快速开放框架. [Ne ...

  8. 【腾讯Bugly干货分享】深度学习在OCR中的应用

    本文来自于腾讯bugly开发者社区,未经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/5809bb47cc5e52161640c5c8 Dev Club 是一个交流移动 ...

  9. 【转】贾扬清:希望Caffe成为深度学习领域的Hadoop

    [转:http://www.csdn.net/article/2015-07-07/2825150] 在深度学习(Deep Learning)的热潮下,Caffe作为一个高效.实用的深度学习框架受到了 ...

随机推荐

  1. [POI2008]Triangles

    题目大意: 平面直角坐标系上有n个点,问以这n个点为顶点的不同的三角形的面积和是多少? 思路: 很容易想到一个O(n^3)的暴力,枚举三个点,用海龙公式求一下面积和即可,这样做是40分. 标算的复杂度 ...

  2. Educational Codeforces Round 9 D. Longest Subsequence dp

    D. Longest Subsequence 题目连接: http://www.codeforces.com/contest/632/problem/D Description You are giv ...

  3. NHibernate 操作视图 第十三篇

    在NHibernate中,可以把视图当表一样操作,只需要记住一点就是,视图是只读的,因此映射实体的setter应该改为protected. 新建一个视图如下: 持久化类: public class C ...

  4. redis节点管理-新增从节点

    原文:http://blog.sina.com.cn/s/blog_53b45c4d0102wg12.html 新增从节点 新增一个节点7008节点,使用add-node --slave命令. [pl ...

  5. 【mybatis】mybatis中 返回map集合

    关于mybatis返回map集合的操作: 1.mapper.xml中写一个查询返回map的sql <select id="findMap" parameterType=&qu ...

  6. 版本控制SVN的使用笔记

    安装 客户端和服务端下载地址,打开网址,根据自己的操作系统下载对应的版本,window用户服务端一般安装的是VisualSVN,客户端安装TortoiseSVN,在实际工作中,我们一般只需要安装Tor ...

  7. FPGA作为从机与STM32进行SPI协议通信---Verilog实现

    一.SPI协议简要介绍 SPI,是英语Serial Peripheral Interface的缩写,顾名思义就是串行外围设备接口.SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用 ...

  8. Unity3D新手教学,让你十二小时,从入门到掌握!(二) [转]

    版权声明:本文为Aries原创文章,转载请标明出处.如有不足之处欢迎提出意见或建议,联系QQ531193915 继续上一讲的内容,首先呢, 为了接下来要做的小游戏,在这里我要小小的修改一下移动的代码. ...

  9. CentOS6.6服务器系统配置(LAMP+phpMyAdmin)全流程

    CentOS6.6服务器系统配置(LAMP+phpMyAdmin)全流程 昨天在腾讯云上买了个服务器,是CentOS6.6操作系统的裸机,里面什么都没,然后开始了一天一夜的LAMP(Apache+My ...

  10. Appium处理滑动方法是swipe

    滑动API:Swipe(int start x,int start y,int end x,int y,duration) 解释: int start x-开始滑动的x坐标:int start y - ...