Open wangruo91 opened 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。
赞同
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。