sahi+yolov8实现图像切片推理


前言

本文记录项目中涉及到了无人机正射图像的推理(通常8000像素*8000像素以上),由于模型推理尺寸是640*640的,如果直接整图送入模型推理,推理效果极差,可以考虑采用多个切片进行分别进行推理,最后合并推理结果的方式。


一、SAHI介绍

在这里插入图片描述
SAHI(Slicing Aided Hyper Inference,切片辅助超推理)是一种专为优化小目标检测设计的通用框架,其核心思想是通过图像切片和分层推理提升检测效果,尤其适用于处理大尺寸图像中的小目标。

切片推理

SAHI通过滑动窗口将原始图像分割为多个重叠的子图(切片),并对每个子图和整张原图分别进行推理。切片后的小目标在子图中占据更大比例,从而增强模型对细节特征的捕捉能力。所有子图的检测结果会与原图的检测结果合并,最终通过非极大值抑制(NMS)过滤重复框,得到全局最优结果。

兼容性设计

SAHI无需修改现有检测器的结构,支持与YOLOv8、YOLOv5、MMDetection等主流框架无缝集成。用户只需加载预训练模型并调用SAHI的接口即可实现推理优化。

二、使用步骤

图像切片

  • 参数配置:需定义切片尺寸(slice_height、slice_width)和重叠率(overlap_height_ratio、overlap_width_ratio)。例如,设置切片为640×640像素,重叠率0.2(即相邻切片重叠20%的区域)。
  • 滑动窗口逻辑:切片时从左上角开始,按行列顺序移动窗口。若图像边缘无法完整切片,则反向调整窗口位置以确保覆盖全图。

推理与结果融合

  • 对每个切片和原图分别进行目标检测,生成候选框。
  • 将所有候选框映射回原图坐标系,合并后通过NMS(如IoU阈值0.45)过滤冗余框。

代码示例

此处选用支持分割的项目进行调试,项目代码地址:https://github.com/sweetlhare/sahi-yolov8-instance-segmentation

新建test.py

from sahi import AutoDetectionModel
from sahi.predict import get_sliced_prediction

# 加载模型
detection_model = AutoDetectionModel.from_pretrained(
    model_type='yolov8',
    model_path='yolov8-seg.pt',
    confidence_threshold=0.45,
    device='cuda:0'
)

# 切片推理
result = get_sliced_prediction(
    'small-vehicles.jpeg',
    detection_model,
    slice_height=640,
    slice_width=640,
    overlap_height_ratio=0.2,
    overlap_width_ratio=0.2
)

# 保存可视化结果
result.export_visuals(export_dir='output/')

结果对比

在这里插入图片描述
此效果为整图推理的效果;
在这里插入图片描述
此图为sahi方式后的推理效果;

可以看出对小目标的检测提升很大。


总结

SAHI可以提高大图中小目标的检测精度,SAHI 的主要优势在于它与模型无关,可以搭配各种模型。但是检测精度的提升是基于切片的多次推理实现的,切片数量与计算时间成正比,需权衡检测精度与实时性要求。

参考文档:
https://github.com/obss/sahi/tree/main
https://github.com/sweetlhare/sahi-yolov8-instance-segmentation
https://blog.csdn.net/demm868/article/details/143160318

如果阅读本文对你有用,欢迎一键三连呀!!!
2025年3月6日14:56:14
在这里插入图片描述

### 如何在 C# 中对 YOLO 模型进行切片推理 为了实现在 C# 中对 YOLO 模型的切片推理,主要依赖于 ONNX Runtime 库来加载并执行 ONNX 格式的 YOLO 模型。通过将大图像分割成较小的部分(即切片),分别对其进行推理后再组合结果,可以有效提高处理效率和准确性。 #### 使用 ONNX Runtime 加载模型 ONNX Runtime 是一个高效的评分引擎,支持多种编程语言,包括 C#。对于 YOLO 模型而言,在将其转换为 ONNX 格式之后,可以通过此库轻松调用模型进行预测[^1]。 ```csharp using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; // 初始化会话选项 var sessionOptions = new SessionOptions(); sessionOptions.ExecutionMode = ExecutionMode.ORT_SEQUENTIAL; // 创建推理会话 InferenceSession inferenceSession = new InferenceSession("yolov5.onnx", sessionOptions); ``` #### 图像预处理与切分逻辑 考虑到YOLO 对输入尺寸有严格的要求,因此需要先调整原始图片大小至适合模型输入的形式,并按照设定好的步长切割成多个子图作为后续推理的基础数据集[^2]。 ```csharp public List<Image> SliceImage(Image original, int sliceSize, int stride) { var slices = new List<Image>(); for (int y = 0; y < original.Height; y += stride) for (int x = 0; x < original.Width; x += stride) if ((x + sliceSize <= original.Width) && (y + sliceSize <= original.Height)) slices.Add(original.Clone(new Rectangle(x, y, sliceSize, sliceSize), original.PixelFormat)); return slices; } ``` #### 执行批量推理过程 针对每一个切片后的子图实例化对应的张量结构喂入模型中完成前向传播计算;收集所有输出后依据坐标偏移还原回原图位置关系以便最终展示或进一步分析使用[^3]. ```csharp foreach(var imgSlice in slicedImages){ // 将每一片转化为合适的Tensor格式供OnnxRuntime使用 Tensor<float> inputTensor = ConvertToTensor(imgSlice); // 准备输入字典 var inputs = new List<NamedOnnxValue> { NamedOnnxValue.CreateFromTensor("input_name", inputTensor) }; using IDisposableReadOnlyCollection<IDisposableDataFrame> results = inferenceSession.Run(inputs); foreach (IDisposableDataFrame result in results) { ProcessResult(result); // 处理单个slice的结果 } } void ProcessResult(IDisposableDataFrame resultFrame) { // 解析resultFrame中的检测框和其他信息... } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

AI小笔记

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

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

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

打赏作者

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

抵扣说明:

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

余额充值