YOLO-Patch-Based-Inference

YOLO-Patch-Based-Inference

补丁式推理优化小物体检测和实例分割

这个Python库实现了基于补丁的推理方法,用于改进小物体检测和实例分割。它支持多种Ultralytics模型,包括YOLOv8/v9/v10、FastSAM和RTDETR,可用于对象检测和实例分割任务。库提供了推理结果可视化功能,并通过优化的补丁处理和结果合并提高了小物体检测准确性。项目还包含交互式笔记本和教程,方便用户学习和使用。

YOLO深度学习实例分割目标检测计算机视觉Github开源项目

YOLO基于图像块的推理

这个Python库简化了类似SAHI的实例分割任务推理,使得能够检测图像中的小物体。它适用于目标检测和实例分割任务,支持多种Ultralytics模型。

该库还为所有模型的推理结果可视化提供了优雅的定制,包括标准方法(直接网络运行)和独特的基于图像块的变体。

模型支持: 该库支持多种ultralytics深度学习模型,如YOLOv8、YOLOv8-seg、YOLOv9、YOLOv9-seg、YOLOv10、FastSAM和RTDETR。用户可以选择预训练选项或使用自定义训练的模型来最好地满足他们的任务需求。

基于图像块推理的工作原理解释:

<p align="center"> <img width="625" alt="patched_inf_explanation" src="https://yellow-cdn.veclightyear.com/0a4dffa0/f4c91f36-596d-4438-aa72-2868b15c364e.gif"> </p>

安装

你可以通过pip安装该库:

pip install patched_yolo_infer

PyPI版本 - 点击此处访问patched-yolo-infer的PyPI页面。

注意:如果有CUDA支持,建议在安装该库之前先安装支持CUDA的PyTorch。否则,默认将安装CPU版本。


交互式笔记本

提供了交互式笔记本来展示该库的功能。这些笔记本涵盖了检测、实例分割、自定义推理可视化等的批量推理程序。每个笔记本都配有YouTube上的教程,方便学习和实现功能。

