1.下载安装darknet
git clone https://github.com/pjreddie/darknet.git
cd darknet
2.修改Makefile
GPU=1
CUDNN=1
OPENCV=1
OPENMP=0
DEBUG=0
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
VPATH=./src/:./examples
SLIB=libdarknet.so
ALIB=libdarknet.a
EXEC=darknet
OBJDIR=./obj/
CC=gcc
NVCC=/usr/local/cuda-10.1/bin/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 ($(OPENMP), 1)
CFLAGS+= -fopenmp
endif
ifeq ($(DEBUG), 1)
OPTS=-O0 -g
endif
CFLAGS+=$(OPTS)
ifeq ($(OPENCV), 1)
COMMON+= -DOPENCV
CFLAGS+= -DOPENCV
LDFLAGS+= `pkg-config --libs opencv`
COMMON+= `pkg-config --cflags opencv`
endif
ifeq ($(GPU), 1)
COMMON+= -DGPU -I/usr/local/cuda/include/
CFLAGS+= -DGPU
LDFLAGS+= -L/usr/local/cuda-10.1/lib64 -lcuda -lcudart -lcublas -lcurand
endif
ifeq ($(CUDNN), 1)
COMMON+= -DCUDNN
CFLAGS+= -DCUDNN
LDFLAGS+= -lcudnn
endif
修改完成后
make clean
make
3.创建文件夹
——VOCdevkit
————VOC2012
——————Annotations #存放xml
——————ImageSets
————————Main #存放训练集、验证集、测试集
——————JPEGImages #存放训练图片
——————labels #存放标签信息.txt
在VOC2012文件夹下创建一个名为test.py的文件
import os
import random
trainval_percent = 0.3
train_percent = 0.7
xmlfilepath = 'Annotations'
txtsavepath = 'ImageSets\Main'
total_xml = os.listdir(xmlfilepath)
num = len(total_xml)
list = range(num)
tv = int(num * trainval_percent)
tr = int(tv * train_percent)
trainval = random.sample(list, tv)
train = random.sample(trainval, tr)
ftrainval = open('ImageSets/Main/trainval.txt', 'w', encoding='UTF-8')
ftest = open('ImageSets/Main/test.txt', 'w', encoding='UTF-8')
ftrain = open('ImageSets/Main/train.txt', 'w', encoding='UTF-8')
fval = open('ImageSets/Main/val.txt', 'w', encoding='UTF-8')
for i in list:
name = total_xml[i][:-4] + '\n'
if i in trainval:
ftrainval.write(name)
if i in train:
ftest.write(name)
else:
fval.write(name)
else:
ftrain.write(name)
ftrainval.close()
ftrain.close()
fval.close()
ftest.close()
执行后在ImageSets/Main下会生成test.txt train.txt trainval.txt val.txt 4个文件
4.将scripts/voc_label.py拿出来放到darknet文件夹下(可不拿,拿出来已成习惯),修改里面的参数。
sets=[('2012,'train'),('2012','val'),('2012','test')]
classes=["tag1","tag2","tag3"]
删掉最下面两行中与2012中无关的,例如2007_train.txt 2007_val.txt 等
运行后生成 2012_test.txt 2012_train.txt 2012_val.txt
5.修改
①data/voc.names 中的标签名改为自己设置的
tag1
tag2
tag3
②cfg/voc.data修改 classes= 自己的标签数
train vaild 地址修改成运行voc_label.py时生成2012_train.txt和2012_test.txt的地址
③cfg/yolov3-voc.cfg修改
[net]
# Testing
# batch=1 #注释掉
# subdivisions=1 #注释掉
# Training
batch=64 #消注释
subdivisions=16 #消注释
width=416
height=416 #width 和height必须是32的倍数
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 #迭代每达到steps中设置的次数时,learning_rate衰减为之前的0.1
继续往下翻
有3处要改成这样
↓
[convolutional]
size=1
stride=1
pad=1
filters=24 #filters=3*(classes+5)
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=3 #标签种类数
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=1
6.YOLO初始权重下载
wget https://pjreddie.com/media/files/yolov3.weights
卷积指令权重下载
wget https://pjreddie.com/media/files/darknet53.conv.74