bubbliiiing / yolov4-pytorch

这是一个YoloV4-pytorch的源码,可以用于训练自己的模型。
MIT License
2.11k stars 611 forks source link

anchors和GT生成label的两种计算方式 #169

Open BigPandaCPU opened 3 years ago

BigPandaCPU commented 3 years ago

作者您好,非常感谢你分享的yoloV4-pytorch项目。 阅读了几个不同版本的Yolo实现,发现大家在计算anchors和GT的时候有两种不同的计算方法。 方法1: 在每一个特征层上,比如13 13这个特征层上,其对应的anchor是anchors[6,7,8]这三个。在该特征层上,进行object的标定的时候,是计算gt和所有的9个anchors的iou,再取最大的那个anchor多对应的index,如果该index在[6,7,8]中,就将对gt对应的特征层上的位置,进行标定。(你这里计算采用的正是这种方式) (这种计算方式会导致的问题是,如果gt比较小,对应的anchor都在anchors[0, 1, 2]这几个anchors上(特征层52 52),就会导致在特征层(13 13, 26 26)上没有目标)

方法2: 在每一个特征层上,比如13*13这个特征层上,其对应的anchor是anchors[6,7,8]这三个。在该特征层上,进行object的标定的时候,是计算gt和该层所对应的3个anchor,就是anchors[6,7,8],再取最大的那个anchor多对应的index,然后将该gt所对应的特征层上的位置进行标定。 这种实现方式的是https://github.com/eriklindernoren/PyTorch-YOLOv3/blob/master/models.py 68-78行,这里创建每一个YoloLayer(就是你这里的YoloLoss),的时候给定的anchors就是对应的3个anchor。 https://github.com/eriklindernoren/PyTorch-YOLOv3/blob/master/utils/utils.py 276-330行,这里计算gt和anchors的时候,就是计算每一个gt和该层对应的三个anchors。在darknet中好像也是采用这种计算方式。

bubbliiiing commented 3 years ago

hello,欢迎讨论,其实我也不知道哪个方式是最优的 我把这个代码写成计算9个anchor的最合适的一个,因为参考了qqwweee的yolov3的库 我个人理解是,如果每个特征层都有一个先验框对应的话,那么小目标是否也需要最深层的特征层预测了,我觉得是不是不合理。

bubbliiiing commented 3 years ago

你有没有比较过不同方法的效果呢,我其实也很困扰

BigPandaCPU commented 3 years ago

你有没有比较过不同方法的效果呢,我其实也很困扰

非常感谢作者的回答,我这边也在实验中。。。

bubbliiiing commented 3 years ago

我确实很好奇,你现在有什么感觉嘛?