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)
沒有留言:
張貼留言