1.机器配置
- 系统:Ubuntu 18.04
- 显卡:GeForce GTX 1060 6GB/PCIe/SSE2
- CPU:Intel® Core™ i5-8400 CPU @ 2.80GHz × 6
- 内存:15.5 GiB
2.环境配置
- Opencv 3.4.4
- CUDA 9.0
- cuDNN
- NVIDIA显卡驱动
3.制作自己的数据集(VOC格式)
(1)创建文件夹
文件夹格式如下
- VOC2007
-
Annotations
-
ImageSets
- Layout
- Main
- Segmentation
-
JPEGImages
-
labels
-
其中:
Annotations文件夹中放置数据标注后的文件,也就是*.xml文件。
Main文件夹中放置test.txt 、train.txt 、trainval.txt 、val.txt文件。(文件主要是用来训练或测试的图像的名称)
JPEGImages文件夹中放置所有要训练的图片,图片按照000001.jpg、000002.jpg ······类似这种格式放置。(按照统一规则命名)
创建好文件夹后,在 scripts
文件夹中创建文件夹VOCdevkit
(如果有就不必创建),然后 将VOC2007
文件夹整体放入VOCdevkit
中,形成/darknet/scripts/VOCdevkit/VOC2007
第一步就算完成了。
(2)标注图片数据集
将所有图片数据集放到/darknet/scripts/VOCdevkit/VOC2007/JPEGImages
文件夹中。(按照统一规则命名)
使用labelImg标注图像。(labelImg的安装与使用)
将标注好的 .xml 文件保存到/darknet/scripts/VOCdevkit/VOC2007/Annotations
文件夹中。(按照统一规则命名)
(3)配置文件
- 在
/darknet/scripts/VOCdevkit/VOC2007
下新建test.py文件,将下面代码拷贝进去并运行,将在/darknet/scripts/VOCdevkit/VOC2007/ImageSets/Main
中生成四个文件:test.txt 、train.txt 、trainval.txt 、val.txt。
import os
import random
trainval_percent = 0.1
train_percent = 0.9
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')
ftest = open('ImageSets/Main/test.txt', 'w')
ftrain = open('ImageSets/Main/train.txt', 'w')
fval = open('ImageSets/Main/val.txt', 'w')
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()
- 修改
/darknet/cfg/voc.data
文件,class为类别数目,train为训练数据txt所放的位置,valid为validation数据txt所放的位置,names为voc.names所放的位置,backup为模型训练过程中存储模型参数的位置。
- 修改
/darknet/data/voc.names
文件,一行一个类别标签。
-
修改
/darknet/cfg/yolov3-voc.cfg
,用的哪个模型就修改哪个模型的.cfg文件,这边用动是yolov3-voc。- 修改batchsize=64和subdivisions=64,batch_size表示每一个批次用来训练的图片张数,subdivisions表示一个批分成几组导入训练。若出现GPU训练动时候提示memory_out可以修改这两个参数试试;
- filters=75->filters=21,计算公式为filters=3x(classes数目+5);
- [yolo]子参数下,classes大小改成你的训练数据的类别数目,这边为2,random改成0(关闭多尺度训练,如果显存足够可以置为1)
(4)转换XML数据集格式
将.xml文件转换成.txt文件
.xml包含了图像名称、图像路径、图像size和深度、标记框的坐标信息
.txt包含了object-class 、x、y、width、 height。
在终端输入
wget https://pjreddie.com/media/files/voc_label.py
下载python文件。下载好之后修改其中的内容。这里需要修改两个地方,sets和classes,classes根据自己需要修改。
接下来运行该文件,我们的目录下会生成三个txt文件2007_train.txt、2007_val.txt、2007_test.txt, VOCdevkit下的VOC2007也会多生成一个labels文件夹,下面是真正会使用到的label,点开看发现已经转化成YOLOV3需要的格式了。这时候自己的数据集正式完成。
在终端输入:
python voc_label.py
cat 2007_train.txt 2007_val.txt > train.txt
4.训练及检测
下载权重:
wget https://pjreddie.com/media/files/darknet53.conv.74
开始训练:
./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74
进行检测:(其中yolov3-voc.weights是你自己训练好的权重,在/darknet/backup
中)
./darknet detector test cfg/voc.data cfg/yolov3-voc.cfg yolov3-voc.weights
参考资料:
https://blog.csdn.net/maozezhong0/article/details/80144641
https://blog.csdn.net/qq_21578849/article/details/84980298