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代碼庫的編譯
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中沒有定義的緣故,我們需要做的是將這個網絡層消除:
5.ncnn格式模型修改
5.1 去掉不支持的網絡層
打開轉換得到的yolov5-sim.param文件
前幾行的內容如下,我們需要刪除的是標紅的部分。
修改結果如下,其中180是由于之前的189網絡層我們刪除了10行,并用YoloV5Focus網絡層代替,剩180個,而YoloV5Focus網絡層中的images代表該層的輸入,199代表輸出名,這個可以根據標紅的位置填寫。(轉化得到的param文件不一樣,前兩行也就不一樣)
5.2修改網絡的輸出shape
當我們基于修改后的網絡使用ncnn/examples/yolov5測試時發現圖片中會出現一堆亂框,該情況下需要修改網絡的輸出部分
首先,在yolov5-sim.param中找到網絡的輸出接口:
圖中綠框部分就是最終的網絡輸出層(由于網絡層數設置的區別,不同的網絡所在的位置不一樣),該層中紅框選中的部分就是網絡的輸出名(要保證yolov5.cpp中調用的輸出名和網絡的一致性,yolov5.cpp中的調用方式如下C代碼)。在并保證輸出名一致的情況下,修改黃色框中區域為0=-1,使得最終的輸出shape不固定。結果見圖:
本地測試:ncnn/examples/yolov5.cpp中修改如下部分(只改前兩行就行)
修改輸出接口及對應的anchors
只根據param文件的最后幾層修改第4、23、40行就行
編譯
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模型后,直接使用上述的命令轉換會出現下面的問題:
由于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