Ubuntu18.04配置darknet环境实现YOLOv4目标检测(二)——基于YOLOv4训练自己数据

目录

  • 1. 数据准备
    • 1.1 下载VOC数据
    • 1.2 生成数据标签
    • 1.3 下载预训练模型
  • 2. 训练数据
    • 2.1 准备cfg文件
    • 2.2 准备训练脚本文件sh
    • 2.3 Loss与mAP曲线
  • 3. 测试图片

  完成 darknet环境配置后,可以在darknet框架下进行目标检测数据训练,本文以VOC数据为例,进行介绍。

1. 数据准备

1.1 下载VOC数据

  参考https://pjreddie.com/darknet/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

1.2 生成数据标签

  将VOC数据集的xml文件里的标注转为darknet能够解析的txt文件,每个文件的格式如下:

    

  每行中分别对应目标的类别,ground truth框的横坐标中心坐标,纵坐标中心坐标,groundtruth框的宽度和groundtruth框的高度。

  使用scripts/文件夹下的voc_label.py文件可以将VOC标签转为YOLO标签,将voc_label.py文件拷到VOCdevkit/文件夹下,运行以下命令:

python voc_label.py

  完成运行后,输入ls,可以在终端中看到以下内容:

2007_test.txt   VOCdevkit
2007_train.txt  voc_label.py
2007_val.txt    VOCtest_06-Nov-2007.tar
2012_train.txt  VOCtrainval_06-Nov-2007.tar
2012_val.txt    VOCtrainval_11-May-2012.tar

  VOC训练需要将2007_train,2007_val,2012_train,2012_val四个数据集合并形成训练集,使用2007_test作为验证集。输入以下命令,将相应的数据集合并。

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

  最后修改cfg.data文件,配置VOC数据路径,classes数目必须要写对。

classes= 20
train  = /train.txt
valid  = 2007_test.txt
names = data/voc.names
backup = backup

1.3 下载预训练模型

1. 基于ImageNet预训练模型开始训练
  预训练模型下载位置在https://drive.google.com/open?id=1JKF-bdIklxOOVy-2Cr5qdvjgGpmGfcbp,完成预训练模型下载后,将yolov4.conv.137文件放在指定位置。

2. 基于COCO预训练模型开始训练
  如果基于作者开源的COCO预训练模型yolov4.weights开始训练,则需要对文件中的seen进行修改,修改之后才能基于该预训练模型进行训练,修改代码如下。

import numpy as np

# Read weights file
with open('weights/yolov4.weights', 'rb') as f:
    version = np.fromfile(f, dtype=np.int32, count=3)  # (int32) version info: major, minor, revision
    seen = np.fromfile(f, dtype=np.int64, count=1)  # (int64) number of images seen during training
    weights = np.fromfile(f, dtype=np.float32)  # the rest are weights
    seen = np.array([0])

# Write weights file
with open('darknet_yolov4.weights', 'wb') as f:
    version.tofile(f)  # (int32) version info: major, minor, revision
    seen.tofile(f)
    weights.tofile(f)

2. 训练数据

2.1 准备cfg文件

  修改cfg文件夹下的yolov4-custom.cfg文件名称为yolov4-voc.cfg,修改训练迭代步数:

max_batches = 50500
policy=steps
steps=40000,45000
scales=.1,.1

  将3个yolo层的classes的类别修改为20,yolo层前的convolutional层的filters数目为75, ( c l a s s e s + 5 ) × 3 (classes + 5) \times 3 (classes+5)×3

[convolutional]
size=1
stride=1
pad=1
filters=75
activation=linear


[yolo]
mask = 6,7,8
anchors = 12, 16, 19, 36, 40, 28, 36, 75, 76, 55, 72, 146, 142, 110, 192, 243, 459, 401
classes=20
num=9
jitter=.3
ignore_thresh = .7
truth_thresh = 1
random=1
scale_x_y = 1.05
iou_thresh=0.213
cls_normalizer=1.0
iou_normalizer=0.07
iou_loss=ciou
nms_kind=greedynms
beta_nms=0.6

2.2 准备训练脚本文件sh

  在终端中输入touch train.shgedit train.sh,编辑训练脚本文件,输入./darknet detector train data/voc.data cfg/yolov4-voc.cfg backup/yolov4.conv.137 -map,执行./train.sh即可开始训练。./darknet为编译好的可执行文件,detector表示执行目标检测任务,train表示执行训练任务,data/voc.datacfg/yolov4-voc.cfgbackup/yolov4.conv.137文件路径位置必须正确,-map表示可以在训练的同时,进行检测精度评估,每4个epoch评估一次。

2.3 Loss与mAP曲线

  完成训练后,在darknet文件夹中可以得到以下图片,图片显示训练存在过拟合情况,在迭代到10000多步时,在VOC数据集上的mAP达到了最高,之后虽然Loss一直在下降,但是mAP没有再提高,反而有所下降,在VOC数据集上的训练还需要进一步调参。经过voc_all_map.py的评估,YOLOv4在VOC数据集上的0.5:0.95mAP能够达到52.98,0.5mAP能够达到84.27,0.75mAP能够达到58.64。这个结果,比这篇文章介绍的https://blog.csdn.net/linghu8812/article/details/105708001faster_rcnn_R_50_FPN的mAP提高了不少。

Ubuntu18.04配置darknet环境实现YOLOv4目标检测(二)——基于YOLOv4训练自己数据_第1张图片
  下图是使用YOLOv3在VOC数据集上训练的结果,可以看到,在VOC数据集上YOLOv4的检测效果比YOLOv3提高了不少。

Ubuntu18.04配置darknet环境实现YOLOv4目标检测(二)——基于YOLOv4训练自己数据_第2张图片

3. 测试图片

  在终端中输入以下命令./darknet detector test cfg/voc.data cfg/yolov4-voc.cfg backup/yolov4-voc.weights -thresh 0.25 data/dog.jpg可以对单张图片进行测试,查看训练效果。cfg文件和weights文件可以在这里下载,提取码为ia4x。inference结果如下:

Ubuntu18.04配置darknet环境实现YOLOv4目标检测(二)——基于YOLOv4训练自己数据_第3张图片
  终端中输出的结果如下:

data/dog.jpg: Predicted in 14.562000 milli-seconds.
bicycle: 97%
dog: 94%
car: 99%

你可能感兴趣的:(YOLO,目标检测,深度学习)