一、運行環境和示例說明
運行環境參考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實現網絡層的搭建等功能。