深入探索Supervision库:Python中的AI视觉助手

在这里插入图片描述

深入探索Supervision库:Python中的AI视觉助手

在计算机视觉和机器学习领域,数据处理和结果可视化是项目成功的关键环节。今天我们将深入探讨一个强大的Python库——Supervision,它专为简化AI视觉项目的工作流程而设计。

什么是Supervision?

Supervision是一个开源的Python库,旨在为计算机视觉项目提供一系列实用工具,特别是在对象检测、分割和跟踪任务中。它提供了直观的API,可以与流行的机器学习框架(如YOLO、Detectron2等)无缝集成,大大简化了从模型推理到结果可视化的整个流程。

核心功能概述

Supervision的主要功能包括但不限于:

  • 标注可视化(边界框、掩码、标签等)
  • 数据集处理与转换
  • 检测过滤与后处理
  • 视频流处理
  • 性能分析工具
  • 与多种计算机视觉框架的集成

安装Supervision

安装Supervision非常简单,可以通过pip完成:

pip install supervision

如果你需要完整的功能(包括视频处理支持):

pip install supervision[full]

基础使用示例

让我们从一个简单的例子开始,展示如何使用Supervision可视化检测结果。

import cv2
import supervision as sv
from ultralytics import YOLO# 加载YOLOv8模型
model = YOLO('yolov8n.pt')# 读取图像
image = cv2.imread('image.jpg')# 运行推理
results = model(image)[0]
detections = sv.Detections.from_yolov8(results)# 创建标注工具
box_annotator = sv.BoxAnnotator()# 标注图像
labels = [f"{model.model.names[class_id]} {confidence:0.2f}"for _, _, confidence, class_id, _in detections
]
annotated_image = box_annotator.annotate(scene=image.copy(),detections=detections,labels=labels
)# 显示结果
sv.plot_image(annotated_image)

检测结果处理

Supervision的Detections类是处理检测结果的核心。让我们看看如何操作这些检测结果。

# 过滤低置信度的检测
high_confidence_detections = detections[detections.confidence > 0.7]# 只保留特定类别的检测
person_detections = detections[detections.class_id == 0]  # 假设0是人# 获取检测的边界框坐标
for bbox in person_detections.xyxy:print(f"边界框坐标: {bbox}")# 计算检测区域中心点
centers = person_detections.get_anchors_coordinates(sv.Position.CENTER)
print(f"中心点坐标: {centers}")

高级标注功能

Supervision提供了多种标注样式,可以满足不同的可视化需求。

# 创建不同类型的标注器
box_annotator = sv.BoxAnnotator(thickness=2,text_thickness=1,text_scale=0.5
)mask_annotator = sv.MaskAnnotator()
label_annotator = sv.LabelAnnotator()
circle_annotator = sv.CircleAnnotator()# 组合使用多种标注
annotated_image = box_annotator.annotate(image.copy(), detections)
annotated_image = mask_annotator.annotate(annotated_image, detections)
annotated_image = label_annotator.annotate(annotated_image, detections)
annotated_image = circle_annotator.annotate(annotated_image, detections,anchor=sv.Position.CENTER
)sv.plot_image(annotated_image)

视频处理能力

Supervision简化了视频处理流程,使得处理视频流就像处理单帧图像一样简单。

# 创建视频处理器
video_info = sv.VideoInfo.from_video_path("video.mp4")
frame_generator = sv.get_video_frames_generator("video.mp4")# 初始化跟踪器
byte_tracker = sv.ByteTrack()# 处理每一帧
with sv.VideoSink("output.mp4", video_info) as sink:for frame in frame_generator:results = model(frame)[0]detections = sv.Detections.from_yolov8(results)detections = byte_tracker.update_with_detections(detections)annotated_frame = box_annotator.annotate(scene=frame.copy(),detections=detections,labels=labels)sink.write_frame(annotated_frame)

数据集工具

Supervision提供了一些便捷的数据集处理工具。

# 加载COCO数据集
dataset = sv.DetectionDataset.from_coco(images_directory_path="train/images",annotations_path="train/annotations.json"
)# 随机采样并可视化
samples = dataset.sample(4)
sv.plot_images_grid(images=[sample.image for sample in samples],annotations=[sample.annotations for sample in samples],grid_size=(2, 2),size=(16, 16)
)# 转换为其他格式
dataset.as_yolo(images_directory_path="yolo/images",annotations_directory_path="yolo/labels",data_yaml_path="yolo/data.yaml"
)

