淘宝拍照基于端云协同的视频流实时搜索实践

e10dba6ae9f1121e525cc9b4dc8b50af.gif

本文介绍了实时视频流的主体识别场景,未来实时搜将会融合图搜主链路并在XR场景发力,未来的场景我们取名为“元视界”(MetaSight)

1bd5325f31b557dc7a63a3ddb13126c3.png

引言

很多熟悉淘宝的用户知道,点击首页搜索框的相机icon,就可以使用淘宝拍照功能来进行实时拍照搜同款和比价。

0a366591a0a1bb07927081c5ce4a5189.png

这背后就是图片搜索技术在电商领域的应用。正如把大象关进冰箱只需要三步:打开冰箱、把大象放进去、关上冰箱。淘宝拍照的自动识别图搜功能也可以简化描述为以下三步:

  1. 客户端从摄像头获取图像,利用端侧算法识别出主体

  2. 上传图片到云端,云端根据主体特征进行搜索,并返回识别结果

  3. 客户端拉起结果页把图搜结果展示给用户

以上流程是目前图搜的主链路,用户感受到了两个场景:镜头页进行物体识别,结果页展示图搜结果。这套模式已经运行了很长时间。而在拍立淘近一年的发展中,我们一直期望面向未来打基础。我们合并了镜头页,对接了MNN端智能平台,在AR眼镜普及的前夜,希望可以投入部分兵力到XR的阵营,抓住这个爆点。目前苹果已经出了MR眼镜,大概率未来会削弱PC、TV等现有设备的使用价值。而苹果推出AR眼镜的时候,将会迎来一个全新的交互模式。

回归正题,我们从哪几方面来切入,既可以保证业务发展,又可以保持对未来的可能就至关重要。在当时最核心的一个改造点就是将帧上传模式改为视频流实时主体识别模式,实现我们图片搜索到视频流搜索的跨越。

2eacccd9baa07860aba034739883a10e.png

发现问题

然而需求往往来自于身边:在线下特卖会上,大家拿起特价商品但是不知道是否划算的时候,往往手足无措;隔壁团队的某位新晋奶爸同学在线下商场遛娃逛童装店的时候,面对满墙的商品,一时冲动剁手买下多件童装,然而回头用淘宝拍照逐一比价才惊呼遭遇到了价格刺客。实际上不止这些场景,在后台我们也收到了很多用户反馈,典型的比如:“在线下商场和超市逛街的时候,如何能方便快速地和线上进行同款比价”。

视频流实时搜索(后文简称:实时搜)的业务场景就可以很方便的解决用户这部分的体验问题,用户对准一个商品就可以立马获取到商品的简介信息,帮助用户决策。

6a10904b49140fde08b1ba3c613c81b3.png

业务价值

  1. 实时搜将现有app图像搜索模式做了优化,现有的帧上传模式改为视频流实时主体识别模式,实现图像搜索到视频流搜索的跨越。

  2. 实时搜在镜头上通过卡片悬浮提供给用户更多的附属信息的展示,让用户可以通过镜头感知到更多的附加信息。同时通过互动形态减少了用户看到结果的流程,实时性更强。

  3. 实时搜解决用户在商场的场景下,辅助用户增加购物决策力的能力。

  4. 实时搜的互动状态可以带给用户更好的体验,也可以给用户更多的信息提示。

  5. 实时搜辅助未来线上线下虚实结合,打造全新XR购物体系。

82c517cd4e22ecc67e28820e021ad1cc.jpeg

链路分析

对于实时视频流的问题,很多人的第一反应是:视频不就是多帧图片一起播放嘛,那直接对视频流进行抽帧图搜就可以了。然而经过测试,我们发现了以下问题:

  1. 简单抽帧会忽略帧之间的关系,造成主体重复。例如有一个物体在A、B两个间隔时间比较短的帧出现,A是近景,B是远景,简单抽帧会识别出两个不同主体,给用户带来认知混乱的同时,无法做卡片锚定、跟随。

  2. 简单抽帧进行图搜计算会向服务端进行多次网络请求,网络请求的频率和抽帧频率成正比,将给服务端造成很大的压力。

这个场景看似简单,实际上将原有的单帧图像搜索跨越到实时视频流搜索场景,背后有几个问题需要考虑:

  1. 如何解决前后帧中主体的关联关系,即一个在前后帧均出现的主体只展示一张卡片?

  2. 端侧模型大小一般小于10M,如何解决端侧算法资源瓶颈?

  3. 在源源不断的视频流输入中,如何兼顾到性能和用户体验?

