【0 Abstract】
由于找出判别特征比较困难,细粒度图像分类具有挑战性。找到完全表征对象的那些细微特征并不简单。为了处理这种情况,文章提出了一种新颖的自监督(self-supervision )机制,可以有效地定位信息区域而无需边界框/部分注释(bounding box/part annotations)。
提出的模型,称为Navigator-Teacher-Scrutinizer Network(NTS-Net),由Navigator(导航) agent,Teacher agent和Scrutinizer agent(监察)组成。考虑到informativeness of the regions(区域信息性)与ground-truth class概率之间的内在一致性,设计了一种新颖的训练机制,(各部分作用)使Navigator能够在Teacher的指导下检测大部分信息区域(informative regions)。之后,Scrutinizer仔细检查Navigator中建议区域(proposed regions)并进行预测。
文章提出的模型可以被视为一种多代理合作(multi-agent cooperation),其中agents彼此相互受益,共同进步。 NTS-Net可以端到端地进行训练,同时在推理过程中提供准确的细粒度分类预测以及更大的信息区域。
【1 Introduction】
细粒度分类旨在区分同一超类的从属类(subordinate classes),例如, 区分野生鸟类,汽车模型等。 挑战来源于找出信息区域(informative regions)和提取其中的判别特征(discriminative features)。因此,细粒度分类的关键在于开发自动方法以准确识别图像中的信息区域。
1.1 Previous works
监督学习:利用细粒度的人工注释,如bird classification中鸟类部分的注释。虽然取得了不错的结果,但它们所需的细粒度人工注释代价昂贵,使得这些方法在实践中不太适用。
无监督学习:学习规则定位信息区域,不需要昂贵的注释,但缺乏保证模型聚焦于正确区域的机制,这通常会导致精度降低。
文章提出了一种新颖的自监督(self-supervision )机制,可以有效地定位信息区域而无需边界框/部分注释(bounding box/part annotations)。开发的模型称为NTS-Net,采用multi-agent cooperative(多agent合作)学习方法来解决准确识别图像中的信息区域的问题。 直观地,被赋予地ground-truth class的概率较高的区域应该包含更多的对象特征语义,从而增强整个图像的分类性能。 因此,设计了一种新的损失函数来优化每个选定区域的信息量,使其具有与概率为ground-truth class相同的顺序,并且我们将完整图像的ground-truth class作为区域的ground-truth class。
1.2 概括阐述self-supervision机制
NTS-Net由Navigator agent,Teacher agent和Scrutinizer agent组成。
①Navigator导航模型以关注最具信息性的区域:对于图像中的每个区域,Navigator预测区域的信息量,并使用预测来提出(propose)信息量最大的区域。
②Teacher评估Navigator建议的区域并提供反馈:对于每个建议区域(proposed region),Teacher评估其属于ground-truth class的概率;置信度(confidence)评估指导Navigator使用新颖的排序一致(ordering-consistent)损失函数来提出更多信息区域。
③Scrutinizer仔细检查Navigator中建议区域并完成细粒度分类:每个建议区域被放大到相同的大小,并且Scrutinizer提取其中的特征;区域特征和整个图像的特征被联合处理,以完成细粒度分类。
总的来说,本文的方法可以被视为强化学习(reinforcement learning)中的actor-critic[21]机制,其中Navigator是actor,Teacher是critic。通过Teacher提供的更精确的监督,Navigator将定位更多信息区域,这反过来将有利于Teacher。因此,agents共同进步并最终得到一个模型,该模型提供准确的细粒度分类预测以及更大的信息区域。
下图是模型的概览。
【2 Methods】
2.1 Approach Overview
本文方法依赖于一个假设,即信息区域有助于更好地表征对象,因此融合信息区域和全图像的特征将获得更好的性能。 因此,目标是定位对象的信息最丰富的区域(localize the most informative regions)。
信息量较大的区域应该有更高的置信度。The following condition should hold:
使用Navigator网络来近似信息函数(information function)I 和Teacher网络来近似置信度函数(confidence function)C.
Navigator网络评估其信息性I(Ri),Teacher网络评估其置信度C(Ri)。 为了满足Condition1,我们优化Navigator网络使 {I(R1),I(R2),...,I(RM)} 和 {C(R1),C(R2),..., C(RM)} 具有相同的顺序。
随着Navigator网络根据Teacher网络的改进,它将产生更多信息区域,以帮助Scrutinizer网络产生更好的细粒度分类结果。
2.2 Navigator and Teacher
导航到可能的信息区域可被视为区域建议问题,已进行了广泛研究。 其中大多数都基于滑动窗口搜索(sliding-windows search)机制。 Shaoqing Ren, Kaiming He等人引入了一种新颖的区域建议网络(RPN),它与分类器共享卷积层并减轻计算建议的边际成本。他们使用anchors来同时预测多个区域建议。每个anchor与滑动窗口的位置、纵横比(aspect ratio)和箱尺度(box scale)相关联。
受anchors概念的启发,文章的Navigator network将图像作为输入,并产生一堆矩形区域{R’1, R’2, ... R’A},每个都有一个表示该区域信息量的分数(图2显示了anchors的设计)。对于大小为448的输入图像X,我们选择具有大小{48,96,192}和比率{1:1, 3:2, 2:3}的anchors,然后Navigator network将生成一个表示所有anchors的信息量的列表。 我们按照下面式子中的信息列表进行排序。 其中A是anchors的数量,I(Ri)是排序信息列表中的第i个元素。
为了减少区域冗余,根据其信息量对区域采用non-maximum suppression(NMS)。 然后我们采取前M个信息区域{R1, R2, ... RM}并将它们输入Teacher network以获得{C(R1), C(R2)), ... C(RM)}。 图3显示了M = 3的概述,其中M表示用于训练Navigator network的区域数量的超参数。 我们优化Navigator network使{I(R1), I(R2), ... I(RM)}和{C(R1), C(R2)), ... C(RM)}具有相同的顺序。 每个建议区域通过最小化ground-truth class和predicted confidence之间的交叉熵损失(cross-entropy)来用于优化Teacher。
-----关于NMS非极大值抑制-----
非极大值抑制(Non-Maximum Suppressi on,NMS),顾名思义就是抑制不是极大值的元素,可以理解为局部最大搜索。这个局部代表的是一个邻域,邻域有两个参数可变,一是邻域的维数,二是邻域的大小。这里不讨论通用的NMS算法(参考论文《Efficient Non-Maximum Suppression》对1维和2维数据的NMS实现),而是用于目标检测中提取分数最高的窗口的。例如在行人检测中,滑动窗口经提取特征,经分类器分类识别后,每个窗口都会得到一个分数。但是滑动窗口会导致很多窗口与其他窗口存在包含或者大部分交叉的情况。这时就需要用到NMS来选取那些邻域里分数最高(是行人的概率最大),并且抑制那些分数低的窗口。
对于Bounding Box的列表B及其对应的置信度S,采用下面的计算方式.选择具有最大score的检测框M,将其从B集合中移除并加入到最终的检测结果D中.通常将B中剩余检测框中与M的IoU大于阈值Nt的框从B中移除.重复这个过程,直到B为空.
重叠率(重叠区域面积比例IOU)阈值
常用的阈值是 0.3 ~ 0.5.
其中用到排序,可以按照右下角的坐标排序或者面积排序,也可以是通过SVM等分类器得到的得分或概率,R-CNN中就是按得分进行的排序.
举例:
就像上面的图片一样,定位一个车辆,最后算法就找出了一堆的方框,我们需要判别哪些矩形框是没用的。非极大值抑制的方法是:先假设有6个矩形框,根据分类器的类别分类概率做排序,假设从小到大属于车辆的概率 分别为A、B、C、D、E、F。
(1)从最大概率矩形框F开始,分别判断A~E与F的重叠度IOU是否大于某个设定的阈值;
(2)假设B、D与F的重叠度超过阈值,那么就扔掉B、D;并标记第一个矩形框F,是我们保留下来的。
(3)从剩下的矩形框A、C、E中,选择概率最大的E,然后判断E与A、C的重叠度,重叠度大于一定的阈值,那么就扔掉;并标记E是我们保留下来的第二个矩形框。
就这样一直重复,找到所有被保留下来的矩形框。
-----------------------------------------------------------------
2.3 Scrutinizer
随着Navigator network逐渐收敛,它将产生信息性的对象特征区域,以帮助Scrutinizer network做出决策。 我们使用前K个信息区域与完整图像相结合作为输入来训练Scrutinizer network。 换句话说,那些K个区域用于促进细粒度识别。 图4证明了该过程,其中K = 3。Michael Lam等人 [25]表示,使用信息区域可以减少类内差异,并可能在正确的标签上产生更高的置信度。
该网络主体分为三个组件:Navigator、Teacher、Scrutinizer
1) Navigator:类似于Feature Pyramid Networks(FPN)结构,在不同尺度Feature maps上生成多个候选框,每个候选框的坐标与预先设计好的Anchors相对应。Navigator做的就是给每一个候选区域的“信息量”打分,信息量大的区域分数高。
2) Teacher:就是普通的Feature extractor + FC + softmax,判断输入区域属于target lable的概率。
3) Scrutinizer:就是一个全连接层,输入是把“各个局部区域和全图提取出来的logits”concatenate到一起的一个长向量,输出对应200个类别的Logits。
【流程】★★★
1)尺寸(448,448,3)的原图进入网络,进过Resnet-50提取特征以后,得到:
一个(14,14,2048)的Feature map
还有一个经过Global Pooling之后2048维的Feature Vector
一个经过Global Pooling+ FC之后200维的Logits
2)将提取的特征图经过FPN网络得到三种尺度 [(14,14)(7,7)(4,4)] 的特征图。预设的FPN在(14,14)(7,7)(4,4)这三种尺度上根据不同的size, aspect ration生成对应的Anchors,一共1614个。(14,7,4三个尺度特征图的每个点分别有6,6,9个anchor框。14*14*6+7*7*6+4*4*9)
3)用步骤1中的Feature map,到Navigator中打分,用NMS根据打分结果只保留N个信息量最多的局部候选框。
4)把那N个局部区域双线性插值到(224,224),输入Teacher网络,得到这些局部区域的Feature vector和Logits。
5)把步骤1和4中的全图Feature vector和局部Feature vector给concatenate在一起,之后接FC层,得到联合分类Logits用于最终决策。
LOSS
1)普通的Cross-Entropy:步骤1中的全图logits, 步骤4中的part logits,步骤5中的concat logits都用label进行最简单的监督。
2)Ranking Loss: 步骤3中的信息量打分需要用步骤4中的分类概率进行监督,即对于4中的判断的属于目标label概率高的局部区域,必须在3中判断的信息量也高。
Navigator Loss:
Navigator网络预测的M个信息区域为 ,对应的信息为 ,Teacher网络预测的置信度为 。
Teacher Loss:
C表示置信度函数,将region预测成类别概率,第一项是所有区域交叉熵损失的求和,第二项为整张图像(full image)的交叉熵损失。
Scrutinizing loss:使用交叉熵损失来作为分类损失
Joint training algorithm:
LOSS
Navigation loss:
R = {R 1 , R 2 , . . . , R M}:表示由navigator预测的前M个最有信息量的区域,I = {I 1 , I 2 , . . . , I M}:表示其信息量
C = {C 1 , C 2 , . . . , C M}:表示由teacher网络预测的confidence
其中 I i = I ( R i )
函数 f:hinge loss function
Teaching loss
交叉熵
Scrutinizing loss
navigator网络得到K个最有信息量的regions {R 1 , R 2 , . . . , R K}
Scrutinizer网络做出细粒度分类结果 P = S ( X , R 1 , R 2 , . . . , R K )
loss为交叉熵损失:
实验过程
train.py文件中
①读入img和label
img是一个4维tensor [8 3 448 448]
label [8]
②这张图片传入到net中
返回 raw_logits, concat_logits, part_logits, _, top_n_prob = net(img)
torch.Size([8, 200]) torch.Size([8, 200]) torch.Size([8, 200])
③计算损失
①读img和label
②这张图传到net中,返回concat_logits
③计算loss