高级分析功能

Supervision还包含一些高级分析工具,如区域计数和热图生成。

# 定义感兴趣区域
polygon = np.array([[100, 100],[300, 100],[300, 300],[100, 300]
])
zone = sv.PolygonZone(polygon, frame_resolution_wh=(640, 480))# 创建分析工具
zone_annotator = sv.PolygonZoneAnnotator(zone=zone, color=sv.Color.red()
)
heat_map_annotator = sv.HeatMapAnnotator()# 处理视频并分析
heat_map = np.zeros((480, 640), dtype=np.float32)
with sv.VideoSink("analysis_output.mp4", video_info) as sink:for frame in frame_generator:results = model(frame)[0]detections = sv.Detections.from_yolov8(results)# 更新区域计数zone.trigger(detections)# 更新热图heat_map = heat_map_annotator.update(heat_map, detections)# 标注annotated_frame = box_annotator.annotate(frame.copy(), detections)annotated_frame = zone_annotator.annotate(annotated_frame)annotated_frame = heat_map_annotator.annotate(annotated_frame,heat_map=heat_map)sink.write_frame(annotated_frame)

自定义标注样式

Supervision允许完全自定义标注的外观。

# 自定义颜色和样式
class CustomColor:BOX = sv.Color(r=255, g=0, b=0)  # 红色边框TEXT = sv.Color(r=255, g=255, b=255)  # 白色文本BACKGROUND = sv.Color(r=0, g=0, b=0, a=128)  # 半透明黑色背景custom_annotator = sv.BoxAnnotator(color=CustomColor.BOX,text_color=CustomColor.TEXT,text_background_color=CustomColor.BACKGROUND,text_padding=2,thickness=3,corner_radius=10
)annotated_image = custom_annotator.annotate(scene=image.copy(),detections=detections,labels=labels
)
sv.plot_image(annotated_image)

与不同框架集成

Supervision支持与多种流行框架的集成。

# 从不同框架创建Detections对象# 从YOLOv8
detections = sv.Detections.from_yolov8(results)# 从Detectron2
# outputs = predictor(image)
# detections = sv.Detections.from_detectron2(outputs)# 从MMDetection
# result = inference_detector(model, image)
# detections = sv.Detections.from_mmdetection(result)# 从TorchVision
# outputs = model(image)
# detections = sv.Detections.from_torchvision(outputs)

实用工具函数

Supervision还包含许多有用的实用函数。

# 图像处理
resized_image = sv.resize_image(image, scale_factor=0.5)
gray_image = sv.cvt_color(image, sv.ColorConversion.BGR2GRAY)# 视频工具
sv.get_video_frames_count("video.mp4")
sv.get_video_fps("video.mp4")# 文件系统
sv.list_files_with_extensions(directory="dataset/images",extensions=["jpg", "png"]
)# 绘图工具
sv.draw_text(scene=image.copy(),text="Sample Text",text_anchor=sv.Point(100, 100),text_color=sv.Color.red(),text_scale=1.0,text_thickness=2,background_color=sv.Color.white()
)

性能优化技巧

当处理大规模数据时,性能变得尤为重要。

# 使用多线程处理视频
with sv.VideoSink("output.mp4", video_info) as sink:with sv.FramesThreadBatchProcessor(source_path="video.mp4",batch_size=4,max_workers=4) as batch_generator:for batch in batch_generator:batch_results = model(batch.frames)batch_detections = [sv.Detections.from_yolov8(results)for results in batch_results]for frame, detections in zip(batch.frames, batch_detections):annotated_frame = box_annotator.annotate(scene=frame.copy(),detections=detections)sink.write_frame(annotated_frame)

实际应用案例

让我们看一个完整的行人计数应用示例。

