lx-cly / YOLOv5_OBB_KLD

KLD实现旋转目标检测
GNU General Public License v3.0
45 stars 10 forks source link

关于KLD损失的疑问 #8

Open LUO77123 opened 2 years ago

LUO77123 commented 2 years ago

作者你好,感谢你分享的工作,在阅读源码时有几个问题。 您给出的KLD损失绘图如下,显示分类损失一直为0,而角度损失一直下降。 image 但是,我在阅读compute_loss_KLD中,langle 初始值为0 , image 而后,langle 未参与其他计算,就到达最后损失计算,langle = h['angle'] S,所以 langle=0,即 langle 一直为0,角度仅在Box损失计算中参与Iou的计算。如下图 image 我试着训练DOTA数据集,效果不好。想知道您给的数据集label是什么格式(poly的4点坐标,还是由poly经过CV外接最小矩形的带角度的坐标,由OpenCV法转化为长边法的代码在哪里喃),谢谢 PS,这是我用CSL测全部16类后,得到的ship:0.8941434649109584, 但是现在KLD得到效果不好

lx-cly commented 2 years ago

根据薛洋博士的博客,kld方法就是将框转成高斯分布来计算损失。区别于CSL,通过将角度的回归问题转换成了一个分类问题。关于kld计算损失代码中,将langle设为0,是为了跟cls方法计算损失返回的一致,让这样后续修改的代码少一点。其实kld跟原始yolov5水平框计算损失差不多,只不过lbox不同。 我只训练DOTA(Ship)一类,根据出来后的数据集是放在https://pan.baidu.com/s/1eyiZyjOMH9dQ8nCsPfxTTQ label格式示例:classid x_c y_c longside shortside Θ Θ∈[0, 180) 0 0.6193594336509705 0.6730781197547913 0.043673209846019745 0.02428230084478855 170 OpenCV法转化为长边法的代码请参看:https://github.com/hukaixuan19970627/DOTA_devkit_YOLO

lx-cly commented 2 years ago

你还可以参看 项目 YOLOv5_OBB_KLD)/yolov5_obb ,这是根据胡凯旋作者的项目然后添加kld方法。我简单训练了16类,结果如README.md所示。如果用这个新的项目训练,数据集的处理请参看GetStart.md。 希望能帮到您。

LUO77123 commented 2 years ago

你还可以参看 项目 YOLOv5_OBB_KLD)/yolov5_obb ,这是根据胡凯旋作者的项目然后添加kld方法。我简单训练了16类,结果如README.md所示。如果用这个新的项目训练,数据集的处理请参看GetStart.md。 希望能帮到您。

谢谢您的答复,

LUO77123 commented 2 years ago

你还可以参看 项目 YOLOv5_OBB_KLD)/yolov5_obb ,这是根据胡凯旋作者的项目然后添加kld方法。我简单训练了16类,结果如README.md所示。如果用这个新的项目训练,数据集的处理请参看GetStart.md。 希望能帮到您。

谢谢您的答复,我是按照参考您的代码,修改胡凯旋作者的项目,主要不同2处: 1.您的hyp.scratch.yaml没使用图像旋转数据增强(可能是加了随机旋转(-180,180)), 2.KLD_IoU选的是Min(KLD_tp , KLD_pt), 跑CSL时,40个epoch基本达到70%,现在20个才到15%,收敛慢,效果很差,我再改改

LUO77123 commented 2 years ago

你还可以参看 项目 YOLOv5_OBB_KLD)/yolov5_obb ,这是根据胡凯旋作者的项目然后添加kld方法。我简单训练了16类,结果如README.md所示。如果用这个新的项目训练,数据集的处理请参看GetStart.md。 希望能帮到您。

还有一个问题,在于test.py,调用non_max_suppression_en时候,angle_index = x[:, 5 + nc:] 179,怎么不用sigmoid,即angle_index = x[:, 5 + nc:].sigmoid 179?? 这样才能限制angle_index[0~180]喃

lx-cly commented 2 years ago

non_max_suppression_en函数下有注释 注:yolov5 在模型的Head中已经将结果进行相应的sigmoid操作以及回归对应anchor操作

LUO77123 commented 2 years ago

non_max_suppression_en函数下有注释 注:yolov5 在模型的Head中已经将结果进行相应的sigmoid操作以及回归对应anchor操作

好的,我看到在detect中进行sigmoid,还有一点在yolo.py和yolo_new.py中的def parse_model(d, ch)函数,定义的(no = na (nc + 5) # number of outputs = anchors (classes + 5) = 385 =255)是否也应改成no = na (nc + 5 + angle ) (cls_angle=180,kld_angle=1)喃

lx-cly commented 2 years ago

non_max_suppression_en函数下有注释 注:yolov5 在模型的Head中已经将结果进行相应的sigmoid操作以及回归对应anchor操作

好的,我看到在detect中进行sigmoid,还有一点在yolo.py和yolo_new.py中的def parse_model(d, ch)函数,定义的(no = na (nc + 5) # number of outputs = anchors (classes + 5) = 385 =255)是否也应改成no = na (nc + 5 + angle ) (cls_angle=180,kld_angle=1)喃

LUO77123 commented 2 years ago

non_max_suppression_en函数下有注释 注:yolov5 在模型的Head中已经将结果进行相应的sigmoid操作以及回归对应anchor操作

好的,我看到在detect中进行sigmoid,还有一点在yolo.py和yolo_new.py中的def parse_model(d, ch)函数,定义的(no = na (nc + 5) # number of outputs = anchors (classes + 5) = 385 =255)是否也应改成no = na (nc + 5 + angle ) (cls_angle=180,kld_angle=1)喃

谢谢答复,最后想请问一下,KLDloss中,p_angle和t_angle的角度是 0-180(还是0-pi)、还是长边-90-90(-pi/2-pi/2)喃 另外我也把KFIou搬过去了,定义Smooth-L1 norm这块,薛洋大神回复的diff = torch.abs(xy_p - xy_t)中的xy_p、xy_t decode以前的,yolov5的是decode以后的,作者测试过这样的效果吗?

LUO77123 commented 2 years ago

non_max_suppression_en函数下有注释 注:yolov5 在模型的Head中已经将结果进行相应的sigmoid操作以及回归对应anchor操作

好的,我看到在detect中进行sigmoid,还有一点在yolo.py和yolo_new.py中的def parse_model(d, ch)函数,定义的(no = na (nc + 5) # number of outputs = anchors (classes + 5) = 385 =255)是否也应改成no = na (nc + 5 + angle ) (cls_angle=180,kld_angle=1)喃

作者你好,新版本里面的KLd损失计算,你没改Dataset.py的类,还是187,是怎么跑通的喃,我跑完了,新版本就和CSL和我改好的KLD用yolov5m训练map差距不大,(KLD还低了一个点,KFIou直接nan,训练不下去),有没有想法交流一下,QQ342463313