极智AI | ubuntu编译Darknet与YOLO训练

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

大家好,我是极智视界,本文介绍了在 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/files/yolov3.weights

运行成功后,会在 <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 等,你只需要找到相应的预训练权重就行了,如:

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


logo_show.gif


相关文章
|
2月前
|
机器学习/深度学习 人工智能 算法
AI加速引擎PAI-TorchAcc:OLMo训练加速最佳实践
阿里云机器学习平台PAI开发的Pytorch训练加速框架PAI-TorchAcc已接入最新开源的大语言模型 OLMo。在保证模型效果和易用性的前提下,PAI-TorchAcc相对 PyTorch 性能在 OLMo 1B 上加速比达到 1.64X,在 OLMo 7B 上加速比达到 1.52X。本文分析了 PAI-TorchAcc 的性能收益来源。
|
4月前
|
人工智能 物联网 PyTorch
SCEdit:轻量级高效可控的AI图像生成微调框架(附魔搭社区训练实践教程)
SCEdit是一个高效的生成式微调框架,由阿里巴巴通义实验室基础视觉智能团队所提出。
|
4月前
|
机器学习/深度学习 人工智能 自然语言处理
人工智能(AI)之计算机视觉和自然语言训练文件
人工智能(AI)之计算机视觉和自然语言训练文件
45 0
|
4月前
|
Ubuntu 固态存储 算法框架/工具
ubuntu下编译ssd-caffe遇到的问题汇总
ubuntu下编译ssd-caffe遇到的问题汇总
|
2月前
|
人工智能 自动驾驶 算法
只要千元级,人人可用百亿级多模态大模型!国产“AI模盒”秒级训练推理
云天励飞,中国AI独角兽,发布“AI模盒”,以千元成本实现多模态大模型的秒级训练推理,降低AI应用门槛。该产品凸显了公司在技术创新与普及中的努力,旨在构建智能城市并重塑日常生活,同时也面临数据安全、隐私保护及人才挑战。
27 3
只要千元级,人人可用百亿级多模态大模型!国产“AI模盒”秒级训练推理
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
大模型落地实战指南:从选择到训练,深度解析显卡选型、模型训练技、模型选择巧及AI未来展望---打造AI应用新篇章
大模型落地实战指南:从选择到训练,深度解析显卡选型、模型训练技、模型选择巧及AI未来展望---打造AI应用新篇章
大模型落地实战指南:从选择到训练,深度解析显卡选型、模型训练技、模型选择巧及AI未来展望---打造AI应用新篇章
|
2月前
|
人工智能 开发者 Python
Firefly:开源大模型训练工具助力AI技术进步,让你轻松训练各种主流大模型!
Firefly:开源大模型训练工具助力AI技术进步,让你轻松训练各种主流大模型!
189 1
|
2月前
|
人工智能 算法 UED
OpenAI与法国和西班牙媒体巨头合作:利用内容进行训练AI
【2月更文挑战第26天】OpenAI与法国和西班牙媒体巨头合作:利用内容进行训练AI
26 7
OpenAI与法国和西班牙媒体巨头合作:利用内容进行训练AI
|
2月前
|
人工智能 算法 数据处理
App Inventor 2 Personal Image Classifier (PIC) 拓展:自行训练AI图像识别模型,开发图像识别分类App
这里仅仅介绍一下AI图像识别App的实现原理,AI的基础技术细节不在本文讨论范围。通过拓展即可开发出一款完全自行训练AI模型,用于特定识别场景的App了。
46 1
|
3月前
|
机器学习/深度学习 人工智能 算法
姿态识别+康复训练矫正+代码+部署(AI 健身教练来分析深蹲等姿态)-1
姿态识别+康复训练矫正+代码+部署(AI 健身教练来分析深蹲等姿态)-1
130 1