python tensorflow/examples/label_image/label_image.py --graph=/tmp/output_graph.pb --labels=/tmp/output_labels.txt --image=/home/harvitronix/ml/blogs/road- not-road/test-image.jpg --input_layer=input --output_layer=final_result --input_mean= 128--input_std= 128--input_width= 128--input_height= 128 △系统认为这张图片是道路的可能性为99.023% 这个系统速度很快,在我们搭载NVIDIA GeForce 960m GPU的笔记本上,识别1,000张图片只需要3.36秒,即每秒钟能识别297.6张图片。 把MobileNet应用到Android App中 现在我们拥有了一个小巧、快速、足够精确的模型,接下来我们准备把它搭载到一个Android App上,从而在真实环境中进行测试。 继续使用TensorFlow提供的工具,我们马上就会使用里面的Android示例项目完成模型的搭载。 1. 建立项目 如果你还没有准备好,可以从TensorFlow的repository下载这个Android示例项目: git clone https://github.com/tensorflow/tensorflow.git --depth 1 具体的文件夹是tensorflow/examples/android。用Android Studio打开这个文件夹,编译,atv,然后把生成的APK安装包搭载到你的手机上,你就得到了一个搭载着在ImageNet数据集上训练出的Inception V3模型的图像分类器App,它能够准确地把猫咪跟鸭嘴兽区分开来。 如果你编译apk安装包过程有问题,可以参考他们的readme文档中的指示。(https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/android) 我遇到的最大的挑战是NDK(Native Developer Kit)的版本问题,降级到r12b版本后才能正常的编译。 2. 评测搭载了Inception的App 我们现在运行的app上搭载的是Inception模型,让我们它做一些测评,从而可以与之后的MobileNet模型比较。 搭载了Inception的这个app的大小是53.9Mb,而搭载MobileNet的只有1.6Mb。它能够以240ms的速度识别一张图片(即4fps),CPU的占用达到了40%。 △搭载Inception V3的App在4fps速度下运行时的CPU占用情况 让我们把运行速度调到1fps试试: △搭载Inception V3的app在1fps速度下运行时的CPU占用情况 现在,内存的占用仍然在35%以上,让我们盼着MobileNet能够比这表现得好些,否则我们就达不到之前定下的目标了(内存占用上限为5%)。 3. 换成MobileNet 接下里让我们对这个Android project做一些小修改,从而搭载上我们的MobileNet。 首先,把你的模型和标签文件复制到project的assets文件夹里。我的是分别是/tmp/output_graph.pb 和 /tmp/output_labels.txt。 接下来,打开ClassifierActivity,具体地址是在: tensorflow/examples/android/src/org/tensorflow/demo/ClassifierActivity.java 将这个文件中的开头部分中定义的参数设置为我们的新模型。即从一打开时的这样: private static final int INPUT_SIZE = 224;private static final int IMAGE_MEAN = 117;private static final float IMAGE_STD = 1;private static final String INPUT_NAME = "input";private static final String OUTPUT_NAME = "output";private static final String MODEL_FILE = "file:///android_asset/tensorflow_inception_graph.pb";private static final String LABEL_FILE = "file:///android_asset/imagenet_comp_graph_label_strings.txt"; 改为这样: private static final int INPUT_SIZE = 128;private static final int IMAGE_MEAN = 128;private static final float IMAGE_STD = 128;private static final String INPUT_NAME = "input";private static final String OUTPUT_NAME = "final_result";private static final String MODEL_FILE = "file:///android_asset/output_graph.pb";private static final String LABEL_FILE = "file:///android_asset/output_labels.txt"; 点击运行从而开始编译,然后在你的手机上运行相应的apk安装包,你就得到了自己的道路识别器。 结果 下面是我实际使用我这个app的视频,我对UI进行了一些小改动,从而使显示结果更直观。 那么它运行速度和CPU占用的情况怎样呢? 在我的小米5上,它识别一张图片需要55毫秒,也就是每秒18帧(18fps)。 不过,在这个识别速度下,CPU的占用也比较大。在加足马力运行的情况下,CPU的占用大概为25到30%。 △搭载MobileNet的App在18fps速度下运行时的CPU占用情况 (责任编辑:本港台直播) |