深入解析 supervision 库:功能、用法与应用案例
1. 引言
在计算机视觉任务中,数据的后处理和可视化是至关重要的环节,尤其是在目标检测、分割、跟踪等任务中。supervision 是一个专门为这些任务提供高效数据处理和可视化支持的 Python 库。本文将深入介绍 supervision 的功能、使用方法,并结合实际案例进行演示。
2. supervision 库简介
supervision 主要用于计算机视觉中的后处理任务,特别是结合深度学习模型进行目标检测、语义分割和实例分割的可视化、数据转换等。
2.1 核心功能
- 目标检测后处理:NMS(非极大值抑制)、边界框转换等。
- 可视化:绘制检测框、分割掩码等。
- 数据转换:不同格式(COCO、YOLO、Pascal VOC)之间的转换。
- 多模型集成:支持多种深度学习框架,如 YOLO、Detectron2 等。
3. 安装与环境配置
要使用 supervision,可以直接通过 pip 安装:
pip install supervision
如果你在 Jetson Nano 或嵌入式设备上使用,建议使用 Python 虚拟环境管理依赖。
python3 -m venv env
source env/bin/activate
pip install supervision numpy opencv-python
4. 核心功能解析
4.1 目标检测结果的后处理
supervision 提供了一系列后处理工具,例如 NMS 处理目标检测框。
import supervision as sv
import numpy as np# 假设有一组边界框 [x_min, y_min, x_max, y_max] 和置信度
detections = np.array([[100, 50, 200, 150, 0.9],[110, 60, 210, 160, 0.8],[400, 300, 500, 400, 0.95]
])# 使用 NMS 过滤重复框
nms_boxes = sv.nms(detections, iou_threshold=0.5)
print(nms_boxes)
4.2 目标检测结果可视化
import cv2
from supervision.detection.core import Detections
from supervision.draw.color import ColorPalette
from supervision.annotators import BoxAnnotator# 读取图像
image = cv2.imread('image.jpg')# 目标检测结果
detections = Detections(xyxy=np.array([[100, 50, 200, 150], [400, 300, 500, 400]]),confidence=np.array([0.9, 0.95]),class_id=np.array([0, 1])
)# 可视化
annotator = BoxAnnotator(color=ColorPalette.default())
image_annotated = annotator.annotate(image, detections)cv2.imshow('Detection', image_annotated)
cv2.waitKey(0)
cv2.destroyAllWindows()
4.3 结合 YOLO 进行目标检测
from ultralytics import YOLO
import supervision as sv
import cv2# 加载 YOLO 模型
yolo_model = YOLO("yolov8n.pt")# 读取图像
image = cv2.imread("test.jpg")# 进行推理
results = yolo_model(image)# 解析检测结果
detections = sv.Detections.from_ultralytics(results[0])# 绘制检测框
annotator = sv.BoxAnnotator()
image_annotated = annotator.annotate(image, detections)cv2.imshow("YOLO Detection", image_annotated)
cv2.waitKey(0)
cv2.destroyAllWindows()
4.4 使用 segmentation 掩码进行可视化
from supervision.annotators import MaskAnnotator# 生成假设的掩码数据
masks = np.zeros((2, 224, 224), dtype=np.uint8)
masks[0, 50:150, 50:150] = 1
masks[1, 100:200, 100:200] = 1# 目标检测结果增加掩码
detections.mask = masks# 绘制分割掩码
mask_annotator = MaskAnnotator()
image_annotated = mask_annotator.annotate(image, detections)cv2.imshow("Segmentation Mask", image_annotated)
cv2.waitKey(0)
cv2.destroyAllWindows()
4.5 结合 OpenCV 进行多目标跟踪
import cv2
from supervision.tracking.byte_tracker import BYTETracker# 初始化 BYTETracker
tracker = BYTETracker()# 假设我们有检测结果
detections = Detections(xyxy=np.array([[100, 50, 200, 150], [400, 300, 500, 400]]),confidence=np.array([0.9, 0.95]),class_id=np.array([0, 1])
)# 进行目标跟踪
tracked_detections = tracker.update(detections)
print(tracked_detections)
5. supervision 在 Jetson Nano 上的应用
在 Jetson Nano 上,supervision 可用于实时目标检测并进行后处理。以下是一个使用 Jetson Nano 和 USB 摄像头进行目标检测的代码示例:
import cv2
from ultralytics import YOLO
import supervision as sv# 加载 YOLO 模型
yolo_model = YOLO("yolov8n.pt")# 打开摄像头
cap = cv2.VideoCapture(0)while cap.isOpened():ret, frame = cap.read()if not ret:break# 进行目标检测results = yolo_model(frame)detections = sv.Detections.from_ultralytics(results[0])# 绘制检测框annotator = sv.BoxAnnotator()frame_annotated = annotator.annotate(frame, detections)cv2.imshow("Detection", frame_annotated)if cv2.waitKey(1) & 0xFF == ord('q'):breakcap.release()
cv2.destroyAllWindows()
6. 性能优化与最佳实践
6.1 提高处理速度
- 使用
cv2.VideoCapture设定更小的frame_width和frame_height,减少计算量。 - 在 Jetson Nano 上启用
TensorRT加速。 - 使用多线程或
asyncio处理视频流。
6.2 提高检测准确率
- 结合
NMS和Threshold过滤低置信度目标。 - 训练 YOLO 时使用更多标注数据提升检测效果。
- 针对目标大小调整
image_size以匹配应用场景。
7. 结论
supervision 是一个强大的计算机视觉辅助库,能够简化目标检测、数据处理、可视化等任务,特别适用于 YOLO、Detectron2 等深度学习框架。在 Jetson Nano 等边缘计算设备上,supervision 结合 YOLO 可实现高效的实时目标检测。希望本文的示例和优化策略对你的项目有所帮助!
相关文章:
深入解析 supervision 库:功能、用法与应用案例
1. 引言 在计算机视觉任务中,数据的后处理和可视化是至关重要的环节,尤其是在目标检测、分割、跟踪等任务中。supervision 是一个专门为这些任务提供高效数据处理和可视化支持的 Python 库。本文将深入介绍 supervision 的功能、使用方法,并…...
【DeepSeek问答】访问QStandardItemModel::index(r,c)获取的空索引导致程序崩溃
好的,我现在来仔细思考一下用户的问题。用户在使用QStandardItemModel的setItem方法时,调用了setItem(4,6,item),也就是在第4行第6列的位置设置了一个item。然后他们尝试通过index(3,6)来获取这个位置的项目,想知道会有什么后果。…...
从开源大模型工具Ollama存在安全隐患思考企业级大模型应用如何严守安全红线
近日,国家网络安全通报中心通报大模型工具Ollama默认配置存在未授权访问与模型窃取等安全隐患,引发了广泛关注。Ollama作为一款开源的大模型管理工具,在为用户提供便捷的同时,却因缺乏有效的安全管控机制,存在数据泄露…...
Aws batch task 无法拉取ECR 镜像unable to pull secrets or registry auth 问题排查
AWS batch task使用了自定义镜像,在提作业后出现错误 具体错误是ResourceInitializationError: unable to pull secrets or registry auth: The task cannot pull registry auth from Amazon ECR: There is a connection issue between the task and Amazon ECR. C…...
通用信息抽取大模型PP-UIE开源发布,强化零样本学习与长文本抽取能力,全面适配多场景任务
背景与简介 信息抽取(information extraction)是指,从非结构化或半结构化数据(如自然语言文本)中自动识别、提取并组织出结构化信息。通常包含多个子任务,例如:命名实体识别(NER&am…...
基于uniapp的蓝牙打印功能(佳博打印机已测试)
相关步骤 1.蓝牙打印与低功耗打印的区别2.蓝牙打印流程2.1 搜索蓝牙2.2 连接蓝牙 3.连接蓝牙设备4.获取服务5.写入命令源码gbk.jsglobalindex.ts 1.蓝牙打印与低功耗打印的区别 低功耗蓝牙是一种无线、低功耗个人局域网,运行在 2.4 GHz ISM 频段 1、低功耗蓝牙能够…...
【Azure 架构师学习笔记】- Azure Databricks (15) --Delta Lake 和Data Lake
本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Databricks】系列。 接上文 【Azure 架构师学习笔记】- Azure Databricks (14) – 搭建Medallion Architecture part 2 前言 ADB 除了UC 这个概念之外,前面【Azure 架构师学习笔记】- Azure Databricks (1…...
WPF高级 | WPF 应用程序部署与发布:确保顺利交付到用户手中
WPF高级 | WPF 应用程序部署与发布:确保顺利交付到用户手中 一、前言二、部署与发布基础概念2.1 部署的定义与目的2.2 发布的方式与渠道2.3 部署与发布的关键要素 三、WPF 应用程序打包3.1 使用 Visual Studio 自带的打包工具3.2 使用第三方打包工具 四、发布到不同…...
在 IntelliJ IDEA(2024) 中创建 JAR 包步骤
下是在 IntelliJ IDEA 中创建 JAR 包的详细的步骤: 1. 选择File -> Project Structure->Artifacts, (1)点击➕新建,如下图所示: (2)选择JAR->Empty (3)输入jar包名称,确定输出路径 (4&#…...
【C++】5.4.3 范围for语句
范围for语句基本形式: for(声明变量:序列容器) {循环执行语句; } 其中,“序列容器”是指花括号括起来的初始值列表、数组、vector或者string等类型的对象,主要特点是拥有能返回迭代器的 begin() 和 end() 成员; “声明变量”是一个类似声明…...
达梦数据库备份
达梦数据库联机在线备份操作指南 一、基础条件与准备 开启归档模式: 联机备份必须处于归档模式下,否则无法执行。需通过disql工具执行以下操作: alter database mount; alter database ARCHIVELOG; 例子: [dmdbaserver ~]$ cd /op…...
Linux系统基于ARM平台的LVGL移植
软硬件介绍:Ubuntu 20.04 ARM 和(Cortex-A53架构)开发板 基本原理 LVGL图形库是支持使用Linux系统的Framebuffer帧缓冲设备实现的,如果想要实现在ARM开发板上运行LVGL图形库,那么就需要把LVGL图形库提供的关于帧缓冲设…...
C++ 二叉搜索树代码
C 二叉搜索树代码 #include <iostream> using namespace std;template<typename T> struct TreeNode{T val;TreeNode *left;TreeNode *right;TreeNode():val(0), left(NULL), right(NULL){}TreeNode(T x):val(x), left(NULL), right(NULL){} };template<typena…...
DeepSeek+知识库+鸿蒙,助力鸿蒙高效开发
不知道你们发现没有,就是鸿蒙开发官网,文档也太多太多了,对于新手来说确实头疼,开发者大多是极客,程序的目的是让世界更高效!看文档,挺头疼的,毕竟都是理科生。 遇到问题不要慌&…...
蓝桥杯牛客1-10重点(自用)
1 import mathdef lcm(a,b):return a * b // math.gcd(a, b) # math.gcd(a, b)最小公倍数 a,b map(int,input().split()) # a int(input()) # 只读取一个整数 # print(a) print(lcm(a,b)) 2 import os import sysdef fly(lists,n):count 0flag Falsefor i in range(1,n…...
Kafka - 高吞吐量的七项核心设计解析
文章目录 概述一、顺序磁盘I/O (分区顺序追加)1.1 存储架构设计1.2 性能对比实验1.3 存储优化策略 二、零拷贝技术:颠覆传统的数据传输革命2.1 传统模式痛点2.2 Kafka优化方案 三、页缓存机制:操作系统的隐藏加速器3.1 实现原理3.2 优势对比 四、日志索引…...
Towards Precise and Explainable Hardware Trojan Localization at LUT Level
文章 《Towards Precise and Explainable Hardware Trojan Localization at LUT Level》 TCAD’2025 《LUT层次的精细可解释木马定位》 期刊介绍 《IEEE Transactions on Computer-Aided Design of Integrated Circuits and Systems》(TCAD)是集成电路…...
Python实现鼠标点击获取窗口进程信息
最近遇到挺无解的一个问题:电脑上莫名其妙出现一个白色小方块,点击没有反应,关也关不掉,想知道它和哪个软件有关还是显卡出了问题,也找不到思路,就想着要不获取一下它的进程号看看。 于是写了一个Python脚本…...
Mac安装jdk教程
在Mac上安装JDK(Java Development Kit)的步骤如下: 一、下载JDK安装包 访问Oracle官网: 打开浏览器,访问Oracle JDK下载页面。 选择JDK版本: 根据你的开发需求选择合适的JDK版本。例如,JDK 11…...
【HeadFirst系列之HeadFirst设计模式】第14天之与设计模式相处:真实世界中的设计模式
与设计模式相处:真实世界中的设计模式 设计模式是软件开发中的经典解决方案,它们帮助我们解决常见的设计问题,并提高代码的可维护性和可扩展性。在《Head First设计模式》一书中,作者通过生动的案例和通俗的语言,深入…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...
Qt 事件处理中 return 的深入解析
Qt 事件处理中 return 的深入解析 在 Qt 事件处理中,return 语句的使用是另一个关键概念,它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别:不同层级的事件处理 方…...
数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !
我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...
