OpenMV4 Plus
可以自己训练神经网络,其他版本的性能不够
本节讲解如何使用edgeimpulse.com
网站来自行训练神经网络模型,进而实现机器学习的功能
edgeimpulse.com
是一个在线网站,是一个为嵌入式产品非常快速地生成嵌入式上面使用的神经网络的模型,非常地易用且快速,大概只需要5min左右就可以训练出一个OpenMV4 Plus上使用的模型
机器学习有什么用? 利用机器学习我们可以知道OpenMV里面的图像是什么,比如图像里有没有人(进行人检测),或者是知道我们图像里的人是否有戴口罩(进行口罩识别),也可以利用机器学习来分辨一些其他物品和图片(是水杯还是矿泉水拼,电池还是烟头…),可以分辨一切你想要的东西,但是前提是训练好一个合适的模型
看完了上述部分,那么我们到底该如何使用OpenMV来训练神经网络模型呢
edgeimpulse
的在线网站上edgeimpulse
的网站上进行在线训练模型以 “口罩识别” 为例
打开OpenMV的IDE——>菜单栏——>工具——>数据集编辑器——>新数据集
新建一个文件夹
并命名
,再打开
即可
在数据集编辑器中新建文件夹
,我们新建两个文件夹并且分类
mask.class
,存储100-200张戴口罩的人脸照片face.class
,存储100-200张不戴口罩的人脸照片连接
运行
数据采集
"按钮(按钮图标是个照片),点一下就会保存一张图片,会按顺序依次命名对该张图像右键——>删除
将我们的数据集上传到edgeimpulse
的网站上进行在线训练
复制之后得到一串数字,这就是我们的API Key
,我们可以用次来与OpenMV的IDE进行联通
打开OpenMV的IDE——>工具——>数据集编辑器——>Export——>通过API Key进行上传"Upload to Edge Impulse by API Key"
注意!!!
我们用星瞳科技的方法上传API可能输出现创建SSL上下文错误
的问题,因此我们直接自行上传文件夹即可
有几个标签文件夹就分几次上传,记得要自己输入标签!
Data acquisition数据采集
LABELS = 2
进行模型的创建——>在左侧菜单栏选择Impulse design脉冲设计
训练结束后会生成Output features
此处有两个,一个是戴口罩的mask
,另一个是不戴口罩的face
选择左侧菜单栏Impulse design脉冲设计——>image图像
进行图像的DSP预处理
Raw data
中的图像是OpenMV的IDE原生采集的图像
DSP result
中是DSP预处理后的图像
Parameters
中可以修改图像的格式是RGB565彩图还是GREYSTYLE灰度图
显示Job complete
完成后可以观察生成的数据集!
我们可以看出face和mask这两种颜色基本上是分开的,而不是混乱地混合在一起地,就证明我们地数据集采集地不错
如果出现全部颜色都特别混乱,交叉混合在一起那么说明我们前期数据集的采集特征不够明显(可能是背景环境太复杂或者是人脸图片种类不够丰富,比如表情单一)
当前我们的数据特征还是比较分明的,因此可以进行下一步
选择左侧菜单栏Impulse design脉冲设计——>Transfer learning
进行迁移学习
所有机器学习的参数选择默认均可
Number of training cycles
设置学习的轮数
Learning rate
设置学习率,Learning如果设置得大可以提高学习得速度,小了速度会变慢,但过大过小都会导致无法完成学习目标
Data augmentation
设置数据增强,我们可以勾选也可以不勾选,它可以在训练的过程中随机变换数据,让你训练更多的轮数并且不会过拟合,用来提高训练的准确度
右边会显示工作的进度
Job started
表示训练开始loss
的值是越来越低的,准确度accuracy
的值是越来越高的显示Job completed
后即我们基本的模型已经训练完成,在训练结束后我们可以把页面滑到下面,可以看到训练后得出的数据
左边的三项分别代表准确率accuracy
、误差loss
、类型classes
中间代表confusion matrix
代表混淆的元素:如图有4个戴口罩的数据被识别成了没带口罩
右边代表了“预估”神经网络在设备上运行的性能表现:需要1.2ms占用RAM297K、占用ROM585.1K
Retrain model重新训练模型
对我们的神经网络进行重新的训练Live classification实时分类
进行单独某张图片的测试我们先进行Model testing
,下方的文件都是我们的测试集(最开始被分出来的20%),我们利用我们刚刚训练出的模型来对测试集进行测试
此处我们发现有一张图片是不确定的,我们可以找到这张图片:右键——>show classification查看训练结果
我们发现跳回了刚刚说的Live classification实时分类
!其实就是这个意思啦,这张有0.74认为是戴口罩,有0.26认为是不戴口罩(因为头发都遮住了大半张脸)
通过Versioning
设置版本
可以在这里进行版本的保存,可以在以后的工作直接回来使用这个
不保存的话,下次训练出来的模型就会覆盖当前模型!
利用Deployment对训练好的模型进行导出
选择OpenMV
——>Bulid
,生成后会自动地下载下来
下载后我们发现它生成了三个文件
将三个文件拷贝到OpenMV内置的flash中
将.py
文件在IDE中打开
# Edge Impulse - OpenMV Image Classification Example
import sensor, image, time, os, tf # os是与文件相关的类 tf是用到神经网络的类
# 设置感光元件
sensor.reset() # Reset and initialize the sensor.
sensor.set_pixformat(sensor.RGB565) # Set pixel format to RGB565 (or GRAYSCALE)
sensor.set_framesize(sensor.QVGA) # Set frame size to QVGA (320x240)
sensor.set_windowing((240, 240)) # Set 240x240 window.
sensor.skip_frames(time=2000) # Let the camera adjust.
# 设置神经网络的模型——>这就是我们刚刚训练出的模型文件,已经保存到u盘中了
net = "trained.tflite"
# labels获取神经网络的标签
labels = [line.rstrip('\n') for line in open("labels.txt")]
# line.rstrip('\n')表示如果遇到换行符"\n",就把换行符从labels中删掉
# 因为我们保存的labels文件中有换行符,因此得删掉
clock = time.clock()
while(True):
clock.tick()
img = sensor.snapshot()
# 在采集到的照片中进行tf.classify()的分类
for obj in tf.classify(net, img, min_scale=1.0, scale_mul=0.8, x_overlap=0.5, y_overlap=0.5):
# tf.classify()会返回OpenMV视野中识别到的物体的列表
# 返回obj.rect()是物体对应的框框 obj.output()是这个物体对应的每个标签的得分
print("**********\nPredictions at [x=%d,y=%d,w=%d,h=%d]" % obj.rect())
img.draw_rectangle(obj.rect())
#我们可以打印每个标签的得分
print(obj.output())
# 将得分和标签一一对应,返回一个列表
predictions_list = list(zip(labels, obj.output()))
# zip()表示把标签labels和得分obj.output()一一对应
# 会打印出如[('face',0.9411765),('mask',0.0627451)]
# 将得分输出
for i in range(len(predictions_list)):
print("%s = %f" % (predictions_list[i][0], predictions_list[i][1]))
if predictions_list[0][1]>0.8:
img.draw_string(0,0, 'face')
else:
img.draw_string(0,0, 'mask')
print(clock.fps(), "fps")