使用 TFLite 进行图像分类和编码
这些用例使用 InceptionV3 TFLite 模型对单个摄像头流的场景进行分类,并叠加或合成分类标签,然后对流进行编码。
变体 1:使用 qtioverlay 插件来应用分类叠加
运行用例:
setprop persist.overlay.use_c2d_blit 2
gst-launch-1.0 -e qtiqmmfsrc name=camsrc ! video/x-raw\(memory:GBM\),format=NV12,width=1280,height=720,framerate=30/1,compression=ubwc ! queue ! tee name=split split. ! queue ! qtimetamux name=metamux ! queue ! qtioverlay ! queue ! v4l2h264enc capture-io-mode=5 output-io-mode=5 ! h264parse ! queue ! mp4mux ! queue ! filesink location=/opt/video.mp4 split. ! queue ! qtimlvconverter ! queue ! qtimltflite delegate=external external-delegate-path=libQnnTFLiteDelegate.so external-delegate-options="QNNExternalDelegate,backend_type=htp;" model=/opt/inceptionv3.tflite ! queue ! qtimlvclassification threshold=40.0 results=2 module=mobilenet labels=/opt/classification.labels ! text/x-raw ! queue ! metamux.
如需停止用例,可按下 CTRL + C。
下图显示了用例执行流程:
- 识别从摄像头源传来的数据流。
- 使用 overlaylib 叠加分类标签。
- 将数据流编码为 H.264 码流。
- 将数据流多路复用到 MP4 容器中并存储为 MP4 文件。
pipeline 执行的顺序处理阶段如下表所示:
变体 2:使用 qtivcomposer 混合原始帧与分类掩码
运行用例:
gst-launch-1.0 -e --gst-debug=2 qtiqmmfsrc name=camsrc ! video/x-raw\(memory:GBM\),format=NV12,width=1280,height=720,framerate=30/1,compression=ubwc ! queue ! tee name=split split. ! queue ! qtivcomposer name=mixer sink_1::position="<30, 30>" sink_1::dimensions="<320, 180>" ! queue ! video/x-raw\(memory:GBM\),format=NV12,width=1920,height=1080,interlace-mode=progressive,colorimetry=bt601 ! v4l2h264enc capture-io-mode=5 output-io-mode=5 ! h264parse ! queue ! mp4mux ! queue ! filesink location=/opt/video.mp4 split. ! queue ! qtimlvconverter ! queue ! qtimltflite delegate=external external-delegate-path=libQnnTFLiteDelegate.so external-delegate-options="QNNExternalDelegate,backend_type=htp;" model=/opt/inceptionv3.tflite ! queue ! qtimlvclassification threshold=40.0 results=2 module=mobilenet labels=/opt/classification.labels ! video/x-raw,format=BGRA,width=640,height=360 ! queue ! mixer.
如需停止用例,可按下 CTRL + C。
下图显示了用例执行流程:
- 识别从摄像头源传来的数据流。
- 使用 qtivcomposer 合成分类标签和视频流。
- 将数据流编码为 H.264 码流。
- 将数据流多路复用到 MP4 容器中,并将其存储为 MP4 文件。
pipeline 执行的顺序处理阶段如下表所示:
使用 TFLite 进行目标检测和显示
这些用例使用 YOLOv5 TFLite 模型来识别场景中的目标对象,在检测到的目标对象上叠加或合成边框,然后显示结果。
变体 1:使用 qtioverlay 插件应用边框叠加
运行用例:
setprop persist.overlay.use_c2d_blit 2
gst-launch-1.0 -e --gst-debug=2 qtiqmmfsrc name=camsrc ! video/x-raw\(memory:GBM\),format=NV12,width=1280,height=720,framerate=30/1,compression=ubwc ! queue ! tee name=split split. ! queue ! qtimetamux name=metamux ! queue ! qtioverlay ! queue ! waylandsink fullscreen=true split. ! queue ! qtimlvconverter ! queue ! qtimltflite delegate=external external-delegate-path=libQnnTFLiteDelegate.so external-delegate-options="QNNExternalDelegate,backend_type=htp;" model=/opt/yolov5.tflite ! queue ! qtimlvdetection threshold=75.0 results=10 module=yolov5 labels=/opt/yolov5.labels constants="YoloV5,q-offsets=<3.0>,q-scales=<0.005047998391091824>;" ! text/x-raw ! queue ! metamux.
如需停止用例,可按下 CTRL + C。
下图显示了用例执行流程:
- 从摄像头源传来的视频流中识别场景中的目标对象场景。
- 使用 overlaylib 将边框叠加在检测到的目标对象上。
- 显示结果。
pipeline 执行的顺序处理阶段如下表所示:
变体 2:使用 qtivcomposer 混合原始帧与边框掩码
运行用例:
gst-launch-1.0 -e --gst-debug=2 qtiqmmfsrc name=camsrc ! video/x-raw\(memory:GBM\),format=NV12,width=1280,height=720,framerate=30/1,compression=ubwc ! queue ! tee name=split split. ! queue ! qtivcomposer name=mixer sink_1::dimensions="<1920,1080>" ! queue ! waylandsink fullscreen=true split. ! queue ! qtimlvconverter ! queue ! qtimltflite delegate=external external-delegate-path=libQnnTFLiteDelegate.so external-delegate-options="QNNExternalDelegate,backend_type=htp;" model=/opt/yolov5.tflite ! queue ! qtimlvdetection threshold=75.0 results=10 module=yolov5 labels=/opt/yolov5.labels constants="YoloV5,q-offsets=<3.0>,q-scales=<0.005047998391091824>;" ! video/x-raw,format=BGRA,width=640,height=360 ! queue ! mixer.
如需停止用例,可按下 CTRL + C。
下图显示了用例执行流程:
- 从摄像头源传来的视频流中识别场景中的目标对象场景。
- 使用 qtivcomposer 合成以下内容:
- 在检测的目标对象上的边框。
- 原始视频流。
- 显示结果。
pipeline 执行的顺序处理阶段如下表所示: