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