更新日志¶
0.25.0 2024年11月12日¶
-
本次发布中没有移除或弃用的内容!
-
对
LineZone的重要更新:在计算线交叉时,抖动的检测可能会被重复计数(或更多)。现在可以通过minimum_crossing_threshold参数解决这个问题。如果将其设置为2或更高,将使用额外的帧来确认交叉,显著提高准确性。(#1540) -
现在可以追踪被检测为
KeyPoints的对象。完整的分步指南请参阅Object Tracking Guide。(#1658)
import numpy as np
import supervision as sv
from ultralytics import YOLO
model = YOLO("yolov8m-pose.pt")
tracker = sv.ByteTrack()
trace_annotator = sv.TraceAnnotator()
def callback(frame: np.ndarray, _: int) -> np.ndarray:
results = model(frame)[0]
key_points = sv.KeyPoints.from_ultralytics(results)
detections = key_points.as_detections()
detections = tracker.update_with_detections(detections)
annotated_image = trace_annotator.annotate(frame.copy(), detections)
return annotated_image
sv.process_video(
source_path="input_video.mp4",
target_path="output_video.mp4",
callback=callback
)
from supervision.assets import download_assets, VideoAssets
path_to_video = download_assets(VideoAssets.SKIING)
-
Supervision 现在可以与
Python 3.13一起使用。最著名的更新是能够在不使用全局解释器锁(GIL)的情况下运行 Python。我们预计依赖项对此的支持会不一致,但如果您尝试了 - 请告诉我们结果! (#1595) -
新增了
Mean Average RecallmAR指标,该指标返回一个召回分数,该分数在IoU阈值、检测到的对象类别以及对最大考虑检测的限制上进行了平均。(#1661)
import supervision as sv
from supervision.metrics import MeanAverageRecall
predictions = sv.Detections(...)
targets = sv.Detections(...)
map_metric = MeanAverageRecall()
map_result = map_metric.update(predictions, targets).compute()
map_result.plot()
import supervision as sv
from supervision.metrics import Recall
predictions = sv.Detections(...)
targets = sv.Detections(...)
recall_metric = Recall()
recall_result = recall_metric.update(predictions, targets).compute()
recall_result.plot()
- 所有指标现在都支持定向边界框(OBB) (#1593)
import supervision as sv
from supervision.metrics import F1_Score
predictions = sv.Detections(...)
targets = sv.Detections(...)
f1_metric = MeanAverageRecall(metric_target=sv.MetricTarget.ORIENTED_BOUNDING_BOXES)
f1_result = f1_metric.update(predictions, targets).compute()
- 推出智能标签功能!当为
LabelAnnotator、RichLabelAnnotator或VertexLabelAnnotator设置smart_position参数时,标签会自动移动位置以避免相互重叠。(#1625)
import supervision as sv
from ultralytics import YOLO
image = cv2.imread("image.jpg")
label_annotator = sv.LabelAnnotator(smart_position=True)
model = YOLO("yolo11m.pt")
results = model(image)[0]
detections = sv.Detections.from_ultralytics(results)
annotated_frame = label_annotator.annotate(first_frame.copy(), detections)
sv.plot_image(annotated_frame)
- 在
Detections中新增了metadata变量。该变量允许您按图像存储自定义数据,而不是像data变量那样按检测对象存储。例如,metadata可用于存储源视频路径、相机型号或相机参数。(#1589)
import supervision as sv
from ultralytics import YOLO
model = YOLO("yolov8m")
result = model("image.png")[0]
detections = sv.Detections.from_ultralytics(result)
# Items in `data` must match length of detections
object_ids = [num for num in range(len(detections))]
detections.data["object_number"] = object_ids
# Items in `metadata` can be of any length.
detections.metadata["camera_model"] = "Luxonis OAK-D"
-
添加了一个
py.typed类型提示元文件。它应该能向类型注释器和IDE提供更明确的信号,表明类型支持是可用的。(#1586) -
ByteTrack不再要求detections必须包含class_id(#1637) draw_line,draw_rectangle,draw_filled_rectangle,draw_polygon,draw_filled_polygon和PolygonZoneAnnotator现在都带有默认颜色 (#1591)- 在合并多个数据集时,Dataset类被视为区分大小写。(#1643)
- 扩展了metrics documentation,包含示例图表和打印结果 (#1660)
- 添加了多边形区域的使用示例 (#1608)
-
对多边形错误处理的小改进:(#1602)
-
更新了
ByteTrack,移除了共享变量。之前,多个ByteTrack实例会共享某些数据,需要频繁使用tracker.reset()。(#1603), (#1528) - 修复了
MeanAveragePrecision中class_agnostic设置无效的问题。(#1577) hacktoberfest -
从我们的CI系统中移除了欢迎工作流。(#1596)
-
对
ByteTrack进行大规模重构:将STrack移至单独的类,移除了冗余的BaseTrack类,删除了未使用的变量(#1603) - 对
RichLabelAnnotator进行了大规模重构,使其内容与LabelAnnotator保持一致。(#1625)
0.24.0 2024年10月4日¶
import supervision as sv
from supervision.metrics import F1Score
predictions = sv.Detections(...)
targets = sv.Detections(...)
f1_metric = F1Score()
f1_result = f1_metric.update(predictions, targets).compute()
print(f1_result)
print(f1_result.f1_50)
print(f1_result.small_objects.f1_50)
-
新增食谱:使用SAHI进行小物体检测。本食谱提供了关于使用
InferenceSlicer进行小物体检测的详细指南。#1483 -
增强版
LineZoneAnnotator,现在可以让标签与线条对齐,即使线条不是水平状态。此外,您现在可以禁用文本背景,并选择将标签绘制在偏离中心的位置,这样可以最大限度地减少多个LineZone标签之间的重叠。#854
import supervision as sv
import cv2
image = cv2.imread("<SOURCE_IMAGE_PATH>")
line_zone = sv.LineZone(
start=sv.Point(0, 100),
end=sv.Point(50, 200)
)
line_zone_annotator = sv.LineZoneAnnotator(
text_orient_to_line=True,
display_text_box=False,
text_centered=False
)
annotated_frame = line_zone_annotator.annotate(
frame=image.copy(), line_counter=line_zone
)
sv.plot_image(frame)
- 为
LineZone添加了按类别计数功能,并引入了LineZoneAnnotatorMulticlass用于可视化每个类别的计数。该功能允许跟踪穿过线条的各个类别,增强了交通监控或人群分析等用例的灵活性。#1555
import supervision as sv
import cv2
image = cv2.imread("<SOURCE_IMAGE_PATH>")
line_zone = sv.LineZone(
start=sv.Point(0, 100),
end=sv.Point(50, 200)
)
line_zone_annotator = sv.LineZoneAnnotatorMulticlass()
frame = line_zone_annotator.annotate(
frame=frame, line_zones=[line_zone]
)
sv.plot_image(frame)
- 新增
from_easyocr功能,支持将OCR识别结果集成到supervision框架中。EasyOCR 是一个开源的光学字符识别(OCR)库,能够从图像中读取文本。#1515
import supervision as sv
import easyocr
import cv2
image = cv2.imread("<SOURCE_IMAGE_PATH>")
reader = easyocr.Reader(["en"])
result = reader.readtext("<SOURCE_IMAGE_PATH>", paragraph=True)
detections = sv.Detections.from_easyocr(result)
box_annotator = sv.BoxAnnotator(color_lookup=sv.ColorLookup.INDEX)
label_annotator = sv.LabelAnnotator(color_lookup=sv.ColorLookup.INDEX)
annotated_image = image.copy()
annotated_image = box_annotator.annotate(scene=annotated_image, detections=detections)
annotated_image = label_annotator.annotate(scene=annotated_image, detections=detections)
sv.plot_image(annotated_image)
- 在
detection.utils中新增了oriented_box_iou_batch函数。该函数用于计算定向或旋转边界框(OBB)的交并比(IoU)。#1502
import numpy as np
boxes_true = np.array([[[1, 0], [0, 1], [3, 4], [4, 3]]])
boxes_detection = np.array([[[1, 1], [2, 0], [4, 2], [3, 3]]])
ious = sv.oriented_box_iou_batch(boxes_true, boxes_detection)
print("IoU between true and detected boxes:", ious)
- 扩展了
PolygonZoneAnnotator功能,允许在绘制区域时设置不透明度,通过填充具有可调节透明度的区域来提供增强的可视化效果。#1527
import cv2
from ncnn.model_zoo import get_model
import supervision as sv
image = cv2.imread("<SOURCE_IMAGE_PATH>")
model = get_model(
"yolov8s",
target_size=640,
prob_threshold=0.5,
nms_threshold=0.45,
num_threads=4,
use_gpu=True,
)
result = model(image)
detections = sv.Detections.from_ncnn(result)
已移除
PolygonZone中的frame_resolution_wh参数已被移除。
已移除
Supervision的安装方法"headless"和"desktop"已被移除,因为它们不再需要。pip install supervision[headless]将安装基础库并无害地警告不存在的额外功能。
-
Supervision 现在依赖
opencv-python而非opencv-python-headless。#1530 -
修复了COCO 101点平均精度算法,使其能正确插值精度,从而提供更精确的平均精度计算而无需对中间值进行平均处理。#1500
-
解决了构建文档时突出的各种问题。主要包括空白调整和类型不一致。更新文档以提高清晰度并修复格式问题。为
mkdocstrings-python添加了明确版本。#1549 -
启用并修复了Ruff代码格式化规则,包括避免不必要的可迭代对象分配和使用Optional作为默认可变参数等变更。#1526
0.23.0 2024年8月28日¶
import supervision as sv
from inference import get_model
image = <SOURCE_IMAGE_PATH>
icon_dog = <DOG_PNG_PATH>
icon_cat = <CAT_PNG_PATH>
model = get_model(model_id="yolov8n-640")
results = model.infer(image)[0]
detections = sv.Detections.from_inference(results)
icon_paths = []
for class_name in detections.data["class_name"]:
if class_name == "dog":
icon_paths.append(icon_dog)
elif class_name == "cat":
icon_paths.append(icon_cat)
else:
icon_paths.append("")
icon_annotator = sv.IconAnnotator()
annotated_frame = icon_annotator.annotate(
scene=image.copy(),
detections=detections,
icon_path=icon_paths
)
- 新增 #1385:
BackgroundColorAnnotator,可在检测结果的背景图像上绘制叠加层。
import supervision as sv
from inference import get_model
image = <SOURCE_IMAGE_PATH>
model = get_model(model_id="yolov8n-640")
results = model.infer(image)[0]
detections = sv.Detections.from_inference(results)
background_overlay_annotator = sv.BackgroundOverlayAnnotator()
annotated_frame = background_overlay_annotator.annotate(
scene=image.copy(),
detections=detections
)
- 新增 #1386: 在
sv.Detections.from_transformers中支持 Transformers v5 函数。这包括DetrImageProcessor方法post_process_object_detection,post_process_panoptic_segmentation,post_process_semantic_segmentation和post_process_instance_segmentation。
import torch
import supervision as sv
from PIL import Image
from transformers import DetrImageProcessor, DetrForObjectDetection
processor = DetrImageProcessor.from_pretrained("facebook/detr-resnet-50")
model = DetrForObjectDetection.from_pretrained("facebook/detr-resnet-50")
image = Image.open(<SOURCE_IMAGE_PATH>)
inputs = processor(images=image, return_tensors="pt")
with torch.no_grad():
outputs = model(**inputs)
width, height = image.size
target_size = torch.tensor([[height, width]])
results = processor.post_process_object_detection(
outputs=outputs, target_sizes=target_size)[0]
detections = sv.Detections.from_transformers(
transformers_results=results,
id2label=model.config.id2label)
- 新增 #1354: 在
sv.Detections.from_ultralytics中添加了对 Ultralytics SAM (Segment Anything Model) 的支持。本次更新期间发布了 SAM2,并已通过sv.Detections.from_sam提供支持。
import supervision as sv
from segment_anything import (
sam_model_registry,
SamAutomaticMaskGenerator
)
sam_model_reg = sam_model_registry[MODEL_TYPE]
sam = sam_model_reg(checkpoint=CHECKPOINT_PATH).to(device=DEVICE)
mask_generator = SamAutomaticMaskGenerator(sam)
sam_result = mask_generator.generate(IMAGE)
detections = sv.Detections.from_sam(sam_result=sam_result)
-
新增 #1458: 为
TriangleAnnotator和DotAnnotator添加了outline_color选项。 -
新增 #1409: 为关键点标注工具
VertexLabelAnnotator添加了text_color选项。 -
更改 #1434:
InferenceSlicer现在新增了一个overlap_wh参数,使得在处理重叠切片时更容易计算切片尺寸。 -
修复 #1448: 已解决多种标注器类型问题,支持扩展的错误处理功能。
-
修复 #1348: 引入了一种定位到特定视频帧的新方法,解决了传统定位方法失效的情况。可以通过设置
iterative_seek=True来启用此功能。
import supervision as sv
for frame in sv.get_video_frames_generator(
source_path=<SOURCE_VIDEO_PATH>,
start=60,
iterative_seek=True
):
...
- 修复 #1424:
plot_image函数现在明确表示尺寸单位是英寸。
已移除
ByteTrack中的track_buffer、track_thresh和match_thresh参数已被弃用,并从supervision-0.23.0版本开始移除。请改用lost_track_buffer、track_activation_threshold和minimum_matching_threshold参数。
已移除
从 supervision-0.23.0 版本开始,sv.PolygonZone 中的 triggering_position 参数已被移除。请改用 triggering_anchors。
已弃用
overlap_filter_strategy 在 InferenceSlicer.__init__ 中已被弃用,将在 supervision-0.27.0 版本中移除。请改用 overlap_strategy。
已弃用
overlap_ratio_wh 在 InferenceSlicer.__init__ 中已被弃用,将在 supervision-0.27.0 中移除。请改用 overlap_wh。
0.22.0 2024年7月12日¶
- 新增 #1326:
sv.DetectionsDataset和sv.ClassificationDataset功能,支持仅在需要时将图像加载到内存中(延迟加载)。
已弃用
使用参数images作为Dict[str, np.ndarray]来构建DetectionDataset已被弃用,并将在supervision-0.26.0中移除。请改用路径列表List[str]。
已弃用
DetectionDataset.images 属性已弃用,并将在 supervision-0.26.0 中移除。请改用 for path, image, annotation in dataset: 循环遍历图像,这样无需将所有图像加载到内存中。
import roboflow
from roboflow import Roboflow
import supervision as sv
roboflow.login()
rf = Roboflow()
project = rf.workspace(<WORKSPACE_ID>).project(<PROJECT_ID>)
dataset = project.version(<PROJECT_VERSION>).download("coco")
ds_train = sv.DetectionDataset.from_coco(
images_directory_path=f"{dataset.location}/train",
annotations_path=f"{dataset.location}/train/_annotations.coco.json",
)
path, image, annotation = ds_train[0]
# loads image on demand
for path, image, annotation in ds_train:
# loads image on demand
-
新增 #1296:
sv.Detections.from_lmm现在支持解析 Florence 2 模型的输出结果,扩展了处理这个大型多模态模型(LMM)输出的能力。这包括详细的目标检测、带区域建议的OCR、分割等更多功能。详情请参阅我们的 Colab notebook。 -
新增 #1232 以支持使用 Mediapipe 进行关键点检测。同时支持 legacy 和 modern 两种管道。详情请参阅
sv.KeyPoints.from_mediapipe。 -
新增 #1316:
sv.KeyPoints.from_mediapipe扩展支持Mediapipe的FaceMesh功能。这项改进允许处理来自FaceLandmarker的面部关键点,以及来自FaceMesh的遗留结果。 -
新增 #1310:
sv.KeyPoints.from_detectron2是一个新的KeyPoints方法,增加了从流行的 Detectron 2 平台提取关键点的支持。 -
新增 #1300:
sv.Detections.from_detectron2现在支持 detectron2 分割模型。生成的掩码可与sv.MaskAnnotator配合使用来显示标注。
import supervision as sv
from detectron2 import model_zoo
from detectron2.engine import DefaultPredictor
from detectron2.config import get_cfg
import cv2
image = cv2.imread(<SOURCE_IMAGE_PATH>)
cfg = get_cfg()
cfg.merge_from_file(model_zoo.get_config_file("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml"))
cfg.MODEL.WEIGHTS = model_zoo.get_checkpoint_url("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml")
predictor = DefaultPredictor(cfg)
result = predictor(image)
detections = sv.Detections.from_detectron2(result)
mask_annotator = sv.MaskAnnotator()
annotated_frame = mask_annotator.annotate(scene=image.copy(), detections=detections)
- 新增 #1277:如果您提供的字体支持某种语言的符号,
sv.RichLabelAnnotator将在您的图像上绘制这些符号。 - 其他各种标注器已进行修订,以确保与
numpy数组一起使用时具备正确的原地操作功能。此外,我们还修复了一个错误,即当原地使用sv.ColorAnnotator时,会用纯色填充方框。
import cv2
import supervision as sv
import
image = cv2.imread(<SOURCE_IMAGE_PATH>)
model = get_model(model_id="yolov8n-640")
results = model.infer(image)[0]
detections = sv.Detections.from_inference(results)
rich_label_annotator = sv.RichLabelAnnotator(font_path=<TTF_FONT_PATH>)
annotated_image = rich_label_annotator.annotate(scene=image.copy(), detections=detections)
- 新增 #1227: 增加了对以YOLO格式加载定向边界框(Oriented Bounding Boxes)数据集的支持。
import supervision as sv
train_ds = sv.DetectionDataset.from_yolo(
images_directory_path="/content/dataset/train/images",
annotations_directory_path="/content/dataset/train/labels",
data_yaml_path="/content/dataset/data.yaml",
is_obb=True,
)
_, image, detections in train_ds[0]
obb_annotator = OrientedBoxAnnotator()
annotated_image = obb_annotator.annotate(scene=image.copy(), detections=detections)
- 修复 #1312: 修复了
CropAnnotator。
已移除
BoxAnnotator已被移除,但BoundingBoxAnnotator已重命名为BoxAnnotator。使用BoxAnnotator和LabelAnnotator的组合来模拟旧的BoundingBox行为。
已弃用
名称 BoundingBoxAnnotator 已被弃用,并将在 supervision-0.26.0 中移除。它已重命名为 BoxAnnotator。
-
新增 #1290: 主要是内部变更,我们的文件工具函数现在同时支持
str和pathlib路径。 -
新增 #1340: 两种边界框格式转换的新方法 -
xywh_to_xyxy和xcycwh_to_xyxy
已移除
from_roboflow 方法由于已弃用而被移除。请改用 from_inference。
已移除
Color.white() 由于已弃用而被移除。请改用 color.WHITE。
已移除
Color.black() 由于已弃用而被移除。请改用 color.BLACK。
已移除
Color.red() 由于已弃用而被移除。请改用 color.RED。
已移除
Color.green() 由于已弃用而被移除。请改用 color.GREEN。
已移除
Color.blue() 由于已弃用而被移除。请改用 color.BLUE。
已移除
ColorPalette.default() 由于已弃用而被移除。请改用 ColorPalette.DEFAULT。
已移除
FPSMonitor.__call__ 由于已弃用而被移除。请改用属性 FPSMonitor.fps。
0.21.0 2024年6月5日¶
-
新增 #500:
sv.Detections.with_nmm功能,用于在当前目标检测结果集上执行非极大值合并。 -
新增 #1221:
sv.Detections.from_lmm允许将大型多模态模型(LMM)的文本结果解析为sv.Detections对象。目前from_lmm仅支持 PaliGemma 结果的解析。
import supervision as sv
paligemma_result = "<loc0256><loc0256><loc0768><loc0768> cat"
detections = sv.Detections.from_lmm(
sv.LMM.PALIGEMMA,
paligemma_result,
resolution_wh=(1000, 1000),
classes=["cat", "dog"],
)
detections.xyxy
# array([[250., 250., 750., 750.]])
detections.class_id
# array([0])
- 新增 #1236:
sv.VertexLabelAnnotator功能,允许使用自定义文本和颜色标注关键点骨架的每个顶点。
import supervision as sv
image = ...
key_points = sv.KeyPoints(...)
edge_annotator = sv.EdgeAnnotator(
color=sv.Color.GREEN,
thickness=5
)
annotated_frame = edge_annotator.annotate(
scene=image.copy(),
key_points=key_points
)
-
新增 #1147:
sv.KeyPoints.from_inference支持从 Inference 结果创建sv.KeyPoints。 -
新增 #1138:
sv.KeyPoints.from_yolo_nas支持从 YOLO-NAS 结果创建sv.KeyPoints。 -
新增 #1163:
sv.mask_to_rle和sv.rle_to_mask功能,支持在mask和rle格式之间轻松转换。 -
变更 #1236:
sv.InferenceSlicer允许选择重叠过滤策略 (NONE,NON_MAX_SUPPRESSION和NON_MAX_MERGE)。 -
变更 #1178:
sv.InferenceSlicer新增了对实例分割模型的支持。
import cv2
import numpy as np
import supervision as sv
from inference import get_model
model = get_model(model_id="yolov8x-seg-640")
image = cv2.imread(<SOURCE_IMAGE_PATH>)
def callback(image_slice: np.ndarray) -> sv.Detections:
results = model.infer(image_slice)[0]
return sv.Detections.from_inference(results)
slicer = sv.InferenceSlicer(callback = callback)
detections = slicer(image)
mask_annotator = sv.MaskAnnotator()
label_annotator = sv.LabelAnnotator()
annotated_image = mask_annotator.annotate(
scene=image, detections=detections)
annotated_image = label_annotator.annotate(
scene=annotated_image, detections=detections)
-
更改 #1228:
sv.LineZone使其速度提升10-20倍,具体取决于使用场景。 -
变更 #1163:
sv.DetectionDataset.from_coco和sv.DetectionDataset.as_coco新增了对游程编码(RLE)掩码格式的支持。
0.20.0 2024年4月24日¶
-
新增 #1128:
sv.KeyPoints功能,为姿态估计和更广泛的关键点检测模型提供初步支持。 -
新增 #1128:
sv.EdgeAnnotator和sv.VertexAnnotator功能,支持渲染关键点检测模型的结果。
import cv2
import supervision as sv
from ultralytics import YOLO
image = cv2.imread(<SOURCE_IMAGE_PATH>)
model = YOLO('yolov8l-pose')
result = model(image, verbose=False)[0]
keypoints = sv.KeyPoints.from_ultralytics(result)
edge_annotators = sv.EdgeAnnotator(color=sv.Color.GREEN, thickness=5)
annotated_image = edge_annotators.annotate(image.copy(), keypoints)
-
变更 #1037:
sv.LabelAnnotator通过新增corner_radius参数实现边界框圆角功能。 -
修改 #1109: 调整
sv.PolygonZone使得初始化sv.PolygonZone时不再需要frame_resolution_wh参数。
已弃用
sv.PolygonZone中的frame_resolution_wh参数已被弃用,将在supervision-0.24.0版本中移除。
-
修改 #1084:
sv.get_polygon_center以计算更精确的多边形中心点。 -
更改 #1069:
sv.Detections.from_transformers通过增加对Transformers分割模型的支持并提取类别名称值。
import torch
import supervision as sv
from PIL import Image
from transformers import DetrImageProcessor, DetrForSegmentation
processor = DetrImageProcessor.from_pretrained("facebook/detr-resnet-50-panoptic")
model = DetrForSegmentation.from_pretrained("facebook/detr-resnet-50-panoptic")
image = Image.open(<SOURCE_IMAGE_PATH>)
inputs = processor(images=image, return_tensors="pt")
with torch.no_grad():
outputs = model(**inputs)
width, height = image.size
target_size = torch.tensor([[height, width]])
results = processor.post_process_segmentation(
outputs=outputs, target_sizes=target_size)[0]
detections = sv.Detections.from_transformers(results, id2label=model.config.id2label)
mask_annotator = sv.MaskAnnotator()
label_annotator = sv.LabelAnnotator(text_position=sv.Position.CENTER)
annotated_image = mask_annotator.annotate(
scene=image, detections=detections)
annotated_image = label_annotator.annotate(
scene=annotated_image, detections=detections)
- 修复了#787:
sv.ByteTrack.update_with_detections在跟踪过程中移除分割掩码的问题。现在ByteTrack可以与分割模型一起使用。
0.19.0 2024年3月15日¶
- 新增 #818:
sv.CSVSink功能,支持将图像、视频或流式推理结果直接保存到.csv文件中。
import supervision as sv
from ultralytics import YOLO
model = YOLO(<SOURCE_MODEL_PATH>)
csv_sink = sv.CSVSink(<RESULT_CSV_FILE_PATH>)
frames_generator = sv.get_video_frames_generator(<SOURCE_VIDEO_PATH>)
with csv_sink:
for frame in frames_generator:
result = model(frame)[0]
detections = sv.Detections.from_ultralytics(result)
csv_sink.append(detections, custom_data={<CUSTOM_LABEL>:<CUSTOM_DATA>})
- 新增 #819:
sv.JSONSink功能,支持将图像、视频或流式推理结果直接保存为.json文件。
import supervision as sv
from ultralytics import YOLO
model = YOLO(<SOURCE_MODEL_PATH>)
json_sink = sv.JSONSink(<RESULT_JSON_FILE_PATH>)
frames_generator = sv.get_video_frames_generator(<SOURCE_VIDEO_PATH>)
with json_sink:
for frame in frames_generator:
result = model(frame)[0]
detections = sv.Detections.from_ultralytics(result)
json_sink.append(detections, custom_data={<CUSTOM_LABEL>:<CUSTOM_DATA>})
-
新增 #847:
sv.mask_iou_batch功能,支持计算两组掩码的交并比(IoU)。 -
新增 #847:
sv.mask_non_max_suppression允许对分割预测执行非极大值抑制(NMS)。 -
新增 #888:
sv.CropAnnotator允许用户通过放大检测区域的裁剪图来标注场景。
import cv2
import supervision as sv
from inference import get_model
image = cv2.imread(<SOURCE_IMAGE_PATH>)
model = get_model(model_id="yolov8n-640")
result = model.infer(image)[0]
detections = sv.Detections.from_inference(result)
crop_annotator = sv.CropAnnotator()
annotated_frame = crop_annotator.annotate(
scene=image.copy(),
detections=detections
)
-
更改 #827:
sv.ByteTrack.reset允许用户清除跟踪器状态,从而能够按顺序处理多个视频文件。 -
变更 #802:
sv.LineZoneAnnotator现在可以通过display_in_count和display_out_count属性来隐藏进出计数。 -
变更 #787:
sv.ByteTrack输入参数和文档字符串已更新,以提高可读性和易用性。
已弃用
sv.ByteTrack中的track_buffer、track_thresh和match_thresh参数已弃用,将在supervision-0.23.0中移除。请改用lost_track_buffer、track_activation_threshold和minimum_matching_threshold。
- 修改 #910:
sv.PolygonZone现在可以接收一个特定的锚点框列表,只有当检测目标位于这些锚点框内时才会被计数。
已弃用
sv.PolygonZone中的triggering_position参数已被弃用,将在supervision-0.23.0中移除。请改用triggering_anchors。
-
更改 #875: 标注器新增对Pillow图像的支持。现在所有supervision标注器都可以接受numpy数组或Pillow图像作为输入。它们会自动检测图像类型,绘制标注,并以与输入相同的格式返回输出结果。
-
修复了 #944:
sv.DetectionsSmoother从sv.Detections中移除tracking_id的问题。
0.18.0 2024年1月25日¶
- 新增 #720:
sv.PercentageBarAnnotator支持用百分比值标注图像和视频,用于表示置信度或其他自定义属性。
>>> import supervision as sv
>>> image = ...
>>> detections = sv.Detections(...)
>>> percentage_bar_annotator = sv.PercentageBarAnnotator()
>>> annotated_frame = percentage_bar_annotator.annotate(
... scene=image.copy(),
... detections=detections
... )
-
新增 #702:
sv.RoundBoxAnnotator允许使用圆角边界框标注图像和视频。 -
新增 #770:
sv.OrientedBoxAnnotator支持使用OBB(定向边界框)对图像和视频进行标注。
import cv2
import supervision as sv
from ultralytics import YOLO
image = cv2.imread(<SOURCE_IMAGE_PATH>)
model = YOLO("yolov8n-obb.pt")
result = model(image)[0]
detections = sv.Detections.from_ultralytics(result)
oriented_box_annotator = sv.OrientedBoxAnnotator()
annotated_frame = oriented_box_annotator.annotate(
scene=image.copy(),
detections=detections
)
-
新增 #696:
sv.DetectionsSmoother功能,支持在视频跟踪中对多帧检测结果进行平滑处理。 -
新增 #769:
sv.ColorPalette.from_matplotlib允许用户从Matplotlib调色板创建sv.ColorPalette实例。
>>> import supervision as sv
>>> sv.ColorPalette.from_matplotlib('viridis', 5)
ColorPalette(colors=[Color(r=68, g=1, b=84), Color(r=59, g=82, b=139), ...])
-
修改 #770:
sv.Detections.from_ultralytics添加了对OBB(定向边界框)的支持。 -
更改 #735:
sv.LineZone现在可以接受一个特定的边界框锚点列表,只有当这些锚点穿过线时才会计数检测。这个更新标志着相比之前需要所有四个角点的重要改进。用户现在可以指定单个锚点,例如sv.Position.BOTTOM_CENTER,或者任何其他定义为List[sv.Position]的锚点组合。 -
修改 #756: 将
sv.Color和sv.ColorPalette访问预定义颜色的方式从基于函数的调用 (sv.Color.red()) 改为更直观传统的基于属性的方式 (sv.Color.RED)。
已弃用
sv.ColorPalette.default() 已弃用,将在 supervision-0.22.0 中移除。请改用 sv.ColorPalette.DEFAULT。
-
变更 #769:
sv.ColorPalette.DEFAULT值,为用户提供更丰富的标注颜色集。 -
更改 #677: 将
sv.Detections.from_roboflow改为sv.Detections.from_inference,简化其功能以同时兼容 inference pip 包和 Robloflow hosted API。
已弃用
Detections.from_roboflow() 已弃用,将在 supervision-0.22.0 中移除。请改用 Detections.from_inference。
- 修复了#735:
sv.LineZone功能,现在当物体从任意方向(包括侧面)穿过线条时能准确更新计数器。这项改进实现了更精确的跟踪分析功能,例如计算道路上每条车道的单独进出数量。
0.17.0 2023年12月06日¶
-
新增 #633:
sv.PixelateAnnotator支持对图像和视频中的对象进行像素化处理。 -
新增 #652:
sv.TriangleAnnotator功能,支持使用三角形标记对图像和视频进行标注。 -
新增 #602:
sv.PolygonAnnotator功能,支持通过分割掩码轮廓对图像和视频进行标注。
>>> import supervision as sv
>>> image = ...
>>> detections = sv.Detections(...)
>>> polygon_annotator = sv.PolygonAnnotator()
>>> annotated_frame = polygon_annotator.annotate(
... scene=image.copy(),
... detections=detections
... )
>>> from supervision.assets import download_assets, VideoAssets
>>> download_assets(VideoAssets.VEHICLES)
"vehicles.mp4"
-
新增 #605:
Position.CENTER_OF_MASS功能,允许将标签放置在分割掩码的质量中心位置。 -
新增 #651:
sv.scale_boxes功能,支持缩放sv.Detections.xyxy数值。 -
新增 #637:
sv.calculate_dynamic_text_scale和sv.calculate_dynamic_line_thickness功能,允许文本缩放比例和线条粗细匹配图像分辨率。 -
新增 #620:
sv.Color.as_hex功能,支持提取HEX格式的颜色值。 -
新增 #572:
sv.Classifications.from_timm支持从 timm 模型加载分类结果。 -
新增 #478:
sv.Classifications.from_clip支持从 clip 模型加载分类结果。 -
新增 #571:
sv.Detections.from_azure_analyze_image功能,支持从 Azure Image Analysis 加载检测结果。 -
变更 #646: 将
sv.BoxMaskAnnotator重命名为sv.ColorAnnotator。 -
更改 #606:
sv.MaskAnnotator使其运行速度提升5倍。 -
修复 #584:
sv.DetectionDataset.from_yolo现在会忽略标注文件中的空行。 -
修复 #555:
sv.BlurAnnotator在模糊检测前修剪负坐标的问题。 -
修复 #511:
sv.TraceAnnotator现在会正确遵循轨迹位置。
0.16.0 2023年10月19日¶
-
新增 #422:
sv.BoxMaskAnnotator允许使用方框遮罩标注图像和视频。 -
新增 #433:
sv.HaloAnnotator功能,支持为图像和视频添加光晕效果的标注。
>>> import supervision as sv
>>> image = ...
>>> detections = sv.Detections(...)
>>> halo_annotator = sv.HaloAnnotator()
>>> annotated_frame = halo_annotator.annotate(
... scene=image.copy(),
... detections=detections
... )
-
新增 #466:
sv.HeatMapAnnotator支持使用热力图对视频进行标注。 -
新增 #492:
sv.DotAnnotator功能,支持用点标注图像和视频。 -
新增 #449:
sv.draw_image功能,允许以指定的透明度和尺寸将图像绘制到给定场景上。 -
新增 #280:
sv.FPSMonitor用于监控每秒帧数(FPS)以评估延迟性能。 -
变更 #482:
sv.LineZone.trigger现在返回Tuple[np.ndarray, np.ndarray]。第一个数组表示哪些检测从外向内越过了线。第二个数组表示哪些检测从内向外越过了线。 -
更改 #465: 将注释器参数名称从
color_map: str改为color_lookup: ColorLookup枚举以提高类型安全性。 -
变更 #426:
sv.MaskAnnotator现在支持2倍速的标注。 -
修复 #477: Poetry 环境定义允许正确的本地安装。
-
修复 #430:
sv.ByteTrack现在会在svDetections为空时返回np.array([], dtype=int)。
已弃用
sv.Detections.from_yolov8 和 sv.Classifications.from_yolov8 已被替换为 sv.Detections.from_ultralytics 和 sv.Classifications.from_ultralytics。
0.15.0 2023年10月5日¶
-
新增 #170:
sv.BoundingBoxAnnotator功能,支持使用边界框标注图像和视频。 -
新增 #170:
sv.BoxCornerAnnotator功能,允许仅使用边界框角点来标注图像和视频。 -
新增 #170:
sv.MaskAnnotator功能,支持使用分割掩码对图像和视频进行标注。 -
新增 #170:
sv.EllipseAnnotator功能,支持使用椭圆标注图像和视频(运动比赛风格)。 -
新增 #386:
sv.CircleAnnotator功能,支持在图像和视频上添加圆形标注。 -
新增 #354:
sv.TraceAnnotator功能,支持在视频上绘制移动物体的运动轨迹。 -
新增 #405:
sv.BlurAnnotator支持对图像和视频中的对象进行模糊处理。
>>> import supervision as sv
>>> image = ...
>>> detections = sv.Detections(...)
>>> bounding_box_annotator = sv.BoundingBoxAnnotator()
>>> annotated_frame = bounding_box_annotator.annotate(
... scene=image.copy(),
... detections=detections
... )
-
新增 #354: Supervision 使用 示例。您现在可以学习如何使用 Supervision 进行交通流量分析。
-
变更 #399:
sv.Detections.from_roboflow现在不再需要指定class_list。可以直接从 inference 响应中提取class_id值。 -
变更 #381:
sv.VideoSink现在允许自定义输出编解码器。 -
变更 #361:
sv.InferenceSlicer现在可以在多线程模式下运行。 -
修复 #348:
sv.Detections.from_deepsparse现在可以处理空的 deepsparse 结果对象。
0.14.0 2023年8月31日¶
- 新增 #282: 支持使用
sv.InferenceSlicer进行SAHI推理技术。
>>> import cv2
>>> import supervision as sv
>>> from ultralytics import YOLO
>>> image = cv2.imread(SOURCE_IMAGE_PATH)
>>> model = YOLO(...)
>>> def callback(image_slice: np.ndarray) -> sv.Detections:
... result = model(image_slice)[0]
... return sv.Detections.from_ultralytics(result)
>>> slicer = sv.InferenceSlicer(callback = callback)
>>> detections = slicer(image)
-
新增 #297:
Detections.from_deepsparse功能,实现与 DeepSparse 框架的无缝集成。 -
新增 #281:
sv.Classifications.from_ultralytics功能,实现与 Ultralytics 框架的无缝集成。这将使您能够将supervision与Ultralytics支持的所有模型一起使用。
已弃用
sv.Detections.from_yolov8 和 sv.Classifications.from_yolov8 现已弃用,将在 supervision-0.16.0 版本发布时移除。
-
新增 #341: 首个supervision使用示例脚本,展示如何使用YOLOv8 + Supervision检测和跟踪视频中的对象。
-
变更 #296:
sv.ClassificationDataset和sv.DetectionDataset现在使用图像路径(而非图像名称)作为数据集键。 -
修复 #300:
Detections.from_roboflow过滤掉少于3个点的多边形。
0.13.0 2023年8月8日¶
- 新增 #236: 支持通过
sv.MeanAveragePrecision计算目标检测模型的平均精度均值(mAP)。
>>> import supervision as sv
>>> from ultralytics import YOLO
>>> dataset = sv.DetectionDataset.from_yolo(...)
>>> model = YOLO(...)
>>> def callback(image: np.ndarray) -> sv.Detections:
... result = model(image)[0]
... return sv.Detections.from_yolov8(result)
>>> mean_average_precision = sv.MeanAveragePrecision.benchmark(
... dataset = dataset,
... callback = callback
... )
>>> mean_average_precision.map50_95
0.433
-
新增 #256: 支持通过
sv.ByteTrack实现基于 ByteTrack 的目标跟踪功能。 -
新增 #222:
sv.Detections.from_ultralytics功能,实现与 Ultralytics 框架的无缝集成。这将使您能够在所有 Ultralytics 支持的 models 上使用supervision。
已弃用
sv.Detections.from_yolov8 现已弃用,并将在 supervision-0.15.0 版本发布时移除。
-
新增 #191:
sv.Detections.from_paddledet功能,实现与 PaddleDetection 框架的无缝集成。 -
新增 #245: 支持通过
sv.DetectionDataset.加载 PASCAL VOC 语义分割数据集。
0.12.0 2023年7月24日¶
Python 3.7. 支持已终止
随着supervision-0.12.0版本的发布,我们将终止对Python 3.7的官方支持。
- 新增 #177: 初步支持使用
sv.ConfusionMatrix进行目标检测模型基准测试。
>>> import supervision as sv
>>> from ultralytics import YOLO
>>> dataset = sv.DetectionDataset.from_yolo(...)
>>> model = YOLO(...)
>>> def callback(image: np.ndarray) -> sv.Detections:
... result = model(image)[0]
... return sv.Detections.from_yolov8(result)
>>> confusion_matrix = sv.ConfusionMatrix.benchmark(
... dataset = dataset,
... callback = callback
... )
>>> confusion_matrix.matrix
array([
[0., 0., 0., 0.],
[0., 1., 0., 1.],
[0., 1., 1., 0.],
[1., 1., 0., 0.]
])
-
新增 #173:
Detections.from_mmdetection功能,实现与 MMDetection 框架的无缝集成。 -
修改 #180: 将打包方法从
setup.py改为pyproject.toml。 -
修复了 #188: 当存在没有标注的图像时,
sv.DetectionDataset.from_cooc无法加载的问题。 -
修复 #226:
sv.DetectionDataset.from_yolo无法加载背景实例的问题。
0.11.1 2023年6月29日¶
- 修复 #165:
as_folder_structure无法保存作为推理结果的sv.ClassificationDataset。
0.11.0 2023年6月28日¶
- 新增 #150: 支持通过
as_coco和from_coco方法以 COCO 格式加载和保存sv.DetectionDataset。
>>> import supervision as sv
>>> ds = sv.DetectionDataset.from_coco(
... images_directory_path='...',
... annotations_path='...'
... )
>>> ds.as_coco(
... images_directory_path='...',
... annotations_path='...'
... )
- 新增 #158: 能够通过
merge方法合并多个sv.DetectionDataset。
>>> import supervision as sv
>>> ds_1 = sv.DetectionDataset(...)
>>> len(ds_1)
100
>>> ds_1.classes
['dog', 'person']
>>> ds_2 = sv.DetectionDataset(...)
>>> len(ds_2)
200
>>> ds_2.classes
['cat']
>>> ds_merged = sv.DetectionDataset.merge([ds_1, ds_2])
>>> len(ds_merged)
300
>>> ds_merged.classes
['cat', 'dog', 'person']
-
新增 #162: 为
sv.get_video_frames_generator添加了额外的start和end参数,允许仅生成视频选定部分的帧。 -
修复 #157: 从
data.yaml加载 YOLO 数据集类名不正确的问题。
0.10.0 2023年6月14日¶
- 新增 #125: 支持以文件夹结构格式加载和保存
sv.ClassificationDataset。
>>> import supervision as sv
>>> cs = sv.ClassificationDataset.from_folder_structure(
... root_directory_path='...'
... )
>>> cs.as_folder_structure(
... root_directory_path='...'
... )
-
新增 #125: 支持
sv.ClassificationDataset.split功能,允许将sv.ClassificationDataset分割为两部分。 -
新增 #110: 能够通过
sv.Detections.from_roboflow从 Roboflow API 结果中提取掩码。 -
新增 commit hash:Supervision 快速入门 notebook,您可以在其中了解更多关于 Detection、Dataset 和 Video API 的内容。
-
修改 #135: 优化了
sv.get_video_frames_generator文档以更准确地描述实际行为。
0.9.0 2023年6月7日¶
- 新增 #118: 支持通过索引、索引列表或切片来选择
sv.Detections。以下示例展示了新的选择方法。
>>> import supervision as sv
>>> detections = sv.Detections(...)
>>> len(detections[0])
1
>>> len(detections[[0, 1]])
2
>>> len(detections[0:2])
2
-
新增 #101: 支持通过
sv.Detections.from_yolov8从 YOLOv8 结果中提取掩码。以下示例演示了如何从 YOLOv8 模型推理结果中提取布尔掩码。 -
新增 #122: 支持通过
sv.crop裁剪图像。以下示例展示如何为sv.Detections中的每个检测结果获取单独的裁剪区域。 -
新增 #120: 通过
sv.ImageSink实现便捷地将多张图像保存至目录的功能。以下示例展示如何将视频每十帧保存为单独图像。
>>> import supervision as sv
>>> with sv.ImageSink(target_dir_path='target/directory/path') as sink:
... for image in sv.get_video_frames_generator(source_path='source_video.mp4', stride=10):
... sink.save_image(image=image)
- 修复 #106: 改进了
sv.PolygonZone坐标的不便处理方式。现在sv.PolygonZone接受[[x1, y1], [x2, y2], ...]格式的坐标,这些坐标可以是整数也可以是浮点数。
0.8.0 2023年5月17日¶
- 新增 #100: 支持数据集继承。当前的
Dataset已重命名为DetectionDataset。现在DetectionDataset继承自BaseDataset。此项变更是为了确保未来不同类型计算机视觉数据集API的一致性。 - 新增 #100: 支持通过
DetectionDataset.as_yolo将数据集保存为YOLO格式。
>>> import roboflow
>>> from roboflow import Roboflow
>>> import supervision as sv
>>> roboflow.login()
>>> rf = Roboflow()
>>> project = rf.workspace(WORKSPACE_ID).project(PROJECT_ID)
>>> dataset = project.version(PROJECT_VERSION).download("yolov5")
>>> ds = sv.DetectionDataset.from_yolo(
... images_directory_path=f"{dataset.location}/train/images",
... annotations_directory_path=f"{dataset.location}/train/labels",
... data_yaml_path=f"{dataset.location}/data.yaml"
... )
>>> ds.classes
['dog', 'person']
- 新增 #102: 支持
DetectionDataset.split功能,允许将DetectionDataset分割为两部分。
>>> import supervision as sv
>>> ds = sv.DetectionDataset(...)
>>> train_ds, test_ds = ds.split(split_ratio=0.7, random_state=42, shuffle=True)
>>> len(train_ds), len(test_ds)
(700, 300)
- 修改 #100:将
DetectionDataset.as_yolo和DetectionDataset.as_pascal_voc中approximation_percentage参数的默认值从0.75改为0.0。
0.7.0 2023年5月11日¶
- 新增 #91:
Detections.from_yolo_nas功能,实现与 YOLO-NAS 模型的无缝集成。 - 新增 #86: 支持通过
Dataset.from_yolo加载 YOLO 格式的数据集。 - 新增 #84:
Detections.merge功能,用于合并多个Detections对象。 - 修复 #81:
LineZoneAnnotator.annotate没有返回标注后的帧。 - 修改 #44:
LineZoneAnnotator.annotate现在允许为进出标签使用自定义文本。
0.6.0 2023年4月19日¶
- 新增 #71: 初步支持
Dataset功能,并能够将Detections以 Pascal VOC XML 格式保存。 - 新增 #71: 新增
mask_to_polygons,filter_polygons_by_area,polygon_to_xyxy和approximate_polygon实用工具。 - 新增 #72: 支持将 Pascal VOC XML 目标检测数据集加载为
Dataset。 - 修改 #70:调整了
Detections属性的顺序,使其与__iter__元组中对象的顺序保持一致。 - 修改 #71: 将
generate_2d_mask更名为polygon_to_mask。
0.5.2 2023年4月13日¶
- 修复 #63:
LineZone.trigger函数预期接收4个值而非5个。
0.5.1 2023年4月12日¶
- 修复了
Detections.__getitem__方法未返回所选项目的掩码的问题。 - 修复了
Detections.area在处理掩码检测时崩溃的问题。
0.5.0 2023年4月10日¶
- 新增 #58:
Detections.mask以支持分割功能。 - 新增 #58:
MaskAnnotator用于简化Detections.mask标注。 - 新增 #58:
Detections.from_sam以支持原生Segment Anything Model (SAM)功能。 - 修改 #58:
Detections.area功能使其不仅适用于边界框,也适用于掩码。
0.4.0 2023年4月5日¶
- 新增 #46:
Detections.empty功能,便于创建空的Detections对象。 - 新增 #56:
Detections.from_roboflow功能,支持从Roboflow API推理结果轻松创建Detections对象。 - 新增 #56:
plot_images_grid功能,支持在单个图表中轻松绘制多张图像。 - 新增 #56: 通过
detections_to_voc_xml方法初步支持 Pascal VOC XML 格式。 - 变更 #56:
show_frame_in_notebook重构并重命名为plot_image。
0.3.2 2023年3月23日¶
- 修改 #50: 允许
Detections.class_id为None。
0.3.1 2023年3月6日¶
- 修复 #41:
PolygonZone当物体触碰到图像底部边缘时会抛出异常。 - 修复 #42: 当
Detections为空时,Detections.wth_nms方法会抛出异常。 - 修改 #36:
Detections.wth_nms支持类别无关和非类别无关的情况。
0.3.0 2023年3月6日¶
- 变更:允许
Detections.confidence为None。 - 新增:
Detections.from_transformers和Detections.from_detectron2功能,实现与Transformers和Detectron2模型的无缝集成。 - 新增:
Detections.area用于动态计算边界框面积。 - 新增:
Detections.wth_nms用于通过NMS过滤重复检测。初始实现仅支持类别无关模式。
0.2.0 2023年2月2日¶
- 新增:使用类似pandas的API进行高级
Detections过滤。 - 新增:
Detections.from_yolov5和Detections.from_yolov8功能,实现与YOLOv5和YOLOv8模型的无缝集成。
0.1.0 2023年1月19日¶
向 Supervision 问好 👋