这份代码主要是为了将不同尺度的特征图负责检测不同尺寸大小的物体修改为: 不同尺寸的特征图都用来检测同一个尺寸范围的物体
做上述修改的原因: 读过SSD源码之后发现,SSD中标签数据预处理的过程(end-to-end方式训练网络,将输入标签与输出对齐),只要anchor与ground_truth box的IOU大于阈值,即将该cell的输出标记为 (class\box coordinator),这样在同一个特征图中可以有多个anchor、多个cell同时预测一个物体(个人理解:手臂的位置基本在人体的中间,根据手臂也大致可以预测到人体的位置),即输出多个预测框及score,最后通过nms选出最好的一个;另外,在相邻的特征图上也存在一个物体被多个特征图检测的机会。因此SSD虽然卷积层数比较少,但是检测效果也可以的原因。
修改方案如下: 最初的yolo,9个anchor平均分配给3个featuremap,然后选区iou面积最大的anchor作为预测cell,即三个featuremap中,只有一个featuremap且只有一个cell进行预测,训练回归。相较于SSD,少的可怜。因此才有了修改的想法,只检测一个尺寸的物体。 三个特征图分别处理,在每个特征图的anchor上选IOU最大的,作为prior cell,这样就有3个尺度的特征图进行训练,并且每个训练过程中公用特征提取部分都可被训练到。
而且这份代码很适合这样修改,只需要将训练数据标签过程修改一下即可,在计算loss的部分几乎可以不修改。
一开始也想过修改最后输出的卷积,将3*3修改为5*5或者7*7,后来考虑到感受野问题,即3*3的感受野确实已经可以覆盖到原始图像的轧带部分了,不需要这样处理或者可以后面尝试一下,看看效果。