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

编辑推荐精选

讯飞智文

讯飞智文

一键生成PPT和Word,让学习生活更轻松

讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。

AI办公办公工具AI工具讯飞智文AI在线生成PPTAI撰写助手多语种文档生成AI自动配图热门
讯飞星火

讯飞星火

深度推理能力全新升级,全面对标OpenAI o1

科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。

热门AI开发模型训练AI工具讯飞星火大模型智能问答内容创作多语种支持智慧生活
Spark-TTS

Spark-TTS

一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型

Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。

Trae

Trae

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

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

AI工具TraeAI IDE协作生产力转型热门
咔片PPT

咔片PPT

AI助力,做PPT更简单!

咔片是一款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。

讯飞绘文

讯飞绘文

选题、配图、成文,一站式创作,让内容运营更高效

讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。

热门AI辅助写作AI工具讯飞绘文内容运营AI创作个性化文章多平台分发AI助手
材料星

材料星

专业的AI公文写作平台,公文写作神器

AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。

openai-agents-python

openai-agents-python

OpenAI Agents SDK,助力开发者便捷使用 OpenAI 相关功能。

openai-agents-python 是 OpenAI 推出的一款强大 Python SDK,它为开发者提供了与 OpenAI 模型交互的高效工具,支持工具调用、结果处理、追踪等功能,涵盖多种应用场景,如研究助手、财务研究等,能显著提升开发效率,让开发者更轻松地利用 OpenAI 的技术优势。

Hunyuan3D-2

Hunyuan3D-2

高分辨率纹理 3D 资产生成

Hunyuan3D-2 是腾讯开发的用于 3D 资产生成的强大工具,支持从文本描述、单张图片或多视角图片生成 3D 模型,具备快速形状生成能力,可生成带纹理的高质量 3D 模型,适用于多个领域,为 3D 创作提供了高效解决方案。

3FS

3FS

一个具备存储、管理和客户端操作等多种功能的分布式文件系统相关项目。

3FS 是一个功能强大的分布式文件系统项目,涵盖了存储引擎、元数据管理、客户端工具等多个模块。它支持多种文件操作,如创建文件和目录、设置布局等,同时具备高效的事件循环、节点选择和协程池管理等特性。适用于需要大规模数据存储和管理的场景,能够提高系统的性能和可靠性,是分布式存储领域的优质解决方案。

下拉加载更多