<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>
"); //-->

博客專(zhuān)欄

EEPW首頁(yè) > 博客 > 實(shí)踐教程|YOLOX目標檢測ncnn實(shí)現

實(shí)踐教程|YOLOX目標檢測ncnn實(shí)現

發(fā)布人:計算機視覺(jué)工坊 時(shí)間:2021-07-26 來(lái)源:工程師 發(fā)布文章

作者 | 唐超@知乎(已授權)

來(lái)源丨h(huán)ttps://zhuanlan.zhihu.com/p/391788686

編輯丨極市平臺

導讀

本文將YOLOX訓練的模型轉到ncnn進(jìn)行推理加速。

YOLOX最近刷屏了,關(guān)鍵是官方倉庫直接給出了ncnn、tensorRT、openvino、onnxruntime實(shí)現,簡(jiǎn)直是無(wú) 比 良 心bù gěi huó lù?。?!

0x00 YOLOX目標檢測

懂得都懂,異常強大。貼上鏈接方便大家感受:https://github.com/Megvii-BaseDetection/YOLOX;

1.jpg

以及https://arxiv.org/abs/2107.08430。

2.jpg具體算法解析啥的,極市之前有過(guò)解讀,詳見(jiàn)吊打一切現有版本的YOLO!曠視重磅開(kāi)源YOLOX:新一代目標檢測性能速度擔當!一文,本文主要是照顧有些人想自己轉YOLOX訓練的模型到ncnn進(jìn)行推理加速。

0x01 配置環(huán)境

因為只是需要導出原始pytorch模型到onnx,所以機器配置可以隨意,不過(guò)建議還是用帶gpu的設備,跑demo需要用gpu才能行,我嘗試改成cpu之后并不能出結果/sad。

git clone git@github.com:Megvii-BaseDetection/YOLOX.git
cd YOLOX
pip3 install -U pip && pip3 install -r requirements.txt
pip3 install -v -e .  # or  python3 setup.py develop
git clone https://github.com/NVIDIA/apex
cd apex
pip3 install -v --disable-pip-version-check --no-cache-dir --global-option="--cpp_ext" --global-option="--cuda_ext" ./

其實(shí)跟著(zhù)官網(wǎng)git上面流程走就行,到目前為止就可以試試demo看看模型效果了。我這里用的是yolox-nano這個(gè)模型來(lái)做說(shuō)明。

python tools/demo.py image -n yolox-nano -c /path/to/your/yolox_nano.pth.tar --path assets/dog.jpg --conf 0.3 --nms 0.65 --tsize 640 --save_result

上述命令執行完成之后會(huì )打印出以下信息:

3.jpg

檢測的結果存儲在./YOLOX\_outputs/nano/vis\_res/2021\_07\_21\_15\_54\_30/dog.jpg。具體效果如下圖所示:

4.jpg

(小聲BB,用官方model以及demo程序跑出來(lái)還是有一丟丟問(wèn)題,我也提了issue,不過(guò)回答的我并不怎么滿(mǎn)意。有興趣的可以自己去翻......當然了,那個(gè)誤識別可以設置conf為0.4剔除。)

好了,至此,相當于我們整體環(huán)境就整完了,接下來(lái)就是導出pytorch模型到onnx,然后再轉到ncnn了。

PS:我看issue里好多人在問(wèn)在哪看結果,我的怎么沒(méi)結果之類(lèi)的。。。。如果正確執行完成了,會(huì )輸出檢測結果的存儲路徑。如果你沒(méi)看到這個(gè),那么不好意思,可能是你姿勢有問(wèn)題(大概率是模型不對,沒(méi)有用gpu,cpu是沒(méi)法跑的,但是它又不報錯/sad)

0x02 模型轉換

其實(shí)吧,pytorch模型導出到onnx這塊代碼YOLOX已經(jīng)很貼心的提供了,這樣就不需要我們自己倒騰啥后處理屏蔽之類(lèi)的騷操作了。直接按下面命令運行即可:

#如果你環(huán)境中還沒(méi)安裝onnx-simplifier,那么需要安裝一個(gè),嫌麻煩不安裝也可以,后面給另一個(gè)方案
pip install onnx-simplifier
python tools/export_onnx.py -n yolox-nano -c /path/to/your/yolox_nano.pth.tar

這個(gè)導出onnx的代碼非常貼心,之間把onnx-simplifier也放在里面一起做了,可以一定程度上減少模型里面出現的一些膠水OP,如果你嫌安裝這個(gè)比較麻煩,也可以用“@大缺弦www.zhihu.com/people/33295f2791c588f9df071dddb701278a”的網(wǎng)頁(yè)版進(jìn)行模型轉換,這里給出鏈接:一鍵轉換 Caffe, ONNX, TensorFlow 到 NCNN, MNN, Tengineconvertmodel.com

5.jpg

使用非常方便,節約了自己配環(huán)境安裝的過(guò)程(其實(shí)主要是有些轉換工具編譯時(shí)需要protobuf支持,但是好多人這里都卡住了)。不過(guò)大老師由于太忙了,網(wǎng)頁(yè)端轉換工具有時(shí)候并沒(méi)有更新到最新,所以.....大家還是體諒下吧。

得到由onnx-simplifier的模型之后,就可以開(kāi)始轉換ncnn之旅了?。ㄙN太多圖了,模型圖就不貼了,大家可以自己用netron打開(kāi)欣賞)

