解读YOLO v7的代码(二)训练数据的准备

在上一篇文章解读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图像进行形变处理后的图形:

解读YOLO v7的代码(二)训练数据的准备_第1张图片

 4. Mixup处理

在形变处理之后,下一步就是有15%的几率要做mixup的处理,这里把两个mosaic形变之后的图片进行mixup处理,合为一张图片。效果如下:

解读YOLO v7的代码(二)训练数据的准备_第2张图片

5. 颜色处理

随机调整色彩的hsv值,这里的参数取值是'hsv_h': 0.015, 'hsv_s': 0.7, 'hsv_v': 0.4,调整后的效果如下:

解读YOLO v7的代码(二)训练数据的准备_第3张图片

 6. paste-in处理

之后有15%的几率进行paste-in的处理,这时将构建另外一张mosaic的图片,由另外4张图片构成,然后从这个mosaic图片中选取不超过30个的物体,将其拷贝到上一步得到的图片中。以下是paste-in处理后的结果,可以看到,在图片上添加了一些从其他图片拷贝过来的人物和烤炉的物体:

解读YOLO v7的代码(二)训练数据的准备_第4张图片

 7. 随机翻转

这里就比较简单,有50%的几率进行随机左右翻转。

以上就是标准的YOLO V7做目标检测用到的图像增强处理的技术。在下一篇博客,我将继续分析YOLOv7的损失函数和具体训练过程。

你可能感兴趣的:(人工智能,机器学习,深度学习,人工智能)