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

640?wx_fmt=jpeg

题图 由Gerd AltmannPixabay上发布

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

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

640?wx_fmt=png

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

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

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

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

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

  • 图片缩放算法

在Android中,针对Bitmap有一个缩放函数: Bitmap.createScaledBitmap,但是我们读tensorflow-open_nsfw的图片预处理代码,就会发现塔的处理过程是先缩放到256x256,然后再裁剪成 224x224,至于为什么这样处理,根据 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 ,欢迎大家一起交流。

你还可以看:

Android上的TensorFlow Lite,了解一下?

如何将自己开发的模型转换为TensorFlow Lite可用模型


  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云水木石

但行好事,莫问前程

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值