资源分享 | SAHI:超大图片中对小目标检测的切片辅助超推理库

前言 

本文介绍了一个用于超大图片中对小目标检测的切片辅助超推理库SAHI。该库可直接用于现有的网络,而不需要重新设计和训练模型,使用十分方便。

Github: https://github.com/obss/sahi

目标检测和实例分割是迄今为止计算机视觉中最重要的应用领域。然而,小物体的检测和大图像的推理仍然是实际使用中的主要问题。

下面是实例分割SOTA模型Cascade Mask RCNN的推理结果:

图片

MMDetection Cascade Mask RCNN 模型的标准推理结果。

如图所示,未检测到上侧的小型汽车。

有没有办法在不重新训练模型并且不需要更大的 GPU 内存分配的情况下检测这些较小的对象?

本文将介绍SAHI(Slicing Aided Hyper Inference),帮助开发人员克服这些现实世界的问题。

本文目录

  • 目标检测和实例分割简介、

  • SAHI的安装、

  • 使用SAHI 进行切片推理、

  • 使用SAHI 进行图像和数据集切片、

  • 使用SAHI添加对新检测框架的支持

目标检测和实例分割简介


A) 目标检测:目标检测是指识别和正确标记图像帧中存在的所有物体的方法。

图片

目标检测可视化。

这大致包括两个步骤:

1:目标定位:在这里,以尽可能紧密的方式确定边界框或封闭区域,以便定位图像中目标的准确位置。

2:图像分类:然后将定位的目标送到标记目标的分类器。

图片

B) 语义分割:它是指将给定图像中的每个像素链接到特定类标签的过程。例如,在下图中,像素被标记为汽车、树木、行人等。然后使用这些段来查找各种对象之间的交互/关系。

图片

语义分割可视化

C ) Instance Segmentation:在这里,我们将类标签与每个像素关联起来,类似于语义分割,不同之处在于它将同一类的多个对象视为单个对象/单独的实体。

图片

实例分割可视化

SAHI的安装


SAHI的项目地址:https://github.com/obss/sahi

1. 通过 pip 安装最新版本:

pip install sahi

2. 通过conda

conda install sahi -c obss

现在可以在 Python 中导入和使用任何SAHI函数:

from sahi import get_sliced_prediction

使用SAHI 进行切片推理


切片推理的概念基本上是;对原始图像的较小切片执行推理,然后合并原始图像上的切片预测。可以用下图表示:

图片

切片推理

图片

通过执行切片推理而不是标准推理,可以更准确地检测较小的对象

在这里,我们将使用SAHI在此示例图像上展示切片推理演示:

图片

用于推理演示的示例图像

首先导入教程所需的函数:

from sahi .model import MmdetDetectionModel 
from sahi .utils.cv import read_image,visualize_object_predictions 
from sahi .predict import get_sliced_prediction

MmDetectionModel是流行的MMDetection 框架的包装类。它可用于在任何MMDetection 模型上加载和执行切片/标准推理。

read_image是一个实用函数,用于将任何图像转换为 RGB numpy 数组。

get_sliced_prediction是执行切片推理的函数。

visualize_object_predictions是用于可视化SAHI预测结果的实用函数。

然后,我们需要通过定义所需的参数来创建一个DetectionModel实例:

detection_model = MmdetDetectionModel(
    model_path=mmdet_cascade_mask_rcnn_model_path,
    config_path=mmdet_cascade_mask_rcnn_config_path,
    prediction_score_threshold=0.4,
    device="cuda"
)

需要 model_path和config_path才能成功加载任何模型。

结果中将忽略分数低于predict_score_threshold 的预测。

device参数指定推理设备,可以设置为cuda或cpu。

加载图像:

image = read_image(image_dir)

最后,我们可以执行切片预测。在本例中,我们将在重叠率为 0.2 的 256x256 切片上执行预测:

result = get_sliced_prediction(
    image,
    detection_model,
    slice_height = 256,
    slice_width = 256,
    overlap_height_ratio = 0.2,
    overlap_width_ratio = 0.2
)
 

在原始图像上可视化预

SAHI是一种切片辅助推理框架,旨在帮助开发人员解决现实世界目标检测问题。它通过将图像分成多个切片来提高检测性能,从而克服了现实世界的一些问题,例如目标尺寸变化,目标遮挡和目标密度变化等。SAHI的核心思想是将图像分成多个切片,然后对每个切片进行单独的检测,最后将检测结果合并起来得到最终的检测结果。这种方法可以提高检测性能,特别是对于小目标的检测效果更好。 下面是一个使用SAHI进行目标检测的Python代码示例: ```python import cv2 import numpy as np # 加载图像 img = cv2.imread('test.jpg') # 定义切片大小 slice_size = 512 # 获取图像大小 height, width, _ = img.shape # 计算切片数量 num_slices_h = int(np.ceil(height / slice_size)) num_slices_w = int(np.ceil(width / slice_size)) # 定义检测器 detector = cv2.dnn.readNetFromCaffe('deploy.prototxt', 'model.caffemodel') # 定义类别标签 class_labels = ['person', 'car', 'truck', 'bus'] # 定义检测结果列表 results = [] # 循环遍历每个切片 for i in range(num_slices_h): for j in range(num_slices_w): # 计算切片的坐标 x1 = j * slice_size y1 = i * slice_size x2 = min(x1 + slice_size, width) y2 = min(y1 + slice_size, height) # 提取切片 slice_img = img[y1:y2, x1:x2] # 构建输入blob blob = cv2.dnn.blobFromImage(slice_img, 1.0, (300, 300), (104.0, 177.0, 123.0)) # 进行检测 detector.setInput(blob) detections = detector.forward() # 解析检测结果 for k in range(detections.shape[2]): confidence = detections[0, 0, k, 2] class_id = int(detections[0, 0, k, 1]) # 如果置信度大于0.5,则将检测结果添加到列表 if confidence > 0.5 and class_labels[class_id] == 'person': x = int(detections[0, 0, k, 3] * slice_size) + x1 y = int(detections[0, 0, k, 4] * slice_size) + y1 w = int(detections[0, 0, k, 5] * slice_size) - x h = int(detections[0, 0, k, 6] * slice_size) - y results.append((x, y, w, h)) # 在原始图像上绘制检测结果 for (x, y, w, h) in results: cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2) # 显示结果 cv2.imshow('result', img) cv2.waitKey(0) cv2.destroyAllWindows() ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值