YOLOv10s训练代码解析6:forward

本专栏会手把手带你从源码了解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)]}

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值