从零开始深度学习0519——图像检索基本知识

视频摘要与视频浓缩(video summarization and video synopsis) 视频摘要是从原始视频中提取有代表性的关键帧,而视频浓缩将多帧视频合并成一帧。

 

 

如果是在低维度的小数据集中,可以使用线性查找(Linear Search)的方法,但是在高纬度大数据集中,线性查找的效率很低,显然是不可行的。如何的从大的高维数据集中找到与某个向量最相似的一个或多个向量,是图像检索中一个难点。

在这种高纬度大数据集中的检索,通常需要使用最近邻最相似查找(Approximate Nearest Neighbor,ANN)的方法。ANN的相似性检索算法,大体可以分为三大类:

  • 基于树的方法,KD-树为代表。对于低维度的数据,KD树的查找性能还是比较高效的;但当空间维度较高时,该方法会退化为暴力枚举,性能较差,这时一般会采用下面的哈希方法或者矢量量化方法。
  • 哈希方法
    • LSH Locality Sensitive Hashing 为代表,对于小数据集和中等数据集效果不错
  • 矢量量化
    • vector quantization,在矢量量化编码中,关键是码本的建立和码字搜索算法。比如常见的聚类算法,就是一种矢量量化方法。而在相似搜索中,向量量化方法又以PQ方法为代表
    • 对于大规模数据集,矢量量化是个很好的选

 

 

 

KNN    就是K近邻

进行线性扫描   找最近的点 认为相似  进行暴力搜索

 

在KNN 的基础上,进行改进  出现了KD-Tree

从训练样本中 找一个节点  进行分叉 如图

 

 

 

 

如果数据维度更高的话,还可以进一步提升,出现了LSH

提高了效率,但是付出的代价是会损失一些精度

LSH的思想:在原空间中很近(相似)的两个点,经过LSH哈希函数的映射后,有很大概率它们的哈希是一样的;而两个离的很远(不相似)的两个点,映射后,它们的哈希值相等的概率很小。

LSH(Locality Sensitive Hashing)位置敏感哈希,局部敏感哈希

最近邻最相似搜索算法的一种,有比较可靠的理论根据且在高维数据中表现比较好,很适合应用在图像检索中。

与一般的哈希算法不同的是其位置敏感性,也就是散列前类似的点(距离近的点),在散列后仍然能够保证在一定程度的相似,且有一定的概率保证。

原理大概就是,将相似的点,也就是相似的图像 放在一个Bucket中,做好LSH索引。然后来了图像检索,就去找Bucket

 

 

一种简单的LSH实现  假设要将LSH投影到128的bianry-code中

随机生成128条直线,其中每一条直线把平面space切分成了两半部分,不是0就是1

可以认为左边是0.右边是1   这只是一条直线  我们有128个直线  所以对于每个特征点有128个0或1  所以就表示成了128个bianry-code 这就是随机投影random projection

既然是有128个直线,所以相当于就是确定了128个截距和斜率

所以如果来了一个图片,对这个图片也做这128个直线的投影,做对比

 

 

整体framework

LSH应用在图像搜索中

 

机器学习  深度学习 都分为 监督学习 和  无监督学习

 

无监督学习

Encoder – Decoder Framework  编码解码

 

 

卷积是把大的Feature map 下采样 变成小的

转置卷积是把 小的 的进行上采样

 

 

IR –》 image retrieval

 

 

特征层的选取

假设最后取到的特征是7*7*256

我们取到VGG或者AlexNet等在imagenet上训练的网络的最后一个卷积层后,肯定是需要pooling层 和 归一化操作,这里对比了2种pooling方式和2种归一化操作

Sum-L1 效果比较好  但是 平常我们一般选择max-L2

输出层的选取

我们以VGG-19层为例

可以随着选取卷积层越靠后 得到的查询效果越好,但是到了一定程度后就会过犹不及

 

 

 

 

Image Resizing

 

直接resize 话 图像会被拉伸变形   叫做two-fixed

还可以固定一边,然后一定的比例,缩放另一边 叫做 one-fixed

 

 

 

如果网络结构的设计接受299*299*3 的图像,但是实际上输入图像肯定是大小不一的,假如我们图像是1024*1024*3,那我们如何进行图像原始的输入,输出。基本上99%case都是比网络结构设计的输入尺寸要大 。 那我们如何解决这个问题

 

我们可以把fc层全部去掉,换上Global average pooling (GAP)  全局池化层

Global average pooling (GAP)      https://www.jianshu.com/p/04f7771f4da2   说的特别好

卷积层是CNN网络的核心,激活函数帮助网络获得非线性特征,而池化的作用则体现在降采样:保留显著特征、降低特征维度,增大kernel的感受野

一般在全连接后会有激活函数来做分类,假设这个激活函数是一个多分类softmax,那么全连接网络的作用就是将最后一层卷积得到的feature map stretch成向量,对这个向量做乘法,最终降低其维度,然后输入到softmax层中得到对应的每个类别的得分。全连接层如此的重要,以至于全连接层过多的参数重要到会造成过拟合

在最后一个卷积层后,加上GAP 不管前面输出是多少  通过GAP后都变成了1*1*chinnal

所以就可以不在乎原始图像输入是多少,然后继续接下往下做

 

去掉fc层 换成GAP 我们叫全卷积神经网络  fully convlation network

 

 

 

一些训练网络的建议

 

 

 

推荐一个特别强大的  数据扩增的库  

https://github.com/aleju/imgaug

 

 

 

 

 

Re-Identification   ReId  车辆重识别  人体重识别

 

核心Triplet Loss 三元组损失  三重态损失

Anchor,positive,Negative 

Margin 其实就是阈值  就是允许多大的误差

在垂直领域 迫使系统去寻找和给定样本 距离相近的

Triplet loss  函数 和 求导

 

 

网络流程

每次把3个图像作为一组样本,形成三元组,(batch都是3的倍数,一个batch就是3,如果24 就是有8组,),作为输入到cnn,然后输出特征向量,到triplet loss 中 计算distance。 期望anchors 和 positive 距离更近  迫使网络学到更细粒度的信息

 

 

 

很重要  工业界中用的  面试题

输入是1022*767    输出是320*320

短边767先缩放到320,长边按比例缩放(1022767*320),然后在中间再去裁剪出320*320

Center crop  +   resize

会损失一点边界   但是没关系可以接受

 

 

 

Checkpoint 设置一个保存路径

 

设置学习率

 

Patience 就是耐心是15  连续15轮epoches 没有变化时  停止

 

 

 

使用triplet loss 时  千万一开始不能用来训练中

通常是先训练一个基本的cnn  然后再加进来进行二次训练  这样会使得训练的精度可以拔高一点。如果一开始嵌入trieplet loss  可能会不收敛

 

 

 

 

正负样本的采样  positive and negative

A best approach is  “hard negative”

比如相同车辆,相同型号,相同颜色  但是不能车牌

 

 

训练一个faster r-cnn  检测器  去检测

然后扔给孪生神经网络 去match

 

 

孪生神经网络   来做match 匹配

输入x1 x2 到cnn  相同输出1  不同输出0

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值