本专栏会手把手带你从源码了解YOLOv10(后续会陆续介绍YOLOv8、RTDETR等模型),尽可能地完整介绍整个算法,这个专栏会持续创作与更新,大家如果想要本文PDF和思维导图,后台私信我即可(创作不易,不喜勿喷),大家如果发现任何错误和需要修改的地方都可以私信我,我会统一修改。
在获取batch数据后(数据增强后),ultralytics/engine/trainer.py的第380行先将图像tensor的值变为float,再 /255;
每个batch里的信息:
im_files:长度为batch,值为图片的路径
ori_shape:长度为batch,每个值为图片的宽高尺寸
resized_shape:长度为batch,每个值为训练resize后的尺寸
img:tensor,维度为[batch,3,resized_shape[0],resized_shape[1]]
cls:一个batch所有目标类别拼接得到的tensor,维度为[Nobj,1] bboxes:一个batch所有目标坐标(xywh)拼接得到的tensor,维度为[Nobj, 4] batch_idx:维度为[Nobj],值为每个目标所在图片对应的索引(0-batch-1)
再到ultralytics/nn/tasks.py中计算loss;
继续调用ultralytics/nn/tasks.py中的BaseModel类的loss方法,先初始化critertion(one2many和one2one的TaskAlignedAssigner标签分配初始化,这两者唯一区别是one2many的topk为10,one2one的topk为1),再前向预测,最后计算loss
再跳转到ultralytics/nn/tasks.py中的BaseModel类的forward方法,继续执行self.predict方法来预测
继续跳转到ultralytics/nn/tasks.py的_predict_ones方法执行前向推理过程 (这里以几个特殊示例说明,后续结合结构图说模型架构)
输入x: [batch, 3, 640, 640]
m: Conv(
(conv): Conv2d(3, 32, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)
(bn): BatchNorm2d(32, eps=0.001, momentum=0.03, affine=True, track_running_stats=True)
(act): SiLU(inplace=True))
运行到第133行,前向推理每一层得到x的输出:torch.Size([16, 32, 320, 320])
对于需要用到不是向前层的(也就是第4、6、10、13、16、19、22层,就是self.save存储的(可从前面解析看到)),y保存结果
第134行y保存的是第4、6、10、13、16、19、22层的输出,其他层的输出则为None,然后需用到这些层作为输入的时候,第130行进行获取并作为输入x
YOLOv10s模型的架构如下图所示:
最后回到第五幅图的第274行,preds得到的输入如下:
{'one2many': [(batch, 144, 80, 80), (batch, 144, 40, 40), (batch, 144, 20, 20)], 'one2one': [(batch, 144, 80, 80), (batch, 144, 40, 40), (batch, 144, 20, 20)]}
这部分关于的整体流程如下图所示,需要原图和思维导图的朋友关注我私信获取