样本数量多,还要多样性:yolov5对数据集的要求是每个类的数据大于1.5K,目标数大于10K。For real-world use cases we recommend images from different times of day, different seasons, different weather, different lighting, different angles, different sources (scraped online, collected locally, different cameras) etc.
Background images. Background images are images with no objects that are added to a dataset to reduce False Positives (FP). We recommend about 0-10% background images to help reduce FPs (COCO has 1000 background images for reference, 1% of the total).
从常见数据集(COCO,object365)中可以看出,收集数据集主要侧重于图片的多样性和数量,对尺寸和样本的均衡并没有强制规定。在COCO数据集中,图片的大小尺寸是不一致的,类别也是分布不均匀的。
收集的主要途径:
在github上搜索labelImg,进行下载安装。
1.没有任何预先打好的标签,从零开始
使用快捷键进行标注
Ctrl + u | Load all of the images from a directory |
---|---|
Ctrl + r | Change the default annotation target dir |
Ctrl + s | Save |
Ctrl + d | Copy the current label and rect box |
Ctrl + Shift + d | Delete the current image |
Space | Flag the current image as verified |
w | Create a rect box |
d | Next image |
a | Previous image |
del | Delete the selected rect box |
Ctrl++ | Zoom in |
Ctrl– | Zoom out |
↑→↓← | Keyboard arrows to move selected rect box |
可以一次只标注一个类,使用default label,这样标注成默认种类,就节省了选种类的时间。
如上图所示,可以切换生成的Label的格式,支持yolo,VOC两种格式的label。在change save dir中更改label存放的路径。标签的名字与图片同名。Open dir中选择图像存放的地址。
如果一张图片中没有想要识别的对象,可以按verify image,自动生成一个空白的标签文件。
通过预先训练的模型自动标注
有时我们可以在网上下载到别人已经训练好的模型,比如下载安全帽识别的模型,用这个模型去检测我们数据集中的图片,就可以自动生成label,后续只要在模型预测的label的基础上进行调整和增加即可,大大减少了工作量。
以yolov5为例:
cd yolov5 #进入yolov5目录
python detect.py -h #查看detect的帮助文档
#可以看到几个对我们有帮助的参数
--save-txt save results to *.txt #将预测的bounding box保存为txt文件
--save-crop save cropped prediction boxes #将预测的bounding box截取出来
--classes CLASSES [CLASSES ...] #只预测指定类别
开始检测,待模型检测完后,将模型的label文件下载下来,在labelImg中change save dir到预测的label文件中,打开图片文件夹,就可以看到预测出的Label在图片上的具体位置了。
注意
change save dir可以更改存放label的地址,也是读取label的地址。如果某张图片有了label,就会在图片中显示框bounding box.yolov5 格式的 label要生成class.txt文件,按照顺序写入标签类别的名称,且名称不能少于label.txt文件中类别的数量 如果不满足这些条件,labelImg会闪退.
比如我的label文件是这样的:
0 0.492448 0.470833 0.013021 0.019444
1 0.492969 0.537963 0.020313 0.057407
3 0.837240 0.719444 0.029687 0.088889
2 0.815104 0.761111 0.067708 0.442593
一共4个类,classes.txt中的类别就要大于等于4
person
dog
cat
butterfly
将图片和标签随机分成训练集和验证集
import os
import numpy
import random, shutil
sourceImageDir = r"C:\Users\calorie\Desktop\images" #源图片文件夹路径,加了r就不用转义了?
sourcelabelDir=r"C:\Users\calorie\Desktop\labels"
targetDir = r"C:\Users\calorie\Desktop"
imageNumbers = len(os.listdir(sourceImageDir))
rate = 0.2
testNumbers = int(imageNumbers * rate)
trainNumbers = imageNumbers - testNumbers
for item1 in (os.listdir(sourceImageDir)):
imagePath = sourceImageDir + "\\" + item1
labelPath = sourcelabelDir + "\\" + item1.strip("jpg") + "txt"
if not (os.path.exists(labelPath)):
os.mknod(labelPath)
print(labelPath)
sample = random.sample(os.listdir(sourceImageDir), testNumbers) # 随机选取testNumbers数量的样本图片
for item in sample:
imagePath = sourceImageDir + "\\" + item
labelPath = sourcelabelDir + "\\" + item.strip("jpg") + "txt"
shutil.move(imagePath,targetDir+"\\test"+"\\images")
shutil.move(labelPath,targetDir+"\\test"+"\\labels")
shutil.move(sourceImageDir,targetDir+"\\train")
shutil.move(sourcelabelDir,targetDir+"\\train")
要不要将图片裁剪成同样的大小。不需要,yolov5中会自动resize和padding.
输入图片可能大小不一致,但是输入进模型的图片要求是一个正方形且与指定输入图像的大小一致。如:python train.py --img 480
所有输入图像都会被padding or resize成480*480大小的图片。假设图形的原始大小
指定图片大小必须为32的倍数 看博客里说用预训练权重,最好和预训练权重一样大小的数据。同时特征图的大小都是原图的32的倍数。
http://karpathy.github.io/2019/04/25/recipe/
yolov5模型训练建议:
1.使用默认配置,建立一个baseline
2.epochs,从300开始,如果提前过拟合,可以减少epochs,如果没有,增加epochs.
3.图像大小:越大的图像对识别小物体越有利。COCO原始的训练大小是640,为了识别小物体可以增大到1280.
4.batchsize,在硬件允许的范围内,越大越好。
5.超参数,各种参数可以在hyp.scratch.yaml中调节。
6.labelsmoothing 防止过拟合
https://github.com/ultralytics/yolov5/issues/607
yolov5是通过参数来训练模型的,在train,py/detect,py的main函数中可以看到参数。或者python train.py --help
查看参数和说明
train可以定义改变图片大小训练