OHEM算法及Caffe代码详解

OHEM算法及Caffe代码详解这是CVPR2016的一篇论文,用于目标检测,本篇博文先介绍这个算法,然后介绍其Caffe代码。论文:TrainingRegion-basedObjectDetectorswithOnlineHardExampleMining论文链接:https://arxiv.org/abs/1604.03540算法概述:OHEM(onlinehardexampleminiing)算法的

大家好,又见面了,我是你们的朋友全栈君。

这是CVPR2016的一篇论文,用于目标检测,本篇博文先介绍这个算法,然后介绍其Caffe代码。

论文:Training Region-based Object Detectors with Online Hard Example Mining
论文链接:https://arxiv.org/abs/1604.03540

算法概述:

OHEM(online hard example miniing)算法的核心思想是根据输入样本的损失进行筛选,筛选出hard example,表示对分类和检测影响较大的样本,然后将筛选得到的这些样本应用在随机梯度下降中训练。在实际操作中是将原来的一个ROI Network扩充为两个ROI Network,这两个ROI Network共享参数。其中前面一个ROI Network只有前向操作,主要用于计算损失;后面一个ROI Network包括前向和后向操作,以hard example作为输入,计算损失并回传梯度。作者将该算法应用在Fast RCNN中,网络结构还是采用VGG16和VGG_CNN_M_1024,数据集主要采用VOC2007,VOC2012和COCO数据集。
算法优点:1、对于数据的类别不平衡问题不需要采用设置正负样本比例的方式来解决,这种在线选择方式针对性更强。2、随着数据集的增大,算法的提升更加明显(作者是通过在COCO数据集上做实验和VOC数据集做对比,因为前者的数据集更大,而且提升更明显,所以有这个结论)。

算法的测试结果:在pascal VOC2007上的mAP为78.9%,在pascal VOC2012上的mAP为76.3%。注意,这些结果的得到包含了一些小tricks,比如multi-scale test(测试时候采用多尺度输入),bounding box的不断迭代回归。

代码的github地址:https://github.com/abhi2610/ohem

算法详解:

如前所述,OHEM算法的核心是选择一些hard example作为训练的样本,那么什么样的样本是hard example呢?答案是:有多样性和高损失的样本。

在论文中作者主要是将OHEM算法用在Fast RCNN结构中。因此可以先回顾下Fast RCNN的结构。
Fast RCNN的结构图如下,主要包含两个部分:1、卷积网络。主要由多个卷积层和max pooling层组成;2、ROI pooling网络。主要包括ROI pooling层,一些全连接层和两个损失层。

这里写图片描述

hard example是根据每个ROI的损失来选择的,选择损失最大的一些ROI。但是这里有一个问题:重合率比较大的ROI之间的损失也比较相似。因此这里作者采用NMS(non-maximum suppresison)去除重合率较大的ROI,这里作者给的阈值是当IOU大于0.7就认为重合率较高,需去除。
注意,这里作者没有采用设定背景和目标样本数的比例方式处理数据的类别不平衡问题。因为如果哪个类别不平衡,那么这个类别的损失就会比较大,这样被采样的可能性也比较大。

那么具体要怎么把OHEM放在Fast RCNN网络结构中呢?可能首先会想到的做法是修改损失层,将没选择的ROI的loss设置为0。但是这种做法并不高效,因为即便很多ROI的loss都是0,也就是不需要更新梯度,但是这样仍需要给每个ROI都分配存储空间,并且每个ROI都需要后向传播。

因此就有了作者将OHEM应用在Fast RCNN的网络结构,如下图。这里包含两个ROI network,上面一个ROI network是只读的,为所有的ROI在前向传递的时候分配空间。下面一个ROI network则同时为前向和后向分配空间。
首先,ROI经过ROI plooling层生成feature map,然后进入只读的ROI network得到所有ROI的loss;然后是hard ROI sampler结构根据损失排序选出hard example,并把这些hard example作为下面那个ROI network的输入。

这里写图片描述

实际训练的时候,每个mini-batch包含N个图像,共|R|个ROI,也就是每张图像包含|R|/N个ROI。经过hard ROI sampler筛选后得到B个hard example。作者在文中采用N=2,|R|=4000,B=128。
另外关于正负样本的选择:当一个ROI和一个ground truth的IOU大于0.5,则为正样本;当一个ROI和所有ground truth的IOU的最大值小于0.5时为负样本。

对上面Fig2中的图例截图放大:

这里写图片描述

实验结果:

数据集采用pascal VOC2007,结构包括VGG_CNN_M_1024(VGGM)和VGG16。这里作者的对比了许多因素,比如1,2和3,4是对比是否有hard mining的差异,也就是一个是数据不平衡,一个是采用hard mining控制正负样本的比例;还有减小每个batch中的图像数量的影响等。其中7,8,9,10是采用所有ROI训练的标准Fast RCNN,因为增加了ROI数量的同时也要增大学习率,实验结果也还可以。综上,实验证明这些的影响都不大,最后作者加上OHEM明显提高了mAP。

这里写图片描述

然后是训练损失之间的对比,采用每个ROI的平均损失作为纵坐标,迭代次数为横坐标。可以看出如果bg_lo为0,也就是正负样本是不均衡的,那么损失是最大的。同时采用OHEM的损失是最小的。右边的图表和左边的图表的主要差别在于N=1,也就是min-batch的图像数量为1,损失上升了不少。

