利用切片辅助的超级推断进行小目标检测(小物体检测)

大家好,目标检测是计算机视觉中的基本任务,在高层次上,它涉及预测图像中物体的位置和类别。像You-Only-Look-Once(YOLO)系列中的最先进(SOTA)深度学习模型已经达到了令人瞩目的准确度,然而目标检测的一个难点是小物体检测。本文将介绍使用切片辅助的超级推断(SAHI)来检测数据集中的小物体。

1.检测小物体的难点

检测小物体很困难,物体越小,检测模型可用的信息就越少。如果汽车在远处,它可能只占据图像中的几个像素。与人类难以辨认远处物体的情况类似,在没有视觉可辨识特征(如车轮和车牌)的情况下更难识别汽车。

用相关数据进行训练的模型准确率才能得到保障,大多数标准的目标检测数据集和基准都专注于中大型物体,这意味着大多数现成的目标检测模型未经优化用于小物体检测。

目标检测模型通常采用固定尺寸的输入。例如,YOLOv8 是在最大边长为 640 像素的图像上训练的,这意味着将一张大小为 1920x1080 的图像输入时,模型会将图像缩小到 640x360 然后进行预测,降低了小物体的分辨率并丢弃了重要信息。

2. SAHI的工作原理

图片

理论上可以在较大的图像上训练模型以提高小物体的检测能力,然而这将需要更多的内存、更多的计算能力和更加费时费力的数据集创建。与之相反的方法是利用现有的目标检测,将模型应用于图像中固定大小的块或切片,然后将结果拼接在一起。

SAHI 将图像分成完全覆盖它的切片,并对每个切片使用指定的检测模型进行推断。然后将所有这些切片的预测结果合并在一起,生成整个图像上的一个检测列表。SAHI 中的“超级”来自于 SAHI 的输出不是模型推断的结果,而是涉及多个模型推断的计算结果。SAHI 切片允许重叠(如上面的 GIF 所示),这可以确保至少有一个切片中包含足够多的对象以进行检测。

3.SAHI应用于数据集

为了说明如何使用 SAHI 检测小物体,使用中国天津大学机器学习与数据挖掘实验室的AISKYEYE 团队的 VisDrone 检测数据集。该数据集包含 8,629 张图像,边长从 360 像素到 2,000 像素不等,使其成为 SAHI 的理想测试平台。Ultralytics 的 YOLOv8l 将作为基本目标检测模型,使用以下库:

  • fiftyone 用于数据集管理和可视化

  • huggingface_hub 用于从 Hugging Face Hub 加载 VisDrone 数据集

  • ultralytics 用于使用 YOLOv8 进行推断

  • sahi 用于在图像切片上运行推断

如果尚未安装,请安装这些库的最新版本,需要 fiftyone>=0.23.8 来从 Hugging Face Hub 加载 VisDrone:

pip install -U fiftyone sahi ultralytics huggingface_hub --quiet

现在在 Python 进程中,导入将用于查询和管理数据的 FiftyOne 模块:

import fiftyone as fo
import fiftyone.zoo as foz
import fiftyone.utils.huggingface as fouh
from fiftyone import ViewField as F

使用 FiftyOne 的 Hugging Face 工具中的 load_from_hub() 函数直接从 Hugging Face Hub 通过 repo_id 加载 VisDrone 数据集的部分。为了演示并保持代码执行尽可能快,只取数据集的前 100 张图像,将正在创建的新数据集命名为 ”sahi-test“:

图片

4.使用YOLOv8进行推理

使用SAHI对数据进行超级推理,在引入SAHI之前,使用Ultralytics的大型YOLOv8模型进行标准目标检测推理。首先创建一个ultralytics.YOLO模型实例,如果需要的话会下载模型检查点。将这个模型应用到数据集上,并将结果存储在样本的“base_model”字段中:

from ultralytics import YOLO

ckpt_path = "yolov8l.pt"
model = YOLO(ckpt_path)

dataset.apply_model(model, label_field="base_model")
session.view = dataset.view()

图片

