Darknet是Joseph维护的开源的神经网络框架,使用C语言编写。
官网地址
Darknet快速,易于安装,同时支持CPU和GPU计算。
项目源码可以在github pjreddie/darknet 看到。
git clone https://github.com/pjreddie/darknet.git
# 以上是官方推荐的方式。有的同学在编译过程中会出错,这时可以直接在GitHub中使用http协议下载最新版本。
cd darknet
make
注意了,以上步骤在Linux系统上可能很轻松就完成了,但是在windowns上可得费点力气。
这里建议在win上安装俗称Linux子系统的cygwin软件,用于运行在Linux上使用的一些命令。
具体步骤可以参考如何在windowns上使用make等Unix系命令?教你安装cygwin
安装好之后就可以运行如下命令测试了
./darknet
得到的结果为
$ ./darknet
usage: ./darknet
我们这里先跳到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%
类别标签后的百分数代表预测的置信度,从结果看置信度都比较高。
默认情况,YOLO只会把置信度超过0.25的对象定位出来,你可以修改这一阈值。
执行命令的时候指定-thresh
参数即可:
./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg -thresh 0
上面的设置是:即使置信度是0也将目标显示定位出来
程序跑通之后,需要了解一些基本的配置
打开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
这里可以探索一下如何使用YOLO训练其他数据集
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/
目录
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代表图片的相对位置和高宽。
根目录下面则多了几个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
打开cfg/voc.data文件修改训练集和测试集文件的路径
1 classes= 20
2 train = /train.txt
3 valid = 2007_test.txt
4 names = data/voc.names
5 backup = backup
然后下载预训练权重
wget https://pjreddie.com/media/files/darknet53.conv.74
./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74
参考:https://blog.csdn.net/qq_33485434/article/details/80432054
我这里把yolov3.cfg文件中的subdivisions=16改成subdivisions=64之后就OK了
参考:https://blog.csdn.net/lumingha/article/details/81781923
注意各个配置文件修改为UNIX格式