Picking Deep Filter Responses for Fine-grained Image Recognition

https://blog.csdn.net/cyiano/article/details/71629754

原文章: Picking Deep Filter Responses for Fine-grained Image Recognition(CVPR2016)

摘要: 细粒度图像识别一直以来都是极具挑战性的任务。大多数细粒度图像识别算法都基于object和part级别的标注,来提高识别的准确率。文章提出了一种不需要任何object和part级别的标注的细粒度识别网络,并在CUB-200-2011上进行识别验证,并取得了很好的效果。

1 简介

1.1 背景

  • 细粒度图像识别指的是在一个大类中的数个子类进行识别(例如识别不同鸟类的种类),它介于basic-level分类(常规的图像分类)和individual instances识别(人脸检测)之间。一个普通人对于前者可以很好地识别,但后者往往需要大量的专业知识,才能从一些细微的地方进行区分,没有接受过专业培训的人是很难做到的。
  • 为了实现细粒度图像识别,大多数工作在训练和测试时都需要object或者part级别的标注,这些标注等于是告诉了网络需要从哪里寻找识别的突破口。有一些工作在测试时不额外使用标注,但是在训练阶段还是需要大量的带标注的图像,并且在大尺度图像识别时显得很吃力。因此,现在人们开始探索完全不使用标注的识别网络,但经常会面临需要从头开始训练网络、复杂度优化等问题。

1.2 文章贡献

  • 作者做了两大贡献。第一个是提出了新颖的自动part detection方法,这个part检测方法有两点贡献:
    • 第一,提出了新颖的检测学习初始化方法。作者先用原始的selective search方法提取一些patch,将它们送入VGG-M网络,查看conv4的输出。结果发现有些通道(channle)对一些特定图案相应,而有些响应十分混乱,对我们的任务没有帮助(见Figure 1)。作者的初始化方式的关键点就在于精巧地选择响应显著且一致的deep filters。
      image.png-243.3kB
    • 第二,作者“learn a set of detectors via iteratively per-category positive sample mining and regularized part model retraining”(翻译不来……)。作者从每个类别挖掘正样本,并对每个正样本引进正则项,以考虑正样本的异同。学习之后的检测器可以发现有区别的和一致的patch,这对基于part的识别有帮助。
  • 第二大贡献,是采用了新的适用于细粒度图像识别的特征提取方法。传统的特征表达都使用CNN来实现,但CNN来提取不可避免地包含了大量背景信息,而且一些姿势变化和部分重叠都会影响到检测和识别。为了解决这个问题,作者将deep filter响应视为用于定位的描述符,将其通过Spatially Weighted Fisher Vector (SWFV-CNN)编码。通过SWFV-CNN,对识别很重要的部分会被强调,这样就可以实现让网络有条件地选择那些需要的描述符。

1.3 框架预览

  • 整个框架结构如下。该框架的实现总共分两步:
    • 第一步是挑选出那些对特定图像响应明显且一致的deep filters,它们就作为weak detectors了。经过weak detectors后可以得到很多patch,从中精巧地选择语义上相似的正样本并训练discriminative detectors。选择正样本和训练分类器是迭代交替地进行的,其中每步都使用交叉验证以防止过拟合。训练后的discriminative detectors可以用来发现一些有助于识别的部分。
    • 第二步是通过SWFV挑选出有用的CNN filters。其中使用到了一个叫part saliency map的东西,它表明了一个像素属于前景部分的可能性有多大。
      image.png-310.5kB

2 相关工作

  • 该部分从Part Localization和Feature Representation两个方面介绍过去的工作。有兴趣的可以看原文,这里不再赘述了。

3 学习Part Detectors

本章开始出现了大量新奇的方法,因此可能有较多不易理解的地方,博主也没能做到完全理解。在此就将我所看懂的说一下,希望能够对大家有帮助,如果看不懂,建议对着此博客看原文。
  • 1
  • 本章介绍了如何训练一个能够自动发现object/part的discriminative detectors。作者的方法分为三步走:初始化正样本,正则化检测器的训练,和检测器选择。

