ZHCADU3 February   2024 AM62A3 , AM62A3-Q1 , AM62A7 , AM62A7-Q1 , AM62P , AM62P-Q1 , DS90UB953A-Q1 , DS90UB960-Q1 , TDES960 , TSER953

 

  1.   1
  2.   摘要
  3.   商标
  4. 1引言
  5. 2将多个 CSI-2 摄像头连接到 SoC
    1. 2.1 使用 SerDes 的 CSI-2 聚合器
    2. 2.2 不使用 SerDes 的 CSI-2 聚合器
  6. 3在软件中启用多个摄像头
    1. 3.1 摄像头子系统软件架构
    2. 3.2 图像流水线软件架构
  7. 4参考设计
    1. 4.1 支持的摄像头
    2. 4.2 设置四个 IMX219 摄像头
    3. 4.3 配置摄像头和 CSI-2 RX 接口
    4. 4.4 从四个摄像头进行流式传输
      1. 4.4.1 将摄像头数据流化传输到显示器
      2. 4.4.2 通过以太网流式传输摄像头数据
      3. 4.4.3 将摄像头数据存储到文件
    5. 4.5 多摄像头深度学习推理
      1. 4.5.1 模型选择
      2. 4.5.2 流水线设置
  8. 5性能分析
  9. 6总结
  10. 7参考资料

流水线设置

图 4-3 展示了 4 摄像头深度学习 GStreamer 流水线。TI 提供了一套 GStreamer 插件,可将部分媒体处理和深度学习推理负载分流到硬件加速器。这些插件的一些示例包括 tiovxisp、tiovxmultiscaler、tiovxmosaic 和 tidlinferer。图 4-3 中的流水线包括多路径 GStreamer 流水线的所有必需插件,用于 4 个摄像头输入,每个都带有媒体预处理、深度学习推理和后处理功能。每个摄像头路径的重复插件均在图形中堆叠在一起,以便于演示。

可用的硬件资源均匀地分布在四个摄像头路径中。例如,AM62A 包含两个图像多标量:MSC0 和 MSC1。该流水线明确指定了 MSC0 来处理摄像头 1 和摄像头 2 路径,而 MSC1 专用于摄像头 3 和摄像头 4。

GUID-20240205-SS0I-J31T-HSVP-NLTDBHKV5NPZ-low.svg图 4-3 AM62A 上四路 CSI IMX219 摄像头深度学习推理的 GStreamer 流水线

四个摄像头流水线的输出通过 tiovxmosaic 插件缩小并连接在一起。输出显示在单个屏幕上。图 4-4 展示了深度学习模型运行对象检测时四个摄像头的输出。每个流水线(摄像头)以 30FPS 和总计 120FPS 的速度运行。

GUID-88F22099-E726-45D1-B1D0-1E94AB1C2B69-low.png图 4-4 使用 AM62A 且具有图形性能叠层的四摄像头物体检测深度学习推理屏幕截图

接下来是多摄像头深度学习用例的完整流水线脚本,如图 4-3 所示。

