关于人工智能:模型训练ubuntu-编译-Darknet-与-YOLO-训练

51次阅读

共计 3740 个字符,预计需要花费 10 分钟才能阅读完成。

欢送关注我的公众号 [极智视界],回复 001 获取 Google 编程标准

O_o>_<   o_OO_o~_~o_O

  大家好,我是极智视界,本文介绍了在 ubuntu 上编译 darknet 及 yolo 训练的办法。

1、编译 darknet

1.1 编译 opencv

   对于 cuda 及 cudnn 的装置就不多说了,对于 opencv 的编译能够参考我之前写的《【教训分享】x86、aarch64、arm32 环境编译 / 穿插编译 opencv 办法》,外面记录了在 x86、aarch64 及 arm32 平台上编译 opencv 的办法,简洁无效。

1.2 编译 darknet

   clone 源码:

git clone https://github.com/AlexeyAB/darknet.git

cd darknet

   批改 Makefile,关上 gpu、opencv、openmp:

GPU=1
CUDNN=1
CUDNN_HALF=1
OPENCV=1
AVX=0
OPENMP=1
LIBSO=1
ZED_CAMERA=0
ZED_CAMERA_v2_8=0

   而后开始编译,很简略:

make -j32

   完了验证一下是否装置胜利:

./darknet detect cfg/yolov3.cfg cfg/yolov3.weights data/dog.jpg

   当然 yolov3.weights 须要本人下载,传送:https://pjreddie.com/media/fi…

   运行胜利后,会在 <darknet-path> 目录下生成一张很经典的检测图 predictions.jpg:

2、Yolo 训练

2.1 制作 VOC 数据集

  能够制作 VOC 格局的本人的数据集,也能够间接用 VOC 的数据进行训练。

  对于 VOC 格局数据怎么制作的,能够参考我的这篇:《【教训分享】指标检测 VOC 格局数据集制作》,外面介绍的比拟具体了。

2.2 Yolo 训练

   在有了数据集后,而后搞来模型构造文件和预训练权重就能够开启欢快的炼丹之旅。在 cfg 文件夹里其实曾经提供了很多的模型构造文件,如 yolov3.cfg、yolov3-tiny.cfg、yolov4.cfg、yolov4-tiny.cfg 等,你只须要找到相应的预训练权重就行了,如:

  • yolov3.cfg —> darknet53.conv.74 传送:https://pjreddie.com/media/fi…
  • yolov3-tiny.cfg —> yolov3-tiny.conv.11 传送:https://drive.google.com/file…
  • yolov4-tiny.cfg —> yolov4-tiny.conv.29 传送:https://github.com/AlexeyAB/d…
  • yolov4.cfg —> yolov4.conv.137 传送:https://drive.google.com/open…

   接下来咱们以 yolov4 为例,开启咱们欢快的训练之旅吧。

   我这里是非桌面环境,所以加了 -dont_show 传参。

./darknet detector train cfg/voc.data cfg/yolov4.cfg yolov4.conv.137 -dont_show

  来看以上命令,./darknet detector train 是固定的,其余:

  • cfg/voc.data:传训练数据;
  • cfg/yolov4.cfg:传训练模型构造;
  • yolov4.conv.137:传预训练权重

  以上执行训练的命令非常清晰,来看一下 voc.data:

classes= 20                                        # 指标检测类别数
train  = /home/pjreddie/data/voc/train.txt         # 训练数据集
valid  = /home/pjreddie/data/voc/test.txt          # 测试数据集
names = data/voc.names                             # 类别名称
backup = /home/pjreddie/backup/                    # 训练过程两头权重备份目录 

  在 .cfg 中咱们也能够针对本人的训练状况做一些改变,次要是 [net] 内的一些参数:

