一 写在前面
未经允许,不得转载,谢谢~~
最近想尝试一下CHINA-MM 2018中的京东AI挑战赛,其中的一个子任务就是单品搜索,其实就是图像内容检索任务。
因为之前并没有接触过这一块任务,所以找了一些资料学习(其实都是受惠于导师与师兄。・ω・。嘻嘻),分享出来给有兴趣的同学:
- [TPAMI重磅综述]SIFT与CNN的碰撞:万字长文回顾图像检索任务十年探索历程(上篇)
- [TPAMI重磅综述]SIFT与CNN的碰撞:万字长文回顾图像检索任务十年探索历程(下篇)
- 论文:Learning visual similarity for product design with convolutional neural networks
- 论文:FaceNet: A Unified Embedding for Face Recognition and Clustering
简单说明一下,前两篇是图像检索方面的综述文章,总结的非常的好,对于刚刚接触这个领域的人真的很有必要阅读,以便于形成整个概念~
了解基本概念之后,其实脑子里就会有一个粗略的网络模型,这个时候再去看几篇具体的论文是非常恰到好处的~
二 文章简介
本文主要是对Learning visual similarity for product design with convolutional neural networks这篇文章的总结,整理了自己觉得最重要的部分,也作为学习记录,至于对具体的训练细节以及实验部分感兴趣的同学还请阅读原文哦~~~
1 整体介绍
其实通过文章名就可以知道文章研究的是用卷积神经网络学习产品相似性问题。
如图,文章解决了以下两个问题:
- Query1:对于一张给定区域的图像,找出与这个区域中包含物品最相似的其他物品;
- Query2:对于一个物品,找到包含相似物品的室内设计图
这篇文章针对的具体场景是室内设计中物品与具体场景设计。具体来说Query1可以解决的问题是人们常常会在装修网站询问“这张图片中的台灯挺好的,从哪里可以买到相似的?”;而Query2可以解决的问题是“这条椅子可以摆放房间的哪里?”
在给定物品的区域框的情况下,其实我觉得两个问题的本质都在于学习两个物品的相似度,当然后期利用相似度我们可以很自然的完成检索任务。
2 文章主要贡献
这篇文章是2015年发在ACM Transactions on Graphics上面的文章,在图像检索还是蛮有代表性的,以下为作者自己总结的几点主要贡献:
- 生成物品与对应场景的数据集;
- 使用孪生CNN网络(siamese network)并结合contrastive loss & classfication loss完成了整个模型的训练;
- 将网络应用到实际中;
作者在论文中花了较多篇幅介绍数据集的收集与处理,但在下文中就重点介绍第2部分,其余的还是请阅读原文哦~~~
三 网络结构介绍
可能大家对于什么是siamese network, 什么是contrastive loss都有点陌生,接下来我会先介绍这两部分的内容,然后再总结论文中使用的结构及一些重要的处理细节。
1 background: 用孪生网络进行距离度量
1.1 CNN模型建模
- 我们的卷积网络模型其实都可以看成是一个函数f,只不过这个函数比我们直观接触过的线性函数、二次函数等要复杂和很多,anyway,当参数θ确下来以后它就是一个从输入到输出的映射关系f;
- 而对于每一张输入图像I,我们都能得到对应的输出特征x;
- 所以我们得到这样的关系:x = f(I;θ)
1.2 contrastive loss
首先介绍一下正样本和负样本的概念。
- 正样本:物品q和p是相似的,通常被标注为y=1,那么我们称这样的训练数据对(p,q)是positive pair;
-
负样本:物品q和n是不相似的,通常被标注为y=0,那么我们称这样的训练数据对(p,n)是negative pair;
如图,我们定义一个边界值Margin(m)来判定两个物品是否相似,例如对于图中的p与q被标注为正样本,在图中体现在两者的特征值会比较相近(圆内); 反之,p与q为负样本,那么他们的特征值之差一定大于m。
接下来我们来学习一下如何用正负样本计算损失值contrastive loss。
如下图所示为损失函数L的定义
对于公式作如下解读:
- loss由两部分组成;
- Lp表示对相似的图片(正样本)得到的特征值太远的惩罚(理论应该是越近越好);
- Ln表示对不相似的图片(负样本)得到的特征值太近的惩罚(理论应该至少大于m);
如下图为更形象一点的解释:
- 正样本(p,q)通过CNN得到的特征值x如果离得太远,会在loss优化的时候慢慢拉回来;
- 负样本(p,n)通过CNN得到的特征值x如果小于阈值m,会在loss优化的时候慢慢拉大;
这样用正负样本去训练神经网络的参数,我们就能得到一个能够正确判断物品相似性的结果。
1.3 siamese network
孪生网络顾名思义就是使用一样的网络结构,因为在我们的算法中,需要同时对需要正样本(p,q)或者是负样本(p,n)计算特征值,为了提高效率,设计了这样的结构~
其实本质就是两个CNN网络共享参数θ,这个结构在上面那张图中也已经展示出来了。
2 Our-approach:文章网络结构具体介绍
2.1 网络结构
在上面background的基础上,文章提出了4种网络结构:
都不是很复杂,上面的看懂的话应该很快就能看懂这4个结构图。
- A:将本来用于分类任务网络,将最后一层softmax改成特征提取层
- B:最基本的siamese CNN + contrastive loss结构
- C:在B的基础上增加了一个图像分类任务,用多任务更好的表示loss
- D:在C的基础上对提取到的特征多做了一次L2归一化操作
文章最后给出的应用演示中用的是D结构,如下图所示为用D结构,并结合t-SNE算法做出来的可视化效果图:
2.2 重要处理细节
正负样本处理
我们直接拿到的标注数据一般只有正样本对(p,q),那么如何更好的利用这些正样本数据及生成负样本数据呢?
个人觉得本文的处理方式还是挺有参考意义的,所以整理在这里:
- 生成负样本:对于每个图片p,都随机选取80张属于同一类别的图像+随机选取20张不属于这个类别的图像,这样每个图像p,都能生成100对负样本(p,n);
- 为了平衡正样本与负样本之比,正样本对*5,这样正样本对:负样本对=5:100=1:20;
- 对于每个图像,我们都有这个物体对应的框。为了数据增强,采用在原来的框外面额外选取像素大小为{0,8,16,32,48,64,80}的边框,这边边框其实就作为物品的背景,从而达到训练数据增强的效果;
- 最后将数据分成train、val、test(图像p应该没有交叉)
讨论&求助:以上是我整理出来的核心处理思路,作为学习来说应该够用了,但我用论文中实际的数据量代入作者描述的方法,不能得到论文中的数据,就是为什么101,945的原始正样本对最后得到的是63,820,250的训练数据、3,667,769的验证数据以及6,391的测试数据。非常希望有同学能帮我解一下疑惑,ヾ(◍°∇°◍)ノ゙
其他小细节
- margin(m)的初始化,文章探索了{1,√10, √100,√1000}, 最后用D结构的时候用了√2
- 网络结构的初始化可以考虑用模型迁移
- 距离度量使用的是cosine
- 处理在测试阶段对region加了padding,在测试阶段也用了16的padding效果最好。
四 写在最后
啊啊啊啊啊啊,终于写完了,看了一下时间,写了2个小时。
而且是在完!全!集!中!精!力!的情况下~
个人很喜欢分享,但真的不喜欢没有任何招呼也不注明作者信息的情况下就被网站拿去全文使用,有点小委屈╭(╯^╰)╮
oooooh,恢复正常,总结的有问题还请简友们一定要提出来,特别是期待有人能解决我文中的困惑,感激不尽!
最后,这篇文章用的是contrastive loss,在前面推荐的另一篇文章中用的是FaceNet网络中用的是另一种图像相似度检测中常用的triplet loss,具体的等我读完文章以后会再整理一篇,谢谢关注嘻嘻~~~