網頁

2020年11月11日 星期三

Deepstream nvinfer classification 分析

nvinfer 用於 classification 主要的參數
# 1: 用於物件偵測, 2:用於物件分類
process-mode=2
# 相隔多少 frames 之後要再推導一遍
secondary-reinfer-interval=0
# 同步 or 非同步模式
classifier-async-mode=1

nvinfer 有三個 threads
gst_nvinfer_submit_input_buffer
 主要 thread, 接收上一級傳來的 inbuf, 處理 resize, crop
 用 push input_queue 驅動 gst_nvinfer_input_queue_loop
gst_nvinfer_input_queue_loop
 處理 color format 轉換
 用 push process_queue 驅動 gst_nvinfer_generate_output
gst_nvinfer_generate_output
 用神經網路推導出 label

同步模式
gst_nvinfer_submit_input_buffer
  gst_nvinfer_process_objects (nvinfer, inbuf, in_surf);
    查看 object_id 是否已經在 object_history_map 中
    should_infer_object() 依據形狀大小(變化),多久前推導過,判斷是否要推導
    不須推導放入 batch->objs_pending_meta_attach
    若 object_id 不在 object_history_map, 建立它
    若須推導建立 frame, 放入 batch->frames, 連結 object_history_map 和 frame.history
    將來可透過此取得 label
    須推導, 放入 batch->frames
    若收集到夠多的 frames
    convert_batch_and_push_to_input_thread()
      處理 resize, crop
      g_queue_push_tail (nvinfer->input_queue, batch);
  最後 push_buffer, g_queue_push_tail (nvinfer->input_queue, buf_push_batch);
gst_nvinfer_input_queue_loop
 處理 color format 轉換
 用 push process_queue 驅動 gst_nvinfer_generate_output
gst_nvinfer_generate_output
  if push_buffer gst_pad_push() 傳送 inbuf 往下一級
  推導出 label, 透過 frame.history 設定 object_history_map
  attach_metadata_segmentation()
  將之前 batch->objs_pending_meta_attach, attach_metadata_segmentation()

非同步模式
gst_nvinfer_submit_input_buffer
  gst_nvinfer_process_objects (nvinfer, inbuf, in_surf);
    查看 object_id 是否已經在 object_history_map 中
    should_infer_object() 依據形狀大小(變化),多久前推導過,判斷是否要推導
    若已經有 label, attach_metadata_classifier()
    若 object_id 不在 object_history_map, 建立它
    若須推導建立 frame, 放入 batch->frames, 連結 object_history_map 和 frame.history
    將來可透過此取得 label
    若收集到夠多的 frames
    convert_batch_and_push_to_input_thread()
      處理 resize, crop
      g_queue_push_tail (nvinfer->input_queue, batch);
  gst_pad_push() 傳送 inbuf 往下一級
gst_nvinfer_input_queue_loop
 處理 color format 轉換
 用 push process_queue 驅動 gst_nvinfer_generate_output
gst_nvinfer_generate_output
  推導出 label, 透過 frame.history 設定 object_history_map

CPU GPU(CUDA) 異步並行分析
gst_nvinfer_submit_input_buffer
  cudaMemset2DAsync(convertStream)
gst_nvinfer_input_queue_loop
  cudaStreamWaitEvent(m_PreProcessStream, m_InputConsumedEvent)
  convertFcn(m_PreProcessStream)
  cudaStreamAddCallback(m_PreProcessStream)
  cudaEventRecord(m_PreProcessCompleteEvent, m_PreProcessStream)
  cudaStreamWaitEvent(m_InferStream, m_PreProcessCompleteEvent)
  enqueue(m_InferStream, m_InputConsumedEvent)
  cudaEventRecord(m_InferCompleteEvent, m_InferStream)
  cudaStreamWaitEvent(m_PostprocessStream, m_InferCompleteEvent)
  cudaMemcpyAsync(m_PostprocessStream)
  cudaEventRecord(m_OutputCopyDoneEvent, m_PostprocessStream)
gst_nvinfer_generate_output
  cudaEventSynchronize(m_OutputCopyDoneEvent)

沒有留言:

張貼留言