因为实习工作的需要,要做一些目标检测的项目。用到了一些目标检测的网络,那就记录一下,这次就先记录一下yolov3的训练之路吧。

1.数据集的准备

安装labelImg软件,来标注自己的数据集。

pip install PyQt5 -i http://pypi.douban.com/simple/
pip install labelimg

安装完之后再终端输入labelimg就行,之后就可以开始标注数据了。

yolo 预测时设置不用GPU_数据

①是选择图片所在位置,

②选择保存

xml文件的位置。

③创建矩形框用于选择目标位置。 创建形如:

darknet ----VOCdevkit --------VOC2007 ------------Annotations ------------JPEGImages ------------ImageSets ----------------Main ------------labels ------------test.py ----voc_label.py 的文件夹。

之后下载提取码:tfcj对应的脚本。 我们将图片放入JPEGImages,将生成的xml文件放入Annotations。并且将test.py和voc_label.py放入VOC2007文件夹下。     1.运行test.py文件,那么将在ImageSets\Main下生成train.txt、test.py、val.txt和trainval.txt,其中trainval.txt是test.py和val.txt的合并。     2.YOLOV3的label标注的一行五个数分别代表类别(从 0 开始编号),BoundingBox 中心X坐标、中心Y坐标、宽和高。这些坐标都是0~1的相对坐标。和我们刚才标注的生成的xml文件不同,因此需要运行voc_label.py(必须在训练的机子上运行)生成我们实验需要的标签数据。生成在labels下的txt文件,同时生成2007_train.txt、2007_val.txt和2007_test.txt 最终的文件如下:

yolo 预测时设置不用GPU_xml文件_02

到此我们的数据准备工作完成。

2.源码下载与编译

    1.执行:

git clone https://github.com/pjreddie/darknet
cd darknet
#也可以用软件打开进行编辑 如果使用CPU模式。则不用修改Makefile文件
vim Makefile

    2.编辑Makefile文件:

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
...
NVCC=/usr/local/cuda-11.0/bin/nvcc   #NVCC=nvcc 修改为自己的路径``
...
COMMON+= -DGPU -I/usr/local/cuda-11.0/include/  #修改为自己的路径
...
LDFLAGS+= -L/usr/local/cuda-11.0/lib64 -lcuda -lcudart -lcublas -lcurand #修改为自己的路径

修改完之后,执行:

make

yolo 预测时设置不用GPU_深度学习_03

这就编译完成。     3.下载预训练权重,测试demo

# 将yolov3.weights放在./darknet下
wget https://pjreddie.com/media/files/yolov3.weights 
./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg

如果在./darknet下生成predictions.jpg如下:

yolo 预测时设置不用GPU_yolo 预测时设置不用GPU_04

表示运行成功,下一步就可是运行自己的数据集了.

    4.运行自己的数据 将VOCdevkit放入darknet下 然后下载预训练数据集:

# darknet53.conv.74放在./darknet下
wget https://pjreddie.com/media/files/darknet53.conv.74

    5.修改参数 1.修改cfg/voc.data

classes= 4 #检测类别
train  = /root/xxx/darknet/2007_train.txt
valid  = /root/xxx/darknet/2007_test.txt
names = data/voc.names
backup = backup

2.修改文件cfg/yolov3-voc.cfg

[net]
# Testing 训练时注释
#  batch=1
#  subdivisions=1
# Training 
batch=64
subdivisions=16

更多的参数解释参考参数解释 同时在这个文件中搜索yolo词,一共有3个每个地方都必须要改2处,

filters=21 # 修改为3*(5+len(classes)) 
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=2 # 修改为len(classes) person car
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=1 # 原来是1,显存小改为0。(是否要多尺度输出。)选择性修改

可修改:random = 1:原来是1,显存小改为0。(是否要多尺度输出。) 3.修改data/voc.names和coco.names

# 修改为自己的类别
aeroplane
bicycle
bird
boat
bottle
bus
car
cat
chair
cow

    6.开始训练

# -gpu可选
./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74 -gpu 0
# 中断后可重新训练
./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74 -gups 0,1,2,3 backup/yolov3-voc.backup -gpus 0,1,2,3

训练好的模型保存在darknet/backup/下 我们用训练好的模型进行测试:

./darknet detect cfg/yolov3-voc.cfg backup/yolov3-voc_xx.weights data/img.jpg

如果想批量获取输出结果,请使用脚本提取码:tfcj中的yolo3.py来获取