use super::configs::{self, DimName, QuantTuple};
use serde::{Deserialize, Serialize};
#[derive(Debug, PartialEq, Serialize, Deserialize, Clone, Default)]
pub struct ConfigOutputs {
#[serde(default)]
pub outputs: Vec<ConfigOutput>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub nms: Option<configs::Nms>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub decoder_version: Option<configs::DecoderVersion>,
}
#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)]
#[serde(tag = "type")]
pub enum ConfigOutput {
#[serde(rename = "detection")]
Detection(configs::Detection),
#[serde(rename = "masks")]
Mask(configs::Mask),
#[serde(rename = "segmentation")]
Segmentation(configs::Segmentation),
#[serde(rename = "protos")]
Protos(configs::Protos),
#[serde(rename = "scores")]
Scores(configs::Scores),
#[serde(rename = "boxes")]
Boxes(configs::Boxes),
#[serde(rename = "mask_coefs", alias = "mask_coefficients")]
MaskCoefficients(configs::MaskCoefficients),
#[serde(rename = "classes")]
Classes(configs::Classes),
}
#[derive(Debug, PartialEq, Clone)]
pub enum ConfigOutputRef<'a> {
Detection(&'a configs::Detection),
Mask(&'a configs::Mask),
Segmentation(&'a configs::Segmentation),
Protos(&'a configs::Protos),
Scores(&'a configs::Scores),
Boxes(&'a configs::Boxes),
MaskCoefficients(&'a configs::MaskCoefficients),
Classes(&'a configs::Classes),
}
impl<'a> ConfigOutputRef<'a> {
pub(super) fn decoder(&self) -> configs::DecoderType {
match self {
ConfigOutputRef::Detection(v) => v.decoder,
ConfigOutputRef::Mask(v) => v.decoder,
ConfigOutputRef::Segmentation(v) => v.decoder,
ConfigOutputRef::Protos(v) => v.decoder,
ConfigOutputRef::Scores(v) => v.decoder,
ConfigOutputRef::Boxes(v) => v.decoder,
ConfigOutputRef::MaskCoefficients(v) => v.decoder,
ConfigOutputRef::Classes(v) => v.decoder,
}
}
pub(super) fn dshape(&self) -> &[(DimName, usize)] {
match self {
ConfigOutputRef::Detection(v) => &v.dshape,
ConfigOutputRef::Mask(v) => &v.dshape,
ConfigOutputRef::Segmentation(v) => &v.dshape,
ConfigOutputRef::Protos(v) => &v.dshape,
ConfigOutputRef::Scores(v) => &v.dshape,
ConfigOutputRef::Boxes(v) => &v.dshape,
ConfigOutputRef::MaskCoefficients(v) => &v.dshape,
ConfigOutputRef::Classes(v) => &v.dshape,
}
}
}
impl<'a> From<&'a configs::Detection> for ConfigOutputRef<'a> {
fn from(v: &'a configs::Detection) -> ConfigOutputRef<'a> {
ConfigOutputRef::Detection(v)
}
}
impl<'a> From<&'a configs::Mask> for ConfigOutputRef<'a> {
fn from(v: &'a configs::Mask) -> ConfigOutputRef<'a> {
ConfigOutputRef::Mask(v)
}
}
impl<'a> From<&'a configs::Segmentation> for ConfigOutputRef<'a> {
fn from(v: &'a configs::Segmentation) -> ConfigOutputRef<'a> {
ConfigOutputRef::Segmentation(v)
}
}
impl<'a> From<&'a configs::Protos> for ConfigOutputRef<'a> {
fn from(v: &'a configs::Protos) -> ConfigOutputRef<'a> {
ConfigOutputRef::Protos(v)
}
}
impl<'a> From<&'a configs::Scores> for ConfigOutputRef<'a> {
fn from(v: &'a configs::Scores) -> ConfigOutputRef<'a> {
ConfigOutputRef::Scores(v)
}
}
impl<'a> From<&'a configs::Boxes> for ConfigOutputRef<'a> {
fn from(v: &'a configs::Boxes) -> ConfigOutputRef<'a> {
ConfigOutputRef::Boxes(v)
}
}
impl<'a> From<&'a configs::MaskCoefficients> for ConfigOutputRef<'a> {
fn from(v: &'a configs::MaskCoefficients) -> ConfigOutputRef<'a> {
ConfigOutputRef::MaskCoefficients(v)
}
}
impl<'a> From<&'a configs::Classes> for ConfigOutputRef<'a> {
fn from(v: &'a configs::Classes) -> ConfigOutputRef<'a> {
ConfigOutputRef::Classes(v)
}
}
impl<'a> From<&'a ConfigOutput> for ConfigOutputRef<'a> {
fn from(v: &'a ConfigOutput) -> ConfigOutputRef<'a> {
match v {
ConfigOutput::Detection(c) => ConfigOutputRef::Detection(c),
ConfigOutput::Mask(c) => ConfigOutputRef::Mask(c),
ConfigOutput::Segmentation(c) => ConfigOutputRef::Segmentation(c),
ConfigOutput::Protos(c) => ConfigOutputRef::Protos(c),
ConfigOutput::Scores(c) => ConfigOutputRef::Scores(c),
ConfigOutput::Boxes(c) => ConfigOutputRef::Boxes(c),
ConfigOutput::MaskCoefficients(c) => ConfigOutputRef::MaskCoefficients(c),
ConfigOutput::Classes(c) => ConfigOutputRef::Classes(c),
}
}
}
impl ConfigOutput {
pub fn shape(&self) -> &[usize] {
match self {
ConfigOutput::Detection(detection) => &detection.shape,
ConfigOutput::Mask(mask) => &mask.shape,
ConfigOutput::Segmentation(segmentation) => &segmentation.shape,
ConfigOutput::Scores(scores) => &scores.shape,
ConfigOutput::Boxes(boxes) => &boxes.shape,
ConfigOutput::Protos(protos) => &protos.shape,
ConfigOutput::MaskCoefficients(mask_coefficients) => &mask_coefficients.shape,
ConfigOutput::Classes(classes) => &classes.shape,
}
}
pub fn decoder(&self) -> &configs::DecoderType {
match self {
ConfigOutput::Detection(detection) => &detection.decoder,
ConfigOutput::Mask(mask) => &mask.decoder,
ConfigOutput::Segmentation(segmentation) => &segmentation.decoder,
ConfigOutput::Scores(scores) => &scores.decoder,
ConfigOutput::Boxes(boxes) => &boxes.decoder,
ConfigOutput::Protos(protos) => &protos.decoder,
ConfigOutput::MaskCoefficients(mask_coefficients) => &mask_coefficients.decoder,
ConfigOutput::Classes(classes) => &classes.decoder,
}
}
pub fn quantization(&self) -> Option<QuantTuple> {
match self {
ConfigOutput::Detection(detection) => detection.quantization,
ConfigOutput::Mask(mask) => mask.quantization,
ConfigOutput::Segmentation(segmentation) => segmentation.quantization,
ConfigOutput::Scores(scores) => scores.quantization,
ConfigOutput::Boxes(boxes) => boxes.quantization,
ConfigOutput::Protos(protos) => protos.quantization,
ConfigOutput::MaskCoefficients(mask_coefficients) => mask_coefficients.quantization,
ConfigOutput::Classes(classes) => classes.quantization,
}
}
}