Skip to main content

SchemaV2

Struct SchemaV2 

Source
pub struct SchemaV2 {
    pub schema_version: u32,
    pub input: Option<InputSpec>,
    pub outputs: Vec<LogicalOutput>,
    pub nms: Option<NmsMode>,
    pub decoder_version: Option<DecoderVersion>,
}
Expand description

Root of the edgefirst.json schema v2 metadata.

All fields except SchemaV2::schema_version are optional, so third-party integrations can include only the sections relevant to their use case.

Fields§

§schema_version: u32

Schema version. Always 2 for v2 metadata.

§input: Option<InputSpec>

Input tensor specification (shape, named dims, camera adaptor).

Required for decoders that need to know the model input resolution: DFL dist2bbox scaling, box normalization against input dimensions, and per-scale anchor grid generation.

§outputs: Vec<LogicalOutput>

Logical outputs describing the model’s output tensors and their semantic roles.

§nms: Option<NmsMode>

HAL NMS mode. Omitted for end-to-end models with embedded NMS.

§decoder_version: Option<DecoderVersion>

YOLO architecture version for Ultralytics decoders.

Values: yolov5, yolov8, yolo11, yolo26. yolo26 is end-to-end (embedded NMS).

Implementations§

Source§

impl SchemaV2

Source

pub fn parse_json(s: &str) -> DecoderResult<Self>

Parse schema metadata from a JSON string.

Auto-detects the schema version from the schema_version field. Absent or 1 → legacy v1 metadata converted to v2 in memory. 2 → parsed as v2 directly. Any version higher than MAX_SUPPORTED_SCHEMA_VERSION is rejected with DecoderError::NotSupported.

Source

pub fn parse_yaml(s: &str) -> DecoderResult<Self>

Parse schema metadata from a YAML string.

Same version-detection logic as SchemaV2::parse_json.

Source

pub fn parse_file(path: impl AsRef<Path>) -> DecoderResult<Self>

Parse schema metadata from a file, auto-detecting JSON vs YAML from the file extension. Unknown extensions are parsed as JSON first then as YAML as a fallback.

Source

pub fn from_json_value(value: Value) -> DecoderResult<Self>

Parse from an already-deserialized serde_json::Value. Useful for callers that have already done the initial deserialization step.

Source

pub fn from_v1(v1: &ConfigOutputs) -> DecoderResult<Self>

Convert a legacy v1 ConfigOutputs to an equivalent v2 SchemaV2 in memory.

The conversion preserves:

  • Output order and types (mapped to their v2 LogicalType).
  • Quantization (v1 QuantTuple(scale, zp) → v2 Quantization with a single scalar scale/zero_point and unspecified dtype).
  • dshape, shape, anchors, normalized fields.
  • Root-level nms and decoder_version.

Fields v1 does not carry (tensor dtype, per-channel quant, box encoding, score format, activation metadata, stride on physical children) are left as None. The v2 decoder is expected to infer these from the runtime tensor type and the legacy decoder dispatch rules.

Source§

impl SchemaV2

Source

pub fn to_legacy_config_outputs(&self) -> DecoderResult<ConfigOutputs>

Downconvert a v2 schema to a legacy ConfigOutputs for the v1 decoder dispatch path.

Each LogicalOutput maps to one ConfigOutput variant selected by LogicalType; per-tensor scalar quantization becomes a QuantTuple(scale, zp); and decoder, anchors, normalized are copied verbatim.

This conversion does not reject logical outputs that also declare physical children (per-scale FPN splits, or channel sub-splits such as ARA-2 boxes_xy / boxes_wh). The returned legacy config captures the logical-level metadata, while the physical-to-logical merge is handled separately by the DecodeProgram that DecoderBuilder::build compiles alongside this legacy config.

Returns DecoderError::NotSupported when the schema uses features the v1 decoder cannot express at the logical level:

  • Per-channel quantization arrays on a logical output.
  • encoding: dfl on a flat logical output (no physical children). DFL combined with per-scale children is handled by the merge path (see [crate::decoder::merge::DecodeProgram]) which decodes the distribution before producing the merged post-decode (1, 4, total_anchors) tensor the legacy decoder consumes.
Source

pub fn validate(&self) -> DecoderResult<()>

Validate the schema against the rules the HAL enforces.

Rules checked:

  • schema_version in [1, MAX_SUPPORTED_SCHEMA_VERSION].
  • Physical children, when present, carry non-empty name fields so tensor binding by name is unambiguous.
  • All physical children of a given logical output have pairwise distinct shapes (shape-based binding safety, per HailoRT spec).
  • For a boxes logical output with encoding: dfl, every physical child shape has a num_features (or last) dimension divisible by 4 (the box-coordinate count).
  • Per-scale splits carry stride on every child.
  • Mixed per-scale + channel-sub-split decompositions are rejected (the spec permits only one merge strategy per logical).
  • end2end models (decoder_version=yolo26 with detections output) do not also declare per-scale split children on that output.

Trait Implementations§

Source§

impl Clone for SchemaV2

Source§

fn clone(&self) -> SchemaV2

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for SchemaV2

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for SchemaV2

Source§

fn default() -> Self

Returns the “default value” for a type. Read more
Source§

impl<'de> Deserialize<'de> for SchemaV2

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl PartialEq for SchemaV2

Source§

fn eq(&self, other: &SchemaV2) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl Serialize for SchemaV2

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl StructuralPartialEq for SchemaV2

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,