import numpy as np
import supervision as sv
from ultralytics import YOLO# 初始化模型和工具
model = YOLO('yolov8n.pt')
byte_tracker = sv.ByteTrack()
box_annotator = sv.BoxAnnotator()# 定义计数区域
counting_zone = np.array([[200, 150],[800, 150],[800, 600],[200, 600]
])
zone = sv.PolygonZone(polygon=counting_zone, frame_resolution_wh=(1280, 720))
zone_annotator = sv.PolygonZoneAnnotator(zone=zone,color=sv.Color.green(),text_color=sv.Color.black(),text_scale=2,text_thickness=4,text_padding=8
)# 处理视频
with sv.VideoSink("people_counting.mp4", sv.VideoInfo.from_video_path("input.mp4")) as sink:for frame in sv.get_video_frames_generator("input.mp4"):# 推理results = model(frame)[0]detections = sv.Detections.from_yolov8(results)# 只保留人(class_id=0)detections = detections[detections.class_id == 0]# 更新跟踪器detections = byte_tracker.update_with_detections(detections)# 更新计数区域zone.trigger(detections)# 标注labels = [f"#{tracker_id} {model.model.names[class_id]} {confidence:0.2f}"for _, _, confidence, class_id, tracker_idin detections]annotated_frame = box_annotator.annotate(scene=frame.copy(),detections=detections,labels=labels)annotated_frame = zone_annotator.annotate(annotated_frame)sink.write_frame(annotated_frame)print(f"总人数统计: {zone.current_count}")

总结

Supervision库为计算机视觉项目提供了强大而灵活的工具集,极大地简化了从模型推理到结果可视化的整个流程。通过本文的介绍和代码示例,你应该已经了解了它的核心功能和应用场景。

无论你是处理静态图像、视频流,还是需要复杂的分析功能,Supervision都能提供高效的解决方案。它的模块化设计使得可以轻松集成到现有项目中,同时也为快速原型开发提供了便利。

随着计算机视觉应用的日益普及,像Supervision这样的工具将变得越来越重要。它不仅能提高开发效率,还能帮助开发者更专注于算法和模型的优化,而不是繁琐的数据处理和可视化工作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/92385.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/92385.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面向对象之类、继承和多态

系统是由汇总了数据和过程的“对象”组成的。在面向对象中,软件被定义为“类”,然后创建“实例”并运行。系统是通过“实例”之间的互相交换“消息”而运行的,但由于进行了“封装”,所以无法查看内部的详细内容,这被称…

传统防火墙与下一代防火墙

防火墙的发展过程第一种简单包过滤防火墙工作于:3、4层实现了对于IP、UDP、TCP信息的一些检查优点:速度快、性能高、可用硬件实现;兼容性较好检查IP、UDP、TCP信息缺点:安全性有限:仅能基于数据包的表面层面进行审查&a…

计算机视觉前言-----OpenCV库介绍与计算机视觉入门准备

前言:OpenCV库介绍与计算机视觉入门 OpenCV概述 OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库,由Intel于1999年首次发布,现由非盈利组织OpenCV.org维护。它包含了超过2500种…

AI面试系统助手深度评测:6大主流工具对比分析

导语:秋招季,企业如何破局高效招聘?随着2024年秋招季临近,企业招聘压力陡增。据牛客调研数据显示,74.2%的求职者已接触过AI面试,89.2%的企业认为AI显著提升了筛选效率。然而,面对市场上琳琅满目…

浮雕软件Artcam安装包百度云网盘下载与安装指南

如你所知,ArtCAM是一款专业的CAD/CAM软件工具,主要用于三维浮雕设计、珠宝加工及CNC数控雕刻,可将二维构思快速转化为三维艺术产品,深受使用者的喜爱。一、主要应用领域‌工艺品与制造业‌:木工雕花、标牌制作、模具制…

六边形架构模式深度解析

在分布式系统设计领域,六边形架构(Hexagonal Architecture,又称端口与适配器模式)作为一种以领域为中心的架构模式,通过明确分离核心业务逻辑与外部交互,有效提升系统的可测试性、可扩展性与可维护性。本文…

Beelzebub靶机

一、主机发现 arp-scan扫描一下局域网靶机 二、信息收集 nmap -sV -A -T4 -p- 192.168.31.132 22端口ssh服务和80端口web服务是打开的 目录扫描 三、渗透测试 访问一下web服务是个apache的首页 web页面分析 有一个很奇怪的地方,index.php明明是一个200的响应&a…

目前常用于视频会议的视频编码上行/下行带宽对比

视频编码上行/下行带宽对比H.264、VP8和VP9在不同终端数量下的上行与下行带宽需求差异(单位:Mbps)编码效率说明H.264基准编码标准,上行和下行带宽需求相对较高,硬件兼容性最佳VP8开源编码,上行和下行带宽均…

