Object Detection API
The Object Detection API provides interfaces for both consuming and providing object detection results in the Auterion ecosystem. It consists of two main components:
Object Detection Client: Used by applications that want to receive object detection results
Object Detection Provider: Used by applications that perform object detection and want to publish their results
Object Detection Client
The Object Detection Client allows applications to subscribe to object detections and control the object detection service. This is useful for applications that need to react to detected objects or visualize detection results. Controlling the object detection service is particularly useful for resource management in cases where the detection result is used by another resource heavy application for which the resources of the object detection service should be freed.
Subscribing to Object Detections
To receive object detection results, instantiate an ObjectDetectionClient
and subscribe to detections:
auterion::ObjectDetectionClient object_detection_client{sdk};
// Subscribe to detection updates with a callback
object_detection_client.subscribeDetections2D([](const auterion::ImageDetections2D& detections) {
std::cout << "Received " << detections.detections.size() << " detections" << std::endl;
// Process each detection
for (const auto& detection : detections.detections) {
// Access detection properties
const auto& bbox = detection.bbox;
std::cout << "Detection at position (" << bbox.center.x() << ", " << bbox.center.y()
<< ") with size " << bbox.size_x << "x" << bbox.size_y << std::endl;
// Access object hypotheses (class labels and confidence scores)
for (const auto& hypothesis : detection.object_hypotheses) {
std::cout << " Class: " << hypothesis.class_id
<< ", Score: " << hypothesis.score << std::endl;
}
}
});
Querying Latest Detections
You can also query the latest detection results without using callbacks:
auterion::ObjectDetectionClient object_detection_client{sdk};
// Activate subscription without callback
object_detection_client.subscribeDetections2D();
// Later, check if we have valid detections and process them
if (object_detection_client.detections2D().isLastValid()) {
const auto detections = object_detection_client.detections2D().last();
// Process detections...
}
Controlling the Object Detection Service
The client can enable or disable the object detection service:
auterion::ObjectDetectionClient object_detection_client{sdk};
// Enable object detection
object_detection_client.enableObjectDetection();
// ... perform operations that require object detection ...
// Disable object detection when no longer needed
object_detection_client.disableObjectDetection();
Object Detection Provider
The Object Detection Provider is used by applications that perform object detection and want to publish their results to other applications in the system. This is typically used by computer vision applications that process camera images and detect objects.
Publishing Object Detections
To publish object detection results, instantiate an ObjectDetectionProvider
and publish detections:
auterion::ObjectDetectionProvider object_detection_provider{sdk};
// Create detections from an input image
auterion::ImageDetections2D detections;
// The timestamp must match the input image that was used to generate these detections
detections.image_timestamp = input_image_timestamp; // e.g. from camera timestamp
// Add a detection with bounding box and class information
auterion::Detection2D detection;
// Set bounding box center and size
detection.bbox.center = Eigen::Vector2d{100.0, 200.0}; // x, y coordinates in pixels
detection.bbox.size_x = 50.0; // width in pixels
detection.bbox.size_y = 30.0; // height in pixels
// Add object hypotheses (class labels and confidence scores)
detection.object_hypotheses.emplace_back("person", 0.95); // class name and confidence
detection.object_hypotheses.emplace_back("pedestrian", 0.92); // multiple hypotheses possible
// Add the detection to the list
detections.detections.push_back(std::move(detection));
// Publish the detections
object_detection_provider.updateDetections2D(detections);
Controlling Provider Operation Based on Service State
The provider must respond to the object detection service's enabled/disabled state by starting or stopping its computational work. This prevents unnecessary processing when the service is disabled and ensures the provider is ready when enabled.
Important: Providers should implement proper enable/disable logic to:
Stop heavy computational work (image processing, inference) when
enable = false
Resume processing and publishing detections when
enable = true
Avoid wasting system resources when the service is not needed
auterion::ObjectDetectionProvider object_detection_provider{sdk};
// Subscribe to object detection enabled changes and control processing accordingly
object_detection_provider.subscribeObjectDetectionEnabled([&](bool enable) {
if (enabled) {
std::cout << "Object detection service enabled - starting processing pipeline" << std::endl;
// REQUIRED: Start your heavy computational work here
startImageProcessing();
} else {
std::cout << "Object detection service disabled - stopping processing pipeline" << std::endl;
// REQUIRED: Stop heavy computational work to save resources
stopImageProcessing();
}
});
You can also check the service state programmatically, but the immediate action via callback is encouraged:
auterion::ObjectDetectionProvider object_detection_provider{sdk};
// Activate subscription to object detection enabled state
object_detection_provider.subscribeObjectDetectionEnabled();
// Later, check if object detection is enabled
if (object_detection_provider.objectDetectionEnabled().isLastValid()) {
bool enable = object_detection_provider.objectDetectionEnabled().last();
if (enable) {
// Object detection service is active
ensureProcessingIsActive();
} else {
// Object detection service is inactive
stopProcessingToSaveResources();
}
}
Data Structures
The structure below is intentionally similar to ROS vision messages, but kept simpler.
ImageDetections2D
The ImageDetections2D
structure contains a timestamp and a list of detections:
struct ImageDetections2D {
rclcpp::Time image_timestamp; // Timestamp of the image these detections are from
std::vector<Detection2D> detections; // List of detections in the image
};
The timestamp's purpose is to be able to match detections to the images were the originated when both are used in other applications.
Detection2D
Each Detection2D
contains a bounding box and a list of object hypotheses:
struct Detection2D {
BoundingBox2D bbox; // The 2D bounding box of the detected object.
std::vector<ObjectHypothesis>
object_hypotheses; // A list of hypotheses for the object in the bounding box.
std::optional<uint64_t> track_id; // Optional track ID for the object.
};
BoundingBox2D
The BoundingBox2D
structure defines a 2D bounding box using a center point and size:
struct BoundingBox2D {
Eigen::Vector2d center; // Center of the bounding box in pixels.
double size_x; // Width of the bounding box in pixels.
double size_y; // Height of the bounding box in pixels.
};
ObjectHypothesis
Each ObjectHypothesis
contains a class name and confidence score:
struct ObjectHypothesis {
std::string class_id; // Identifier for the detected class (e.g., "car", "person").
double score{; // Confidence score of the hypothesis, typically in [0, 1].
};
The lower three of these structs can be found separately in <auterion_sdk/object_detection/object_detection_client.hpp>
to also be available idependenly from any ROS headers.
Last updated