Supervision 计算机视觉工具

server/2024/12/22 18:04:11/

Supervision 是一个强大的计算机视觉工具库,它提供了丰富的功能来处理各种视觉任务,如目标检测、语义分割、目标跟踪等。这个库的最大特点是它能够简化代码的编写,使得视觉任务的处理变得更加高效和直观。

安装

Supervision 库可以在 Python 3.8 及以上版本中安装。如果你需要完整的 GUI 支持,可以使用以下命令安装:

pip install "supervision[desktop]" -i https://pypi.tuna.tsinghua.edu.cn/simple

如果不需要 GUI 支持,可以简化安装:

pip install supervision -i https://pypi.tuna.tsinghua.edu.cn/simple

目标检测与跟踪

Supervision 库结合 YOLO V8 可以轻松实现目标检测和跟踪。以下是使用 Supervision 和 YOLO V8 进行目标检测和跟踪的代码示例:

import cv2
import supervision as sv
from ultralytics import YOLO# 加载模型
model = YOLO("yolov8n.pt")# 初始化追踪器
tracker = sv.ByteTrack()# 读取视频
video_name = sv.download_assets(sv.VideoAssets.PEOPLE_WALKING)
cap = cv2.VideoCapture(video_name)while True:ret, frame = cap.read()if not ret:breakresult = model(frame)[0]detections = sv.Detections.from_ultralytics(result)detections = tracker.update_with_detections(detections)# 绘制边框和标签annotated_frame = sv.BoundingBoxAnnotator().annotate(frame, detections)labels = [f"{d.class_id} {model.names[d.class_id]}" for d in detections]annotated_frame = sv.LabelAnnotator().annotate(annotated_frame, detections, labels)cv2.imshow('video', annotated_frame)if cv2.waitKey(1) & 0xFF == ord('q'):breakcap.release()
cv2.destroyAllWindows()

轨迹平滑

轨迹平滑是目标跟踪中的一个重要环节,Supervision 提供了 DetectionsSmoother 类来实现轨迹平滑:

import cv2
import supervision as sv
from ultralytics import YOLO# 加载模型
model = YOLO("yolov8n.pt")# 初始化追踪器和平滑器
tracker = sv.ByteTrack()
smoother = sv.DetectionsSmoother(length=4)# 读取视频
video_name = sv.download_assets(sv.VideoAssets.PEOPLE_WALKING)
cap = cv2.VideoCapture(video_name)while True:ret, frame = cap.read()if not ret:breakresult = model(frame)[0]detections = sv.Detections.from_ultralytics(result)detections = tracker.update_with_detections(detections)detections = smoother.update_with_detections(detections)# 绘制边框和标签annotated_frame = sv.BoundingBoxAnnotator().annotate(frame, detections)labels = [f"{d.class_id} {model.names[d.class_id]}" for d in detections]annotated_frame = sv.LabelAnnotator().annotate(annotated_frame, detections, labels)cv2.imshow('video', annotated_frame)if cv2.waitKey(1) & 0xFF == ord('q'):breakcap.release()
cv2.destroyAllWindows()

越线数量统计

Supervision 还提供了 LineZone 类来实现越线数量统计功能:

import supervision as sv
from ultralytics import YOLO# 加载模型
model = YOLO("yolov8n.pt")# 初始化追踪器和越线检测器
tracker = sv.ByteTrack()
line_zone = sv.LineZone(start=sv.Point(0, 400), end=sv.Point(1280, 400))# 读取视频
video_name = sv.download_assets(sv.VideoAssets.VEHICLES)
cap = cv2.VideoCapture(video_name)while True:ret, frame = cap.read()if not ret:breakresult = model(frame)[0]detections = sv.Detections.from_ultralytics(result)detections = tracker.update_with_detections(detections)crossed_in, crossed_out = line_zone.trigger(detections)# 绘制边框和标签annotated_frame = sv.BoundingBoxAnnotator().annotate(frame, detections)labels = [f"{d.class_id} {model.names[d.class_id]}" for d in detections]annotated_frame = sv.LabelAnnotator().annotate(annotated_frame, detections, labels)cv2.imshow('video', annotated_frame)if cv2.waitKey(1) & 0xFF == ord('q'):breakcap.release()
cv2.destroyAllWindows()

切片推理

对于小目标的检测,Supervision 提供了 InferenceSlicer 类来进行切片推理:

