[Entrenamiento del modelo] Ubuntu compila el entrenamiento de Darknet y YOLO

欢迎关注我的公众号 [极智视界],回复001获取Google编程规范

O_o>_<   o_OO_o~_~o_O

  Hola a todos, soy Jizhi Vision. Este artículo presenta el método de compilación de entrenamiento darknet y yolo en ubuntu.

1. Compilar red oscura

1.1 Compilar opencv

   No diré mucho sobre la instalación de cuda y cudnn. Para la compilación de opencv, consulte el " [Experiencia compartida] x86, aarch64, método de compilación cruzada/compilación cruzada del entorno arm32 de opencv " que escribí antes, que registros en x86, aarch64 y arm32 El método de compilación de opencv en la plataforma es conciso y efectivo.

1.2 Compilar red oscura

   clonar código fuente:

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

cd darknet
复制代码

   Modifique el Makefile para abrir gpu, opencv y openmp:

GPU=1
CUDNN=1
CUDNN_HALF=1
OPENCV=1
AVX=0
OPENMP=1
LIBSO=1
ZED_CAMERA=0
ZED_CAMERA_v2_8=0
复制代码

   Entonces comienza a compilar, es muy simple:

make -j32
复制代码

   Después de eso, verifique que la instalación haya sido exitosa:

./darknet detect cfg/yolov3.cfg cfg/yolov3.weights data/dog.jpg
复制代码

   Por supuesto, usted mismo debe descargar y enviar yolov3.weights: pjreddie.com/media/files…

   Después de que la operación sea exitosa, se generará un mapa de detección muy clásico predicciones.jpg en el <darknet-path>directorio :

2. Yolo entrenando

2.1 Crear un conjunto de datos de VOC

  Puede crear su propio conjunto de datos en formato VOC o puede entrenar directamente con datos VOC.

  Para saber cómo crear datos en formato VOC, puede consultar mi artículo: " [Experiencia compartida] Producción de conjuntos de datos en formato VOC de detección de objetivos ", que se describe con más detalle.

2.2 Entrenamiento Yolo

   Una vez que tenga el conjunto de datos, puede comenzar un agradable viaje de alquimia con el archivo de estructura del modelo y los pesos previos al entrenamiento. De hecho, se han proporcionado muchos archivos de estructura de modelo en la carpeta cfg, como yolov3.cfg, yolov3-tiny.cfg, yolov4.cfg, yolov4-tiny.cfg, etc. pesas de entrenamiento, tales como:

   接下来我们以 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 的方法,希望我的分享能对你的学习有一点帮助。


[Transmisión de cuenta oficial] " [Entrenamiento de modelos] Ubuntu compila entrenamiento de Darknet y YOLO "

Supongo que te gusta

Origin juejin.im/post/7036317084363522078
Recomendado
Clasificación