網頁

2020年11月2日 星期一

DeepStream 之 gst-dsexample 研究


這個範例分成兩個版本
gstdsexample.cpp 和 gstdsexample_optimized.cpp
版本的區分要在 Makefile 的 USE_OPTIMIZED_DSEXAMPLE 設定

要存檔測試時,需打開下列開關,執行時加上 sudo
//#define DSEXAMPLE_DEBUG

在 Jetson 機器上執行時,要在 nvdsosd 和 nveglglessink 中間加上 nvegltransform
在 Tesla 機器上 nvvideoconvert 要加上 nvbuf-memory-type=nvbuf-mem-cuda-unified
gstdsexample.cpp 有 full-frame 和 blur-objects 參數
gstdsexample_optimized.cpp 有 full-frame 和 batch-size 參數
範例如下
$ gst-launch-1.0 filesrc location=/opt/nvidia/deepstream/deepstream-5.0/samples/streams/sample_720p.mp4 \
! qtdemux ! h264parse ! nvv4l2decoder ! m.sink_0 nvstreammux name=m batch-size=1 width=1280 height=720 ! \
nvinfer config-file-path=/opt/nvidia/deepstream/deepstream-5.0/samples/configs/deepstream-app/config_infer_primary.txt ! \
nvvideoconvert nvbuf-memory-type=nvbuf-mem-cuda-unified ! 'video/x-raw(memory:NVMM), format=RGBA' ! \
dsexample full-frame=0 blur-objects=1 ! nvdsosd ! nveglglessink


gstdsexample.cpp 說明
gst_dsexample_transform_ip()



gstdsexample_optimized.cpp 說明
gst_dsexample_start()
建立兩組 queue
  dsexample->process_queue = g_queue_new ();
  dsexample->cvmat_queue = g_queue_new ();
並預先放入兩組 cvmat array 到 cvmat_queue 
  for (int i = 0; i < 2; i++) {
    cvmat = new cv::Mat[dsexample->max_batch_size];
    g_queue_push_tail (dsexample->cvmat_queue, cvmat);
  }
啟動 gst_dsexample_output_loop thread
  dsexample->process_thread =
      g_thread_new ("dsexample-process-thread", gst_dsexample_output_loop,
      dsexample);

gst_dsexample_submit_input_buffer()
啟動於每次資料由 sink 進入
一次的資料會包含多個 frame, 一的 frame 有多個 object
透過 scale_and_fill_data() 將資料放入 dsexample->batch_insurf
當 dsexample->batch_insurf 滿了(或是最後一次未滿) 透過
convert_batch_and_push_to_process_thread() 轉換到 dsexample->inter_buf
  batch->cvmat = (cv::Mat *) g_queue_pop_head (dsexample->cvmat_queue);
  由 dsexample->inter_buf 產生 batch->cvmat
  g_queue_push_tail (dsexample->process_queue, batch);
要離開 gst_dsexample_submit_input_buffer() 時,
多 push 一次輸出訊號(batch->push_buffer = TRUE)
    g_queue_push_tail (dsexample->process_queue, buf_push_batch);

gst_dsexample_output_loop()
輸出的 thread, 一直 loop, 直到結束
  batch = g_queue_pop_head (dsexample->process_queue));
  if (batch->push_buffer) {
    gst_pad_push (GST_BASE_TRANSFORM_SRC_PAD (dsexample), batch->inbuf);
  }
  g_queue_push_tail (dsexample->cvmat_queue, batch->cvmat);



1 則留言:

  1. 生活紀錄: Deepstream 之 Gst-Dsexample 研究 >>>>> Download Now

    >>>>> Download Full

    生活紀錄: Deepstream 之 Gst-Dsexample 研究 >>>>> Download LINK

    >>>>> Download Now

    生活紀錄: Deepstream 之 Gst-Dsexample 研究 >>>>> Download Full

    >>>>> Download LINK iq

    回覆刪除