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

          如何在無人機(jī)上部署YOLOv4

          共 16163字,需瀏覽 33分鐘

           ·

          2021-11-27 14:08

          點(diǎn)擊上方“小白學(xué)視覺”,選擇加"星標(biāo)"或“置頂”

          重磅干貨,第一時(shí)間送達(dá)

          1

          代碼編譯

          準(zhǔn)備工作

          • 推薦使用Ubuntu 18.04

          • CMake >= 3.8:?https://cmake.org/download/

          • CUDA >= 10.0:?https://developer.nvidia.com/cuda-toolkit-archive

          • OpenCV >= 2.4:?https://opencv.org/releases.html

          • cuDNN >= 7.0 for CUDA >= 10.0https://developer.nvidia.com/rdp/cudnn-archive

          • GPU with CC >= 3.0:?https://en.wikipedia.org/wiki/CUDA#GPUs_supported

          • GCC

          Linux上編譯

          下載YOLOv4源碼,推薦使用Ubuntu 18.04

          sudo apt-get install -y git

          git clone https://github.com/AlexeyAB/darknet.git

          配置Makefile文件中的參數(shù),然后運(yùn)行make -j8進(jìn)行編譯,具體參數(shù)解釋如下:

          • GPU=1?使用CUDA和GPU(CUDA默認(rèn)路徑為/usr/local/cuda

          • CUDNN=1使用cuDNN v5-v7加速網(wǎng)絡(luò)(cuDNN默認(rèn)路徑/usr/local/cudnn

          • CUDNN_HALF=1?使用Tensor Cores(可用GPU為Titan V / Tesla V100 / DGX-2或者更新的)檢測速度3x,訓(xùn)練速度2x

          • OPENCV=1?使用OpenCV 4.x/3.x/2.4.x,運(yùn)行檢測視頻和攝像機(jī)

          • DEBUG=1?編譯調(diào)試版本

          • OPENMP=1?使用OpenMP利用多CPU加速

          • LIBSO=1?編譯darknet.so

            • 使用uselib來運(yùn)行YOLO,輸入指令如下:?LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH ./uselib test.mp4

            • 在自己的代碼中嵌入YOLO,請參考例程:?https://github.com/AlexeyAB/darknet/blob/master/src/yolo_console_dll.cpp

          • ZED_CAMERA=1?增加ZED-3D相機(jī)的支持(需要先安裝好ZED SDK)

            • 運(yùn)行LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH ./uselib data/coco.names cfg/yolov4.cfg yolov4.weights zed_camera

          常見編譯問題

          /bin/sh: 1: nvcc: not found

          首先確保CUDA正確安裝,并且在路徑/usr/local/cuda下,然后輸入如下指令:

          echo "PATH=/usr/local/cuda/bin:$PATH" >> ~/.bashrc

          source ~/.bashrc

          include/darknet.h:46:10: fatal error: cudnn.h: No such file or directory

          首先下載cuDNNhttps://developer.nvidia.com/rdp/cudnn-archive,需要根據(jù)自己的CUDA版本選擇,然后解壓,輸入指令:

          sudo cp -r cudnn-10.1-linux-x64-v7.6.5.32/cuda /usr/local/cudnn
          2

          運(yùn)行代碼

          預(yù)訓(xùn)練模型

          所有模型都是在MS-COCO數(shù)據(jù)集上訓(xùn)練,模型包括兩個(gè)文件(cfgweights

          R表示在RTX 2070設(shè)備上的FPS,V表示在Tesla V100設(shè)備上的FPS

          百度網(wǎng)盤打包下載,鏈接:https://pan.baidu.com/s/1QQPB27n18XeRDnhHA2Gxuw,提取碼:uill

          可以在如下路徑找到所有的cfg文件:?darknet/cfg/

          運(yùn)行指令介紹

          需要將訓(xùn)練好的weights文件放到darknet根目錄下,運(yùn)行如下指令:

          • 檢測單張圖像

          ./darknet detector test cfg/coco.data cfg/yolov4.cfg yolov4.weights -thresh 0.25
          • 檢測給定路徑的單張圖像(參數(shù)最后的路徑需要寫待檢測圖像的路徑)

          ./darknet detector test cfg/coco.data cfg/yolov4.cfg yolov4.weights -ext_output /home/jario/Pictures/h1.jpg
          • 檢測給定路徑的單個(gè)視頻

          ./darknet detector demo cfg/coco.data cfg/yolov4.cfg yolov4.weights -ext_output test.mp4
          • 檢測給定路徑的單個(gè)視頻,并將檢測結(jié)果保存為視頻

          ./darknet detector demo cfg/coco.data cfg/yolov4.cfg yolov4.weights test.mp4 -out_filename res.avi
          • 利用攝像機(jī)實(shí)時(shí)檢測(YOLOv4)

          ./darknet detector demo cfg/coco.data cfg/yolov4.cfg yolov4.weights -c 0
          • 利用攝像機(jī)實(shí)時(shí)檢測(YOLOv3-Tiny)

          ./darknet detector demo cfg/coco.data cfg/yolov3-tiny.cfg yolov3-tiny.weights -c 0
          • 在GPU1上檢測給定路徑的單個(gè)視頻

          ./darknet detector demo cfg/coco.data cfg/yolov3-tiny.cfg yolov3-tiny.weights -i 1 test.mp4
          • 檢測列表data/train.txt中圖像,并將結(jié)果保存在result.json

          ./darknet detector test cfg/coco.data cfg/yolov4.cfg yolov4.weights -ext_output -dont_show -out result.json < data/train.txt
          • 檢測列表data/train.txt中圖像,并將結(jié)果保存在result.txt

          ./darknet detector test cfg/coco.data cfg/yolov4.cfg yolov4.weights -dont_show -ext_output < data/train.txt > result.txt
          3

          如何訓(xùn)練

          如何構(gòu)建自己的訓(xùn)練數(shù)據(jù)

          下載數(shù)據(jù)集標(biāo)注工具,下載地址:(https://pan.baidu.com/s/1EE52cDStjIxsRgM_a9pWQQ) (password: 4b2q) 或者?Spire Web.

          數(shù)據(jù)集管理軟件github地址:https://github.com/jario-jin/spire-image-manager

          打開標(biāo)注軟件 SpireImageTools_x.x.x.exe

          首先點(diǎn)擊Tools->Setting...,填寫一個(gè) save path (所有的標(biāo)注文件都會存儲在這個(gè)文件夾中)

          如果采集的數(shù)據(jù)集是視頻 (如果采集的是圖像,則調(diào)過這一步驟),點(diǎn)擊 Input->Video, 選擇要標(biāo)注的視頻。

          然后,點(diǎn)擊Tools->Video to Image

          點(diǎn)擊OK 后,等待完成,結(jié)果會存儲在

          打開需要標(biāo)注的圖像

          Input->Image Dir, 找到需要標(biāo)注的圖像所在文件夾 Ctrl+A,全選,打開

          點(diǎn)擊,Tools->Annotate Image->Instance Label,開始標(biāo)注圖像

          在 label 中填寫待標(biāo)注目標(biāo)名稱,然后將對話框拖到一邊在主窗口中開始標(biāo)注,鼠標(biāo)滾輪放大縮小圖像,按住左鍵移動可視圖像區(qū)域不斷點(diǎn)擊左鍵將目標(biāo)框包圍, 使用 Yolo 訓(xùn)練時(shí),點(diǎn)擊 2 個(gè)點(diǎn)即可

          標(biāo)注時(shí),如果點(diǎn)錯(cuò),按鼠標(biāo)右鍵可以取消 標(biāo)注完成后,如果不滿意,可以點(diǎn)擊綠色邊框(邊框會變紅,如下圖所示),按Delete 刪除

          將標(biāo)注輸出為 Yolo 格式,準(zhǔn)備訓(xùn)練

          在標(biāo)注完成之后,按下 Ctrl+O

          點(diǎn)擊確定后

          然后將下面 4 個(gè)文件取出用于 Yolo 訓(xùn)練

          開始訓(xùn)練YOLO

          使用YOLOv4和YOLOv3:

          1. 針對選擇的模型,下載預(yù)訓(xùn)練權(quán)重:

            百度網(wǎng)盤打包下載,鏈接:https://pan.baidu.com/s/1CNVyyjoph7YVSXGT3vjbfQ,提取碼:4usc

            • 對于?yolov4.cfg,?yolov4-custom.cfg?(162 MB):?yolov4.conv.137

            • 對于?csresnext50-panet-spp.cfg?(133 MB):?csresnext50-panet-spp.conv.112

            • 對于?yolov3.cfg, yolov3-spp.cfg?(154 MB):?darknet53.conv.74

            • 對于?yolov3-tiny-prn.cfg , yolov3-tiny.cfg?(6 MB):?yolov3-tiny.conv.11

            • 對于?enet-coco.cfg (EfficientNetB0-Yolov3)?(14 MB):?enetb0-coco.conv.132

          2. cfg/yolov4-custom.cfg拷貝一份,重命名為yolov4-obj.cfgobj可以是自定義名稱)

            • 修改batch為batch=64

            • 修改subdivisions為subdivisions=16

            • 修改max_batches為(類別數(shù)量*2000,但不要小于4000),如訓(xùn)練3個(gè)類別max_batches=6000

            • 修改steps為max_batches的0.8與0.9,如steps=4800,5400

            • 修改classes=80為自定義數(shù)據(jù)集的類別數(shù)量,主要需要修改3處(3個(gè)[yolo]層):

            • https://github.com/AlexeyAB/darknet/blob/0039fd26786ab5f71d5af725fc18b3f521e7acfd/cfg/yolov3.cfg#L610

            • https://github.com/AlexeyAB/darknet/blob/0039fd26786ab5f71d5af725fc18b3f521e7acfd/cfg/yolov3.cfg#L696

            • https://github.com/AlexeyAB/darknet/blob/0039fd26786ab5f71d5af725fc18b3f521e7acfd/cfg/yolov3.cfg#L783

            • 修改filters=255filters=(classes+5)x3,在3個(gè)[yolo]層的前一個(gè)[convolutional]層,分別為:

            • https://github.com/AlexeyAB/darknet/blob/0039fd26786ab5f71d5af725fc18b3f521e7acfd/cfg/yolov3.cfg#L603

            • https://github.com/AlexeyAB/darknet/blob/0039fd26786ab5f71d5af725fc18b3f521e7acfd/cfg/yolov3.cfg#L689

            • https://github.com/AlexeyAB/darknet/blob/0039fd26786ab5f71d5af725fc18b3f521e7acfd/cfg/yolov3.cfg#L776

            • 如果使用[Gaussian_yolo]層,修改filters=57filters=(classes+9)x3,在3個(gè)[Gaussian_yolo]層的前一個(gè)[convolutional]層,分別為:

              • https://github.com/AlexeyAB/darknet/blob/6e5bdf1282ad6b06ed0e962c3f5be67cf63d96dc/cfg/Gaussian_yolov3_BDD.cfg#L604

              • https://github.com/AlexeyAB/darknet/blob/6e5bdf1282ad6b06ed0e962c3f5be67cf63d96dc/cfg/Gaussian_yolov3_BDD.cfg#L696

              • https://github.com/AlexeyAB/darknet/blob/6e5bdf1282ad6b06ed0e962c3f5be67cf63d96dc/cfg/Gaussian_yolov3_BDD.cfg#L789

            • 例如,如果classes=1,則filters=18;如果classes=2,則filters=21。注意:不要cfg文件中直接寫:?filters=(classes+5)x3)

          3. darknet/data路徑下創(chuàng)建obj.names,其中每一行是一個(gè)目標(biāo)類別名稱

            • 將數(shù)據(jù)集標(biāo)注得到的文件Yolo_categories.names重命名為obj.names,并放到darknet/data

          4. darknet/data路徑下創(chuàng)建obj.data

            教程 darknet 路徑為?/home/user/darknet,本文以此為例,請根據(jù)自己的路徑進(jìn)行修改。在 /home/user/darknet/cfg/ 文件夾下新建一個(gè)文件,名字叫 obj.data 在里面寫入:

          classes = 1
          train = /home/user/darknet/data/coco/Yolo_20180908_234114.txt
          valid = /home/user/darknet/data/coco/Yolo_20180908_234114.txt
          names = data/obj.names
          backup = backup
          eval = coco

          注意:classes 為類別數(shù)量,對于單類檢測問題,寫 1

          ? 5. 將圖像文件(.jpg)與標(biāo)注文件放入到如下路徑darknet\data\coco\路徑下

            • scaled_images里的圖像拷貝到?/home/user/darknet/data/coco/images/train

            • Yolo_labels里的標(biāo)注文件拷貝到/home/user/darknet/data/coco/images/train

            • Yolo_20180908_234114.txt拷貝到/home/user/darknet/data/coco

          ? 6. 開始訓(xùn)練

            • 訓(xùn)練指令:./darknet detector train data/obj.data cfg/yolo-obj.cfg yolov4.conv.137

              (對于最新100次迭代的最新權(quán)重yolo-obj_last.weights會保存在darknet\backup\

              (對于每1000次迭代的權(quán)重yolo-obj_xxxx.weights會保存在darknet\backup\

              (關(guān)閉Loss的顯示窗口./darknet detector train data/obj.data cfg/yolo-obj.cfg yolov4.conv.137 -dont_show

              (通過瀏覽器查看訓(xùn)練過程./darknet detector train data/obj.data yolo-obj.cfg yolov4.conv.137 -dont_show -mjpeg_port 8090 -map,然后打開Chrome瀏覽器,輸入http://ip-address:8090

              (如果需要在訓(xùn)練中計(jì)算mAP,每4期計(jì)算一次,需要在obj.data文件中設(shè)置valid=valid.txt,運(yùn)行:./darknet detector train data/obj.data yolo-obj.cfg yolov4.conv.137 -map

          7. 訓(xùn)練結(jié)束,結(jié)果保存在darknet\backup\yolo-obj_final.weights

            • 如果訓(xùn)練中斷,可以選擇一個(gè)保存的權(quán)重繼續(xù)訓(xùn)練,使用./darknet detector train data/obj.data yolo-obj.cfg backup\yolo-obj_2000.weights

          注意:在訓(xùn)練中,如果avg(loss)出現(xiàn)nan,則訓(xùn)練出了問題,如果是其他字段出現(xiàn)nan,這種情況是正常的。注意:如果需要改變cfg文件中的width=height=,新的數(shù)字需要被32整除。注意:訓(xùn)練完成后,檢測指令為:./darknet detector test data/obj.data yolo-obj.cfg yolo-obj_8000.weights。注意:如果出現(xiàn)Out of memory,需要修改cfg文件中的subdivisions=163264

          訓(xùn)練YOLOv3-Tiny

          訓(xùn)練YOLOv3-Tiny與選了YOLOv4、YOLOv3基本相同,主要有以下小區(qū)別:

          1. 下載yolov3-tiny預(yù)訓(xùn)練權(quán)重,運(yùn)行命令./darknet partial cfg/yolov3-tiny.cfg yolov3-tiny.weights yolov3-tiny.conv.15 15

          2. 新建自定義cfg文件yolov3-tiny-obj.cfg(可以復(fù)制cfg/yolov3-tiny.cfgyolov3-tiny-obj.cfg

          3. 運(yùn)行訓(xùn)練命令:./darknet detector train data/obj.data yolov3-tiny-obj.cfg yolov3-tiny.conv.15

          多GPU訓(xùn)練

          1. 首先在1塊GPU上訓(xùn)練1000次./darknet detector train cfg/coco.data cfg/yolov4.cfg yolov4.conv.137

          2. 停止訓(xùn)練,使用權(quán)重darknet/backup/yolov4_1000.weights,在多塊GPU上訓(xùn)練,運(yùn)行./darknet detector train cfg/coco.data cfg/yolov4.cfg /backup/yolov4_1000.weights -gpus 0,1,2,3

          注意:如果出現(xiàn)nan,應(yīng)該降低學(xué)習(xí)率,如4塊GPUlearning_rate=0.00065(learning_rate=0.00261/GPUs),還應(yīng)該增加cfg文件中的burn_in=為原先的4x,如burn_in=4000

          訓(xùn)練常見程序問題

          注意:如果出現(xiàn)如下錯(cuò)誤

          需要修改源碼/home/user/darknet/src/data.c?將如下代碼

          list *get_paths(char *filename)

          { ?

          char *path; ?

          FILE *file = fopen(filename, "r"); ?
          if(!file) ? ?
          file_error(filename); ?
          list *lines = make_list(); ?
          while((path=fgetl(file))) { ? ?
          list_insert(lines, path); ?
          } ?
          fclose(file); ?
          return lines;
          }

          修改為:

          void ltrim(char *s)

          { ?

          char *p; p = s; ?

          while (*p == ' ' || *p == '\t' || *p == '\r') { p++; } strcpy(s,p);

          }

          void rtrim(char *s)

          { ?

          int i; ?

          i = strlen(s) - 1; ?

          while ((s[i] == ' ' || s[i] == '\t' || s[i] == '\r') && i >= 0 ) { i--; } s[i+1] = '\0';

          }

          void _trim(char *s)


          { ?

          ltrim(s); ?

          rtrim(s);

          }

          list *get_paths(char *filename)

          { ?

          char *path; ?

          FILE *file = fopen(filename, "r"); if(!file) file_error(filename); list *lines = make_list(); while((path=fgetl(file))) { ?

          _trim(path); list_insert(lines, path); ?

          } ?

          fclose(file); return lines;

          }

          保存,make -j8重新編譯 下面為正常訓(xùn)練時(shí)畫面

          何時(shí)應(yīng)該停止訓(xùn)練

          通常情況下,為每個(gè)類別迭代2000次是足夠的,且總的迭代次數(shù)不能低于4000次。但是如果想要更加精確的停止時(shí)間,可以參考以下說明:

          1. 在訓(xùn)練過程中,你會看到一系列訓(xùn)練誤差,當(dāng)0.XXXXXXX avg這個(gè)參數(shù)不再下降時(shí),就該停止訓(xùn)練了

          Region Avg IOU: 0.798363, Class: 0.893232, Obj: 0.700808, No Obj: 0.004567, Avg Recall: 1.000000, count: 8 Region Avg IOU: 0.800677, Class: 0.892181, Obj: 0.701590, No Obj: 0.004574, Avg Recall: 1.000000, count: 8?9002: 0.211667,?0.60730 avg, 0.001000 rate, 3.868000 seconds, 576128 images Loaded: 0.000000 seconds

          • 9002?- 迭代數(shù)量(batch數(shù)量)

          • 0.60730 avg?- 平均損失(誤差),越低越好

          如果發(fā)現(xiàn)0.XXXXXXX avg在很多次迭代后都不再降低,則是時(shí)候該停止訓(xùn)練了。最終的平均損失從0.05(對于小模型和簡單訓(xùn)練數(shù)據(jù))到3.0(對于大模型和復(fù)雜訓(xùn)練數(shù)據(jù))不等。

          1. 當(dāng)訓(xùn)練停止之后,可以從darknet\backup中取出最新保存的訓(xùn)練權(quán)重.weights,并選擇它們中檢測效果最好的

          例如,當(dāng)訓(xùn)練9000次停止后,效果最好的模型可能是之前保存權(quán)重中的一個(gè)(7000,8000,9000),這是因?yàn)檫^擬合(Overfiting)現(xiàn)象。過擬合的表現(xiàn)可以解釋為,在訓(xùn)練圖像上檢測效果很好,但是在其他圖像上效果不佳,這時(shí)候就該盡早停止訓(xùn)練(早停點(diǎn))。

          2.1 首先,你需要在obj.data中指定驗(yàn)證數(shù)據(jù)集valid=valid.txt,如果你沒有準(zhǔn)備驗(yàn)證數(shù)據(jù)集,可以簡單的復(fù)制data\train.txtdata\valid.txt

          2.2 如果你在迭代9000次之后停止訓(xùn)練,驗(yàn)證之前的模型權(quán)重可以使用如下命令:

          • ./darknet detector map data/obj.data cfg/yolo-obj.cfg backup\yolo-obj_7000.weights

          • ./darknet detector map data/obj.data cfg/yolo-obj.cfg backup\yolo-obj_8000.weights

          • ./darknet detector map data/obj.data cfg/yolo-obj.cfg backup\yolo-obj_9000.weights

          然后對比每個(gè)權(quán)重(7000,8000,9000)最后一行輸出,選擇mAP(mean average precision)最高權(quán)重,或者對比IoU(intersect over union)進(jìn)行選擇。

          例如,yolo-obj_8000.weights的mAP最高,則使用這個(gè)權(quán)重。或者在訓(xùn)練時(shí)加上-map參數(shù):

          ./darknet detector train data/obj.data cfg/yolo-obj.cfg yolov4.conv.137 -map

          結(jié)果如下圖所示,mAP每4期(Epoch)通過obj.data中設(shè)置的驗(yàn)證集valid=valid.txt上計(jì)算一次(1期=train_txt中圖像數(shù)量 / batch?次迭代)。

          運(yùn)行訓(xùn)練好的模型,進(jìn)行目標(biāo)檢測,執(zhí)行:

          ./darknet detector test data/obj.data cfg/yolo-obj.cfg yolo-obj_8000.weights

          如何提升檢測效果

          訓(xùn)練之前提升檢測效果的技巧

          • 設(shè)置.cfg文件中random=1,可以使用多分辨率輸入增加檢測效果:link

          • .cfg文件中增加網(wǎng)絡(luò)的輸入分辨率(設(shè)置任意可以被32整除的數(shù)字,如,height=608width=608),可以增加精度

          • 檢查圖像每個(gè)目標(biāo)是否都被標(biāo)記,圖像中的所有目標(biāo)都必須被正確標(biāo)記,推薦使用數(shù)據(jù)管理工具檢查:spire-image-manager

          • Loss很大,mAP很低,是不是訓(xùn)練錯(cuò)了?在訓(xùn)練中使用-show_imgs參數(shù),能夠可視化目標(biāo)框真值,檢查數(shù)據(jù)集是否出了問題。

          • 對于每一個(gè)你要檢測的物體,在訓(xùn)練數(shù)據(jù)集中至少需要有一個(gè)實(shí)例與之相似,包括:形狀、物體側(cè)面、相對大小、旋轉(zhuǎn)角度、傾斜方位角、光照等。因此,你的訓(xùn)練數(shù)據(jù)集需要包含具有不同對象屬性的圖像:比例、旋轉(zhuǎn)、光照、不同側(cè)面、不同背景等。建議對每一類物體收集2000張不同圖像,并迭代訓(xùn)練2000*類別數(shù)量次。

          • 推薦在訓(xùn)練數(shù)據(jù)集中包含帶有不希望檢測的非標(biāo)記目標(biāo)的圖像。負(fù)樣本圖像不需要方框標(biāo)記(空.txt文件),越多越好。

          • 標(biāo)注目標(biāo)的最佳方式是:僅標(biāo)注物體的可見部分,或標(biāo)注物體的可見和重疊部分,或標(biāo)注比整個(gè)物體稍多一點(diǎn)的部分(有一點(diǎn)間隙),標(biāo)注你想讓檢測器檢測的部分。

          • 如果單幅圖像中的物體很多,需要在[yolo]層或[region]層中修改參數(shù)max=200或者更高(全局最大目標(biāo)檢測數(shù)量為0,0615234375*(width*height))。

          如果想要檢測小目標(biāo)(圖像被縮放到416*416后,小于16*16的目標(biāo))

          • https://github.com/AlexeyAB/darknet/blob/6f718c257815a984253346bba8fb7aa756c55090/cfg/yolov4.cfg#L895修改`layers?= 23`

          • https://github.com/AlexeyAB/darknet/blob/6f718c257815a984253346bba8fb7aa756c55090/cfg/yolov4.cfg#L892修改`stride=4`

          • https://github.com/AlexeyAB/darknet/blob/6f718c257815a984253346bba8fb7aa756c55090/cfg/yolov4.cfg#L989修改`stride=4`

          • 如果想要同時(shí)檢測大目標(biāo)與小目標(biāo),可以使用修改模型:

            • 全模型 - 5個(gè)yolo層:https://raw.githubusercontent.com/AlexeyAB/darknet/master/cfg/yolov3_5l.cfg

            • 小模型 - 3個(gè)yolo層:https://raw.githubusercontent.com/AlexeyAB/darknet/master/cfg/yolov3-tiny_3l.cfg

            • YOLOv4 - 3個(gè)yolo層:https://raw.githubusercontent.com/AlexeyAB/darknet/master/cfg/yolov4-custom.cfg

          • 如果你訓(xùn)練的數(shù)據(jù)類別需要區(qū)分左右目標(biāo)(如檢測左右手,交通信號中的左右方向),則不能使用左右翻轉(zhuǎn)圖像增強(qiáng),在cfg文件中設(shè)置flip=0:?https://github.com/AlexeyAB/darknet/blob/3d2d0a7c98dbc8923d9ff705b81ff4f7940ea6ff/cfg/yolov3.cfg#L17

          • 一般規(guī)則 - 您的訓(xùn)練數(shù)據(jù)集應(yīng)包含待檢測目標(biāo)的相對大小的集合:

            • train_network_width * train_obj_width / train_image_width ~= detection_network_width * detection_obj_width / detection_image_width

            • train_network_height * train_obj_height / train_image_height ~= detection_network_height * detection_obj_height / detection_image_height

            也就是,對于測試數(shù)據(jù)集中的每個(gè)物體,訓(xùn)練數(shù)據(jù)集中必須至少有一個(gè)具有相同類與大約相同相對大小的物體。如果訓(xùn)練數(shù)據(jù)中僅有占圖像面積80-90%的物體,則訓(xùn)練后的網(wǎng)絡(luò)不能夠檢測占圖像面積1-10%的物體。

          • 如果想加速訓(xùn)練(損失檢測精度),可以在cfg文件layer-136中設(shè)置參數(shù)stopbackward=1

          • 注意物體的模型、側(cè)面、光照、尺度、方位角等屬性,從神經(jīng)網(wǎng)絡(luò)的內(nèi)部角度來看,這些是不同的物體。因此,你想檢測的物體越多,就應(yīng)該使用越復(fù)雜的網(wǎng)絡(luò)模型。

          • 如果想要外包矩形框更加精確,可以在[yolo]層中增加3個(gè)參數(shù):ignore_thresh=.9 iou_normalizer=0.5 iou_loss=giou,這會增加[email protected],同時(shí)降低[email protected]

          • 如果你比較熟悉檢測網(wǎng)絡(luò)了,可以重新計(jì)算自定義數(shù)據(jù)集的錨框(Anchor):./darknet detector calc_anchors data/obj.data -num_of_clusters 9 -width 416 -height 416,然后設(shè)置cfg文件中3個(gè)[yolo]層9個(gè)錨框。同時(shí)需要改變每個(gè)[yolo]層中的錨框索引mask=,第一層有大于60*60的錨框,第二層有大于30*30的錨框,第三層相同。也需要改變每個(gè)[yolo]層之前的filters=(classes + 5)*。如果許多計(jì)算出的錨框不適合在適當(dāng)?shù)膶酉?- 那么就嘗試使用默認(rèn)錨框。

          訓(xùn)練之后提升檢測效果的技巧

          • 增加cfg文件中網(wǎng)絡(luò)輸入的分辨率,如,height=608width=608,或height=832width=832,這樣可以檢測更小的目標(biāo)。

          4

          如何將訓(xùn)練好的模型部署到無人機(jī)上

          TX2上的準(zhǔn)備工作

          • 推薦使用Ubuntu 18.04(可以使用JetPack刷機(jī))

          • CMake >= 3.8:?https://cmake.org/download/

          • CUDA >= 10.0:?https://developer.nvidia.com/cuda-toolkit-archive

          • cuDNN >= 7.0 for CUDA >= 10.0https://developer.nvidia.com/rdp/cudnn-archive

          • OpenCV >= 2.4:?https://opencv.org/releases.html

          • GCC

          • ROS Melodic:?http://wiki.ros.org/melodic/Installation

          使用JetPack為TX2安裝CUDA與cuDNN

          • 下載JetPack,地址:https://developer.nvidia.com/embedded/jetpack

          • 進(jìn)入 sdkmanager-[version].[build].deb 所在的路徑,其中version和build代表相應(yīng)各自的編號,安裝Debian包:

          sudo apt install ./sdkmanager-[version].[build].deb
          • 安裝好之后,在Terminal中輸入

          sdkmanager
          • 使用NVIDIA賬號登錄

          • 選擇開發(fā)環(huán)境

            • 在 Product Category 中選擇 Jetson.

            • 在 Hardware Configuration 中選擇 target hardware(Jetson TX2),勾掉?host machine

            • 在 Target Operating System 中選擇 JetPack 的版本.

            • 點(diǎn)擊CONTINUE進(jìn)入下一步

          • 檢查下載組件(如果僅安裝CUDA和cuDNN,則只勾選紅圈內(nèi)的選項(xiàng))、選擇存儲路徑以及接收條款

          • 保證Host計(jì)算機(jī)與TX2在同一局域網(wǎng)內(nèi),輸入TX2的IP地址就可以安裝

          部署Darknet-ROS

          • 下載darknet_ros源碼

          cd ~
          cd catkin_ws/src

          git clone --recursive https://github.com/leggedrobotics/darknet_ros.git

          cd ../

          • 編譯

          catkin_make -DCMAKE_BUILD_TYPE=Release
          • 將訓(xùn)練好的cfg和weights加載到darknet_ros中

          /home/user/darknet/cfg/yolov3-tiny.cfg/home/user/darknet/backup中剛剛訓(xùn)練好的參數(shù) 分別拷貝到/home/user/catkin_ws/src/darknet_ros/darknet_ros/yolo_network_config中的cfgweights兩個(gè)文件夾中 在/home/user/catkin_ws/src/darknet_ros/darknet_ros/config文件夾中新建yolov3-tiny-obj.yaml

          里面寫入

          yolo_model: ?

          config_file: ? ?

          name: yolov3-tiny-obj.cfg ?

          weight_file: ? ?

          name: yolov3-tiny-obj.weights ?

          threshold: ? ?

          value: 0.3 ?

          detection_classes: ? ?

          names: ? ? ?

          - drone

          注意,在yolov3-tiny-obj.yaml文件中,需要指定剛才拷貝的cfgweights文件以及names為自己訓(xùn)練的類別

          /home/user/catkin_ws/src/darknet_ros/darknet_ros/launch文件夾中,復(fù)制一份darknet_ros.launch,重命名為obj_det.launch?修改里面的

          注意:這正式剛才編寫的yaml文件

          roslaunch darknet_ros obj_det.launch

          注意:進(jìn)行檢測,需要先打開一個(gè)ros_web_cam節(jié)點(diǎn),以提供攝像頭數(shù)據(jù)

          最后,給一張YOLOv4檢測結(jié)果的樣張吧



          下載1:OpenCV-Contrib擴(kuò)展模塊中文版教程
          在「小白學(xué)視覺」公眾號后臺回復(fù):擴(kuò)展模塊中文教程即可下載全網(wǎng)第一份OpenCV擴(kuò)展模塊教程中文版,涵蓋擴(kuò)展模塊安裝、SFM算法、立體視覺、目標(biāo)跟蹤、生物視覺、超分辨率處理等二十多章內(nèi)容。

          下載2:Python視覺實(shí)戰(zhàn)項(xiàng)目52講
          小白學(xué)視覺公眾號后臺回復(fù):Python視覺實(shí)戰(zhàn)項(xiàng)目即可下載包括圖像分割、口罩檢測、車道線檢測、車輛計(jì)數(shù)、添加眼線、車牌識別、字符識別、情緒檢測、文本內(nèi)容提取、面部識別等31個(gè)視覺實(shí)戰(zhàn)項(xiàng)目,助力快速學(xué)校計(jì)算機(jī)視覺。

          下載3:OpenCV實(shí)戰(zhàn)項(xiàng)目20講
          小白學(xué)視覺公眾號后臺回復(fù):OpenCV實(shí)戰(zhàn)項(xiàng)目20講即可下載含有20個(gè)基于OpenCV實(shí)現(xiàn)20個(gè)實(shí)戰(zhàn)項(xiàng)目,實(shí)現(xiàn)OpenCV學(xué)習(xí)進(jìn)階。

          交流群


          歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器自動駕駛、計(jì)算攝影、檢測、分割、識別、醫(yī)學(xué)影像、GAN算法競賽等微信群(以后會逐漸細(xì)分),請掃描下面微信號加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三?+?上海交大?+?視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會根據(jù)研究方向邀請進(jìn)入相關(guān)微信群。請勿在群內(nèi)發(fā)送廣告,否則會請出群,謝謝理解~


          瀏覽 47
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

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

          手機(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>
                  久久天天躁狠狠躁夜夜躁2014 | 麻豆成人免费视频 | 一级特黄性生活视频在线播放 | 男女抽插网网站 | 俺也来俺也去俺也射 |