Day 18 - 深入讨论 YOLO 相关设定

Day 18 - 深入讨论 YOLO 相关设定

今天来分析 Joseph Redmon 所设计的 YOLOV3 的设定档,里面会看到他是如何设计整个卷积网路结构,下图是 github 中 cfg 文件夹的 YOLO 结构的档案,看 yolov1.cfg, yolov2.cfg, yolov3.cfg 等档名后面带着-xxx,例如: yolov2-voc.cfg, yolov3-voc.cfg。这是指针对不同的数据集 (datasets) 训练时的网路结构组态档案,没有带 -xxx 的组态档,基本上的数据集就是微软的 COCO 数据集,总类别数是 80 类。带有 -voc 则是跑 VOC 数据集,类别数是 20 类。

在这里插入图片描述
图 1、YOLO 组态档文件夹的结构

下图是根据 Joseph Redmon 所发表的 YOLOv3 结构用来萃取特征图的 darknet53 网路结构。

在这里插入图片描述
图 2、YOLOv3 的 darknet53

打开 yolov3.cfg,下图是档案内前三层的卷积层的设定,比对两图的过滤器(filter),卷积核心大小(size) 以及步进 (stride),可以发现一模一样,分别是 (32 * 32, 3, 1), (64 * 64,3,2), (32 * 32, 1, 1)。这样不难理解 yolov3.cfg 的目的就是在描述 yolov3 的网路结构,所以我们只要使用不同的组态档,就可以实作 yolov1,yolov2 或是 yolov3。

在这里插入图片描述
图 3、yolov3.cfg 的前三项设定

因此,全局的设定都是在 [net] 这个选项中进行设定,通常我们针对不同的环境都是修改这里的设定。

batch=64
subdivisions=16
width=608
height=608
channels=3

batch指的就是一批要多少训练样本(batchsize),以我们的例子来说就是图片,这主要是取决于训练时的 GPU 记忆体,而 yolo 还有一个参数是 subdivisions,是用来细分,一次放多少样本到记忆体中,以上述的设定,通常是记忆体足够大,可以一次放入 4 张图片 (64/16),如果自己评估记忆体够用的话, subdivisions 可以设的更小一点,原则上是 8 的倍数。下面这个方程式说明批次 (batchsize) 跟迭代 (iteration) 与期数 (epoch) 的关系。

epoch = (全部训练样本 / batchsize) / iteration

举个例子,训练集有 1000 个样本,batchsize = 10,那么训练完整个样本集(1次epoch)需要:100 次iteration。
1 = (1000 / 10) / 100

width, height, channels 这三个参数用来指定训练图片大小,必须是 32 的倍数,资料集中的图片大小务必要跟这个设定相同。

底下是整个模型找寻最佳解的超参数,可以参考机器/深度学习-基础数学(三):梯度最佳解相关算法(gradient descent optimization algorithms)

momentum=0.9
decay=0.0005
learning_rate=0.0005
max_batches = 60000
policy=steps
steps=400000,450000
scales=.1,.1
  • 动能 (momentum): 主要是用在计算参数更新方向前会考虑前一次参数更新的方向,如果当下梯度方向和历史参数更新的方向一致,则会增强这个方向的梯度,若当下梯度方向和历史参数更新的方向不一致,则梯度会衰退。然后每一次对梯度作方向微调。这样可以增加学习上的稳定性(梯度不更新太快),这样可以学习的更快,并且有摆脱局部最佳解的能力。 。
  • 衰减 (decay) : 为了能较快的找到最佳解,通常一开始会用大的学习率,接着在变成较小的学习率,而衰减参数就是用来决定衰减的速度。
  • 学习率 (learning_rate): 最佳化模型的学习参数,下图左是一个学习率设定为 0.9 的学习过程,假设中心点是我们要找的最佳解,因为学习率过大,导致整个学习过程如锯齿状般的前进;而图右则是学习率为 0.5 ,很快就沿着最佳解前进,但因为学习率低,所以前进速度很慢。
  • 学习政策 (policy):这个参数是用来调整学习率的策略,包含CONSTANT, STEP, EXP, POLY,STEPS, SIG, RANDOM。
  • 步进 (steps): 这边就是当迭代在第几次时,学习率会发生变化。建议为 max_batches 的 70%, 80%, 90% 等逐步增加。
  • scales : 和 steps 是一组的,所以数量和 steps 是一样的,这个参数就是在第几次时,学习率会发生变化比例。
  • max_batches: 这里的 batch 指的是迭代次数 (iteration),设定大小建议是 类别数 * 2000 ,但不可以小于 6000 或是训练样本数量。所以如果有 3 个样本,那可以设定 3 * 2000 = 6000。

