请选择 进入手机版 | 继续访问电脑版
查看: 855|回复: 1

[原创] MCU上深度学习的实例与性能分析

[复制链接]

该用户从未签到

5

主题

18

帖子

0

注册会员

Rank: 2

积分
71
最后登录
2022-6-7
发表于 2022-3-31 10:02:12 | 显示全部楼层 |阅读模式
本帖最后由 阿米的小豆 于 2022-3-31 11:25 编辑

在MCU这样弱算力低空间的平台上做深度学习,大家最关心的可能就是性能了。下面一张图整理了十几个例子在NXP i.MX RT1060 600MHz下的推理时间
rt1060_model_latency.png

横轴是以对数为尺度的时间轴,纵轴并没有明确的含义,只是为了避免各应用重叠在一起,并且有意把物体检测类的例子放在上部。最左边一格的时间尺度有明显的时间压缩。
在细看各个时间长度之前,我们首先可以得到一个令人震撼的结论:

深度学习模型的伸缩性是极强的。在图中的模型最大与最小的运行一次甚至相差5个数量级

+ 预测数值相关示例
排在最左下角的电机缺相异常检测只需要12us即可运行一次。它的输入是最近20笔三相电压和电流的数据,输出是复原后的输入。因为特征明显,可以使用非常小的神经网络,少于1K个参数。
无前瞻电磁AI循迹应用大约耗时0.5ms以内,它输入最近50笔车身电感的数据,经过一个神经网络来预测接下来的转向角度是多少。这个问题要预测连续的数值并且输入的数据量也更大一些,所以需要复杂一些的模型,我们实验的模型大约有5K左右个参数。

+辨别种类相关示例
手写数字识别使用非常小的28x28x1灰度图片,各数字之间的区别也比较明显。我们尝试了多种不同结构和深度的模型,发现在0.5ms至10ms范围内一般可达到95%-99%的测试精度,参数个数在1K-20K之间。
对于语音口令(10种)检测,我们先对音频信号做MFCC变换以得到可视化的能量谱在各个时隙内的排列,再按灰度图像的图像分类来送给一个卷积神经网络来抽取特征并使用一个单层神经网络来分类,在20ms上可达到85%以上的测试精度,参数个数约30K。
红细胞感染疟疾的检测中,图片的分辨率要大一些,因此计算量大一些;但另一方面只需要做2种分类,又可以减少提取的特征,所以这方面又有利于使用更简单的神经网络模型。最终我们在一个约25K参数的模型上做到16ms时间可以识别一次,准确度约95%。
10项物体分类的难度比前面的大一些。是因为在CIFAR-10的只有32x32x3的彩色图像上,每一类都代表了很多种更细的类。比如“飞机”、“汽车”,世界中有很多种不同的飞机和汽车。因此,模型的特征提取能力需要更强,这就需要更多的参数和更大的计算量。在我们的一个能做到约79%测试精度的模型中,参数量有88K,耗时约27ms。
石头剪刀布是手势分类的一个模型,采用了64x64的输入。虽然分类不多,类别之间的特征区别也比较明显,但是背景的变换非常丰富,这增加了模型识别的难度。因此实验中我们用的模型比10项物体分类要更大一些,约100K个参数,运行时间70ms左右,精度约85%左右。
另一个有趣的实例是“看相知性”。输入图像是64x64大小的人脸照片,据此判断性别。鉴于当时盛行“娘炮”和“女汉子”文化,增加了对模型的要求。我们先在120ms左右的时间上做到高达97%左右的精度;后面又尝试了小幅降低精度的压缩模型的方法,在96.5%以上的精度上使模型时间只有33ms。

+概括表征示例
和“看相知性”相近一个应用可能就是“看相识人”——人脸识别了。不过,他们的问题类型却不同。一个是图像分类,另一个则是直接使用卷积神经网络学习到的图形表征做向量的匹配。但有趣的是,他们在训练的时候都是用类似图像分类的技术来实现的。不过看相识人要求的特征区分度却高了很多。因此,我们就选择了一个公开发表的高性能卷积神经网络(MobileFaceNet)作为骨干,并且减少它的输入图像大小从112x112x3至64x64x3。这个骨干规模和前面的例子相比要大得多,在64x64x3的图像上也要耗时大约需要260毫秒,预计在公版的MobileFaceNet上112x112x3图像上需要近1秒左右,如果要更加实时就需要简化骨干。

另一个和人脸有关的应用就是人脸检测。但是目标检测问题,如我们之前所说,需要从图像中找到所有的实例。所以输入的分辨率会大一些。我们也需要在卷积神经网络的骨干上添加用于物体检测相关的功能模块。在这个实验中,我们使用了256×256大小的图片分辨率。好,在人脸检测不需要非常丰富的特征,所以我们可以化简骨干。这样在比较大的分辨率上却得到了200毫秒每一次的计算效果。

+物体检测示例(预测数值(位置)+辨别种类)
物体检测是一类应用非常广泛的问题。根据所需要定位精度以及识别种类的区别,实时要求,还有物体的密集程度的区别,问题规模的伸缩范围非常大。刚才我们提到的256x256输入的人脸检测需要两百毫秒左右,但当输入减少到64x64时就只需要十几个毫秒了(需要处理的数据只有1/16了)。
除了可以靠缩小输入来减少计算量之外,精简骨干也是另外一个有效的办法。比如我们在256×192的水果检测和行人检测中,使用了相同的骨干,只是水果检测要分辨11类水果和背景;而形人检测只需要分区行人与背景,所以水果检测的模型需要的时间更多一点,他们分别在100毫秒和127毫秒左右。这个,骨干非常精简,牺牲了比较多的定位准确性,当应用不要求非常准确的定位物体时,是可以接受的。上面的两个模型分别用于统计狭小空间的人数和判断顾客购买的水果有几种,正好不需要非常精确地定位。
相比之下,有些物体检测应用则要求定位精准。比如基于一个机械水表表盘图像的抄表,需要很精确地定位表针、数显区并准确地识别出读数,就需要更高分辨率的输入和更强大的骨干,耗费时间也近两秒钟——幸好它们不需要实时完成。像这类不需要实时检测的目标检测问题还有别的,比如冰箱存货检测;智能温控空调的人体检测等,在几秒内给出结果都是可以接受的,这样耗时在5.3秒的公版“YOLOx-nano”(320x320输入,检测多达80种物体)也以可以考虑作为工作的起点。相比之下,用于智能称重的水果蔬菜检测则最好控制在1秒之内给出结果。
物体检测应用有时也有实时的要求。尤其是在有“相对运动”的场景,比如,对于移动物体的避障和信号标志识别,以及统计快速移动物体数量的应用,就有实时要求了,一般最多在0.2秒内给出结果。需要说明的是,公版的物体检测模型常常规模比较大(即使是它们的”nano”或”pico”变体),在微控制器上部署,如果有实时要求往往需要精简一下骨干。


回复

使用道具 举报

  • TA的每日心情
    开心
    2023-2-28 15:37
  • 签到天数: 42 天

    [LV.5]常住居民I

    42

    主题

    500

    帖子

    0

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    1369

    热心会员

    最后登录
    2024-2-23
    发表于 2022-3-31 11:04:39 | 显示全部楼层
    感谢分享!看分析检测速度还是真不错啊
    签到签到
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-16 19:25 , Processed in 0.117521 second(s), 21 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表