letterbox介绍
在深度学习中,图像的尺寸对于模型的训练和推理十分重要。为了保持输入图像的纵横比例,避免因缩放导致的失真,通常会对图像进行裁剪或嵌入(padding)操作。其中,letterbox是一种常用的嵌入操作,其主要思想是在图像周围添加黑色边框,使图像的尺寸与模型的期望输入尺寸一致。通过这种方式,输入图像可以被缩放到模型的期望输入大小,而不会破坏图像的纵横比例。因此,letterbox可以有效地提高模型的训练和推理性能,同时保持图像的视觉质量。在训练阶段,letterbox还可以避免因图像尺寸不一致导致的batch样本大小不一致问题。在实际应用中,letterbox通常被用于目标检测、人脸识别等深度学习任务中。
使用python完成letterbox
这段代码是对输入图片进行预处理,具体步骤如下:
1.根据输入图片的通道数,创建一个与模型输入大小相同的空白图片padding_image。
2.计算原图与模型输入大小之间的缩放比例ratio,并将原图按照该比例进行缩放,得到缩放后的图片resized_img。
3.将缩放后的图片resized_img覆盖到空白图片padding_image的左上角位置,并将padding_image按照指定的通道顺序swap进行转置。(变成行优先的连续的内存块)注意,这里的python版本是将裁剪后的图片贴到了背景图的左上角。
4.将转置后的padding_image转换为dtype为float32的numpy数组,并返回该数组和缩放比例ratio。
import numpy as np
import cv2
GRAY = 114
def preproc(img, img_size, swap=(2, 0, 1)):
"""Resize the input image."""
if len(img.shape) == 3:
padding_image = np.ones((img_size[0], img_size[1], 3), dtype=np.uint8) * GRAY
else:
padding_image = np.ones(img_size, dtype=np.uint8) * GRAY
ratio = min(img_size[0] / img.shape[0], img_size[1] / img.shape[1])
resized_img = cv2.resize(
img,
(int(img.shape[1] * ratio), int(img.shape[0] * ratio)),
interpolation=cv2.INTER_LINEAR,
).astype(np.uint8)
padding_image[: int(img.shape[0] * ratio), : int(img