Static object experimental data stream
Available from AXIS OS 13.0, the com.axis.scene.frame.experimental.static.v0 topic provides scene metadata for both moving and stationary objects. The topic also introduces confidence groups, simplified object attributes, and updates that omit unchanged detections. It extends the Frame v1 format.
You can consume the topic over MQTT or from an ACAP application through the Device Data Hub API.
Experimental topic
Use this topic only for testing and evaluation. Don't use it in production. The topic will be removed after the evaluation period. Some features may later become part of production topics, based on feedback.
The topic is currently not supported on radar cameras, including AXIS Q1656-DLE and AXIS Q1686-DLE.
Changes from Frame v1
The experimental topic changes how you interpret both individual detections and complete messages.
| Type of change | Update |
|---|---|
| Added | Every detection has a moving property |
| Added | Every classification has a confidence_group in addition to its score |
| Added | A Disappeared event marks an object as temporarily not detected while its track remains active |
| Changed | A message may omit unchanged detections; an omitted detection keeps its previous state |
| Changed | Color, clothing color, and face visibility contain one result instead of scored alternatives or a score |
Comparing the formats
The following examples represent the same human detection. The experimental format adds confidence_group and moving. It also replaces Frame v1 arrays, which contain every supported color and its score, with the most likely color for each item of clothing.
- Experimental format
- Frame v1
{
"object_track_id": "human-17",
"class": {
"type": "Human",
"score": 0.88,
// Added: use this value when filtering classifications
"confidence_group": "Selective",
// Changed: one value without alternatives or scores
"upper_clothing_color": "red",
"lower_clothing_color": "black"
},
"bounding_box": {
"left": 0.31,
"top": 0.38,
"right": 0.43,
"bottom": 0.73
},
// Added: current movement state
"moving": false
}
{
"object_track_id": "human-17",
"class": {
"type": "Human",
"score": 0.88,
// Frame v1: all supported colors and their scores
"upper_clothing_colors": [
{
"name": "red",
"score": 0.82
},
{
"name": "black",
"score": 0.31
},
{
"name": "blue",
"score": 0.16
},
{
"name": "white",
"score": 0.11
},
{
"name": "gray",
"score": 0.08
},
{
"name": "beige",
"score": 0.04
},
{
"name": "green",
"score": 0.02
},
{
"name": "yellow",
"score": 0.01
}
],
"lower_clothing_colors": [
{
"name": "black",
"score": 0.91
},
{
"name": "blue",
"score": 0.22
},
{
"name": "gray",
"score": 0.14
},
{
"name": "white",
"score": 0.08
},
{
"name": "beige",
"score": 0.05
},
{
"name": "red",
"score": 0.03
},
{
"name": "green",
"score": 0.02
},
{
"name": "yellow",
"score": 0.01
}
]
},
"bounding_box": {
"left": 0.31,
"top": 0.38,
"right": 0.43,
"bottom": 0.73
}
}
Movement state
Each detection has a required moving property that reports whether the object's position in the scene is changing:
true: The object's position is changing.false: The object's position is stationary.
The property doesn't describe movement within the object. For example, a person dancing in place can have moving: false because their position remains the same. The producer determines whether the object is moving based on its detected position. This assessment can change during a track as the detected position changes.
Filter classifications by confidence group
Each classification includes both score and confidence_group. A given score can represent different levels of confidence across models, firmware versions, and analytics releases. As a result, filtering on a fixed score can produce different results after an update.
Use confidence_group instead of a fixed score threshold to decide which classifications to accept. Don't calculate a confidence group from score.
The groups are ordered from broader detection to higher confidence. Each classification has exactly one group. Use the groups as acceptance settings for your use case, not as fixed score ranges. The use cases below are examples, not definitions of the groups.
Broad: Search across all possible detections when missing one is costly.Inclusive: Provide a broad set of candidates for further analysis by an AI system.Balanced: Support general-purpose detection with a balance of missed and false detections.Selective: Trigger notifications when false detections are more costly.Strict: Trigger an action only for highly reliable detections.
Groups are mutually exclusive. A Balanced classification is more confident
than an Inclusive classification, but it isn't also Inclusive. To require
Balanced confidence or higher, check for Balanced, Selective, or Strict.
Because each classification has its own group, you can use different minimum
groups for different objects or actions. For example, accept Balanced for
people counting but require Strict before triggering an intrusion alert.
To set a minimum confidence group, filter out every broader group. For example, a minimum of Balanced filters out Broad and Inclusive, leaving Balanced, Selective, and Strict.
You can use Data Transformation with jq to filter the topic on the device. This expression removes Broad and Inclusive detections:
.detections |= (
. // []
| map(
.class.confidence_group as $group
| select($group != "Broad" and $group != "Inclusive")
)
)
Read simplified object attributes
The experimental topic simplifies attributes that otherwise require you to compare scores. It reports only the most likely color or clothing color, without a score. It also reports face visibility as a boolean value.
| Object class | Frame v1 | Experimental topic |
|---|---|---|
Bus, Car, and Truck | colors: every supported color and its score | color: the most likely color as a string |
Human | upper_clothing_colors: every supported color and its score | upper_clothing_color: the most likely color as a string |
Human | lower_clothing_colors: every supported color and its score | lower_clothing_color: the most likely color as a string |
Head | face_visible: a score from 0.0 to 1.0 | face_visible: true or false |
Other attributes keep their Frame v1 representation. This includes carries_bag, license_plate_id, nested license_plate data, and the country_code, plate_number, and vehicle_id properties of a license plate detection.
Interpret updates and tracking events
Frame v1 reports all detections present in each frame. The experimental topic can instead omit a detection when its state hasn't changed. For example, a stationary object may not appear in every message.
Maintain the current state
To maintain the current state of the scene, store the latest detection for each object_track_id and update it as follows:
- When an ID appears for the first time, add the detection to your current object state.
- When the same ID appears again, replace its previous detection and mark the object as detected.
- When a message omits an ID, leave that detection and its visibility state unchanged.
- When you receive
Rename, associate the detections stored forfrom_idwithto_id. Useto_idas the continuing identity. - When you receive
Disappeared, mark the object as not detected. - When you receive
TrackEnded, remove the object from your current state. It won't be mentioned again.