[net]
batch=64                  # batch 设置
subdivisions=32           # 每次传进 batch/subdivision 的数据,若 gpu 显存不够用,把这个参增大
# Training
width=608                 # 图片宽
height=608                # 图片高
channels=3                # 通道数
momentum=0.949            # 动量,影响梯度降落到最优值得速度
decay=0.0005              # 权重衰减正则项,用于避免过拟合
angle=0                   # 通过旋转角度增多训练样本
saturation = 1.5          # 通过调整图片饱和度来增多训练样本
exposure = 1.5            # 通过调整曝光度来增多训练样本
hue=.1                    # 通过调整色调来增多训练样本

learning_rate=0.0013      # 学习率,这个参数比拟重要,决定训练收敛快慢及是否能达到好的成果
burn_in=1000              # 学习率设置相干,当小于该参时更新有一种形式,大于该参时采纳 policy 更新形式
max_batches = 500500      # 训练批次到这个参的时候进行训练
policy=steps              # 学习率调整策略
steps=400000,450000       # step 和 scales 是配合应用,这里的意思到 400000 和 450000 的时候学习率别离衰减 10 倍,因为前面缓缓收敛了
scales=.1,.1

#cutmix=1                 # cutmix 变换,是数据加强的一种形式
mosaic=1                  # mosaic 变换,是数据加强的一种形式 

  除了这些外,如果你是训练本人的数据集,检测的类别数就不肯定是官网给的 20 了,所以对于 yolo 层也须要做一些批改,拿其中一个 yolo 层来说:

...
[convolutional]
size=1
stride=1
pad=1
filters=75          # filters = 3*(classes+5),这个须要依据你的 classes 数目进行相应批改
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
max_delta=5

   yolo 层中的 anchors 对于不同的检测工作也须要做肯定的批改,比方检测人,锚框就须要瘦高型的,如检测车,可能更偏向于窄宽型的锚框,而后像一些置信度阈值、nms 阈值等参数也须要训练的时候做一些调参。

   而后解释一下为什么须要批改 yolo 上一层卷积的 filters,这个我在这篇《【教训分享】分析 darknet entry_index 指针偏移逻辑》有做过肯定的剖析,须要从 yolo 层的数据排布来说:

(1)数据按四维 [N, C, H, W] 来说,N 为 batch,C 为 3 * (5 + classes)、H / W 为 feature_map 高和宽。须要解释一下 C,C = 3 * (1 + 4 + classes),其中 1 示意置信度,4 为检测框地位信息,classes 为类别数,即每个类别给出一个检测得分,乘 3 示意每个格子有 3 个锚框。这样就造成了 yolo 层承受的四维数据排布,也就是 yolo 上一层的输入数据排布;

(2)至于 yolo 层的输入,darknet 里会用一维动静数组来寄存 yolo 层的数据,这里就波及到怎么将四维数据转换为一维数据的问题。darknet 里是这么做的,假如四维数据为 [N, C, H, W],每个维度对应的索引为 [n, c, h, w],那么开展就是 n*C*H*W + c*H*W + h*W + w,按这样的逻辑寄存到 *output 中。

   这样回过头来看应该比拟好了解为什么 yolo 上一层卷积的 filters 为 3 * (classes + 5) 了。

  好了,接下来咱们开始训练吧,还是执行:

./darknet detector train cfg/voc.data cfg/yolov4.cfg yolov4.conv.137 -dont_show

  如果须要保留训练日志,能够这么做:

./darknet detector train cfg/voc.data cfg/yolov4l.cfg yolov4.conv.137 2>1 | tee visualization/train_yolov4.log

   控制台会输入训练日志:

  等训练完就会在 backup = /home/pjreddie/backup/ 保留训练失去的最终及两头权重文件。如果成果称心的话就能够拿去部署,对于指标检测来说,掂量成果怎么样的指标个别就是 map 了。

   好了,以上分享了 ubuntu 上编译 darknet 以及训练 yolo 的办法,心愿我的分享能对你的学习有一点帮忙。


【公众号传送】
《【模型训练】ubuntu 编译 Darknet 与 YOLO 训练》

正文完
 0