这里写图片描述

在计算时间和存储上是比Fast RCNN要差一些的。

这里写图片描述

最后是在VOC 2007数据集上各算法的mAP对比:除了OHEM本身的效果以外,也可以看出增加训练数据的效果以及在训练和测试时采用multi-scale,对bounding box采用multi-stage的回归等的效果。

这里写图片描述

以及在VOC2012上的对比:

这里写图片描述

一个更详细的关于multi-scale和iterative bbox regression的对比:可以看出multi-scale不管应用在训练还是测试阶段都有不错的提升效果,这个和很多采用特征融合的方式做目标检测的算法其实本质是一样的,比如SSD算法,FPN算法等等。还有就是Iterative bounding box regression也是非常有效,具体怎么实现还得看代码。

这里写图片描述

在COCO数据集上的对比可以参看论文,这里不再列出。

总结:

总的来讲,OHEM算法通过选择hard example的方式来训练,不仅解决了正负样本类别不均衡问题,同时提高了算法准确率,算是一个不错的trick。可以联系另一篇博文:A-Fast-RCNN算法,也是类似的关于利用hard example来提高mAP,只不过那篇算法是生成hard example,而这篇算法是选择hard example。

Caffe代码:

1、数据层

这里写图片描述

2、VGG16的卷积层

最后一层为conv5_3。

3、只读 ROI Network

包含一个ROI pooling层,两个常规全连接层(fc6,fc7),一个分类得分的全连接层,一个回归的全连接层,一个算分类概率的softmax层。

这里写图片描述

分类得分的全连接层:注意这里有个propagate_down参数设为false,也就是不回传梯度,后面的回归同理。

这里写图片描述

回归的全连接层:

这里写图片描述

算分类概率的softmax层:

这里写图片描述

4、hard ROI mining层

输入包括:分类概率的输出,回归的输出,最开始数据层的输出(rois,labels,targets和两个weights)

这里写图片描述

5、另一个ROI Network

注意这里的ROI pooling层和前面那个只读ROI Network的ROI pooling层的主要区别在于输入变成了rois_hard,即挑选后的hard example。然后依然是两个常规的全连接层(fc6,fc7),一个分类全连接层和一个回归全连接层。

这里写图片描述

看看ROI Network的分类全连接层:可以和前面只读ROI Network的分类全连接层做对比

这里写图片描述

6、分类损失层和回归损失层

(前者用SoftmaxWithLoss,后者用SmoothL1Loss)

这里写图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/143090.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 算法 时间复杂度概念及案例

    算法 时间复杂度概念及案例通过时间复杂度可以判断程序算法过程的优势和劣势,提高运行性能

    2022年5月14日
    52
  • app怎么修改服务器IP地址,怎么修改手机服务器ip地址

    app怎么修改服务器IP地址,怎么修改手机服务器ip地址怎么修改手机服务器ip地址内容精选换一换如果私钥文件丢失了,可以为服务器替换新的密钥对,并使用新的私钥文件连接云手机。以下为替换服务器密钥对的操作指导,请提前在云服务器控制台创建密钥对,并将密钥对对应的私钥文件下载至本地。登录管理控制台。在服务列表页,选择“计算>云手机CPH”。进入云手机页面。进入云手机页面。单击左侧导航栏的“服务器管理”。选择需要修改密钥对的服务器,在本文主要介绍…

    2022年6月29日
    34
  • SpringBoot:简述SpringBoot和Spring的区别

    SpringBoot:简述SpringBoot和Spring的区别SpringBoot:简述SpringBoot和Spring的区别一、Spring的介绍   简而言之,Spring框架为开发Java应用程序提供了全面的基础架构支持。它包含一些很好的功能,如依赖注入和开箱即用的模块,如:SpringJDBCSpringMVCSpringSecuritySpringAOPSpringORMSpring…

    2022年4月28日
    148
  • 怎么修改mysql的表名称_mysql怎么修改表名?「建议收藏」

    怎么修改mysql的表名称_mysql怎么修改表名?「建议收藏」本篇文章将和大家讲述如何快速修改mysql表名,有同样需要的朋友学习一下吧,希望你看后能有所帮助。mysql修改表名的方法:具体步骤:打开cmd->输入“mysql-uroot-p”->输入密码,进入mysql->输入“altertablerenameto/asnew_tablename;”下面的代码包括了创建表的过程:#创建表结构.这样的建表方式,不仅仅是表的结构…

    2022年5月31日
    145
  • @scheduled注解 定时任务控制(Spring响应式编程)

    概念项目经常会用到定时任务,实现定时任务的方式有很多种,参考Spring定时任务的几种实现。在Spring框架中,实现定时任务很简单。常用的实现方式是使用注解@Schedule。@Schedule常用来实现简单的定时任务。例如凌晨1点跑批,每1小时更新订单状态等。非SpringBoot项目springmvc-servlet.xml中添加配置<!–xmlns加入–>…

    2022年4月16日
    162
  • xxxxxxxxxxxxxxxxxxxxxxxxxxxx

    xxxxxxxxxxxxxxxxxxxxxxxxxxxxGetAuthorizationcode:Request:https://accounts.google.com/o/oauth2/v2/auth?redirect_uri=https%3A%2

    2022年7月2日
    49

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号