您的位置:首页 > 移动开发 > IOS开发

iOS下运行CNN(深度学习)

2016-03-21 14:28 471 查看


1 引言

作为曾经的iOS开发者,在研究深度学习的时候,总有一个想法就是在iPhone上运行深度学习,不管是在手机上训练还是利用训练好的数据进行测试。 

因为iOS的开发环境支持C++,因此,只要你的代码是C/C++,本质上就可以在iOS上运行。 

怎么才能更快更好地在iOS上运行CNN呢?


2 方法1:通过Matlab转码

Matlab自带转成c的工具,如果你研究过UFLDL的深度学习教程,就知道如何在Matlab上使用CNN,那么,转换成c后,放到iOS的开发环境中,然后将参数存成txt格式再读取分割,也就是可以实现。 

如下图就是已经将matlab代码转换为c后导入的结果: 


 

打开predict.h文件,可以看到可以调用的接口:
<code class="hljs cs has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/* Function Declarations */</span>
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">extern</span> real_T predict(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span> real_T Theta1[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10025</span>], <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span> real_T Theta2[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">260</span>], <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">const</span> real_T X[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">400</span>]);
</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>


这是训练MNIST的一个神经网络,我这边用了测试手写数字的识别。

因此,接下来需要对图片进行处理,从而转换为x[400]的向量格式。

这个只要能读取图片的像素,进行转换就可以。可以考虑用opencv来实现。


 

这里我的方法是在用手画出数字之后,将图片转换为20*20像素的图片,如右下角所示,再将右下角的图片转换为400的数组,输入predict得到的结果。


3 方法2:使用DeepBeliefSDK

https://github.com/jetpacapp/DeepBeliefSDK 

这个是别人专门写的一个用于iOS的深度学习的SDK。可以使用,但是存在的问题就是如果要自己训练的话很受限制。


4 方法3:使用tinyCNN

https://github.com/nyanp/tiny-cnn 

这个很不错,它对比Caffe,Theano等框架最大的特点就是不需要安装,只要能用C++ 11.然后里面的例子使用了boost库。因此,为了运行它,我们需要在xcode安装ios的boost库。

网上找到了一个编译好的boost库: 
https://github.com/danoli3/ofxiOSBoost

导入boost库的方法非常简单:
<code class="hljs livecodeserver has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">In Xcode Build Settings <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> your project:

Add <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">to</span> Library Search Paths ( LIBRARY_SEARCH_PATHS ) $(SRCROOT)/../../../addons/ofxiOSBoost/libs/boost/lib/ios
Add <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">to</span> Header Search Paths ( HEADER_SEARCH_PATHS )
$(SRCROOT)/../../../addons/ofxiOSBoost/libs/boost/<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">include</span>
In <span class="hljs-operator" style="box-sizing: border-box;">the</span> Target under Build Phases

Add <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">to</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'Link Binary With Libraries'</span> <span class="hljs-operator" style="box-sizing: border-box;">the</span> boost.<span class="hljs-operator" style="box-sizing: border-box;">a</span> found <span class="hljs-operator" style="box-sizing: border-box;">in</span> <span class="hljs-operator" style="box-sizing: border-box;">the</span> ofxiOSBoost/libs/boost/lib/ios <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">directory</span>.
If <span class="hljs-operator" style="box-sizing: border-box;">not</span> openFrameworks just <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">add</span> <span class="hljs-operator" style="box-sizing: border-box;">the</span> libs/boost/<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">include</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">to</span> Header Search Paths <span class="hljs-operator" style="box-sizing: border-box;">and</span> <span class="hljs-operator" style="box-sizing: border-box;">the</span> libs/boost/ios <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">to</span> Library Search Paths</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-ri
cc66
ght-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li></ul>


那么具体在创建iOS应用的时候,这里使用作者提供的训练MNIST的例子,那么要注意在使用数据时,要更改路径:
<code class="hljs objectivec has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSString</span> *trainLabels = [[<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSBundle</span> mainBundle] pathForResource:@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"train-labels"</span> ofType:@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"idx1-ubyte"</span>];
<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSString</span> *trainImages = [[<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSBundle</span> mainBundle] pathForResource:@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"train-images"</span> ofType:@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"idx3-ubyte"</span>];
<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSString</span> *t10kLabels = [[<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSBundle</span> mainBundle] pathForResource:@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"t10k-labels"</span> ofType:@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"idx1-ubyte"</span>];
<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSString</span> *t10kImages = [[<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSBundle</span> mainBundle] pathForResource:@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"t10k-images"</span> ofType:@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"idx3-ubyte"</span>];

parse_mnist_labels([trainLabels cStringUsingEncoding:NSUTF8StringEncoding], &train_labels);
parse_mnist_images([trainImages cStringUsingEncoding:NSUTF8StringEncoding], &train_images);
parse_mnist_labels([t10kLabels cStringUsingEncoding:NSUTF8StringEncoding], &test_labels);
parse_mnist_images([t10kImages cStringUsingEncoding:NSUTF8StringEncoding], &test_images);</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li></ul>


基本上这样就可以运行开始训练了。

如果想在Mac上训练,同样需要安装boost库。这个只要在官网下载boost,我用的是1.58版本。然后在terminal中安装,cd到路径,然后./boostrap.sh 然后./b2 安装就可以。然后在xcode引入路径:
<code class="hljs r has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">The Boost C++ Libraries were successfully built!

The following directory should be added to compiler include paths:

/Users/<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>/<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>/<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>/boost

The following directory should be added to linker <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">library</span> paths:

/Users/<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>/<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>/<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>/boost/stage/lib</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li></ul>


路径初始为自己boost的文件夹地址。


4 小结

上面说了一些很方便的方法来实现在iOS下运行CNN。当然,我们更多需要就是进行图像的识别。相信大家自己测试会觉得很有趣。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  深度学习