使用Mx_yolov2模型训练器来进行物体识别的模型训练

上一期,我们讲解了如何使用Mx_yolov2模型训练器来进行图像分类的模型训练,而这一期将详细讲解如何进行[物体识别]的模型训练,并将训练好的模型部署到K210上;物体识别的训练相对于图像分类的训练要复杂一些(复杂的原因主要是在数据集的准备上),而其余的一些参数设置和图像分类的参数大同小异。接下来,先来看看训练出来的模型在K210上运行的最终效果:


视频中我们可以看到一个类似人脸识别的功能,不同的是,它能够判断人脸上是否带了口罩,是不是很有意思?
接下来我们就正式开始吧~
01 准备数据集
首先你需要明白一个概念:万物皆可“机器视觉”,这里的“物”指的也许是人脸、猫、飞机、花朵等;在机器的“眼里”,任何东西都是物体;包括人、人脸、动物也是一种物体。所以你现在要把戴口罩的人脸和没带口罩的人脸看作是两种“物体”。

接下来你要尽可能多的去找一些没带口罩的人脸图片以及一些带着口罩的人脸图片

提示:你可以使用Python编写一个爬虫脚本,代替你完成这一工作,或者在网上下载他人分享的口罩检测数据集,无论是使用哪一种方法,请注意合法性。
将你找到的图片放在同一个文件夹中(注意:这里和图像分类不同,物体识别的图像文件不必分开文件夹摆放),打开Mx_yolov2软件,点击Image_tool进行图像预处理。

选择你刚才建好的分类数据集,Image_tool将会把所有的图片处理成像素为(224×224)的图像,同时在原来文件所在目录将会出现一个名称中带有_out的文件夹。

接下来从Mx_yolov2的主界面打开LabelImg8.0标注软件开始对输出的图像进行标注。


由于内容有限LabelImg8.0的使用方法就不在这里讲解,可以参考知乎博客内容:
https://zhuanlan.zhihu.com/p/90834296
标注完成后,你应该拥有了两个文件夹,一个文件夹是包含了训练图像的文件夹(也就是经过Image_tool处理后的输出文件夹),另外一个文件夹是包含了所有图像的标注文件的文件夹(由LabelImg生成的每张图片的标注文件组成)。它们看起来是这样的:

你可以看到,图像的文件名和标注文件的文件名是一 一对应的,这是非常重要的,因为神经网络就是根据标注文件的文件名来查找图像。
到这里我们就基本完成了数据集准备的工作,接下来将你准备好的数据集进行分类就可以了;你需要将数据集用文件夹分为训练集、验证集、测试集、训练集标签、验证集标签;

训练集——包含大部分的数据集图像
测试集——几张图片即可,用来后面验证模型准确性
验证集——用于提供在训练过程中验证训练结果的图像,也是10张左右即可,但尽量要包含所有种类。
训练集标签——包含了训练集内图像的标注文件
验证集标签——包含了验证集内图像的标注文件
02 调整训练参数
打开Mx_yolov2软件,选择物体识别模式,并选择“2-参数设置”选项卡(如下图)

在界面中,我们可以看到物体识别的参数调节界面。我们主要修改以下参数:
标签(种类名称)、Anchors、训练集、训练集标签、验证集、验证集标签、测试集、迭代次数;

其中Anchors可以在选择好训练集、训练集标签、验证集、验证集标签、测试集文件夹后,点击计算,即可通过K-means聚类算法计算出来。(计算出来后,会自动替换旧的Anchors)

其他一些参数说明:
1、标签格式:apple,dog,car
2、迭代次数:可以适当的提高,以保证训练中loss较低,也不宜过高造成过度拟合
3、输入尺寸根据训练图片大小更改
4、神经网络目前只能确认MobileNet训练的模型能够正常部署到Maix上
5、Train_times:内存不足时可适当降低
03 开始训练
选择开始训练菜单,并导入刚才保存的设置文件,并点击开始训练按钮,训练时终端会显示如下画面:

你会注意到训练时终端中的一些重要参数:
- Epoch –迭代的次数/总次数
- loss–损失函数(越低,说明训练的模型越好,但也不是越低越好,过低的话就会出现过拟合,你需要适当的降低迭代次数,一般loss达到0.005以下即可)
当在迭代次数达到后并且终端也没有信息滚动,操作信息栏中出现”训练结束“信息之后,你可以在Mx_yolov2文件夹下发现多出两个文件,分别是yolov2.h5、yolov2.tflite;yolov2.h5就是你训练好的模型文件。

