深度排名比较两个图像

哈Ha! 我向您介绍了Akarsh Zingade撰写的文章“使用深度排名的图像相似性”的翻译。

深度排名算法


没有介绍“ 两个图像的相似性 ”的概念,因此让我们至少在本文的框架内介绍这个概念。

两个图像的相似性是根据某些标准比较两个图像的结果。 它的定量度量确定了两个图像的强度图之间的相似程度。 使用相似性度量,比较描述图像的某些特征。 汉明距离,欧几里得距离,曼哈顿距离等是相似度的度量。

深度排名 -研究细粒度的图像相似度,使用一组三元组表征精细划分的图像相似度比率。

什么是三胞胎?


三元组包含请求图像,正图像和负图像。 正图像比负图像更像是请求图像。

一组三元组的示例:

图片

第一,第二和第三行对应于请求的图像。 第二行(正图像)比第三行(负图像)更像是请求图像。

深度排名网络架构


该网络由3部分组成:三重采样,ConvNet和排名层。
网络接受三张图像作为输入。 一个图像三元组包含一个请求图像 $内联$ p_i $内联$ 正面形象 $内联$ p_i ^ + $内联$ 和负面形象 $ inline $ p_i ^-$ inline $ 它们独立地传输到三个相同的深度神经网络。

最顶层的层-评估三元组损失函数。 为了最小化损失函数,在较低层中纠正了该错误。
图片

现在让我们仔细看一下中间层:

图片

ConvNet可以是任何深度神经网络(本文将讨论卷积神经网络VGG16的实现之一)。 ConvNet包含卷积层,最大池层,本地规范化层和完全连接的层。
其他两个部分以降低的采样率接收图像,并执行卷积阶段和最大池化。 接下来,进行这三个部分的归一化阶段,最后将它们与线性层合并,随后进行归一化。

三重态形成


有多种方法可以创建三元组文件,例如,使用专家评估。 但是本文将使用以下算法:

  1. 类中的每个图像都构成一个请求图像。
  2. 除请求图像外,每个图像都将形成正图像。 但是您可以限制每个图像请求的正图像数量
  3. 从不是请求图像类别的任何类别中随机选择一个负图像

三重损失功能


目标是训练一种功能,该功能为最相似的图像分配一个较小的距离,为不同的图像分配一个较大的距离。 可以表示为:
图片
其中l是三元组的损耗系数, g是两对图像之间距离之间的间隙系数:( $内联$ p_i $内联$ , $内联$ p_i ^ + $内联$ )和( $内联$ p_i $内联$ , $ inline $ p_i ^-$ inline $ ), f-将图片显示在矢量中的嵌入功能, $内联$ p_i $内联$ 是请求的图像, $内联$ p_i ^ + $内联$ 是正面形象, $ inline $ p_i ^-$ inline $ 是负像, D是两个欧几里得点之间的欧几里得距离。

深度排名算法实现


与Keras一起实施。

三个并行网络用于查询正图像和负图像。

该实现包括三个主要部分:

  1. 三种并行多尺度神经网络的实现
  2. 损失函数的实现
  3. 三重态产生

学习三个并行的深度网络将消耗大量的内存资源。 代替接收请求图像,正图像和负图像的三个并行深度网络,这些图像将被顺序地馈送到神经网络输入处的一个深度神经网络。 传递到损失层的张量将在每行中包含一个图像附件。 每行对应于分组中的每个输入图像。 由于请求图像,正图像和负图像是顺序发送的,因此第一行将与请求图像相对应,第二行将与正图像相对应,第三行将与负图像相对应,然后重复直到包结束。 因此,排名层接收所有图像的嵌入。 之后,计算损失函数。

要实现排名层,我们需要编写自己的损失函数,该函数将计算请求图像和正图像之间的欧几里得距离,以及请求图像和负图像之间的欧几里得距离。

损失计算功能的实现
_EPSILON = K.epsilon() def _loss_tensor(y_true, y_pred): y_pred = K.clip(y_pred, _EPSILON, 1.0-_EPSILON) loss = tf.convert_to_tensor(0,dtype=tf.float32) # initialise the loss variable to zero g = tf.constant(1.0, shape=[1], dtype=tf.float32) # set the value for constant 'g' for i in range(0,batch_size,3): try: q_embedding = y_pred[i+0] # procure the embedding for query image p_embedding = y_pred[i+1] # procure the embedding for positive image n_embedding = y_pred[i+2] # procure the embedding for negative image D_q_p = K.sqrt(K.sum((q_embedding - p_embedding)**2)) # calculate the euclidean distance between query image and positive image D_q_n = K.sqrt(K.sum((q_embedding - n_embedding)**2)) # calculate the euclidean distance between query image and negative image loss = (loss + g + D_q_p - D_q_n ) # accumulate the loss for each triplet except: continue loss = loss/(batch_size/3) # Average out the loss zero = tf.constant(0.0, shape=[1], dtype=tf.float32) return tf.maximum(loss,zero) 


数据包大小应始终为3的倍数。由于三元组包含3张图像,并且三元组图像按顺序传输(我们将每个图像按顺序发送到深度神经网络)

其余代码在这里

参考文献
[1]局部尺度不变特征的物体识别-www.cs.ubc.ca/~lowe/papers/iccv99.pdf

[2]用于人类检测的定向梯度直方图-course.engr.illinois.edu/ece420/fa2017/hog_for_human_detection.pdf

[3]通过深度排名学习细粒度的图像相似性-static.googleusercontent.com/media/research.google.com/en//pubs/archive/42945.pdf

[4]使用深度卷积神经网络进行ImageNet分类-papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf

[5]辍学:防止神经网络过度拟合的简单方法-www.cs.toronto.edu/~hinton/absps/JMLRdropout.pdf

[6] ImageNet:大规模的分层图像数据库-www.image-net.org/papers/imagenet_cvpr09.pdf

[7]快速多分辨率图像查询-grail.cs.washington.edu/projects/query/mrquery.pdf

[8]使用Fisher压缩向量进行大规模图像检索-citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.401.9140&rep=rep1&type=pdf

[9]超越功能包:用于识别自然场景类别的空间金字塔匹配-ieeexplore.ieee.org/document/1641019

[10]改进了一致采样,加权Minhash和L1草图绘制-static.googleusercontent.com/media/research.google.com/en//pubs/archive/36928.pdf

[11]通过排名大规模在线学习图像相似性-jmlr.csail.mit.edu/papers/volume11/chechik10a/chechik10a.pdf

[12]通过深度排名学习细粒度图像相似性-users.eecs.northwestern.edu/~jwa368/pdfs/deep_ranking.pdf

[13]使用深度排名的图像相似度-medium.com/@akarshzingade/image-similarity-using-deep-ranking-c1bd83855978

Source: https://habr.com/ru/post/zh-CN457928/


All Articles