主题笔记本YouTube
[基于图像块推理示例][nb_example1][![在Colab中打开][colab_badge]][colab_ex1]<div align="center">[<img width=30% alt="Youtube视频" src=https://raw.githubusercontent.com/ultralytics/assets/main/social/logo-social-youtube-rect.png>][yt_link1]
[常规推理结果自定义可视化示例][nb_example2][![在Colab中打开][colab_badge]][colab_ex2]<div align="center">[<img width=30% alt="Youtube视频" src=https://raw.githubusercontent.com/ultralytics/assets/main/social/logo-social-youtube-rect.png>][yt_link2]

对于俄罗斯用户,有一个详细的项目视频演示。俄语YouTube视频可在此链接获得。


示例:

检测示例:

<img src="https://yellow-cdn.veclightyear.com/0a4dffa0/2ac3ffb7-2cb4-4e0f-a858-164b25b674b9.gif" alt="检测" width="800">

实例分割示例 1:

<img src="https://yellow-cdn.veclightyear.com/0a4dffa0/60600f66-b19c-4318-91cf-1a07b306a581.gif" alt="分割" width="800">

实例分割示例 2:

<img src="https://yellow-cdn.veclightyear.com/0a4dffa0/5ddef8c0-5c62-4202-8325-284c9af57bf9.gif" alt="分割" width="800">

使用方法

1. 基于图像块的推理

要使用我们的库进行YOLO模型的基于图像块的推理,你需要遵循一个顺序过程。首先,创建一个MakeCropsDetectThem类的实例,提供所有与YOLO推理和图像块分割原理相关的所需参数。<br/>随后,将这个类的对象传递给CombineDetections,它促进了来自每个重叠图像块的所有预测的合并,然后智能地抑制重复项。<br/>完成后,你会得到结果,从中可以提取所需的帧处理结果。

从这个过程中获得的输出包含几个可以用于进一步分析或可视化的属性:

  1. img: 此属性包含进行推理的原始图像。它为检测到的对象提供了上下文。

  2. confidences: 此属性保存与每个检测到的对象相关的置信度分数。这些分数表示模型对其预测准确性的信心水平。

  3. boxes: 这些边界框表示为列表的列表,其中每个列表包含四个值:[x_min, y_min, x_max, y_max]。这些值对应于每个边界框左上角和右下角的坐标。

  4. polygons: 如果可用,此属性提供一个包含NumPy数组的列表,这些数组是对应于检测到的对象的分割掩码的多边形坐标。这些多边形可用于准确勾勒每个对象的边界。

  5. classes_ids: 此属性包含分配给每个检测到的对象的类别ID。这些ID对应于模型训练阶段定义的特定对象类别。

  6. classes_names: 这些是与类别ID相对应的人类可读名称。它们为检测到的对象提供语义标签,使结果更容易解释。

import cv2 from patched_yolo_infer import MakeCropsDetectThem, CombineDetections # 加载图像 img_path = "test_image.jpg" img = cv2.imread(img_path) element_crops = MakeCropsDetectThem( image=img, model_path="yolov8m.pt", segment=False, shape_x=640, shape_y=640, overlap_x=50, overlap_y=50, conf=0.5, iou=0.7, ) result = CombineDetections(element_crops, nms_threshold=0.25) # 最终结果: img=result.image confidences=result.filtered_confidences boxes=result.filtered_boxes polygons=result.filtered_polygons classes_ids=result.filtered_classes_id classes_names=result.filtered_classes_names

可能的输入参数说明:

MakeCropsDetectThem 实现裁剪和将裁剪后的图像传递给神经网络进行检测/分割的类:

参数类型默认值描述
imagenp.ndarrayBGR格式的输入图像。
model_pathstr"yolov8m.pt"YOLO模型的路径。
modelultralytics modelNone预初始化的模型对象。如果提供,将直接使用该模型,而不是从model_path加载。
imgszint640YOLO推理的输入图像大小。
conffloat0.5YOLO检测的置信度阈值。
ioufloat0.7单个裁剪图像YOLOv8非极大值抑制的IoU阈值。
classes_listList[int] or NoneNone用于过滤检测结果的类别列表。如果为None,则考虑所有类别。
segmentboolFalse是否执行分割(如果模型支持)。
shape_xint700x坐标上的裁剪大小。
shape_yint600y坐标上的裁剪大小。
overlap_xfloat25x轴上的重叠百分比。
overlap_yfloat25y轴上的重叠百分比。
show_cropsboolFalse是否可视化裁剪过程。
resize_initial_sizeboolTrue是否将结果调整回原始输入图像大小(注:操作较慢)。
memory_optimizeboolTrue分割的内存优化选项(启用时结果精度较低)。
inference_extra_argsdictNone包含额外ultralytics 推理参数的字典(可能的键:half, device, max_det, augment, agnostic_nms 和 retina_masks)
batch_inferenceboolFalse通过神经网络对图像裁剪进行批量推理,而不是顺序传递裁剪(注:推理更快,但GPU内存使用更高)。

CombineDetections 实现合并多个裁剪的掩码/边界框并进行NMS(非极大值抑制)的类:

参数类型默认值描述
element_cropsMakeCropsDetectThem包含裁剪信息的对象。
nms_thresholdfloat0.3非极大值抑制的IoU/IoS阈值。值越小,抑制后保留的对象越少。
match_metricstrIOS匹配度量,可选'IOU'或'IOS'。
class_agnostic_nmsboolTrue决定目标检测中的NMS模式。当设为True时,NMS跨所有类别操作,忽略类别区别,全局抑制置信度较低的边界框。否则,NMS将分别应用于每个类别。
intelligent_sorterboolTrue启用按面积和四舍五入的置信度参数排序。如果为False,则仅按置信度排序(常规NMS)。
sorter_binsint5intelligent_sorter使用的分箱数。分箱数越少,NMS更依赖于对象大小而非置信度分数。

2. 自定义推理结果可视化:

在图像上可视化基于分块的目标检测或分割结果。
visualize_results 函数的可能参数:

参数类型默认值描述
imgnumpy.ndarrayBGR格式的输入图像。
boxeslist边界框列表,格式为[x_min, y_min, x_max, y_max]。
classes_idslist每个检测结果的类别ID列表。
confidenceslist[]对应每个边界框的置信度分数列表。
classes_nameslist[]对应类别ID的类别名称列表。
polygonslist[]包含表示分割掩码的多边形坐标NumPy数组的列表。
maskslist[]分割二值掩码列表。
segmentboolFalse是否执行实例分割可视化。
show_boxesboolTrue是否显示边界框。
show_classboolTrue是否显示类别标签。
fill_maskboolFalse是否用颜色填充分割区域。
alphafloat0.3填充掩码的透明度。
color_class_backgroundtuple(0, 0, 255)类别标签的背景BGR颜色。
color_class_texttuple(255, 255, 255)类别标签的文本颜色。
thicknessint4边界框和文本的粗细。
fontcv2.fontcv2.FONT_HERSHEY_SIMPLEX类别标签的字体类型。
font_scalefloat1.5字体大小的缩放因子。
delta_colorsintseed=0颜色变化的随机种子偏移。
dpiint150最终可视化大小(dpi越高,绘图越大)。
random_object_colorsboolFalse如果为真,每个对象的颜色将随机选择。
show_confidencesboolFalse如果为真且show_class=True,将在类别旁显示置信度。
axis_offboolTrue如果为真,最终可视化中将关闭坐标轴。
show_classes_listlist[]如果为空,可视化所有类别。否则,只可视化列表中的类别。
list_of_class_colorslistNone表示每个类别BGR格式颜色的元组列表。如果提供,将使用这些颜色显示类别,而不是随机颜色。
return_image_arrayboolFalse如果为True,函数将返回图像(BGR np.array)而不是显示它。

使用示例:

from patched_yolo_infer import visualize_results # 假设result是CombineDetections类的一个实例 result = CombineDetections(...) # 使用visualize_results函数可视化结果 visualize_results( img=result.image, confidences=result.filtered_confidences, boxes=result.filtered_boxes, polygons=result.filtered_polygons, classes_ids=result.filtered_classes_id, classes_names=result.filtered_classes_names, segment=False, )

获得最佳基于补丁推理结果的技巧

  1. 最佳裁剪大小和重叠: 要确保高质量的结果,需要仔细选择裁剪(补丁)的大小和它们的重叠程度。建议不要创建过多的裁剪,并将重叠设置在15%到40%之间。

  2. 可视化裁剪: 要查看生成的裁剪,在初始化MakeCropsDetectThem元素时设置show_crops=True。这将显示补丁数量和一张图像,展示基于您初始化的参数(shape_xshape_yoverlap_xoverlap_y)这些补丁的样子。

  3. 裁剪大小考虑: 每个裁剪的大小必须超过图像中预期检测的最大物体的大小。否则,可能无法检测到该物体。

  4. 增强补丁内检测: 要在单个裁剪中检测更多物体,增加imgsz参数并降低置信度阈值(conf)。所有可用于配置Ultralytics模型推理的参数在初始化MakeCropsDetectThem元素时也可访问。

  5. 处理重复抑制问题: 如果遇到重叠补丁的重复抑制问题,考虑调整CombineDetections中的nms_thresholdsorter_bins参数,或修改补丁本身的重叠和大小参数。(注:通常将sorter_bins降低到4或2可能会有帮助)。

  6. 处理多类检测问题: 如果您正在进行多类检测或实例分割任务,将CombineDetections参数中的模式切换为class_agnostic_nms=False可能会有帮助。默认模式(class_agnostic_nms设为True)在处理预训练YOLO网络中大量密切相关的类别时特别有效(例如,经常混淆"汽车"和"卡车"类别)。如果在您的场景中,一个类别的物体可以物理上位于另一个类别的物体内部,那么对于这种情况,您绝对应该设置class_agnostic_nms=False

  7. 高质量实例分割: 对于需要高质量实例分割结果的任务,在README的下一节提供了详细指导。


如何提高实例分割任务的算法质量:

在这种方法中,底层的所有操作都是在已识别对象的二进制掩码上进行的。存储这些掩码会消耗大量内存,因此这种方法需要更多的RAM和略微更长的处理时间。然而,识别的准确性显著提高,这在存在许多不同大小的密集排列对象的情况下尤为明显。因此,如果准确性比速度更重要,且您的计算资源允许在RAM中存储数百个二进制掩码,我们建议在生产环境中使用这种方法。

使用该函数的方法差异在于在MakeCropsDetectThem类中指定参数memory_optimize=False。 在这种情况下,处理后的信息值将是以下内容:

  1. img:此属性包含执行推理的原始图像。它为检测到的对象提供上下文。

  2. confidences:此属性包含与每个检测到的对象相关的置信度分数。这些分数表示模型对其预测准确性的信心水平。

  3. boxes:这些边界框表示为列表的列表,其中每个列表包含四个值:[x_min, y_min, x_max, y_max]。这些值对应于每个边界框左上角和右下角的坐标。

  4. masks:此属性提供与检测到的对象相对应的分割二进制掩码。这些掩码可用于精确描绘对象边界。

  5. classes_ids:此属性包含分配给每个检测到的对象的类别ID。这些ID对应于模型训练阶段定义的特定对象类别。

  6. classes_names:这些是与类别ID对应的人类可读名称。它们为检测到的对象提供语义标签,使结果更易于理解。

以下是获取这些信息的方法:

img=result.image confidences=result.filtered_confidences boxes=result.filtered_boxes masks=result.filtered_masks classes_ids=result.filtered_classes_id classes_names=result.filtered_classes_names

在Google Colab笔记本中提供了使用此模式的示例 - [![Open In Colab][colab_badge]][colab_ex1_memory_optimize]


如何自动确定patches(裁剪)的最佳参数:

要高效处理大量不同大小和内容的图像,手动选择最佳的patch大小和重叠可能很困难。为解决这个问题,开发了一种算法来自动计算patches(裁剪)的最佳参数。

auto_calculate_crop_values函数有两种运行模式:

  1. 基于分辨率的分析:此模式评估源图像的分辨率来确定最佳的patch大小和重叠。它更快,但可能不会产生最高质量的结果,因为它不考虑图像中实际存在的对象。

  2. 基于神经网络的分析:这种高级模式使用神经网络来分析图像。算法在整个图像上执行标准的网络推理,并识别最大的检测对象。基于这些对象的大小,算法选择patch参数,以确保最大的对象完全包含在一个patch内,而重叠的patches确保全面覆盖。在这种模式下,需要输入将在后续步骤中用于基于patch的推理的模型。

auto_calculate_crop_values函数的可能参数:

参数类型默认值描述
imagenp.ndarrayBGR格式的输入图像。
modestr"network_based"要执行的分析类型。可以是"resolution_based"(基于分辨率的分析)或"network_based"(基于神经网络的分析)。
modelultralytics modelYOLO("yolov8m.pt")"network_based"模式下的预初始化模型对象。如果未提供,将使用默认的YOLOv8m模型。
classes_listlistNone在"network_based"模式下要考虑的类别索引列表。如果为None,将考虑所有类别。
conffloat0.25"network_based"模式下的检测置信度阈值。

使用示例:

import cv2 from ultralytics import YOLO from patched_yolo_infer import auto_calculate_crop_values # 加载图像 img_path = "test_image.jpg" img = cv2.imread(img_path) # 计算图像的最佳裁剪大小和重叠 shape_x, shape_y, overlap_x, overlap_y = auto_calculate_crop_values( image=img, mode="network_based", model=YOLO("yolov8m.pt") )

在Google Colab笔记本中提供了使用auto_calculate_crop_values的示例 - [![Open In Colab][colab_badge]][colab_ex1_auto_calculate_crop_values] [nb_example1]: https://nbviewer.org/github/Koldim2001/YOLO-Patch-Based-Inference/blob/main/examples/example_patch_based_inference.ipynb [colab_badge]: https://colab.research.google.com/assets/colab-badge.svg [colab_ex1]: https://colab.research.google.com/drive/1XCpIYLMFEmGSO0XCOkSD7CcD9SFHSJPA?usp=sharing [yt_link1]: https://www.youtube.com/watch?v=kMfzWd8GK5Y [nb_example2]: https://nbviewer.org/github/Koldim2001/YOLO-Patch-Based-Inference/blob/main/examples/example_extra_functions.ipynb [colab_ex2]: https://colab.research.google.com/drive/1eM4o1e0AUQrS1mLDpcgK9HKInWEvnaMn?usp=sharing [yt_link2]: https://www.youtube.com/watch?v=nBQuWa63188 [colab_ex1_memory_optimize]: https://colab.research.google.com/drive/1XCpIYLMFEmGSO0XCOkSD7CcD9SFHSJPA?usp=sharing#scrollTo=DM_eCc3yXzXW [colab_ex1_auto_calculate_crop_values]: https://colab.research.google.com/drive/1XCpIYLMFEmGSO0XCOkSD7CcD9SFHSJPA?usp=sharing#scrollTo=Wkt1FkAghCwQ

编辑推荐精选

Manus

Manus

全面超越基准的 AI Agent助手

Manus 是一款通用人工智能代理平台,能够将您的创意和想法迅速转化为实际成果。无论是定制旅行规划、深入的数据分析,还是教育支持与商业决策,Manus 都能高效整合信息,提供精准解决方案。它以直观的交互体验和领先的技术,为用户开启了一个智慧驱动、轻松高效的新时代,让每个灵感都能得到完美落地。

飞书知识问答

飞书知识问答

飞书官方推出的AI知识库 上传word pdf即可部署AI私有知识库

基于DeepSeek R1大模型构建的知识管理系统,支持PDF、Word、PPT等常见文档格式解析,实现云端与本地数据的双向同步。系统具备实时网络检索能力,可自动关联外部信息源,通过语义理解技术处理结构化与非结构化数据。免费版本提供基础知识库搭建功能,适用于企业文档管理和个人学习资料整理场景。

Trae

Trae

字节跳动发布的AI编程神器IDE

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

TraeAI IDE协作生产力转型热门AI工具
酷表ChatExcel

酷表ChatExcel

大模型驱动的Excel数据处理工具

基于大模型交互的表格处理系统,允许用户通过对话方式完成数据整理和可视化分析。系统采用机器学习算法解析用户指令,自动执行排序、公式计算和数据透视等操作,支持多种文件格式导入导出。数据处理响应速度保持在0.8秒以内,支持超过100万行数据的即时分析。

使用教程AI工具酷表ChatExcelAI智能客服AI营销产品
DeepEP

DeepEP

DeepSeek开源的专家并行通信优化框架

DeepEP是一个专为大规模分布式计算设计的通信库,重点解决专家并行模式中的通信瓶颈问题。其核心架构采用分层拓扑感知技术,能够自动识别节点间物理连接关系,优化数据传输路径。通过实现动态路由选择与负载均衡机制,系统在千卡级计算集群中维持稳定的低延迟特性,同时兼容主流深度学习框架的通信接口。

DeepSeek

DeepSeek

全球领先开源大模型,高效智能助手

DeepSeek是一家幻方量化创办的专注于通用人工智能的中国科技公司,主攻大模型研发与应用。DeepSeek-R1是开源的推理模型,擅长处理复杂任务且可免费商用。

KnowS

KnowS

AI医学搜索引擎 整合4000万+实时更新的全球医学文献

医学领域专用搜索引擎整合4000万+实时更新的全球医学文献,通过自主研发AI模型实现精准知识检索。系统每日更新指南、中英文文献及会议资料,搜索准确率较传统工具提升80%,同时将大模型幻觉率控制在8%以下。支持临床建议生成、文献深度解析、学术报告制作等全流程科研辅助,典型用户反馈显示每周可节省医疗工作者70%时间。

Windsurf Wave 3

Windsurf Wave 3

Windsurf Editor推出第三次重大更新Wave 3

新增模型上下文协议支持与智能编辑功能。本次更新包含五项核心改进:支持接入MCP协议扩展工具生态,Tab键智能跳转提升编码效率,Turbo模式实现自动化终端操作,图片拖拽功能优化多模态交互,以及面向付费用户的个性化图标定制。系统同步集成DeepSeek、Gemini等新模型,并通过信用点数机制实现差异化的资源调配。

AI IDE
腾讯元宝

腾讯元宝

腾讯自研的混元大模型AI助手

腾讯元宝是腾讯基于自研的混元大模型推出的一款多功能AI应用,旨在通过人工智能技术提升用户在写作、绘画、翻译、编程、搜索、阅读总结等多个领域的工作与生活效率。

AI 办公助手AI对话AI助手AI工具腾讯元宝智能体热门
Grok3

Grok3

埃隆·马斯克旗下的人工智能公司 xAI 推出的第三代大规模语言模型

Grok3 是由埃隆·马斯克旗下的人工智能公司 xAI 推出的第三代大规模语言模型,常被马斯克称为“地球上最聪明的 AI”。它不仅是在前代产品 Grok 1 和 Grok 2 基础上的一次飞跃,还在多个关键技术上实现了创新突破。

下拉加载更多