git clone https://github.com/pjreddie/darknet
直接使用上边的命令下载YOLO安装包。下载完以后,打开进入到安装包路径内
cd darknet
如果机器有使用GPU加速的环境,以及安装OPENCV了,需要做一下修改
gedit Makefile
使用gedit打开编译文件,将文件前几行中,对应的GPU、CUDNN、OPENCV由0变为1;
GPU=1
CUDNN=1
OPENCV=1
对Makefile修改结束以后,就可以进行安装。
make -j
接着对文件进行编译,下载之前训练好的权重来测试安装的是否成功
wget https://pjreddie.com/media/files/yolo.weights
./darknet detect cfg/yolo.cfg yolo.weights data/dog.jpg
首先将自己的数据集生成为VOC数据集的格式,至少生成如下格式的文件夹
Annotations
ImageSets
--Main
--test.txt
--train.txt
--trainval.txt
--val.txt
JPEGImages
接着将上边四个文件夹放在/darknet/scripts/VOCdevkit/VOC2007
内,这个文件夹需要自己来创建一个。接着对/darknet/scripts/voc_label.py
进行修改。
第一处
修改第7行
sets=[('2012', 'train'), ('2012', 'val'), ('2007', 'train'), ('2007', 'val'), ('2007', 'test')]
将“(‘2012’, ‘train’), (‘2012’, ‘val’),”删除掉,改为
sets=[('2007', 'train'), ('2007', 'val'), ('2007', 'test')]
第二处
修改第9行
classes = ["aeroplane", "bicycle", "bird", "boat", "bottle", "bus", "car", "cat", "chair", "cow", "diningtable", "dog", "horse", "motorbike", "person", "pottedplant", "sheep", "sofa", "train", "tvmonitor"]
修改为自己检测目标类别名称
完成修改以后可运行文件,生成YOLO训练时使用的labels
python voc_label.py
运行结束以后,可以在/darknet/scripts/VOCdevkit/VOC2007
文件夹内看到labels
文件夹,并且在/darknet/scripts
文件夹内会生成2007_train.txt、2007_test.txt、2007_val.txt
三个文件。到此,数据准备完成。
./darknet detector train cfg/voc.data cfg/yolo-voc.cfg darknet19_448.conv.23
上边是进行训练的命令,可以按照上边的命令对文件进行修改。
classes= 3 //修改为训练分类的个数
train = /home/ws/darknet/scripts/2007_train.txt //修改为数据阶段生成的2007_train.txt文件路径
valid = /home/ws/darknet/scripts/2007_val.txt //修改为数据阶段生成的2007_val.txt文件路径
names = data/voc.names
backup = backup
在上边修改的文件内有一个data/voc.names
文件,里边保存目标分类的名称,修改为自己类别的名称即可。
第一处
文件开头的配置文件可以按照下边的说明进行修改
# Testing
#batch=1
#subdivisions=1
# Training
batch=64 //每次迭代要进行训练的图片数量 ,在一定范围内,一般来说Batch_Size越大,其确定的下降方向越准,引起的训练震荡越小。
subdivisions=8 //源码中的图片数量int imgs = net.batch * net.subdivisions * ngpus,按subdivisions大小分批进行训练
height=416 //输入图片高度,YOLO官网显示最高的为608
width=416 //输入图片宽度
channels=3 //输入图片通道数
momentum=0.9 //冲量
decay=0.0005 //权值衰减
angle=0 //图片角度变化,单位为度,假如angle=5,就是生成新图片的时候随机旋转-5~5度
saturation = 1.5 //饱和度变化大小
exposure = 1.5 //曝光变化大小
hue=.1 //色调变化范围,tiny-yolo-voc.cfg中-0.1~0.1
learning_rate=0.001 //学习率
burn_in=1000
max_batches = 120200 //训练次数
policy=steps //调整学习率的策略
steps=40000,80000 //根据batch_num调整学习率,若steps=100,25000,35000,则在迭代100次,25000次,35000次时学习率发生变化,该参数与policy中的steps对应
scales=.1,.1 //相对于当前学习率的变化比率,累计相乘,与steps中的参数个数保持一致;
注意:如果修改max_batches
总的训练次数,也需要对应修改steps
,适当调整学习率。
具体的含义可以查看YOLO网络中参数的解读
第二处
修改107行最后一个卷积层中filters
,按照filter=5*(classes+5)来进行修改。如果类目为3,则为5*(3+5)=40。
[convolutional]
size=1
stride=1
pad=1
filters=40 //计算公式为:filter=5*(classes+5)
activation=linear
第三处
修改类别数,直接搜索关键词“classes”即可,全文就一个。
classes=3
wget https://pjreddie.com/media/files/darknet19_448.conv.23
完成上边文件的配置以后,就可以进行训练
./darknet detector train cfg/voc.data cfg/yolo-voc.cfg darknet19_448.conv.23 >> log.txt
输入上边的指令就可以进行训练,在命令最后的命令>> log.txt
是将输出的日志保存到log.txt文件内,这样便于后期训练结果的查看。
输出参数 | 说明 |
---|---|
Region Avg IOU | 平均的IOU,代表预测的bounding box和ground truth的交集与并集之比,期望该值趋近于1。 |
Class | 是标注物体的概率,期望该值趋近于1. |
Obj | 期望该值趋近于1. |
No Obj | 期望该值越来越小但不为零. |
Avg Recall | 期望该值趋近1 |
avg | 平均损失,期望该值趋近于0 |
rate | 当前学习率 |
Obj | True Pos的平均置信度 |
No Obj | False Pos 的平均置信度 |
根据上边的训练参数编写程序,可以将损失函数、IOU等可视化,方便查看训练是否收敛。可以去CSDN下载,没有下载积分的可以去百度云
./darknet detect cfg/yolo-voc.cfg backup/yolo-voc_final.weights data/dog.jpg
./darknet detect [训练cfg文件路径] [权重文件路径] [检测图片的路径]
按照上边的规整进行填写即可。
由于博主能力有限,修改YOLO内部文件失败,只能使用shell写命令来进行重复单张测试的命令
input_data_folder="./data/VOCdevkit/VOC2007/JPEGImages/"
output_data_folder="./results/CD8"
file_name_tmp=`ls $input_data_folder`
file_names=($(echo $file_name_tmp));
for filename in ${file_names[@]}
do
echo "testing $file ..."
./darknet detector test cfg/inst25.data cfg/yolo-voc.cfg backup/yolo-voc_final.weights $input_data_folder$filename -thresh .3 -gpu 0,1 >> result.txt
mv predictions.png ./results/CD8_final_thresh_0.3/$filename'.png'
done
修改相应自己存储图片的路径就可以进行测试 。
./darknet detector valid cfg/voc.data cfg/voc.cfg backup/voc_final.weights -out result_ -gpu 0 -thresh .5
./darknet detector valid [data路径] [cfg路径] [权重文件路径] -out [生成txt文件前缀] -gpu [GPU的ID号] -thresh [门限的大小]
按照上边的规则对测试数据集进行测试,会在result
文件夹内生成相应的相应检测结果的文件。
下边借助Faster R-CNN中voc_eval.py文件进行参数测试。
from voc_eval import voc_eval
rec, prec, ap, fp, tp, nobj = voc_eval('/home/app/darknet/results/result_ {}.txt', '/home/app/darknet/scripts/VOCdevkit/VOC2007/Annotations/{}.xml',
'/home/app/darknet/scripts/VOCdevkit/VOC2007/ImageSets/Main/test.txt', 'Target1', '.')
print("class name: " + classname)
print("Average Precision: " + str(ap))
print("True Positive: " + str(tp))
print("False Positive: " + str(fp))
首先将上边的命令新建一个python文件,同时将Faster R-CNN中voc_eval.py文件放在一个文件夹内,这个文件可以能在Github中不能找到,可以去CSDN下载,没有下载积分的可以去百度云下载。
YOLO模型训练可视化训练过程中的中间参数
YOLO网络中参数的解读