SAHI是一个用于大规模目标检测和实例分割的轻量级视觉库
概述
目标检测和实例分割是目前计算机视中最重要的应用领域。然而,在实际应中,小目标的检测和大图像上的推理仍然是主要的问题,SAHI 来帮助开发人员用许多视觉实用工具克服这些现实世界的问题
教程
<1>Introduction to SAHI
Sahi:一种用于大规模对象检测和实例分割的视觉库
github开源:GitHub - obss/sahi: Framework agnostic sliced/tiled inference + interactive ui + error analysis plots
目标检测和实例分割是目前计算机视觉中最重要的应用领域。然而,在实际应用中,小目标的检测和大图像上的推理仍然是主要的问题。
在这里,您可以看到最先进的实例分割模型Cascade MaskRCNN的推理结果:https://github.com/open-mmlab/mmdetection/tree/master/configs/cascade_rcnn#cascade-mask-r-cnn
如图所示,上方较小的汽车不会被检测到。
有没有一种方法,用于检测这些较小的对象,而无需重新训练模型也不需要较大的GPU内存分配?
SAHI(切片辅助超推理)可以帮助开发人员克服这些现实世界的问题
看完这篇文章你就知道了
- 介绍对象检测和实例分割
- SAHI的安装
- 使用SAHI进行切片推理
- 基于SAHI的图像和数据集切片
- 使用SAHI为新的检测框架添加支持
介绍对象检测和实例分割
A)目标检测:
目标检测是指对图像中存在的所有目标进行识别和正确标记的方法。
这大致包括两个步骤
1目标定位:在这里,以尽可能紧的方式确定包围框或包围区域,以确定物体在图像中的确切位置。
2:图像分类:本地化的对象,然后馈送到一个分类器,该分类器标记的对象。
B)语义分割:
它是指将给定图像中的每个像素链接到特定类别标签的过程。例如,在下面的图像中,像素被标记为汽车、树木、行人等。然后使用这些段来查找各种对象之间的相互作用/关系。
C)实例分割:
这里,我们将类标签与每个像素相关联,类似于语义分割,不同之处在于它将同一类的多个对象视为单个对象/单独的实体。
<2>Installation of SAHI
GIF summarizing necessary installation steps for SAHI.
这里直接利用指令pip install -U sahi安装
然后安装torchvision,这里我安装过就不再安装了,若是安装遇到困难,可以参考本人的博文,其中有提到crowdcountingp2p代码复现_追忆苔上雪的博客-CSDN博客
然后安装检测框架,比如mmdetmmdet · PyPI
到这里就可在Python中导入和使用任何SAHI函数
<3>Sliced inference with SAHI
Sliced inference with SAHI CLI.
切片推理的概念基本上是在原始图像的较小切片上执行推理,然后合并原始图像上的切片预测。可以如下图所示:
在这里,我们将在此示例图像上展示一个切片推理演示GitHub - obss/sahi: Framework agnostic sliced/tiled inference + interactive ui + error analysis plots
首先导入教程所需的函数
from sahi import AutoDetectionModel
from sahi.predict import get_sliced_prediction
from sahi.utils.cv import read_image_as_pil
AutoDetectionModel是一个 factory class,支持流行检测框架,它可用于在任何MMDetection模型上加载和执行切片/标准推理
get_sliced_prediction是用于执行切片推理的函数。
然后,我们需要通过定义所需的参数来创建一个DetectionModel实例
detection_model = AutoDetectionModel.from_pretrained(
model_type='mmdet',
model_path=mmdet_cascade_mask_rcnn_model_path,
config_path=mmdet_cascade_mask_rcnn_config_path,
confidence_threshold=0.4,
device="cuda:0"
)
DetectionModel见下图或者开源的代码
model_type可以是‘yolov5’, ‘mmdet’, ‘huggingface’, ‘torchvision’, ‘detectron2’,取决于自己的权重文件
model_path 和 config_path 是成功加载任何模型所必须的
得分低于confidence_threshold的预测将在结果中被忽略。
device参数指定推理设备,可以将其设置为cuda:0或cpu。
读取图片
image = read_image_as_pil(image_dir)
最后,我们可以执行切片预测。在本例中,我们设置重叠率为0.2:
result = get_sliced_prediction(
image,
detection_model,
slice_height = 256,
slice_width = 256,
overlap_height_ratio = 0.2,
overlap_width_ratio = 0.2
)
可视化原始图像上的预测边界框和masks
result.export_visuals(export_dir="result/")
Image("result/prediction_visual.png")
可以下述链接中完成细节https://colab.research.google.com/github/obss/sahi/blob/main/demo/inference_for_mmdetection.ipynb
https://colab.research.google.com/github/obss/sahi/blob/main/demo/inference_for_yolov5.ipynb
基于SAHI的图像和数据集切片
可以独立地使用SAHI(GitHub - obss/sahi: Framework agnostic sliced/tiled inference + interactive ui + error analysis plots)的切片操作。
例如,可以将单个图像切片为
from sahi.slicing import slice_image
slice_image_result, num_total_invalid_segmentation = slice_image(
image=image_path,
output_file_name=output_file_name,
output_dir=output_dir,
slice_height=256,
slice_width=256,
overlap_height_ratio=0.2,
overlap_width_ratio=0.2,
)
或者,可以从任何coco格式的数据集创建切片的coco数据集,如下所示
from sahi.slicing import slice_coco
coco_dict, coco_path = slice_coco(
coco_annotation_file_path=coco_annotation_file_path,
image_dir=image_dir,
slice_height=256,
slice_width=256,
overlap_height_ratio=0.2,
overlap_width_ratio=0.2,
)
与SAHI的命令行接口
sahi predict cli command
使用权重路径对 YOLOv5 模型进行推理:
sahi predict --source image_dir/ --model_type yolov5
--model_path yolov5s.pt --slice_height 512 --slice_width 512
使用权重路径和配置路径为 MMDetection 和 Detectron2 模型执行推理
sahi predict --source image_dir/ --model_type detectron2 --model_path weight.pt
--config_path config.yaml --slice_height 512 --slice_width 512
误差分析图/指标
使用COCO格式的数据集创建COCO格式的预测结果
Gif showing COCO formatted dataset prediction capabilities of SAHI.
sahi predict --source image_dir/ --dataset_json_path dataset.json --model_type yolov5
--model_path weight.pt --no_sliced_prediction
使用已创建的result.json创建错误分析图:
Gif showing error analysis capabilities of SAHI.
sahi coco analyse --dataset_json_path dataset.json --result_json_path result.json
指标的含义:
C75: IOU阈值为0.75时的结果
C50: IOU阈值为0.50时的结果
Loc: 忽略定位错误后的结果
Sim: 忽略超类别误报后的结果
Oth: 忽略所有类别混淆后的结果
BG: 忽略所有误报后的结果
FN: 忽略所有假阴性后的结果
模型可能有改进的部分
C75-C50 and C50-Loc=更准确的边界框预测可能带来的收益
Loc-Sim=修正超类别混淆后的潜在收益
Loc-Oth=修正类别混淆后的潜在收益
Oth-BG=修正所有误报后的潜在收益
BG-FN=修正所有假阴性后的潜在收益
交互式可视化
安装fiftyone库:
pip install -U fiftyone
利用预测结果启动一个fiftyone 网络应用程序
Gif showing interactive visualization capabilities of SAHI.
sahi coco fiftyone --dataset_json_path dataset.json --image_dir image_dir/ result.json
使用SAHI为新的检测框架添加支持
SAHI(GitHub - obss/sahi: Framework agnostic sliced/tiled inference + interactive ui + error analysis plots)框架目前支持YOLOv5(GitHub - ultralytics/yolov5: YOLOv5 🚀 in PyTorch > ONNX > CoreML > TFLite),所有MMDetection模型(GitHub - open-mmlab/mmdetection at master),HuggingFace 目标检测模型 (https://huggingface.co/models?pipeline_tag=object-detection&sort=downloads),所有Detectron2模型,此外还能轻松加到其他新的框架上
需要做的就是在sahi/models/文件夹路径下(https://github.com/obss/sahi/tree/main/sahi/models)创建 一个新的.py文件然后在.py文件下创建一个继承来自 DetectionModel class(https://github.com/obss/sahi/blob/7e48bdb6afda26f977b763abdd7d8c9c170636bd/sahi/models/base.py#L12)的类,可以将YOLOv5 wrapper (https://github.com/obss/sahi/blob/7e48bdb6afda26f977b763abdd7d8c9c170636bd/sahi/models/yolov5.py#L17)作为一个参考