Darknet+YOLO的安装和测试指南

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_39198406/article/details/83020632

Darknet是Joseph维护的开源的神经网络框架,使用C语言编写。
官网地址
Darknet快速,易于安装,同时支持CPU和GPU计算。
项目源码可以在github pjreddie/darknet 看到。

1 初步使用darknet进行预测

1.1 安装框架

git clone https://github.com/pjreddie/darknet.git
# 以上是官方推荐的方式。有的同学在编译过程中会出错,这时可以直接在GitHub中使用http协议下载最新版本。
cd darknet
make

注意了,以上步骤在Linux系统上可能很轻松就完成了,但是在windowns上可得费点力气。
这里建议在win上安装俗称Linux子系统的cygwin软件,用于运行在Linux上使用的一些命令。
具体步骤可以参考如何在windowns上使用make等Unix系命令?教你安装cygwin

make完成后应该得到如下的文件结构
make之后的文件结构如下

1.2 测试

安装好之后就可以运行如下命令测试了

./darknet

得到的结果为

$ ./darknet
usage: ./darknet <function>

我们这里先跳到YOLO部分,使用YOLO提供的模型利用darknet进行预测
在如下地址下载yolov3.weights的权重文件(模型)

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

执行如下命令

./darknet detect cfg/yolov3.cfg yolov3.weights data/person.jpg

执行命令可能需要一小会
person.jpg是darknet/data/person.jpg目录下的一张图片,识别成功的话应该是下边右图中的效果。这张图的位置在darknet/predictions.jpg
识别测试
识别的过程中会打印出如下的log

  ......
  106 yolo
Loading weights from yolov3.weights...Done!
data/person.jpg: Predicted in 22.345468 seconds.
horse: 100%
person: 100%
dog: 99%

类别标签后的百分数代表预测的置信度,从结果看置信度都比较高。

1.3 改变检测阈值

默认情况,YOLO只会把置信度超过0.25的对象定位出来,你可以修改这一阈值。
执行命令的时候指定-thresh参数即可:

./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg -thresh 0

上面的设置是:即使置信度是0也将目标显示定位出来

扫描二维码关注公众号,回复: 3934442 查看本文章

1.4 配置GPU

程序跑通之后,需要了解一些基本的配置
打开makefile可以看到如下内容

GPU=0
CUDNN=0
OPENCV=0
OPENMP=0
DEBUG=0
......

刚刚我们花了一小会使用CPU识别了一张图片,如果你安装好了CUDA,那么现在可以使用GPU来识别。
将makefile中的GPU=0修改为GPU=1即可,默认是使用第一块显卡(卡槽序号0)。
然后再次在项目的根目录使用make,重复试验预测命令,就会发现预测速度大大提高。

如果想要指定使用哪块显卡,你可以在命令行中附加参数-i用阿里指定你想使用的显卡序号,例如:

./darknet -i 1 imagenet test cfg/alexnet.cfg alexnet.weights

你也可以使用CUDA进行编译,使用CPU进行计算,使用-nogpu参数即可:

./darknet -nogpu imagenet test cfg/alexnet.cfg alexnet.weights

2 对YOLO训练VOC数据集

这里可以探索一下如何使用YOLO训练其他数据集

2.1 下载数据

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/目录

2.2 生成VOC数据集的标签

VOCdevkit的目录结构大致如下

VOCdevkit--VOC2007--Annotations: 若干xml文件,包含图片名称和box的大小和位置,是样本的标签
                  				    --ImageSets
                  				    --JPEGImage: 若干图片文件,样本
                  				    --SegmentationClass
                  				    --SegmentationObject
                  --VOC2012--Annotations
                  				    --ImageSets
                  				    --JPEGImage
                  				    --SegmentationClass
                  				    --SegmentationObject

xml文件作为标签是很繁琐和复杂的。
下面运行官方提供的脚本生成指定格式的label文件

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

根据每张图片对应的xml文件,会分别在VOCdevkit/VOC2007/labels/VOCdevkit/VOC2012/labels/位置生成对应于每张图片的.txt文件,作为图片的标签,例如

16 0.437 0.764 0.446 0.466666666667
# 符合如下形式
<object-class> <x> <y> <width> <height>

object-class代表类别,x\y\width\height代表图片的相对位置和高宽。
根目录下面则多了几个txt文件:

2007_test.txt
2007_train.txt
2007_val.txt 
2012_train.txt
2012_val.txt 

这些txt文件汇总了所需训练或者验证的图片的绝对路径,后面训练的时候需要用到
合并这些训练集:

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

2.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

然后下载预训练权重

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

2.4 训练VOC模型

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

3 问题追踪

3.1 训练和使用yolo时出现CUDA Error: out of memory问题

参考:https://blog.csdn.net/qq_33485434/article/details/80432054
我这里把yolov3.cfg文件中的subdivisions=16改成subdivisions=64之后就OK了

3.2 can’t open file :train.txt 和can’t load image的问题

参考:https://blog.csdn.net/lumingha/article/details/81781923
注意各个配置文件修改为UNIX格式

猜你喜欢

转载自blog.csdn.net/weixin_39198406/article/details/83020632