YOLOv3訓練自己的數據詳細步驟

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

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章