1)本文原作者:Alessandro Grande
2)中文版得到以下4位专家的帮助:William Gao,Gabriel Wang,Alex Shang,Lifeng Geng。
1、概览
2、设置环境
3、定义模型
4、准备数据集
5、训练模型
6、量化模型
7、将模型转换为二进制格式
8、在 OpenMV 上部署模型
9、运行笑脸检测
10、故障排除
本指南将逐步指导您在基于 Arm Cortex-M 的超低成本、低功耗处理器上部署 Caffe 模型。本指南中将使用由两位 Arm 创新者 brahim Abdalkader 及 Kwabena W. Agyeman 开发的 OpenMV 开发板。

本指南将逐步指导您完成以下步骤:
1. 设置环境
2. 训练神经网络模型
定义模型。
准备数据集。
训练 Caffe 中的模型。
注:本指南中的“训练神经网络模型”部分仅为确保步骤完整性,无需执行。
3. 在 Arm Cortex-M 上部署模型
量化模型。
将模型转换为二进制格式。
在 OpenMV 上部署。
运行笑脸检测。
完成本指南中的步骤后,您将能够在 Arm Cortex-M7 处理器上部署具有笑脸识别功能的 Arm 神经网络模型。
部署流程如下图所示:

Linux 机器设置
按下文所述,安装虚拟机来设置 Linux 环境。为确保完整性,我们将对设置环境所需的所有步骤进行说明。
使用虚拟机
注:推荐使用虚拟机进行安装。使用 Linux 进行安装耗时更长。
1. 安装 Virtual Box。
使用提供的 USB 安装 Virtual Box。
2. 下载图像。
使用提供的 USB 下载 Virtual Box 图像。
3. 导入图像。遵循此指南。
4. 登录机器。
用户名:Embedded
密码:embedded
OpenMV 设置
在 VirtualBox 中,从终端启动 OpenMV IDE:
./openmvide/bin/openmvide.sh &
注:若未预装,请执行以下操作:
在Linux 虚拟机上安装 OpenmMV IDE。
连接开发板:
1. 通过 USB 连接 OpenMV 和笔记本电脑。
2. 遵循USB VM 设置指南,在虚拟机上设置与 OpenMV 开发板的 USB 连接。
3. 如有必要,更新固件。
测试:
1. 单击 IDE 左下方的连接图标或按 CTRL+E。
2. 选择 IDE 左下方的播放图标或按 CTRL+R,启动程序。
3. 程序应该正常运行并在右上方显示图像,而没有任何错误。
设置到此完成,下一步是在 Arm Cortex-M7 OpenMV 开发板上部署选定的模型。
注:本部分中,您无需进行任何操作。此部分仅为确保步骤完整性。
图像分类的实现方式多种多样,但人工智能领域的最新研究表明,一种称为卷积神经网络 (CNN) 的神经网络特别擅长图像分类。
为实现笑脸识别功能,我们将使用 OpenMV 定义的笑脸模型。如下图所示,该网络为三层卷积神经网络:

