YOLOv10s训练代码解析5:数据增强

本专栏会手把手带你从源码了解YOLOv10(后续会陆续介绍YOLOv8、RTDETR等模型),尽可能地完整介绍整个算法,这个专栏会持续创作与更新,大家如果想要本文PDF和思维导图,后台私信我即可(创作不易,不喜勿喷),大家如果发现任何错误和需要修改的地方都可以私信我,我会统一修改。

ultralytics/engine/trainer.py的for i, batch in phar(从Dataloader取数据),从ultralytics/data/base.py的__getitem__函数取数据

batch信息:im_files(图像路径,长度为batch)、ori_shape(图像原始尺寸,长度为batch)、resized_shape(图像resize后的尺寸,长度为batch)、img(tensor维度为[batch, 3, 640, 640])、cls(tensor维度为[Nobj])、bboxes(tensor维度为[Nobj, 4])、batch_idx(每个目标对象对应于第几张图片, 0-batch-1)

调用ultralytics/data/augment.py做数据增强

data和transformers信息如下:

接着一个一个聊transformer,首先第一个包含变换如下:Compose(<ultralytics.data.augment.Mosaic>,<ultralytics.data.augment.CopyPaste>(p=0), <ultralytics.data.augment.RandomPerspective>)

首先调用ultralytics/data/augment.py文件的BaseMixTransform类的__call__方法(109行随机获得三张图像的indexes,对应于Mosaic类的get_indexes方法,然后将三个index对应的label集成在mix_labels里,最后放在labels里面,第122行实现mosaic增强,调用Mosaic类的_mix_transform方法,继续调用Mosaic类的_mosaic4方法(默认四张图拼接))

在ultralytics/data/augment.py文件的第212行首先计算Mosaic后的图像中心点坐标,图像尺寸为[1280, 1280];依次取四张图像,分别位于大图的左上角、右上角、左下角以及右下角;以第一张图片为例,第222行计算的是幕布(1280*1280图像中心点划分的左上部分)的有效坐标,第223行计算的是子图的有效坐标,再将子图的图像映射到幕布上即可(这部分可参考:https://www.bilibili.com/read/cv23472012/)

继续调用ultralytics/data/augment.py的Mosaic类的_cat_labels方法,拼接标签,去除无效的目标框

最后得到的输出如下:

接着第一个数据增强中的<ultralytics.data.augment.RandomPerspective>(概率为0的CopyPaste跳过),ultralytics/data/augment.py文件中RandomPerspective类的__call__方法

ultralytics/data/augment.py中的RandomPerspective类的affine_transform方法,返回的是变换后的图像、变换矩阵(Translation、Shear、Rotation、Perspective、Center)、尺度变换因子s(s = random.uniform(1 - self.scale, 1 + self.scale));

Attention:第432行的dsize为self.size,上一阶段已经将图像尺寸由1280变为640了(上一张图的第531行),因此这里img已经变换到了640*640

继续ultralytics/data/augment.py文件中的RandomPerspective类的__call__方法:坐标变换+处理

最后变换后的输出如下:

第二个数据增强是<ultralytics.data.augment.MixUp >,概率为9跳过;第三个数据增强是<ultralytics.data.augment.Albumentations>

第866行:ultralytics/data/augment.py文件中的Albumentations类的__call__方法(transformer:Blur(p=0.01);MedianBlur(p=0.01);ToGray(p=0.01);CLAHE(p=0.01),;RandomBrightnessContrast(p=0.0);RandomGamma(p=0.0);ImageCompression(quality_lower=75, p=0.0))

最后得到的输出如下:

第四个数据增强策略为<ultralytics.data.augment.RandomHSV>,概率好像为0;第五个数据增强策略为<ultralytics.data.augment.RandomFlip>,概率为0;第六个数据增强策略为<ultralytics.data.augment.RandomFlip>,调用ultralytics/data/augment.py文件的RandomFlip类的__call__方法,水平翻转(图像和坐标翻转)

得到的输出如下:

第七个数据增强策略为<ultralytics.data.augment.Format>,调用ultralytics/data/augment.py的Format类的__call__方法,格式化输出

得到的输出如下:bboxes由xyxy变换为xywh;batrch_idx记录每个目标在当前batch的idx;至此完成单张图像的数据增强,后面生成器继续产生数据,重复此过程

之后在ultralytics/data/dataset.py的collate_fn函数由samples to batch,得到第一张图的batch

这部分关于的整体流程如下图所示,需要原图和思维导图的朋友关注我私信获取。

  • 19
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值