# 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
将网络的输出结果和真实标签进行交叉熵运算
- 网络结构

## 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
- 网络结构
