深入探索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
英文地址,請注明出處:http://en.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. 提升問題理解能…