<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          實(shí)踐教程|YOLOX目標(biāo)檢測ncnn實(shí)現(xiàn)

          共 5220字,需瀏覽 11分鐘

           ·

          2021-07-27 15:53

          ↑ 點(diǎn)擊藍(lán)字 關(guān)注極市平臺(tái)

          作者 | 唐超@知乎(已授權(quán))
          來源丨h(huán)ttps://zhuanlan.zhihu.com/p/391788686
          編輯丨極市平臺(tái)

          極市導(dǎo)讀

           

          本文將YOLOX訓(xùn)練的模型轉(zhuǎn)到ncnn進(jìn)行推理加速。>>加入極市CV技術(shù)交流群,走在計(jì)算機(jī)視覺的最前沿

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

          0x00 YOLOX目標(biāo)檢測

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

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

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

          0x01 配置環(huán)境

          因?yàn)橹皇切枰獙?dǎo)出原始pytorch模型到onnx,所以機(jī)器配置可以隨意,不過建議還是用帶gpu的設(shè)備,跑demo需要用gpu才能行,我嘗試改成cpu之后并不能出結(jié)果/sad。

          git clone [email protected]: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í)跟著官網(wǎng)git上面流程走就行,到目前為止就可以試試demo看看模型效果了。我這里用的是yolox-nano這個(gè)模型來做說明。

          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

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

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

          (小聲BB,用官方model以及demo程序跑出來還是有一丟丟問題,我也提了issue,不過回答的我并不怎么滿意。有興趣的可以自己去翻......當(dāng)然了,那個(gè)誤識(shí)別可以設(shè)置conf0.4剔除。)

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

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

          0x02 模型轉(zhuǎn)換

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

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

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

          得到由onnx-simplifier的模型之后,就可以開始轉(zhuǎn)換ncnn之旅了!(貼太多圖了,模型圖就不貼了,大家可以自己用netron打開欣賞)

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

          運(yùn)行完成之后會(huì)出現(xiàn)很多Unsupported slice step,這是focus模塊轉(zhuǎn)換的報(bào)錯(cuò),別害怕,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 !

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

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

          YoloV5Focus              focus                    1 1 images 683

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

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

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

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

          前面兩個(gè)參數(shù)是優(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起來

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

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

          上圖中第一個(gè)紅框因?yàn)槲抑皇桥芰鞒蹋瑳]有編譯vulkan,所以把這個(gè)關(guān)掉了,大家根據(jù)自己的來,第二個(gè)位置就是把模型改成自己的模型路徑。

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

          (反正已經(jīng)是保姆級(jí)別了,就再提一下,因?yàn)槟P褪莻鞯南鄬?duì)路徑,對(duì)于上圖而言,你需要將可執(zhí)行程序和模型放到同級(jí)目錄才能正常運(yùn)行。或者你直接給絕對(duì)路徑也行)

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

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

          0x04 總結(jié)

          其實(shí)沒啥好總結(jié)的,很多工作大家都已經(jīng)做好了,我只是搬運(yùn)然后寫細(xì)致了一點(diǎn),只希望能夠幫助到有些剛?cè)腴T或者對(duì)這塊感興趣的人吧。

          如果覺得有用,就請(qǐng)分享到朋友圈吧!

          △點(diǎn)擊卡片關(guān)注極市平臺(tái),獲取最新CV干貨

          公眾號(hào)后臺(tái)回復(fù)“ICCV2021”獲取最新論文合集


          極市干貨
          YOLO教程:一文讀懂YOLO V5 與 YOLO V4大盤點(diǎn)|YOLO 系目標(biāo)檢測算法總覽全面解析YOLO V4網(wǎng)絡(luò)結(jié)構(gòu)
          實(shí)操教程:PyTorch vs LibTorch:網(wǎng)絡(luò)推理速度誰更快?只用兩行代碼,我讓Transformer推理加速了50倍PyTorch AutoGrad C++層實(shí)現(xiàn)
          算法技巧(trick):深度學(xué)習(xí)訓(xùn)練tricks總結(jié)(有實(shí)驗(yàn)支撐)深度強(qiáng)化學(xué)習(xí)調(diào)參Tricks合集長尾識(shí)別中的Tricks匯總(AAAI2021
          最新CV競賽:2021 高通人工智能應(yīng)用創(chuàng)新大賽CVPR 2021 | Short-video Face Parsing Challenge3D人體目標(biāo)檢測與行為分析競賽開賽,獎(jiǎng)池7萬+,數(shù)據(jù)集達(dá)16671張!



          CV技術(shù)社群邀請(qǐng)函 #

          △長按添加極市小助手
          添加極市小助手微信(ID : cvmart4)

          備注:姓名-學(xué)校/公司-研究方向-城市(如:小極-北大-目標(biāo)檢測-深圳)


          即可申請(qǐng)加入極市目標(biāo)檢測/圖像分割/工業(yè)檢測/人臉/醫(yī)學(xué)影像/3D/SLAM/自動(dòng)駕駛/超分辨率/姿態(tài)估計(jì)/ReID/GAN/圖像增強(qiáng)/OCR/視頻理解等技術(shù)交流群


          每月大咖直播分享、真實(shí)項(xiàng)目需求對(duì)接、求職內(nèi)推、算法競賽、干貨資訊匯總、與 10000+來自港科大、北大、清華、中科院、CMU、騰訊、百度等名校名企視覺開發(fā)者互動(dòng)交流~



          覺得有用麻煩給個(gè)在看啦~  


          瀏覽 90
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  免费看黃色AAAAAA 片 | 国产怡红院| 国产aaaaaa | 精品国产污污污免费入口15 | 亚洲AV无码成人精品区国产 |