CV — 目标检测:letterbox
一、相关概念
-
letterbox:
-
概念:
在大多数目标检测算法中,由于 卷积核为方形(不排除卷积核有矩形的情况),所以模型输入图片的尺寸也需要为方形。然而大多数数据集的图片基本上为 矩形,直接将图片 resize 到正方形,会导致图片失真,比如细长图片中的物体会变畸形。
letterbox操作:在对图片进行resize时,保持原图的长宽比进行等比例缩放,当长边 resize 到需要的长度时,短边剩下的部分采用灰色填充。
-
补充点:
- 在目标检测领域,对数据集图片进行了 letterbox 操作,同时标注框也需要进行 letterbox 操作。
-
相关算法:
在 yolo,ssd 等算法的图片预处理过程中,皆使用了 letterbox 处理。
-
二、代码实现
(一) python代码
-
样例说明:
-
直接 resize:
我们从下图观察,左侧为原图,右侧为直接 resize 之后的图片,明显感觉右侧图片汽车形变失真了
-
letterbox 操作:
右侧图图,我们在进行 resize 时保持了原图的长度比,上下部分不足的部分采用灰色进行填充。
同时左侧绿色的 标注框 是在原图尺寸下,右侧蓝色是 letterbox 之后的标注框,标注框的坐标也要跟着变换。
-
-
完整代码:
#!/usr/bin/env python # encoding: utf-8 ''' @Author : pentiumCM @Email : 842679178@qq.com @Software: PyCharm @File : util.py @Time : 2021/7/17 1:58 @desc : 目标检测工具类 ''' import cv2 import torch import numpy as np def letterbox_image(image_src, dst_size, pad_color=(114, 114, 114)): """ 缩放图片,保持长宽比。 :param image_src: 原图(numpy) :param dst_size: (h,w) :param pad_color: 填充颜色,默认是灰色 :return: """ src_h, src_w = image_src.shape[:2] dst_h, dst_w = dst_size scale = min(dst_h / src_h, dst_w / src_w) pad_h, pad_w = int(round(src_h * scale)), int(round(src_w * scale)) if image_src.shape[0:2] != (pad_w, pad_h): image_dst = cv2.resize(image_src, (pad_w, pad_h), interpolation=cv2.INTER_LINEAR) else: image_dst = image_src top = int((dst_h - pad_h) / 2) down = int((dst_h - pad_h + 1) / 2) left = int((dst_w - pad_w) / 2

本文介绍了Letterbox技术在目标检测中的应用,它用于解决图片resize时保持长宽比的问题,避免图像失真。在Yolo、SSD等算法中,Letterbox用于图片预处理,同时对标注框进行相应变换。文中还提供了Python代码示例,展示Letterbox操作的过程及标注框坐标的变化。

1942

被折叠的 条评论
为什么被折叠?



