深度学习要想落地实践,一个少不了的路径即是朝着智能终端、嵌入式设备等方向发展。但终端设备没有GPU服务器那样的强大性能,那如何使得终端设备应用上深度学习呢?
所幸谷歌已经推出了TFMobile,去年又更进一步,推出了TFLite,其应用思路为在GPU服务器上利用迁移学习训练自己的模型,然后将定制化模型移植到TFLite上,
终端设备仅利用模型做前向推理,预测结果。本文基于以下三篇文章而成:
相信大家掌握后,也能轻松定制化自己的图像识别应用。
第一步. 准备数据
这是一个关于花分类的图片集合,下载解压后,可以看出有5个品种分类:daisy(雏菊)、dandelion(蒲公英)、rose(玫瑰)、sunflower(向日葵)、tulip(郁金香)。
我们的目的即是通过重新训练预编译模型,得到一个花类识别的模型。
第二步. 重新训练
1. 挑选预编译模型
从上述“谷歌提供的预编译模型”列表中,我们大体可以看出分为两类模型,一种是Float Models(浮点数模型),一种是Quantized Models(量化模型),什么区别呢?
其实Float Models表示为一种高精度值的模型,该模型意味着模型size较大,识别精度更高、识别时长更长,适合高性能终端设备;而Quantized Models则反之,是低精度值的模型,其精度采取固定的8位大小,故其模型size较小,识别精度低、识别时长较短,适合低性能终端设备,更细的说明可以参见 https://www.tensorflow.org/performance/quantization 。
我们的手机设备更新换代很快,一般可以使用Float Models。在这个模型下,有不少预编译模型可选,对于本文来说,主要集中为Inception 和Mobilenet两种架构。
注意Mobilenet其实也分为很多种类,如Mobilenet_V1_0.50_224,其中第三个参数为模型大小比例值(只能算是近似,不准确),分为0.25/0.50/0.75/1.0四个比例值,第四个参数为图片大小,其值有128/160/192/224四种值。
有兴趣想观察各模型层次结构的可通过以下代码查看:
import tensorflow as tfimport tensorflow.gfile as gfile
MODEL_PATH = '/home/yourname/Documents/mobilenet_v1_1.0_224/frozen_graph.pb'def main(unusedArgv):
with tf.Graph().as_default() as graph:
with gfile.FastGFile(MODEL_PATH, 'rb') as f:
graph_def = tf.GraphDef()
graph_def.ParseFromString(f.read())
tf.import_graph_def(graph_def, name='') for op in graph.get_operations(): for tensor in op.values():