Press "Enter" to skip to content

TensorFlow模型部署到Android,需要注意几点

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

 

题图 由 Gerd Altmann Pixabay 上发布

 

在前面一篇文章《 从人工智能鉴黄模型,尝试TensorRT优化 》我谈到了TensorFlow模型的优化,这是针对服务器端的优化,实际上优化结果并不理想。这篇文章我将谈谈将TensorFlow模型部署到Android系统上需要注意的几点。

 

TensorFlow针对移动和IoT设备推出了TensorFlow Lite,根据TensorFlow Lite的官方文档, Lite应用的开发步骤如下:

 

 

第一步,我们选择的是open_nsfw鉴黄模型的tensorflow版本,不用多说。

 

接下来第二步将TensorFlow模型转化为TensorFlow Lite模型,借助于TensorFlow提供的编程接口,只需几行代码就可以做到:

 

converter = tf.lite.TFLiteConverter.from_session(sess, [model.input], [model.predictions])
    tflite_model = converter.convert()
    with open(export_path, "wb") as f:
        f.write(tflite_model)

 

当然你也可以使用TensorFlow提供的工具转换。

 

接下来第三步将模型部署到Android应用,可参考https://github.com/tensorflow/examples/ 里面的图片分类示例,也不难。但完成这一步之后,发现在Android系统上的推理精度和PC上的差别很大,为什幺会存在这样的差别呢?虽然说TensorFlow模型经过压缩,会损失一定的精度,但差别不会太大,出现较大的差距,一定是哪里处理存在问题。经过一番调查研究,发现在图片预处理方面有几点需要注意。

 

在深度学习中,模型的图片输入尺寸只接受给定的大小和格式,所以不管是训练还是推理,对图片进行预处理是必不可少的,在这次部署TensorFlow模型到Android应用的过程中,发现以往没有注意到的几点:

 

图片缩放算法

 

在Android中,针对Bitmap有一个缩放函数: Bitmap.createScaledBitmap ,但是我们读tensorflow-open_nsfw的图片预处理代码,就会发现塔的处理过程是先缩放到256×256,然后再裁剪成 224×224,至于为什幺这样处理,根据 Tensorflow image loader image would cause different result #2 这个里面的讨论,采用不同的image_loader,其结果有些差异,这也是为什幺作者在脚本中提供了两种image loader的原因。回到Android系统上,我们也尽可能的保持相同的缩放方式。另外不同的处理库,对于JPEG解码、图片缩放也有一些差异,我们可以尝试用OpenCV进行处理,然后选择最优结果。

 

BGR和RGB

 

在Android系统中,图像通常采用RGB进行表示和处理,但open_nsfw模型有些特殊,因为是从Caffe模型转化而来,所以内部采用的是BGR排列方式。因为我们平常处理图片、模型都采用RGB,很容易忽略这一点,所以在处理图片前,需要先确认一下是RGB还是BGR。

 

正归化(Regularization)

 

正规化是提高模型泛化能力的常用手段,通常我们将输入值归一化到0 ~ 1区间的值。然而在图像处理领域,更有效的方法是RGB每个通道减去一个均值(Mean Value),这个均值是在训练过程中计算出来的。从tensorflow example过来时,其均值使用了一个固定值,计算方法为:

 

private static final float IMAGE_MEAN = 127.5f;
private static final float IMAGE_STD = 127.5f;
(pixelValue & 0xFF) - IMAGE_MEAN) / IMAGE_STD;

 

而在python脚本中,我们可以看到其处理方法为:

 

VGG_MEAN = [104, 117, 123]
image -= np.array(VGG_MEAN, dtype=np.float32)

 

有两个区别,一是每个通道上的均值是不同的,而是并没有归一化到-1 ~ +1 这个区间。这里需要将Android代码修改为一样。

 

最后一个步骤是优化,发现这里面也存在一定的陷阱。

 

TensorFlow Lite模型最常见的优化手段是量化(Quantize),将32位的浮点采用8位的整型表示。经过这一转化,模型的大小得到了 大幅缩减 ,从原来的23M减小到6M。但经过在我的HUAWEI Mate 20 pro上测试,推理速度却有小幅下降,精度也有所降低。采用浮点模型 + GPU进行推理,也并没有如想象中的能够提升推理速度。是否需要采用量化模型,需要根据实际部署系统的测试情况以及是否接受推理速度和精度下降这两个不利因素。

 

因此,在实际部署TensorFlow模型时,不要想当然的认为别人的优化方法在自己的环境中一定有效,必须亲自验证才能确定,在这之前,编写一些简单的benchmar工具进行评估是必要的。

 

经过这次的部署测试,发现tensorflow-open_nsfw模型在我的手机上推理速度能达到100ms左右,精度能达到90%,基本上能够满足需求。

 

项目的完整代码可以参考:https://github.com/mogoweb/tensorflow-open_nsfw ,欢迎大家一起交流。

Be First to Comment

发表评论

邮箱地址不会被公开。 必填项已用*标注