Instance-Aware Hashing for Multi-Label Image Retrieval

提出一种新的深度学习方法,用于多标签图像检索。该方法利用目标检测思想,针对图像中的不同对象生成特定的哈希码,提高了检索精度。

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的数据,作者借用了目标检测的思路,主要过程如下:

  1. 产生object region proposals,和图片一起作为网络的输入。
  2. 使用SPP layer得到每一个region proposal的深度特征。
  3. 计算每个region proposal属于每类的可能性,得到一个 N×C 的矩阵,N代表proposal数目,c代表类别。
  4. 计算每个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。 YRc 并且 Yj{1,0},j=1,....,c 。如果 Yj 等于1,说明第j个label和图像相关,否则不相关。
得到 N×c 的矩阵M以后,其中M的每一行都代表一个c维的向量。作者使用了cross-hypothesis max-pooling的方法把M的每一行融合成一个c维的向量。融合过程如公式(1)所示:

mj=max{M1j,M2j,M3j,......MNj},j=1,.....,c(1)

mj 是第j类的经过max-pooling以后的值。使用 mj ,计算每类的可能性分布 p=(p1,p2,p3,.....pn) ,如公式(2)所示:
pj=exp(mj)ck=1exp(mk)(2)

pj 表示图片包含第j类物体的可能性。如果第i个proposal属于第j类, pj 的值应该很大, Mij 也应该有一个大的值。在得到每类的可能性分布以后,可以得到目标检测是否正确的损失函数:
lc=jc+1|c+|log(pj)(3)

c+ 表示输入图片属于类别集合, |c+| 表示集合中的数目。损失函数和softmax-loss相似。损失函数关于 mj 的导数如公式(4)所示:
lcmj={pj1|c+|,ifYj=1pj,ifYj=0(4)

通过以上公式,可以得到可能性矩阵P。
Pij=exp(Mij)ck=1exp(Mik)(i=1,...N)(5)

Pij 表示第i个region proposal包含第j类物体的概率。

Hash coding Module

spp layer使用N*d的特征矩阵D作为输入,通过全连接层把 Di 映射到b-dim的向量 HiRb(i=1,2,...,N) Hi 与第i个proposal相对应。上述矩阵D可以得到 N×b 的矩阵H。下一步的操作就是根据可能性矩阵P和矩阵H融合起来。P是一个 N×c 的矩阵。两个矩阵进行以下公式的操作:

f=1Ni=1NPiHi,(6)

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 ,最终得到b(I)=(b(1)(I),b(2)(I),b(3)(I),......b(c)(I))
作者使用的损失函数为三元组损失,一个三元组包括一个属于同样类别的正样本,一个属于不同类别的负样本。对于第j类的三元组,损失函数如公式(7)所示:

lTriplet(f(j)(I)f(j)(I+),f(j)(I)=max(0,1||f(j)(I)f(j)(I)||22+||f(j)(I)f(j)(I+)||22),(7)

损失函数保证,相似的图片之间的hash code之间的距离小于不相似图片之间的hash code的距离。目标函数关于 f(j)(I)f(j)(I+),f(j)(I) 的导数如公式(8)所示:
lTriplet(f(j)(I)f(j)(I+),f(j)(I)f(j)(I)=2(f(j)(I)f(j)(I+))lTriplet(f(j)(I)f(j)(I+),f(j)(I)f(j)(I+)=2(f(j)(I+)f(j)(I))lTriplet(f(j)(I)f(j)(I+),f(j)(I)f(j)(I)=2(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

Frequency - Aware Transformer 在学习型图像压缩中具有重要的应用。学习型图像压缩旨在利用深度学习技术来实现高效的图像压缩,而 Frequency - Aware Transformer 为这一领域带来了新的思路和方法。 Transformer 架构本身具有强大的建模长距离依赖关系的能力,在自然语言处理等领域取得了巨大成功。在图像压缩中,Frequency - Aware Transformer 能够关注图像的频率信息。图像的频率信息包含了图像的纹理、细节等特征,不同频率成分对图像的视觉感知和压缩性能有着不同的影响。 Frequency - Aware Transformer 可以通过对图像的频率成分进行分析和处理,更好地捕捉图像的特征分布。例如,在低频部分,它可以更有效地保留图像的整体结构和主要信息;在高频部分,它能够对图像的细节和纹理进行精细建模,从而在压缩过程中根据不同频率成分的重要性进行有针对性的处理,提高压缩效率和重建图像的质量。 在编码阶段,Frequency - Aware Transformer 可以将图像转换到频率域,对频率系数进行编码。通过学习频率系数之间的关系,它能够生成更紧凑的表示,减少数据量。在解码阶段,利用学到的频率信息和模型参数,将编码后的信息还原为图像。 以下是一个简单的伪代码示例,展示 Frequency - Aware Transformer 在图像压缩中的大致流程: ```python import torch import torch.nn as nn # 定义 Frequency - Aware Transformer 模块 class FrequencyAwareTransformer(nn.Module): def __init__(self, d_model, nhead, num_layers): super(FrequencyAwareTransformer, self).__init__() self.transformer_encoder = nn.TransformerEncoder( nn.TransformerEncoderLayer(d_model=d_model, nhead=nhead), num_layers=num_layers ) def forward(self, x): # 假设 x 是图像的频率系数 encoded = self.transformer_encoder(x) return encoded # 模拟图像压缩过程 def image_compression(image): # 将图像转换到频率域(这里简化为示例) frequency_coefficients = torch.fft.fft2(image) # 调整频率系数的形状以适应 Transformer 输入 frequency_coefficients = frequency_coefficients.view(-1, frequency_coefficients.size(-1)) # 初始化 Frequency - Aware Transformer fat = FrequencyAwareTransformer(d_model=256, nhead=8, num_layers=6) # 编码频率系数 encoded_coefficients = fat(frequency_coefficients) # 这里可以添加量化和熵编码步骤来进一步压缩数据 # 为了简化,省略这些步骤 return encoded_coefficients # 示例图像 image = torch.randn(256, 256) compressed = image_compression(image) print(compressed.shape) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值