<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>

          NCNN+Int8+yolov5部署和量化

          共 9682字,需瀏覽 20分鐘

           ·

          2021-08-25 19:22

          【GiantPandaCV引言】 還記得我在兩個(gè)月前寫的文章嗎,關(guān)于yolov4-tiny+ncnn+int8量化的詳細(xì)教程:NCNN+INT8+YOLOV4量化模型和實(shí)時(shí)推理

          后來(lái)準(zhǔn)備寫yolov5+ncnn+int8量化的教程,卻在yolov5的量化上遇到了麻煩,一方面是量化后速度更慢了,另一方面是精度下降嚴(yán)重,出現(xiàn)滿屏都是檢測(cè)框的現(xiàn)象,后來(lái)經(jīng)過(guò)很多嘗試,最終都以失敗告終。

          再后來(lái),還是決定換其他方式對(duì)yolov5進(jìn)行量化,一是即使最小的yolov5s模型量化后能提速,依舊滿足不了我對(duì)速度的需求,二是對(duì)于Focus層,不管使用哪個(gè)向前推理框架,要額外添加對(duì)Focus層的拼接操作對(duì)我來(lái)說(shuō)過(guò)于繁瑣。

          于是,我對(duì)yolov5做了一系列輕量化的改動(dòng),讓他網(wǎng)絡(luò)結(jié)構(gòu)更加簡(jiǎn)潔,也能夠?qū)嵈驅(qū)嵉奶崴伲ɡ鏰rm架構(gòu)系列的樹(shù)莓派,至少能提速三倍;x86架構(gòu)的inter處理器也能提速一倍左右):

          模型結(jié)構(gòu)詳見(jiàn):ShuffleNetV2-Yolov5 更輕更快易于部署的yolov5

          這篇博客,還是接著上一篇yolov4量化的工作,對(duì)yolov5進(jìn)行ncnn的部署和量化。本文版權(quán)屬于GiantPandaCV,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載

          一、環(huán)境準(zhǔn)備

          主要需要的工具有兩樣:

          ncnn推理框架 地址鏈接:https://github.com/Tencent/ncnn

          shufflev2-yolov5的源碼和權(quán)重 地址鏈接:https://github.com/ppogg/shufflev2-yolov5

          模型性能如下:

          關(guān)于ncnn的編譯和安裝,網(wǎng)上的教程很多,但是推薦在linux環(huán)境下運(yùn)行,window也可以,但可能踩的坑比較多。

          二、onnx模型提取

          git clone https://github.com/ppogg/shufflev2-yolov5.git
          python models/export.py --weights weights/yolov5ss.pt --img 640 --batch 1
          python -m onnxsim weights/yolov5ss.onnx weights/yolov5ss-sim.onnx

          這過(guò)程一般都很順利~

          三、轉(zhuǎn)化為ncnn模型

          ./onnx2ncnn yolov5ss-sim.onnx yolov5ss.param yolov5ss.bin
          ./ncnnoptimize yolov5ss.param yolov5ss.bin yolov5ss-opt.param yolov5ss-opt.bin 65536

          這個(gè)過(guò)程依舊不會(huì)卡點(diǎn),很順利就提取完了,此時(shí)就有包含fp32,fp16,一共是4個(gè)模型:


          為了實(shí)現(xiàn)動(dòng)態(tài)尺寸圖片處理,需要對(duì)yolov5ss-opt.param的reshape操作進(jìn)行修改:

          把以上三處reshape的尺度統(tǒng)統(tǒng)改成-1:

          其他地方無(wú)需改動(dòng)。

          四、后處理修改

          ncnn官方的yolov5.cpp需要修改兩處地方

          anchor信息是在 models/yolov5ss-1.0.yaml,需要根據(jù)自己的數(shù)據(jù)集聚類后的anchor進(jìn)行對(duì)應(yīng)的修改:


          輸出層ID在Permute層里邊,也需要進(jìn)行相應(yīng)的修改:

          修改后如下:

          此時(shí),修改的地方只有以上幾點(diǎn),F(xiàn)ocus層代碼也可看個(gè)人情況移除,重新make就可以進(jìn)行檢測(cè)。

          fp16的模型檢測(cè)效果如下:還有,不要再問(wèn)為什么三輪車檢測(cè)不出來(lái)了。。你家coco數(shù)據(jù)集有三輪車是嗎。。

          五、Int8量化

          更加詳細(xì)的教程可以參考本人知乎博客關(guān)于yolov4-tiny的教程,很多細(xì)節(jié)的東西本篇不會(huì)累述(下方附鏈接)。

          這里需要補(bǔ)充幾點(diǎn):

          • 校驗(yàn)表數(shù)據(jù)集請(qǐng)使用coco_val那5000張數(shù)據(jù)集;
          • mean和val的數(shù)值需要和原先自己訓(xùn)練模型時(shí)候設(shè)定的數(shù)值保持一致,在yolov5ss.cpp里也需要保持一致;
          • 校驗(yàn)過(guò)程比較漫長(zhǎng),請(qǐng)耐心等候

          運(yùn)行代碼:

          find images/ -type f > imagelist.txt
          ./ncnn2table yolov5ss-opt.param yolov5ss-opt.bin imagelist.txt yolov5ss.table mean=[104,117,123] norm=[0.017,0.017,0.017] shape=[640,640,3] pixel=BGR thread=8 method=kl
          ./ncnn2int8 yolov5ss-opt.param yolov5ss-opt.bin yolov5ss-opt-int8.param yolov5ss-opt-int8.bin yolov5ss.table

          量化后的模型如下:

          量化后的模型大小大概在1.7m左右,應(yīng)該可以滿足你對(duì)小模型大小的強(qiáng)迫癥;

          此時(shí),可以使用量化后的shufflev2-yolov5模型進(jìn)行檢測(cè):量化后的精度略有損失,但還是在可接受范圍內(nèi)。模型在量化后不可能精度完全不下降,對(duì)于大尺度特征明顯的目標(biāo),shufflev2-yolov5對(duì)此類目標(biāo)的score可以保持不變(其實(shí)還是會(huì)下降一丟丟),但對(duì)于遠(yuǎn)距離的小尺度目標(biāo),score會(huì)下降10%-30%不等,沒(méi)辦法的事,所以請(qǐng)理性看待該模型。

          除去前三次預(yù)熱,樹(shù)莓派溫度溫度在45°以上,對(duì)模型進(jìn)行測(cè)試,量化后的benchmark如下:

          # 第四次
          pi@raspberrypi:~/Downloads/ncnn/build/benchmark $ ./benchncnn 8 4 0
          loop_count = 8
          num_threads = 4
          powersave = 0
          gpu_device = -1
          cooling_down = 1
              shufflev2-yolov5  min =   90.86  max =   93.53  avg =   91.56
          shufflev2-yolov5-int8  min =   83.15  max =   84.17  avg =   83.65
          shufflev2-yolov5-416  min =  154.51  max =  155.59  avg =  155.09
                   yolov4-tiny  min =  298.94  max =  302.47  avg =  300.69
                     nanodet_m  min =   86.19  max =  142.79  avg =   99.61
                    squeezenet  min =   59.89  max =   60.75  avg =   60.41
               squeezenet_int8  min =   50.26  max =   51.31  avg =   50.75
                     mobilenet  min =   73.52  max =   74.75  avg =   74.05
                mobilenet_int8  min =   40.48  max =   40.73  avg =   40.63
                  mobilenet_v2  min =   72.87  max =   73.95  avg =   73.31
                  mobilenet_v3  min =   57.90  max =   58.74  avg =   58.34
                    shufflenet  min =   40.67  max =   41.53  avg =   41.15
                 shufflenet_v2  min =   30.52  max =   31.29  avg =   30.88
                       mnasnet  min =   62.37  max =   62.76  avg =   62.56
               proxylessnasnet  min =   62.83  max =   64.70  avg =   63.90
               efficientnet_b0  min =   94.83  max =   95.86  avg =   95.35
             efficientnetv2_b0  min =  103.83  max =  105.30  avg =  104.74
                  regnety_400m  min =   76.88  max =   78.28  avg =   77.46
                     blazeface  min =   13.99  max =   21.03  avg =   15.37
                     googlenet  min =  144.73  max =  145.86  avg =  145.19
                googlenet_int8  min =  123.08  max =  124.83  avg =  123.96
                      resnet18  min =  181.74  max =  183.07  avg =  182.37
                 resnet18_int8  min =  103.28  max =  105.02  avg =  104.17
                       alexnet  min =  162.79  max =  164.04  avg =  163.29
                         vgg16  min =  867.76  max =  911.79  avg =  889.88
                    vgg16_int8  min =  466.74  max =  469.51  avg =  468.15
                      resnet50  min =  333.28  max =  338.97  avg =  335.71
                 resnet50_int8  min =  239.71  max =  243.73  avg =  242.54
                squeezenet_ssd  min =  179.55  max =  181.33  avg =  180.74
           squeezenet_ssd_int8  min =  131.71  max =  133.34  avg =  132.54
                 mobilenet_ssd  min =  151.74  max =  152.67  avg =  152.32
            mobilenet_ssd_int8  min =   85.51  max =   86.19  avg =   85.77
                mobilenet_yolo  min =  327.67  max =  332.85  avg =  330.36
            mobilenetv2_yolov3  min =  221.17  max =  224.84  avg =  222.60

          大約可以提速5-10%左右,手上沒(méi)有rv和rk系列的板子,所以其他板子的測(cè)試就需要社區(qū)的朋友進(jìn)行測(cè)試了~

          至于之前的yolov5s為什么量化后速度變慢,甚至精度下降嚴(yán)重,唯一的解釋就出在了Focus層,這玩意稍微對(duì)不齊就很容易崩,也比較費(fèi)腦,索性移除了。

          六、總結(jié)

          • 本文提出shufflev2-yolov5的部署和量化教程;

          • 剖析了之前yolov5s之所以量化容易崩壞的原因;

          • ncnn的fp16模型對(duì)比原生torch模型精度可保持不變;[上圖,左為torch原模型,右為fp16模型]

          • ncnn的int8模型精度會(huì)略微下降,速度在樹(shù)莓派上僅能提升5-10%,其他板子暫未測(cè)試;[上圖,左為torch原模型,右為int8模型]

          項(xiàng)目地址:https://github.com/ppogg/shufflev2-yolov5

          歡迎star和fork~

          2021年08月20日更新: ----------------------------------------------------------

          本人已經(jīng)完成了Android版本的適配

          這是本人的紅米手機(jī),處理器為高通驍龍730G,檢測(cè)的效果如下:這是量化后的int8模型檢測(cè)效果:戶外場(chǎng)景檢測(cè):

          七、參考

          【1】nihui:詳細(xì)記錄u版YOLOv5目標(biāo)檢測(cè)ncnn實(shí)現(xiàn)

          【2】pogg:NCNN+Int8+YOLOv4量化模型和實(shí)時(shí)推理

          【3】pogg:ncnn+opencv+yolov5調(diào)用攝像頭進(jìn)行檢測(cè)

          【4】https://github.com/ultralytics/yolov5

          - END -

          歡迎加入GiantPandaCV交流群


          瀏覽 65
          點(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>
                  一区二区三区四区无码视频 | 青青91 | 豆花视频精品一二三区 | 无码日韩中文字幕豆花 | 久久久久亚洲AV成人网人人小说 |