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
CUDA官方說明文檔:http://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#virtual-architecture-feature-list
然後重新編譯即可:
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文件
下載voc_label.py文件,將文件下載到VOCdevkit同級的路徑下,生成訓練和驗證的文件列表
wget https://pjreddie.com/media/files/voc_label.py
修改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