YOLO v2 安装训练测试

    • 1.YOLO安装
    • 2. YOLO训练自己的数据集
      • 2.1数据集准备
      • 2.2修改配置文件
        • 2.2.1修改cfg/voc.data
        • 2.2.2修改data/voc.names
        • 2.2.3修改cfg/yolo-voc.cfg
        • 2.2.4下载预训练权重文件darknet19_448.conv.23
      • 2.3 训练
        • 2.3.1 训练中输出日志参数
    • 3. 测试
      • 3.1 单张图像测试
      • 3.2多张图像测试
      • 3.3 测试数据集测试mAP、recall等参数
      • 参考

1.YOLO安装

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

YOLO v2 安装训练测试_第1张图片
显示上边的图片的时候就是安装成功的,这时就可以进行训练。

2. YOLO训练自己的数据集

2.1数据集准备

首先将自己的数据集生成为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三个文件。到此,数据准备完成。

2.2修改配置文件

./darknet detector train cfg/voc.data cfg/yolo-voc.cfg darknet19_448.conv.23

上边是进行训练的命令,可以按照上边的命令对文件进行修改。

2.2.1修改cfg/voc.data

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

2.2.2修改data/voc.names

在上边修改的文件内有一个data/voc.names文件,里边保存目标分类的名称,修改为自己类别的名称即可。

2.2.3修改cfg/yolo-voc.cfg

第一处
文件开头的配置文件可以按照下边的说明进行修改

# 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    

2.2.4下载预训练权重文件darknet19_448.conv.23

wget https://pjreddie.com/media/files/darknet19_448.conv.23

完成上边文件的配置以后,就可以进行训练

2.3 训练

./darknet detector train cfg/voc.data cfg/yolo-voc.cfg darknet19_448.conv.23 >> log.txt

输入上边的指令就可以进行训练,在命令最后的命令>> log.txt是将输出的日志保存到log.txt文件内,这样便于后期训练结果的查看。

2.3.1 训练中输出日志参数

输出参数 说明
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下载,没有下载积分的可以去百度云

3. 测试

3.1 单张图像测试

./darknet detect cfg/yolo-voc.cfg backup/yolo-voc_final.weights data/dog.jpg
./darknet detect [训练cfg文件路径] [权重文件路径] [检测图片的路径]

按照上边的规整进行填写即可。

3.2多张图像测试

由于博主能力有限,修改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

修改相应自己存储图片的路径就可以进行测试 。

3.3 测试数据集测试mAP、recall等参数

./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 [GPUID号] -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网络中参数的解读

你可能感兴趣的:(深度实战)