Tags

Tags give the ability to mark specific points in history as being important
  • v8.9.15

    Add opt-in Apple Core AI (.aimodel) backend for iOS 27+ (#319)
    
    * Add Apple Core AI (.aimodel) backend for iOS 27+ with Core ML fallback
    
    Load .aimodel models through CoreAI.framework on iOS 27+ devices behind canImport(CoreAI) and availability checks, with Swift letterbox preprocessing and the existing task decoders shared through featureArrays. Recognize .aimodel in the path resolver, downloader, caches and app, export and download Core AI assets from the scripts, add an opt-in --benchmark launch argument, and document the backend. Core ML stays the default format.
    
    * Default official models to Core AI on iOS 27+ and drop the Swift classify softmax
    
    Official model IDs resolve to .aimodel.zip where Core AI can run and to .mlpackage.zip elsewhere; a cached Core ML model is removed only after its Core AI replacement is installed and valid. Classify exports apply softmax in the model, so the raw-tensor path now only selects the top-1/top-5 probabilities.
    
    * Auto-format by https://ultralytics.com/actions
    
    * Fix Core AI input cost and Neural Engine load failures found on device
    
    On an iPhone 17 Pro (iOS 27.0), NDArray(scalars:) copied the 640x640 input element by element and cost about 55 ms per frame; the input tensor is now allocated once and filled in bulk. Preferring the Neural Engine explicitly failed the load of models it cannot compile (_GenericObjCError.nilError), so hardware acceleration now uses the default specialization options and lets Core AI place the model. The benchmark loads a task's models together, times them in interleaved rounds, keeps only timings, and reports what each model found.
    
    * Export Core AI assets with the raw head and record on-device results
    
    On an iPhone 17 Pro (iOS 27.0) the raw head decoded by the SDK's Swift NMS is about 2x faster in inference than the Core AI end-to-end head and the Core ML INT8 assets, and avoids the FP16 end-to-end pose asset returning no detections. The export script no longer passes nms=False for Core AI and expects end2end False, the docs describe the recipe and hardware acceleration placement, and docs/performance.md replaces the pending table with the measured results.
    
    * Remove the in-app benchmark harness
    
    The on-device results it produced are recorded in docs/performance.md and the harness source is kept in #320, so the app no longer carries a launch-argument tool, its benchmark image download, or a contiguity check on an input tensor the SDK allocates itself.
    
    * Auto-format by https://ultralytics.com/actions
    
    * Describe the Core AI release assets as published
    
    * Add apples-to-apples Core ML and Core AI on-device benchmarks
    
    Same YOLO26n weights per task as Core ML INT8, Core ML FP16 and Core AI FP16, with both heads where the task has one, measured on an iPhone 17 Pro (iOS 27.0) with and without hardware acceleration. End to end the official Core AI raw-head assets are ahead for detect, OBB and classify, tied for segment and pose, and behind for semantic and depth.
    
    * Keep a cached Core ML model usable until its Core AI replacement installs
    
    After an upgrade to iOS 27 the app still attempts the Core AI download, but loads the Core ML model it cached earlier when that download is not possible. The .aimodel marker is checked before the move, the unused requiresNMS write and its access widening are removed, Core AI metadata is read as strings directly, and docs no longer describe the removed benchmark harness or claim an explicit .aimodel loads without Core AI.
    
    * Link the semantic and depth follow-up issues from the performance guide
    
    * Recover Core AI loads from a stale specialization cache entry
    
    On iOS 27.0 an .aimodel whose cached specialization is stale (the asset was replaced under the same path, or the app was reinstalled) fails to load with _GenericObjCError.nilError instead of being rebuilt. Six of the seven official nano assets hit this on the test device. The loader now evicts the asset's cache entries and retries once, which was verified to recover all of them. Corrects the earlier explanation that blamed an explicit Neural Engine preference.
    
    * Make Core AI opt-in and keep Core ML the default everywhere
    
    Official model IDs, bare bundle names and the app's bundled and downloaded models resolve to Core ML exactly as before. Core AI is selected only by the .aimodel extension: an explicit path, a bundle name that carries .aimodel, or an .aimodel.zip URL, on iOS 27 and later devices. The availability-based format selection, the Core ML cache replacement and its offline fallback, the dual-format list filter and the download script flag are removed, the app download manager and external display controller return to their previous state, and the docs describe the opt-in with one example and link the measured trade-offs.
    
    * Add an app setting to opt in to Core AI models and keep Core ML behavior unchanged
    
    The app gains a Settings toggle, Core AI Models (iOS 27+), off by default. When it is on and the device can run Core AI, the app downloads the official .aimodel.zip assets and lists bundled .aimodel models; Core ML and Core AI downloads are cached side by side and the setting is re-read when the app returns to the foreground. The export script exports Core ML by default and Core AI only with --formats coreai, Core ML classify results keep the Swift softmax while Core AI probabilities skip it, a failed cache eviction no longer hides the original load error, and the docs describe the setting and the ultralytics>=8.4.155 floor for the Core AI recipe.
    
    * Load the selected format when the Core AI setting changes
    
    Returning to the foreground with the Core AI setting changed now relists the models and loads the current task's first model in the new format, so turning the setting on runs a Core AI model and turning it off returns to Core ML; with the setting unchanged the observer does nothing. The listed format changes only on a relist, so a list, its downloads and its cache paths always agree, including when the setting is flipped during a download. The README upload command is Core ML again with an explicit Core AI command beside it, and stale wording, the Settings path and a history sentence in the performance guide are fixed.
    
    * Install a downloaded model under its own format
    
    The install destination followed the live Core AI setting, so a Core ML download cancelled mid-install and finished after the setting changed was stored under the Core AI name and could never load or re-download. The destination now takes its extension from the installed artifact.
    
    ---------
    
    Co-authored-by: UltralyticsAssistant <web@ultralytics.com>
  • v8.9.14

    Make the BasePredictor label parser public for SDK consumers (#315)
  • v8.9.13

    Fix EXC_BAD_ACCESS in ObjectDetector when raw detection tensor isn't .float32 (#303)
    
    * Fix crash decoding non-float32 raw detection tensors in ObjectDetector
    
    processRawResults() reinterpreted an MLMultiArray's raw buffer as Float32
    via assumingMemoryBound without checking dataType. When a model's raw
    end2end/NMS-free output is backed by another type (e.g. .float16), every
    stride-based offset lands at roughly the wrong byte position, running
    past the tensor's actual allocation as detections accumulate and
    crashing with EXC_BAD_ACCESS.
    
    Materialize the tensor into a Float buffer first: a fast direct copy
    when the array is already .float32, falling back to MLMultiArray's safe
    per-element accessor otherwise — mirroring the pattern already used in
    Classifier.softmaxProbs and DepthEstimator.postProcessDepth.
    
    Also guard processTraditionalResults against numClasses <= 0 (a
    malformed/misrouted tensor with too few features), which trapped on
    `0..<numClasses` with a negative range.
    
    * Preserve source tensor layout when materializing float buffer
    
    Review feedback: the previous fast path copied count contiguous
    elements via a flat memcpy whenever dataType == .float32, then indexed
    into that copy using the source array's own (possibly padded/
    non-contiguous) strides. For a valid but non-densely-packed .float32
    tensor, that mismatch reads across padding gaps and misaligns every
    detection after the first.
    
    Only take the flat-copy shortcut when the source is verifiably densely
    packed (its strides already equal the canonical row-major strides for
    its shape); otherwise fall back to the safe per-element accessor, which
    already respects the real strides regardless of layout. Always return
    freshly computed canonical strides alongside the materialized buffer,
    since the buffer itself is now guaranteed densely packed regardless of
    the source's original layout.
    
    Added a regression test constructing a genuinely padded .float32
    MLMultiArray (via the strides: initializer) with two detections, which
    fails against the unguarded flat-copy and passes with this fix.
    
    * Preserve zero-copy float32 detection decoding
    
    * Auto-format by https://ultralytics.com/actions
    
    * Standardize Core ML mobile assets at 224/640 (#304)
    
    * Document shipped Core ML input sizes
    
    * Correct Core ML end-to-end contracts
    
    * Include depth in export examples
    
    * Require a new model release tag
    
    * Align release workflow documentation
    
    * Standardize Core ML model input sizes
    
    * Auto-format by https://ultralytics.com/actions
    
    * Support external Core ML output directories
    
    * Isolate official Core ML checkpoints
    
    * Match Core ML task output contracts
    
    * Resume verified Core ML exports
    
    * Adopt standard mobile model assets
    
    * Enforce standardized Core ML assets
    
    * Auto-format by https://ultralytics.com/actions
    
    * Refresh model caches by release
    
    * Auto-format by https://ultralytics.com/actions
    
    * Fix versioned model cache handoff
    
    * Separate model paths from display names
    
    * Replace existing Core ML assets at standard sizes
    
    * Auto-format by https://ultralytics.com/actions
    
    * Pass model checkpoint paths directly
    
    * Refresh standardized Core ML caches
    
    * Use revisioned cache paths consistently
    
    * Clarify Core ML asset history
    
    * Use the unified mobile benchmark harness
    
    * Update standardized Core ML benchmarks
    
    * Preserve local export checkpoints
    
    * Auto-format by https://ultralytics.com/actions
    
    ---------
    
    Co-authored-by: UltralyticsAssistant <web@ultralytics.com>
    
    * Consolidate AGENTS.md Core Principles from eight to five (#305)
    
    * Consolidate AGENTS.md Core Principles from eight to five
    
    * Address review findings: restore lost content, resolve gate contradiction
    
    * Drop the hierarchy gloss; keep each repo's original cleanup wording
    
    * Make coverage informational and correct the CI note (#306)
    
    * Bump version to 8.9.13
    
    ---------
    
    Co-authored-by: Glenn Jocher <glenn.jocher@ultralytics.com>
    Co-authored-by: UltralyticsAssistant <web@ultralytics.com>
  • v8.9.12

    Release UltralyticsYOLO 8.9.12 (#297)
    
    * Bump UltralyticsYOLO to 9.0.0
    
    * Use patch release 8.9.12
  • v8.9.11

    Include segmentation masks and pose in shared images (#291)
    
    * Include segmentation masks and pose in shared images
    
    renderShareImage froze the camera frame as an opaque layer above the preview
    layer — which nests the mask, pose, and box overlays — then rebuilt only the
    bounding boxes on top. Masks and pose skeletons were therefore missing from
    shared/paused images, and rotated OBB boxes were flattened to axis-aligned
    rects by the rebuild (path.boundingBox).
    
    Lift the real overlay sublayers above the frozen frame and restore them after
    the snapshot, so every task shares correctly and the shared image matches the
    live overlay exactly. Removes the parallel box-reconstruction path
    (BoundingBoxInfo/createBoxView/makeBoundingBoxInfos).
    
    * Keep shared overlays below the view controls
    
    Lift the overlays just above the frozen frame instead of onto the root
    layer, so a full-frame mask no longer tints the toolbar/FPS controls in
    the shared image and the z-order matches the live preview.
    
    * Bump version to 8.9.11
  • v8.9.10

    Optimize segment mask painting (#290)
    
    * Optimize segment mask painting
    
    * Document segment mask painting performance
    
    * Auto-format by https://ultralytics.com/actions
    
    * Bump version to 8.9.10
    
    ---------
    
    Co-authored-by: UltralyticsAssistant <web@ultralytics.com>
  • v8.9.9

    Clear stale segment mask overlays (#289)
    
    * Clear stale segmentation mask overlays
    
    * Bump version to 8.9.9
  • v8.9.8

    Improve segment mask rendering (#288)
    
    * Improve segmentation mask rendering
    
    * Auto-format by https://ultralytics.com/actions
    
    * Improve segmentation mask rendering
    
    * Auto-format by https://ultralytics.com/actions
    
    * Speed up axis-aligned NMS
    
    ---------
    
    Co-authored-by: UltralyticsAssistant <web@ultralytics.com>
  • v8.9.7

    8.9.7 - Keep semantic postprocess fast in debug builds (#278)
    
    * 8.9.7 - Keep semantic postprocess fast in debug builds
    
    Full-resolution class maps exposed a ~100x Swift -Onone penalty on the
    per-pixel sweeps: a debug build showed ~90 ms postprocess where release
    runs 0.8 ms, making the SDK look broken to anyone profiling from Xcode.
    
    The class-map gather/clamp and RGBA paint now run through vDSP and
    vImage lookup tables - vectorized C that is equally fast in any build
    configuration - and SemanticMask.classMap becomes [Int32] so the
    conversion vectorizes (and halves its memory). CocoaPods consumers
    additionally get the pod compiled -O in all configurations via
    pod_target_xcconfig.
    
    * Auto-format by https://ultralytics.com/actions
    
    * Address review: 8-bit paint fallback, pixel test, minor version
    
    Scalar paint fallback above 256 classes (vImage tables are 8-bit), a
    pixel-color test proving the planar-to-RGBA byte order, and 8.10.0
    instead of a patch bump since the classMap type change is
    source-breaking.
    
    * Adopt Xcode recommended settings, keep script sandboxing off
    
    The model-download build phase writes bundled models into the source
    tree, which user script sandboxing blocks - a sandboxed clean checkout
    fails the build (verified). Everything else from the Xcode 26.5
    recommendations is adopted, and the committed build number catches up
    with local test builds.
    
    * Release as 8.9.7
    
    The classMap dtype correction lands while the semantic class-map API is
    new enough to have no external consumers of the raw array; treat it as
    stabilization of the new surface rather than a minor release.
    
    ---------
    
    Co-authored-by: UltralyticsAssistant <web@ultralytics.com>
  • v8.9.6

    8.9.6 - Expose capture session preset on YOLOView (#277)
    
    * 8.9.6 - Expose capture session preset on YOLOView
    
    YOLOView hardcoded the .hd1280x720 capture preset, so models with
    inputs larger than 720p had no way to request more sensor detail for
    small objects (the Android plugin gained the symmetric option in
    ultralytics/yolo-flutter-app#529). captureSessionPreset keeps today's
    default, falls back through .high/.photo on unsupported devices, and
    restarts the session when changed at runtime.
    
    * Auto-format by https://ultralytics.com/actions
    
    ---------
    
    Co-authored-by: UltralyticsAssistant <web@ultralytics.com>
  • v8.9.5

    Add pre/inference/post timing breakdown to predictors and YOLOView HUD (#274)
    
    * Add pre/inference/post timing breakdown to predictors and YOLOView HUD
    
    Each predictor stamps the end of the Vision request and reports the
    inference/postprocess split through new YOLOResult fields (preMs is zero on
    iOS since Vision fuses input scaling into the request - documented on the
    fields). YOLOView shows the breakdown as a smaller caption line under the
    FPS label, hidden when values are absent.
    
    Also fixes single-image predictOnImage measuring speed after annotation
    drawing: plotting is now excluded from all timings, matching the camera
    path and the Flutter plugin.
    
    * Add standardized per-task CPU vs Neural Engine benchmark table
    
    * Auto-format by https://ultralytics.com/actions
    
    * Friendlier performance doc headings with emoji, matching the Flutter guide
    
    * Distinguish burst single-image latency from sustained camera frame time in benchmark table
    
    * Show timing breakdown in the app HUD
    
    The app hides YOLOView's built-in labels and renders its own, so add the
    matching pre/inference/post caption line below the FPS label, fed from the
    result delegate - parity with the Flutter showcase HUD.
    
    * Record cross-platform decode and semantic ArgMax insights
    
    * Auto-format by https://ultralytics.com/actions
    
    * Accept [1, H, W] class-map semantic outputs
    
    In-graph-ArgMax semantic exports emit per-pixel class indices directly
    instead of float logits; read them through a dtype-indirected pointer and
    share the existing paint/packaging phase. Legacy 4D logits keep the
    argmax path unchanged.
    
    * Record in-graph ArgMax semantic results in performance doc
    
    * Address review: stage timing fixes
    
    Mark inference end before parsing in Segmenter's synchronous path so
    parse cost lands in postprocess, and smooth the camera-path stage
    breakdown with the same EMA the result speed uses (single-image
    predicts keep raw per-frame values).
    
    * 8.9.5
    
    * Polish HUD and model row layout
    
    - Render the stage breakdown as a second line inside the FPS label so it
      inherits its layout and visibility (no overlap with neighbors, hides
      during camera switching)
    - Cover the whole HUD with the camera-switch transition instead of
      leaving sliders and labels floating over the blur
    - Cap the model row at portrait-phone width so landscape doesn't
      stretch it edge to edge, and clear storyboard placeholder text while
      reserving the two-line HUD height to avoid first-frame layout shift
    
    * Auto-format by https://ultralytics.com/actions
    
    * Speed up class-map postprocess for full-resolution masks
    
    Full-resolution class maps (ultralytics#24799) are ~1M pixels; the
    per-pixel read closure and byte-wise color writes measured ~130 ms per
    frame. Typed tight loops and a packed-RGBA LUT bring the sweep back to
    a few ms.
    
    * Auto-format by https://ultralytics.com/actions
    
    * Refresh benchmarks with profile-mode and full-resolution semantic
    
    * Document profile-mode benchmark invocation
    
    * Tighten README tone
    
    Replace promotional section titles and claims with factual feature
    descriptions in both the English and Chinese READMEs, and fold the
    redundant highlights section into the feature list.
    
    ---------
    
    Co-authored-by: UltralyticsAssistant <web@ultralytics.com>
  • v8.9.4

    Add camera torch toggle to YOLOView (8.9.4) (#268)
    
    * Add camera torch toggle to YOLOView (8.9.4)
    
    Ports the torch (flashlight) support from the Flutter plugin
    (ultralytics/yolo-flutter-app#435, #501) so both frontends stay at
    feature parity. A torch chip sits directly right of the centered lens
    pill with a "Torch on" note beside it, using the same visual tokens as
    the Flutter showcase (bolt glyph in yellow when on, slashed bolt in
    white when off, black 0.38 chip, 6pt gaps, 11pt semibold note).
    
    setTorchMode(_:) is public and returns the actual resulting hardware
    state (false when the active device has no torch or configuration
    fails), keeping the chip in sync from a single source of truth. The
    chip also re-syncs from hardware after camera switches and resets when
    the capture session stops (pause/stop), since iOS drops the torch with
    the session. The caption clamps and scales down on narrow triple-lens
    phones instead of clipping, and the external-display path now refreshes
    lens-row visibility immediately after hiding the camera controls.
    
    Releases 8.9.4 (podspec + MARKETING_VERSION).
    
    * Update
    
    * Hide the torch chip when the active device has no torch
    
    * Relayout YOLOView after external display disconnect restores controls
  • v8.9.3

    Add YOLOView.showOverlays for custom overlay rendering (8.9.3) (#267)
    
    * Add YOLOView.showOverlays for custom overlay rendering (8.9.3)
    
    Adds a public showOverlays toggle to YOLOView so consumers can disable
    the built-in prediction overlays (boxes, OBB, masks, pose, classification)
    and draw their own, while inference and the result callbacks (delegate,
    onDetection) keep firing. Requested for custom-overlay workflows in
    ultralytics/yolo-flutter-app#506; matches the semantics the Flutter
    plugin's iOS view already ships.
    
    Releases 8.9.3 (podspec + MARKETING_VERSION), which also ships the
    unreleased ObbDetector strides fix and the YOLOViewDelegate default.
    
    * Skip redundant per-frame overlay clearing when overlays are hidden
  • v8.9.2

    Add capturesInstanceMasks for live segmentation mask streaming (8.9.2) (#260)
    
    The realtime Segmenter path hardcoded `returnIndividualMasks: false`, producing
    only the combined display mask, so `YOLOResult.masks.masks` was always empty for
    camera predictions. Consumers streaming per-instance segmentation masks (e.g. the
    Flutter plugin's `includeMasks` stream option) received none — a regression once
    the plugin moved off its vendored predictor.
    
    Add a public `BasePredictor.capturesInstanceMasks` flag (default false, preserving
    the current per-frame cost) that gates per-instance mask materialization in
    `Segmenter.processObservations`. Consumers set it when individual masks are needed.
  • v8.9.1

    Fix YOLOView storyboard module reference (8.9.1) (#258)
    
    Main.storyboard pinned the YOLOView to `customModule="YOLO"`, the module name
    before the rename to `UltralyticsYOLO`. That compiles, so build-only CI passed,
    but at runtime Interface Builder can't resolve `_TtC4YOLO8YOLOView`, instantiates
    a fallback, and the app crashes on launch (`-[... sublayers]: unrecognized
    selector`). Point it at `UltralyticsYOLO` and bump to 8.9.1.
    
    Verified by launching YOLOiOSApp on a simulator (not just building) — storyboard
    loads and the app runs.
  • v8.9.0

    Add shared UltralyticsYOLO inference package (8.9.0) (#257)
    
    * Prepare YOLO package as shared inference core
    
    Makes the YOLO Swift package the single source of truth for iOS inference so
    the Flutter plugin (yolo-flutter-app) can depend on it instead of vendoring a
    diverged copy. The native app and example apps are unaffected.
    
    Core merge (ports newer behavior from the Flutter fork, additive/non-breaking):
    - BasePredictor: useGpu + cpuOnly compute path, numItemsThreshold at create/load,
      metadata-tolerant label parsing (preserves multi-word labels, sparse names),
      labelName(for:) fallback, opt-in original-image capture via shared CIContext,
      shape-based NMS-free (YOLO26 end2end) detection fallback.
    - YOLO: non-breaking useGpu / numItemsThreshold / returnAnnotatedImage overloads.
    - YOLOResult: originalImage; Probs top1Label/top5Labels aliases; OBB.toPolygon(in:).
    - YOLOTask: Equatable + robust fromString bridge-alias parser.
    - Detector/Segmenter/Pose/OBB/Classifier/Semantic: original-image propagation and
      label fallback; Plot: original-image-size-aware pose drawing.
    
    Distribution + platform:
    - Lower package deployment target to iOS 13 with availability fallbacks
      (Logger os_log, UIAction/primaryAction, sheetPresentationController).
    - Add YOLO.podspec so the package can be consumed via CocoaPods as well as SPM.
    
    Tests: add YOLOSSOTMergeTests covering IoU-after-setters, label parsing/fallback,
    fromString, Probs aliases/originalImage, numItemsThreshold, and per-task output
    shapes. Suite: 90 tests passing; native app builds; pod lib lint passes.
    
    * Auto-format by https://ultralytics.com/actions
    
    * Expose detector thresholds as public API
    
    The Flutter plugin's real-time YOLOView drives confidence/IoU/numItems on the
    shared BasePredictor from its UI sliders and reuses cached predictors, so these
    need to be public. Widen the three threshold setters to public and expose the
    backing values as public read-only (internal set). No behavior change.
    
    * Bump version to 8.9.0
    
    - MARKETING_VERSION 8.8.8 -> 8.9.0 (next release on the v8.x line).
    - YOLO.podspec to 8.9.0 and align its source tag to the repo's `v{version}`
      scheme so the pod publishes from the v8.9.0 release tag.
    
    * Rename package to UltralyticsYOLO
    
    Renames the shared Apple package's public surface (Swift module, SPM
    product/target, and CocoaPods pod) from `YOLO` to `UltralyticsYOLO`:
    - `YOLO` is too generic for CocoaPods' global flat namespace and collides as a
      module name; `Ultralytics` is already an unrelated pod on trunk. `UltralyticsYOLO`
      is collision-safe, on-brand (matches `ultralytics_yolo`), and leaves `Ultralytics`
      free as a future umbrella.
    - The public `YOLO` class and all types (YOLOResult, YOLOTask, YOLOView, …) are
      unchanged, so usage stays `import UltralyticsYOLO; YOLO(modelPath, task:)`.
    - Moves Sources/YOLO -> Sources/UltralyticsYOLO, updates Package.swift, the
      podspec (-> UltralyticsYOLO.podspec), 27 Swift import sites, README examples,
      and 5 Xcode projects (app + 4 example apps). Version stays 8.9.0.
    
    * Update CI scheme and periphery path for UltralyticsYOLO rename
    
    * Address review: clarify useGpu docs, drop unused returnAnnotatedImage
    
    - useGpu: keep behavior (parity with the shipped Flutter plugin's public
      `useGpu` option; ANE+CPU with the GPU deliberately excluded for realtime
      camera stability, CPU-only when false), but document the real semantics so
      the flag name is no longer misleading. Renaming/remapping would break the
      Dart API or regress camera latency.
    - returnAnnotatedImage: remove it. It only discarded the already-rendered
      annotated image (no compute saving) and had no consumers. Revert to the
      package's always-annotate single-image behavior; a proper skip-render API
      can be added later if a consumer needs it.
    
    * Auto-publish UltralyticsYOLO pod to CocoaPods trunk on release
    
    Adds a `pod` job to the publish workflow that runs after the release job tags
    v{MARKETING_VERSION}, then `pod trunk push`es UltralyticsYOLO.podspec from that
    tag so the Flutter plugin's CocoaPods consumers resolve it from trunk. Requires
    a COCOAPODS_TRUNK_TOKEN repo secret.
    
    * Document UltralyticsYOLO installation (SPM + CocoaPods)
    
    ---------
    
    Co-authored-by: UltralyticsAssistant <web@ultralytics.com>
  • v8.8.8

    Capture camera at 720p instead of full-resolution photo (#249)
    
    * Capture camera at 720p instead of full-resolution photo
    
    `.photo` delivers full-sensor (~2 MP) frames that are downscaled to the
    640x640 model input every frame, which is the dominant per-frame
    preprocessing cost. Capturing at `.hd1280x720` roughly halves per-frame
    work and doubles sustained throughput on an iPhone 17 Pro (~16 -> 13 ms,
    15 -> 30 fps) with no change to detection accuracy, since the model
    always receives a 640 input regardless of capture resolution.
    
    Add docs/performance.md documenting the on-device profiling and the
    camera/Core ML configuration rationale, including the capture-resolution
    comparison table, the compute-units and end2end findings, and a note
    that frame rate is camera-bound rather than inference-bound.
    
    Add LetterboxTests covering letterbox/coordinate robustness across
    camera aspect ratios (16:9 and 4:3, portrait and landscape), since the
    capture change moves the default from a 4:3 to a 16:9 stream.
    
    * Auto-format by https://ultralytics.com/actions
    
    * Guard camera preset with canSetSessionPreset and fall back
    
    Move the sessionPreset assignment to after the camera input is added so
    canSetSessionPreset reflects the active device's real capabilities, and
    fall back to a broadly supported preset ([requested, .high, .photo]) when
    the requested preset (e.g. 720p) is not supported on a given device or
    camera position. This avoids a camera-startup regression versus the
    previously universal .photo preset, and logs when a fallback is used.
    
    * Expand performance doc into canonical per-experiment reference
    
    Restructure docs/performance.md into self-contained experiment sections
    with the empirical results from on-device and host profiling: per-frame
    pipeline decomposition, camera capture resolution, Vision vs manual
    preprocessing, Core ML compute units (CPU/GPU/ANE), YOLO26 end2end vs
    legacy head + NMS, YOLO26 vs YOLO11 backbone, quantization and
    deployment target, and camera-bound frame rate. Adds a methodology
    table, the host-vs-device caveat, the shipped configuration, and a list
    of open/untested levers, so the doc is a baseline for future work.
    
    * Auto-format by https://ultralytics.com/actions
    
    * Bump version to 8.8.8
    
    ---------
    
    Co-authored-by: UltralyticsAssistant <web@ultralytics.com>
  • v8.8.7

    Add YOLO semantic segmentation support (#242)
    
    * Add YOLO semantic segmentation support
    
    * Auto-format by https://ultralytics.com/actions
    
    * Clarify semantic CoreML export output
    
    * Align semantic task order
    
    * Improve semantic mask upsampling
    
    * Auto-format by https://ultralytics.com/actions
    
    * Restore fast semantic mask rendering
    
    * Cache semantic mask colors
    
    * Smooth mask overlays
    
    * Restore compact task labels
    
    * Align semantic model documentation
    
    * Fix app model folder documentation
    
    * Harden semantic postprocessing
    
    * Tighten semantic release notes and mask rendering
    
    * Unify detection label rendering
    
    * Auto-format by https://ultralytics.com/actions
    
    * Unify classify label rendering
    
    * Auto-format by https://ultralytics.com/actions
    
    * Keep classify labels visible
    
    * Improve classify label readability
    
    ---------
    
    Co-authored-by: UltralyticsAssistant <web@ultralytics.com>
  • v8.8.6

    Fix external display orientation and mode setting (#241)
    
    * Fix external display orientation and mode toggle
    
    * Auto-format by https://ultralytics.com/actions
    
    * Polish external display overlays and toggle
    
    * Auto-format by https://ultralytics.com/actions
    
    * Respect external display setting on restored scenes
    
    * Use preview layer geometry for annotations
    
    * Simplify external display annotation geometry
    
    * Disable dedicated external display by default
    
    * Restore aspect-fill box and overlay projection
    
    * Delete duplicate external-display state and dead helpers
    
    ---------
    
    Co-authored-by: UltralyticsAssistant <web@ultralytics.com>
  • v8.8.5

    Fix YOLO aspect-fit preprocessing (#240)
    
    * Fix YOLO aspect-fit preprocessing
    
    * Auto-format by https://ultralytics.com/actions
    
    * Address letterbox review findings
    
    * Add letterbox transform tests
    
    * Fix invalid letterbox test expectations
    
    * Update App Store links and bump version
    
    * Use standard App Store links in English docs
    
    * Expand supported task table
    
    * Auto-format by https://ultralytics.com/actions
    
    * Use full task names in supported task table
    
    * Auto-format by https://ultralytics.com/actions
    
    * Use square Core ML export sizes
    
    * Document orientation-specific export shapes
    
    * Test non-square letterbox model inputs
    
    * Auto-format by https://ultralytics.com/actions
    
    * Polish README inference wording
    
    ---------
    
    Co-authored-by: UltralyticsAssistant <web@ultralytics.com>