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: u32Schema 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
impl SchemaV2
Sourcepub fn parse_json(s: &str) -> DecoderResult<Self>
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.
Sourcepub fn parse_yaml(s: &str) -> DecoderResult<Self>
pub fn parse_yaml(s: &str) -> DecoderResult<Self>
Parse schema metadata from a YAML string.
Same version-detection logic as SchemaV2::parse_json.
Sourcepub fn parse_file(path: impl AsRef<Path>) -> DecoderResult<Self>
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.
Sourcepub fn from_json_value(value: Value) -> DecoderResult<Self>
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.
Sourcepub fn from_v1(v1: &ConfigOutputs) -> DecoderResult<Self>
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)→ v2Quantizationwith a single scalar scale/zero_point and unspecified dtype). dshape,shape,anchors,normalizedfields.- Root-level
nmsanddecoder_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
impl SchemaV2
Sourcepub fn to_legacy_config_outputs(&self) -> DecoderResult<ConfigOutputs>
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: dflon 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.
Sourcepub fn validate(&self) -> DecoderResult<()>
pub fn validate(&self) -> DecoderResult<()>
Validate the schema against the rules the HAL enforces.
Rules checked:
schema_versionin[1, MAX_SUPPORTED_SCHEMA_VERSION].- Physical children, when present, carry non-empty
namefields 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
boxeslogical output withencoding: dfl, every physical child shape has anum_features(or last) dimension divisible by 4 (the box-coordinate count). - Per-scale splits carry
strideon every child. - Mixed per-scale + channel-sub-split decompositions are rejected (the spec permits only one merge strategy per logical).
end2endmodels (decoder_version=yolo26 withdetectionsoutput) do not also declare per-scale split children on that output.
Trait Implementations§
Source§impl<'de> Deserialize<'de> for SchemaV2
impl<'de> Deserialize<'de> for SchemaV2
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
impl StructuralPartialEq for SchemaV2
Auto Trait Implementations§
impl Freeze for SchemaV2
impl RefUnwindSafe for SchemaV2
impl Send for SchemaV2
impl Sync for SchemaV2
impl Unpin for SchemaV2
impl UnsafeUnpin for SchemaV2
impl UnwindSafe for SchemaV2
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
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