Caffe框架下OPenMV的机器学习(一)初探OPenMV神经网络

1.  OPenMV 可以进行机器学习?

OPenMV 是一款可编程的摄像头,主要使用MicroPython语言,实现基本的图像处理。

你可以把OPenMV当成一个工具,也可以把它当成一套产品,开源的编程环境能为进一步向机器视觉领域迈进奠定基础。

OPenMV 对于入门计算机视觉的小白来说就是一个你数学方面的救星,因为摄像头内置有许多痛的的图像处理算法,我们使用起来十分容易,适合快速入门,而通过观察各种函数运行后的变化,也能加深我们在图像处理方面的理论学习。

对OpenMV的介绍不必多说,这里推荐一个学习OPenMV的网站:星瞳科技OPenMV教程

言归正传,OPenMV能用于机器学习呢?

教程给我们的答案是:

Caffe框架下OPenMV的机器学习(一)初探OPenMV神经网络_第1张图片

不过 淘宝的亲亲怪 也给出了不一样的解释:

Caffe框架下OPenMV的机器学习(一)初探OPenMV神经网络_第2张图片

通过了解知道,最近两年机器学习越来越火,OPenMV函数库中已经加入了神经网络nn库和Net库,这一壮举极大地扩展了OPenMV的功能与实用价值,所以我决定就用OPenMV来跑机器学习

本次学习常用到的函数文档如下:(文档由星瞳科技OPenMV提供)

nn 神经网路: https://docs.singtown.com/micropython/zh/latest/openmvcam/library/omv.nn.html#

Net 类:https://docs.singtown.com/micropython/zh/latest/openmvcam/library/omv.nn.html#net

我们查阅相关例程,可以看到,OPenMV机器学期会用到一个叫CNN网络库的东西,通过查阅相关资料,我们基本了解它的工作机制,这时你会发现,我们的机器学习之旅,已经渐渐开始了。。。

本小节得出的结论:OPenMV可以借助卷积神经网络,完成简单的机器学习!!

2.  OPenMV例程测试

打开 OPenMV IDE 给出的几个例程:

Caffe框架下OPenMV的机器学习(一)初探OPenMV神经网络_第3张图片

我们找到了8个机器学习相关的例程,依次按照 教程 的方法导入对应的CNN网络库(保存到OPenMV SD内存卡),运行例程,关键时要修改以下语句:

img = img.binary([(230, 130)]) # 调整阈值,使二值图像(只有0,1,即黑白)清晰

此处应该注意,如果网络库识别结果总是一个错误结果,则考虑将图像阈值调整,使捕获图像从白底黑字更改为黑底白字,直到识别结果为多个字符连续变换(可能不准确)

下面是对官方提供的几个CNN库的测试截图:

fnt-chars74k.network  的测试结果如下图:

Chars74K 数据集是一个经典的字符识别数据集,主要包括了英文字符与坎那达语(Kannada)字符。数据集一共有74K幅图像

Caffe框架下OPenMV的机器学习(一)初探OPenMV神经网络_第4张图片Caffe框架下OPenMV的机器学习(一)初探OPenMV神经网络_第5张图片Caffe框架下OPenMV的机器学习(一)初探OPenMV神经网络_第6张图片Caffe框架下OPenMV的机器学习(一)初探OPenMV神经网络_第7张图片

cifar_fast.network  的测试结果如下图:

Caffe框架下OPenMV的机器学习(一)初探OPenMV神经网络_第8张图片Caffe框架下OPenMV的机器学习(一)初探OPenMV神经网络_第9张图片    Caffe框架下OPenMV的机器学习(一)初探OPenMV神经网络_第10张图片    Caffe框架下OPenMV的机器学习(一)初探OPenMV神经网络_第11张图片

Caffe框架下OPenMV的机器学习(一)初探OPenMV神经网络_第12张图片Caffe框架下OPenMV的机器学习(一)初探OPenMV神经网络_第13张图片Caffe框架下OPenMV的机器学习(一)初探OPenMV神经网络_第14张图片Caffe框架下OPenMV的机器学习(一)初探OPenMV神经网络_第15张图片

