【模型訓練】ubuntu 編譯 Darknet 與 YOLO 訓練

2022-01-02 極智視界

   歡迎關注我的公眾號 [極智視界],回復001獲取Google編程規範

  O_o   >_<   o_O   O_o   ~_~   o_O

   大家好,我是極智視界,本文介紹了在 ubuntu 上編譯 darknet 及 yolo 訓練的方法。

1、編譯 darknet1.1 編譯 opencv

   關於 cuda 及 cudnn 的安裝就不多說了,關於 opencv 的編譯可以參考我之前寫的《【經驗分享】x86、aarch64、arm32環境編譯/交叉編譯opencv方法》,裡面記錄了在 x86、aarch64及 arm32 平臺上編譯 opencv 的方法,簡潔有效。

1.2 編譯 darknet

   clone 源碼:

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

cd darknet

   修改 Makefile,打開 gpu、opencv、openmp:

GPU=1
CUDNN=1
CUDNN_HALF=1
OPENCV=1
AVX=0
OPENMP=1
LIBSO=1
ZED_CAMERA=0
ZED_CAMERA_v2_8=0

   然後開始編譯,很簡單:

make -j32

   完了驗證一下是否安裝成功:

./darknet detect cfg/yolov3.cfg cfg/yolov3.weights data/dog.jpg

   當然 yolov3.weights 需要自己下載,傳送:https://pjreddie.com/media/files/yolov3.weights

   運行成功後,會在 <darknet-path> 目錄下生成一張很經典的檢測圖 predictions.jpg:

2、Yolo 訓練2.1 製作 VOC 數據集

   可以製作 VOC 格式的自己的數據集,也可以直接用 VOC 的數據進行訓練。

   關於 VOC 格式數據怎麼製作的,可以參考我的這篇:《【經驗分享】目標檢測 VOC 格式數據集製作》,裡面介紹的比較詳細了。

2.2 Yolo 訓練

   在有了數據集後,然後搞來模型結構文件和預訓練權重就可以開啟愉快的煉丹之旅。在 cfg 文件夾裡其實已經提供了很多的模型結構文件,如 yolov3.cfg、yolov3-tiny.cfg、yolov4.cfg、yolov4-tiny.cfg 等,你只需要找到相應的預訓練權重就行了,如:

yolov3.cfg  ---> darknet53.conv.74  傳送:https://pjreddie.com/media/files/darknet53.conv.74

yolov3-tiny.cfg ---> yolov3-tiny.conv.11  傳送:https://drive.google.com/file/d/18v36esoXCh-PsOKwyP2GWrpYDptDY8Zf/view?usp=sharing

yolov4-tiny.cfg ---> yolov4-tiny.conv.29  傳送:https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v4_pre/yolov4-tiny.conv.29

yolov4.cfg ---> yolov4.conv.137  傳送:https://drive.google.com/open?id=1JKF-bdIklxOOVy-2Cr5qdvjgGpmGfcbp

   接下來我們以 yolov4 為例,開啟咱們愉快的訓練之旅吧。

   我這裡是非桌面環境,所以加了 -dont_show 傳參。

./darknet detector train cfg/voc.data cfg/yolov4.cfg yolov4.conv.137 -dont_show

   來看以上命令,./darknet detector train 是固定的,其他:

cfg/voc.data:傳訓練數據;

cfg/yolov4.cfg:傳訓練模型結構;

yolov4.conv.137:傳預訓練權重

   以上執行訓練的命令十分清晰,來看一下 voc.data:

classes= 20                                        # 目標檢測類別數
train  = /home/pjreddie/data/voc/train.txt         # 訓練數據集
valid  = /home/pjreddie/data/voc/test.txt          # 測試數據集
names = data/voc.names                             # 類別名稱
backup = /home/pjreddie/backup/                    # 訓練過程中間權重備份目錄

   在 .cfg 中我們也可以針對自己的訓練情況做一些改動,主要是 [net] 內的一些參數:

