基于yolov5的深度学习物体识别系统 -- 全过程总结
给自己做一个从零基础到训练测试改进熟练工的总结,其实感觉最大的作用就是修改数据集。。。
系列文章:
基于yolov5的深度学习物体识别系统(一) -- 数据集原图获取与标注
基于yolov5的深度学习物体识别系统(二) -- yolov5运行环境搭建及label文件格式转换
目录
数据集
原始图片数据获取
从各搜索引擎如百度、谷歌等,搜索飞机和船的名称关键字,并下载相关图片,为每一类图片命名好关键字和编号,便于标注。
可以编写python脚本批量采集图片。
数据集基本要求及数量级
从训练的角度出发,数据集中的图片应该要做到几点:
1、多角度。飞机和船都要有多种角度的拍摄照片,比如俯视、仰视、正视、后视以及其他角度的各种侧视。
2、多背景。背景复杂的训练集,才能让模型更具有泛化能力,能降低误检率。
3、多目标物体。一张图中有多个不同的目标物体,并且都标注出来,这样模型学到的知识就更加细化。
4、大小物体都有。在一张图中相对小的物体也要标注并且这种数据尽可能多,才能弥补yolo在小物体检测的不足。
5、关于数量级,一般每类有300到500张图片做训练集就可以有很好的效果,当然,这是在数据有限的情况下得出的结论。
数据筛选
对爬取的图片进行人工筛选,去掉不相关的图、下载错误导致损坏的图。
数据标注
使用labelme来进行标注,Ubuntu和Windows都可以安装,安装后启动程序选择目录开始标注。
在每张正样本图片中,用矩形框标出飞机或者船(对角的两个点的坐标即可),然后打好名称标签如f16,矩形起点终点在左上还是右下都无所谓,后面可以处理。
标签数据格式转换
用labelme标注的标签格式是json,而yolov5需要的格式是txt,而且数据形式也有差别。
转换原理:labelme标注的数据是两个对角的点的xy坐标,需要转换为相对于图片高度和宽度的坐标,具体操作只需要从文件中读取之后,将xy坐标与w、h一起计算,公式如下:(x、y、w、h为写入txt的坐标)
1、x = ((x2+x1)/2)/weight
2、y = ((y2+y1)/2)/height
3、w = (x2-x1)/weight
4、h = (y2-y1)/height
数据集划分
随机在整个数据集中挑选五分之一,作为训练过程中的验证集。
项目部署
YOLOv5项目源码
在github下载即可。地址:https://github.com/ultralytics/yolov5
数据集配置
数据集放在项目文件夹的 data 文件夹中,具体位置如图:
修改配置文件:
1、在项目的data目录下新建cv01.yaml文件,内容示例如下:
train: ./data/mydatas01/images/train2021/
val: ./data/mydatas01/images/val2021/
nc: 6
names: [ 'cat', 'dog', 'miaomiao', 'wangwang', 'lipu', 'buzhidao']
需要修改的是 train: 、 val: 、 nc: 、 names: [ 'a', 'b', 'c'] 四行,分别对应训练图片的路径,验证图片的路径,以及数据集的类别的数量,和那些类别的名字。
2、项目的models目录下的yolov5s.yaml(也可选择其他的模型方法)文件修改:
这个文件只需要修改 nc: 那行,跟上一个文件对应就可以。
源码改动思路
检测时只保存有目标的图片(方便查看):修改detect.py文件,在检测之前新建变量flag,初始化0,检测到目标时将之赋1,在保存每个文件时判断。
目标框太大,导致文字彩条超出图片,看不到判断结果:修改plots.py文件,将绘制的检测结果彩条坐标下移到框内。
训练及验证
训练原理
特点:采用马赛克技术,每个batch中,每次训练随机选择四张图片,以增强背景知识,并在训练前对图片进行翻转、旋转、调亮度等操作。
训练参数设置
主要是配置文件和预训练模型的设置,以及batch和epoch的大小。
验证结果分析
P:准确率
R:召回率
mAP(mean average precision):多个类别物体检测中,每一个类别都可以根据recall和precision绘制一条曲线,AP就是该曲线下的面积,mAP是多个类别AP的平均值
测试
大型测试集效果
误检率很高,小物体检测有时漏标,尤其是多个小物体的情况。
分析原因
因为模型没有学习负样本知识,目标检测的背景不够复杂。
改进
训练集增加大量负样本,即图片中没有飞机和船,而且没有对应的txt标签文件,这样在背景增强时就会被视为同一张图的背景。
重新检查训练集和验证集,有没有标注错误的情况。
经过改进,在保证召回率的情况下,误检率显著下降。
上一篇: Java基础补习Day4