gst-launch-1.0 -v \
v4l2src device=/dev/video2 io-mode=5 ! queue leaky=2 ! video/x-bayer, width=1920, height=1080, format=rggb ! tiovxisp sensor-name=SENSOR_SONY_IMX219_RPI dcc-isp-file=/opt/imaging/imx219/dcc_viss.bin format-msb=7 sink_0::dcc-2a-file=/opt/imaging/imx219/dcc_2a.bin sink_0::device=/dev/v4l-subdev2 ! video/x-raw, format=NV12 ! \
tiovxmultiscaler target=0 name=split_01 \
split_01. ! queue ! video/x-raw, width=1110, height=690 ! tiovxmultiscaler target=0 ! video/x-raw, width=300, height=300 ! tiovxdlpreproc data-type=3 channel-order=1 tensor-format=rgb out-pool-size=4 ! application/x-tensor-tiovx ! tidlinferer target=1 model=/opt/model_zoo/TFL-OD-2000-ssd-mobV1-coco-mlperf-300x300 ! post_0.tensor \
split_01. ! queue ! video/x-raw, width=640, height=360 ! post_0.sink \
tidlpostproc name=post_0 model=/opt/model_zoo/TFL-OD-2000-ssd-mobV1-coco-mlperf-300x300 alpha=0.400000 viz-threshold=0.600000 top-N=5 ! queue ! mosaic_0. \
\
v4l2src device=/dev/video3 io-mode=5 ! queue leaky=2 ! video/x-bayer, width=1920, height=1080, format=rggb ! tiovxisp sensor-name=SENSOR_SONY_IMX219_RPI dcc-isp-file=/opt/imaging/imx219/dcc_viss.bin format-msb=7 sink_0::dcc-2a-file=/opt/imaging/imx219/dcc_2a.bin sink_0::device=/dev/v4l-subdev2 ! video/x-raw, format=NV12 ! \
tiovxmultiscaler target=0 name=split_11 \
split_11. ! queue ! video/x-raw, width=1110, height=690 ! tiovxmultiscaler target=0 ! video/x-raw, width=300, height=300 ! tiovxdlpreproc data-type=3 channel-order=1 tensor-format=rgb out-pool-size=4 ! application/x-tensor-tiovx ! tidlinferer target=1 model=/opt/model_zoo/TFL-OD-2000-ssd-mobV1-coco-mlperf-300x300 ! post_1.tensor \
split_11. ! queue ! video/x-raw, width=640, height=360 ! post_1.sink \
tidlpostproc name=post_1 model=/opt/model_zoo/TFL-OD-2000-ssd-mobV1-coco-mlperf-300x300 alpha=0.400000 viz-threshold=0.600000 top-N=5 ! queue ! mosaic_0. \
\
v4l2src device=/dev/video4 io-mode=5 ! queue leaky=2 ! video/x-bayer, width=1920, height=1080, format=rggb ! tiovxisp sensor-name=SENSOR_SONY_IMX219_RPI dcc-isp-file=/opt/imaging/imx219/dcc_viss.bin format-msb=7 sink_0::dcc-2a-file=/opt/imaging/imx219/dcc_2a.bin sink_0::device=/dev/v4l-subdev2 ! video/x-raw, format=NV12 ! \
tiovxmultiscaler target=1 name=split_21 \
split_21. ! queue ! video/x-raw, width=1110, height=690 ! tiovxmultiscaler target=1 ! video/x-raw, width=300, height=300 ! tiovxdlpreproc data-type=3 channel-order=1 tensor-format=rgb out-pool-size=4 ! application/x-tensor-tiovx ! tidlinferer target=1 model=/opt/model_zoo/TFL-OD-2000-ssd-mobV1-coco-mlperf-300x300 ! post_2.tensor \
split_21. ! queue ! video/x-raw, width=640, height=360 ! post_2.sink \
tidlpostproc name=post_2 model=/opt/model_zoo/TFL-OD-2000-ssd-mobV1-coco-mlperf-300x300 alpha=0.400000 viz-threshold=0.600000 top-N=5 ! queue ! mosaic_0. \
\
v4l2src device=/dev/video5 io-mode=5 ! queue leaky=2 ! video/x-bayer, width=1920, height=1080, format=rggb ! tiovxisp sensor-name=SENSOR_SONY_IMX219_RPI dcc-isp-file=/opt/imaging/imx219/dcc_viss.bin format-msb=7 sink_0::dcc-2a-file=/opt/imaging/imx219/dcc_2a.bin sink_0::device=/dev/v4l-subdev2 ! video/x-raw, format=NV12 ! \
tiovxmultiscaler target=1 name=split_31 \
split_31. ! queue ! video/x-raw, width=1110, height=690 ! tiovxmultiscaler target=1 ! video/x-raw, width=300, height=300 ! tiovxdlpreproc data-type=3 channel-order=1 tensor-format=rgb out-pool-size=4 ! application/x-tensor-tiovx ! tidlinferer target=1 model=/opt/model_zoo/TFL-OD-2000-ssd-mobV1-coco-mlperf-300x300 ! post_3.tensor \
split_31. ! queue ! video/x-raw, width=640, height=360 ! post_3.sink \
tidlpostproc name=post_3 model=/opt/model_zoo/TFL-OD-2000-ssd-mobV1-coco-mlperf-300x300 alpha=0.400000 viz-threshold=0.600000 top-N=5 ! queue ! mosaic_0. \
\
tiovxmosaic src::pool-size=3 name=mosaic_0 \
sink_0::startx="<320>"  sink_0::starty="<180>"  sink_0::widths="<640>"   sink_0::heights="<360>"  \
sink_1::startx="<960>"  sink_1::starty="<180>"  sink_1::widths="<640>"   sink_1::heights="<360>"  \
sink_2::startx="<320>"  sink_2::starty="<560>"  sink_2::widths="<640>"   sink_2::heights="<360>"  \
sink_3::startx="<960>"  sink_3::starty="<560>"  sink_3::widths="<640>"   sink_3::heights="<360>"  \
! video/x-raw,format=NV12, width=1920, height=1080 ! queue ! tiperfoverlay title="AM62A: Quad Camera Object Detection" ! kmssink sync=false driver-name=tidss force-modesetting=true