import cv2
import supervision as sv
from ultralytics import YOLO
import numpy as np# 加载模型
model = YOLO("yolov8n.pt")# 切片回调函数
def callback(image_slice: np.ndarray) -> sv.Detections:result = model(image_slice, verbose=False)[0]return sv.Detections.from_ultralytics(result)# 初始化切片器
slicer = sv.InferenceSlicer(callback=callback, slice_wh=(320, 320), overlap_ratio_wh=(0.3, 0.3), iou_threshold=0.5, thread_workers=4)# 读取图像
image = cv2.imread("img/3.png")
detections = slicer(image)# 绘制边框和标签
annotated_image = sv.BoundingBoxAnnotator().annotate(image, detections)
labels = [f"{d.class_id} {model.names[d.class_id]}" for d in detections]
annotated_image = sv.LabelAnnotator().annotate(annotated_image, detections, labels)cv2.imshow('img', annotated_image)
cv2.waitKey(0)

辅助展现任务

Supervision 提供了多种方式来展现检测结果,包括边框、角点边框、遮罩等:

import cv2
import supervision as sv
from ultralytics import YOLO# 加载模型
model = YOLO("yolov8n.pt")# 读取图像
image = cv2.imread("img/img.png")
result = model(image)[0]
detections = sv.Detections.from_ultralytics(result)# 角点边框展现
corner_annotator = sv.BoxCornerAnnotator(corner_length=15, thickness=2, color=sv.Color(r=255, g=0, b=0))
image = corner_annotator.annotate(image, detections)# 绘制标签
labels = [f"{d.class_id} {model.names[d.class_id]}" for d in detections]
image = sv.LabelAnnotator().annotate(image, detections, labels)cv2.imshow('img', image)
cv2.waitKey(0)

这些代码示例展示了如何使用 Supervision 库进行目标检测、跟踪、轨迹平滑、越线统计和切片推理等任务。Supervision 库的易用性和强大功能使其成为计算机视觉领域的一大利器。

✅作者简介:热爱科研的人工智能开发者,修心和技术同步精进

❤欢迎关注我的知乎:对error视而不见

代码获取、问题探讨及文章转载可私信。

☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。

🍎获取更多人工智能资料可点击链接进群领取,谢谢支持!👇

点击领取更多详细资料


http://www.ppmy.cn/server/122258.html

相关文章

运维工程师面试整理-沟通能力

在运维工程师的面试中,沟通能力是一个关键的软技能。虽然运维工程师的工作主要集中在技术领域,但良好的沟通能力能够帮助你更有效地与团队成员、其他技术部门和非技术人员协作。以下是关于运维工程师需要具备的沟通能力的详细内容,帮助你更好地准备面试。 1. 沟通能力的重要…

数学建模-线性规划讲解(Matlab版本)

引言 相信不少小伙伴刚开始接触数学建模时,第一个学习的算法就是运筹学的重要分支--数学规划,而数学规划当中重要的分支就是线性规划了。在这里笔者参考了司守奎和孙玺菁老师的《数学建模算法与应用》(第三版)这本书,以此来讲讲关…

【python笔记】列表操作append(list)与append(list[:])的区别;列表的就地修改与非就地修改

问题背景: 当有一个数组list1 [1,2,3],需要根据list1创建一个二维数组list2时, 想到了列表的list2.append(list1) 结果由于list1.pop()更改,list2的结果也随之变化,开始摸不着头脑。 append(list)与append(list[:])的…

前端文件下载全流程

一、首先是点击下载函数功能 源代码: java const dow async (record: any) > {console.log(record,record);let date: any {}date.pcno record.pcnodate.fileName record.fileNamedate.gmtCreated dayjs(record.gmtCreated).format(YYYY-MM)date.importSta…

解决docker目录内存不足扩容处理

当我们使用docker时,经常会创建新镜像和新容器,在新容器中又会安装各种包,这些东西不是虚拟的,而是实实在在存于我们的磁盘中,默认在/var/lib/docker中,这个目录是属于系统盘的,而系统盘的空间往…

接口自动化测试框架详解(pytest+allure+aiohttp+ 用例自动生成)

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 近期准备优先做接口测试的覆盖,为此需要开发一个测试框架,经过思考,这次依然想做点儿不一样的东西。 接口测试是比较讲究效…

【计算机网络】运输层协议解析

这里写目录标题 前言UDP与TCP对比TCP流量控制TCP拥塞控制TCP超时重传时间选择TCP可靠传输实现 前言 运输层直接为应用进程间的逻辑通信提供服务。运输层向高层用户屏蔽了下面网络核心细节(如网络拓扑、路由选择协议等)它使应用进程看见的就好像是在两个…

IP地址与智能家居能够碰撞出什么样的火花呢?

感应灯、远程遥控空调,自动感应窗帘——智能家居已经在正逐步走入我们的生活,为我们带来前所未有的便捷与舒适体验。而在这一进程中,IP地址又能够与智能家居碰撞出什么样的火花呢? 一、IP地址:智能家居的连接基石 智…