【深度学习-搭建自动分拣黄瓜的系统】
准备工作
材料准备
- ArduCam 扩展板 V2
- OV2640 摄像头模块
- MicroSD存储卡(4G以上)
- Arduino / Genuino 101 开发板
- 手机支架
开发板程序烧写
下载和安装库文件
首先我们下载和安装好相应的库文件:
- CurieNeurons Pro
- 可以在 CurieNeurons Kit 中找到。
- ArduCAM 和 UTFT4ArduCAM_SPI
- 可以在 ArduCam 官网下载。
下载完成后解压即可看到相应的 ArduCAM 和 UTFT4ArduCAM_SPI 库文件夹,在库管理器中分两次,选择和安装这2两个库文件夹即可。
库文件配置
在库文件所在目录 ArduCam/memorysaver.h 中,根据提示将下面两段代码取消注释:
#define ARDUCAM_SHIELD_V2
#define OV2640_CAM
完整文件可以直接在这里下载:memorysaver_h.zip
你可以直接下载这个压缩文件,将解压后的 .h 文件替换进去即可。
这里配置的意思是注明我们所使用的扩展板和摄像头模块型号。
程序上传
CurieNeurons Pro 所提供的案例可以帮助你快速了解使用方法:
文件 -> 示例 -> CurieNeuronsPro -> CurieNeurons_ArduCam_Demo_3Feat
这个示例需要使用 ArduCam扩展板 上的 Shutter 按钮,但不便于固定机位操作,所以我们对其进行了简单的改写,直接在串口监视器界面对其发送操作指令和监视结果。
程序源文件下载地址在这里:CurieNeurons_ArduCam_Demo_3Feat_num2.zip
你可以直接打开,然后上传到 Arduino/Genuino 101 中。
点击上传按钮开始上传。
正在上传中……
如果下方的信息框中显示如下信息,就表示你需要按一下板子上的 MASTER_RESET 按钮:
Flashing is taking longer than expected
Try pressing MASTER_RESET button
上传成功后,信息框中会显示:
Starting download script…
SUCCESS: Sketch will execute in about 5 seconds.
接下来我们就可以,断开 Genuino101 的电源,进行下一步操作了。
硬件组装
首先我们组装 Genuino 101 和 ArduCam 扩展板:
再将 MicroSD 卡装入 ArduCam 扩展板上的 MicroSD 卡插槽中:
再将 OV2640 摄像头模块连接到扩展板上:
最后再将手机支架固定上去:
组装好的硬件一览:
然后,我们把组装好的这一套放在三家脚架上
黄瓜样本准备
首先,我们要准备一些黄瓜作为学习样本
大致把他们分为4类:
- 好的-黄瓜
- 坏的-黄瓜(弯的)
- 好的-荷兰黄瓜
- 坏的-荷兰黄瓜(蔫的)
Curie 学习
首先,用数据线连接 Genuino 101 ,然后打开电脑上的 Arduino IDE。
然后打开“串口监视器”:
此时连接上串口监视器后,设备会进行初始化,出现下面的界面后表示已经准备就绪:
现在,我们把准备好的四组黄瓜黄瓜样本给 Genuino 101 学习:
比如这个“好的-黄瓜”,我们让 Genuino 101 学习为 分类1(cat=1),需要进行如下操作:
首先将黄瓜放到镜头中的画面中央区域,尽可能保证学习样本被包裹在屏幕中闪烁的红框中。
然后,在串口监视器中输入“ 1 ”:
点击发送后,Genuino 101 会自动进行数据的采样和学习,并返回目前所占用的神经元数量:
完成后,会自动进行识别:
可以看到已经开始正确识别了。
以此类推,我们将四种黄瓜依次给 Genuino 101 进行学习:
- “好的-黄瓜” 学习为 分类1(cat=1),发送“ 1 ”;
- “好的-荷兰黄瓜” 学习为 分类2(cat=2),发送“ 2 ”;
- “坏的-黄瓜” 学习为 分类3(cat=3),发送“ 3 ”;
- “坏的-荷兰黄瓜” 学习为 分类4(cat=4)发送“ 4 ”。
为了降低画面背景对识别结果产生的干扰,我们还可以发送“ 0 ”,让 Genuino 101 将背景图像数据学习为 分类0 (cat=0 / Forget),即消除影响,这个操作将不会占用神经元:
建议的学习流程:
学习一遍所有黄瓜样本 -> 学习一遍背景 -> 学习一遍所有黄瓜样本 -> 学习一遍背景
这样,基本的学习就完成了。
效果测试
让我们测试一下识别的效果:
我们把好的黄瓜放进去:
我们可以在串口监视器中看到,已经正确识别了。
我们再把好的荷兰黄瓜放进去:
再把坏的黄瓜放进去:
把坏的荷兰黄瓜也放进去:
全部识别正确!
如果识别出错的也很简单,直接在串口监视器中再教它一次就好啦。
技术解析
图像数据是如何给 Curie 进行学习的?
我们让 Curie 进行学习的区域是整个画面中间 121*121 像素大小的区域,基于 CurieNeurons Pro (居里神经元开发工具专业版)的高级功能,在这个案例中每次的学习和识别操作,都有3组分类器,将这个 121*121 像素原始数据提取为下面的 3 个特征,让 Curie 学习:
- 将 121 * 121 的数据分割成 11*11 像素大小区块,再对这些区块进行平均化处理的数据组;
- RGB 直方图;
- “Composite Profile“
翻译成人话就是:
我们下达的每一个学习指令,都会同时进行以下三种信息的学习,识别时也会同时通过以下三种信息进行判断。
- 形状、轮廓信息;
- 物体颜色信息;
- 综合信息。
识别时,当3个条件中的2个条件满足时,即确认识别结果。也就是我们在识别结果中所看到的 “ matches=* ” 信息:
CurieNeurons 与 TensorFlow 原案例的对比
TensorFlow 原案例的相关信息
图像识别部分所使用的硬件:
- 树莓派3
- 上方摄像头
- 下方摄像头
- 侧面摄像头
- Windows 台式个人电脑
训练的样本数量和时间:
- 7000张图片
- 总共2~3天时间完成训练
- 约合每张图片训练时间需要 24.7秒~37秒。
训练的样本质量:
- 80 * 80 像素
- 学习的特征仅为形状相关的信息
CurieNeurons 案例相关信息
图像识别部分所使用硬件:
- Genuino 101
- ArduCAM 扩展板 + 模块
训练所需时间:
- 神经网络的学习和识别只需要几纳秒(ns,1纳秒=0.000000001秒);
- 每组数据的处理、传输和学习时间总和为毫秒级;
- 7000张图片以最慢每张耗时500毫秒来计算,只需要58分钟即可完成全部样本的学习。
训练的样本质量:
- 121 * 121 像素
- 所学习的样本信息
- 形状、轮廓信息;
- 物体颜色信息;
- 综合信息。
CurieNeurons 案例为什么可以这么快速、高效?
Curie 中的神经网络之所以可以在几纳秒(ns,1纳秒=0.000000001秒)的时间内完成学习和识别,得益于 General Vision 的 NeuroMem® 技术,完全将神经网络固化到了芯片中,其独特的 Daisy Chain ,使每个入神经网络的数据能够同时到达每个神经元中进行处理。
所有这些 Curie 隐藏超能力,只有依靠 General Vision 发布的 CurieNeurons Pro (居里神经网络工具专业版)才可以完全释放
转载请注明:徐自远的乱七八糟小站 » 【深度学习-搭建自动分拣黄瓜的系统】