得物拍照搜索的前世今生
引言
大家在逛街,看视频,刷朋友圈时,是否会看到自己一见钟情的鞋子,衣服等商品,却因为不清楚商品的具体系列,款式而苦恼?遇到这种情况大家一般是动口询问,还是到品牌官网或者购物平台海量搜索呢?相信大家都有自己的获取渠道,这里将会为大家介绍一种更直接的拍照搜索方式。
何谓拍照搜索
拍照搜索顾名思义是通过对图像进行语义理解来搜索想要的信息,在得物平台上的应用场景就是根据用户上传的图片来搜索相似商品。
google搜图:google应该是做图像搜索的先驱,早在2001年就推出相关产品,后来得益于深度学习,让google的图像搜索引擎发展到了“睥睨天下”的程度;
百度识图:紧随google的脚步,拿着深度学习这样的重舰大炮打出了一片天;
拍立淘:基于阿里云图像搜索的技术支持,用于搜索商品,早期只支持搜索衣服和包包,目前也已逐渐扩充支持全品类商品
京东,搜狗,360等搜图
得物拍照搜索
目前来说,拍照搜索在得物平台还是比较小的一个应用场景,小到什么程度呢,请看下图拍照搜索入口:得物拍照搜索与淘宝和京东的拍照搜索功能类似,都是通过图片特征相似性度量来进行商品搜索,目前支持全量商品搜索,整个发展经历了尝鲜,阉割,优化,回归等历程。
V1.阿里云拍照搜索
1.尝鲜:全量上线
V1.阿里云拍照搜索1.尝鲜:全量上线该版本拍照搜索只需要维护一个图像库,存储平台商品图像,对用户来说,只需要上传图片,算法会自动处理图像并搜索输出最佳匹配商品,对开发人员来说,只需要维护图像库及商品对应的product id。一种更贴合大家理解的方式来解释就是说,item是我们商品库中的图像,user就是用户上传的图像,算法处理对于开发人员来说是无感的。
2.阉割:非鞋品类下线起因
起因
结果 某天收到一个badcase,产品发现某款手表经拍照搜索搜到了很多其他类目商品,经评估,彼时平台主要出货为鞋子,且鞋子的拍照搜索准确率相对较高,所以便有了如上图2下线所有非鞋品类搜索的处理结果。
原因分析为了搞清楚影响准确率的原因,笔者首先分析并验证了在黑盒子里面发生了什么,如上图所示,每个类目都会对应一个目标检测器,特征提取器以及特征库,当输入一张图片时,会有如下处理过程:
多个目标检测器并行检测图片,每个目标检测器输出的结果包括(是否有目标,目标置信度,目标位置),检测完成后会使用加权方式输出最终类目并抠出目标图像
将目标图像输入相应类目特征提取器提取图像特征
在相应图像特征库中检索相似特征
这时笔者已经基本可以判断是因为阿里云的图像搜索目标检测造成了上述搜索类目出错的问题,即配饰的目标检测器与包的目标检测器都输出了检测结果,但是包的加权得分更高,所以后续在包的特征库中搜索到了包包的匹配结果。
3.准确率“感人”
笔者拉了一批线上日志分析了阿里云图像搜索准确率,发现其top1 spu维度准确率远未达到理想标准,且除鞋类搜索外的其他类目的类目准确率也未曾达标。作为拍立淘技术支撑的阿里云图像搜索,如此差强人意的准确率让笔者一度怀疑是不是使用姿势出了问题,在反复阅读文档之后,确认操作姿势无误。于是笔者就开始基于得物平台最大的类目-鞋子搜索的badcase进行了深入剖析。首先是发现了大量类似下图的错误,即用户上传一张很清晰的鞋类图片,且该款鞋也在得物的图像库中,结果页的所有鞋类商品却与用户照片相差甚远。为了探索该问题,笔者调出了用户图片与图像库中特征最相似的图片,
看到这样的结果,笔者猜测他的鞋子检测应该是将人腿也推理进去了,所以笔者将阿里云返回的检测位置信息拿出来做了一下比较,发现果然与猜想一致,整个推理过程如下图表示:
也就是说,不止类目会出错,位置同样会有偏差,这样的结果显然对于开发人员和用户都是难以接受的。
这就不禁引发一个思考,拍立淘日均千万uv,其准确率肯定远不止于我们的测试结果,那么其中一个合理的解释就是,拍立淘维护的图像库是亿级数据量,相比于我们的商品图像量级有些大巫见小巫,这样大的量级一方面有更多与用户照片适配的选项,这也对应上上述鞋子目标检测位置不准造成搜索失误的现象,另外一方面不排除歪打正着的可能,入库的时候已经错了,搜索的时候在错误的库里面找到正确的商品,打不着的情况就对应上上述手表搜索到包包的问题。
V2.优化版阿里云拍照搜索
优化目标
扩类目:扩充衣服品类
提升准确率:扩充品类的同时兼顾搜索准确性,因为阿里云拍照搜索提供的完全是个黑盒子,要优化准确率难度比较大,所以当时定的目标比较保守,相对提升5%
优化方法
既然黑盒子里面的目标检测不准,笔者想到的就是先加一个自己的目标检测器,判断图片中要搜的商品属于哪一类,并输出商品位置信息,根据位置信息抠出商品图像输入阿里云图像搜索,具体如下:此时的item可看作为商品库中图像的显著区域,user为用户上传图像质量分最高的显著区域。
回归
上线之后拉了一批线上日志肉眼评估了新版本准确率,类目准确率与细粒度准确率都有了较大提升,衣服类目准确率相对提升11%,鞋子top1 spu维度准确率相对提升41%。
隐患稳定性
正常情况下,整个拍照搜索过程包括
其中阿里云图像搜索算法处理过程200ms,最大支持并发qps=10,整个流程中数据传输平均300ms,笔者为了提升准确率在V2版本又新添了自研目标检测(平均100ms),
使得这个服务流程达到了600ms,这就无疑为服务造成了稳定性的隐患,这个隐患也在五彩石上线前夕被暴漏出来。五彩石上线前一周,各种压测试验占用了大量带宽,导致拍照搜索出现大量的超时情况,找阿里云同学来check问题发现是上传base64编码过程因带宽问题被堵塞。
准确率
尽管加了自研目标检测器让整个搜索结果准确率有了些许的提升,但是他本身固有的问题我们仍然没有解决,即图像特征计算无法入手优化。
V3.自研拍照搜索
架构
图像搜索核心步骤应包括:
目标检测:定位图像中的显著目标
特征提取:提取图像目标特征,输出特征向量
特征搜索:从特征库中搜索与目标特征最相似的特征,输出结果
关键指标应包括:
效率:目标检测与特征提取的计算效率,特征搜索的搜索效率
准确率:目标检测目标定位准确率(是否定位到显著目标,位置坐标),目标特征质量,特征搜索准确率
基于上述核心步骤与关键指标,我们起草了如下自研拍照搜索架构:关键方法数据
在拉取线上日志总结准确率的时候发现有一部分结果错误归因为大人鞋和童鞋傻傻分不清楚,而通常使用深度学习作为特征提取器时图像输入一般为正方形图片,按照正常的图像resize处理时,会有如下结果童鞋的既视感一览无遗。为了避免此问题,笔者在resize步骤采用了letter box的处理方式,即
另外为了丰富样本多样性,笔者对每个训练数据做了随机上下,左右翻转,随机裁剪等操作
TODO:在丰富样本多样性中加入图片随机角度旋转的样本。
模型训练骨干网络EfficientNet:谷歌最新神经架构搜索(NAS)成果,限制推理过程中使用的内存/显存总量,利用其庞大的算力调整网络宽度,深度,和输入图像分辨率,搜索到的最佳网络结构,包括EfficientNet-b0到b7,推理过程同等FLOPs(浮点运算次数)下,效果秒杀大多数网络。
Embedding:全连接层,将efficientnet提取的高维特征映射到128维特征空间中,128维没有特殊意义,是综合考虑性能与效果的折中数字,维度越大效果越好,后续的特征搜索过程也越慢,可根据实际情况调整
交叉熵损失:预训练网络,当作分类问题训练一个多类分类器,使得各层参数基本正确
triplet损失:finetune,锦上添花的作用,将分类网络参数迁移过来,微调网络参数,扩大同类embedding特征相似度,同时扩大不同类embedding特征差异性。
此时item为商品库图像显著区域的特征向量,user为用户上传图像质量分最高的显著区域特征向量。
准确率评估
自研鞋子top1准确率相对原始阿里云拍照搜索提升100+%
该准确率更能反应的一个问题就是最好的与最合适的区别,阿里云图像搜索在拍立淘亿级图像数据库的支撑下与拍立淘互相成就,但在得物平台相对较小的数据量级支撑下自研定制却是最适合的。
效率分析上图为自研拍照搜索服务过程过程,与阿里云图像搜索过程相比,省略了图像base64从杭州发送至上海的过程,且在算法处理阶段只有一步目标检测,所以从理论上来说自研拍照搜索的效率要优于阿里云图像搜索过程,这项优势也在实际线上服务体现出来,且可自行配置服务支持远超于10的QPS。
结束语
视觉是人类获取外界信息、认知世界的主要手段,统计资料表明人类通过视觉获取的信息量接近80% 。正是由于人类对于视觉的依赖,才引领了计算机视觉的发展,而拍照搜索正是综合了目标检测,图像识别等计算机视觉领域的技术。
对未知又喜爱的事物通过理解图像的形式来获取相关商品信息已成为一种日益流行的商品搜索方式,这一点也从得物拍照搜索场景DAU与其引导的GMV日益增长现象体现出来,期待得物拍照搜索的未来发展。
【SmartCode】
扫一扫关注公众号