Yolo中的:Rectangular training/inference
在YOLO中是下采样往往是成整数倍数的,比如YOLOv3中是下采样32倍,长宽也必须是32的倍数,但是由于有些图片并不符合这个标准,所以数据在进入模型前,数据需要resize到416×416大小,也就是我们所说的仿射变换。
这张图片为长方形,我们在将其送入模型前需要将其resize到要求的尺寸,所以我们需要通过补灰padding来变为正方形的图。
但是这个操作会生成过多的冗余信息影响训练效果。Rectangular training/inference就是去除这些冗余信息。
具体效果如上图,我们先将将较长边设定为目标尺寸416,短边按比例缩放,再对短边进行较少填充使短边满足模型下采样的倍数。
Rectangular training/inference操作共有两种情况:
(一)、图片size的宽高比为P。新图宽高比大于P,则宽resize到目标尺寸,上下padding黑边(如上图所示)。
(二)、如果新图宽高比小于P,则高resize到目标尺寸,左右padding黑边。
具体实现代码如下:
def cv2_letterbox_image(image, expected_size):ih, iw = image.shape[0:2]ew, eh = expected_sizescale = min(eh / ih, ew / iw)nh = int(ih * scale)nw = int(iw * scale)image = cv2.resize(image, (nw, nh), interpolation=cv2.INTER_CUBIC)top = (eh - nh) // 2bottom = eh - nh - topleft = (ew - nw) // 2right = ew - nw - leftnew_img = cv2.copyMakeBorder(image, top, bottom, left, right, cv2.BORDER_CONSTANT)return new_img