首先,YOLOV5的输入shape为[640, 640],一张图片的大小。当我们通过backbone之后得到的tensor为
[batch_size, 3, 20, 20, 15],其中[20, 20]是一个feature_map的大小,也就是[640, 640]缩小了32倍,一个特征点实际的感受野是原始图片的32*32。
其次,3为先验框的数量,也就说[20, 20]每个特征点,围绕着这个特征点都有3个先验框。
最后15是当然就是channel数量了,每一个channel都有不同的信息:
1、channel_1,[20, 20]一共400个值,每个值代表对应位置特征点的x轴信息;
2、channel_2,[20, 20]一共400个值,对应着y轴的信息。
3、channel_3,x轴方向缩放倍数;
4、channel_4,y轴方向缩放倍数;
5、channel_5,[20, 20]对应位置是否有物体,比如[2, 3],第二行第三列这个特征点如果值为1,也就是在feature_map的第二行,第三列判断有一个物体,折回到原始图片就是[64, 96]这个点的周围有一个目标,其目标的大小还需要由channel_3和_4的锚框缩放倍数来确定。
也就说一个epoch中的一张图片,每个像素点都要计算3个先验框,来小幅度修改先验框的大小,和x、y轴方向的小浮动移动,比如特征点[1, 1]这个位置会移动到[1.5, 1.5],他不会移动到[2, 2]这个特征点。也就说每个特征点的管辖范围都是半个特征点,对应原始图片的位置就是32+16这个位置。