Skip to content

build(deps): bump the python group across 1 directory with 11 updates - #8

Closed
dependabot[bot] wants to merge 1 commit into
mainfrom
dependabot/uv/python-5f6329cf03
Closed

dependabot[bot] wants to merge 1 commit into
mainfrom
dependabot/uv/python-5f6329cf03

Conversation

@dependabot

@dependabot dependabot Bot commented on behalf of github Oct 11, 2026 •

Copy link
Copy Markdown
Contributor

Bumps the python group with 11 updates in the / directory:

Package From To
typer 0.27.2 0.27.3
torch 2.14.0 2.14.1
torchvision 0.29.0 0.29.1
rfdetr 1.10.1 1.11.2
supervision 0.30.2 0.30.8
fiftyone 1.21.0 1.22.1
transformers 5.17.0 5.19.0
onnx 1.22.0 1.23.2
onnxruntime 1.29.0 1.30.0
ruff 0.16.6 0.16.10
mypy 2.3.1 2.4.0

Updates typer from 0.27.2 to 0.27.3

Release notes

Sourced from typer's releases.

0.27.3

Fixes

  • 🐛 Escape terminal control characters in error messages. PR #1972 by @​tiangolo.

Internal

Changelog

Sourced from typer's changelog.

0.27.3 (2026-10-06)

Fixes

  • 🐛 Escape terminal control characters in error messages. PR #1972 by @​tiangolo.

Internal

Commits

Updates torch from 2.14.0 to 2.14.1

Release notes

Sourced from torch's releases.

PyTorch 2.14.1 Release

This release is meant to fix the following regressions and silent correctness issues:

