随着移动互联网的一路狂飙,手机已经成为人们的新器官。出门不带钥匙可以,不带手机却是万万不可以的。而手机上,小小的摄像头也越来越成为各位「vlogger」的口袋魔方。每天有超过数亿的照片和视频被上传到百度网盘中,这些照片和视频大多来自于用户自己的拍摄或收藏,覆盖的主题和内容相当广泛,包括人物、风景、动物、地标建筑、素材等。他们记录着生活,也通过灵感和创意展示着生活。但由数量庞大、种类繁多,这些图像资源的管理和搜索成为了用户的一大挑战。
“好难找啊!”
在和用户的沟通中,“找照片的过程十分痛苦”引起了大家的共鸣。即使网盘提供了云上大空间供照片储存,基础分类搜索后的照片还是如同汪洋大海。有时候为了寻找一张在记忆中“闪现”的照片,需要长时间在时光轴里滑动。
「如果能通过 去年夏天我在海边的照片 这种关键词直接得到照片就好了」。
说干就干。
网盘的技术同学开始广泛调研市面上的图片搜索功能。研究发现,目前大部分都是基于标签的图片搜索方法。这往往需要用户手动或者AI帮助添加标签或关键词,才能进行检索和匹配。然而,由于一张图片往往有很多不同的内容和特征,标签的限制导致用户只能添加少量有限范围内的标签,诸如简单的“猫”,“日出”等,无法全面地描述图片的内容和特征。因此,现有的图片搜索无法响应用户更加复杂的图片描述。
「怎么办?」用户这样问我们,我们就这样问自己。
话不多说,先来看看优化后的实际效果
从「鸟」到「海边的鸟」,从「海边」定位到「我在海边」,从「宝宝」精准到「抱着宝宝逛街」……
百度网盘想做的,做成的,就是从「面」精准到「线」甚至到「点」。
为了解决这个问题,百度网盘引入了基于自然语言的图片内容语义检索方法,这种方法是利用深度学习和人工智能技术,将每张图片转化为一个向量表示,从而通过计算语言向量和视觉向量之间的相似度来进行搜索和匹配。由于向量表示比传统标签更加丰富,因此,能有效实现人们用自然语言搜索图片的目的。
「为什么用向量?」相信这也是很多“行友”的疑惑。
相比传统的标签搜索方法,基于向量的语义检索具有以下优点:
- 用户输入的灵活度高:用户可以直接按照正常说话的方式进行检索,不需要考虑图片是什么标签;
- 检索准确性高:由于向量可以全面地描述图片的内容和特征,因此搜索结果更加准确和全面;
- 可检索的内容广:百度网盘采用百度文心跨模态大模型ERNIE-ViL技术(不错,openai有一个类似的技术clip,这也是最近风靡全球的AI绘画的核心模型),这种技术使用了海量网络数据进行训练,从而可以理解和识别广泛的图片内容,无论是人物、风景、动物、地标建筑、素材等各种领域的图片都不在话下;
因此,在百度网盘团队的努力下,我们真的做到了「精准精准再精准」,图片搜索也不再那么“难”了。
实际技术产品化过程并非一帆风顺,我们遇到了很多问题,这也是业界很多相册管理工具未提供类似功能的原因。从项目立项、效果验证到产品化,我们花了超过四个月的时间,直到22年8月底正式上线和大家见面。“怎么做到的?” “如何理解自然语言” “还能更快搜到吗”……这些都是我们和用户共同关注的问题。
- 搜得到
像“穿鞋子的猫”、“穿正装的照片”这种,传统的标签检索很难搜到。因此,我们选择了语义向量。无论是OpenAI开源的CLIP,还是百度自研的融合了场景图知识的多模态预训练模型ERNIE-ViL,都很擅长解决语义匹配问题。
这类方法的核心原理是将检索文本和个人影像数据映射到同一语义向量空间,文本和个人影像数据向量之间的距离越近,相似度就越高。这样我们通过向量检索,来实现用中文文本查找对应图片的功能了。相比传统先打标签,再关键词搜索的方法,基于语义的检索方案,直接实现了端到端的语义匹配,能够避免语义的丢失。
- 搜得准
在网盘用户的实际搜索中,我们发现,用户存在着复杂多维度组合查询的需求。比如:去年我在三亚海边看日出的照片。其中包含了时间、地点、人物的信息,这就超出了语义向量的能力边界了,语义向量无法精准的判断时间、地点,也无法知道你是谁。
但是,经常拍照的用户应该会说「我们手机拍出来的照片,就包含了拍摄时间、经纬度等相关信息呀!」
没错,我们正是通过提取这些元信息,把经纬度转换成实际的街道名、场所名称从而用来做时间、地点的精确匹配。
「那怎么识别我是谁?」
别急,虽然识别“谁是你”相对复杂一些,但我们也找到了解决办法。在百度网盘备份过照片的用户,应该都知道智能分类。我们会把照片中出现的同一个人物的照片聚合出来,你可以自己给这个人物打上标签,比如“我自己”、“宝贝”等。我们便基于这个标签来做人物的搜索。有了这些信息,我们就可以实现,时间、地点、人物、事件组合的复杂搜索。回到上面这个例子,“去年我在三亚海边看日出的照片”,我们拿到这个请求,会首先解析出里面包含的各个元素:
时间:去年
地点:三亚
人物:我
事件:海边看日出
其中,时间、地点、人物可以用范围查询或者关键词查询来实现,事件适合用语义向量来实现,通过这样的组合查询,我们最终就能得到用户想要的结果。
有些用户反馈,图片的结果太靠后了,「在找图片的时候,总是要翻好几次才能看到,真难」
于是,我们增加了对用户搜索意图的理解,如果识别出来你是想要找图片,我们就会把图片的返回结果放在最上面。
- 搜得快
解决了效果方面的问题,又出现了新的挑战:如何将技术变成用户可使用的产品?由于成本太高,效率太低,很多相册APP并没有把这种功能开放给用户。
「无所谓,我会溜走」(划掉
说正经的!
影响速度的环节有很多,整个过程中,我们首先需要提前对用户的图片进行向量计算,并建立索引,然后查询的时候,能够快速的对用户的query进行分析并完成图片向量的检索,最终把结果排序后呈现给用户。这个流程中我们遇到了很多挑战:
端+云结合:
- 我们在云上对已备份的图片进行向量计算,避免了数据在用户设备和服务器之间公网传输的延时,也弥补了用户设备算力不足的问题,可以快速的完成向量计算的工作
- 在云端完成向量计算后,通过实时数据同步通道,及时下发到用户设备本地建立索引,用户在查询的时候,可以直接在本地完成向量检索
端本地索引优化:为了节省用户本地的索引存储量,同时尽可能减少计算量,我们对索引进行了大量的压缩,优化后,即使图片规模达到10w,向量检索速度也可以达到ms(毫秒)级别,最终返回结果的延时能控制在秒级别。
端+云向量检索流程如下图所示:
1. 请求云端计算文本“黄色的猫”的特征向量和LSH(Locality-Sensitive Hashing,局部敏感哈希)编码;
2. 计算文本和图片LSH编码相等的维数,找到相等维数超过阈值的图片子集
a. 这里使用的LSH编码具有如下特点:相同的维数越多,向量相似的概率越高
b. 这样我们就找到了一批与查询的文本向量相似度较高的图片子集,可以节省后续向量相似度计算的次数。
3. 在候选的图片子集中,计算图片向量与文本向量的相似度,按照相似度,从高到底返回
异构算力调度:除了要每天为新增的亿级别数据计算向量特征外,我们还需要持续的对用户存量数据进行计算。为了让有迫切需求的用户,能够尽快使用到这个功能,我们也提供了申请加速开通图片高级搜索的通道,优先为申请用户计算数据。为了利用一切可以计算的资源来加速计算效果,我们开发了一套能够统一管理CPU、GPU等异构资源的调度系统,充分利用闲置资源,来实现尽可能快的覆盖更多用户。
- 搜更多
除了图片语义检索,我们之前也收到了用户各种各样的找图需求,比如:想搜索图片里的文字、想给朋友圈文案配一张以前拍的图片。
「安排,统统安排!」
针对「搜索图片里的文字」,用户可以在搜索筛选里开启,开启后可能需要等待文字提取完成
在百度网盘,搜索“高级图片搜索”,点击“开启高级图片搜索功能”,点击“立即体验”,等待图片计算并建立索引后即可体验,我们会在计算完成后发送PUSH提醒。
- 变成「黄色的猫」以后
经历了种种曲折,项目最终成功上线。通过检测后台算力,我们高兴地看到申请高级图像搜索的用户占比正在慢慢提升。同时,用户也提出了一些建议和意见,比如图像搜索不够精细等问题。我们了解到,有的用户用这个功能管理视觉素材,还有的管理各种报销发票。前者需要更精细的特征提取,后者则需要引入文字ocr,通过把视觉和文本进行多模态融合搜索,才能满足用户需求。
另外针对有些用户提出的「用户自定义的精细化图像标签能力」,如“我和爸爸的合照”、“我的自拍照”等,这对我们模型训练和预测框架的伸缩性,提出了更高的要求。用户不断多样化、个性化的需求,成为网盘产研例行工作讨论的输入,同时也促进我们继续在技术和产品上思考和尝试。
作为一个智能化的存储工具,网盘已经逐步成为人们日常生活和工作中必不可少的一部分。还记得很多年前,网盘在大家心中的形象局限于“网络硬盘”。甚至互相开玩笑说,「这几个T的空间,什么时候能填满啊!」现如今,这里填满了大家的生活、工作和学习的各种记录,并且也成为大家不可或缺的一部分。变成「黄色的猫」以后,我们感激于大家的信任,致力于不断的技术创新,让用户更快速、准确地找到所需的文件,带来全新的使用体验。
把「猫」变成「黄色的猫」,不是终点,而是一个更高的起点,我们前进的动力不停,学习的步履不止。我们致力于将这只「黄色的猫」赋予更多可能性,从而变成您贴心的朋友、同事与亲人。