zoukankan      html  css  js  c++  java
  • 目标检测任务中的训练宝典 |实用技巧

    640?wx_fmt=jpeg

    特约作者 : Slumbers

    最近正好在做检测项目,相对于分类任务而言,检测任务的优化策略少之又少,最近阅读了 @李沐老师 团队新出的论文Bag of Freebies for Training Object Detection Neural Networks中,提到了一些在不牺牲模型性能的前提下提升目标检测模型的tricks。

    这篇论文我读完之后觉得CNN训练分类任务中可以执行的优化策略有不少重叠的地方,包括学习率热身、Label smoothing、 Cosine learning rate decay等都是可以在目标检测中使用的tricks,实验证明这些在分类上的tricks在目标检测领域也非常有效。

    640?wx_fmt=jpeg

    两篇论文都提到的一些可以使用的技术: mix up , label smoothing, cosine learning rate, warm up。除此之外,这篇论文还提到了一些单独增对检测任务的tricks如数据增量策略,跨卡BN和random shapes traning等。

    Mix up

    Mix up最早是用于解决对抗扰动的方法。是数据增量(data augmentation)的一种方法,每次随机取两个样本点 640?wx_fmt=svg , 然后按照如下的混合方式生成一个新的样本点:

    640?wx_fmt=svg

    640?wx_fmt=svg , 是从 640?wx_fmt=svg 分布中随机生成的。在mixup training中,只使用新的样本 640?wx_fmt=svg 进行训练。

    640?wx_fmt=jpeg

    Label Smoothing

    Label Smoothing可以看作是一种正则化方法,对于ground truth(也就是标注数据)的分布进行混合。原始的ground truth 分布记为 640?wx_fmt=svg ,经过label Smoothing处理后的分布为:

    640?wx_fmt=svg

    其中 640?wx_fmt=svg 是一个小常量,而 640?wx_fmt=svg 是分类类别。这样处理可以减少模型对于标签的过度信赖,对于标签不够精确的情况有较好的效果。

    Cosine learning rate decay

    Step lr decay在每次切换学习率的时候容易引起震荡,cosine lr decay会更加平滑。具体做法是,假设batch的总迭代次数是T(忽略学习率热身阶段),初始学习率为 640?wx_fmt=svg ,那么在每次 t, 将学习率设为:

    640?wx_fmt=svg

    这个lr decay tensorflow和pytorch都是有现成的可用~一行可以搞定(下面列举的是pytorch版本):

        scheduler = CosineAnnealingLR(optimizer, T_max=epoch_num)

    Warm Up

    训练初期由于离目标较远,一般需要选择大的学习率,但是使用过大的学习率容易导致不稳定性。所以可以做一个学习率热身阶段,在开始的时候先使用一个较小的学习率,然后当训练过程稳定的时候再把学习率调回去。比如说在热身阶段,将学习率从0调到初始学习率。举个例子,如果我们准备用m个batches来热身,准备的初始学习率是 640?wx_fmt=svg ,然后在每个batch 640?wx_fmt=svg ,将每次的学习率设为 640?wx_fmt=svg

    最近在跑pytorch版本的mask rcnn,warm up虽然在官方pytorch版本中没有实现,但是在mask rcnn中已经提供实现啦,可以参见:https://github.com/facebookresearch/maskrcnn-benchmark/blob/master/maskrcnn_benchmark/solver/lr_scheduler.py

    下面是单独对检测任务可以考虑的一些点:

    数据增量策略

    主流的数据增量方法包括几何变化(剪切翻转等)和色彩抖动(色彩对比度等)。对于目标检测来说,基于faster rcnn这种基于ROI的检测方法,因为本身检测的第一阶段已经生成了许多重复的候选区域,所以在数据增量时并不需要再去做几何变换。(本文末最后的实验表格也显示,data augmentation对于YOLO等单阶段检测很重要,对于Faster-RCNN影响不大)

    Synchronized Batch Normalization

    现有的标准BN是基于单GPU的,也就是说每个GPU上的样本进行了归一化,实际上的bathc-size变小了。对于分类任务而言,影响不大,但对于检测任务而言会对表现造成一定影响。使用Synchroinzed Batch Normalization(也就是垮卡BN)可以解决这个问题。这一点李沐老师在跨卡同步 Batch Normalization 中解释的很详细了。

    Random Shapes Training

    对于像YOLO这样的单阶段检测器来说,为了减小内存占用,一般会使用固定shape的图片进行训练。为了减小过拟合,可以使用Random shapes training。比如说,以YOLO例在训练过程中每隔多少个epoch就随机的{320, 352, 384, 416, 448, 480, 512, 544, 576, 608}中选择一个新的图片分辨率。这个技术在YOLO v3中就用过了。

    最后论文中附上了上述tricks的效果~:

    640?wx_fmt=jpeg

    文章知乎地址 : https://zhuanlan.zhihu.com/p/56792817

    欢迎关注磐创博客资源汇总站:
    http://docs.panchuang.net/

    欢迎关注PyTorch官方中文教程站:
    http://pytorch.panchuang.net/

  • 相关阅读:
    程序员:不要自称为码农
    SpringBoot对静态资源配置
    LeetCode 572. Subtree of Another Tree(子树)
    LeetCode 437. Path Sum III(统计路径和等于sum的路径数量)
    LeetCode 112. Path Sum(判断路径和是否等于一个数)
    LeetCode 617. Merge Two Binary Trees(归并两棵二叉树)
    LeetCode 226. Invert Binary Tree(翻转二叉树)
    Failure to transfer org.apache.maven.plugins:maven-resources-plugin:pom:2.6 的解决办法
    linux-查询某软件的安装的目录
    WebService概念解释
  • 原文地址:https://www.cnblogs.com/panchuangai/p/12568083.html
Copyright © 2011-2022 走看看