SPDA-CNN:Unifying Semantic Part Detectiojn and Abstraction for Fine-grained Recognition

来源:互联网 发布:ssc源码论坛 编辑:程序博客网 时间:2024/06/05 03:33

这是2016年发表在CVPR中的一篇有关细粒度分类的文章
1. 引入:
1).细粒度分类的挑战性:微小的视觉差异可能会被其他的因素(如视角、角度等)遮掩。
2).最近有一些CNN-SVM框架的细粒度分类研究工作
思路:利用部件(parts)训练CNN网络,将输入图像中所有部件的特征连接起来输入SVM,得到最终的分类结果。
缺点:训练和测试是一个多阶段的过程。
3).作者提出了两层网络模型:
检测子网络(detection sub-network):检测图像中微小部件
识别子网络(recognition sub-network):提取部件特征,组合起来用以分类
4).作者将以上两个网络集成到了一个框架内

2. 方法
2.1部件检测子网络(Part Detection Sub-network)
2.1.1产生微小部件的区域建议
作者提出了一种基于几何形状的部件区域产生方法:
注意:这是一种标记有bounding box以及部件位置的方法
1).计算目标所在bounding box的方向梯度直方图(HOG),代表其粗糙形状
2).基于HOG特征,利用K近邻,从训练集中挑选出K个最近的邻居(K张图片)
3).标记这里写图片描述
m是每个目标的部件数(训练图像标记有部件)
4).产生区域建议:
1.强先验:根据k个最近邻居的部件类别标签、部件几何限制
K个图像 位置得到给定图像的第i个部件的区域建议位置
每个部件有K个区域建议,所有的部件区域建议:N=k*m
2.弱先验;
仅根据部件几何限制
K个图像 产生N=k*m个区域建议
这里写图片描述
相比于selective search,这种方法利用了先验知识,且产生的区域建议比selective search少一个数量级(eg.200vs2000)

2.1.2基于Faster rcnn的部件检测
以Fater rcnn作为检测网络
每个目标有m个部件,输出每个部件标签(m+1种标签,因为包括背景),每个输出都包括一个回归的bounding box以及置信度得分
对于每一个部件,只有最高置信度得分的部件的bounding box会被选择。并且设置了一个阈值,去除最高得分低于阈值的部件,这是因为有些部件在给定图像中可能并不可见。
2.2部件特征提取以及分类
作者添加了部件区域pooling层(如下图所示的Semantic part ROI pooling),部件级别的全连接层(下图中pfc),以及一个全连接层(cfc)
1).从各个部件pooling特征后按照部件的顺序(如头部、腹部、背部等顺序)进行重新组织。
2).接下来连接一个部件级别的全连接层,主要用于提取部件的特征。
作者是第一个提出在CNN网络的中间层添加部件级别的全连接层,从而提取部件的特征
3).再连接一个全连接层
先前大多数工作利用CNN提取出部件特征后,输入到SVM中。作者提出用一个全连接层代替SVM。相比于CNN-SVM,作者的网络可以从头到尾(end-to-end)的训练及测试。
2.3将两个子网络集成到一个框架
两个子网络共享部分卷积层

总体来讲,这篇文章对于一个给定图像,首先基于Hog,利用KNN检索出最相近的K张图片,根据这K张图片的先验知识,估计出给定图像的部件位置。注意,本文所用的训练数据集是标记有bounding box以及部件位置信息的。估计出图像部件位置后,输入到fast rcnn中检测出更准确的部件位置,以及部件标签。然后将部件提取得到的特征输入到网络中,进行分类。
这篇文章,个人认为最大的缺陷是需要有标签的数据,包括标记的目标bounding box,部件的位置,以及标签。这种训练集需要大量的人工标记,而且本文所提的KNN的区域建议,也是基于很多标记信息,现实中,很难有标记如此详细的训练数据,这为广泛性的应用带来了难度。
整体网络结构如下:
这里写图片描述

0 0