精华内容
下载资源
问答
  • OHEM

    2020-03-29 14:04:17
    思想: 选择一些hard example作为训练的样本从而改善region-based网络参数效果,hard example指的是有多样性和高损失的样本。... OHEM适合于batch size(images)较少,但每张image的proposal很多的情况 ...

    思想:

    • 选择一些hard example作为训练的样本从而改善region-based网络参数效果,hard example指的是有多样性和高损失的样本。
    • 本文在Fast R-CNN的基础上做了改进,在每次minibatch(1张或者2张)训练时加入在线筛选hard region的策略
    • OHEM适合于batch sizeimages)较少,但每张image的proposal很多的情况
    • 是一种bootstrapping方式(利用有限的样本资料经由多次重复抽样,重新建立起足以代表母体样本分布的新样本),但是忽略了简单样本,改变了整个输入的分布
    • 对于RPN提出的所有proposal FM,后边接两个ROI net,绿色的net只forward,而红色的net做forward和backward。
    • 前边的Conv net共享权重,为了减少显存以及后向传播的时间,两个ROI net也共享权重

     

    过程:

    • 将原图的所有proposal输入ROI A,计算两个loss
    • 将loss降序排列,并经过NMS(防止重叠很大的目标的loss计算两次的问题),提取出前K个proposal
    • 将这K个proposal送入ROI B,计算loss并更新整个网络

    一个简单但不好的方法:将所有proposal计算loss并只back那些hard proposal,不过需要缓存很大。

    展开全文
  • OHEM 详解

    千次阅读 2020-03-24 22:17:04
    (一)Hard Negative Mining Method(二)OHEM

    Training Region-based Object Detectors with Online Hard Example Mining

    论文链接


      在 two-stage 的目标检测方法中,经过区域生成算法或者网络生成的 region proposals 通常会经过正负样本的筛选和比例平衡后,才送入之后的检测网络进行训练。但是正负样本的定义和训练的比例是需要人为定义的。如果要筛选 hard mining。通常使用的都是 hard negative mining 的方法。但是此方法不适用于 end-to-end 的模型。因为会大大降低模型的训练速度。
      作者观察到传统 hard negative mining 的缺点后,提出了一种 Online Hard Example Mining 的方法。可以自动地选择 had negative 来进行训练,不仅效率高而且性能好。


    一、Hard Negative Mining Method


      对于 two-stage 的目标检测方法,我们会先生成很多的 region proposals,然后再放入之后的网络进行训练。但是在这些生成的 region proposals 中,正负样本的比例严重不平衡。极端的情况,假如我们有 99 个负样本和 1 个正样本。我们的网络只用预测所有的样本都为负样本就可以达到 99% 的正确率,所以我们需要对正负样本的数量进行平衡,只选出那些 hard negative 的样本进行训练。


    (一)Hard Negative Mining Method 思想


      解决上述问题的传统方法是用 Hard Negative Mining Method 的方法,它的 思想如下:

      对于 hard Negative Mining(困难样本挖掘)可以理解为错题集,你不会把所有的错题都放到错题集中,你会挑出那些你最容易错的题放到错题集中,Hard Negative Mining Method 就是这样。

      首先是 negative,即负样本,其次是 hard,说明是困难样本,也可以说是容易将负样本看成正样本的那些样本,例如 roi 里没有物体,全是背景,这时候分类器很容易正确分类成背景,这个就叫 easy negative;如果 roi 里有二分之一个物体,标签仍是负样本,这时候分类器就容易把他看成正样本,这时候就是 had negative。hard negative mining 就是多找一些 hard negative 加入负样本集,进行训练,这样会比 easy negative 组成的负样本集效果更好。


    (二)Hard Negative Mining Method 使用


      通常 使用 Hard Negative Mining Method 的方法为:

      迭代地交替训练,用样本集更新模型,然后再固定模型 来选择分辨错的目标框并加入到样本集中继续训练。传统,我们会使用 SVM + Hard Negative Mining Method 进行训练


    (三)Hard Negative Mining Method 缺点


      那么传统的 Hard Negative Mining Method 有什么 缺点 呢?

      Hard Negative Mining Method 很难应用到 end-to-end 的检测模型。 因为 Hard Negative Mining Method 需要迭代训练,如果我们将他使用到 end-to-end 的卷积神经网络,需要每次将网络冻结一段时间用来生成 hard negative。而这对于使用线上优化的算法来说是不可能的,例如 SGD (随机梯度下降算法)。使用 SGD 来训练网络需要上万次更新网络,如果每迭代几次就固定模型一次,这样的速度会慢得不可想象。

      我们可以观察到在 fast rcnn 和 faster rcnn 中都没有用到 Hard Negative Mining Method。这就是因为如上的原因,一般使用 SVM 分类器才能使用此方法(SVM 分类器和 Hard Negative Mining Method 交替训练)


    二、OHEM


      我们知道,基于 SVM 的检测器,在训练时,使用 hard example mining 来选择样本需要交替训练,先固定模型,选择样本,然后再用样本集更新模型, 这样反复交替训练直到模型收敛。

      作者认为可以把交替训练的步骤和 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。


    (一)训练方式


    fast RCNN

      Fast R-CNN(上图)是使用SGD来优化模型的,每个RoI的损失包括分类损失和回归 损失,其中不断降低分类损失使得模型分类更准确,不断降低回归损失使得 预测标注框更准确。

      SGD是以mini-batch为单位来更新模型的。对于每个mini-batch,先从数据 集中取N张,然后每张图片采样B/N个RoIs

    1. Foreground RoIs

      一个RoIs怎样才算作一个目标RoI(也就是含有目标的RoI)呢,在R-CNN, SPPnet, and MR-CNN等把RoI与真实框的交叉比(IOU)大于等于0.5即判定 为目标RoI,在本文中也是这样的设置

    2. Background RoIs

      而如果要被判定为背景RoI,则要求该RoI与真实框的交叉比大于等于 bg_lo这个阈值并且小于0.5。虽然这样的设置能加快收敛和检测准确度, 但这样的设置会忽略不怎么出现但又十分重要的比较难分辨的背景。因 此,在本文的OHTM方法中,作者去掉了这样的设置。

    3. Balancing fg-bg RoIs

      为了解决目标框和背景框之间的不平衡,Fast R-CNN设置在一个 mini-batch中,它们之间的比例是1:3。作者发现,这样的一个比例对 于Fast R-CNN的性能是十分重要的,增大或者减小这个比例,都会使模 型的性能有所下降,但使用OHEM便可以把这个比例值去掉。


    (二)实现方式 1


      直接修改损失层,然后直接进行 hard example selection。损失层计算所有的 RoIs,然后按损失从大到小排序,当然这里有个 NMS(非最大值抑制) 操作,选择 hard RoIs 并 non-hard RoIs 的损失置0。虽然这方法很直接,

      但效率是低下的,不仅要为所有 RoI 分配内存,还要对所有 RoI 进行反向传播,即使有些 RoI 损失为0。


    (三)实现方式 2


    OHEM

      对于方法 1 的缺点很明显,我们还有更好的一种实现方式。作者提出了上面这样的架构。这个架构有两个相同的 RoI 网络,不同的是其中一个只可读,另一个可读可写。我们看到(a) 是只可读的,只对所有 RoI 做前向计算,所以只需分配内存给前向计算 操作,(b) 既可读也可写,对被选择的 hard RoIs 不仅做前向计算也做反向传播计算。

      对于一次 SGD 迭代,计算过程如下:先计算出特征图,可读 RoI 网络对所有 RoI 执行前向计算并计算每个 RoI 的损失,然后选择 hard RoIs。把这些 hard RoIs 输入到可读可写的 RoI 网络中执行前向前向计算和反向传播更新网络,并把可读可写的 RoI 网络的参数赋值给只可读的网络,一次迭代就完成了。

      这个方式和第一种方式在内存空间是差不多的,但第二种方式的速度快 了两倍。



    参考链接:

    https://arxiv.org/pdf/1604.03540.pdf
    https://zhuanlan.zhihu.com/p/58162337

    展开全文
  • OHEM笔记

    2019-06-14 14:51:56
    主要说现有的目标检测算法开销大,而数据集中又分为大部分的简单样例和小部分的困难样例,如果能自动把困难样例筛选出来,那么算法会更加有效率,这就是OHEM的作用,同时OHEM也确实提高了各种数...

    完整名:Training Region-based Object Detectors with Online Hard Example Mining
    中文:用在线的困难样例挖掘算法训练基于地区的目标检测器

    摘要

    主要说现有的目标检测算法开销大,而数据集中又分为大部分的简单样例和小部分的困难样例,如果能自动把困难样例筛选出来,那么算法会更加有效率,这就是OHEM的作用,同时OHEM也确实提高了各种数据集下算法的表现。

    介绍

    现有的目标检测算法往往把目标检测任务转化为图像分类任务,但是有些新的问题需要解决,那就是训练图像中,一部分是有标注的目标像素,一部分是不属于任何类的背景,有时候同一个目标可能在10万种不同背景中出现(因为如果用滑动窗口的话同一目标就会有相当多个窗口),虽然推荐框算法优化了一点,但是最低还会有70:1的比例出现背景:目标。

    现在一般是使用bootstrapping算法来解决这个问题(一般也叫做hard negative mining,困难反例挖掘)


    什么是bootstrap?
    这个在西瓜书第二章,为选取训练集与测试集的方法。模型评估方法中有提到,中文为自助法
    即在原数据集D中经过m次有放回的采样得到D*,用作训练集,而D-D*用作测试集。
    这样样本在m次采样中均不被采样到的概率为limm(11/m)m=1/e0.368lim_{m\to\infty}(1-1/m)^m=1/e\approx0.368,也就是总体中大概有0.368的样本不在D*里,而在D-D*里用作测试集
    为什么要这么做?
    西瓜书上说是为了让实际评估的模型使用的训练集与期望评估的模型使用的训练集相同,都为m个样本,其实不太理解,为什么期望评估的模型使用的训练集是m个样本不是D个样本?

    hard example或者hard negative是指什么?
    就是很难分辨的误报的样本,一般直接在负样本原图(就是不包含人的背景图)上进行目标检测,这样得到的检测框肯定都是误报,然后把这些检测框包含的图片加入到负样本中,重新进行训练,这样就能减少误报。

    什么是online的模型?
    关键点在于随时在训练,只要有新的数据就加进去训练,更新模型
    传统的模型,训练时首先要准备好(固定的)训练集,最多分为一些batch加入,而online的训练集不用事先准备完全,可能还在生产中,生产出来一个放进去一个训练,持续不断地优化模型,由于有一个数据就投进去,一般就是用的SGD。


    但是当使用SGD时,bootstrap就不行了,这时候就需要我们的OHEM,这是SGD的一个修改版,

    展开全文
  • 在线硬示例挖掘(OHEM)是一种在线自举算法,用于训练基于区域的ConvNet对象检测器,例如。 OHEM 在随机梯度下降(SGD)范例中效果很好, 通过删除一些启发式和超参数来简化训练, 导致更好的收敛(降低训练集损失)...
  • OHEM介绍

    2020-12-20 22:02:07
    在two-stage检测算法中,RPN阶段会生成大量的检测框,由于很多时候一张图片可能只会有少量几个目标,也就是说绝大部分框是没有目标的,为了减少计算就需要进行sample,一般来说...那么ohem就是较好的一种正负样本策略

    目标检测之OHEM介绍

    论文地址:https://arxiv.org/pdf/1604.03540.pdf

    在two-stage检测算法中,RPN阶段会生成大量的检测框,由于很多时候一张图片可能只会有少量几个目标,也就是说绝大部分框是没有目标的,为了减少计算就需要进行sample,一般来说fasterrcnn的sample机制是算框和label的IOU,大于0.7认为是正样本,小于0.3是负样本。但是单纯的random_sample选出来的框不一定是最容易错的框。那么ohem就是这样的一种正负样本策略,通过根据框的loss得到最容易错的框。可以理解为错题集,我们只会把最容易错的题放到错题集。

    首先是 negative,即负样本,其次是 hard,说明是困难样本,也可以说是容易将负样本看成正样本的那些样本,例如 RPN框里没有物体,全是背景,这时候分类器很容易正确分类成背景,这个就叫 easy negative;如果 框里有二分之一个物体,标签仍是负样本,这时候分类器就容易把他看成正样本,这时候就是 had negative。hard negative mining 就是多找一些 hard negative 加入负样本集,进行训练。
    接下来我们来看看mmdection的ohem实现:

    class OHEMSampler(BaseSampler):
        r"""Online Hard Example Mining Sampler described in `Training Region-based
        Object Detectors with Online Hard Example Mining
        <https://arxiv.org/abs/1604.03540>`_.
        """
    
        def __init__(self,
                     num,
                     pos_fraction,
                     context,
                     neg_pos_ub=-1,
                     add_gt_as_proposals=True,
                     **kwargs):
            super(OHEMSampler, self).__init__(num, pos_fraction, neg_pos_ub,
                                              add_gt_as_proposals)
            self.context = context
            if not hasattr(self.context, 'num_stages'):
                self.bbox_head = self.context.bbox_head
            else:
                self.bbox_head = self.context.bbox_head[self.context.current_stage]
    
        def hard_mining(self, inds, num_expected, bboxes, labels, feats):
            with torch.no_grad():
                rois = bbox2roi([bboxes])
                if not hasattr(self.context, 'num_stages'):
                    bbox_results = self.context._bbox_forward(feats, rois)
                else:
                    bbox_results = self.context._bbox_forward(
                        self.context.current_stage, feats, rois)
                cls_score = bbox_results['cls_score']
                loss = self.bbox_head.loss(
                    cls_score=cls_score,
                    bbox_pred=None,
                    rois=rois,
                    labels=labels,
                    label_weights=cls_score.new_ones(cls_score.size(0)),
                    bbox_targets=None,
                    bbox_weights=None,
                    reduction_override='none')['loss_cls']
                _, topk_loss_inds = loss.topk(num_expected)
            return inds[topk_loss_inds]
    
        def _sample_pos(self,
                        assign_result,
                        num_expected,
                        bboxes=None,
                        feats=None,
                        **kwargs):
            """Sample positive boxes.
    
            Args:
                assign_result (:obj:`AssignResult`): Assigned results
                num_expected (int): Number of expected positive samples
                bboxes (torch.Tensor, optional): Boxes. Defaults to None.
                feats (list[torch.Tensor], optional): Multi-level features.
                    Defaults to None.
    
            Returns:
                torch.Tensor: Indices  of positive samples
            """
            # Sample some hard positive samples
            pos_inds = torch.nonzero(assign_result.gt_inds > 0, as_tuple=False)
            if pos_inds.numel() != 0:
                pos_inds = pos_inds.squeeze(1)
            if pos_inds.numel() <= num_expected:
                return pos_inds
            else:
                return self.hard_mining(pos_inds, num_expected, bboxes[pos_inds],
                                        assign_result.labels[pos_inds], feats)
    
        def _sample_neg(self,
                        assign_result,
                        num_expected,
                        bboxes=None,
                        feats=None,
                        **kwargs):
            """Sample negative boxes.
    
            Args:
                assign_result (:obj:`AssignResult`): Assigned results
                num_expected (int): Number of expected negative samples
                bboxes (torch.Tensor, optional): Boxes. Defaults to None.
                feats (list[torch.Tensor], optional): Multi-level features.
                    Defaults to None.
    
            Returns:
                torch.Tensor: Indices  of negative samples
            """
            # Sample some hard negative samples
            neg_inds = torch.nonzero(assign_result.gt_inds == 0, as_tuple=False)
            if neg_inds.numel() != 0:
                neg_inds = neg_inds.squeeze(1)
            if len(neg_inds) <= num_expected:
                return neg_inds
            else:
                neg_labels = assign_result.labels.new_empty(
                    neg_inds.size(0)).fill_(self.bbox_head.num_classes)
                return self.hard_mining(neg_inds, num_expected, bboxes[neg_inds],
                                        neg_labels, feats)
    

    上面代码就是整个ohem的sample过程,整个ohem分为三个函数分别是hard_mining,_sample_pos,_sample_neg,_sample_pos和_sample_neg是获得对应的困难正样本/困难负样本,由hard_mining完成整个sample过程:根据输入的box_list得到对应的bbox_loss的list取最大的256/512个,由于这一批box的loss最大,就可以认为是最难区分的box,这一批bbox就是所谓的
    困难正样本/困难负样本。

    至此ohem阶段完成,后面就是对候选框的分类和回归,因为ohem阶段得到了容易分错的样本框,所以在后续训练阶段模型会对这些容易分错的框重点关注,有利于困难样本的检测,提升了模型的效果。

    实际上提升还是很明显的:
    在这里插入图片描述

    展开全文
  • OHEM算法

    2020-05-26 23:22:24
    文章提出了一种通过online hard example mining(OHEM)算法训练基于区域的卷积检测算子的高效目标检测算法,能够对简单样本和一些小数量样本进行抑制,使得训练过程更加高效。该方法利用显著的bootstrapping技术...
  • OHEM代码梳理

    千次阅读 2019-04-08 22:44:26
    有关OHEM的介绍请参考上面给出的链接,这里主要就OHEM是怎么运行的做一些简单的分析,整个OHEM的代码也不是很多,这里将算法的步骤归纳为: 1)计算检测器的损失,这部分是使用和最后fc6、fc7预测头一样的共享参数,...
  • OHEM源码部分

    2020-11-30 16:22:32
    在线难例挖掘OHEM 论文Training Region-based Object Detectors with Online Hard Example Mining 源码链接https://github.com/abhi2610/ohem 基于Fast R-CNN,框架基于Caffe OHEM训练样本生成的部分在/ohem/blob/...
  • OHEM 笔记

    2019-10-22 14:54:48
    2.本文重点是了解OHEM算法以及它与hard negative mining的异同点,尽量用较少篇幅表达清楚论文整体思路,其他一些不影响理解论文算法的东西有需要的请查看其他博客 3.论文中的链接是我经过大量搜索,个人认为讲解最...
  • MTCNN - ohem

    2020-10-25 17:24:16
    mtcnn 的 ohem 思想很简单,就是把每个 batch 样本的 loss 排序,选取前 一定比例 的 loss 作为 该 batch 的 loss; 我们可以这么理解,只选大 loss,小 loss 被弃用,相当于 小 loss 为 0,0 进行反向传播时自然...
  • OHEM算法论文理解

    千次阅读 2017-09-22 21:44:56
    OHEM
  • OHEM算法的Caffe实现

    千次阅读 2017-06-13 22:46:33
    这篇博文介绍如何用OHEM算法训练数据和测试数据。因为OHEM算法是对Fast RCNN的改造,所以Caffe代码的编译和Fast(er) RCNN基本类似。OHEM算法及Caffe代码的讲解可以参考另外一篇博客:OHEM算法及Caffe代码详解代码的...
  • OHEM 代码详解

    2019-08-18 21:40:48
    2.OHEM 前向传播 3 .reference 1.网络结构 ########################## ## Readonly RoI Network ## ######### Start ########## layer { name: "roi_pool5_readonly" type: "ROIPooling" bottom: "co...
  • OHEM的pytorch代码实现细节

    千次阅读 2019-04-23 17:05:33
    详细解读一下OHEM的实现代码: def ohem_loss( batch_size, cls_pred, cls_target, loc_pred, loc_target, smooth_l1_sigma=1.0 ): """ Arguments: batch_size (int): number of sampled rois for bbox he...
  • 在线难例挖掘(OHEM

    千次阅读 2019-03-23 21:48:32
    OHEM(online hard example miniing) 详细解读一下OHEM的实现代码: def ohem_loss( batch_size, cls_pred, cls_target, loc_pred, loc_target, smooth_l1_sigma=1.0 ): """ Arguments: batch_size (int):.....
  • 行业分类-物理装置-基于ohem的语义分割模型训练方法及其系统.zip
  • Trick系列-OHEM方法

    2019-07-24 10:59:58
    [外链图片转存失败(img-qIs6ZwYb-1563937170568)...注意ohem是基于fast rcnn的,如果使用RPN性能应该会更高。骨架网络使用的是VGG16和VGG_M,这是基于alexnet的辩题。 OHEM VS 经...
  • 目标检测 | OHEM

    万次阅读 2018-08-17 10:24:17
    这里主要说下该论文的hard mining过程:  先上图,如Figure2所示:  从图中可以看出,本文的亮点在于在每次迭代中,较少训练样本下,如何hard negative mining,来提升效果。...需要注意的是,这个OHEM适合于b...
  • 目标检测之OHEM

    2019-05-08 13:22:18
    一、目标检测之OHEM Training Region-based Object Detectors with Online Hard Example Mining 论文链接:https://arxiv.org/abs/1604.03540 论文详解:https://www.jianshu.com/p/a3cbfa81d86a 论文代码:...
  • OHEM算法及Caffe代码详解

    万次阅读 2017-06-12 23:25:27
    这是CVPR2016的一篇论文,用于目标检测,本篇博文先介绍这个算法,然后介绍其Caffe代码。论文:Training Region-...论文链接:https://arxiv.org/abs/1604.03540算法概述:OHEM(online hard example miniing)算法的
  • SqueezeNet网络的OHEM

    2017-08-13 15:40:40
    SqueezeNet网络的OHEM
  • pytorch - ohem 代码实现

    2020-02-10 10:47:17
    如果考虑类别和坐标两种情况: import torch import torch.nn.functional as F import torch.nn as nn smooth_l1_sigma = 1.0 smooth_l1_loss = nn.SmoothL1Loss(reduction='none') # ...def ohem_loss(batch_size,...
  • 现在很少会关注2年以前的顶会论文了,但是像OHEM这样的经典论文还是值得一读。果然论文作者列表里有rbg大神的都是经典文章。国际惯例,先给出文章标题和链接: 标题:Training Region-based Object Detectors with ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,895
精华内容 758
关键字:

ohem