歡迎關注我的公眾號 [極智視界],回復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 編譯 darknetclone 源碼:
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 !