记录一下本地编译darknet并用自己的数据集来训练yolov3的过程,最后补充了mAP的计算方法。
1.环境配置
首先CUDA和Cudnn是必备的,安装有很多教程就不多写了,opencv安装比较麻烦可以不用装
2.本地编译darknet
从github获取darknet
git clone https://github.com/pjreddie/darknet
cd darknet
修改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
在darknet文件夹下编译
make
下载yolov3的预训练模型
wget https://pjreddie.com/media/files/yolov3.weights
测试是否编译成功
./darknet detector test cfg/coco.data cfg/yolov3.cfg yolov3.weights data/dog.jpg
3.准备数据集
一般是先准备VOC格式的数据集,然后通过一些脚本文件转化成可用于训练的版本
在darknet文件夹下创建dateset文件夹,内部结构为:
dataset
---JPEGImages#存放原图像(名字只要和xml对应就行,不用规范化)
---Annotations#存放图像对应的xml文件
---ImageSets/Main # 存放训练/验证图像的txt文件(脚本生成)
将图像数据放入JPEGImages,xml的标注文件放入Annotations,然后新建一个py文件,随便命名(如:maketxt.py)
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()
运行后会在ImageSets/Main路径下生成train.txt,val.txt,test.txt和trainval.txt四个必备的txt文件
转换VOC格式的数据集为darknet的格式(点坐标进行归一化https://blog.csdn.net/hesongzefairy/article/details/104443573)
在darknet文件夹中创建一个py文件,随便命名,需要修改的地方看注释(修改自darknet/scripts/voc_label.py)
import xml.etree.ElementTree as ET
impor