yolov5训练自己的数据
最近项目涉及计算机视觉,前期已训练了一些模型,但实时识别性能上总是有些欠缺,听说yolov5进行了深度模型压缩,可以快速提高识别效率,所以就把代码拉下来试试,参考项目地址:https://github.com/ultralytics/yolov5
文章目录
- yolov5训练自己的数据
- 准备工作
- 一、准备数据
- 二、调整参数
- 1.调整data中yaml文件
- 2.修改model下yaml文件
- 三、执行训练
- 1.参数说明
- 2.文件说明
- 四、预测
- 总结
准备工作
yolov5 是源码是基于pytorch框架的,所以要安装相应支持,我的环境是之前自己花了几天时间统一配好的,包括大部分的深度学习框架,改天有空再把配环境的记录也写一下,当时也遇到了很多坑,我linux装的anaconda,配置环境如下:
当前用的是pytorch1.7,cuda及显卡配置如下:
配置环境就不多说了,搜索csdn教程基本都可以解决;特别说一下yolov5的依赖包,运行前需要确认所有模块都安装好了。
提示:以下是本篇文章正文内容,下面案例可供参考
一、准备数据
如果是用之前VOC数据集需要将其转换为lable,在主目录下新建tmp文件夹,复制原来的数据集到tmp文件夹下,进入tmp目录,建立voc2txt.py文件和makedata.py文件。
voc2txt.py文件,代码如下:
1 import xml.etree.ElementTree as ET
2 import os
3 from os import getcwd
4
5 sets = [('2007', 'train'), ('2007', 'val'), ('2007', 'test')]
6 classes = ["shovel", "working"]
7
8
9 def convert(size, box):
10 dw = 1. / (size[0])
11 dh = 1. / (size[1])
12 x = (box[0] + box[1]) / 2.0 - 1
13 y = (box[2] + box[3]) / 2.0 - 1
14 w = box[1] - box[0]
15 h = box[3] - box[2]
16 x = x * dw
17 w = w * dw
18 y = y * dh
19 h = h * dh
20 return (x, y, w, h)
21
22
23 def convert_annotation(year, image_id):
24 in_file = open('VOCdevkit/VOC%s/Annotations/%s.xml' % (year, image_id))
25 out_file = open('VOCdevkit/VOC%s/labels/%s.txt' % (year, image_id), 'w')
26 tree = ET.parse(in_file)
27 root = tree.getroot()
28 size = root.find('size')
29 w = int(size.find('width').text)
30 h = int(size.find('height').text)
31
32 for obj in root.iter('object'):
33 difficult = obj.find('difficult').text
34 cls = obj.find('name').text
35 if cls not in classes or int(difficult) == 1:
36 continue
37 cls_id = classes.index(cls)
38 xmlbox = obj.find('bndbox')
39 b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text),
40 float(xmlbox.find('ymax').text))
41 bb = convert((w, h), b)
42 out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')
43
44
45 wd = getcwd()
46 for year, image_set in sets:
47 if not os.path.exists('VOCdevkit/VOC%s/labels/' % year):
48 os.makedirs('VOCdevkit/VOC%s/labels/' % year)
49 image_ids = open('VOCdevkit/VOC%s/ImageSets/Main/%s.txt' % (year, image_set)).read().strip().split()
50 list_file = open('%s.txt' % image_set, 'w')
51 for image_id in image_ids:
52 list_file.write('%s/VOCdevkit/VOC%s/JPEGImages/%s.jpg\n' % (wd, year, image_id))
53 convert_annotation(year, image_id)
54 list_file.close()
makedata.py文件,代码如下:
import shutil
import os
file_List = ["train", "val", "test"]
for file in file_List:
if not os.path.exists('../VOC/images/%s' % file):
os.makedirs('../VOC/images/%s' % file)
if not os.path.exists('../VOC/labels/%s' % file):
os.makedirs('../VOC/labels/%s' % file)
print(os.path.exists('../tmp/%s.txt' % file))
f = open('../tmp/%s.txt' % file, 'r')
lines = f.readlines()
for line in lines:
print(line)
line = "/".join(line.split('/')[:]).strip()
shutil.copy(line, "../VOC/images/%s" % file)
line = line.replace('JPEGImages', 'labels')
line = line.replace('jpg', 'txt')
shutil.copy(line, "../VOC/labels/%s/" % file)
执行voc2txt.py和makedata.py,在主目录生成VOC文件夹
其中labels中txt文件内容如下:
前面数字表示类别编号,后面是相对坐标。
到此数据准备结束。
二、调整参数
1.调整data中yaml文件
复制coco128.yaml,命令为自己的文件名,我这里叫work_voc.yaml,内容如下
nc 代表类别,names的列表填写自己的类别名称。
2.修改model下yaml文件
yolov5提供了s m l x四种模型,官方提供的模型数据如下:
这里主要目的是提高检测效率,所以选择了yolov5s.yaml文件。
这里一般只需要该n,改成自己的类别个数;anchors是先验框的大小,可根据自己样本提前聚类,下面的网络结构一般不用改。
三、执行训练
主目录下执行train.py文件,指定自己的data路径和预训练模型路径;可以加载预训练模型,也可以不使用。
python train.py --img 640 --batch 16 --epochs 300 --data ./data/work_voc.yaml --cfg ./models/yolov5s_work.yaml --weights yolov5s.pt
预训练权重下载地址:
链接:https://pan.baidu.com/s/1aAlRC9l4BZIo6ArcwTBt6w 提取码:hfqa
1.参数说明
以上参数解释如下:
*epochs:指的就是训练过程中整个数据集将被迭代多少次,显卡不行你就调小点。 batch-size:一次看完多少张图片才进行权重更新,梯度下降的mini-batch,显卡不行你就调小点。 cfg:存储模型结构的配置文件
data:存储训练、测试数据的文件 img-size:输入图片宽高,显卡不行你就调小点。 rect:进行矩形训练
resume:恢复最近保存的模型开始训练 nosave:仅保存最终checkpoint notest:仅测试最后的epoch
evolve:进化超参数 bucket:gsutil bucket cache-images:缓存图像以加快训练速度
weights:权重文件路径 name: 重命名results.txt to results_name.txt device:cuda
device, i.e. 0 or 0,1,2,3 or cpu adam:使用adam优化
multi-scale:多尺度训练,img-size +/- 50% single-cls:单类别的训练集
2.文件说明
所有的训练结果都存在yolov5/runs/train文件夹下,按照exp0, exp1的顺序升序排列。
weights/对应模型文件存放的位置(pytorch的pt模型存放地址,Yolo
v5会保存在验证集上表现最好的模型best.pt和训练到最后一个epoch的last.pt这2个模型).
labels.png对应训练数据的类别分布 (这里我放的是我自己的数据集…)
,可以看到类别不均衡的现象比较明显,这也是目标检测任务里常见的情况,后面会解释Yolo v5是如何处理这种情况的。
result.png对应训练的各种精度,损失函数指标
横坐标是epoch,纵坐标是各种指标的精度或者loss值。蓝色表示是从头训练的模型的指标;而橙色则是在pre-train model上进行finetune的结果。
四、预测
执行detect.py文件,根据参数填写自己的路径和权重,执行效果如下。
python win_detect.py --source /home/conda_work/conda_hsz/keras-yolo3-master-working/Video/input/L20201103093910435.mp4 --weights ./runs/train/exp7/weights/best.pt --view-img
总结
利用yolov5训练自己的数据集算是执行完成了,但是里面还有很多细节问题没有解决,比如我在测试视频识别时,不进行窗口显示每帧可达0.007s,但是一旦显示就变成0.013s以上,目前问题还没解决(已解决,是网络传输问题),欢迎知道的朋友给与指点。
今天算是把yolo5大概记录一下,后续有空,把yolov4也总结一下(draknet和tf两种版本对比),如果在pc端运行的话yolov4还是很不错的。