本专栏会手把手带你从源码了解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
这部分关于的整体流程如下图所示,需要原图和思维导图的朋友关注我私信获取。