d18f9713e4b73354593c54e7d340bdd4.jpeg

方案简介

对于以上3个问题,仔细分析后,我们有以下思路:

问题1:算法需要对视频内容(即前后帧关系)进行理解,对于相邻帧的同一个物体赋予唯一ID。

问题2:使用端云协同的方式解决资源瓶颈,并提升算法的准确性。

问题3:通过批量处理的方式,解决网络频繁请求问题;通过跨端动态化方案Weex 2.0解决商品卡片性能问题,并保证双端体验一致性。

基于以上思路,我们设计了一套实时视频流场景解决方案(实时搜),创新点概要如下:

  1. 端侧算法会视频流进行特征提取,对已识别的主体进行缓存,并且分配全局唯一的ID,以解决不同帧的相同主体重复的问题。

  2. 将服务端识别的结果回流到端侧算法进行修正,以解决端侧算法资源不足而识别不准确的问题,从而提升同款率

  3. 对于端侧算法识别出的主体,数据层进行缓存,并在特定的时间节点上,批量抠图上传到服务端进行搜索,获取主体信息,从而解决服务端的压力问题。

项目完成录制的第一个视频:

44c13e5a49706e7c622f79058f740010.jpeg

数据实现

f5db585ab36aca16d8fb8ad4e9571f04.png

先介绍下整体的架构图,从上到下简单介绍下:

  1. UI层:负责卡片生命周期管理和UI展示等。

  2. 数据层:负责对识别的主体数据进行缓存,并通过批量网络请求进行算法回流矫正等。

  3. 任务管理:主要对算法运算单元的生命周期进行管理:包括创建、运行、销毁、指令分发等

  4. 算法单元:主要封装了对各业务的算法的封装,并且对算法单元使用了相同的指令封装、异常处理、算法信息搜集等

  5. 底座:端侧算法是基于淘宝自研的MNN平台,并使用了UT、流量分发、网络请求等基础中间件。

以下将对数据层和UI层做重点介绍。

  数据层

  • 模型预下载

为了解决算法模型下载问题,会在App闲时进行实时搜算法模型预下载,下载完毕后方才展示业务入口。

  • 端云协同提升算法精度

本方案的算法流程分3步:

  1. 向端侧算法输入实时视频流,算法检测出主体,并赋予主体ID。

  2. 客户端向服务端请求数据,得到更精确数据。

  3. 数据回流给算法,进行算法数据矫正,获取最终数据。

  • 批量请求解决多次请求服务端问题

在计算机工程实践中,我们对于类似的问题的大杀器是“缓存+批处理”,这次也不例外,本方案中通过对主体进行抠图并批量上传的方式,来减轻服务端压力。

  • 简要流程

  1. 输入视频流给算法层,一旦识别出主体来,将返回主体的ID和位置等。

  2. 根据主体位置对视频帧进行剪切得到主体抠图,并对主体信息进行缓存,缓存期间若有相同的主体Id信息将进行更新。

  3. 通知UI层展示兜底卡片,包括简单的主体信息,如品类等。

  4. 定时将缓存的主体图批量上传服务端,进行图搜。

  5. 将图搜结果回流到算法侧,算法根据主体Id对数据进行算法矫正,并返回业务层主体的具体商品信息。

  6. 通知UI层展示商品卡片,并对卡片生命周期进行管理。

▐  UI层

  • 卡片生命周期管理

44f8aa300a962840d8497e0cf04ed827.png

由于业务上流程的考虑,一期我们将卡片分为3个阶段,未来会有更多的展现形式:

  1. 兜底卡:展示最基本的主体信息,如品类等,内容由端侧算法提供。

  2. 小卡:展示商品价格等信息,内容由服务端提供。

  3. 大卡:展示商品详情信息,内容由服务端提供。

其中,为了确保跨端体验一致性和发版效率,除了兜底卡外,其余均由 Weex 2.0跨端框架来实现。

在卡片生命周期的管理上有三个点:

  1. 卡片数据统一管理、更新,服务端请求批量处理

  2. 卡片位置定时更新,并动画进行移动,以便实现卡片跟踪效果

  3. 卡片状态定时检查,检查内容包括卡片是否过期、当前卡片比例等,进行卡片状态切换

  • 卡片防碰撞

在实现的过程中,我们发现在画面中有多个主体的情况下,卡片跟踪会导致卡片相互遮挡的现象出现,这就给后续用户的使用造成了不好的体验,为此设计了简单的卡片防碰撞的机制:

