因为实习工作的需要,要做一些目标检测的项目。用到了一些目标检测的网络,那就记录一下,这次就先记录一下yolov3的训练之路吧。
1.数据集的准备
安装labelImg软件,来标注自己的数据集。
pip install PyQt5 -i http://pypi.douban.com/simple/
pip install labelimg
安装完之后再终端输入labelimg就行,之后就可以开始标注数据了。
①是选择图片所在位置,
②选择保存
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 最终的文件如下:
到此我们的数据准备工作完成。
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
这就编译完成。 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如下:
表示运行成功,下一步就可是运行自己的数据集了.
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来获取