deepstream4.0的yoloV3運行和講解

一、運行環境和示例說明

	運行環境參考https://blog.csdn.net/shajiayu1/article/details/102669346
	《JETSON-Nano刷機運行deepstream4.0的demo》。我們這裏運行yoloV3-tiny的示例。
	該示例是deepstream4.0和tensorRT的綜合實例。
	工程路徑deepstream_sdk_v4.0.1_jetson\sources\objectDetector_Yolo

二、運行方法和步驟

 1.首先下載權重文件和配置文件。
    執行這個腳本   prebuild.sh。可以把腳本里的不需要的部分註釋掉。提高下載速度。
    ./prebuild.sh
 2.編譯工程
 cd  objectDetector_Yolo
 export CUDA_VER=10.0
 make -C nvdsinfer_custom_impl_Yolo     
 這時候會在nvdsinfer_custom_impl_Yolo文件夾裏生成.so文件
 3.運行示例
 deepstream-app -c deepstream_app_config_yoloV3_tiny.txt

在這裏插入圖片描述

三、各個文件目錄分析

 一、首先是sources\objectDetector_Yolo文件夾裏配置文件、權重文件和相關的庫文件。
 deepstream_app_config_yoloV3_tiny.txt     deepstream配置文件
 config_infer_primary_yoloV3_tiny.txt        GStreamer等的配置文件
 nvdsinfer_yolo_engine.cpp   根據網絡類型創建引擎
 nvdsparsebbox_Yolo.cpp    yolo目標檢測結果的輸出
 yoloPlugins.h    
 yoloPlugins.cpp  模型搭建的一些組件以及相應的實現
 kernels.cu        cuda核最底層的實現
 trt_utils.h
 trt_utils.cpp    建立tensorRT網絡的部分,已經支持的部分
 yolo.h
 yolo.cpp      創建引擎、創建網絡等的具體實現
 
 二、另外一個文件夾
 sources\apps\sample_apps\deepstream-app
 deepstream_app.c     pipeline的一些操作在這裏
 deepstream_app.h
 deepstream_app_config_parser.c     配置文件的解析
 deepstream_app_main.c       deepstream主函數

四、程序註釋和講解

該程序分爲兩個部分:
一部分是tensorRT部分 就是sources\objectDetector_Yolo文件夾裏的,編譯後會生產動態庫文件。也就是libnvdsinfer_custom_impl_Yolo.so。另一部分是deepstream的文件,在sources\apps\sample_apps\deepstream-app文件夾裏。

首先說明下tensorRT幾個文件的關係:
nvdsinfer_yolo_engine.cpp 根據網絡類型創建引擎
nvdsparsebbox_Yolo.cpp yolo目標檢測結果的輸出
yoloPlugins.cpp 模型搭建的一些組件以及相應的實現
kernels.cu cuda核最底層的實現
trt_utils.cpp 建立tensorRT網絡的部分,已經支持的部分
yolo.cpp 創建引擎、創建網絡等的具體實現
在這裏插入圖片描述
其中yolo.cpp實現了網絡層的搭建。是核心代碼部分。貼一段該文件的代碼,該代碼實現了卷積層的搭建:

else if (m_configBlocks.at(i).at("type") == "convolutional")  //如果是卷積層
{
	std::string inputVol = dimsToString(previous->getDimensions());//獲取tensor的大小
	nvinfer1::ILayer* out;
	std::string layerType;//保存網絡類型
	// check if batch_norm enabled
	if (m_configBlocks.at(i).find("batch_normalize") != m_configBlocks.at(i).end())
	{
		out = netAddConvBNLeaky(i, m_configBlocks.at(i), weights, trtWeights, weightPtr,//有BN的卷積層
								channels, previous, network);
		layerType = "conv-bn-leaky";
	}
	else
	{
		out = netAddConvLinear(i, m_configBlocks.at(i), weights, trtWeights, weightPtr,  //沒有BN的卷積層
							   channels, previous, network);
		layerType = "conv-linear";
	}
	previous = out->getOutput(0);//獲取該層的輸出
	assert(previous != nullptr);
	channels = getNumChannels(previous);
	std::string outputVol = dimsToString(previous->getDimensions());//獲取tensor的大小
	tensorOutputs.push_back(out->getOutput(0));//保存相應的層輸出
	printLayerInfo(layerIndex, layerType, inputVol, outputVol, std::to_string(weightPtr));//打印參數
}

下面說明一下deepstream部分代碼:
deepstream_app.c pipeline的一些操作在這裏
deepstream_app_config_parser.c 配置文件的解析
deepstream_app_main.c deepstream主函數
deepstream會調用動態庫文件libnvdsinfer_custom_impl_Yolo.so實現網絡層的搭建等功能。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章