首先h5模型文件是你最初训练出来的模型文件,它可以在你的计算机上进行部署并识别;tflite模型文件是h5文件经过Tensorflow Lite转换得到的模型文件;它能够更好的部署到小型设备上,例如Maix、手机上。
04 测试模型
物体识别模式提供了测试模型的功能,这能帮助你在将模型部署到K210上以前,便于对模型的“质量”进行检测。
你可以在Mx_yolov2界面上找到测试模型的按钮,并按提示选择刚才训练好的H5模型文件。

选择完毕后,程序会将测试集中的图片取出进行预测。你会看到如下信息:

1-boxes 代表的是图像中找到一个对象
0-boxes代表的是图像中没有找到对象
接下来你可以点击”打开文件夹查看结果“,程序将会把存有预测结果的文件夹打开,你会看到实际的识别结果;可以看到预测结果还是很理想的。


05 转换模型
你会发现你训练出来的模型文件是tflite模型文件,然而Maix上需要使用后缀名为kmodel的模型文件;所以你需要使用工具将模型文件进行转换。在GitHub上有一个开源项目NNCase,它能很好的将你的模型文件进行转换,一开始它是一个命令行工具,为了方便使用我已经为它写了一个Gui的界面。你可以在Mx_yolov2的训练界面找到打开它的按钮(如下图)

在打开的NNCase 0.1.0 Qt软件界面,需要选择你需要转换的模型文件、模型输出保存的地址以及至少含有3张训练图片的文件夹;点击转换按钮,当出现模型转换成功字样,即可在后面的地址找到你的kmodel模型。(如下图)

06 将模型部署到Maix上
你需要使用Kflash工具将模型下载到Maix的内存中,Kflash软件你可以在Mx_yolov2文件夹中找到。

注意打开文件按钮前的0×300000,这是模型下载到内存中的地址,等会在代码中加载模型时要用到。上传完毕之后,你需要使用MaixPy IDE为Maix来编写一个脚本,它的程序如下:
import sensor
import image
import lcd
import KPU as kpu
lcd.init()
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.set_windowing((224, 224))
sensor.set_hmirror(0)
sensor.run(1)
task = kpu.load(0x300000) #使用kfpkg将 kmodel 与 maixpy 固件打包下载到 flash
anchor = (0.9, 1.08, 1.65, 2.03, 2.49, 3.22, 3.28, 4.29, 4.37, 5.5) #通过K-means聚类算法计算
a = kpu.init_yolo2(task, 0.6, 0.3, 5, anchor)
classes=["Masks","Un_Masks"] #标签名称要和你训练时的标签名称顺序相同
while(True):
img = sensor.snapshot()
try:
code = kpu.run_yolo2(task,img)
except:
print("TypeError")
#a=img.draw_rectangle([0,0,360,20],0xFFFF,1,1)
if code:
for i in code:
a=img.draw_rectangle(i.rect(),(255, 255, 255),1,0)
a=lcd.display(img)
# = img.draw_string(0,0, classes[i.classid()], color=(0,255,0), scale=2)
for i in code:
lcd.draw_string(i.x()+40,i.y()-30,classes[i.classid()] , lcd.RED, lcd.WHITE)
lcd.draw_string(i.x()+40,i.y()-10,str(round((i.value()*100),2))+"%", lcd.RED, lcd.WHITE)
else:
a = lcd.display(img)
a = kpu.deinit(task)
接下来运行程序使用你的Maix尽情的进行物体识别吧
这次的口罩训练使用了580张照片作为数据集(我用了2个小时才将所有图片标注完成,实在是一项非常艰巨的任务
T.T);当然,如果你是识别一个变化不大的物体,例如下面的这个玩具,那你可能只需要60-80张照片作为数据集即
可训练出较好的模型。

07 结语
自从上一期教程发布之后,收到很多朋友、网友的鼓励与反馈,感谢你们;同时也修改不不少Bug;如果你在使用过程中遇到什么问题,可以直接联系我,我会定期维护Mx_yolov2;希望Mx_yolov2能给大家带来更多乐趣。
如果你想要下载最新版本的Mx_yolov2软件,你可以扫描下方二维码,并发送信息“Mx”到公众号,即可获得下载地址。