在牺牲一定准确率的条件下,勉强可以识别出一些物体

lenet.network  的测试结果如下图:

lenet.network  由 MNIST数据集 训练而成,用于识别手写数字

Caffe框架下OPenMV的机器学习(一)初探OPenMV神经网络_第16张图片          Caffe框架下OPenMV的机器学习(一)初探OPenMV神经网络_第17张图片          Caffe框架下OPenMV的机器学习(一)初探OPenMV神经网络_第18张图片

Caffe框架下OPenMV的机器学习(一)初探OPenMV神经网络_第19张图片          Caffe框架下OPenMV的机器学习(一)初探OPenMV神经网络_第20张图片          Caffe框架下OPenMV的机器学习(一)初探OPenMV神经网络_第21张图片

经测试对手写数字的识别效果不理想,反而对打印的数字比较敏感(结果会受当时光线的影响,弱光环境下,准确率大幅降低)

综上测试结果,自带的神经网络库并不适用与我们各种环境下的对象识别,下一步我们计划训练自己的神经网络库

3.  训练适用于OPenMV的神经网络

由于商业原因,国内的公司也许不会给我们提供训练神经网络的方法,我没找到,很长一段时间,我都在想尽一切办法训练网络,还好论坛上有答主回答了有关训练网络的问题。链接将我引导向笑脸检测识别的例子上,在OPenMV的英文官网中,我找到了网络训练的例子:

其中说明了网络训练的方法

Caffe框架下OPenMV的机器学习(一)初探OPenMV神经网络_第22张图片

目前 OPenMV 只提供Caffe模型到network网络的转换,未来可能会支持TensorFlow,但目前不行。通过Caffe框架学习,我们最终的目标肯定是得到 ******.network 的网络库文件

训练网络的主要步骤如下:

  1. 配置环境,安装Caffe
  2. 采集数据集
  3. 训练网络
  4. 量化模型
  5. 将模型转换为二进制格式
  6. 在OPenMV上部署模型
  7. 运行网络
  8. 故障排除

当然,在 OPenMV源码  (GitHub上,开源可下载)的文件夹中我也找到了对应网络训练的方法:

### Train A Custom Net
If you'd like to train your own custom CNN you need to assemble a dataset of hundreds (preferably thousands) of images of training examples. Once you've collected 
all the training examples save the images per class of training examples in seperate folders structed like this:
* data/
    * 0_some_class/
    * 1_some_other_class/
    * 2_etc/

Once you've built a folder structure like this please refer to the examples above to:
1. Create a labeled training dataset using augment_images.py and create_labels.py.
#首先用augment_images.py 和 create_labels.py 生成训练集的标签
#生成标签参考https://medium.com/@alexrachnog/using-caffe-with-your-own-dataset-b0ade5d71233
2. Create training and test lmdb files.
#使用caffe自带的函数处理train 和 test 的lmdb数据集
3. Create a mean.binaryproto file.
#创建 均值二进制文件 
4. Train the network (copy how the smile train.sh script and solver/train/test protobufs work to do this).
5. Test the network (copy how the smile test.sh script and solver/train/test protobufs works to do this).
#编写脚本训练网络,参考train.sh 和 test.sh
6. Quantize the network.
#量化神经网络
7. And finally convert the network.
#将神经网络转化为指定格式

### Known Limitations 
1. Parser supports conv, pool, relu, fc layers only.
2. Quantizer supports only networks with feed-forward structures (e.g. conv-relu-pool-fc)  without branch-out/branch-in (as in inception/squeezeNet, etc.).
3. See [ARM ML-examples](https://github.com/ARM-software/ML-examples/tree/master/cmsisnn-cifar10) for more information.
4. Source Code https://github.com/ARM-software/CMSIS_5/tree/develop/CMSIS/NN

了解了大致方法后,我大概有了一个训练网络的思路,从下一章开始,我将介绍如何在windows上借助Caffe框架训练网络

 

参考资料:

Low Power Deep Learning on the OpenMV Cam powered by the Cortex-M7 Processor

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

你可能感兴趣的:(Deep,Learning)