GstInference Signals
< GstInference | Metadatas
Make sure you also check GstInference's companion project: R2Inference |
| GstInference |
|---|
| Introduction |
| Getting started |
| Supported architectures |
|
InceptionV1 InceptionV3 YoloV2 AlexNet |
| Supported backends |
|
Caffe |
| Metadata and Signals |
| Overlay Elements |
| Utils Elements |
| Legacy pipelines |
| Example pipelines |
| Example applications |
| Benchmarks |
| Model Zoo |
| Project Status |
| Contact Us |
|
Overview
Metadata from GstInference is available to be obtained through GSignals and therefore can be used in other programs or processes such as using Python or C++.
Available Signals
Signals are created and listed in gst-libs/gst/r2inference/gstvideoinference.c
| Signal Name | To be used by | Details |
|---|---|---|
| new-inference | C/C++ | Format can be casted to struct that defines metadata and dereference pointers. |
| new-inference-string | Python, Javascript, Other |
String format needs to be used because pointer dereference from other memory space is not available. |
Inference String Signal
The following code show a simple capture of the signal in GStreamer using Python. It installs the function handler to the signal called "new-inference-string" from GstInference element. The signal sends a string formatted as json which can be parsed in python using json.loads function.
For details about what elements can be accessed in the serialized json string, check this section.
import gi
gi.require_version("Gst", "1.0")
gi.require_version("GstVideo", "1.0")
from gi.repository import Gst, GObject, GstVideo
import json
GObject.threads_init()
Gst.init(None)
def newPrediction(element, meta):
# Parse data from string to json object
data = json.loads(meta)
print(data)
# Settings
video_dev = "/dev/video0"
arch = "mobilenetv2ssd"
backend = "coral"
model = "/home/coral/models/ssd_mobilenet_v2_coco_quant_postprocess_edgetpu.tflite"
input_layer = "" # Needed by other backends such as Tensorflow
output_layer = "" # Needed by other backends such as Tensorflow
# Pipeline
inf_pipe_str = "v4l2src device=%s ! videoscale ! videoconvert ! \
video/x-raw,width=640,height=480,format=I420 ! \
videoconvert ! inferencebin arch=%s backend=%s \
model-location=%s input-layer=%s output-layer=%s \
overlay=true name=net ! \
videoconvert ! autovideosink name=videosink sync=false" % \
(video_dev,arch,backend,model,input_layer,output_layer)
# Load pipeline from string
inference_pipe = Gst.parse_launch(inf_pipe_str)
# Start pipeline
inference_pipe.set_state(Gst.State.PLAYING)
if (not inference_pipe):
print("Unable to create pipeline")
exit(1)
# Search for arch element from inferencebin
net = inference_pipe.get_by_name("arch")
# Connect to inference string signal
net.connect("new-inference-string", newPrediction)
# Launch loop
loop = GObject.MainLoop()
loop.run()