通过观察模型的预测和ground truth标签,我们可以看到一些情况。YOLOv8l模型检测到的类与VisDrone数据集

### 使用 Sahi 增强 YOLOv11 模型的方法及实现技巧 Sahi 是一种滑动窗口推理技术,能够显著提升目标检测模型在小目标上的表现。以下是关于如何通过 Sahi 技术来增强 YOLOv11 的性能或功能的具体方法: #### 一、Sahi 工作原理概述 Sahi(Sliding Window Inference)是一种基于滑动窗口的目标检测后处理技术[^3]。其核心思想是将大图划分为多个子区域,在这些子区域内分别执行目标检测任务,最后再将结果合并到原始图像上。这种方法特别适合解决小目标检测中的漏检问题。 对于像 YOLOv11 这样的单阶段目标检测器来说,由于感受野有限以及分辨率缩放的影响,可能无法很好地捕捉到一些非常小的目标对象。而采用 Sahi 可以有效缓解这一缺陷。 #### 二、具体实施步骤 ##### 1. 数据预处理与划分 为了适应滑动窗口机制,需先定义好切片参数,包括但不限于: - **Slice Size**: 切割后的每张图片大小; - **Overlap Ratio (重叠率)**: 控制相邻两块之间相互覆盖的比例;较高的重叠有助于减少边界处物体被截断的风险。 可以通过如下方式配置上述选项并生成片段列表: ```python from sahi.slicing import slice_image slice_height, slice_width = 512, 512 # Slice size overlap_ratio = 0.2 # Overlap ratio between slices slices = [] for image_path in images_paths: result = slice_image( image=image_path, output_folder="output_slices", slice_height=slice_height, slice_width=slice_width, overlap=overlap_ratio * min(slice_height, slice_width), save=True ) slices.extend(result) ``` ##### 2. 单独运行推断过程于各分块之上 利用已训练好的 YOLOv11 权重文件加载模型实例,并针对每一个切割出来的子图单独调用预测函数完成前向传播操作获取候选框集合。 注意这里要确保每次传入网络的数据形状一致以便维持批量标准化层正常运作。 ```python import torch from yolov11.models.experimental import attempt_load device = 'cuda' if torch.cuda.is_available() else 'cpu' model = attempt_load(weights='yolov11.pt', map_location=device) results_per_slice = {} for idx, sliced_img_info in enumerate(slices): img_tensor = preprocess(sliced_img_info['image']) with torch.no_grad(): pred = model(img_tensor.to(device)) results_per_slice[idx] = postprocess(pred.cpu().numpy(), conf_thres=0.25, iou_thres=0.45) ``` ##### 3. 合并来自不同部分的结果 当所有局部视图都经过独立评估之后,则需要把它们重新组合起来形成最终全局视野下的标注成果。此环节涉及坐标转换校正工作——即将局部坐标的边界框映射回原图对应位置上去。 此外还需考虑去除重复标记现象的发生概率较大情况下的非极大抑制(NMS)算法应用。 ```python def merge_results(results_dict, original_shape, slice_params): merged_bboxes = [] for key, value in results_dict.items(): bbox_coords = adjust_coordinates(value["bboxes"], slice_params[key]) scores = value["scores"] labels = value["labels"] for coord, score, label in zip(bbox_coords, scores, labels): merged_bboxes.append([*coord.tolist(), float(score), int(label)]) nms_indices = torchvision.ops.nms(torch.tensor(merged_bboxes)[:,:4],torch.tensor(merged_bboxes)[:,4],iou_threshold=0.5).tolist() final_detections = [merged_bboxes[i] for i in nms_indices] return final_detections final_predictions = merge_results(results_per_slice, orig_image_size, slices_metadata) ``` --- ### 总结说明 借助 Sahi 方法不仅可以改善 YOLOv11 对小型物体识别的能力,而且还能灵活应对各种复杂场景下多尺度变化带来的挑战。然而值得注意的是整个流程增加了额外的时间开销所以应当依据实际情况合理选用该策略[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

python慕遥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值