从配置Yolov5环境到训练自己的数据集,踩坑经验

yolov5模型代码链接: https://github.com/ultralytics/yolov5

1、装好Anaconda3(跨平台的科学应用软件,可以创建独立的虚拟环境,win10、ubuntu上均可运行,但推荐ubuntu因为显卡的利用效率更高)

python2.7和python3.5/3.6共存,其内的环境互不干扰

2.按此https://github.com/ultralytics/yolov5/blob/master/requirements.txt 列举的环境安装

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple some-package

建议一个个安装,把some-package换成其中的包名,通常批量安装会有某几个安装不成功,若出现timeout错误,则在上述pip命令后加--timeout=3000   设置下载延时,清华源还是香

3.使用label Img标注数据集(里面有很多快捷键)

Annotations:放标注生成的xml文件,例如

 

images:所有.jpg格式的训练、测试样本图片

ImageSets: 

train.txt中包含训练集的所有文件名

test.txt中包含测试集的所有文件名

后面有代码可以生成

labels: yolov5格式的数据标注

0 是类别号,其余是相对位置

不慌,也有代码生成,只要你标注好了数据,当然图像标注软件也可生成xml或者yolo格式的标注数据

 

 

4.生成train.txt  test.txt的代码

xmlfilepath = 'Annotations'
txtsavepath = 'ImageSets\Main'

ftest = open('ImageSets/Main/test.txt', 'w')
ftrain = open('ImageSets/Main/train.txt', 'w')

注意下面代码中的上述路径是否存在,改代码放在data目录下面执行

import os
import random
 
trainval_percent = 0.2   #可自行进行调节
train_percent = 1
xmlfilepath = 'Annotations'
txtsavepath = 'ImageSets\Main'
total_xml = os.listdir(xmlfilepath)
 
num = len(total_xml)
list = range(num)
tv = int(num * trainval_percent)
tr = int(tv * train_percent)
trainval = random.sample(list, tv)
train = random.sample(trainval, tr)
 
#ftrainval = open('ImageSets/Main/trainval.txt', 'w')
ftest = open('ImageSets/Main/test.txt', 'w')
ftrain = open('ImageSets/Main/train.txt', 'w')
#fval = open('ImageSets/Main/val.txt', 'w')
 
for i in list:
    name = total_xml[i][:-4] + '\n'
    if i in trainval:
        #ftrainval.write(name)
        if i in train:
            ftest.write(name)
        #else:
            #fval.write(name)
    else:
        ftrain.write(name)
 
#ftrainval.close()
ftrain.close()
#fval.close()
ftest.close()

 

5.xml转换成yolov格式的数据代码

注意路径和类型相匹配

import os 
import xml.etree.ElementTree as ET
import pickle
train = 'D:/allDownload/data/ImageSets/Main/train.txt'
test = 'D:/allDownload/data/ImageSets/Main/test.txt'

def readTxt(txt):
    f = open(txt,'r') 
    ans =[]
    lines = f.readlines()      #读取全部内容 ,并以列表方式返回
    for line in lines:
        line=line.strip('\n')
        ans.append(line)
    return ans
        


classes =  ['Rod','1','yellowLight','2','tank']  #自己训练的类别
#                红灯           绿灯
def convert(size, box):
    dw = 1./size[0]
    dh = 1./size[1]
    x = (box[0] + box[1])/2.0
    y = (box[2] + box[3])/2.0
    w = box[1] - box[0]
    h = box[3] - box[2]
    x = x*dw
    w = w*dw
    y = y*dh
    h = h*dh
    return (x,y,w,h)

def convert_annotation(image_id):  # 转换这一张图片的坐标表示方式(格式),即读取xml文件的内容,计算后存放在txt文件中。
    in_file = open('./Annotations/%s.xml'%image_id)
    out_file = open('./labels/%s.txt'%image_id, 'w')
    tree=ET.parse(in_file)
    root = tree.getroot()
    #tree = open(in_file)
    #xml_text = f.read()
    #root = ET.fromstring(xml_text)
    size = root.find('size')
    w = int(size.find('width').text)
    h = int(size.find('height').text)

    for obj in root.iter('object'):
        difficult = obj.find('difficult').text
        cls = obj.find('name').text
        if cls not in classes or int(difficult) == 1:
            print("没有找到类")
            continue
        cls_id = classes.index(cls)
        xmlbox = obj.find('bndbox')
        b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text), float(xmlbox.find('ymax').text))
        bb = convert((w,h), b)
        out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')

lines =readTxt(train)
#print(lines)
for line in lines:
    convert_annotation(line)
    print("处理的",line)

lines =readTxt(test)
#print(lines)
for line in lines:
    convert_annotation(line)
    print("处理的",line)



 

 

6. data下新建xx.yaml 内容为:

# train and val datasets (image directory or *.txt file with image paths)

train: /home/ubuntu/yolov5-test/data/images/  # 图片路径

val: /home/ubuntu/yolov5-test/data/images/  # 图片路径

#test: ../coco/test-dev2017.txt  # 20k images for submission to https://competitions.codalab.org/competitions/20794

 

# number of classes

nc: 5   #训练的类别

 

# class names   自定义

names: ['Rod','RedLight','yellowLight','GreenLight','tank']    

 

 

 

 

 

7.在models目录下新建 yolov5s-xxx.yaml

其实是将yolov5s.yaml 的副本改一处就可以了

改成自己的几类

 

训练命令 

python train.py  --batch-size 64 --data data/xx.yaml --cfg models/yolov5s-xx.yaml --weights weights/yolov5s.pt  --device 0,1 --epochs 200

yolov5s.pt 文件官网上的谷歌云端硬盘有

可将batch-size 64 改小一点       

epochs 200是指定训练步数

 

 

测试:

python detect.py  --weights runs/exp3/weights/best.pt 

测试图片和检测结果所放文件夹

训练的结果信息在runs文件夹下

©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页