论文:《Deep Supervised Hashing for Fast Image Retrieval》

摘要:

    本文设计了一个CNN架构,它将成对的图像(相似/不相似)作为训练输入,并使每个图像的输出接近离散值(例如+ 1 / -1)。

    对于损失函数,通过对来自输入图像对的监督信息进行编码来最大化输出空间的可辨识性,并且同时对输出值正则化以逼近期望的离散值。
    对于图像检索,查询图像可以很容易地通过网络传播,然后将网络输出量化为二进制代码表示。

    在两个大型数据集CIFAR-10和NUS-WIDE上进行的大量实验显示,与现有技术相比,本文方法具有良好的性能。

介绍:

    在本文中,首先设计一个CNN模型,该模型将图像对和指示两幅图像是否相似的标签作为输入,并将生成二进制代码作为输出,如图1所示。实际上,我们在线的生成图像对,以便在训练阶段可以使用更多的图像对。损失函数被设计用于将相似图像的网络输出拉到一起,并将不相似图像的输出推送到很远的位置,以使得学习到的汉明空间可以很好地逼近图像的语义结构。

    为了避免优化海明空间中的不可微的损失函数,网络输出放宽到实值,同时强制正则化器来使实值输出逼近期望的离散值。

方法:

    本文的目标是学习图像的紧凑二进制编码,以便(1)相似的图像应该在海明空间中编码成类似的二进制编码,反之亦然;(2)可以有效地计算二进制码.

    设Ω是RGB空间,我们的目标是学习从Ω到k位二进制代码的映射:,使得相似的(无论是在视觉上相似还是在语义上相似) 图像被编码成相似的二进制码。为此目的,相似图像的代码应尽可能接近,而不相似图像的代码很远。 基于这个目标,损失函数自然被设计成将相似图像的代码拉到一起,并且将不相似图像的代码彼此分开。

     这里值得注意的是,为了避免崩溃的解决方案,我们的损失函数采取了对比损失形式[7],其中只有那些距离在半径范围内的不同对可以有助于损失函数,损失函数的核心代码如下:

def hashing_loss(image, label, alpha, m):
    D = generate_net.discriminator(image, HASHING_BITS, BATCH_SIZE=BATCH_SIZE)
    # y
    temp_label = tf.matmul(label, label, False, True)
    w_label = tf.to_float(tf.greater_equal(temp_label, 1))
    # p2=||b1-b2||2
    r = tf.reshape(tf.reduce_sum(D * D, 1), [-1, 1])
    p2_distance = r - 2 * tf.matmul(D, D, False, True) + tf.transpose(r)
    # (1-y)*p2+y*max(m-p2,0)
    temp = w_label * p2_distance + (1 - w_label) * tf.maximum(m - p2_distance, 0)
    # || ||b|-1| ||1
    regularizer = tf.reduce_sum(tf.abs(tf.abs(D) - 1))
    d_loss = tf.reduce_sum(temp) / (BATCH_SIZE * (BATCH_SIZE - 1)) + alpha * regularizer / BATCH_SIZE
    # return d_loss, D,w_label
    return d_loss, D

猜你喜欢

转载自blog.csdn.net/m_z_g_y/article/details/80506715