【实战】K210训练与部署YOLO目标检测模型
文章目录
材料准备
- K210(Maix Bit)
- MaixPy IDE (下载链接:https://pan.baidu.com/s/1DuqdPzniZ5lrcbtoZAJkQg 提取码:q67r)
- Mx-yolov3 (下载链接:https://pan.baidu.com/s/1Gl3Qfw5s8LZuu2wc1GTITg 提取码:dvsf)
- TF卡及读卡器
项目目标
使用部署在K210上的YOLO模型完成水面漂浮垃圾的检测与识别任务
实验步骤
一、数据集制作
1. 准备数据集
目标检测: 每类图片数量不低于100张, 建议采集200~400张,数据集大小决定了模型的质量
因为模型最终部署在K210上,所以直接使用K210采集数据集图片。采集图片脚本如下:
链接:https://pan.baidu.com/s/1bBLRuzbX0w3ZFzC3oPwhMQ 提取码:mutk
注意:上面这个脚本需要在文件最后顶格添加一行main()
才能运行。(亲身实践,在maix-bit上能顺利运行。但是在拍照过程中时常出现卡死的情况,频繁上下电和reset,导致最后在TF卡里生成多个文件夹,且每个文件夹里图片均从0开始命名,后面合并非常麻烦,不得不撸几个脚本批量完成图片的重命名工作。)
图片批量重命名脚本如下:
# -*- coding: utf-8 -*-
import os
path = 'E:\cap_images_0\\0' # path为插上读卡器后,所要批量重命名的目录
num = 334 # num为第一张图片序号
for file in os.listdir(path):
os.rename(os.path.join(path, file), os.path.join(path, str(num) + ".jpg"))
num += 1
回归正题,下载好并修改拍照脚本后,将脚本命名为boot.py并(通过读卡器)放到FAST格式化后的TF卡上,如下图所示
接着拔出TF卡插入K210中(先插卡再上电),接好配套的LCD显示屏和摄像头,上电。k210上电后,系统会优先在 \sd
目录创建 boot.py和 main.py
两个文件,因为我们重写了boot.py
所以系统只会新建 main.py
而不再重复新建 boot.py
。当然这无关紧要,如果在 boot.py
里面写死循环(While True)
程序,将会导致 main.py
不能运行(先调用 boot.py 后调用 main.py)。相当于开机k210进入死循环,一直检测按键状态完成拍照并保存。
boot.py 主要用于配置硬件,只配置一次即可。
main.py 可以用于主要的运行的程序。
K210拍摄得到训练图片如下图所示:
2. 标注图片
使用标注软件labelImg进行图片标注,labelImg使用此处不予详述。标注过程如下图所示:
问题和解决方法:
- 训练过程中报错
Corrupt JPEG data: premature end of data segment
,经查阅,原因为训练图片解码后超内存导致数据流被截断损坏。解决方法是将图片进行压缩(具体压缩到多大得依据Mx-yolo中训练模型的源码),我使用的训练图片原大小为20KB,使用image tool工具(Mx-yolov3提供有)处理后,图片被压缩到了8KB,训练过程便不再报错。
二、模型训练
1.Mx-yolov3环境配置
Mx-yolov3环境配置详情参考下面这篇博客:
问题和解决方法:
- 当电脑中已安装有其他版本的python且没有python3.7时,无需删除原来的python,只需要下载python3.7并将路径添加至系统环境变量即可。个人建议使用anaconda新建一个专门适用于Mx-yolov3的虚拟环境,这样比较利于管理,配置python系统环境变量时指向anaconda的envs文件夹下对应的虚拟环境路径即可。需要注意的是,在配置系统环境变量时,path值目录中有多个python的时候,系统会优先选择指向anaconda下的python,我是删除了其他python路径,仅留下Mx-yolov3虚拟环境下的python。
配置成功后,命令行输入python
回车结果如下图:
- 当电脑中已安装了cuda其他版本且没有我们实验所需的cuda10.0时,安装Mx-yolov3文件夹中提供的cuda。注意,在安装过程中安装向导会让你选择两个路径,前者是临时解压路径,后者才是安装路径,在安装完成后会删除临时解压路径下的所有文件。由于没有注意到这一点,以至于我两个路径选成一样的,导致了安装成功后找不到cuda的文件夹
/蠢哭
。在正常安装完成后,一般安装程序会自动为系统添加cuda的环境变量,此时只需要用命令行键入nvcc -V
和nvcc -version
得到两个结果中显示的版本一致,且都为10.0即表示cuda配置成功。但是我在第一次安装成功后查看版本时发现一个是10.0一个是10.1(之前安装的cuda版本),于是就把之前版本的环境变量从path中删除了,再次查看,得到如下图所示结果,配置成功。
2.Mx-yolov3模型训练和部署
模型训练教程详情参见博客:
https://blog.csdn.net/weixin_39680380/article/details/111137088
ps:如果直接使用Mx-yolov3提供的boot.py检测例程,需要自己使用lcd.rotation()
微调一下屏幕旋转方向
我得到的模型的测试结果如下图所示:
总结
总的来说,对于第一次走完数据集制作、模型训练、模型部署整个流程的我来说,结果还是令人满意的。但是模型质量还不大行,在上面的模型测试结果中,前三张图片虽然检测出了树叶,但是置信度都不高,后三张包含口罩图片根本没有没框。究其原因,主要是数据集太小了,总共360+张图片,200张左右包含共四种不同树叶,包含口罩的图片可能连100张都不到。后期准备扩大数据集,以提升模型质量达到预期要求。
第一次写这么长的博客,不免存在一些知识或是排版上的问题,还望各位看官不吝赐教。