YunYang1994 / tensorflow-yolov3

🔥 TensorFlow Code for technical report: "YOLOv3: An Incremental Improvement"
https://yunyang1994.gitee.io/2018/12/28/YOLOv3-算法的一点理解/
MIT License
3.63k stars 1.36k forks source link

提一个bug,固定的一组anchors用于多尺度训练存在不严谨。 #607

Open wangruo91 opened 3 years ago

wangruo91 commented 3 years ago

1,在core/config.py:line41中,指定了一组size,训练时会随机从中选取某个尺寸作为输入图片预处理得到的输入tensor的shape。 __C.TRAIN.INPUT_SIZE = [320, 352, 384, 416, 448, 480, 512, 544, 576, 608]

2,anchors/coco_anchors.txt中值是原始聚类结果,分三个head,依次除以8、16、32得到 anchors/basline_anchors.txt 中的结果。这里的8、16、32是head的w和h相比输入的缩小比例,作者定义为strides。

3,在core/yolov3.py中head部分,即decode逻辑,line123如下, pred_wh = (tf.exp(conv_raw_dwdh) anchors) stride 这里的anchors*stride及恢复了原始聚类结果。

然后问题来了,我们通过聚类得到anchors,其单位是依赖与模型的输入shape的,也就是说,输入shape为608608还是416416,聚类得到的原始anchors是不一样的,依次除以相同的8、16、32倍后得到的作者定义的anchors也是不同的。如果固定anchors而不固定输入的shape,就会存在实际候选的anchors不是相应输入shape下最合理的anchors的情况。举个极端的例子,某个anchor尺寸乘回stride后,如其宽度为500,这在608尺寸下是合理的,在320尺寸下直接超过画面尺寸的情况,这显然是不合理的。虽然训练不会出现太大的问题,但是与我们通过聚类得到合适的anchors以使训练简化这一目标有点不match。

lulu-Lucas commented 3 years ago

赞同