# CV4 **Repository Path**: gtyelv/cv4 ## Basic Information - **Project Name**: CV4 - **Description**: 图像搜索 CV4:SiameseNet, TripletNet - **Primary Language**: Python - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-09-05 - **Last Updated**: 2021-09-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: CV4, 图像搜索, tf2x, 通用项目集 ## README # CV4 图像搜索任务 - TBIR - CBIR CBIR = 图像描述F + 相似度计算G + 排序(搜索) 1. 图像描述问题 # 图像→特征向量 2. 相似度计算问题与排序问题 - 相似度计算问题 两个特征向量→相似度 相似度常用标量形式,也可以用向量形式 相似度计算使用欧氏距离cosine距离等距离计算算法 - 排序问题 图像搜索的最后一个阶段,但是怎么实现的? 找一个图的相似图,就要对它计算图库中所有图的相似度,这个计算量太大了吧? 实际上图库中所有图,都已经准备好了特征向量,计算相似度时在一次计算CNN特征向量后再使用矩阵计算可以提高计算效率、计算后可直接排序得到结果 本章给出的项目,都是解决:图像描述问题+相似度计算问题 ## SiameseNet: - 目标 给出两张图片的相似度标量 也可给出衡量图片相对于"相对参考图片x_ref"的相似度向量,即sigmoid层之前的那一层的向量 - 网络 x1,x2 --[net_F]-> y1,y2 --[net_G]-> z12 z12 i.e. p_similarity # scalar or vector - 可训练部分 net_G - 训练 预先准备(x1,x2)->(y1,y2); 再直接使用((y1,y2), z12)训练net_G - 特点 - 若要得到一幅图x2或x1的相似度标量(或相似度向量),既需要相似度计算算法net_G,又需要参考向量x1或x2。这有点像注意力机制 - 在一类训练集上训练好的模型,应该是很容易向其他类图像搜索任务上迁移的 - 改进 - 对于图像多类搜索问题/某一大类中细分小类的问题,可以选取合适的固定x_ref,根据输出的不同的特征向量z_ref?,做多分类,从而实现 - 若要找一幅图的相似图,需要计算图库中所有图相对于它的相似度,而后做排序、定相似度阈值,即得到搜索结果 - 参考书目:《DLpCV》 - SiameseNet的结构: x1,x2 --[F]-> y1,y2 --[G]-> z12(对称的) F常常基于不同的基础网络 e.g. VGG Inception ResNet 相似度量G,常用的有欧氏距离、Cosine距离等 - 孪生神经网络有两个输入(Input1 and Input2),利用神经网络将输入映射到新的空间,形成输入在新的空间中的表示。通过Loss的计算,评价两个输入的相似度。 - 建模F_net $F(\vec x_1,\vec x_2)=VGG16(\vec x_1,\vec x_2)=\vec y_1,\vec y_2$ - 建模G_net 在获得主干特征提取网络之后,我们可以获取到一个多维特征,我们可以使用flatten的方式将其平铺到一维上,这个时候我们就可以获得两个输入的一维向量了 将这两个一维向量进行相减,再进行绝对值求和,相当于求取了两个特征向量插值的L1范数。也就相当于求取了两个一维向量的距离 然后对这个距离再进行两次全连接,第二次全连接到一个神经元上,对这个神经元的结果取sigmoid,使其值在0-1之间,代表两个输入图片的相似程度 $G(\vec y_1,\vec y_2)=\sum λ_i|y_{1i}-y_{2i}|$ - 训练数据集Omniglot 包含来自 50不同字母(语言)的1623 个不同手写字符 每一个字符都是由 20个不同的人通过亚马逊的 Mechanical Turk 在线绘制 - loss 将网络的输出结果和真实标签进行交叉熵运算 - 网络结构 SiameseNet_结构 ![SiameseNet_网络结构](.md_images/SiameseNet_%E7%BD%91%E7%BB%9C%E7%BB%93%E6%9E%84.bmp) ## TripletNet - 目标 - 网络 x,anchor --[net_F]-> y --[net_G]-> z - 可训练部分 net_G - 训练 预先准备(a,p,n)->(ya,yp,yn); 再直接使用((ya,yp,yn), fake_label)训练net_G - 改进 ... - 特点 - TripletNet改进之处在于提出了高效的新的训练方式 - 训练的目标是使负类-anckr相异度至少比正类-anchor相异度高出margin阈值以上(相异度,在算法概念上等效于相似度,只是实现方式有别) - 训练时不需要额外给出真实值标签,只需将正类相异度+margin作为真实值、将负类相异度作为预测值即可。准确定义见TripletLoss - 网络结构 TripletNet_训练模型的结构