💡 作者:韩信子 @ShowMeAI,Frank@淘宝
📘 大厂解决方案系列教程:https://www.showmeai.tech/tutorials/50
📘 本文地址:https://www.showmeai.tech/article-detail/92
📢 申明:版权所有,转载请分割平台与作者并注明出处
📢 珍藏 ShowMeAI 查看更多精彩内容
一图读懂全文
ShowMeAI 社区的技术专家小伙伴们对 图像检索的典型算法 做了实现,构建了相干利用 🏆『基于 CNN 与三元组的图像检索实现 』,对细节感兴趣的话,请返回 这里 查看 实现代码参考。代码的整顿破费了很多心理,欢送大家 PR 和 Star!
⭐ ShowMeAI 官网 GitHub:https://github.com/ShowMeAI-Hub/
图像检索是一个在互联网行业有着十分多利用场景的 AI 技术,典型利用例如电商商品检索(淘宝『拍立淘』,京东『拍照购』),用户顺手拍照即可精准检索商品,整套实现的背地蕴含了十分多计算机视觉技术。本篇咱们联合阿里 CV 方向资深算法工程师 Frank 的分享,一起来看看淘宝拍立淘背地的实现计划和依靠的计算机视觉技术。
💡 一、图像检索晋升购物体验
图像检索工作指的是,给定一个蕴含特定实例(例如特定指标、修建、场景等)的查问图像,从图像数据库中找到蕴含雷同 / 类似实例的图像。
因为不同图像的拍摄视角、光照、遮挡状况等不同,实现精准检索须要很多算法技术撑持,同时对于图像数据库宏大的各大互联网公司而言,查问效率也是须要思考的外围问题之一。
以电商为例,淘宝拍立淘于 2014 年首次在 APP 中上线,现曾经成为领有数千万日活用户的利用。与传统的基于文字搜寻的电商搜寻相比,拍立淘只须要用户顺手拍一张照片,即可精准检索,省去了繁琐的文字描述,简化了用户的购物流程,大大提高了电商购物的体验。
💡 二、淘宝·拍立淘的图像搜寻流程架构
拍立淘的图像搜寻架构如下图所示,架构整体分为 离线和在线解决流程 两个局部。
2.1 离线流程
离线解决 的过程次要是 定期对图像抽取特色构建索引。残缺的离线流程包含:
① 检测与特色学习:构建离线图像选品,通过指标检测在选品图像上提取感兴趣的商品;
② 特色抽取:对商品进行特征提取,构建大规模索引库,放入图像搜索引擎期待查问;
③ 构建索引:以肯定频率放弃索引库更新。
2.2 在线流程
在线解决 的过程次要是 对用户上传的查问图片进行检索返回库内检索后果。具体的步骤包含:
① 品类辨认:对查问图像进行分类解决,辨认商品类目;
② 指标定位 & CNN 特色抽取:提取图像指标区域的特色,基于相似性度量在索引引擎中搜寻产生候选;
③ 图像索引与重排:能够通过重排序进行后果商品重排并返回搜寻后果。
💡 三、品类辨认模块
3.1 图像选品解决
之所以做淘宝选品,是因为淘宝平台存在十分多雷同或高度类似的商品图像,间接应用会导致最终的搜寻后果呈现大量雷同的商品宝贝,影响用户体验。
淘宝蕴含大量不同起源的商品图像,例如和商品对应的『主图』、『SKU 图』、『拆箱图』等。首先,须要对这些海量图像做一个筛选,选出用户绝对感兴趣的图像作为商品图像构建索引。
这个过程相当于『依据图像附带的属性和图像品质等对整个图像库进行过滤』。增加图像选品过滤模块后,会每天定时抉择和删除反复或高度类似的商品图像,进而优化索引文件。
3.2 基于模型 & 搜寻联合的类目预测
淘宝的类目体系是基于叶子类目标层次化构造,这样能够兼顾视觉和语义相似性。淘宝在拍立淘中先图像进行预测,失去 14 个大类目之一的后果,如服饰、鞋、包等,这个解决能够放大图像库的搜寻空间。具体实现采纳基于模型与搜寻联合的形式,如下:
1)基于模型的预测模块
① 采纳 GoogLeNet V1 网络结构来衡量高精度和低提早,应用蕴含不同商品类指标签的图像集进行训练;
② 将输出图像的大小 resize 为 \(256 \times 256 \),随机裁剪到 \(227 \times 227 \),应用 Softmax(穿插熵)损失函数作为分类工作的损失函数。
2)基于搜寻的预测模块
该模块不间接训练分类模型,而是基于类似度与匹配思维,应用特色模型和待检索数据库实现基于搜寻的加权 KNN 分类。具体的预测流程为:
① 获取用户输出的待分类图片;
② 利用基于搜寻的分类办法:对图片特征提取,并在待检索的数据库中找出 Top-K 个和它类似的图片,依据这些图片的类指标签对输出图片进行预测。
3)淘宝·拍立淘利用实际
- 离线局部。淘宝收集了 2 亿张附带『实在类别标签』的图像作为参考图像库,训练一个通用类目标特色模型对参考图像库离线提取通用特色并构建索引。
- 在线局部。理论预测时,对查问图像提取通用特色,并在图像参考集中检索 Top 30 的后果。通过查问图像的 Top 30 个街坊,再依据每个的类指标签加权投票,以预测待查问图像的标签。其中,加权函数为查问图像与街坊图片的间隔函数。
品类辨认的成果晋升 。淘宝将『基于模型的预测后果』和『基于搜寻的后果』再一次加权交融,以进一步提高类目预测的准确性。相比于单办法,两者交融的形式,使得淘宝最终类目预测的精度 进步了 2% 以上。
💡 四、指标检测 & 特色联结学习 & 度量学习模块
淘宝场景下,利用拍立淘进行图像搜寻,有一个大挑战:用户和商家图像之间存在微小差别。商家的商品图片通常品质都十分高,拍摄环境和设施也十分好。而用户查问的图像,通常是用手机摄像头拍摄的,随同着光照、含糊和简单的背景等一系列问题。
为了缩小简单的背景影响,零碎须要具备在图像中『定位主体指标』并『提取主体特色』的能力。淘宝提出了 基于度量学习的分支网络 CNN 框架 ,来 联结学习主体检测框和特色示意,以实现在没有背景烦扰的状况下使用户实拍图像和商家的索引图像特色保持一致。
图例显示了,是否进行指标主体检测与针对性检索的成果差异:
- 第 1 行没有进行主体检测,检索后果显著受到了背景烦扰;
- 第 2 行采纳主体检测,检索后果有十分显著的成果晋升。
4.1 三元组开掘
1)原理简介
在度量学习中,利用三元组样本,构建『三元组损失函数(Triplet Loss Function)』是以后比拟常见和无效的一种解决形式。
这个办法最早由 Google 钻研团队在论文《FaceNet:A Unified Embedding for Face Recognition》中提出,罕用于人脸识别工作,目标是做到非同类极类似样本的辨别(如对兄弟二人的辨别)。
它的根本思维是:对于设定的三元组(Anchor , Positive , Negative),Triplet Loss 试图学习到一个特色空间,使得在该空间中雷同类别的基准样本(Anchor)与 正样本(Positive)间隔更近,不同类别的 Anchor 与负样本(Negative)间隔更远。
阐明:Anchor 和 Positive 为同类的不同样本;Anchor 与 Negative 为异类样本。举例:在图像检索场景下,与检索图片同样的主体内容是 Positive,不一样的是 Negative。
2)办法优缺点
- 长处 1:基于 Triplet Loss 的神经网络模型,能够对细节进行很好地区分 。尤其是在图像分类工作中,当两个输出很类似的时候,Triplet Loss 对这两个差异性较小的输出向量,能够学习 到更好的、轻微的特色 Feature,从而在分类工作中表现出色。
- 长处 2:相比其余分类损失函数,Triplet Loss 可能依据模型训练的须要设定肯定的阈值。带 Triplet Loss 的网络结构,在进行训练的时候个别都会设置一个阈值 margin,设计者能够通过扭转 margin 的值来管制正负样本的间隔。
尽管 Triplet Loss 很无效,但也有毛病:
- 毛病 1 :三元组的选取,导致数据的散布并不一定平均,所以在模型训练过程体现很不稳固且收敛慢,须要依据后果一直调节参数。
- 毛病 2 :Triplet Loss 比分类损失更容易过拟合。
3)淘宝拍立淘利用实际
在淘宝拍立淘的场景中,给定一张输出图像,外围问题是利用图像特色牢靠地匹配来自用户和卖家的不同源图像。对应到三元组场景,咱们须要拉近『查问图像』与其『同款商品图像』之间的间隔,并拉远『查问图像』与『不同款商品图像』之间的间隔。
这里采纳的 Triplet Loss 三元组损失函数如下:
$$
\operatorname{loss}\left(q, q^{+}, q^{-}\right)=\left[L 2\left(f(q), f\left(q^{+}\right)\right)-L 2\left(f(q), f\left(q^{-}\right)\right)+\delta\right]_{+}
$$
- \(L2\) 示意两个向量之间的 \(L2\) 间隔
- \(\delta\) 是管制距离的参数
- \(f\) 是须要学习的 CNN 特征提取形式,能够通过端到端的训练学习到
4)三元组样本开掘
办法思路如上,但模型训练须要依附大量样本,这里的外围是『开掘较难的三元组样本』。简略的解决形式是,从与查问图像雷同的类目中抉择正样本图像,从其余类目中抉择负样本图像。这种形式存在的问题是:负样本图像与查问图像存在较大的视觉差别,导致训练过程中三元组排序损失函数很容易为零,没有奉献任何损失。
实际上,淘宝利用『用户点击数据』来『开掘较难的三元组样本』,具体流程如下图:
- 基本思路
在图像检索场景下,很大一部分用户会在返回列表中点击同款的商品图像,这意味着『点击的图像』能够被视为『查问图像的正样本图像』,『未点击图像』能够作为『难负样本图像』,它们相似于查问图像但属于非同款商品图像。
- 问题点 & 解决形式
上述的思路中,『未点击的图像』依然可能是『与查问图像具备同款商品的图像』,因为当许多同款的宝贝图像被返回时,用户只会点击后果中的一个或两个,咱们须要 过滤『未点击且与查问图像具备同款商品的图像』。
- 负样本构建
最终『查问图像的负样本图像』计算如下:
$$
q^{-} \in\left\{d^{\text {nonclick}} \mid \min \left[\operatorname{dist}\left(d^{\text {nonclick}}, q\right), \operatorname{dist}\left(d^{\text {nonclick}}, d^{\text {click}}\right)\right] \geqslant \gamma\right\}
$$
- \(dist\) 为特色的间隔函数
- \(\gamma\) 为间隔阈值
淘宝拍立淘对间隔计算做了一些设计,采纳了多特色交融的办法,联合了『部分特色』、『不同版本特色』和『ImageNet 预训练的通用特色』等,从而更精确地发现噪声负样本。
- 正样本构建
相似的思路,更准确的『查问图片正样本』选取形式如下公式所示:
$$
q^{+} \in\left\{d^{\text {click}} \mid \operatorname{dist}\left(d^{\text {click}}, q\right) \leqslant \varepsilon\right\}
$$
- 数据扩增
拍立淘的样本构建时,在小批量中获取的三元组之间,共享所有负样本图像。这样能够扩大小批量中的所有可用三元组数据,减少更多训练数据。不采纳共享机制,生成 m 个三元组,通过共享负样本,能够在进入损失层之前生成 m 平方个三元组。
- 损失函数优化
为进一步缩小训练图像中的噪声,对原始三元组排序损失函数进行改良:
$$
\text {loss}=\frac{1}{|Q|} \sum_{q \in Q} \frac{1}{\left|N_{q}\right|} \sum_{q^{-} \in N_{q}}\left[L 2\left(f(q), f\left(q^{+}\right)\right)-L 2\left(f(q), f\left(q^{-}\right)\right)+\delta\right]_{+}
$$
$$
Q=\left\{q \mid \exists q^{-}, L 2\left(f(q), f\left(q^{+}\right)\right)-L 2\left(f(q), f\left(q^{-}\right)\right)+\delta>0\right\}
$$
$$
N_{q}=\left\{q^{-} \mid L 2\left(f(q), f\left(q^{+}\right)\right)-L 2\left(f(q), f\left(q^{-}\right)\right)+\delta>0\right\}
$$
改良的思路,是针对同一查问图像的所有三元组样本计算均匀损失,这样能够最大水平地缩小噪声三元组的影响。通过查问图像层面的三元组损失函数,学习 CNN 特色,从而将用户的实拍图像和商家的高质量图像映射到同一特色空间,使得不同起源的图像可能更牢靠地匹配。
Triplet Loss 的简略代码实现示例
class TripletLoss(nn.Module):
"""pytorch 上的 Triplet Loss 实现"""
def __init__(self, margin):
super(TripletLoss, self).__init__()
self.margin = margin
def forward(self, anchor, positive, negative, size_average=True):
distance_positive = (anchor - positive).pow(2).sum(1) # .pow(.5)
distance_negative = (anchor - negative).pow(2).sum(1) # .pow(.5)
losses = F.relu(distance_positive - distance_negative + self.margin)
return losses.mean() if size_average else losses.sum()
4.2 Deep Ranking 网络
1)网络结构
整个流程中重要的一个环节是『剔除背景噪声,检测出主体对象』。计算机视觉中,指标检测的办法是部署现成的主体检测算法(如 Faster R-CNN 或 SSD),但这类办法时延较长而且须要大量边界框的标注。
淘宝拍立淘提出『两个分支的联结网络模型』,来同时学习检测和特色示意。分支网络模型构造如下图所示:
2)参数学习与训练
以上个步骤中开掘的三元组为监督信息,在 Deep Ranking 框架下学习该联结模型。这种形式下,能够通过三元组正负样本度量关系来学习出判断特色,同时,依据分支构造回归出对特色判断起到重要作用的对象主体掩膜。在不须要边界框标注的状况下,主体掩膜通过分支构造以相似注意力的机制被学习进去。总体来说,Deep Ranking 框架如下图所示。
Deep Ranking 框架下的每个深度联结模型都共享参数,检测的掩膜函数 \(M(x , y)\) 如下公式所示,先利用检测分支回归出矩形坐标 \((x_{1} , x_{r}, y_{t} , y_{b})\),再应用阶跃函数 \(h\) 示意:
$$
M(x, y)=\left[h\left(x-x_{1}\right)-h\left(x-x_{\mathrm{r}}\right)\right] \times\left[h\left(y-y_{\mathrm{t}}\right)-h\left(y-y_{\mathrm{b}}\right)\right] \\
$$
$$
h\left(x-x_{0}\right)=\left\{\begin{array}{l}
0, x<x_{0} \\
1, x \geqslant x_{0}
\end{array}\right.
$$
主体边界框区域是输出图像 \(I(x,y)\) 与 \(M(x,y)\) 按位点乘失去的。然而,阶跃函数 \(h\) 是不可微的。为了端到端地训练,咱们能够用 \(Sigmoid\) 函数来迫近阶跃函数。
$$
f(x)=\frac{1}{1+\mathrm{e}^{-k x}}
$$
当 K 足够大时使其可微化。整个过程只须要弱监督的用户点击数据,不须要依赖边界框的标注进行训练,这大大降低了人力资源老本,进步了训练效率。
💡 五、图像索引与重排模块(Image Indexing & Re-ranking)
5.1 十亿级大规模图像检索引擎
理论引擎端为了最大水平放慢响应速度,淘宝拍立淘应用 大规模二值引擎 进行查问和排序,整体采纳 Multi-shards 和 Multi-replications 引擎架构。
1)构造框架
构造如下图所示,它保障了大量用户查问下的疾速响应,同时又具备十分好的可扩展性。
- Multi-shards
单机内存无奈存储宏大的特色数据,因而特色被存储到多个节点上。每次查问,将从每个节点检索出 Top-K 后果,将其合并失去最终的后果。
- Multi-replications
单个特色数据库无奈应答大量的查问流量,特色数据库被复制多份,从而将查问流量分流至不同的服务器集群上,以升高用户的均匀查问工夫。
2)粗筛选和精排序
在每个节点,应用两种类型的索引:粗筛选和精排序,解释如下:
粗筛选:采纳改良的基于二值特色(CNN 特色二值化)的二值倒排索引检索。
① 以图像 ID 为关键字、二值特色为值,通过汉明间隔计算,疾速滤除大量不匹配数据。
② 依据返回的图像数据的二进制编码,对最近邻进行精排序。
精排序:依据附加元数据(如视觉属性和特色)对粗筛选出的候选项进行更准确的排序。精排过程较慢:
① 元数据以非二进制模式存储
② 元数据的存储开销太大,无奈将其全副载入内存中。这里缓存命中率是影响性能的关键因素。
通过 粗筛选 和精排序(这个过程和举荐零碎中的召回 + 排序十分相似),根本能够满足达到无损精度的召回后果,且检索效率大幅晋升。
5.2 联合多信息维度的后果重排
1)存在的问题
下面的图像检索后果,基于计算机视觉与深度学习排序,尽量精准地检索回图片商品。但回归到电商的实质,同款商品可能有很多不同的配图。匹配最靠近检索图片状态的同款商品后果,并不能保障它们是最能激发用户点击和购买的商品。
2)淘宝·拍立淘的解决方案
业务指标调整变更之后,变成了 1 个综合排序问题,最初要依据后果列表里的商品的价格、好评度、销量、用户画像等综合信息重排序。通过上述图像检索的过程,淘宝拍立淘失去的初步后果列表蕴含 Top 60 图像类似度的同款后果,进一步利用语义信息对 Top 60 的后果进行从新排序,包含应用销量、转化率、点击率、用户画像等。
- 简略的解决形式 能够是利用 GBDT+LR 这种传统模型,对不同维度的相干形容特色进行集成,将最终得分归一化到 0,1,以保障外观类似度的同时,综合思考其余属性维度的重要性。
- 更精准的排序形式,能够思考 CTR 预估模型与多指标优化的简单网络办法,参考『多指标排序』『爱奇艺多指标』等过往文章。联合多信息维度的后果重排序阶段,使得最终后果在放弃整体外观相似性的同时,对品质差的图像进行降权与过滤,取得更合乎用户用意的商品图像。
参考文献
- [1] Shaoqing Ren, Kaiming He, Ross B Girshick,et al. Faster R-CNN: Towards Real-Time Object Detection with Region ProposalNetworks. IEEE Transactions on Pattern Analysis and MachineIntelligence(T-PAMI), 2017:1137–1149.
- [2] Wei Liu, Dragomir Anguelov, Dumitru Erhan,et al. SSD: Single Shot MultiBox Detector. In European Conference on ComputerVision (ECCV), 2016:21–37.
- [3] YanhaoZhang, Pan Pan, Yun Zheng,et al. Visual Search at Alibaba. In Proceedings of the 24th InternationalConference on Knowledge Discovery and Data Mining (SIGKDD), 2018:993-1001
- [4] Yushi Jing, David C Liu, Dmitry Kislyuk,et al. Visual Search at Pinterest. In Proceedings of the 21th InternationalConference on Knowledge Discovery and Data Mining (SIGKDD), 2015:1889–1898
- [5] Christian Szegedy, Wei Liu, Yangqing Jia,et al. Going deeper with convolutions. In IEEE Conference on Computer Visionand Pattern Recognition(CVPR), 2015:1–9.
- [6] Jiang Wang, Yang Song, Thomas Leung, etal. Learning Fine-Grained Image Similarity with Deep Ranking. In IEEEConference on Computer Vision and Pattern Recognition(CVPR), 2014:1386–1393.
- [7] OlgaRussakovsky, Jia Deng, Hao Su, et al. ImageNet Large Scale VisualRecognition Challenge. (2014). arXiv:arXiv:1409.0575, 2014.
ShowMeAI 大厂技术实现计划举荐
- 大厂解决方案系列 | 数据集 & 代码集(继续更新中):https://www.showmeai.tech/tutorials/50
- ShowMeAI 官网 GitHub(实现代码):https://github.com/ShowMeAI-Hub/
-
『举荐与广告』大厂解决方案
- 大厂技术实现 | 多指标优化及利用(含代码实现)@举荐与广告计算系列
- 大厂技术实现 | 爱奇艺短视频举荐业务中的多指标优化实际 @举荐与计算广告系列
- 大厂技术实现 | 腾讯信息流举荐排序中的并联双塔 CTR 构造 @举荐与计算广告系列
-
『计算机视觉 CV』大厂解决方案
- 大厂技术实现 | 图像检索及其在淘宝的利用 @计算机视觉系列
- 大厂技术实现 | 图像检索及其在高德的利用 @计算机视觉系列
-
『自然语言解决 NLP』大厂解决方案
- 大厂技术实现 | 详解常识图谱的构建全流程 @自然语言解决系列
- 大厂技术实现 | 爱奇艺娱乐常识图谱的构建与利用实际 @自然语言解决系列
- 『金融科技』大厂解决方案
- 『生物医疗』大厂解决方案
- 『智能制作』大厂解决方案
- 『其余 AI 垂直畛域』大厂解决方案
ShowMeAI 系列教程精选举荐
- 图解 Python 编程:从入门到精通系列教程
- 图解数据分析:从入门到精通系列教程
- 图解 AI 数学根底:从入门到精通系列教程
- 图解机器学习算法:从入门到精通系列教程
- 机器学习实战:手把手教你玩转机器学习系列
- 深度学习教程:吴恩达专项课程 · 全套笔记解读
- 自然语言解决教程:斯坦福 CS224n 课程 · 课程带学与全套笔记解读
- 深度学习与计算机视觉教程:斯坦福 CS231n · 全套笔记解读