Darknet-YOLOv3 部署测试笔记

1. 安装部署

安装部署在Linux环境,windows环境安装部署见参考1

git clone https://github.com/pjreddie/darknet
cd darknet
make -j $(nproc)

获取已经训练好的权值:

wget https://pjreddie.com/media/files/yolov3.weights

2. 检测示例

2.1 检测图片

1) 检测一张图片:
    ./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg
    ./darknet detector test cfg/coco.data cfg/yolov3.cfg yolov3.weights data/dog.jpg
2) 检测多张图片:
    ./darknet detect cfg/yolov3.cfg yolov3.weights
    接下来需要手动输入图片路径
4)  设置检测时的阈值
    ./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg -thresh 0

Darknet会输出检测的目标,对应的置信度和所用的时间。
因为Darknet编译的时候没有使用OpenCV,所以没法直接可视化展示检测结果,结果会保存在 predictions.png。
在CPU上处理每张图片大约需要6-12秒(官网上写的,怀疑怎么会这么慢

2.2 检测视频

1) 使用摄像头检测,使用 -c <num> 可以更改不同的摄像头。
    ./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights
2)检测离线视频
    ./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights <video file>

3. 训练YOLO - 使用PASCAL数据集

3.1 获取Pascal VOC 数据

wget https://pjreddie.com/media/files/VOCtrainval_11-May-2012.tar
wget https://pjreddie.com/media/files/VOCtrainval_06-Nov-2007.tar
wget https://pjreddie.com/media/files/VOCtest_06-Nov-2007.tar
tar xf VOCtrainval_11-May-2012.tar
tar xf VOCtrainval_06-Nov-2007.tar
tar xf VOCtest_06-Nov-2007.tar

解压后,将会得到一个VOCdevkit/文件夹

3.2 生成VOC格式的标签

darknet 需要的数据格式,是每张图片对应一个txt,内容如下:

<object-class> <x> <y> <width> <height>

其中x,y,width,height是相对于图像width和height 的值。 可以使用scripts/voc_label.py脚本进行生成。

wget https://pjreddie.com/media/files/voc_label.py
python voc_label.py

执行完上面脚本,标签文件会生成在VOCdevkit/VOC2007/labels/和VOCdevkit/VOC2012/labels/ 下:

ls
2007_test.txt   VOCdevkit
2007_train.txt  voc_label.py
2007_val.txt    VOCtest_06-Nov-2007.tar
2012_train.txt  VOCtrainval_06-Nov-2007.tar
2012_val.txt    VOCtrainval_11-May-2012.tar

把2007数据和2012数据合并到一起

cat 2007_train.txt 2007_val.txt 2012_*.txt > train.txt

3.3 修改训练的配置文件 cfg/voc.data

1 classes= 20
  2 train  = <path-to-voc>/train.txt
  3 valid  = <path-to-voc>2007_test.txt
  4 names = data/voc.names
  5 backup = backup

3.4 修改训练的配置文件 cfg/yolov3.cfg

filters=(classes+5)x3
    如classes=1 时,filters=18
    classes=2 时,filters=21
    classes=80 时,filters=255

3.5 修改训练的配置文件 data/voc.names

修改成自己想要训练的类别,每一类占一行

3.6 下载预训练的卷积权值

在ImageNet上预训练的网络模型:

wget https://pjreddie.com/media/files/darknet53.conv.74

3.7 开始训练模型

./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74

# 训练时将控制台中的输出内容存储到.log文件中
./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74 2>&1 | tee xxx.log

# 多GPU训练,并且续训练
./darknet detector train -gpus 0,1,2,3 cfg/voc.data cfg/yolov3-voc.cfg xxx.backup 2>&1 | tee xxx.log

4. 验证测试模型

验证模型并计算AP值

./darknet detector valid cfg/voc.data cfg/yolov3-voc.cfg backup/VOC/yolov3-voc_final.weights -out "" -gpu 0 -thresh .5

注意:-out “” 双引号其实可以加内容的,但建议初次使用时不要加自定义内容,网上很多教程都加了,其实一点用都没有。之后可以再慢慢探索。 运行结束后,在results文件夹下每个类别会对应生成一个.txt文件。然后见参考2。

生成预测结果

./darknet detector valid <data_cfg> <test_cfg> <weights> <out_file>

<test_cfg> 文件中batch和subdivisions两项必须为1。 结果生成在 <data_cfg> 的results指定的目录下以 <out_file> 开头的若干文件中,若 <data_cfg> 没有指定results,那么默认为 <darknet_root> /results。

计算recall

./darknet detector recall <data_cfg> <test_cfg> <weights>

<test_cfg>文件中batch和subdivisions两项必须为1。 输出在stderr里,重定向时请注意。 RPs/Img、IOU、Recall都是到当前测试图片的均值。 detector.c中对目录处理有错误,可以参照validate_detector对validate_detector_recall最开始几行的处理进行修改。

参考

  1. Yolo-v3 and Yolo-v2 for Windows and Linux
  2. YOLOv3 mAP计算教程