CrewAI ——构建多智能体协作的框架

CrewAI 是一个用于构建多智能体协作的框架,它的核心目标是通过协调多个智能体(Agents)来完成复杂任务。这些智能体不仅可以在单一任务中进行合作,还可以在动态、开放的环境中进行交互与协作。CrewAI 的设计和实现使得智能体之间能…

【数据结构初阶】--排序(五)--计数排序,排序算法复杂度对比和稳定性分析

🔥个人主页:草莓熊Lotso 🎬作者简介:C研发方向学习者 📖个人专栏: 《C语言》 《数据结构与算法》《C语言刷题集》《Leetcode刷题指南》 ⭐️人生格言:生活是默默的坚持,毅力是永久的…

InfluxDB 数据备份与恢复高级策略(二)

案例实战:InfluxDB 数据备份恢复业务场景描述假设我们正在参与一个大型的物联网项目,该项目涉及分布在不同区域的数千个传感器设备 ,这些设备实时采集环境温度、湿度、设备运行状态等数据,并将这些数据存储在 InfluxDB 数据库中。…

sqli-labs通关笔记-第36关GET宽字符注入(单引号闭合 手工注入+脚本注入 3种方法)

目录 一、转义函数 1、mysqli_real_escape_string 2、addslashes 3、转义区别 二、宽字符注入 三、sqlmap之tamper 四、sqlmap之unmagicquotes 五、源码分析 1、代码审计 2、SQL注入安全性分析 六、渗透实战 1、进入靶场 2、id1探测 3、id-1探测 4、id1%df and…

手撕设计模式——咖啡点单系统之装饰模式

手撕设计模式——咖啡点单系统之装饰模式 1.业务需求 ​ 大家好,我是菠菜啊,好久不见,今天给大家带来的是——装饰模式。老规矩,在介绍这期内容前,我们先来看看这样的需求:现在有一个咖啡馆,有…

LRU Cache缓存替换算法

目录 一、LRU 是什么?Cache是什么? 二、LRU Cache的实现 三、源码 一、LRU 是什么?Cache是什么? LRU 是 "Least Recently Used" 的缩写,意思是“最近最少使用”。它是一种常用的 缓存(Cache&…

自定义视图:图形与图像的处理(二):绘图

除了使用已有的图片之外,Android应用还常常需要在运行时动态地生成图片,比如一个手机游戏,游戏界面看上去丰富多彩,而且可以随着用户动作而动态改变,这就需要借助于Android的绘图支持了。1. Android绘图基础:Canvas、P…

微服务、服务网格、Nacos架构与原理

Nacos架构与原理 -服务网格生态-阿里云开发者社区 ------ 该文章用于学习参考,如有侵权,请直接联系下架 服务网格的核心职责:治理“服务通信” 包括但不限于: 功能 举例说明 负载均衡 动态选择服务实例 熔断、重试 某个服务失败时自动切换、重试 流量路由 灰度发布、蓝绿…

STM32——启动过程浅析

总:STM32——学习总纲 参考文件: STM32 MAP文件浅析-V1.1 STM32 启动文件浅析_V1.2 Cortex-M3权威指南(中文)、ARM Cotrex-M3权威指南(英文).zip 一、Map文件解析 1.1 MDK编译过程文件 在编译中,会生成11种编译过程文件,可…

区块链简介

一、区块链简介 狭义上的定义: 区块链是一种链式数据结构,通过按时间顺序将数据块逐一连接形成。这种结构通过密码学确保了数据的不可篡改性和不可伪造性,形成了一种分布式账本技术。 广义上的定义: 区块链技术不仅仅是一种数据…

NestJS中@Injectable装饰器

一、基础定义与核心作用 1.1 什么是Injectable? Injectable() 是 NestJS 依赖注入(Dependency Injection, DI)系统的核心装饰器,用于将类标记为可注入的提供者(Provider)。它告知 NestJS 的 IoC&#xff08…

【机器学习深度学习】大模型应用落地:微调与RAG的角色与实践

目录 前言 一、微调与RAG:大模型应用落地的两大支柱 1. 微调(Fine-tuning) 2. RAG(Retrieval-Augmented Generation) 二、微调可以做什么? 1. 模型自我认知调整 2. 对话风格优化 3. 提升问题理解能…