基于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,不然会报错。