在常用的目标检测算法中,输入图像的分辨率大小不一,常用的方式是将输入图像的分辨率归一化为统一的图像分辨率,然后再喂给目标检测网络。
若设置喂给目标检测网络输入图像的分辨率为:416 * 416
目标检测算法训练阶段和推理阶段resize输入图像为416 * 416,
例如原始输入图像为1280 * 720:
Square training 和 Inference
原始输入图像宽高比:720/1280 = 0.5625
以长边为基准,缩放比例分别为:1,0.5625
等比例缩放后的分辨率为:416 ,234
Square training 和 Inference阶段对等比例缩放后的分辨率进行pading:左右两列的列表分别pad = (416-234)/ 2 = 91,padding后的图像为:
可以看到,上面的图片中存在大量的冗余部分,一个很自然的想法就是,能不能去掉这些填充的部分但是又要满足长宽是32的倍数?这样的话,训练和推理速度都会快一些,而且显存开销也会小一点。
Rectangular training 和 inference
原始输入图像缩放后的分辨率(设定为32的倍数)为:(np.ceil(1*416/32)*32 ,np.ceil(0.5625*416/32 )*32) = (416,256)
原始图像等比例缩放后的分辨率为:(416,234)
分别对等比例缩放后的图像进行行列padding:
行pad = (416- 416)/2 =0 , 列pad = (256- 234)/2 = 11
因此Rectangular training 和 inference阶段padding后的图像分辨率为:
Rectangular 训练阶段和推理阶段pading的像素值为(114,114,114)灰色像素或(0,0,0)黑色像素。
但是Rectangular training的时候,一般取这个batch中的最大的长和宽,然后图片都填充到这个max width和max height。但是这样显然还是比较浪费的,因为如果一个batch中的不同图片wh差距很大,小图片就太吃亏了啊。但是如果训练的图片尺寸都是相同的或者相近的,那这个就有很大优势了。
U版YOLOv3和YOLOv5实现主要就是优化了一下如何将比例相近的图片放在一个batch,这样显然填充的就更少一些了,训练起来也就快了一些。