该网络由以下几层组成:
Convolution layer - 负责从图像中提取特征。
Dropout layer - 负责通过在训练阶段忽略随机节点来避免过拟合。
Rectified Linear Unit (ReLU) - 负责在模型中引入非线性的激活函数。如果收到任何负输入,该函数将返回 0,但是收到任何正值 x 时,它将返回该值。
Pooling layer - 负责逐步缩小模型的空间大小,减少网络中的参数数量和计算量,因而也控制过拟合。
Inner product (Inp) 或 fully connected layer。
我们使用的笑脸数据集可在 GitHub 上找到。
我们将使用以下位置的数据集:
repos/SMILEsmileD/SMILEs/
negatives
positives
查看这两个集合中的图像数量:
ls repos/SMILEsmileD/SMILEs/negatives/negatives7/.-1 | wc –l
ls repos/SMILEsmileD/SMILEs/positives/positives7/.-1 | wc –l
该数据集由约 3000 张正样本图片和约 9000 张负样本图片组成。为了避免产生偏差模型,我们希望使用相同数量的正样本和负样本。
为此,我们可以对正图像使用增加脚本来增大数据集。使用该脚本会将正示例的数量增加到原来的 3 倍:
创建文件夹(若尚不存在):
mkdir repos/SMILEsmileD/SMILEs/positives/positives_aug/
增大数据集:
python2 repos/openmv/tools/augment_images.py --input repos/SMILEsmileD/SMILEs/positives/positives7/
--output repos/SMILEsmileD/SMILEs/positives/positives_aug/ --count 3
注:由于时间限制,本指南不涉及神经网络的训练。此处材料仅为确保步骤完整性。
目前已支持将 Caffe 模型转换为 CMSIS-NN 函数。未来还将支持其他框架(TensorFlow、PyTorch 等)。
经过训练的模型也需要转换为lmdb 数据库。转换后的文件应该能在以下位置找到:
repos/openmv/ml/cmsisnn/models/smile/smile_database/
模型训练完成后,我们需要将其减少到合适的大小。为此,我们使用 Arm 的量化脚本将 Caffe 模型权重和激活从 32 位浮点格式转换为 8 位定点格式。这样不仅可以减少网络大小,还可以避免浮点计算。
该 NN 量化器脚本的工作方式为,测试网络并找出动态定点表示的最佳格式。该脚本的输出为序列化 Python (.pkl) 文件,其中包括网络的模型、量化的权重和激活以及每一层的量化格式。运行以下命令便会生成量化模型:
python2 repos/ML-examples/cmsisnn-cifar10/nn_quantizer.py --model
repos/openmv/ml/cmsisnn/models/smile/smile_train_test.prototxt --weights
repos/openmv/ml/cmsisnn/models/smile/smile_iter_*.caffemodel –save
repos/openmv/ml/cmsisnn/models/smile/smile.pk1
最后一步是使用 OpenMV NN 转换器脚本将模型转换为二进制格式,可由 OpenMV Cam 运行。该转换器脚本会输出每个层类型的代码,后跟该层的维度和权重(如有)。
在 OpenMV Cam 上,固件读取该二进制文件,并使用链表数据结构在内存中构建网络。
运行以下命令便会生成二进制模型:
python2 repos/openmv/ml/cmsisnn/nn_convert.py –model
repos/openmv/ml/cmsisnn/models/smile/smile.pk1 --mean
/home/embedded/repos/openmv/ml/cmsisnn/models/smile/smile_database/mean.binaryproto --output
repos/openmv/ml/cmsisnn/models/smile/smile.network
将 smile.network 直接下载到 OpenMV 开发板上的 Arm Cortex-M7 中。此步骤需要使用 USB 连接。
此步骤中将使用 CMSIS-NN,它是一系列高效神经网络内核的开源集合,其开发目的是最大程度地提升神经网络的性能,减少神经网络在 Arm Cortex-M处理器内核上的内存占用。借助基于 CMSIS-NN 内核的神经网络推理方案,运行时/吞吐量可提升 4.6 倍,能效可提升 4.9 倍。
在 OpenMV IDE 的笑脸检测 Python 示例中运行以下程序。
Select Files -> Examples -> 25-Machine-Learning -> nn_haar_smile_detection.py
该程序会将问题拆分成两个不同阶段,从而实现笑脸识别:
1. 使用 Haar Cascade 分类器识别图像中的人脸。
2. 识别该人脸是否在笑。
3. 在右上方的图像上显示黄色笑脸或哭脸。
可选任务:修改 Python 示例
1. 调整用于限定笑脸检测范围的矩形大小。
2. 当检测到笑脸时,添加终端输出。
可选:最终可部署模型
注:如果之前的步骤均成功执行,则不需要执行此步骤。
最终的预训练和预转换模型可在 GitHub 上找到。
如果出现以下错误:
No OpenMV Cams found(未找到 OpenMV Cams)

这表示 OpenMV 未与电脑连接或未被操作系统识别:
1. 确认 OpenMV 开发板已通过 USB 与电脑连接。
2. 如果是在 Linux 上运行,请遵循 USB VM 设置指南。
No module named caffe(caffe 模块不存在)
ImportError: No module named caffe
输入以下命令,检查该模块是否已正确添加到模块查找路径:
python >>> import sys >>> sys.path ['', '/home/embedded/caffe/python', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-x86_64-linux-gnu', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib- old', '/usr/lib/python2.7/lib-dynload','/home/embedded/.local/lib/python2.7/site-packages', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']
如果没有 /home/embedded/caffe/python
>>> exit() export PYTHONPATH=~/caffe/python
Check failed: mdb_status == 0 (2 vs. 0) No such file or directory(检查失败:mdb_status == 0 (2 vs. 0) 没有此文件或目录)
Check failed: mdb_status == 0 (2 vs. 0) No such file or directory
打开以下文件:
repos/openmv/ml/cmsisnn/models/smile/smile_train_test.prototxt
并确认 mean_file 和 source 指向以下位置的文件:
repos/openmv/ml/cmsisnn/models/smile/smile_database/
OSError: Could not find the file(操作系统错误:无法找到该文件)

确保将该文件上传至 OpenMV 开发板上的 Arm Cortex-M7 中。
关注Arm中国,够深度,更精彩