[net]
batch=64                  # batch 設置
subdivisions=32           # 每次傳進 batch/subdivision 的數據,若gpu顯存不夠用,把這個參增大
# Training
width=608                 # 圖片寬
height=608                # 圖片高
channels=3                # 通道數
momentum=0.949            # 動量,影響梯度下降到最優值得速度
decay=0.0005              # 權重衰減正則項,用於防止過擬合
angle=0                   # 通過旋轉角度增多訓練樣本
saturation = 1.5          # 通過調整圖片飽和度來增多訓練樣本
exposure = 1.5            # 通過調整曝光度來增多訓練樣本
hue=.1                    # 通過調整色調來增多訓練樣本

learning_rate=0.0013      # 學習率,這個參數比較重要,決定訓練收斂快慢及是否能達到好的效果
burn_in=1000              # 學習率設置相關,當小於該參時更新有一種方式,大於該參時採用policy更新方式
max_batches = 500500      # 訓練批次到這個參的時候停止訓練
policy=steps              # 學習率調整策略
steps=400000,450000       # step和scales是配合使用,這裡的意思到400000和450000的時候學習率分別衰減10倍,因為後面慢慢收斂了
scales=.1,.1

#cutmix=1                 # cutmix變換,是數據增強的一種方式
mosaic=1                  # mosaic變換,是數據增強的一種方式

   除了這些外,如果你是訓練自己的數據集,檢測的類別數就不一定是官方給的 20 了,所以對於 yolo 層也需要做一些修改,拿其中一個 yolo 層來說:

...
[convolutional]
size=1
stride=1
pad=1
filters=75          # filters = 3*(classes+5),這個需要根據你的 classes 數目進行相應修改
activation=linear

[yolo]
mask = 6,7,8
anchors = 12, 16, 19, 36, 40, 28, 36, 75, 76, 55, 72, 146, 142, 110, 192, 243, 459, 401
classes=20        # 檢測類別數
num=9
jitter=.3
ignore_thresh = .7
truth_thresh = 1
random=1
scale_x_y = 1.05
iou_thresh=0.213
cls_normalizer=1.0
iou_normalizer=0.07
iou_loss=ciou
nms_kind=greedynms
beta_nms=0.6
max_delta=5

   yolo 層中的 anchors 對於不同的檢測任務也需要做一定的修改,比如檢測人,錨框就需要瘦高型的,如檢測車,可能更傾向於窄寬型的錨框,然後像一些置信度閾值、nms閾值等參數也需要訓練的時候做一些調參。

   然後解釋一下為什麼需要修改 yolo 上一層卷積的 filters,這個我在這篇《【經驗分享】剖析 darknet entry_index 指針偏移邏輯》有做過一定的分析,需要從 yolo 層的數據排布來說:

   (1)數據按四維 [N, C, H, W] 來說,N 為 batch,C 為 3 * (5 + classes)、H / W 為 feature_map 高和寬。需要解釋一下 C,C = 3 * (1 + 4 + classes),其中 1 表示置信度,4 為檢測框位置信息,classes 為類別數,即每個類別給出一個檢測得分,乘 3 表示每個格子有 3 個錨框。這樣就形成了 yolo 層接受的四維數據排布,也就是 yolo 上一層的輸出數據排布;

   (2)至於 yolo 層的輸出,darknet 裡會用一維動態數組來存放 yolo 層的數據,這裡就涉及到怎麼將四維數據轉換為一維數據的問題。darknet 裡是這麼做的,假設四維數據為  [N, C, H, W] ,每個維度對應的索引為 [n, c, h, w],那麼展開就是 n*C*H*W + c*H*W + h*W + w,按這樣的邏輯存放到 *output 中。

   這樣回過頭來看應該比較好理解為什麼 yolo 上一層卷積的 filters 為 3 * (classes + 5) 了。

   好了,接下來我們開始訓練吧,還是執行:

./darknet detector train cfg/voc.data cfg/yolov4.cfg yolov4.conv.137 -dont_show

   如果需要保存訓練日誌,可以這麼做:

