yolov5训练自己的数据

最近项目涉及计算机视觉,前期已训练了一些模型,但实时识别性能上总是有些欠缺,听说yolov5进行了深度模型压缩,可以快速提高识别效率,所以就把代码拉下来试试,参考项目地址:https://github.com/ultralytics/yolov5


文章目录

  • yolov5训练自己的数据
  • 准备工作
  • 一、准备数据
  • 二、调整参数
  • 1.调整data中yaml文件
  • 2.修改model下yaml文件
  • 三、执行训练
  • 1.参数说明
  • 2.文件说明
  • 四、预测
  • 总结



准备工作

yolov5 是源码是基于pytorch框架的,所以要安装相应支持,我的环境是之前自己花了几天时间统一配好的,包括大部分的深度学习框架,改天有空再把配环境的记录也写一下,当时也遇到了很多坑,我linux装的anaconda,配置环境如下:

yolo训练时候不是GPU_yolo训练时候不是GPU


当前用的是pytorch1.7,cuda及显卡配置如下:

yolo训练时候不是GPU_深度学习_02


配置环境就不多说了,搜索csdn教程基本都可以解决;特别说一下yolov5的依赖包,运行前需要确认所有模块都安装好了。

yolo训练时候不是GPU_yolo训练时候不是GPU_03


提示:以下是本篇文章正文内容,下面案例可供参考

一、准备数据

如果是用之前VOC数据集需要将其转换为lable,在主目录下新建tmp文件夹,复制原来的数据集到tmp文件夹下,进入tmp目录,建立voc2txt.py文件和makedata.py文件。

yolo训练时候不是GPU_pytorch_04


yolo训练时候不是GPU_python_05

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文件夹

yolo训练时候不是GPU_深度学习_06

其中labels中txt文件内容如下:

yolo训练时候不是GPU_pytorch_07


前面数字表示类别编号,后面是相对坐标。

到此数据准备结束。

二、调整参数

1.调整data中yaml文件

复制coco128.yaml,命令为自己的文件名,我这里叫work_voc.yaml,内容如下

yolo训练时候不是GPU_深度学习_08


nc 代表类别,names的列表填写自己的类别名称。

2.修改model下yaml文件

yolov5提供了s m l x四种模型,官方提供的模型数据如下:

yolo训练时候不是GPU_yolo训练时候不是GPU_09


这里主要目的是提高检测效率,所以选择了yolov5s.yaml文件。

yolo训练时候不是GPU_python_10


这里一般只需要该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

yolo训练时候不是GPU_深度学习_11

总结

利用yolov5训练自己的数据集算是执行完成了,但是里面还有很多细节问题没有解决,比如我在测试视频识别时,不进行窗口显示每帧可达0.007s,但是一旦显示就变成0.013s以上,目前问题还没解决(已解决,是网络传输问题),欢迎知道的朋友给与指点。
今天算是把yolo5大概记录一下,后续有空,把yolov4也总结一下(draknet和tf两种版本对比),如果在pc端运行的话yolov4还是很不错的。