datasheet

Arm中国

文章数:374 被阅读:346664

账号入驻

工程师亲笔丨如何使用 CMSIS-NN 在 OpenMV 上部署 Caffe 模型?

2018-12-17
    阅读数:

1)本文原作者:Alessandro Grande 

2)中文版得到以下4位专家的帮助:William Gao,Gabriel Wang,Alex Shang,Lifeng Geng。

Contents

1、概览

2、设置环境

3、定义模型

4、准备数据集

5、训练模型

6、量化模型

7、将模型转换为二进制格式

8、在 OpenMV 上部署模型

9、运行笑脸检测

10、故障排除


1
概览


本指南将逐步指导您在基于 Arm Cortex-M 的超低成本、低功耗处理器上部署 Caffe 模型。本指南中将使用由两位 Arm 创新者 brahim Abdalkader 及 Kwabena W. Agyeman 开发的 OpenMV 开发板。



本指南将逐步指导您完成以下步骤:

1. 设置环境

2. 训练神经网络模型

  • 定义模型。

  • 准备数据集。

  • 训练 Caffe 中的模型。

注:本指南中的“训练神经网络模型”部分仅为确保步骤完整性,无需执行。

3. 在 Arm Cortex-M 上部署模型

  • 量化模型。

  • 将模型转换为二进制格式。

  • 在 OpenMV 上部署。

  • 运行笑脸检测。


完成本指南中的步骤后,您将能够在 Arm Cortex-M7 处理器上部署具有笑脸识别功能的 Arm 神经网络模型。 


部署流程如下图所示:



2
设置环境


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 开发板上部署选定的模型。


3
定义模型


注:本部分中,您无需进行任何操作。此部分仅为确保步骤完整性。


图像分类的实现方式多种多样,但人工智能领域的最新研究表明,一种称为卷积神经网络 (CNN) 的神经网络特别擅长图像分类。


为实现笑脸识别功能,我们将使用 OpenMV 定义的笑脸模型。如下图所示,该网络为三层卷积神经网络:



该网络由以下几层组成:

  • Convolution layer - 负责从图像中提取特征。

  • Dropout layer - 负责通过在训练阶段忽略随机节点来避免过拟合。

  • Rectified Linear Unit (ReLU) - 负责在模型中引入非线性的激活函数。如果收到任何负输入,该函数将返回 0,但是收到任何正值 x 时,它将返回该值。

  • Pooling layer - 负责逐步缩小模型的空间大小,减少网络中的参数数量和计算量,因而也控制过拟合。

  • Inner product (Inp) 或 fully connected layer。


4
准备数据集


我们使用的笑脸数据集可在 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


5
训练模型


注:由于时间限制,本指南不涉及神经网络的训练。此处材料仅为确保步骤完整性。


目前已支持将 Caffe 模型转换为 CMSIS-NN 函数。未来还将支持其他框架(TensorFlow、PyTorch 等)。


经过训练的模型也需要转换为lmdb 数据库。转换后的文件应该能在以下位置找到:

repos/openmv/ml/cmsisnn/models/smile/smile_database/


6
量化模型


模型训练完成后,我们需要将其减少到合适的大小。为此,我们使用 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


7
将模型转换为二进制格式


最后一步是使用 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


8
在 OpenMV 上部署模型


将 smile.network 直接下载到 OpenMV 开发板上的 Arm Cortex-M7 中。此步骤需要使用 USB 连接。


此步骤中将使用 CMSIS-NN,它是一系列高效神经网络内核的开源集合,其开发目的是最大程度地提升神经网络的性能,减少神经网络在 Arm Cortex-M处理器内核上的内存占用。借助基于 CMSIS-NN 内核的神经网络推理方案,运行时/吞吐量可提升 4.6 倍,能效可提升 4.9 倍。


9
运行笑脸检测


在 OpenMV IDE 的笑脸检测 Python 示例中运行以下程序。

Select Files -> Examples -> 25-Machine-Learning -> nn_haar_smile_detection.py


该程序会将问题拆分成两个不同阶段,从而实现笑脸识别:

1. 使用 Haar Cascade 分类器识别图像中的人脸。

2. 识别该人脸是否在笑。

3. 在右上方的图像上显示黄色笑脸或哭脸。


可选任务:修改 Python 示例

1. 调整用于限定笑脸检测范围的矩形大小。

2. 当检测到笑脸时,添加终端输出。


可选:最终可部署模型

注:如果之前的步骤均成功执行,则不需要执行此步骤。


最终的预训练和预转换模型可在 GitHub 上找到。


10
故障排除


如果出现以下错误:


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中国,够深度,更精彩


最新有关arm_china的文章

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: TI培训

北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2018 EEWORLD.com.cn, Inc. All rights reserved