基于ncnn 的yolov5,nanodet實現

1.先安裝好opencv

2.將模型.pth轉化成onnx文件

yolov5的github上有具體的方法

3.安裝onnx-simplifier

3.1: pip install onnx-simplifier (具體該工具的作用自行百度)

3.2: python -m onnxsim ./yolov5.onnx ./yolo5-sim.onnx (簡化轉換得到的onnx)

4. ncnn代碼庫

4.1ncnn代碼庫的編譯

ncnn編譯

make -j4改成make install就能生成install文件夾,方便其他的工程調用


4.2模型轉換

基于build文件夾

cd tools/onnx

./onnx2ncnn your-yolov5s-path/yolov5-sim.onnx the-path-to-save/yolov5-sim.param the-path-to-save/yolov5-sim.bin

運行到該步驟時會出現下面的問題,問題出現的原因時下圖中的split和crop網絡層高在ncnn中沒有定義的緣故,我們需要做的是將這個網絡層消除:

error
error


5.ncnn格式模型修改

5.1 去掉不支持的網絡層

打開轉換得到的yolov5-sim.param文件

前幾行的內容如下,我們需要刪除的是標紅的部分。

param文件刪掉標紅部分

修改結果如下,其中180是由于之前的189網絡層我們刪除了10行,并用YoloV5Focus網絡層代替,剩180個,而YoloV5Focus網絡層中的images代表該層的輸入,199代表輸出名,這個可以根據標紅的位置填寫。(轉化得到的param文件不一樣,前兩行也就不一樣)

param文件修改后

5.2修改網絡的輸出shape

當我們基于修改后的網絡使用ncnn/examples/yolov5測試時發現圖片中會出現一堆亂框,該情況下需要修改網絡的輸出部分

首先,在yolov5-sim.param中找到網絡的輸出接口:

圖中綠框部分就是最終的網絡輸出層(由于網絡層數設置的區別,不同的網絡所在的位置不一樣),該層中紅框選中的部分就是網絡的輸出名(要保證yolov5.cpp中調用的輸出名和網絡的一致性,yolov5.cpp中的調用方式如下C代碼)。在并保證輸出名一致的情況下,修改黃色框中區域為0=-1,使得最終的輸出shape不固定。結果見圖:

param文件最后幾層修改后

本地測試:ncnn/examples/yolov5.cpp中修改如下部分(只改前兩行就行)

yolov5.cpp修改

修改輸出接口及對應的anchors

只根據param文件的最后幾層修改第4、23、40行就行

yolov5.cpp修改

編譯

make -j4

將yolov5-sim.param 、yolov5-sim.bin模型copy到ncnn/build/examples/位置,運行下面命令

./yolov5 image-path

image-path 是存放圖片的位置

6.量化or壓縮

半浮點壓縮為例

./ncnnoptimize yolov5-sim.param yolov5-sim.bin yolov5-sim-opt.param yolov5-sim-opt.bin 65536

onnx轉換成ncnn模型后,直接使用上述的命令轉換會出現下面的問題:

error

由于YoloV5Focus不涉及參數的計算,故我們只需將.param中的YoloV5Focus名字換成其他已知的,且不參與運行的網絡層,如Exp

然后運行命令即可(后面再進行網絡輸出相關問題的修改即可,至于二者的順序是否可以改變請自行測試)。

轉換完成后再將yolov5-sim-opt.param中的Exp名字改為YoloV5Focus即可。一定要改回來?。。?/b>

轉換時命令行會出現如下問題

已測試該問題并不影響網絡的調用。

over!

參考:https://blog.csdn.net/qq_41669468/article/details/110485396

https://zhuanlan.zhihu.com/p/275989233

o


Nanodet ncnn實現

1.用nanodet自帶的onnx轉換工具將ckpt模型轉成onnx

python tools/export_onnx.py --cfg_path${CONFIG_PATH}--model_path${PYTORCH_MODEL_PATH}

2.簡化模型

python -m onnxsim${INPUT_ONNX_MODEL}${OUTPUT_ONNX_MODEL}

3.onnx2ncnn轉成param和bin文件

參考yolov5中4.2步

4.優化模型


Nanodet基于視頻的檢測

用到的param和bin文件在數梅派ped/nanodet-main/demo_ncnn

筆記本電腦param和bin文件存在toolpackage/ncnn/onnx2ncn和/toolpackage/ncnn-mine/examples/bin-param

一、用自己的use_camera工程

文件在數梅派ped/nanodet-main/use_camera

主cpp文件和nanodet.h里面規定了檢測的類別及輸入神經網絡的圖像的size,所以需要根據自己模型的情況修改

這個文件夾里面的ncnn文件夾是NCNN庫文件里面的install文件夾

進入build文件夾運行

./nanodet_camera

二、用nanodet自帶的ncnn文件夾

文件在數梅派ped/nanodet-main/demo_ncnn

首先要export總ncnn文件夾里面的install的靜態庫文件

exportncnn_DIR=YOUR_NCNN_PATH/build/install/lib/cmake/ncnn

主cpp文件和nanodet.h里面規定了檢測的類別及輸入神經網絡的圖像的size,所以需要根據自己模型的情況修改

攝像頭檢測

進入build文件夾運行

./nanodet_demo 0 0

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容