项目源代码在github上下载,网址为: pjreddie/darknet
系统:ubuntu
首先创建并激活环境
conda create -n yolo-darknet
conda activate yolo-darknet
安装框架
cd darknet-master
make
安装完成之后测试
./darknet
测试结果为:
usage: ./darknet <function>
使用YOLO提供的模型利用darknet进行预测,在官网地址下载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%
配置GPU
程序跑通之后,需要了解一些基本的配置
打开makefile可以看到如下内容
GPU=0
CUDNN=0
OPENCV=0
OPENMP=0
DEBUG=0
......
刚刚使用CPU检测了一张图片,如果你安装好了CUDA,那么现在可以使用GPU来识别。将makefile中的GPU=0修改为
GPU=1
即可,默认是使用第一块显卡(卡槽序号0)。然后再次在项目的根目录打开终端使用
make
重复试验预测命令,就会发现预测速度大大提高。
运行之后会出现的错误:
darknet: ./src/cuda.c:36: check_error: Assertion `0' failed.
将根目录下的cfg文件中yolov3.cfg中的
batch=64
subdivisions=16
改为
batch=16
subdivisions=8
对YOLO训练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/目录。
运行官方提供的脚本生成指定格式的label文件
wget https://pjreddie.com/media/files/voc_label.py
python voc_label.py
运行完成之后根目录下会出现以下几个文件
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
即将所有2007年和2012年的训练时间定为一个大清单,就是我们训练时所需的数据。
修改训练的配置和下载预训练的权重
打开cfg/voc.data文件修改训练集和测试集文件的路径(用放置VOC数据的目录替换)
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
训练VOC模型指令
./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74
运行一短时间后报错
Resizing
448
CUDA Error: out of memory
darknet: ./src/cuda.c:36: check_error: Assertion `0' failed.
我在解决此问题时有两个步骤,首先使用
watch -n 10 nvidia-smi
实时查看GPU占用情况,是否有大量占用GPU的程序在运行,使用指令
kill -9 PID
强行关闭大量占用GPU的程序
然后再次运行训练VOC模型指令,如果还是报错,则修改/home/alex/darknet-master/cfg/yolov3.cfg下yolov3-voc.cfg文件中前几行
[net]
# Testing
#batch=1
#subdivisions=1
# Training
batch=64
subdivisions=16
subdivision:这个参数的意思是让你的每一个batch不是一下子都丢到网络里。而是分成subdivision对应数字的份数,一份一份的跑完后,在一起打包算作完成一次iteration。这样会降低对显存的占用情况。如果设置这个参数为1的话就是一次性把所有batch的图片都丢到网络里,如果为2的话就是一次丢一半。
经过四天左右的训练时间训练完成,显示结果如下图:
此文章参考了多个博客,仅作学习记录,每天进步一点点