YOLOv3、v2、v1之darknet安装与测试实战

                                         darknet安装与使用

按照官网上的教程一步一步走,后面有些许改动。

一、小试牛刀,熟悉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,修改第1224行保存后编译

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.olibdarknet.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的准确率,再把过程补上。

你可能感兴趣的:(人工智能,机器学习)