./darknet detector train cfg/voc.data cfg/yolov4l.cfg yolov4.conv.137 2>1 | tee visualization/train_yolov4.log

   控制臺會輸出訓練日誌:

   等訓練完就會在 backup = /home/pjreddie/backup/ 保存訓練得到的最終及中間權重文件。如果效果滿意的話就可以拿去部署,對於目標檢測來說,衡量效果怎麼樣的指標一般就是 map 了。

   好了,以上分享了 ubuntu 上編譯 darknet 以及訓練 yolo 的方法,希望我的分享能對你的學習有一點幫助。


聲明:轉載請說明出處

掃描下方二維碼關注【極智視界】公眾號,獲取更多實踐項目資源和讀書分享,讓我們用極致+極客的心態來迎接AI !


相關焦點

  • 【超快超輕YOLO】YOLO-Fastest從Darknet源碼編譯、測試再到訓練完整圖文教程!
    11、模型編譯、測試和訓練1.1、YOLO-Fastest編譯git clone https://github.com/dog-qiuqiu/Yolo-Fastest第五步編譯完成後在Yolo-Fastest目錄下會有Release文件夾,把裡面編譯完成的darknet.dll和darknet.exe複製到Yolo-Fastest/build/darknet/
  • YOLOV3目標檢測算法的模型訓練教程
    /darknet detector train cfg/voc.data cfg/yolov3-voc.cfg scripts/darknet53.conv.74解析: 1)在DarkNet主目錄下編譯完成,則DarkNet框架訓練環境搭建完成。可以使用命令:「.
  • YOLO v4 : 基於數據集BCCD,從頭開始配置文件,訓練一個模型
    福利:我會在文末分享這個DIY項目的下載連結閒言少敘,我們進入正題:我們創建一個虛擬環境,名稱:YOLO_v4_env請在命令行窗口輸入命令:1. pip install virtualenv
  • 使用YOLOv3訓練自己數據的目標檢測
    準備Darknet2.1 下載與編譯Darknetcd ~git clone https://github.com/pjreddie/darknetcd darknetmake{並再次make編譯。下載預訓練模型為了使訓練過程網絡能更快收斂,使用ImageNet數據集上的預訓練模型。
  • YOLOv4 的各種新實現、配置、測試、訓練資源匯總
    https://github.com/rrddcc/YOLOv4_tensorflow3、YOLOv4 的 TensorFlow 實現.https://github.com/klauspa/Yolov4-tensorflow4、YOLOv4 的 PyTorch 實現https://github.com/GZQ0723/YoloV45、YOLOv4(TensorFlow後端)的 Keras 實現https://github.com/Ma-Dan/keras-yolo4
  • 使用google colab訓練YOLOv5模型
    YOLOv5模型訓練來到google drive,點擊左上方的Newcolab_yolov5創建一個新的文件夾colabcolab_yolov5接下來,將準備好的口罩數據集上傳到colab文件夾中,這個數據集,前面我們在YOLOv5模型訓練的時候用過,可以到下面的地址下載原始連結 https://public.roboflow.ai/object-detection
  • 實戰 | 如何將YOLOv4部署到無人機?
    /darknet detector train data/obj.data yolo-obj.cfg yolov4.conv.137 -map)7. 訓練結束,結果保存在darknet\backup\yolo-obj_final.weights注意:在訓練中,如果avg(loss)出現nan,則訓練出了問題,如果是其他欄位出現nan,這種情況是正常的。
  • 如何在無人機上部署YOLOv4物體檢測器
    /darknet detector train data/obj.data yolo-obj.cfg yolov4.conv.137 -map)7. 訓練結束,結果保存在darknet\backup\yolo-obj_final.weights注意:在訓練中,如果avg(loss)出現nan,則訓練出了問題,如果是其他欄位出現nan,這種情況是正常的。
  • yolov5訓練過程可視化
    我們介紹過yolov5已經在本地集成了Weights & Biases,也就是wandb,這樣就可以方便的追蹤模型訓練的整個過程,包括模型的性能、超參數、GPU的使用情況、模型預測,還有數據集。說到底,wandb就是個可視化的工具。
  • YOLOv3物體檢測,即Darknet基本使用
    /pjreddie/darknet.gitcd darknetmake如果需要GPU加速的話,需要修改Makefile, 將 GPU=0 改成 GPU=1,然後重新 make, 由於我的系統是最新的18.04版本,GCC版本已經升級到了7,編譯中出現了如下錯誤解決方法如下在cuda 8.0中做一個gcc-5的一個軟連接,非常方便。
  • 深度學習YOLOV4自動訓練平臺安裝與使用教程
    針對目標檢測算法在檢測速度達到要求時無法保證檢測精度的問題,本文基於深度學習模型YOLOV4, 開發了簡易的半自動化的訓練工具平臺,可以方便現場操作人員及時更新與補充新採集的數據,完成模型的訓練與更新,並且進行模型的快速迭代,從而提高在線實時檢測的精度。
  • darknet源碼學習(一):在VS上構建並編譯darknet解決方案
    1 darknet 簡介darknet是谷歌開發的一款輕量級神經網絡框架,基於C語言和CUDA編寫,其優點是代碼非常精煉,運行速度快(經我測試,其在某些分類任務上的訓練速度是PyTorch的至少10倍),同時易於遷移到實際工程中;缺點是不夠靈活,只提供了最基本的訓練和測試接口。
  • Colab訓練YOLO v5實現口罩檢測
    本文介紹在谷歌colab上訓練yolov5進行目標檢測的基本流程。yolo系列模型是當前最先進的目標檢測模型之一。YOLO V5性能與YOLO V4不相伯仲,但其個頭比V4小得多,模型訓練速度也要快上不少。本文前置條件:為了能夠訪問Colab,需要電腦能夠科學上網。
  • 【AlexeyAB DarkNet框架解析】一,框架總覽
    值得一提的是AlexeyAB版本Darknet的README.md已經被我們整理成了中文版本,如果你是學術派不是很在意底層代碼實現你可以參考README.md去訓練或者測試你想要的模型。README.md的中文翻譯地址如下:【翻譯】手把手教你用AlexeyAB版Darknet 。注意這一節僅僅是框架總覽,不會那麼詳細,後面會非常詳細的來逐步分析每個步驟。
  • darknet-mini:帶注釋的darknet簡化版,助你深入理解YOLO
    本人對darknet的解讀,為期接近3個月時間,從2020年8月5日到至今(10月23日),期間幾乎查遍了CSDN,知乎,github所有能看到關於darknet的解讀資源,這裡特別感謝github上:https://github.com/hgpvision/darknethttps://github.com/BBuf/Darknet
  • 乾貨 | YOLOV5 訓練自動駕駛數據集,並轉Tensorrt,收藏!
    預訓練模型python train.py --img 640 --batch 32 --epochs 300 --data '.yolov5,該項目提供了一大批常見模型的轉Tensorrt方法。/tensorrt/yolov5/gen_wts.py文件到./yolov5 工程下,修改其中加載模型路徑,執行該python文件,得到yolov5.wts,並將其拷貝回 ./tensorrt/yolov5/下。
  • 【模型推理】談談 darknet yolo 的 route 算子
    yolo 網絡中的 route 算子。   yolo 是目標檢測算法落地常用的網絡,具有速度快、精度高的優點,相信很多同學都熟悉,route 層在 yolov1、yolov2、yolov3、yolov4 中均有出現,yolov4 tiny 中的 route 又有了一些新特性,現在的它既能做類似 concatenate 的拼接,也能做類似 slice 的切割,算子功能十分豐富
  • 使用Python和YOLO檢測車牌
    接下來,我們需要壓縮文件並進行模型訓練。我們已經有幾百個帶有標籤的汽車圖像。足夠我們訓練一個好的YOLO模型,接下來就是我們要做的。我們將在帶有GPU後端的Google Colab上訓練模型。我們的案例中,在Colab中訓練模型大約需要2個小時,但是時間會有所變化,具體取決於GPU和數據集的大小。
  • 訓練YOLO網絡
    但是,為了鼓勵你使用 YOLO 並為你的項目提供一個起點,我還提供了腳本,允許你下載我的預訓練模型以及所有配置文件和測試數據集。像往常一樣,你會在我的 GitHub 上找到所有的內容:https://github.com/SkalskiP/ILearnDeepLearning.py/tree/master/02_data_science_toolkit/02_yolo_object_detection。