官网安装:https://pjreddie.com/darknet/install/
Darknet安装相对caffe来说非常简单。
Opencv和cuda作为选装的部分,可以不安装。推荐安装这两个,只有安装的cuda才能使用gpu。只有安装了opencv才能调用摄像头进行实时检测。
Opencv和cuda的安装方法参考安装caffe时的安装方法:
http://blog.csdn.net/vvyuervv/article/details/60755653
Darknet的安装简单来说就三个步骤:下载安装包,修改Makefile文件,编译
下载安装包:
使用命令行下载的命令:
git clone https://github.com/pjreddie/darknet.git
当然也可以直接输入网址进行下载:
https://github.com/pjreddie/darknet.git
下载之后打开文件夹里的Makefile文件,如果你安装的opencv和cuda,则将Makefile文件中的GPU和OPENCV修改成1 。 即:
GPU=1
OPENCV=1
CUDNN=1
...
NVCC=/usr/local/cuda-8.0/bin/nvcc
如果没有安装opencv和cuda就不需要进行修改
git clone https://github.com/pjreddie/darknet
cd darknet
make
这样就可以了,没有安装opencv和cuda的情况下编译很快,安装了的编译时要等一会,时间也不是很长。
测试已训练好的权重
接着下载了yolo v3的weight:
wget https://pjreddie.com/media/files/yolov3.weights
./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg
得到了网络架构和识别结果
当前目录多出一张识别结果图片,打开图片!
当然我们也可以这样来跑一段Video
./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights
1、 在.data文件中,每行的后面不能有空格。程序在运行时会有字符串的拼接,查找地址,如果有空格,会出现找不到文件的错误。
2、进行finetuning时,不能直接只用已训练好的权重,需要经过
./darknet partial cfg/darknet19_448.cfg darknet19_448.weights darknet19_448.conv.23 23
命令的转换,使用darknet19_448.conv.23进行微调
3、 测试召回率recall的命令
./darknet detector recall data/our.data cfg/yolo.cfg backup/yolo_final.weights
需要在data文件夹内建立一个coco_val_5k.list文件,里面存放需要测试的图片的路径和名称。
4、 测试时是每张图片都会显示信息
833 204 282 RPs/Img:760.41 IOU: 57.22% Recall:72.34%
ID 833 预测正确的框的个数204 总共282个框
5、 将测试的所有数据放入TXT文档中
./darknet detector recall data/oil_data/960x480/our.data data/oil_data/960x480/tiny-yolo.cfg data/oil_data/960x480/backup/tiny-yolo_final.weights 2>> iou.txt
只有NAN在平均数十次迭代中发生平均损失时,训练才会出错。
Nan为什么会出现:https://github.com/AlexeyAB/darknet/issues/636#issuecomment-381400954
Darknet 官网给出了使用已经训练好的网络结构yolo去进行实时的检测的教程
链接:https://pjreddie.com/darknet/yolo/
。。。。。。。
第二步:生成TXT文件
标记完后会生成每张图片对应的xml文件,也就是每张图片的label文件,我们需要提取其中的一些boundingbox的信息。
在darknet的scripts文件夹下有一个voc_label.py的文件,这个是针对voc图片集的xml生成对应图片TXT文件的脚本,根据自己的情况进行修改,生成自己的图像数据的TXT文件数据。TXT文件的内容每行都是 这种形式,且坐标和长宽都应该是归一化后的数值。
在运行voc_label.py 脚本时还会生成一个train.txt文件,改文件里存放的是每张图片的绝对路径。Train.txt是训练时需要的文件。
生成txt文件后,记得将原图像和txt文件放到同一个文件夹下。
利用scripts/kitti_label.py生成scripts/train.txt和scripts/train.all.txt文件
第三步:在data文件夹里面创建一个kitti.names文件
文件命名任意,文件里存放的是类型的名称,每一类另起一行。
Pedestrian
Car
第四步:修改kitti.data文件
之后我们修改darknet下cfg文件中的voc.data文件,当然我们也可以自己创建一个kitti.data文件。
classes= 20 #训练数据的类别数目,我这里只有一类,所以这里是20
train = /train.txt #上面1.2步骤生成的train文件路径
valid = test.txt #上面1.2步骤生成的val文件路径
names = data/voc.names #上面2.1步骤创建的names文件路径
backup = backup #这是训练得到的model的存放目录,建议自己修改。
根据我们实际的文件路径和类别等相关信息,对kitti.data文件进行修改。cfg/kitti.data
classes= 2
train = /home/whsyxt/Desktop/zhuzhao/yolo/darknet/scripts/train.txt
valid =/home/whsyxt/Desktop/zhuzhao/yolo/darknet/scripts/kitti_list_file/test.txt
names = data/kitti.names
backup = /home/whsyxt/Desktop/zhuzhao/yolo/darknet/backup
同时设置data/kitti.names
Pedestrian
Car
第五步:修改.cfg文件[???????]
复制yolo3.cfg文件改名为yolov3-kitti.cfg文件cfg/yolov3-kitti.cfg
假设我们使用yolo_voc.cfg网络来进行训练,我们需要到darknet/cfg/文件夹下找到yolo_voc.cfg文件进行修改。当然,使用不同的网络,要修改对应的.cfg文件。
A.filters数目是怎么计算的:3x(classes数目+5),和聚类数目分布有关,论文中有说明;
B.如果想修改默认anchors数值,使用k-means即可;
C.如果显存很小,将random设置为0,关闭多尺度训练;
D.其他参数如何调整,有空再补;
E.前100次迭代loss较大,后面会很快收敛;
其它
learning_rate=0.001 ### 学习率
burn_in=1000 ### 学习率控制的参数
max_batches = 50200 ### 迭代次数
policy=steps ### 学习率策略
steps=40000,45000 ### 学习率变动步长
scales=.1,.1 ### 学习率变动因子
训练
下载权重:wget https://pjreddie.com/media/files/darknet53.conv.74
./darknet detector train cfg/kitti.data cfg/yolov3-kitti.cfg darknet53.conv.74
# 多个gpu
./darknet detector train cfg/kitti.data cfg/yolov3-kitti.cfg darknet53.conv.74 -gpus 0,1,2,3
# If you want to stop and restart training from a checkpoint:
./darknet detector train cfg/kitti.data cfg/yolov3-kitti.cfg backup/yolov3.backup -gpus 0,1,2,3
输出得到:
(3)bounding box正确,标签错乱,这里提供两种方案供选择。
A.不改源码,不用重新编译
修改coco.names中内容,为自己的检测目标类别
B.改源码,需要重新编译[ 先 make clean ,然后再 make]
原因是作者在代码中设置了默认,所以修改 examples/darknet.c文件,将箭头指示的文件替换成自己的。然后重新编译即可。
优点:速度快,精度提升,小目标检测有改善;
不足:中大目标有一定程度的削弱,遮挡漏检,速度稍慢于V2。