Instance-Aware Hashing for Multi-Label Image Retrieval
出版源:《IEEE Transactions on Image Processing》, 2016, 25(6):1-1
论文下载地址
Introduce
本篇论文是发表在TIP的工作,主要讲述了深度学习在多目标数据集上生成hash code上的应用。深度学习用到的监督信息主要来源于人工标注,但是人工标注很主要取决于图像中的目标,比如说标注为狗的图片,可能只有狗这个部分是有用信息,其他的背景信息则忽略。之前的deep hash方法,都是单张图片生成一串hash code(semantic hash)。对于单label的数据集,图片中可能就是一个物体,单张图片生成一串hash code,对检索效果影响不大。但是在Multi-Label的数据集中,一张图片可能存在多个object,对应着不同的label,单纯的将不同数目object的图片生成相同长度的hash code,作者认为这是次最优的,论文没有解释为什么次最优的原因,这里我也有疑问。
对多label的数据,作者借用了目标检测的思路,主要过程如下:
- 产生object region proposals,和图片一起作为网络的输入。
- 使用SPP layer得到每一个region proposal的深度特征。
- 计算每个region proposal属于每类的可能性,得到一个 N×C 的矩阵,N代表proposal数目,c代表类别。
- 计算每个region proposal的hash code。
整个网络的结构如图所示:
The Proposed Method
Region Proposal的方法主要有Constrained Parametric Min-Cuts(CPMC), Seletive Search, Multi-scale Combinatorial Grouping(MCG),Geodesic Object Proposals(GOP)等方法,与通用的目标检测不同的是,本文作者采用了GOP这种方法,从原始的每张图片中提取超过1K个region proposals。为了减少重复计算区域的特征,作者借鉴SPPNet的方法,添加spp layer,一次输入一张图片,然后在spp layer中通过max pooling得到每一个region proposal的特征。假设输入N个region proposal,通过spp layer得到d-dim的特征,那么对于整个图片,会得到 N×d 的矩阵。论文中,使用GoogleNet。
Label Propobility Calculation Module
从ssp layer得到
N×d
的矩阵,spp layer跟着一个全连接层,压缩成一个
N×c
的矩阵,c代表目标的类别。
Pi=(Pi1,Pi2,Pi3,......Pic)
是可能性的向量,
Pij
表示图片包含j-th类的可能性。与目标检测任务不同,目标检测的训练集中有每一个region proposal的ground truth,但是在hash任务中,只有每个图片属于哪些类,可以通过这个信息得到一个pair
(I,Y)
。I代表了一幅图片,Y是图片的ground truth label。
Y∈Rc
并且
Yj∈{1,0},j=1,....,c
。如果
Yj
等于1,说明第j个label和图像相关,否则不相关。
得到
N×c
的矩阵M以后,其中M的每一行都代表一个c维的向量。作者使用了cross-hypothesis max-pooling的方法把M的每一行融合成一个c维的向量。融合过程如公式(1)所示:
mj 是第j类的经过max-pooling以后的值。使用 mj ,计算每类的可能性分布 p=(p1,p2,p3,.....,pn) ,如公式(2)所示:
pj 表示图片包含第j类物体的可能性。如果第i个proposal属于第j类, pj 的值应该很大, Mij 也应该有一个大的值。在得到每类的可能性分布以后,可以得到目标检测是否正确的损失函数:
c+ 表示输入图片属于类别集合, |c+| 表示集合中的数目。损失函数和softmax-loss相似。损失函数关于 mj 的导数如公式(4)所示:
通过以上公式,可以得到可能性矩阵P。
Pij 表示第i个region proposal包含第j类物体的概率。
Hash coding Module
spp layer使用N*d的特征矩阵D作为输入,通过全连接层把
Di
映射到b-dim的向量
Hi∈Rb(i=1,2,...,N)
,
Hi
与第i个proposal相对应。上述矩阵D可以得到
N×b
的矩阵H。下一步的操作就是根据可能性矩阵P和矩阵H融合起来。P是一个
N×c
的矩阵。两个矩阵进行以下公式的操作:
Hi,Pi 分别代表H,P的第i行。 ⨂ 代表Kronecker Product。Kronecker Product是一个如下所示的 c×b 的vector。
假设
f=(f(1),f(2),f(3),.......f(c))
。矩阵f的每列是b维的向量,使用sgn函数进行二值化,就可以得到b位的hash code。对一幅图像
I
,最终得到
作者使用的损失函数为三元组损失,一个三元组包括一个属于同样类别的正样本,一个属于不同类别的负样本。对于第j类的三元组,损失函数如公式(7)所示:
损失函数保证,相似的图片之间的hash code之间的距离小于不相似图片之间的hash code的距离。目标函数关于 f(j)(I),f(j)(I+),f(j)(I−) 的导数如公式(8)所示:
当 1−||f(j)(I)−f(j)(I−)||22+||f(j)(I)−f(j)(I+)||22|| 小于等于0的时候,所有的偏导数都等于0。
当实现semantic hash的时候,如图1所示,将f矩阵通过全连接映射到q维的向量,通过二值化,得到hash code。在semantic hash中,作者同样采用了三元组损失函数,具体推导过程如上面类似。
Retrieval
对于训练集,每张图片得到属于某些类的概率,选取阈值大于0.2的类,生成hash code。最后每类会得到一个hash 表,存储包含该类的图片的hash code。检索的时候,查询图片也会得到每类的概率,选取阈值大于0.2的类别,用hash code和待检索对应类的hash code作内积操作,根据距离大小,返回检索的结果。
Experiment
作者选取了VOC07,VOC12和MIRFILCKR-25K作为数据集进行训练,其中每类数据集的选取方式如表所示:
作者在论文中,使用了四种评价标准,主要是NDGG,ACG,MAP和加权MAP。实验结果如下图所示:
Conclusion
本文巧妙的应用了目标识别的技巧到deep hash上来,在多类别的数据集上检测取得了不错的效果。但是个人觉得,这种方法同样存在缺陷,如果对于小的图片,受目标识别算法的影响效果会很差。并且对于蓝天白云,公园这种目标不明确的图片,很难进行识别。不过瑕不掩瑜,方法迁移的idea还是值得学习,从实验结果来看,的确有了明显的提升。
Reference
Hanjiang Lai, Pan Yan, Xiangbo Shu,Yunchao Wei, Shuicheng Yan Instance-Aware Hashing for Multi-Label Image Retrieval TIP2016