整体思路
GeneralizedRCNNTransform主要用在图像进入backbone网络前的预处理以及预测结果输出时的后处理两个阶段.主要工作是图像的标准化处理以及resize操作.
函数细节
__init__
__init__
函数主要输入图像的均值和方差,以及resize时图片的最小(大)边长范围
normalize
最后一行通过添加None这个维度可以增加一维维度,再利用广播机制对image的每个像素都进行操作.
resize
这个方法首先调用_resize_image
使用双线性插值调整图片大小,再通过resize_boxes
调整对应的box大小.
_resize_image
根据宽高限制来确定缩放比例,调用interpolate
对图像进行双线性插值,这里在image又添加一个维度,是因为interpolate
方法输入需要是4D图像
resize_boxes
按照缩放比例调整box坐标即可.这里torch.stack()会在tensor最后新增一个维度,这里就是在最后一个维度摞起来
batch_images
这个方法是将一个batch图像中再次resize到统一尺寸,加速训练.这个统一尺寸被调整为size_divisible
的整数倍
具体实现时寻找一个batch中图片的高宽最大值,以此作为最大图像.其他图像跟该图像做左上角对齐,空余位置填充零.
这种方法的好处是保证了图像的比例.
forward
对于每张图片,以此调用normalize
和resize
方法进行标准化和缩放.而在进行batch_images
前,需要记录当前图像尺寸,存入image_sizes_list,最后与image打包成一个list,跟target标注一起返回.
之所以要这么做是因为经过batch_images
后,图像变成统一尺寸,但是图像有效区域在原先的图片大小范围内,所以需要保存batch_resize前的图像大小.
postprocess
这个方法是预测模式下最后的后处理操作.