致小白的K210模型训练与运用
前言
由于我也是刚接触K210不久,并且对python没有太多的了解,但是又想自己训练模型,于是花了挺多的时间在找寻简单的模型训练方法,本来是在几天前就找到了简单的模型训练方法,但是后来在使用的过程中出了点问题,直到今天才把问题勉强解决。所以写下本文来记录一下我所使用的K210模型训练方法,希望能给和我一样的小白一些帮助
提示:以下是本篇文章正文内容,下面案例可供参考
一、模型训练方法
1.使用MixHub平台进行训练
2.使用Mx-yolov3自己搭建平台进行训练
二、详细介绍
1.使用MixHub平台进行训练
详细方法可以看:MixHub训练使用说明
(1)数据集的准备
首先我们需要确定我们是要进行目标分类还是目标检测
目标分类是没有框的,只能识别该物体的种类,不能给出该物体的具体位置信息,效果如下
而如果是目标检测的话是有框的,可以给出物体的具体位置信息,并且框出来,效果如下图
这里以目标分类为例,具体的可以看MixHub训练使用说明
首先我们准备一个数据集文件夹,格式如下:
然后我们使用image_tool来将图片转换成224*224格式
转换好之后会多出一个文件夹
将cat和dog文件夹删除将cat_out和dog_out改成cat和dog。得到下图
然后压缩成ZIP格式
打开MixHub训练平台
填入邮箱和机器码,选择分类目标识别,机器码是通过将一个固件下入Maix bit或者其他sipeed的K210获得的。
再上传数据集,也就是刚刚的ZIP格式文件,点击开始训练
然后就等着就行,等训练好了就会将下载连接发到你的邮箱中
下载好了之后就是一个这样的压缩包
解压开之后就有以下文件
第一个boot.py是测试代码,第二个labels.txt是种类,第三个m.kmodel是模型文件
接下来将上面所有文件放入U盘中,即可看到效果
2.使用Mx-yolov3自己搭建平台进行训练
首先得感谢袁运强老师制作的Mx-yolov3
软件获取方法import创客公众号回复Mx3
软件的详细介绍也可以看公众号里的文件,在这里我以我使用过程中的问题以及解释做一下说明
这里也以物体分类为例
首先我们将MX3下载下来
然后双击Mx_yolov3安装,得到一个Mx_yolov3的文件夹
首先我们打开环境配置文件夹,双击环境配置.exe
然后按照步骤一步一步来就行,特别注意的是第三步的那二个一定要装,不然模型训练的会很慢
接下来我们以物体分类为例
首先我们找到Mx_yolov3文件夹中的example文件,将它复制到桌面
接着我们打开Mx-yolov3,找到图像识别
接着点选择找到刚刚的example文件夹
然后点击提取,将Alpha设置为0.75
接着点开始训练,等待即可,注意的是如果这里没有开GPU加速,训练要很久
训练好了模型之后我们再来测试一下模型
点击测试模型,然后找到所训练的模型位置
测试好了之后这里可以看到模型的效果
接下来是最后一步,也是最重要的一步
模型转换!!!
就是这一步,卡了我五天
我们输入路径选择tflite文件,输出文件任意设置,再选择量化图片,量化图片的路径如下
接着点击开始转换
如果你的结果是这样的
出现了模型转换成功,那么恭喜你,可以直接跳到最后一步了
如果你的结果是下图中的这样,或者是其他模型转换错误的情况,那么你得继续看接下来的步骤,尝试一下
尝试一、将参数设置成如下图
然后将图片用他自带的那个猫狗分类的例子,再重复上面的步骤试一下,看看能不能成功。
我测试发现生成的模型比较大的可以转换成功,如下图
生成的模型比较小的会转换失败,如下图
而调整模型的大小是调Alpha这个参数,参数越小,模型越小,效果越差,参数越大,模型越大,效果越好。
如果你按上述方法尝试了之后发现还是模型转换失败,那么你可能得用第二个方法了
找到Mx-yolov3文件夹中的NNcase 0.2这个文件夹
双击打开
设置和0.1版本的一样,点击转换即可
用0.2版本的转换一般都是可以成功的,但是用0.2版本的转换有一个问题,那就是转换出来的是V4的模型,而用0.1版本转换出来的是V3的模型。
3.V3模型
V3模型,也就是之前用nncase 0.1版本转换出来的模型
首先找到自己训练的模型,将下图中的二个文件放在SD卡中
注意将classnames这个文件名改成classes
再将下图中的boot.py文件也放入SD卡中
接下来将SD卡插入K210,然后给K210通电,就可以看到效果了。
4.V4模型
如果你是用nncase0.2的转换的,那么就是V4模型,V4模型出了上述步骤之外,还有二个地方做更改,一个是固件,固件要找一个支持V4版本的固件,固件可以在Sipeed 固件库找到
注意的是这个固件是连不了IDE的,这个是我测试过的,还有下面这个,我没有测试过,不过应该也是可以用的,支持IDE和V4的
除了固件需要更改,那个示例代码boot.py也需要更改一下改成下面的代码
代码如下():
import sensor
import math
import machine
import lcd
import KPU as kpu
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.run(1)
sensor.skip_frames(10)
sensor.set_windowing((224,224))
sensor.set_vflip(0)
lcd.init(freq=15000000,color=0x0000)
KPU = kpu.load('/sd/weights.kmodel')
success = kpu.set_outputs(KPU,0,1,1,2)
f=open("classes.txt","r")
labels_txt=f.read()
labels = labels_txt.split(",")
f.close()
while True:
img = sensor.snapshot()
plist = kpu.forward(KPU,img)[:]
pmax = max(plist)
max_index = plist.index(pmax)
pgoods = labels[max_index]
print("No.{} is {}".format(pgoods, pmax))
lcd.display(img)
lcd.draw_string(48,224,"NO: {} {}{}".format(pgoods, round(pmax,2)*100,"%"),lcd.WHITE,lcd.GREEN)
也就是加了一句success = kpu.set_outputs(KPU,0,1,1,2)
这一句的主要作用是设置输出层形状,具体的意思不大清楚,我试着参数像这样填是可以运行的
这一句的具体说明可以看KPU的说明
其他的步骤和V3的一致,将必要文件和boot.py放入SD卡中即可运行,但是效果是卡卡的和PPT一样