e5caa6b82a0c31ae2c8a11f1c338b6a3.png

如上图所示,每次卡片进行周期性做位置移动之前,均需要根据当前主体的位置来计算卡片的下一个位置,主要会根据两个方面来判断:

  1. 是否和其他卡片重合;

  2. 是否超出屏幕。

最终根据一定的算法逻辑,在每个周期将卡片渲染到最合适的位置。

  • 卡片渲染

为了让用户交互体验更丝滑,交互场景中我们使用了动态化卡片来渲染,目的是让卡片的渲染更加动态且易于改版。同时UI层和底层Native的逻辑隔离开,代码也易于维护。

690c5e3c59ac2d38d83292bc931cd139.jpeg

总结

实时搜是拍立淘团队对于实时视频搜索在电商领域的一次有意义的探索,设计了一套端云协同的视频流实时搜索方法,并实现了全新的用户交互体验方案。

目前实时搜产品还在打磨,未来将会融合主链路并在XR场景发力。基于这个方向我们目前已经发表多篇专利,我们给未来基于实时搜的场景取名为“元视界”(MetaSight),第一阶段会持续向着“AR+GPT”的方向发展,也是期望一切如我们所预料的那样发展。这篇文章作为“元视界”场景的技术能力介绍,期望与大家共鸣。

fc704ec7894c3297529b76ffec92f5f5.jpeg

团队介绍

我们是大淘宝技术搜索终端团队,负责手机淘宝搜索,拍立淘等核心业务的研发和技术创新,同时打造了端侧的搜索终端通用框架,提供搜索领域端到端解决方案,以平台化能力支撑了手机淘宝等多个集团电商和本地生活业务,同时我们和算法技术紧密结合,将端智能和边缘计算充分应用于我们的文本和图像搜索业务,我们研发的产品为亿级消费者提供服务,期待您的加入。
感兴趣的同学可将简历发送到 taozi.ly@taobao.com

¤ 拓展阅读 ¤

3DXR技术 | 终端技术 | 音视频技术

服务端技术 | 技术质量 | 数据算法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/28439.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot--日志

日志的作用? 记录用户登陆日志,方便分析用户是正常登陆还是恶意破解用户记录系统的操作日志,方便数据恢复和定位操作人记录程序的执行时间,方便为以后优化程序提供数据支持 日志是程序的重要组成部分,最重要的用途是…

Redis GEO地理位置信息的应用

Redis GEO地理位置信息的应用 Redis GEO概述应用场景Redis GEO命令GEO命令演示 Redis GEO实现附近人的功能基础类API接口接口实现执行测试 Redis GEO 概述 Redis的GEO操作是一种基于地理位置信息进行操作的功能。它使用经度和纬度坐标来表示地理位置,支持存储地理位…

Flutter 库:提升开发体验——Quick

Flutter 库:提升开发体验——Quick 文章目录 Flutter 库:提升开发体验——Quick一、概述1、简介2、功能3、官方资料4、思考 二、基本使用1、安装2、基本使用3、运行结果 三、List 列表扩展示例四、Map 映射扩展示例五、其它示例 一、概述 1、简介 Quic…

MySQL-索引详解(五)

♥️作者:小刘在C站 ♥️个人主页: 小刘主页 ♥️努力不一定有回报,但一定会有收获加油!一起努力,共赴美好人生! ♥️学习两年总结出的运维经验,以及思科模拟器全套网络实验教程。专栏&#xf…

设计模式(十三):行为型之模板方法模式

设计模式系列文章 设计模式(一):创建型之单例模式 设计模式(二、三):创建型之工厂方法和抽象工厂模式 设计模式(四):创建型之原型模式 设计模式(五):创建型之建造者模式 设计模式(六):结构型之代理模式 设计模式…

微服务_Hystrix

在每个服务中引用该组件,监控当前组件。可被GateWay、Fegin集成。简介 作用:防止服务雪崩 Hystrix是一个由Netflix开源的容错框架,它主要用于分布式系统中的服务间通信。Hystrix通过在调用服务的过程中添加各种容错机制,来保护系…

助你更好的理解 Python 字典

助你更好的理解 Python 字典 字典是Python中的常用数据类型之一,可将数据存储在键/值对中,同 Java 中的 Map 相似。 1、什么是字典理解? 字典理解是创建字典的一种优雅简洁的方法。 字典理解优化 使用字典理解优化函数。 示例&#xff…

深入理解Linux虚拟内存管理(七)