Silent correctness fixes

  • Fix incorrect torch.linalg.lstsq solutions on MPS for complex batched underdetermined systems (#196113), fixed by #196128
  • Fix non-orthogonal U and inaccurate small singular values from torch.linalg.svd on MPS for rank-deficient and ill-conditioned inputs (#196112), fixed by #196139 and #199063
  • Update the CUDA 13.2 Linux binaries to CUDA 13.2.2 (#196351). This NVIDIA update resolves two critical issues that could produce incorrect results (CUDA 13.2.2 release notes):
    • cuBLAS: cublasLtMatmul() could ignore tensor-wide scaling for NVFP4 matrix multiplications (introduced in CUDA 13.2 Update 1)
    • Compiler: failed thread reconvergence could leave stale or corrupted register values in kernels with nested thread divergence (present since CUDA 12.8)

Regression fixes

  • Fix torch.linalg.svd, torch.linalg.svdvals and torch.linalg.lstsq failing on MPS with a Metal pipeline-state error for inputs above 8192 elements (#195937), fixed by #195949 and #195950
  • Fix internal assert in torch.svd(out=) on MPS for complex inputs (#195822), fixed by #195872
Commits
  • 5c48869 [MPS] Fix Jacobi SVD convergence for small columns (#199086)
  • 35223a2 [release/2.14] Run the release runner-group reconcile in pytorch/pytorch (#19...
  • 41ffbc4 [release-only] Update version to 2.14.1 (#198661)
  • e8f0c01 [release/2.14] [CD] Update to CUDA 13.2.2 for Linux binaries (#198644)
  • 911665d [MPS] Cherry-pick native SVD fixes into release/2.14 (#198394)
  • See full diff in compare view

Updates torchvision from 0.29.0 to 0.29.1

Release notes

Sourced from torchvision's releases.

TorchVision 0.29.1 Release

This is a patch release, which is compatible with PyTorch 2.14.1. There are no new features added.

Packaging

  • Relax the PyTorch requirement from torch==2.14.0 to torch>=2.14. TorchVision is now ABI stable with respect to PyTorch 2.14, so it no longer pins an exact PyTorch version (#9683, cherry-pick of #9680)
Commits

Updates rfdetr from 1.10.1 to 1.11.2

Release notes

Sourced from rfdetr's releases.

v1.11.2 — Safer Threaded Inference and Training Inputs

1.11.2 hardens threaded inference, turns a silent class-name shift into an error, and fixes predict() on flipped frames.

  • Threads sharing one model no longer corrupt its weights or switch off cuDNN for the whole process.
  • A class_names list that includes the Roboflow root category now errors instead of shifting every label.
  • predict() takes frame[:, :, ::-1], so the docs' video, webcam and RTSP examples run as written.
  • YOLO data.yaml files load consistently: class IDs sort numerically and images/train layouts work.
  • ONNX exports run faster through Apple's CoreML: Nano drops from 9.3 to 8.3 ms on an M4 Max with ONNX Runtime 1.30.

Upgrading from 1.11.1 means one removed constant: inline ["images", "labels"] if you imported REQUIRED_DATA_SUBDIRS. Four behaviour changes are worth a skim in the Migration guide.

✨ Spotlights

Threads sharing a model could corrupt its weights

A cold model's weights move from CPU to the accelerator on first use (predict(), inference(), and export()'s restore step), and several threads could run that move at once. On a cold RF-DETR segmentation model, four threads calling predict() together left 13 of 573 state_dict tensors corrupted. Nothing raised, and every frame came back with no detections. The check and the move now happen under a per-model lock, so a thread that arrives mid-move waits for it. (#1564)

from concurrent.futures import ThreadPoolExecutor
model = RFDETRSegNano()  # cold: weights still on CPU
with ThreadPoolExecutor(max_workers=4) as pool:
detections = list(pool.map(model.predict, frames))

Segmentation threads no longer disable cuDNN for everyone

The segmentation head wraps its depthwise convolution in torch.backends.cudnn.flags(enabled=False). That flag is process-global and not thread-safe: a second thread entering mid-scope saved False and restored it last, so every later convolution in the process quietly skipped cuDNN. Detections near the score threshold changed (25 instead of 24 on one real frame). Forward and backward scopes now share a lock, and a CPU input skips them entirely. No code change on your side. (#1565)

A root category in class_names is now an error

Roboflow COCO exports list a top-level category first, such as animals above cat, dog and horse. Since 1.9.2 it isn't one of the model's classes, so a list built from every category gave each class its neighbour's name, in checkpoints and in predict() output, with no warning. RFDETR.train() now compares class_names with the dataset before it writes training_config.json or starts a wandb/MLflow run. (#1572)

# 1.11.1 trained, with every name shifted by one
model.train(dataset_dir=ds, class_names=["animals", "cat", "dog", "horse"])
1.11.2 raises ValueError naming the extra entry; pass the real classes
model.train(dataset_dir=ds, class_names=["cat", "dog", "horse"])

predict() accepts flipped frames

frame[:, :, ::-1], the BGR-to-RGB flip in the video file, webcam and RTSP examples of docs/learn/pretrained.md, is a negative-stride NumPy view, and torch.from_numpy rejects those. The examples raised ValueError: At least one stride in the given numpy array is negative on the first frame. Only arrays with a negative stride get copied now. (#1573)

detections = model.predict(frame[:, :, ::-1])

REQUIRED_DATA_SUBDIRS is gone

... (truncated)

Changelog

Sourced from rfdetr's changelog.

Changelog

All notable changes to RF-DETR are documented here.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

[Unreleased]

Breaking Changes

  • format="coreml" with coreml_precision="float16" now returns float32 output arrays; the .mlpackage returned float16 outputs before, because it was converted as an iOS 16 program and is now converted as iOS 15. A consumer that reads the outputs as float16 (a typed buffer, a dtype check) must read float32. coreml_precision="float32" bundles are unchanged. (#1024)

  • Removed rfdetr.datasets.yolo.REQUIRED_DATA_SUBDIRS. is_valid_yolo_dataset resolves split directories through the YAML-aware resolver, which derives the labels directory from the resolved images path, so the constant no longer described how any code finds a split's subdirectories. Nothing inside the package read it; an external importer should inline ["images", "labels"]. (#1570)

  • rfdetr[onnx] no longer installs polygraphy or onnx_graphsurgeon, so a host that exports to TensorRT or TFLite with rfdetr[onnx] plus a separately installed tensorrt or onnx2tf must install the missing package itself; see the matching entry under Removed. (#1588)

  • A custom Affine(translate_px=...) config on the Kornia augmentation backend behaves differently from 1.11.2. That release ignored translate_px: the config built, never shifted the image and, when rotate was omitted, rotated it by a random ±15°. The shift is now applied, the implicit rotation is gone, and combinations Kornia cannot reproduce, such as rotation, scale, shear, a nonzero fill or reflected borders, raise ValueError when the pipeline is built. Pass augmentation_backend="cpu" (Albumentations, rfdetr[augment]) to keep them; augmentation_backend="auto" resolves to Kornia on a CUDA machine with Kornia installed. The fix itself is listed under Fixed.

Added

  • Keypoint training accepts Kornia augmentation on CUDA. The default backend remains cpu; users can select kornia/gpu explicitly, or select auto to use Kornia when available. Image geometry, boxes, padding masks and keypoints share each augmentation draw; keypoint visibility, dropped instances and paired-joint flips stay synchronized. (#1606)

  • TrainConfig.eval_backend="hotcoco_streaming" matches each validation batch with hotcoco's StreamingEval as it arrives, so the end-of-epoch COCO evaluation only accumulates and summarizes. Metrics are bit-identical to eval_backend="hotcoco". On an Apple M-series CPU with synthetic data, the end-of-epoch step dropped from 0.238 s to 0.025 s for 600,000 box detections and from 0.178 s to 0.005 s for a bbox+segm run of 20,000 detections. Total CPU time is higher for box-only runs (1.05 s vs 0.29 s) and about equal for bbox+segm (0.66 s vs 0.71 s), because matching moves into the validation step. Streaming applies to single-process runs whose labels fall within [0, num_classes]; under DDP, or after the metric is pickled mid-epoch, it evaluates in one batch as "hotcoco" does and logs why.

  • format="coreml" now embeds notes in the .mlpackage metadata (MLModel.user_defined_metadata, key rfdetr_notes, encoded as in the ONNX export) instead of warning and dropping it, and stamps the RF-DETR version under rfdetr_version. (#1024)

  • rfdetr.RFDETRAtto, rfdetr.RFDETRFemto and rfdetr.RFDETRPico: real-time detection models with a PE-Core-T backbone, provided by rfdetr_plus like the XLarge models (pip install "rfdetr[plus]", Platform Model License 1.0). RFDETR.from_checkpoint() resolves their checkpoints; an outdated rfdetr_plus raises an upgrade hint, and a broken rfdetr_plus install no longer blocks loading core checkpoints.

  • rfdetr.models.backbone.register_backbone(encoder, backbone_cls): an extension package can provide a non-DINOv2 encoder for a ModelConfig.encoder name by subclassing Backbone and overriding _build_encoder. A registered encoder that defines set_export_shape(shape) gets its position embeddings frozen for export, like DINOv2.

  • ModelConfig.dim_feedforward (default 2048) sets the decoder feed-forward width.

  • RFDETRModelModule(..., load_encoder_weights=False) skips fetching the encoder's upstream pretrained weights when every weight is replaced right after construction; the default True keeps the previous behaviour. RFDETR.evaluate() passes it.

  • RFDETR.export(format="tensorrt", quantization="int8", calibration_data=...) builds an INT8 TensorRT engine (*_int8.trt) for detection models. INT8 covers every backbone MLP, the decoder's cross-attention, feed-forward and reference-point layers, and the windowed backbone blocks' attention with its projections up to 325 tokens per window (Nano, Small, Medium; Large keeps it FP16, where INT8 attention ran no faster and cost 1.0 AP); the patch embedding, the global backbone blocks' attention, the decoder self-attention, the projector, the two-stage head and the detection heads stay FP16. Activation ranges come from running calibration_data through the FP32 graph with onnxruntime on the CPU: a directory of images (the first max_images by file name), a .npy path or an (N, C, H, W) float array; host memory grows with batch_size (about 9.5 GB for Nano at batch 32). On a Tesla T4 with TensorRT 11.3 at batch 1 from a CUDA graph, INT8 is 1.21× (Nano), 1.16× (Small), 1.16× (Medium) and 1.11× (Large) faster than FP16 for 0.55 to 0.85 AP (1.0% to 1.6%), and Nano is 1.28× faster at batch 8 and 32; the T4 INT8 engines are larger than FP16 for Large at batch 1 and for Nano at batch 4, 8 and 32 (cause not diagnosed; see the docs). On an RTX 5070 with TensorRT 11.3, calibrated on 128 COCO train2017 images and scored on all 5000 val2017 images, at batch 1 replayed from a CUDA graph: Nano 1.33× faster than FP16 at −0.63 AP, Small 1.24× at −0.61, Medium 1.19× at −0.85, Large 1.10× at −0.50; Nano is 1.37× faster at batch 8 and 1.43× at batch 32. Without a CUDA graph, back-to-back execute_async_v3 calls gain 1.05–1.11× at batch 1 and 1.30× (Nano) at batch 8. The INT8 weights take 32 MB against 54 MB on Nano (41 against 62 MB engines at batch 1); on the RTX 5070 both engines also store a zero block TensorRT adds for the 3-channel input, chosen per build, so sizes at large batches vary between builds. The engine needs a static batch, fp16=True and TensorRT 10 or newer. Segmentation and keypoint models, dynamic_batch=True and backbone_only=True are refused rather than built unmeasured. (#1024)

  • Public rfdetr.export.inference exposes TRTInference, load_executorch_method, preprocess_to_nchw, decode_detections and DecodedDetections next to OpenVINOInference; each resolves lazily, so importing the module does not require an optional runtime. (#1585)

  • Public rfdetr.export.benchmark exposes measure_latency, measure_memory, BenchmarkResult and MemoryResult, the helpers the per-hardware export cookbooks use. (#1585)

  • TRTInference(cuda_graph=True) (rfdetr.export.inference.TRTInference; python -m rfdetr.export.benchmark does not expose it) captures the engine's launch into a CUDA graph on the first call and replays it on every later call, which removes most of the per-call launch cost at small batch sizes. It is off by default. Measured as wall-clock time per call, including the copy of the input, against the same engine run with sync_mode=True (3 x 1000 calls, minimum of the medians, RTX 5070 under WSL2): with TensorRT 10.16 a Nano FP16 engine took 1.65 ms at batch 1 and a replay 0.99 ms (1.67x faster), Small 2.10 ms and 1.49 ms (1.41x); at batch 8 the gain was 1.09x for Nano and 1.05x for Small. With TensorRT 11.3 Nano gained 1.71x and Small 1.42x at batch 1. The default async path, which needs pycuda, was not measured. The outputs matched the plain call (bit for bit on the engines measured; repo tests check within 1e-3). Only an engine whose optimization profile fixes every input shape, the batch included, is accepted, so a runtime keeps one graph: an engine exported with dynamic_batch=True, or one whose image size varies, is refused with a ValueError at construction, because captured graphs would share one execution context that a change of shape modifies between replays, which TensorRT documents as undefined behaviour. The graph held 0.57 to 0.73 MiB of device memory and 1.6 to 2.1 MiB of host memory on the Nano and Small engines measured. A runtime is not safe to call from several threads. The option uses its own torch stream, so it does not need pycuda, and it raises instead of falling back when combined with sync_mode=True or when the engine cannot be captured. (#1583)

  • RFDETR.export(format="tensorrt", trt_metadata=True) writes <engine>.json next to the engine. It lists what a program needs to run the engine without importing the model: the input name, size, layout and normalization (RGB order, divide by 255, mean and std, and the resize method), the output names in order, the batch profile (static size or dynamic min/opt/max), the precision actually built, the opset, the TensorRT version and GPU, notes, and the engine file's size and SHA-256, so a consumer can check that the description file belongs to the engine it loads. A .trt file has no slot for this, so a C++, Triton or DeepStream consumer had to be told by hand, and notes only reached the intermediate ONNX. The file is written atomically and, on Linux and macOS where permitted, takes the engine's permission bits and group. When a build writes no description file (the option off, or TensorRTExporter.build_engine), an earlier description file with the same name is reported with a warning, never deleted. Class names and the background slot are not recorded yet. Off by default; other formats warn and ignore it. (#1024)

  • RFDETR.export(format="tensorrt") takes trt_hardware_compatibility ("ampere_plus" or "same_compute_capability") and trt_version_compatible=True. They ask TensorRT for an engine that other GPUs, or other releases of the same TensorRT major version, may load; every engine used to be tied to the GPU and TensorRT version that built it. We had one GPU, so running on a second one is untested. Version compatibility worked between TensorRT 11.2 and 11.3 in both directions, and didn't work across major versions or between 10.13 and 10.16. It needs TensorRT's lean runtime package, which the pip wheels don't include; without it the export stops early with an ImportError that names it. On an RTX 5070 with TensorRT 11.3 (static-batch RFDETRNano fp16, median of fresh-process build_engine calls, latency from CUDA events): "ampere_plus" took 130 s to build instead of 38 s, made a 99 MB engine instead of 62 MB and ran 10.9% slower (RFDETRSmall: 9.6%); "same_compute_capability" cost nothing measurable; trt_version_compatible added 105 MB and ran as fast (within 1%). COCO AP stayed within build-to-build noise for every option. A portable engine gets its own file name suffix, so it doesn't overwrite a default engine (unless output_name is set). TRTInference and rfdetr.export.benchmark take engine_host_code_allowed (off by default), which a TensorRT 11 version-compatible engine needs because it carries host code. Both options are off by default; other formats warn and ignore them. (#1024)

  • RFDETR.inference(compile_backend="cudagraph") adds an opt-in direct CUDA Graph replay backend for fixed batch size and resolution. It freezes the TorchScript trace, captures its forward once, and clones graph-owned outputs so later calls cannot overwrite earlier results; the default remains "torchscript", and compile=True on a non-CUDA device raises ValueError. On one NVIDIA L4 VM with RF-DETR Nano, FP16, batch 1, and the public PIL-image predict() path, seven sequential fresh-process paired runs reduced median end-to-end latency from 9.719 ms to 3.884 ms (60.03% lower, 2.50x throughput; paired throughput range 2.43-2.57x). Total setup took a 7.37 s median and graph capture added 29.1 MiB of allocated CUDA memory over the retained trace in the benchmark. One full COCO val2017 pass produced exactly the same AP/AP50 (0.480240/0.671360), with 1.5 million ranked detections per arm; its descriptive, single-process median predict() latency was 9.887 ms versus 4.051 ms. (#1547)

  • RFDETR.predict() accepts a keyword-only antialias flag (default False, unchanged behaviour). Pass antialias=True for checkpoints trained with torchvision resizing; exported models still resize without antialiasing. On MPS with PyTorch older than 2.7, antialiased resizing runs on the CPU. (#1525)

... (truncated)

Commits
  • 7433d59 releasing 1.11.2
  • f08cb6a docs(export): realign table, drop mAP claim
  • 923ae68 docs(cookbooks): align latency tiers, prep 1.11.2 (#1594)
  • 2f0d3dc docs(export): split guide into three pages; fix cookbook TOC (#1591)
  • 51db63b fix(inference): accept negative-stride NumPy views in predict() (#1573)
  • c58996b fix(io): keep atomically written files readable under the process umask (#1582)
  • 43fab61 fix(training): reject class_names that start with a Roboflow root category ...
  • 87442b9 fix(datasets): normalize YOLO class IDs across class-name entry points (#1571)
  • 35e66ca fix(datasets): recognize existing YAML-resolved YOLO layouts (#1570)
  • a1c04ad fix(keypoints): preserve identities across repeated horizontal flips (#1569)
  • Additional commits viewable in compare view

Updates supervision from 0.30.2 to 0.30.8

Release notes

Sourced from supervision's releases.

supervision-0.30.8

v0.30.8 — Sharper video, cleaner labels

Video, YOLO labels, masks, VLM parsing and mAP all get more accurate.

  • VideoSink keeps OpenCV's video quality when OpenCV isn't installed.
  • from_yolo reads pose labels as boxes instead of polygons.
  • MeanAveragePrecision scores class-agnostic runs right when only one side has class IDs.
  • from_vlm returns one Florence-2 detection per object, not one per polygon.
  • from_inference masks no longer drift up to a pixel up and left.

Drop-in upgrade. Without OpenCV, videos get larger; YOLO labels with a negative width or height now raise ValueError.

✨ Spotlights / highlights

sv.VideoSink and sv.process_video keep quality without OpenCV

The PyAV fallback left the encoder bit rate unset, so mp4v and MJPG files came out at under half of what cv2.VideoWriter writes. It now uses OpenCV's rate settings for every codec except H.264. Files get larger and vp09 may encode more slowly; codec="avc1" keeps files small where an H.264 encoder is available. (#2661)

import supervision as sv
video_info = sv.VideoInfo.from_video_path("in.mp4")
with sv.VideoSink("out.mp4", video_info) as sink:  # OpenCV not installed
for frame in sv.get_video_frames_generator("in.mp4"):
sink.write_frame(frame)
before: mp4v written at under half OpenCV's bit rate, visibly softer
now:    same bit rate OpenCV's writer uses

YOLO pose labels load as boxes

A pose row is a box followed by keypoints. from_yolo used to parse the whole row as a polygon, giving wrong boxes and masks nobody asked for. It now reads the box and skips the keypoints that kpt_shape declares. (#2655)

ds = sv.DetectionDataset.from_yolo(
    images_directory_path="pose/images",
    annotations_directory_path="pose/labels",
    data_yaml_path="pose/data.yaml",  # kpt_shape: [17, 3]
)
# before: polygon-parsed boxes and masks
# now:    one box per row

Class-agnostic mAP with one-sided class IDs

A perfect match scored zero when only one side carried class IDs, such as SAM proposals checked against labeled ground truth. With class_agnostic=True, both sides now count as one class.

One Florence-2 detection per object (#2648)

... (truncated)

Changelog

Sourced from supervision's changelog.

0.30.8 Oct 6, 2026

  • sv.Detections.from_vlm with sv.VLM.QWEN_2_5_VL or sv.VLM.QWEN_3_VL now recovers complete detections from a response cut off before its closing ], such as inside the last box's bbox_2d array or right after a complete object. The parser cut the text at its last ], which in a cut-off response can sit before the last complete object's closing }, so that object was dropped: two complete detections returned one. Recovery now reads the text before that cut, then the cut text if that fails. A } inside the cut-off object's label can still drop the detection before it. (#2666)
  • sv.DetectionDataset.from_yolo now raises a ValueError naming the malformed annotation line. A line with fewer than five tokens gave a class id but no box and failed with operands could not be broadcast together with shapes (0,) (4,), or, when the file also held valid rows, a class_id shape error blaming the wrong column. With is_obb=True, a line that was not nine tokens failed with an array shape or length error. A non-numeric token is reported with the token and file name. (#2665)
  • sv.DetectionDataset.from_yolo now rejects a label with a negative width or height, which built a box with x_min past x_max: box_iou_batch scored two boxes covering the identical region at 0.0, with_nms stopped suppressing, and Detections.area went negative when only one extent was negative. The error names the annotation file. sv.DetectionDataset.as_yolo now orders the corners of a reversed Detections box before measuring width and height, so it no longer exports a file the loader refuses; the box describes the same rectangle and normal boxes are unchanged. (#2663)
  • sv.VideoSink and sv.process_video now write video at OpenCV's quality when OpenCV is not installed. The PyAV fallback left the bit rate unset, so mp4v, the default codec, and MJPG came out at well under half the bit rate cv2.VideoWriter uses, at visibly lower quality. The fallback now sets the bit rate, rate tolerance, minimum quantizer and keyframe interval of OpenCV's FFmpeg writer for every codec except H.264, which already used libx264's CRF 23 default in both backends. Files grow with the bit rate, and vp09 may encode more slowly into larger files; codec="avc1" keeps files small where an H.264 encoder is available. A frame rate of zero or less now leaves the fallback writer closed, so sv.VideoSink raises RuntimeError as with OpenCV; it used to write at PyAV's default frame rate. #2661
  • sv.Detections.get_anchors_coordinates now computes axis-aligned midpoint anchors without integer overflow. Signed and unsigned boxes whose corner sums exceeded their dtype could place the anchor outside the box, affecting annotators and zone tools. Direct-corner, oriented-box and mask-centroid anchors are unchanged. (#2660)
  • sv.LineZoneAnnotator(text_orient_to_line=True) no longer raises TypeError: _flip() got an unexpected keyword argument 'flipCode' without OpenCV for lines drawn right to left. The NumPy cv2.flip fallback now uses OpenCV's parameter names src and flipCode, and accepts any positive or negative flip code instead of raising ValueError for codes other than 0, 1 and -1. Behavior with OpenCV is unchanged. (#2659)
  • sv.DetectionDataset.from_yolo now reads the box of Ultralytics pose labels, a box followed by the keypoint values that kpt_shape in data.yaml declares, instead of parsing the row as a polygon, which gave wrong boxes and unrequested masks. Keypoints are skipped, as in Ultralytics. A polygon row with that same number of values, with or without a trailing confidence, is also read as a box. A kpt_shape other than [K, 2] or [K, 3] now raises ValueError. (#2655)
  • The Ultralytics, Inference and YOLO-NAS speed estimation examples now measure elapsed time from source-frame indices, as the RF-DETR example does. They divided the distance by the number of stored positions over the frame rate, which assumes a detection in every frame and counts N positions as N frame intervals instead of N - 1: a vehicle missed in one frame of three was reported about 44% too fast, and one detected in every frame about 4% too slow at 25 fps. Each position is now stored with its frame index, and speed is shown once the positions span at least half a second of source frames. The RF-DETR example is unchanged. (#2654)
  • examples/speed_estimation/rfdetr_example.py raised AttributeError when building its ViewTransformer, with or without OpenCV, because the private supervision._cv2 layer lacked getPerspectiveTransform and perspectiveTransform. supervision._cv2 now provides both: OpenCV's when installed, NumPy fallbacks otherwise. The fallback getPerspectiveTransform solves OpenCV's eight-equation system in float64, so it agrees with OpenCV to within OpenCV's float32 rounding of the system's product terms, not bit for bit. It raises ValueError for invalid points and an exactly singular system, but does not detect near-singular ones, where OpenCV switches to an SVD null-space solution. The fallbacks cover only OpenCV's default 2-D usage: getPerspectiveTransform takes no solveMethod, and perspectiveTransform rejects 3-D points, affine (2, 3) matrices and bool matrices. The public sv API is unchanged. (#2652)
  • sv.metrics.MeanAveragePrecision(class_agnostic=True) now treats detections without class IDs as the same class as labeled detections. A perfect match scored zero mAP when only one side supplied class IDs, such as SAM proposals against labeled ground truth. Unsigned class ID arrays no longer raise OverflowError with class_agnostic=True on NumPy 2. Class-aware scoring and the input detections are unchanged. (#2650)
  • sv.Detections.from_vlm with sv.VLM.FLORENCE_2 now returns one detection per instance for <REFERRING_EXPRESSION_SEGMENTATION> and <REGION_TO_SEGMENTATION>. Florence-2 returns each instance as a list of polygons, one per connected region, and every polygon became its own detection, so an object split in two came back as two. An instance's polygons are now merged into one mask with one box around all of them. Single-polygon instances load as before. Polygons with fewer than three vertices are ignored, and an instance without a usable polygon is skipped instead of yielding an empty-mask detection or raising. (#2648)
  • sv.xyxy_to_mask now returns an empty mask for an inclusive box entirely left of or above the image when its maximum coordinate is a negative fraction; converting that coordinate to int rounded toward zero and filled pixels along the image edge. (#2646)
  • sv.Detections.from_inference now rounds polygon vertices to the nearest pixel before rasterising masks. Roboflow returns sub-pixel float vertices, and casting to int truncated them, moving each mask up and left by up to one pixel: a square with corners at 2.6 and 7.6 now fills rows and columns 3-8 instead of 2-7, as from_coco, from_yolo, from_labelme and from_pascal_voc load the same polygon. A NaN or infinite vertex raises ValueError, as in from_coco. RLE masks and box-only predictions are unchanged. #2649
  • sv.LineZone.trigger now ages tracker crossing history on nonempty frames whose detections lack tracker_id, as it already does on empty frames. After enough untracked frames to expire a track, reusing its ID on the other side of the line no longer creates a false crossing; a shorter gap still preserves the track's crossing state. (#2644)

0.30.7 Oct 4, 2026

  • sv.crop_image now clips finite crop coordinates outside the 32-bit integer range to the image bounds before converting them to integers. Previously, the premature int32 conversion could wrap an out-of-bounds box and return an empty crop for both NumPy and Pillow images. (#2642)
  • sv.Detections.from_transformers now accepts the semantic segmentation output returned by Transformers processors with return_segmentation_scores=True. These outputs carry a segmentation class map and per-pixel segmentation_scores, but no segments_info; the adapter previously treated every dictionary with segmentation as an instance or panoptic result and raised KeyError: 'segments_info'. The class map now follows the same path as a bare semantic tensor, while per-pixel scores remain excluded from per-detection confidence. (#2643)
  • sv.DetectionDataset.as_labelme, as_yolo, and as_pascal_voc now export annotations for in-memory grayscale images shaped (height, width) without failing on a missing channel dimension. Image dimensions and annotation coordinates are preserved, Pascal VOC records depth 1, and the source pixels are unchanged. #2641
  • sv.KeyPoints.with_nms now preserves skeletons with zero joints, including those produced by boolean keypoint filtering, instead of raising a zero-size reduction error. All aligned fields and NMS validation requirements are preserved. #2639
  • sv.metrics.MeanAveragePrecision now matches pycocotools when a class's recall lands exactly on one of the 101 recall thresholds, which happens whenever a class's ground-truth count shares a factor with 100 (10, 20, 50, 100, ...). The evaluator ports COCOeval but computed the recall thresholds and the recall tp / n in float32, where pycocotools uses float64. Float32 rounds some thresholds, such as 0.7, to the other side of the float64 recall, so precision was sampled one detection earlier than in pycocotools and mAP came out higher: 10 targets found as seven hits, ten false positives and an eighth hit scored mAP@50 0.7470 instead of 0.7415, and random classes of 100 targets differed in 29 of 30 trials, by up to 0.007 mAP@50. The IoU and recall thresholds, the IoUs and the recall are now float64, as in pycocotools; box and mask IoUs (the latter now divided from pixel counts in float64) moved with the thresholds so an IoU equal to a threshold still matches at it. Scores whose recall never lands on a threshold are unchanged. (#2638)
  • sv.process_video now raises instead of hanging forever when a processed frame cannot be written. Once VideoSink.write_frame raised, the unguarded writer thread died while the main loop kept filling the bounded writer_buffer queue until it blocked the call with no timeout. Without OpenCV, the PyAV writer raises for every frame that is not a uint8 array of the source video's shape, so a callback that resizes or crops frames hung the call after writer_buffer frames. Writer shutdown now waits for queued frames and any active write before releasing VideoSink, then raises the first write error as RuntimeError("Writer thread raised: ...") from the original exception, like reader errors; the shutdown marker is queued even when the bounded queue is full. A callback returning None (for example, one that forgets to return the annotated frame) was taken by the writer as its end-of-stream marker and hung the call the same way with either backend; it now raises TypeError naming the frame. Callbacks that return a frame the writer accepts are unaffected. (#2636)
  • sv.DetectionDataset.as_yolo, as_pascal_voc, as_coco, as_createml and as_labelme can now export into the folder the dataset's images were loaded from. The image copy step called shutil.copyfile onto the file itself and failed with shutil.SameFileError before any annotation was written, so a dataset could not be re-saved in place, for example a COCO dataset whose images and _annotations.coco.json share one folder, as in the from_coco example. An image that is already at its destination is now left where it is and the annotations are written, as sv.ClassificationDataset.as_folder_structure already does. Exports into another folder, and images held in memory, are unchanged. (#2637)
  • sv.DetectionDataset.as_labelme now gives disconnected components of one mask a shared group ID. sv.DetectionDataset.from_labelme combines shapes with the same label and non-null group ID, including 0, into one detection with a union mask and enclosing box. Ungrouped shapes and distinct labels or groups remain separate, preserving instance membership through a LabelMe round trip. #2640

0.30.6 Sep 29, 2026

  • sv.VertexEllipseHaloAnnotator now draws the whole halo of a key point whose covariance ellipse is not horizontal. The fade box was sized from the ellipse's semi-axes as if the major axis always ran along the image x axis, so a vertical or diagonal ellipse was clipped to a thin band — a 20 x 1 px ellipse at 90° drew 6 px tall instead of 39 px. The box now covers the rotated ellipse, matching sv.VertexEllipseOutlineAnnotator and sv.VertexEllipseAreaAnnotator. Horizontal ellipses are unchanged. (#2634)
  • sv.KeyPoints.from_ultralytics, .from_inference and .from_detectron2 now keep each object's detection score as detection_confidence instead of dropping it. Without it, sv.KeyPoints.with_nms raised ValueError: KeyPoints detection_confidence must be given for NMS to be executed., and as_detections() reported the mean key point confidence instead of the model's score, unlike sv.Detections.from_ultralytics / from_inference on the same result. For Inference, a batch with any missing or null prediction confidence still loads detection_confidence=None for every row, falling back to the keypoint-mean. (#2633)
  • sv.DetectionDataset.as_yolo and .as_pascal_voc now write a detection whose mask is empty or has no valid contour as its bounding box instead of silently omitting it. from_coco gives an all-zero mask to any annotation missing segmentation when a sibling has one, and to all annotations when force_masks=True, so a mixed polygon/box COCO dataset lost its box-only objects on export and a box-only dataset loaded with force_masks=True wrote empty label files. as_labelme already fell back to the box. Masks with valid contours remain polygons unless min_image_area_percentage/max_image_area_percentage filters them out; area-filtered contours remain omitted. (#2631)
  • sv.DetectionsSmoother no longer raises ValueError: Conflicting metadata when a track first appears on a different frame than an earlier one while detections carry per-frame metadata (e.g. the source_image attached by RF-DETR/inference connectors); the documented RF-DETR + tracker + smoother pipeline crashed as soon as a second object entered the video. Smoothed tracks are now built on their current-frame detection: metadata reflects the current frame, and class_id/data fields like class_name follow it instead of lagging up to length - 1 frames behind a class change. xyxy, confidence, and oriented-box corners are still averaged as before. (#2628)
  • The published-docs tracking backfill now adds utm.js before </body> on legacy pages that predate segment.js. Pages with segment.js keep the existing placement; pages lacking both anchors remain counted as skipped. (#2627)
  • sv.DetectionDataset.from_yolo now loads segmentation labels saved by Ultralytics with a trailing confidence or tracker id, instead of raising ValueError when the extra value is reshaped as a polygon coordinate. The extra value is ignored, as for box labels; polygon geometry and masks are unchanged. Coordinate-count parity is the only signal separating a trailing value from a coordinate, so a malformed odd-length polygon row with no extra field now loses its last value instead of raising. (#2626)
  • sv.IconAnnotator now draws a palette icon carrying its own alpha channel (Pillow's PA mode, storable in TIFF) instead of raising ValueError: could not broadcast input array from shape (16,16,2) into shape (16,16,3). The OpenCV-free fallback mapped only P mode to color and left PA as Pillow's raw two-channel (index, alpha) array, which nothing downstream could use; sv.draw_image rejected it with ValueError: Image must have 3 or 4 channels.. This is the file-reading counterpart of the PA fix in sv.pillow_to_cv2 (#2614), which converts an in-memory Pillow image. A palette image with alpha now expands to color like cv2.imread. Palettes without alpha, and every read with OpenCV installed, are unchanged. (#2624)
  • sv.LabelAnnotator now sizes the label background to fit a label containing a blank line (e.g. "car\n\n0.95"). The background measured a blank line as zero pixels tall while the text still drew it at full line height, so with the default text_scale and text_padding=10, the last line of that example ran 3 px past its background instead of sitting ~10 px inside it — each further blank line added another 14 px of drift. The background now reserves the same height for a blank line that the text uses. Labels without blank lines are unchanged. (#2632)
  • sv.LineZone.trigger now ignores detections whose tracker_id is negative — the value trackers such as ByteTrackTracker from the trackers package report for an unconfirmed track. These are neither counted nor given crossing state; their crossed_in/crossed_out entries are always False. Previously every unconfirmed detection keyed under the same shared id, so distinct unconfirmed objects crossing on opposite sides read as one track oscillating, silently inflating in_count/out_count with crossings no confirmed track ever made. Confirmed tracks are counted exactly as before. (#2623)
  • sv.polygon_to_mask now accepts a list/tuple/array-like of [x, y] vertices, not just a NumPy array, and returns an all-zero mask for a polygon with fewer than MIN_POLYGON_POINT_COUNT (3) vertices instead of crashing: a list raised AttributeError on .astype, an empty polygon failed inside OpenCV fillPoly, and a 1- or 2-vertex polygon silently drew a stray pixel or line. A malformed polygon (wrong shape, non-numeric dtype, ragged nesting) now raises ValueError naming the problem. sv.Detections.from_sam3 draws its 2-vertex fragments directly rather than through this function, so its behavior ([#2625](https://github.com/roboflow/supervision/issues/2625) below) is unaffected. (#2622)
  • sv.Detections.from_sam3 no longer drops SAM 3's PVS-format contour fragments with fewer than 3 vertices. Single points are now preserved directly and 2-point edges are rasterized as lines, so both contribute...

    Description has been truncated

Bumps the python group with 11 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [typer](https://github.com/fastapi/typer) | `0.27.2` | `0.27.3` |
| [torch](https://github.com/pytorch/pytorch) | `2.14.0` | `2.14.1` |
| [torchvision](https://github.com/pytorch/vision) | `0.29.0` | `0.29.1` |
| [rfdetr](https://github.com/roboflow/rf-detr) | `1.10.1` | `1.11.2` |
| [supervision](https://github.com/roboflow/supervision) | `0.30.2` | `0.30.8` |
| [fiftyone](https://github.com/voxel51/fiftyone) | `1.21.0` | `1.22.1` |
| [transformers](https://github.com/huggingface/transformers) | `5.17.0` | `5.19.0` |
| [onnx](https://github.com/onnx/onnx) | `1.22.0` | `1.23.2` |
| [onnxruntime](https://github.com/microsoft/onnxruntime) | `1.29.0` | `1.30.0` |
| [ruff](https://github.com/astral-sh/ruff) | `0.16.6` | `0.16.10` |
| [mypy](https://github.com/python/mypy) | `2.3.1` | `2.4.0` |



Updates `typer` from 0.27.2 to 0.27.3
- [Release notes](https://github.com/fastapi/typer/releases)
- [Changelog](https://github.com/fastapi/typer/blob/master/docs/release-notes.md)
- [Commits](fastapi/typer@0.27.2...0.27.3)

Updates `torch` from 2.14.0 to 2.14.1
- [Release notes](https://github.com/pytorch/pytorch/releases)
- [Changelog](https://github.com/pytorch/pytorch/blob/main/RELEASE.md)
- [Commits](pytorch/pytorch@v2.14.0...v2.14.1)

Updates `torchvision` from 0.29.0 to 0.29.1
- [Release notes](https://github.com/pytorch/vision/releases)
- [Commits](pytorch/vision@v0.29.0...v0.29.1)

Updates `rfdetr` from 1.10.1 to 1.11.2
- [Release notes](https://github.com/roboflow/rf-detr/releases)
- [Changelog](https://github.com/roboflow/rf-detr/blob/develop/CHANGELOG.md)
- [Commits](roboflow/rf-detr@1.10.1...1.11.2)

Updates `supervision` from 0.30.2 to 0.30.8
- [Release notes](https://github.com/roboflow/supervision/releases)
- [Changelog](https://github.com/roboflow/supervision/blob/develop/docs/changelog.md)
- [Commits](roboflow/supervision@0.30.2...0.30.8)

Updates `fiftyone` from 1.21.0 to 1.22.1
- [Release notes](https://github.com/voxel51/fiftyone/releases)
- [Commits](voxel51/fiftyone@v1.21.0...v1.22.1)

Updates `transformers` from 5.17.0 to 5.19.0
- [Release notes](https://github.com/huggingface/transformers/releases)
- [Commits](huggingface/transformers@v5.17.0...v5.19.0)

Updates `onnx` from 1.22.0 to 1.23.2
- [Release notes](https://github.com/onnx/onnx/releases)
- [Changelog](https://github.com/onnx/onnx/blob/main/docs/Changelog-ml.md)
- [Commits](onnx/onnx@v1.22.0...v1.23.2)

Updates `onnxruntime` from 1.29.0 to 1.30.0
- [Release notes](https://github.com/microsoft/onnxruntime/releases)
- [Changelog](https://github.com/microsoft/onnxruntime/blob/main/docs/ReleaseNotesWorkflow.md)
- [Commits](microsoft/onnxruntime@v1.29.0...v1.30.0)

Updates `ruff` from 0.16.6 to 0.16.10
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/0.16.10/CHANGELOG.md)
- [Commits](astral-sh/ruff@0.16.6...0.16.10)

Updates `mypy` from 2.3.1 to 2.4.0
- [Changelog](https://github.com/python/mypy/blob/master/CHANGELOG.md)
- [Commits](python/mypy@v2.3.1...v2.4.0)

---
updated-dependencies:
- dependency-name: typer
  dependency-version: 0.27.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: python
- dependency-name: torch
  dependency-version: 2.14.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: python
- dependency-name: torchvision
  dependency-version: 0.29.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: python
- dependency-name: rfdetr
  dependency-version: 1.11.2
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: python
- dependency-name: supervision
  dependency-version: 0.30.8
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: python
- dependency-name: fiftyone
  dependency-version: 1.22.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: python
- dependency-name: transformers
  dependency-version: 5.19.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: python
- dependency-name: onnx
  dependency-version: 1.23.2
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: python
- dependency-name: onnxruntime
  dependency-version: 1.30.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: python
- dependency-name: ruff
  dependency-version: 0.16.10
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: python
- dependency-name: mypy
  dependency-version: 2.4.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: python
...

Signed-off-by: dependabot[bot] <support@github.com>
@dependabot @github

dependabot Bot commented on behalf of github Oct 11, 2026

Copy link
Copy Markdown
Contributor Author

Labels

The following labels could not be found: dependencies. Please create it before Dependabot can add it to a pull request.

Please fix the above issues or remove invalid values from dependabot.yml.

@dependabot @github

dependabot Bot commented on behalf of github Oct 18, 2026

Copy link
Copy Markdown
Contributor Author

Looks like these dependencies are updatable in another way, so this is no longer needed.

@dependabot dependabot Bot closed this Oct 18, 2026
@dependabot
dependabot Bot deleted the dependabot/uv/python-5f6329cf03 branch October 18, 2026 00:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants