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 类。

https://ithelp.ithome.com.tw/upload/images/20210918/20129510M1guqwiSwd.png
图 1、YOLO 组态档文件夹的结构

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

https://ithelp.ithome.com.tw/upload/images/20210918/20129510g5vqgkLf61.png
图 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。

https://ithelp.ithome.com.tw/upload/images/20210918/20129510TpVXpNZf7r.png
图 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。

https://ithelp.ithome.com.tw/upload/images/20210918/20129510uPnM8PfJ8C.png
图 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

https://ithelp.ithome.com.tw/upload/images/20210918/20129510wLMd8wbNdF.png
图 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 

https://ithelp.ithome.com.tw/upload/images/20210918/20129510ZTn8OFYD9r.png
图 6、修改判断层前的卷积层的过滤器

参考资料


<<:  NoSQL的格式(一)

>>:  Day 3 : 案例分享(1.1) -B2C经典流程 电子商务、POS + 进销存 + 会计(应收付) +制造(产品组合、产品转换)

第五章之二

玩各种CMS当然要从选模板作为起始,选一个样式最符合主要规划的,无论企业网站、个人部落格网站、资讯站...

[Day26] 透过GCP实作(2/4):进行前後端分离

在昨日的文章中,简单地向各位展示直接藉由Function抓取API 所能得到的架构会是何者 而今天...

【Day12】Latch的生成条件以及如何避免(上)

什麽是 Latch ? 前几篇在 if-else 以及 case 语句时有提到 latch,那什麽是...

[Day23] Session fixation

前言 被Netflix fixation了,差点忘记发文 正文 概念 CWE-384 Authent...

【Day 15】Python MySQL

今天发烧用手机打字 後面明天一定补完QQ 明天是不是该想想要做什麽mysql小projectㄌ.....