系列文章目录 Linux 内核设计与实现 深入理解 Linux 内核 Linux 设备驱动程序 Linux设备驱动开发详解 深入理解Linux虚拟内存管理(一) 深入理解Linux虚拟内存管理(二) 深入理解Linux虚拟内存管理(三) 深入理…

chatgpt赋能python:Introduction

Introduction 在机器学习中,模型的训练是非常重要的步骤之一。模型训练意味着为数据拟合合适的参数,以便能够准确地预测未来的值。Python是一种功能强大的编程语言,提供许多库和框架来训练机器学习模型。在本文中,我们将探讨如何…

mysql 最常用的一些语句

1 数据库相关操作 CREATE DATABASE IF NOT EXISTS daily-test DEFAULT CHARSET utf8 COLLATE utf8_general_ci; drop database daily_test; use daily_test 具体操作如下图上所示: 2 mysql常用数据类型 MySQL 数据类型 | 菜鸟教程 3 数据库表相关操作…

CSS基础学习--13 Display(显示) 与 Visibility(可见性)

一、定义 display属性设置一个元素应如何显示 visibility属性指定一个元素应可见还是隐藏 二、隐藏元素 - display:none或visibility:hidden 隐藏一个元素可以通过把display属性设置为"none",或把visibility属性设置为"hidden"。但是请注意&am…

chatgpt赋能python:Python怎么抢优惠券?优惠不再是梦想!

Python怎么抢优惠券?优惠不再是梦想! 在如今的消费社会,优惠券已成为人们购物时追逐的目标。而优惠券的数量有限且抢手,往往仅能在短时间内领取,因此初次抢到心仪的优惠券可谓令人欣喜不已。而对于程序员们而言&#…

上线客流人数统计系统实现资源的最大化利用

在流量管理方面,智慧客流采集系统的应用可以帮助商家实现资源的最大化利用。通过对客流量数据的分析,商家可以准确把握客流量变化规律,进而制定出最优化的资源配置方案。 AI客流视觉监控 一、某汽车4S店智慧客流采集系统案例展示 以某汽车4S…

ESXi 7.0 U3m Dell (戴尔) 定制版 OEM Custom Installer CD

VMware ESXi 7.0 Update 3m - 领先的裸机 Hypervisor (All OEM Customized Installer CDs) ESXi 7.0 U3m Standard (标准版) ESXi 7.0 U3m Dell (戴尔) 定制版 OEM Custom Installer CD ESXi 7.0 U3m HPE (慧与) 定制版 OEM Custom Installer CD ESXi 7.0 U3m Lenovo (联想) 定…

python中变量与字符串详解!!

❄️作者介绍:奇妙的大歪❄️ 🎀个人名言:但行前路,不负韶华!🎀 🐽个人简介:云计算网络运维专业人员🐽 前言 初学者经常会遇到的困惑是,看书上或者是听课都懂…

django中url和视图函数path re_path views.py

目录 url的定义url的格式django中的urldjango中的创建自己的urldjango访问测试django中的path动态django中的path动态案例django中的path动态类型django中的path动态案例-计算器django的正则路由re_path() url的定义 url 统一资源定位符 url 用来表示互联网上某个资源的地址 …

详解c++---set的介绍

目录标题 set容器的介绍set的构造函数insert函数的介绍find函数erase函数count函数lower_boundupper_boundmultiset set容器的介绍 set容器可以看成我们上一篇文章学习的K结构的搜索二叉树,所以set容器不仅可以存储数据,还可以对数据进行排序和去重&…

新项目之初性能测试工作如何前移?

最近刚接手一个新项目,在最开始的时候要求对这个项目做性能测试,产品经理也给不出性能需求,只因为这个项目是电商项目,可能会有高并发,秒杀的场景,所以产品经理要求我们对这个项目必须做性能测试&#xff0…

【Linux:进程间信号】

文章目录 1 生活角度的信号2 技术应用角度的信号3 信号的产生3.1 由系统调用向进程发信号3.1.1 signal3.1.2 kill3.1.3 raise 3.2 由软件条件产生信号3.3 硬件异常产生信号3.4 通过终端按键产生信号3.5 总结思考一下 4 信号的保存4.1信号其他相关常见概念4.2在内核中的表示4.3 …

命令行创建uniapp项目

命令行创建uniapp项目 除了使用HBuilderX工具可视化搭建项目外,DCloud官方还提供了一个脚手架用于命令行搭建项目。 环境安装 全局安装vue-cli npm i vue/cli4 -g建议使用vue-cli 4.x版本,vue-cli 5.x与webpack存在冲突,会导致运行报错 …