我們在Day 06的時候又示範過執行一路串流,而只要你的硬體扛的住,DeepStream就能一次執行多路串流,但各路畫面是獨立的,所以就得靠nvmultistreamtiler這個元件來完成畫面的佈局。
之前範例的設定檔是batch-size=1,模型也只能支援batch-size=1的推論,所以我們需要先建立一個新的模型及一份新的設定檔
參考Day 09的方式建立模型,這邊為了閱讀方便就再寫一次指令
export ONNX_FILE="/opt/nvidia/deepstream/deepstream/samples/models/Primary_Detector/resnet18_trafficcamnet_pruned.onnx"
export ENGINE_FILE="/opt/nvidia/deepstream/deepstream/samples/models/Primary_Detector/resnet18_trafficcamnet_pruned.onnx_b4_gpu0_fp16.engine"
trtexec \
--onnx=${ONNX_FILE} \
--saveEngine=${ENGINE_FILE} \
--minShapes=input_1:0:1x3x544x960 \
--optShapes=input_1:0:4x3x544x960 \
--maxShapes=input_1:0:4x3x544x960 \
--fp16
複製設定檔/opt/nvidia/deepstream/deepstream/sources/apps/sample_apps/deepstream-test1/dstest1_pgie_config.txt並修改屬性
cd /opt/nvidia/deepstream/deepstream/sources/apps/sample_apps/deepstream-test1
cp dstest1_pgie_config.txt dstest1_pgie_config_b4.txt
選擇你心儀的文字編輯工具去修改batch-size和model-engine-file
[...]
model-engine-file=../../../../samples/models/Primary_Detector/resnet18_trafficcamnet_pruned.onnx_b4_gpu0_fp16.engine
[...]
batch-size=4
我們修改一下先前的指令,修改一下batch-size,以及加入nvmultistreamtiler,記得nvmultistreamtiler要放在nvdsosd前面。
cd /ironman
export SOURCE="nvurisrcbin uri=file:///opt/nvidia/deepstream/deepstream/samples/streams/sample_720p.mp4"
gst-launch-1.0 \
${SOURCE} ! mux.sink_0 \
${SOURCE} ! mux.sink_1 \
${SOURCE} ! mux.sink_2 \
${SOURCE} ! mux.sink_3 \
nvstreammux name=mux batch-size=4 width=1280 height=720 ! \
nvinfer config-file-path=/opt/nvidia/deepstream/deepstream/sources/apps/sample_apps/deepstream-test1/dstest1_pgie_config_b4.txt ! \
nvmultistreamtiler rows=2 columns=2 ! \
nvdsosd ! \
nvv4l2h264enc ! \
h264parse ! \
mp4mux ! \
filesink location=/ironman/demo_infer_b4.mp4
完成之後就可以看到你的串流畫面變成4個啦

元件有width和height兩個屬性讓你調整拼接完畫面的大小,預設是1920x1080,可以根據你的應用需求去設定
剛才我們設定了rows=2和columns=2,如果你沒有設定這兩個屬性,元件會依據內部寫好的算法去分配畫面的佈局。
目前元件只支援等比例佈局,但有預留一個屬性是custom-tile-config,但很不幸的目前官方文件寫著
Reserved for future use. Default: null.
所以大家可以再期待一下,有朝一日!
應用情境也會有需要單獨看某一個畫面的時候,畢竟示範的畫面都長這樣了,變成監控系統也是合情合理的對吧。元件有個屬性show-source讓我們指定要特寫哪一個畫面,預設是-1代表全畫面布局。例如我要特寫左下角那個畫面就設定show-source=2(ID從0開始算)
nvmultistreamtiler rows=2 columns=2 show-source=2
這個屬性是可以在runtime修改的,並且是執行緒安全,但是要做到這樣就得寫一個程式,我覺得有點超出我們介紹的進度,如果你會寫C的話可以嘗試從DeepStream提供的範例原始碼去修改
今天的元件比較簡單,重點就是調整畫面佈局跟特寫畫面,也建議大家可以練習寫一下C程式去定時切換show-source,相信現在有AI工具的輔助是很容易的。