在这里插入图片描述
图 4、找寻最佳解的过程

资料扩增相关参数,用来随机产生新的资料用来训练模型。
angle(角度): 图片角度变化,单位是度, angle=10,就是随机生成 -10 ~ 10 度旋转的图片。
saturation(饱和度)和exposure(曝光度): 代表饱和度和曝光度设定 1.5 代表用饱和度和曝光度进行 0 ~ 1.5 倍随机生成图片。以下为 DarmMark 所做的示例,它建议可以在 0 - 10 之间调整,但是 darknet 可以容许更大的值。
hue(色调): 色调设定为 0.1 代表在色调随机变化 0 ~ 0.1 生成图片。 DarmMark 建议可以在 0.0 到 1.0 之间调整。

angle=0
saturation = 1.5
exposure = 1.5
hue=.1

在这里插入图片描述
图 5、DarkMark的图型效果

最后辨识判断的结果在 YOLOv3 为[yolo]这个选项中。

  • ignore_thresh:这个参数用来决定物件是否要被纳入 cost function 计算。若 best IoU 大于此参数,则此 IoU 误差不会纳入 cost function中。
  • random:等于 1 代表每 10 次迭代输入影像会随机缩放到 320 * 320 – 608 * 608。
  • classes:表示要辨识的种类数量。
  • jitter:主要是利用这个方法裁图 (crop) 跟 翻转图片 (flip) 产生更多资料抑制 overfitting。
  • 锚 anchors:先验框 (anchor boxes) 是在 yolov2 提出,用来预测边界框,进行卷积来预测每个位置的边界框以及置信度(是否含有物体),并且各个位置设置不同尺度和比例的先验框。
  • num:说明有几个锚 (anchor),但实际用到哪几个锚是看 mask 来决定,mask=0, 1, 2 代表用 anchors 的前三组(一组两个数字),mask=6, 7, 8 代表用 anchors 的第6, 7, 8组
[yolo]
mask = 6,7,8
anchors = 10,13,  16,30,  33,23,  30,61,  62,45,  59,119,  116,90,  156,198,  373,326
classes=80
num=9
jitter=.3
ignore_thresh = .7
truth_thresh = 1
random=1

要记得在三个 [yolo] 层的前一个卷积层,都要将 fliters 根据辨识的种类数量来进行修改,公式如下,位置可以参考下图。

filters=(classes + 5) * 3 

在这里插入图片描述
图 6、修改判断层前的卷积层的过滤器

参考资料

  • 深度學習-物件偵測YOLOv1、YOLOv2和YOLOv3 cfg 檔解讀(一),https://chih-sheng-huang821.medium.com/深度學習-物件偵測yolov1-yolov2和yolov3-cfg-檔解讀-75793cd61a01
  • AlexeyAB/darknet, https://github.com/AlexeyAB/darknet
  • yolov3.cfg参数说明及调参经验, https://zhuanlan.zhihu.com/p/91587361
  • Image markup for darknet machine learning.https://www.ccoderun.ca/darkmark/Summary.html#DarkMarkRotation
  • Image markup for darknet machine learning, https://www.ccoderun.ca/darkmark/DataAugmentation.html
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值