背景与目标
实时口罩检测在公共卫生安全领域应用广泛。这里我们基于 DAMO-YOLO 框架,探讨如何让模型更好地适应不同尺寸的输入图像。DAMO-YOLO 在速度和精度之间取得了不错的平衡,特别适合实时场景。
核心需求很明确:无论输入是单人还是多人、横版还是竖版,模型都能准确识别并标注是否佩戴口罩。
模型架构简述
DAMO-YOLO 采用'大脖子小头'的设计思路,由 backbone(MAE-NAS)、neck(GFPN)和 head(ZeroHead)组成。这种结构能有效融合低层空间信息与高层语义信息。
- Backbone:提取图像特征。
- Neck:融合多层特征。
- Head:输出检测结果。
模型主要识别两类状态:
- facemask(类别 ID:1):佩戴口罩。
- no facemask(类别 ID:2):未佩戴口罩。
基础运行流程
服务部署后,前端界面位于 /usr/local/bin/webui.py。首次加载可能需要初始化时间。
基本操作如下:
- 打开 Web 界面。
- 上传含有人脸的图像。
- 点击'开始检测'。
- 查看带框标注的结果。
核心修改:适配自定义尺寸
实际场景中,输入图像尺寸往往不固定。为了提升实用性,我们需要修改 webui.py 以支持动态尺寸处理。
预处理逻辑调整
原始模型可能限制输入尺寸,但通过调整预处理函数,我们可以灵活控制。关键在于保持宽高比,避免图像拉伸变形。
def preprocess_image(image, target_size=(640, 640)):
"""预处理输入图像,调整到目标尺寸
target_size: 期望的输入尺寸,默认为 (640, 640)
"""
original_size = image.shape[:2]
resized_image = cv2.resize(image, target_size)
normalized_image = resized_image / 255.0
return normalized_image, original_size
保持宽高比的填充策略
直接缩放容易导致变形。更好的做法是先计算缩放比例,再填充空白区域。
def resize_with_padding(image, target_size):
"""保持宽高比调整尺寸,不足部分用灰色填充"""
h, w = image.shape[:2]
target_h, target_w = target_size
scale = min(target_h / h, target_w / w)
new_h, new_w = int(h * scale), int(w * scale)
resized = cv2.resize(image, (new_w, new_h))
padded = np.full((target_h, target_w, ), , dtype=np.uint8)
pad_top = (target_h - new_h) //
pad_left = (target_w - new_w) //
padded[pad_top:pad_top+new_h, pad_left:pad_left+new_w] = resized
padded, (scale, pad_top, pad_left)

