deployment-metadata.json
The deployment-metadata.json
file is passed to custom deployment blocks. It provides details about the impulse being deployed.
File structure
DeploymentMetadataV1
interface DeploymentMetadataV1 {
version: 1;
// Global deployment counter
deployCounter: number;
// The output classes (for classification)
classes: string[];
// The number of samples to be taken per inference (e.g. 100Hz data, 3 axis, 2 seconds => 200)
samplesPerInference: number;
// Number of axes ((e.g. 100Hz data, 3 axis, 2 seconds => 3)
axesCount: number;
// Frequency of the data
frequency: number;
// TFLite models (already converted and quantized)
tfliteModels: {
// Information about the model type, e.g. quantization parameters
details: KerasModelIODetails;
// Name of the input tensor
inputTensor: string | undefined;
// Name of the output tensor
outputTensor: string | undefined;
// Path of the model on disk
modelPath: string;
// Path of the model on disk (ONNX), not always available
onnxModelPath: string | undefined;
// Path of a secondary/auxiliary model on disk (ONNX), not always available
onnxAuxModelPath: string | undefined;
// Path to .prototxt (in case of YOLOX), not always available
prototxtPath: string | undefined;
// Path to .fbz (BrainChip Akida model file), not always available
akidaModelPath: string | undefined;
// Path to .fbz (BrainChip Akida model prepared for Edge Learning), not always available
akidaEdgeLearningModelPath: string | undefined;
// Calculated arena size when running TFLite in interpreter mode
arenaSize: number;
// Number of values to be passed into the model
inputFrameSize: number;
}[];
// Project information
project: {
// Project name
name: string;
// Project ID
id: number;
// Project owner (user or organization name)
owner: string;
// API key, only set for deploy blocks with privileged flag and development keys set
apiKey: string | undefined;
// Studio host
studioHost: string;
};
// Impulse information
impulse: DeploymentMetadataImpulse;
// Sensor guess based on the input
sensor: 'camera' | 'microphone' | 'accelerometer' | 'positional' | 'environmental' | 'fusion' | undefined;
// Folder locations
folders: {
// Input files are here, the input folder contains 'edge-impulse-sdk', 'model-parameters', 'tflite-model'
input: string;
// Write your output file here
output: string;
};
}
CreateImpulseStateBase
/**
* Fields common to all CreateImpulseStateX
*/
interface CreateImpulseStateBase extends CreateImpulseStateMetadata {
id: number;
name: string;
title: string;
type: string;
}
CreateImpulseStateDsp
interface CreateImpulseStateDsp extends CreateImpulseStateBase {
type: string | 'custom';
implementationVersion: number;
axes: string[];
customUrl?: string;
input: number;
tunerBaseBlockId?: number;
autotune?: boolean;
organization?: {
id: number;
dspId: number;
};
namedAxes?: CreateImpulseStateDspNamedAxis[];
}
CreateImpulseStateDspNamedAxis
type CreateImpulseStateDspNamedAxis = {
name: string,
description?: string,
required?: boolean,
selectedAxis?: string,
};
CreateImpulseStateInput
type CreateImpulseStateInput = CreateImpulseStateInputTimeSeries |
CreateImpulseStateInputImage |
CreateImpulseStateInputFeatures;
CreateImpulseStateInputFeatures
interface CreateImpulseStateInputFeatures extends CreateImpulseStateBase {
type: 'features';
datasetSubset?: {
subsetModulo: number;
subsetSeed: number;
};
}
CreateImpulseStateInputImage
interface CreateImpulseStateInputImage extends CreateImpulseStateBase {
type: 'image';
imageWidth: number;
imageHeight: number;
resizeMode: 'squash' | 'fit-short' | 'fit-long' | 'crop';
cropAnchor: 'top-left' | 'top-center' | 'top-right' | 'middle-left' | 'middle-center' | 'middle-right' | 'bottom-left' | 'bottom-center' | 'bottom-right';
resizeMethod: 'nearest' | 'lanczos3';
labelingMethod?: 'object_detection' | 'single_label';
datasetSubset?: {
subsetModulo: number;
subsetSeed: number;
};
}
CreateImpulseStateInputTimeSeries
interface CreateImpulseStateInputTimeSeries extends CreateImpulseStateBase {
type: 'time-series';
windowSizeMs: number;
windowIncreaseMs: number;
frequencyHz: number;
classificationWindowIncreaseMs?: number;
padZeros: boolean;
datasetSubset?: {
subsetModulo: number;
subsetSeed: number;
};
}
CreateImpulseStateLearning
interface CreateImpulseStateLearning extends CreateImpulseStateBase {
dsp: number[];
type: typeof ALL_CREATE_IMPULSE_STATE_LEARNING_TYPES[number];
}
const ALL_CREATE_IMPULSE_STATE_LEARNING_TYPES = [
'keras',
'keras-transfer-image',
'keras-transfer-kws',
'keras-object-detection',
'keras-regression',
'anomaly',
'keras-akida',
'keras-akida-transfer-image',
'keras-akida-object-detection',
'anomaly-gmm',
'keras-visual-anomaly',
];
CreateImpulseStateMetadata
/**
* Provides metadata shared between all block types
*/
interface CreateImpulseStateMetadata {
/**
* Metadata for block versioning
*/
// The user-editable description of this block version
description?: string;
// Which part of the system created this version (createImpulse | clone | tuner)
createdBy?: string;
// The date and time this version was created
createdAt?: Date;
// Tuner template block id. This is _always_ -1 if the block is a Tuner block.
// the only place where this is used is in the DB to query for Tuner-managed blocks
// in the block config table.
tunerTemplateId?: number;
// If this is true, this block is also a tuner block.
db?: boolean;
}
DeploymentMetadataImpulse
interface DeploymentMetadataImpulse {
inputBlocks: CreateImpulseStateInput[];
dspBlocks: (CreateImpulseStateDsp & { metadata: DSPFeatureMetadata | undefined })[];
learnBlocks: CreateImpulseStateLearning[];
}
DSPConfig
interface DSPConfig {
options: {[s: string]: string | number | boolean | null;};
performance: { latency: number, ram: number } | undefined;
calculateFeatureImportance: boolean;
// Currently only used by EON tuner to identify blocks with the feature explorer
// skipped.
skipFeatureExplorer?: boolean;
}
DSPFeatureMetadata
interface DSPFeatureMetadata {
created: Date;
dspConfig: DSPConfig;
labels: string[]; // the training labels
featureLabels: string[] | undefined;
featureCount: number;
valuesPerAxis: number;
windowCount: number;
windowSizeMs: number;
windowIncreaseMs: number;
padZeros: boolean;
frequency: number;
outputConfig: DSPFeatureMetadataOutput;
performance: { latency: number, ram: number } | undefined;
fftUsed: number[] | undefined;
includeEmptyLabels: boolean;
inputShape: number[] | undefined;
includedSamplesAreInOrder: boolean;
resamplingAlgorithmVersion: number | undefined;
resizingAlgorithmVersion: number | undefined;
}
DSPFeatureMetadataOutput
type DSPFeatureMetadataOutput = {
type: 'image',
shape: { width: number, height: number, channels: number, frames?: number },
axes?: number
} | {
type: 'spectrogram',
shape: { width: number, height: number },
axes?: number
} | {
type: 'flat',
shape: { width: number },
axes?: number
};
KerasModelIODetails
/**
* Information required to process a model's input and output data
*/
interface KerasModelIODetails {
modelType: 'int8' | 'float32' | 'akida' | 'requiresRetrain';
inputs: KerasModelTensorDetails[];
outputs: KerasModelTensorDetails[];
}
KerasModelTensorDetails
/**
* Information necessary to quantize or dequantize the contents of a tensor
*/
type KerasModelTensorDetails = {
dataType: 'float32';
// These are added since TF2.7 - older models don't have them
name?: string;
shape?: number[];
} | {
dataType: 'int8' | 'uint8';
// These are added since TF2.7 - older models don't have them
name?: string;
shape?: number[];
// Scale and zero point are used only for quantized tensors
quantizationScale?: number;
quantizationZeroPoint?: number;
};
File example
{
"version": 1,
"samplesPerInference": 125,
"axesCount": 3,
"classes": [
"idle",
"snake",
"updown",
"wave"
],
"deployCounter": 83,
"folders": {
"input": "/home/input",
"output": "/home/output"
},
"frequency": 62.5,
"impulse": {
"inputBlocks": [
{
"id": 2,
"type": "time-series",
"name": "Time series",
"title": "Time series data",
"windowSizeMs": 2000,
"windowIncreaseMs": 240,
"frequencyHz": 62.5,
"padZeros": false,
"primaryVersion": true,
"db": false
}
],
"dspBlocks": [
{
"id": 24,
"type": "spectral-analysis",
"name": "Spectral features",
"axes": [
"accX",
"accY",
"accZ"
],
"title": "Spectral Analysis",
"input": 2,
"primaryVersion": true,
"createdBy": "createImpulse",
"createdAt": "2022-08-07T07:39:37.055Z",
"implementationVersion": 2,
"db": false,
"metadata": {
"created": "2023-08-29T01:32:50.434Z",
"dspConfig": {
"options": {
"scale-axes": 1,
"filter-cutoff": 8,
"filter-order": 6,
"fft-length": 64,
"spectral-peaks-count": 3,
"spectral-peaks-threshold": 0.1,
"spectral-power-edges": "0.1, 0.5, 1.0, 2.0, 5.0",
"do-log": true,
"do-fft-overlap": true,
"wavelet-level": 1,
"extra-low-freq": false,
"input-decimation-ratio": "1",
"filter-type": "low",
"analysis-type": "FFT",
"wavelet": "db4"
},
"performance": {
"latency": 4,
"ram": 2144
},
"calculateFeatureImportance": false
},
"labels": [
"idle",
"snake",
"updown",
"wave"
],
"featureLabels": [
"accX RMS",
"accX Skewness",
"accX Kurtosis",
"accX Spectral Power 0.49 - 1.46 Hz",
"accX Spectral Power 1.46 - 2.44 Hz",
"accX Spectral Power 2.44 - 3.42 Hz",
"accX Spectral Power 3.42 - 4.39 Hz",
"accX Spectral Power 4.39 - 5.37 Hz",
"accX Spectral Power 5.37 - 6.35 Hz",
"accX Spectral Power 6.35 - 7.32 Hz",
"accX Spectral Power 7.32 - 8.3 Hz",
"accY RMS",
"accY Skewness",
"accY Kurtosis",
"accY Spectral Power 0.49 - 1.46 Hz",
"accY Spectral Power 1.46 - 2.44 Hz",
"accY Spectral Power 2.44 - 3.42 Hz",
"accY Spectral Power 3.42 - 4.39 Hz",
"accY Spectral Power 4.39 - 5.37 Hz",
"accY Spectral Power 5.37 - 6.35 Hz",
"accY Spectral Power 6.35 - 7.32 Hz",
"accY Spectral Power 7.32 - 8.3 Hz",
"accZ RMS",
"accZ Skewness",
"accZ Kurtosis",
"accZ Spectral Power 0.49 - 1.46 Hz",
"accZ Spectral Power 1.46 - 2.44 Hz",
"accZ Spectral Power 2.44 - 3.42 Hz",
"accZ Spectral Power 3.42 - 4.39 Hz",
"accZ Spectral Power 4.39 - 5.37 Hz",
"accZ Spectral Power 5.37 - 6.35 Hz",
"accZ Spectral Power 6.35 - 7.32 Hz",
"accZ Spectral Power 7.32 - 8.3 Hz"
],
"valuesPerAxis": 11,
"windowCount": 2554,
"featureCount": 33,
"windowSizeMs": 2000,
"windowIncreaseMs": 240,
"frequency": 62.5,
"padZeros": false,
"outputConfig": {
"type": "flat",
"shape": {
"width": 33
}
},
"performance": {
"latency": 4,
"ram": 2144
},
"fftUsed": [
64
],
"includeEmptyLabels": false,
"inputShape": [
375
],
"includedSamplesAreInOrder": true
}
}
],
"learnBlocks": [
{
"id": 7,
"type": "keras",
"name": "NN Classifier",
"dsp": [
24
],
"title": "Neural Network (Keras)",
"primaryVersion": true,
"db": false
},
{
"id": 30,
"type": "anomaly",
"name": "Anomaly detection",
"dsp": [
24
],
"title": "Anomaly Detection (K-means)",
"primaryVersion": true,
"createdBy": "createImpulse",
"createdAt": "2023-08-29T01:40:50.747Z",
"db": false
}
]
},
"project": {
"name": "Tutorial: Continuous motion recognition",
"id": 276194,
"owner": "Edge Impulse Docs",
"studioHost": "studio.edgeimpulse.com"
},
"sensor": "accelerometer",
"tfliteModels": [
{
"arenaSize": 2982,
"inputFrameSize": 33,
"inputTensor": "dense_input",
"outputTensor": "y_pred/Softmax:0",
"details": {
"modelType": "int8",
"inputs": [
{
"dataType": "int8",
"name": "serving_default_x:0",
"shape": [
1,
33
],
"quantizationScale": 0.10049157589673996,
"quantizationZeroPoint": -70
}
],
"outputs": [
{
"dataType": "int8",
"name": "StatefulPartitionedCall:0",
"shape": [
1,
4
],
"quantizationScale": 0.00390625,
"quantizationZeroPoint": -128
}
]
},
"modelPath": "/home/input/trained.tflite"
}
]
}
Last updated