lyuwenyu / RT-DETR

[CVPR 2024] Official RT-DETR (RTDETR paddle pytorch), Real-Time DEtection TRansformer, DETRs Beat YOLOs on Real-time Object Detection. 🔥 🔥 🔥
Apache License 2.0
2.31k stars 258 forks source link

将BCE改成CE无法收敛 #315

Closed YoungsunPan closed 4 months ago

YoungsunPan commented 4 months ago

也就是config中的'vfl' loss改成’label‘ loss,并将“use_focal_loss”设为false。 发现无法收敛 map只能跑有4.几。这是为什么呢

lyuwenyu commented 4 months ago

bug: https://github.com/lyuwenyu/RT-DETR/issues/317 fix pr: https://github.com/lyuwenyu/RT-DETR/pull/319

YoungsunPan commented 4 months ago

我修改了这个bug,依然无法收敛。 后续发现是CE loss中bg类的权重默认设置为1e-4,太小了。设置成1之后就正常

YoungsunPan commented 4 months ago

我修改了这个bug,依然无法收敛。 后续发现是CE loss中bg类的权重默认设置为1e-4,太小了。设置成1之后就正常

现在的问题是,使用ce的话,训练某个步骤,loss会突然崩溃,并且不会快速回落。。 而且将梯度截断设置成1e-4, lr设置成1e-6都无法避免该问题 企业微信截图_17164625319933

lyuwenyu commented 4 months ago

这样试一下 ?

  1. 结合上面的PR
  2. 同时把config里的 num_classes 改成 num_classes+1
  3. 这里 enc_outputs_class[:, -1].max(-1).values https://github.com/lyuwenyu/RT-DETR/blob/5b628eaa0a2fc25bdafec7e6148d5296b144af85/rtdetr_pytorch/src/zoo/rtdetr/rtdetr_decoder.py#L491
YoungsunPan commented 4 months ago

这样试一下 ?

  1. 结合上面的PR
  2. 同时把config里的 num_classes 改成 num_classes+1
  3. 这里 enc_outputs_class[:, -1].max(-1).values https://github.com/lyuwenyu/RT-DETR/blob/5b628eaa0a2fc25bdafec7e6148d5296b144af85/rtdetr_pytorch/src/zoo/rtdetr/rtdetr_decoder.py#L491

感谢现在已经能正常收敛。1 2我之前已经改好, 加上第三点之后没有在出现上述loss爆炸的情况。也就是说第三点是罪魁祸首。。。 后面跑出结果我附在下边

总结上述:

  1. 上面的PR
  2. 同时把config里的 num_classes 改成 numclasses+1 3.修改为: , topk_ind = torch.topk(enc_outputs_class[:,:, :-1].max(-1).values, self.num_queries, dim=1)。 4.CE loss中bg类的权重默认设置为1e-4,改大一些。
YoungsunPan commented 4 months ago

R50vd 的map只有45, 和BCE(53.1)差距太大了。。 感觉还是不正常