按照官网上的教程一步一步走,后面有些许改动。
一、小试牛刀,熟悉darknet并做简单的测试
1.首先下载darknet并编译
git clone https://github.com/pjreddie/darknet
cd darknet
make
2.配置文件已经在cfg/中,需要下载预训练的权重文件
wget https://pjreddie.com/media/files/yolov3.weights
3.然后可以运行检测器
./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg
4.可以看到一些网络参数的输出和检测后的图片predictions.jpg,可以得到检测到的类别,置信度和检测时间,大概需要34s左右
5.第3条运行检测器的指令是简写版,完整版如下
./darknet detector test cfg/coco.data cfg/yolov3.cfg yolov3.weights data/dog.jpg
6.如果想对多张图片进行检测,省略data/dog.jpg,后面可以看到Enter Image Path,再输入图片路径,一次只能输入一张,但可以重复输入
7.改变检测器的阈值,默认yolo只输出置信度0.25以上的物体,可以改变其阈值,如果改为0则不输出任何东西
./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg -thresh 0.1
8.要是由于环境等限制,想调用yolov3-tiny,可以下载其权重
wget https://pjreddie.com/media/files/yolov3-tiny.weights
9.运行调用yolov3-tiny权重的检测器
./darknet detect cfg/yolov3-tiny.cfg yolov3-tiny.weights data/dog.jpg
二、用一个网络摄像头实时检测
尽管cudnn编译的问题已经解决了,但可能与opencv某些地方不兼容,或者是我的anaconda与opencv不兼容,opencv编译完成后仍然报错,可以改为cudnn=0,后面那些关于cudnn出错的操作可以略过。(非常重要)
1.用cuda进行编译,打开darknet里的Makefile,修改第1、2、24行保存后编译
GPU=1
CUDNN=0
NVCC=/usr/local/cuda-9.2/bin/nvcc #自己的cuda安装位置
修改完执行 make,
make
###设置cudnn=0时下面这些提示可忽略
提示:include/darknet.h:16:23: fatal error: cudnn.h: 没有那个文件或目录
compilation terminated.
是因为缺乏头文件cudnn.h,需要将其复制,
进入所在目录/home/jinhuan/anaconda3/envs/tf-gpu/include,在终端打开运行
sudo cp cudnn.h /usr/include
然后再 darknet 目录下执行 make,
make
提示
/usr/bin/ld: 找不到 -lcudnn
这是因为缺少库文件 libcudnn.so,
进入所在目录/home/jinhuan/anaconda3/envs/tf-gpu/lib,在终端打开运行
sudo cp libcudnn.so /usr/local/cuda-9.2/lib64
再在darknet目录下执行make,
make
没有错误,生成可执行程序darknet和库libdarknet.o和libdarknet.so,编译成功。
###
2.现在cuda可以使用了,用GPU速度会大大提高,只需0.15s左右(不太清楚为什么-i 0)
/darknet -i 0 detect cfg/yolov3.cfg yolov3.weights data/dog.jpg
3.如果由于某种原因不想用gpu,可以屏蔽
/darknet -nogpu detect cfg/yolov3.cfg yolov3.weights data/dog.jpg
4.用OPENCV进行编译(首先确保安装了opencv),打开darknet里的Makefile,修改第3行
OPENCV=1
修改第49行,改为
ifeq ($(GPU), 1)
COMMON+= -DGPU -I/usr/local/cuda/include/
CFLAGS+= -DGPU
LDFLAGS+= -L/usr/local/cuda-9.2/lib64 -lcuda -lcudart -lcublas -lcurand
endif
修改配置完成后,保存并执行
make -j12
./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights
三、在摄像头上进行实时检测
1.首先确保第二步已经完成,opencv与cuda已经安装成功,然后接入摄像头,运行
./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights
2.可以看到实时FPS与预测类别,但要注意摄像头的USB接口要保持稳定,不能动,否则程序容易崩溃。同样,可以在视频上运行
./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights
四、在VOC数据集上进行训练,COCO、Imagenet同理(VOC+yolov3)
如果想对yolov3用不同的方案、超参数、数据集来训练的话,可以对权重进行训练以微调。
1.获得VOC数据集(2007和2012)
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
2.为VOC数据集生成标签
darknet需要一个.txt文件,包括每个图像中每个物体的真实值,如
其中x,y为中心点坐标,width、height为矩形框宽度和高度,我们下载voc_label.py来生成这个文件
wget https://pjreddie.com/media/files/voc_label.py
python voc_label.py
它生成了很多labels文件,同时,你也能看到2007_test.txt、2007_train.txt、2007_val.txt、2012_train.txt、2012_val.txt,我们把后面4个文件放到1个.txt文件中去,运行
cat 2007_train.txt 2007_val.txt 2012_*.txt > train.txt
3.修改VOC数据的cfg配置文件
1 classes= 20
2 train = /train.txt
3 valid = 2007_test.txt
4 names = data/voc.names
5 backup = backup
打开voc.data文件,将
4.修改yolov3的cfg配置文件
[net]
# Testing
# batch=1
# subdivisions=1
# Training
batch=64
subdivisions=8
打开yolov3-voc.cfg,将testing下面两行batch和subdivisions注释掉,把training下面两行取消注释,如上图所示
5.下载预训练的卷积权重(darknet53)
wget https://pjreddie.com/media/files/darknet53.conv.74
6.训练模型
./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74
训练完的weights保存在backup文件夹下,如果不小心终止了训练,可以从保存的权重文件继续训练,如
./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg backup/yolov3.backup
如果想用多个gpu同时运算,可以
./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74 -gpus 0,1,2,3
7.训练yolov1、yolov2等其他网络以此类推,只不过需要下载不同的初始权重文件。
如yolov2
wget https://pjreddie.com/media/files/darknet19_448.conv.23
yolov1
wget http://pjreddie.com/media/files/extraction.conv.weights
8.在VOC数据集的2007_test.txt上检测准确率mAP
先新建一个results文件夹,或者make一下。
(1)批处理测试图片输出检测结果文本
./darknet detector valid cfg/voc.data cfg/yolov3-voc.cfg backup/yolov3-voc_final.weights -out ‘’
其中阈值thresh在validate_detector中默认是0.005,可以根据需要修改。
(2)在github网站上https://github.com/rbgirshick/py-faster-rcnn/tree/master/lib/datasets下载voc_eval.py文件。
(3)新建compute_mAP.py,写入以下内容,计算单个类别person的准确率,运行时只能用python2 compute_mAP.py,不然会报错,输出的最后一个值即为准确率。
from voc_eval import voc_eval
print voc_eval('/home/jinhuan/darknet/results/{}.txt',
'/home/jinhuan/darknet/Pascal_VOC_Data/VOCdevkit/VOC2007/Annotations/{}.xml',
'/home/jinhuan/darknet/Pascal_VOC_Data/VOCdevkit/VOC2007/ImageSets/Main/test.txt',
'person',
'.',)
(4)新建compute_all_mAP.py,写入以下内容,计算所有类别的准确率,运行时只能用python2 compute_all_mAP.py,不然会报错,更换数据集时删除。/voc_eval/annots.pkl。
from voc_eval import voc_eval
import os
#current_path = os.getcwd()
#results_path = current_path+"/results"
results_path='/home/jinhuan/darknet/results'
sub_files = os.listdir(results_path)
mAP = []
for i in range(len(sub_files)):
class_name = sub_files[i].split(".txt")[0]
rec, prec, ap = voc_eval('/home/jinhuan/darknet/results/{}.txt',
'/home/jinhuan/darknet/Pascal_VOC_Data/VOCdevkit/VOC2007/Annotations/{}.xml',
'/home/jinhuan/darknet/Pascal_VOC_Data/VOCdevkit/VOC2007/ImageSets/Main/test.txt', class_name, '.')
print("{} :\t {} ".format(class_name, ap))
mAP.append(ap)
mAP = tuple(mAP)
print("***************************")
print("mAP :\t {}".format( float( sum(mAP)/len(mAP)) ))
(5)计算recall
修改examples/detector.c下的validate_detector_recall函数,替换list *plist = get_paths("data/coco_val_5k.list");为
list *plist=get_paths("Pascal_VOC_Data/train.txt");自己的训练集文本,然后运行
./darknet detector recall cfg/voc.data cfg/yolov3-voc.cfg backup/yolov3-voc_final.weights
输出的最后一列为recall值。
9.VOC2012检测
(1)获取VOC2012-test测试集
wget http://pjreddie.com/media/files/VOC2012test.tar
(2)获得文件后,运行以下命令,生成voc.2012.test
tar xf 2012test.tar
cp VOCdevkit/VOC2012/ImageSets/Main/test.txt .
sed 's?^?'`pwd`'/VOCdevkit/VOC2012/JPEGImages/?; s?$?.jpg?' test.txt > voc.2012.test
(3)检测
检测时注意voc.data的test文件,cfg配置文件的training和testing,以及weights的路径
./darknet detector valid cfg/voc.data cfg/yolov3-voc.cfg backup/yolov3-voc_final.weights -out ‘’
未完待续,等我测试完VOC2012的准确率,再把过程补上。