3.1 Picking Filters:初始化正样本

  • 假设将一组输入图片剪成一堆同尺寸的patch,如何在没有标签的情况下找出那些含有前景关键信息的patch?这种无监督聚类的任务,一般都是通过k-means或template matching实现,但它们难以返回很好的cluster,而且一个cluster里面的patch也不一定在视觉上相似。
  • 为了解决上面的问题,作者提出了一种挑选策略,它是基于CNN网络中滤波器的响应来选择那些一致和有区别的patch的。关键点在于CNN不同层对不同特定的图案敏感:例如浅层的通常对边缘连接、拐角等有相应,而深层则对一些特定图案有响应,这些“特定图案”很可能就包含鸟类嘴、躯干、脚等信息。为了寻找那些对关键信息有响应的滤波器,作者用以下方法进行挑选:
    • 首先,假设你的手头上有数百、数千张鸟类图像。对所有图像都进行一遍selective search,生成很多region proposals。从中随机选取1百万张,每张图都称之为patch。
    • 每个patch都缩放到107*107,送入网络。由于网络中有卷积、池化等操作,最后第四个卷积层的输出大小只有1*1(但还是有64个通道)。换句话说,每个patch生成了64个值。
    • 将这么多图像这么多通道的值进行排序,然后选出前10k个最大的(响应最高的),然后再反过来看看这些值(或者说响应)对应的是哪个通道。
    • 算一算64个通道每个通道被前10k个响应“选中”了多少次,于是就有了Figure3的柱状图。从图中可以看出,高频响应的通道数很少很少,前5%的通道包含了90%的响应。作者将这些通道称作distinctive filters,它们对一些特定图案响应明显。在文章中,作者选择包含了90%的响应的通道作为distinctive filters(也就是前5%的通道),然后对于每个distinctive filters,选择前100个响应高的patch作为初始正样本。
      image.png-50kB
  • 现在回想一下上面的步骤,其实还是有一定道理的。想想看,在那么多张patch里面,前景(也就是鸟)的头、眼睛、躯干、腿等部分的图案差不多都是一致的,而相比之下背景就比较混乱。需要注意的是,虽然含有前景的图像比不含前景的图像少,但是不含前景的图像中图案一致的部分太少了,而前景的图案基本都一样。在经过CNN输出后,如果有的滤波器通道已经被训练为对鸟类局部区域敏感,那么多patch跑一遍(这里面有鸟类部分的比例相当大),肯定会有某些通道响应次数特别高,这些通道就是我们需要的distinctive filters。高响应次数的通道很少,也说明CNN对一个patch的响应本身就是很稀疏的,一个patch可能只有两三个通道相应比较高。在反观背景,由于不同图片的背景都不大一样,有的是树上有的是天空,所以那些响应次数相对不高,且分布均匀的,很可能都是对背景等杂物敏感的通道了。
  • 扯了这么多,最后总结一下,这一步成功地找出了一批正样本(即含有前景的patch),还顺便为你挑选好了一些滤波器中有用的通道,称之为distinctive filters。

3.2 正则化的检测器训练

  • 上一步得到的正样本还不够好,patch还是出现了很多无用的背景(见Figure4),为了进一步提高检测正样本的质量,作者通过优化一个SVM分类器来学习对应的检测器。由于负样本的数量远大于正样本,因此采用standard hard negative mining方法,可以实现快速收敛。
    image.png-405.5kB
  • 作者用迭代的方式训练SVM。在每轮迭代中,前10%的由上一轮检测器生成的patch作为正样本(按照这个意思可能其他的都是负样本了)。一直执行这个训练可能会出现对初始样本过拟合的问题。作者选择的解决方案是将训练集随机分成两组,一个作为训练集,一个作为验证集,并且在收敛时互相交换。
  • 除此之外,还有一个问题就是:分类效果最好的检测器总是锁定几个容易检测的子类,而不能从其他大多数子类中发现它们对应的正样本。为了解决这个问题,作者在每轮训练中都使用正则化损失来挖掘每个目录中的正样本。具体的正则化过程就不详述了(博主也没看明白),总之正则化项突出了得分高的patch,而屏蔽得分低的patch。正则化项有两个好处:其一是使检测器发现更多不同的正样本,其二是避免了在一个不可靠的正样本上过拟合,转而关注更可靠的正样本(focusing on the more reliable positives)。该部分的完整算法见下图:
    image.png-59.9kB

3.3 检测器选择

  • 3.2的算法会生成数十个检测器(为什么是好几个??!!),但不保证其中每个都能准确识别图像。作者将带标签的训练样本分成训练集和验证集,“classification is performed based on the top scored region”。最后抛弃识别率低于40%的检测器,留下来的只有几个(<10)。

3.4 小结

  • 本章的内容实在太多了,其中提出的很多方法个人在之前从未见过,而且有很多细节也不太明白。先在此总结一下图案检测器的训练全过程,理清一下思路:
    • 首先,找到CNN中哪些通道的滤波器对特定图案响应明显,这些被选中的滤波器称作distinctive filters。再根据这些distinctive filters的响应大小选出响应最大的前100个patch作为初始正样本;
    • 接着,根据这些初始正样本,结合SVM来训练检测器。其中正则化项和hard negative mining的使用增加了正样本的多样性和稳定性。最后,生成了数十个检测器;
    • 用带标签的训练样本测试检测器,筛选出前几个识别准确率最高的检测器。

4 Bag of Parts Image Representation

  • 得到上一章生成的检测器后,我们就可以用这些检测器从图片中检测到相应的部件。一种常用的部件表达方式是提取倒数第二个全连接层的特性,但此方法在细粒度识别中有两个缺点:带进了大量背景信息,以及可能会丢失关键细节。于是作者提出提出一个新方法,通过计算part saliency map以及用SWFV池化CNN特征来找到关键的识别信息。

5 实验

image.png-97kB
image.png-54.3kB

猜你喜欢

转载自blog.csdn.net/zsx1713366249/article/details/82937118