# ncnn_root代表ncnn根目錄
cd /ncnn_root/build/tools/onnx
./onnx2ncnn /path/to/yolox-nano.onnx yolox-nano.param yolox-nano.bin

運行完成之后會(huì )出現很多Unsupported slice step,這是focus模塊轉換的報錯,別害怕,up已經(jīng)幫我們鋪好路了。

Unsupported slice step !
Unsupported slice step !
Unsupported slice step !
Unsupported slice step !
Unsupported slice step !
Unsupported slice step !
Unsupported slice step !
Unsupported slice step !

具體怎么寫(xiě)focus可以去看up寫(xiě)的轉換yolov5s到ncnn的文章,我這里主要只講具體操作過(guò)程:nihui:詳細記錄u版YOLOv5目標檢測ncnn實(shí)現zhuanlan.zhihu.com

7.jpg

打開(kāi)上面轉換好的yolox-nano.param文件,可以看到如上圖所示的樣子,紅框中的內容實(shí)際上就是focus,我們只需要把這里修改下就好了,具體是在第四行插入以下內容:

YoloV5Focus              focus                    1 1 images 683

然后把原先的4-13行全部刪除,這里需要注意的是,1 1 images 683分別代表的意思是一個(gè)輸入、一個(gè)輸出、輸入blob名稱(chēng)為images、輸出blob名稱(chēng)為683。有可能你自己改結構轉出來(lái)的名字不一樣,所以需要對照上面紅框來(lái)取。images也就是第三行的輸出blob name,而683則是第13行Concat的輸出blob name,因為這個(gè)Concat的輸入是4個(gè),輸出有一個(gè),也就是652 672 662 682都是輸出,而683是輸出。這樣就把這里修改完成了。

你以為這樣就完事了?NO,其實(shí)還有個(gè)關(guān)鍵的東西沒(méi)改,那就是param文件的第二行的數字沒(méi)改,第一個(gè)數是layer count,我們刪除了一些層,如果還是按照這個(gè)走后面載入模型會(huì )報錯。這里給個(gè)簡(jiǎn)單的修改方法(免得你要自己記刪除了多少增加了多少......),直接看param整體行數,然后減去開(kāi)頭的兩行就行了,我們這里改成focus之后需要把layer count改成286,而至于第二個(gè)數,代表的是blob count,這個(gè)可以多,但是別少就行了!因為我們之后還有個(gè)很重要的操作,可以把這里的數量改對。

接下來(lái)可以用ncnnoptimize對模型進(jìn)行優(yōu)化,順便轉為 fp16 存儲減小模型體積

./ncnnoptimize ./onnx/yolox-nano-sim.param ./onnx/yolox-nano-sim.bin yolox-nano-sim.param yolox-nano-sim.bin 65536

前面兩個(gè)參數是優(yōu)化前的模型,后面兩個(gè)是優(yōu)化后的模型。

create_custom_layer YoloV5Focus
fuse_convolution_activation Conv_314 Sigmoid_330
fuse_convolution_activation Conv_328 Sigmoid_329
fuse_convolution_activation Conv_347 Sigmoid_363
fuse_convolution_activation Conv_361 Sigmoid_362
fuse_convolution_activation Conv_380 Sigmoid_396
fuse_convolution_activation Conv_394 Sigmoid_395
model has custom layer, shape_inference skipped
model has custom layer, estimate_memory_footprint skipped

0x03 run起來(lái)

模型轉換完成之后,運行起來(lái)就比較簡(jiǎn)單了(主要是YOLOX自己提供了ncnn的代碼),為看簡(jiǎn)單起見(jiàn),咱們直接把yolox.cpp文件挪到ncnn工程的examples目錄下,然后在/ncnn\_root/examples/CMakeLists.txt中做如圖修改:

8.jpg

接下來(lái)就是正常的編譯環(huán)節了,另外,由于yolox.cpp中模型路徑是寫(xiě)的絕對路徑,大家可以根據自己的情況去做更改。

9.jpg

上圖中第一個(gè)紅框因為我只是跑流程,沒(méi)有編譯vulkan,所以把這個(gè)關(guān)掉了,大家根據自己的來(lái),第二個(gè)位置就是把模型改成自己的模型路徑。

./yolox /path/to/YOLOX/assets/dog.jpg

(反正已經(jīng)是保姆級別了,就再提一下,因為模型是傳的相對路徑,對于上圖而言,你需要將可執行程序和模型放到同級目錄才能正常運行?;蛘吣阒苯咏o絕對路徑也行)

最后附上ncnn的結果(有彩蛋,大概算吧).

10.jpg

啊,彩蛋就是ncnn沒(méi)有出現那個(gè)誤檢的框......參數配置都是一樣,conf0.3,nms0.65, size 416。官方說(shuō)法是nms實(shí)現不一樣,咱也沒(méi)看,后面再細究吧,反正本文不是為了講技術(shù)實(shí)現(主要是菜)。

0x04 總結

其實(shí)沒(méi)啥好總結的,很多工作大家都已經(jīng)做好了,我只是搬運然后寫(xiě)細致了一點(diǎn),只希望能夠幫助到有些剛入門(mén)或者對這塊感興趣的人吧。

*博客內容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀(guān)點(diǎn),如有侵權請聯(lián)系工作人員刪除。



關(guān)鍵詞: AI

相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>