在上一篇文章解读YOLO v7的代码(一)模型结构研究_gzroy的博客-CSDN博客,我对Yolo v7的模型结构进行了分析,那么这次我们将进一步研读代码的关键部分,学习是如何对模型进行训练的。
训练数据的准备是模型训练的关键,通常我们需要对图像数据做很多图像增广的处理,例如色彩的变换,形变,mixup, mosaic等等,通过对代码的训练数据处理部分的解读,可以更好的帮助我们理解当前主流的图像增广技术。
首先是下载训练数据,Yolo v7可以直接对Coco数据进行训练和检测,不需要像以往传统的检测模型那样需要先在Imagenet这些数据集上进行预训练。
在scripts目录下有一个get_coco.sh,运行这个文件下载数据,下载的数据会放在几个文件夹,包括了训练集,验证集和测试集。
然后运行python train.py --workers 8 --device 0 --batch-size 32 --data data/coco.yaml --img 640 640 --cfg cfg/training/yolov7.yaml --weights '' --name yolov7 --hyp data/hyp.scratch.p5.yaml即可进行训练。
在train.py文件中,第616行的train(hyp, opt, device, tb_writer)是跳转到train函数进行训练。
第245行是加载训练数据
dataloader, dataset = create_dataloader(train_path, imgsz, batch_size, gs, opt,
hyp=hyp, augment=True, cache=opt.cache_images, rect=opt.rect, rank=rank,
world_size=opt.world_size, workers=opt.workers,
image_weights=opt.image_weights, quad=opt.quad, prefix=colorstr('train: '))
继续跳到create_dataloader函数,可以看到是调用以下函数来构建一个数据集
dataset = LoadImagesAndLabels(path, imgsz, batch_size,
augment=augment, # augment images
hyp=hyp, # augmentation hyperparameters
rect=rect, # rectangular training
cache_images=cache,
single_cls=opt.single_cls,
stride=int(stride),
pad=pad,
image_weights=image_weights,
prefix=prefix)
这个loadImagesAndLabels是继承了Dataset类,其中的__getitem__方法定义了对图像处理的步骤,根据运行train.py指定的超参数,我们可以看到在标准的训练过程中,对图像做了如下的处理:
1. 图片缩放
假设最终要进行训练的图片的大小为640*640,那么把训练集的图片进行缩放,按比例缩放,缩放后的图片的长边等于640。
2. Mosaic处理
这个处理方式的思想是把几张图片拼接起来,其好处是避免要识别的物体都处在图像的中心区域,以及使得对物体的识别可以排除物体所处背景的影响。
这里会有80%的几率用四张图片做拼接,20%的几率用9张图片做拼接。
以四张图片的拼接为例,通过对load_mosaic这个函数进行解读,我们可以理解到这个处理过程。假设我们最终需要的训练图像大小为640*640,那么构建一个大小为1280*1280的图片,图片以像素114进行填充。然后确定一个mosaic的中心点,这个中心点的x,y坐标的范围在(0.5*640, 1.5*640)的范围中随机选择。
然后把第一张图片的右下角对齐这个中心点,第二张图片的左下角对齐中心点,第三张图片的右上角对齐中心点,第四张图片的左上角对齐中心点进行铺排,然后把这四张图片对应的像素拷贝到这个1280*1280的图片的对应位置中,最后对超出这个1280*1280的图片的区域进行裁剪。
以下是四张图片:
经过mosaic拼接后的效果:
mosaic9的处理方式也是类似
之后就是进行copy_paste的处理,因为默认的copy_paste的概率为0,因此没有进行这个处理,这里也略过不提。
3. 形变处理
在mosaic操作完成之后,就要对图像进行形变处理。这里的形变包括了旋转,平移,缩放,剪切,透视的处理。默认的形变参数为'degrees': 0.0, 'translate': 0.2, 'scale': 0.9, 'shear': 0.0, 'perspective': 0.0,也就是只进行平移和缩放。最后形变完成之后再对图像进行缩放为640*640。以下是对之前mosaic图像进行形变处理后的图形:
4. Mixup处理
在形变处理之后,下一步就是有15%的几率要做mixup的处理,这里把两个mosaic形变之后的图片进行mixup处理,合为一张图片。效果如下:
5. 颜色处理
随机调整色彩的hsv值,这里的参数取值是'hsv_h': 0.015, 'hsv_s': 0.7, 'hsv_v': 0.4,调整后的效果如下:
6. paste-in处理
之后有15%的几率进行paste-in的处理,这时将构建另外一张mosaic的图片,由另外4张图片构成,然后从这个mosaic图片中选取不超过30个的物体,将其拷贝到上一步得到的图片中。以下是paste-in处理后的结果,可以看到,在图片上添加了一些从其他图片拷贝过来的人物和烤炉的物体:
7. 随机翻转
这里就比较简单,有50%的几率进行随机左右翻转。
以上就是标准的YOLO V7做目标检测用到的图像增强处理的技术。在下一篇博客,我将继续分析YOLOv7的损失函数和具体训练过程。