在前面章节已介绍如何让Arduino Nano 33 BLE Sense(以下简称BLE Sense)配合Edge Impulse来完成听觉、运动及色彩感测的tinyML应用,接下来就和大家介绍如何将视觉也加入tinyML。
目前人工智慧应於电脑视觉有很多领域,最常见的有下列几种。
以上常见电脑视觉应用,通常所需参数(记忆体)、计算量(计算速度)颇大且依序递增,甚至呈等比级数放大,所以一般「影像分类」要Arm Cortex-M4以上等级才能勉强完成,而「物件侦测」常见的YOLOv3算法仍很难塞进Cortex-M7中,通常要像树莓派这类Arm Cortex-A53, A57的多核CPU及够多的记忆体(DDR)才勉强能处理,而「影像(语义、实例)分割」这类应用若没有专用的AI(神经网路)加速计算晶片或GPU的帮助,根本很难在单板微电脑上实现。因此目前tinyML仅适合较简易型的「影像分类」应用,且输入影像不能太大,建议96x96像素以下,灰阶影像为佳,彩色影像次之。
以下就会以BLE Sense加上Edge Impulse平台来做「影像分类」实验。共准备60张已裁切128x128像素全彩(RGB888)彩色影像,其中分为3类,史蒂芬周(Chow)、薛家燕(Xue)及不明(Unknow)。每个分类各20张,其中16张作为训练集、4张作为测试集。如图Fig. 27-1所示。使用这麽小的影像及这麽少的资料集,虽然会影响後续模型的训练及推论结果,但这里只是方便大家快速训练及测试,如有需要可自行增加更多的资料集数量及多样性来增加模型的可用性。
Fig. 27-1 Edge Impulse 影像(分类)辨识。(OmniXRI整理绘制, 2021/10/12)
在Edge Impulse的官方线上说明文件中,有BLE Sense加上OV7675摄影机模组(类似手机镜头模组)的搭配使用说明。但无奈手边只有OV7670(M12镜头摄影机)模组,经查阅相关网站後,得知一样可以使用,只是OV7670模组的排针是18 Pin,OV7675模组的排针为20 Pin,OV7670的最後两Pin PEN/RST(Pin 17)及PWDN/PDN(Pin 18)要对到BLE Sense的A2和A3脚位,如下所示。
OV7675 | BLE Sense | OV7670 |
---|---|---|
NC (Pin 17) | -- | -- |
NC (Pin 18) | -- | -- |
PEN/RST (Pin 19) | A2 | PEN/RST (Pin 17) |
PEN/RST (Pin 20) | A3 | PWDN/PDN (Pin 18) |
目前Edge Impulse可支援的摄影机模组,如图Fig. 27-2所示。本想拿OV7670摄影机模组来替代,但不幸地是,一算手上模组的排针接脚怎麽有22 Pin,再仔细一查竟然是带有AL422B(FIFO影像缓冲区)功能的OV7670模组。再到Arduino网站及其它各大论坛检索,发现目前Arduino官方只支援不带FIFO功能的OV7670。虽然已下单采购,但确定这两天还到不了货,可是不能让发文中断,於是改用另一种解决方案来和大家介绍,就是以「上传已存在资料集(Upload existing data)」的方式来替代。而以摄影机取得影像建立资料集的方法就麻烦大家先参考一下官方说明文件。
Fig. 27-2 Edge Impulse 支援具相机模组之开发板。(OmniXRI整理绘制, 2021/10/12)
首先点击Edge Impulse操作页面右上角使用者图像,选择建立一个新专案,输入专案名称(假设为Sight_Test)。建立时可依序选择资料型态「影像类(Images)」,工作类型「影像分类(Image Classification)」,即可创立一个新专案。
接着切换到「资料撷取(Data Accquisition)」页面,点击「收集资料(Collected data)」右上角上箭头符号,进入「上传已存在资料(Upload exiting data)」页面。接着依序上传3个分类,训练集和测试集资料,记得要点击对应类型及输入正确标签。当把所有资料都上传完毕後,就可回到「资料撷取(Data Accquisition)」页面。此时页面上方应会出现训练资料集总数量、分类比例及训练/测试集比例,如果想观察测试集内容,则点击页面上方「测试集(Test Data)」按键来切换。完整步骤如图Fig. 27-3所示。
Fig. 27-3 Edge Impulse 上传已存在资料集。(OmniXRI整理绘制, 2021/10/12)
目前这些准备好的训练集及测试集都是事先从网路上撷取到且已预裁切好的,这和一般直接从摄影机上取得的影像有很多不同,如影像长宽比、影像品质(压缩、还原及拍摄不良等)、光照(亮度、对比、色彩饱和度等)及其它各种造成影像内容差异之因素,而这些不同就会严重影响模型训练的结果。这里仅为示范流程,所以省略一些资料收集的要注意的事项,也不考虑模型训练是否能收歛到理想范围,还请见谅。
完成资料集建置後,接着切换到「模型设计(Impulse Design)」页面,第一个栏位「影像资料(Image Data)」已帮大家预设好,不管原始影像是什麽尺寸,最後都会被缩成96x96点像素再输入到模型中计算,下拉式选单可以选择「符合短边(Fit shortest axis)」、「符合长边(Fit longest axis)」或「正方形(Square)」。如果大家是从网路收集影像时,若长短边比值忽大忽小时,那麽经过这个缩放动作後,有可能会让影像内容变形,导致资料集品质不佳,容易造成模型难以训练或推论准确度不高。
接着新增「处理区块(Processing Block)」,选择「影像(Image)」按下【Add】按钮新增即可。再来新增「学习区块(Learning Block)」,这里系统建议选择「迁移学习(Transfer Learning)」,按下【Add】按钮新增即可。这里选择「分类(Classification (Keras))」亦可,只是会得到不一样的训练结果及推论准确度。最後按下【Save Impulse】即可更新左侧「Impulse Design」的选单。会新增出「Image」和「Transfer Learning」两个新页面。完整操作步骤如图Fig. 27-4所示。
Fig. 27-4 Edge Impulse 模型设计及指定区块。(OmniXRI整理绘制, 2021/10/12)
再来切换到新增的「影像(Image)」页面,「参数(Parameter)」子页面可暂时略过,直接切换到「产生特徵(Generate Features)」子页面。按下【产生特徵(Generate Features)】按钮後,稍待一会儿,就会产生特徵分布图及预计MCU推论效能及记忆体使用量。有了这些特徵值後续才能继续进行训练模型。完整步骤如图Fig. 27-5所示。
Fig. 27-5 Edge Impulse 资料集产生特徵。(OmniXRI整理绘制, 2021/10/12)
=== 二种学习区块「迁移学习」及「影像分类」的训练及测试结果部份就留待下回分解 ===
参考连结
Edge Impulse Tutorials - Adding sight to your sensors说明文件
Edge Impulse Development Board - Arduino Nano 33 BLE Sense with OV7675 camera add-on说明文件
-示例单元测试 单元测试通常由程序员开发。这是一个白盒测试。为了最大化单元测试的价值,伴随着敏捷方...
每次网路搜寻关键字SSR、MPA、SPA,都会有看没有懂的感觉,看完过没多久马上就忘了,藉由这次机会...
来到这系列的最後一篇,除了心得结语外,也讨论的学习 PixiJS 的过程 时期1:不考虑效能,这时期...
前言 此篇虽然不是非常专业,但基本文字设定应该是没什麽问题啦 再谈谈设定文字之前要先知道文字有哪几种...
一个网站要吸引人,除了要有适当的排版,还要有吸引人的文字与丰富的动画,让人的目光不由自主地伫足想要浏...