sahi+yolov8实现图像切片推理

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

一、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/')
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
结果对比

此效果为整图推理的效果;

此图为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

如果阅读本文对你有用,欢迎一键三连呀!!!
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/JulyLi2019/article/details/146062570

### YOLOv8 中的切片推理结果拼接 在处理大尺寸图像或提高小目标检测精度时,YOLOv8 支持通过将输入图像切割成多个较小片段来进行分块推理。这种方法不仅有助于提升模型性能,还能有效解决内存限制问题。完成各子图推断后,需采用特定策略将其预测结果重新组合为原始大小。 #### 切片推理流程概述 对于每张待分析的大图片,先按照设定参数(如重叠率、窗口尺寸)对其进行均匀划分得到若干个小区域;接着针对这些局部视窗逐一执行标准的目标识别操作;最后再把所得各类标注信息映射回原坐标系内形成最终输出[^2]。 #### 实现细节说明 为了确保不同区块间过渡自然平滑,并尽可能减少边缘效应带来的干扰,通常会设置一定比例范围内的交集部分以便后续融合处理: - **预处理阶段**:定义好裁剪规则之后,依次读取源文件并截取出相应位置上的矩形块作为新样本送入网络计算; - **核心运算环节**:利用训练好的权重参数快速定位感兴趣物体所在之处及其轮廓特征; - **后置调整过程**:依据实际需求选取合适的算法来消除重复标记项以及修正可能存在的偏差情况。 具体到代码层面的操作如下所示: ```python from ultralytics import YOLO import sahi.slicing as slicing model = YOLO('yolov8n-seg.pt') # 加载用于分割的小型版本YOLOv8模型 # 定义切片配置 slice_params = { "slice_height": 512, "slice_width": 512, "overlap_ratio": 0.25 } image_path = 'path/to/large_image.jpg' slices = slicing.slice_image(image=image_path, slice_params=slice_params) results = [] for idx, img_slice in enumerate(slices): pred_result = model.predict(img_slice.image) # 对每个切片进行预测 # 将预测结果转换至全局坐标系下 adjusted_boxes = adjust_bounding_boxes(pred_result.boxes, slices[idx].start_point) results.append((adjusted_boxes, pred_result.masks)) def merge_results(results_list): """ 合并来自各个切片的结果 """ all_boxes = [] all_masks = [] for boxes, masks in results_list: all_boxes.extend(boxes) all_masks.extend(masks) return non_max_suppression(all_boxes), combine_masks(all_masks) final_boxes, final_mask = merge_results(results) visualize_predictions(final_boxes, final_mask, original_image_size=(height,width)) ``` 上述脚本展示了如何使用 `SAHI` 库配合 YOLOv8 来实施完整的端到端工作流——从加载预训练模型开始直到最后一步绘制出带有边框和遮罩层的效果图为止。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值