YOLOv3訓練自己的資料詳細步驟
阿新 • • 發佈:2019-01-11
1. 下載YOLOv3工程專案
git clone https://github.com/pjreddie/darknet
cd darknet
2. 修改Makefile配置,使用GPU訓練,修改如下:
GPU=1 #如果使用GPU設定為1,CPU設定為0
CUDNN=1 #如果使用CUDNN設定為1,否則為0
OPENCV=0 #如果呼叫攝像頭,還需要設定OPENCV為1,否則為0
OPENMP=0 #如果使用OPENMP設定為1,否則為0
DEBUG=0 #如果使用DEBUG設定為1,否則為0
CC=gcc
NVCC=/home/user/cuda-9.0/bin/nvcc #NVCC=nvcc 修改為自己的路徑
AR=ar
ARFLAGS=rcs
OPTS=-Ofast
LDFLAGS= -lm -pthread
COMMON= -Iinclude/ -Isrc/
CFLAGS=-Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC
...
ifeq ($(GPU), 1)
COMMON+= -DGPU -I/home/hebao/cuda-9.0/include/ #修改為自己的路徑
CFLAGS+= -DGPU
LDFLAGS+= -L/home/hebao/cuda-9.0/lib64 -lcuda -lcudart -lcublas -lcurand #修改為自己的路徑
endif
儲存完成後,在此路徑下執行make,如果出現如下錯誤:
Loadingweights from yolo.weights...Done!
CUDA Error:invalid device function
darknet: ./src/cuda.c:21: check_error: Assertion `0' failed.
Aborted (core dumped)
這是因為配置檔案Makefile中配置的GPU架構和本機GPU型號不一致導致的。更改前預設配置如下(不同版本可能有變):
ARCH= -gencode arch=compute_30,code=sm_30 \
-gencode arch=compute_35,code=sm_35 \
-gencode arch=compute_50,code=[sm_50,compute_50] \
-gencode arch=compute_52,code=[sm_52,compute_52]
# -gencode arch=compute_20,code=[sm_20,sm_21] \ This one is deprecated?
# This is what I use, uncomment if you know your arch and want to specify
# ARCH= -gencode arch=compute_52,code=compute_52
然後重新編譯即可:
3. 準備訓練資料集
按下列資料夾結構,將訓練資料集放到各個資料夾下面,生成4個訓練、測試和驗證txt檔案列表
VOCdevkit
—VOC2007
——Annotations
——ImageSets
———Layout
———Main
———Segmentation
——JPEGImages
Annotations中是所有的xml檔案
JPEGImages中是所有的訓練圖片
Main中是4個txt檔案,其中test.txt是測試集,train.txt是訓練集,val.txt是驗證集,trainval.txt是訓練和驗證集。
3. 生成2007_train.txt和2007_val.txt檔案
修改sets為訓練樣本集的名稱
sets=[('2007', 'train')]
修改classes為訓練樣本集的類標籤
classes=[str(i) for i in range(10)]
執行python voc_label.py,生成2007_train.txt訓練檔案列表。
4.下載Imagenet上預先訓練的權重
wget https://pjreddie.com/media/files/darknet53.conv.74
5. 修改cfg/voc.data
classes= 10 #classes為訓練樣本集的類別總數
train = /home/user/darknet/2007_train.txt #train的路徑為訓練樣本集所在的路徑
valid = /home/user/darknet/2007_val.txt #valid的路徑為驗證樣本集所在的路徑
names = data/voc.names #names的路徑為data/voc.names檔案所在的路徑
backup = backup
6. 在darknet資料夾下面新建資料夾backup
7. 修改data/voc.name為樣本集的標籤名
0
1
2
3
4
5
6
7
8
9
8. 修改cfg/yolov3-voc.cfg
關於cfg修改,以10類目標檢測為例,主要有以下幾處調整(藍色標出):
[net]
# Testing ### 測試模式
# batch=1
# subdivisions=1
# Training ### 訓練模式,每次前向的圖片數目 = batch/subdivisions
batch=64
subdivisions=16
width=416 ### 網路的輸入寬、高、通道數
height=416
channels=3
momentum=0.9 ### 動量
decay=0.0005 ### 權重衰減
angle=0
saturation = 1.5 ### 飽和度
exposure = 1.5 ### 曝光度
hue=.1 ### 色調
learning_rate=0.001 ### 學習率
burn_in=1000 ### 學習率控制的引數
max_batches = 50200 ### 迭代次數
policy=steps ### 學習率策略
steps=40000,45000 ### 學習率變動步長
scales=.1,.1 ### 學習率變動因子
[convolutional]
batch_normalize=1 ### BN
filters=32 ### 卷積核數目
size=3 ### 卷積核尺寸
stride=1 ### 卷積核步長
pad=1 ### pad
activation=leaky ### 啟用函式
......
[convolutional]
size=1
stride=1
pad=1
filters=45 #3*(10+4+1)
activation=linear
[yolo]
mask = 6,7,8
anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326
classes=10 #類別
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=0 #1,如果視訊記憶體很小,將random設定為0,關閉多尺度訓練;
......
[convolutional]
size=1
stride=1
pad=1
filters=45 #3*(10+4+1)
activation=linear
[yolo]
mask = 3,4,5
anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326
classes=10 #類別
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=0 #1,如果視訊記憶體很小,將random設定為0,關閉多尺度訓練;
......
[convolutional]
size=1
stride=1
pad=1
filters=45 #3*(10+4+1)
activation=linear
[yolo]
mask = 0,1,2
anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326
classes=10 #類別
num=9
jitter=.3 # 資料擴充的抖動操作
ignore_thresh = .5 #文章中的閾值1
truth_thresh = 1 #文章中的閾值2
random=0 #1,如果視訊記憶體很小,將random設定為0,關閉多尺度訓練;
9. 開始訓練
./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74 -gpus 0,1
10. 識別
將訓練得到的weights檔案拷貝到darknet/weights資料夾下面
./darknet detect cfg/yolov3-voc.cfg weights/yolov3.weights data/dog.jpg