困难负样本挖掘方法——OHEM

Online Negative Example Mining

论文链接

背景:

在模型训练中,大量的训练数据中会存在一些难以区分的负样本,找到这样的负样例再进行针对性地训练,能够对模型精度有一定的提升。在 two-stage 的目标检测方法中,经过区域生成算法或者网络生成的 region proposals 通常会经过正负样本的筛选和比例平衡后,才送入之后的检测网络进行训练。但是正负样本的定义和训练的比例是需要人为定义的。如果要筛选 hard mining。通常使用的都是 hard negative mining 的方法。但是此方法不适用于 end-to-end 的模型。因为会大大降低模型的训练速度。OHEM是一种线上的困难负样例挖掘解决方案,可以自动地选择 had negative 来进行训练,不仅效率高而且性能好。

简单介绍:

  1. 传统 hard negative mining method:
    传统算法需要迭代训练,放入巻积神经网络,每次都需要冻结网络生成困难负样例,很难应用在端-端的检测模型。(SVM + 传统 hard negative mining method)

  2. OHEM的基准算法是Fast R-CNN,可以把交替训练的步骤和 SGD 结合起来。之所以可以这样,作者认为虽然 SGD 每迭代一次只用到少量的图片,但每张图片都包含上千个 RoI,可以从中选择 hard examples,这样的策略可以只在一个 mini-batch 中固定模型,因此模型参数是一直在更新的。
      更具体的,在第 t 次迭代时,输入图片到卷积网络中得到特征图,然后把特征图和所有的 RoIs 输入到 RoI 网络中并计算所有 RoIs 的损失,把损失从高到低排序,然后选择 B / N (B 为 Roi 总个数,N 为输入图片个数)个 RoIs。这里有个小问题,位置上相邻的 RoIs 通过 RoI 网络后会输出相近的损失,这样损失就翻倍。作者为了解决这个问题,使用了 NMS(非最大值抑制) 算法,先把损失按高到低排序,然后选择最高的损失,并计算其他 RoI 与这个 RoI 的 IoU (交叉比),移除 IoU 大于一定阈值的 RoI,然后反复上述流程直到选择了 B/N 个 RoIs。

困难负样本挖掘方法——OHEM_第1张图片图中的b模块正是OHEM 比 Fast R-CNN 多出的模块。

  1. 对于two-stage模型,可以把它的两部分是提取推荐框分类回归两个部分,而OHEM的作用恰好是两个部分的中间。

在提取推荐框之后,会有很多ROI传输到后面网络。这部分的输出便是推“可能存在目标的位置“,以image patch(会给数以千计的小片(你可以叫ROI,也可以叫推荐框,还可以叫image patch))的形式给到后面的分类和回归网络。分类回归会对这些小片进行分类、坐标和尺寸回归以及置信度打分(confidence, 置信度是指,模型对这个输出有多大把握)。如果在训练阶段,那可以通过这些参数与标注结果进行计算得出损失值。OHEM恰恰利用了这个损失值。

  1. 操作流程:

    1. 正常进行一次Faster RCNN的前向传播,获得每个小片单独的损失值;

    2. 对小片们进行非极大值抑制(NMS),不了解NMS点链接去了解,非常简单;

    3. 对nms之后剩下的小片按损失值进行排序,然后选用损失值最大的前一部分小片当作输入再进一遍b部分,通过这种方法,可以屏蔽掉loss值非常低的小片。loss值非常高的小片意味着,模型训练很多次还对这些小片有着很高的loss,那么就认为这是困难负例。所谓的线上挖掘,就是先计算loss->筛选->得到困难负例。

    4. 把困难负例输入到图1中(b)模块,(b)模块是(a)模块的copy版,连参数都是一样的。只是(a)模块是不可训练的,用于寻找困难负例嘛。(b)模块是用来反向传播的部分,然后把更新的参数共享到(a)部分(a部分也跟着一起更新)。其实在程序的实现上,(a)模块可以复用,不需要额外来一个(b)模块。ab部分可以并行操作:a对下一张图像进行前向,b对上一张图像进行反向。

你可能感兴趣的:(深度学习,深度学习,计算机视觉)