YOLOv3训练自己voc格式的数据集

基于YOLOv3的darknet源码

参考:

https://blog.csdn.net/u012135425/article/details/80294884

https://blog.csdn.net/lilai619/article/details/79695109

一、下载代码

1. 1通过git克隆

    git clone https://github.com/pjreddie/darknet.git

1.2在github上下载

https://github.com/pjreddie/darknet

2.解压工程:我是通过github上下载的代码压缩包,所以首先进入压缩包所在的路径

cd /yourpath

解压

unzip darknet-master.zip

3.修改配置文件

由于在实验室中使用的是服务器,所以需要对Makefile进行一些设置。我想要GPU支持的版本,所以在Makefile中,做如下更改:

 4.编译

cd /yourpath/darknet-master/

make(如果make失败就需要先make clean,然后再重新make)

 成功以后的终端显示。

二、训练数据

1.准备数据

图片所在的文件夹和对应的标签数据(labels)所在的文件夹要在同一目录下。标注文件.txt里的数据格式是这样的:

每一行从左至右依次是该图的类别编号、归一化后的中心点x坐标、归一化后的中心点y坐标 、目标框宽度、目标框高度。

2.划分训练数据和测试数据

分别将它们的图片的路径存放到train.txt和val.txt文件中。(我在txt中每行存放一张图片的绝对路径,顺序可以打乱。)

3.编辑cfg/XX.data 文件(例如voc.data,修改后根据自己需要保存)。在训练时工程来这个文件中找到训练数据和验证数据的路径。

classes是你数据集的类别数;train是训练数据train.txt的路径;test同理;names是一个在data文件夹下的文件,里面存放了数据集中所有类别的名称;backup是模型存放的路径,里面是.weights文件(预训练模型从YOLO官方下载https://pjreddie.com/darknet/yolo/)。

4.更改模型的参数配置文件,可参考cfg/yolov3.cfg、cfg/yolov3-voc.cfg

(1)把Training的参数设置打开,Testing的参数设置关闭

batch可根据自己显卡的显存设置。

(2)改所有yolo层前一层filters大小(即最后一层卷积层)

[net]
# Testing
# batch=1
# subdivisions=1
# Training
 batch=64

 subdivisions=8

......

[convolutional]
size=1
stride=1
pad=1
filters=    ###75                                                 filters数目可根据1*1*(3*(4+1+预测的类别数))

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=  ###20                                               类别数
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=0###1                                                 如果显存很小,将random设置为0,关闭多尺度训练;

......

[convolutional]
size=1
stride=1
pad=1
filters=33###75
activation=linear

[yolo]
mask = 3,4,5
anchors = 10,13,  16,30,  33,23,  30,61,  62,45,  59,119,  116,90,  156,198,  373,326
classes=6###20
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=0###1

......

[convolutional]
size=1
stride=1
pad=1
filters=33###75
activation=linear

[yolo]
mask = 0,1,2
anchors = 10,13,  16,30,  33,23,  30,61,  62,45,  59,119,  116,90,  156,198,  373,326
classes=6###20
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=0###1

5.训练

训练命令见YOLO官网。

./darknet detector train cfg/coco.data cfg/yolov3.cfg darknet53.conv.74 -gpus 0,1,2,3

 ./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg yolov3.weights -gpus 0

报错:darknet: ./src/cuda.c:36: check_error: Assertion `0' failed.

debug建议是首先查看命令语句,可以把weights去掉试试。如果去掉weights,则在backup文件夹中就只留下你想用的那个weights就可以了。另外在Makefile中查看–gpu-architecture=compute_52这句话

默认的值对应的GPU是Titan X GPU,即对应compute_52,Tesla K80 GPU对应的是compute_30,详情可查看http://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#virtual-architecture-feature-list

三、测试

跑完以后,需要先评估一下

./darknet detector valid cfg/voc.data cfg/yolov3-voc.cfg backup/yolov3-voc_final.weights

会在results文件夹下产生每一类的txt文件。然后再计算mAP、recall这些。

然后需要计算mAP,这里首先需要voc_eval.py文件,这个文件在经典算法的代码中很常见(如Faster-RCNN),拿过来就行了。

然后需要这么一段代码,参考https://blog.csdn.net/amusi1994/article/details/81564504,亲测有效。之后运行

python compute_mAP.py

 就可以了。值得注意的是,每次运行前记得删掉之前测试产生的annots.pkl,不然会报错。

猜你喜欢

转载自blog.csdn.net/marshallwu1/article/details/82777056