微信扫一扫背后的秘密:基于运动估计的智能传图算法(转)

2023-11-23 13:30

本文主要是介绍微信扫一扫背后的秘密:基于运动估计的智能传图算法(转),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

作者:valiant、jamy

一、项目背景

图1.1 常见的图像识别应用


  本项目提出的图像算法主要解决如下问题:在移动设备实时获取图像的过程中,让算法自动决定何时进行图片发送请求、何时中断发送请求,并将此策略用在实时的图像检索应用中。
目前的移动端图像检索应用,在选择发送图像时机时,多采用如下两种策略:


  1.将图像不断地发送至后台,根据服务器端反馈结果,来决定停止发送;


  2.加入用户交互,如拍照的方式,触发传送请求,如Google Goggles、百度识图、SOSO慧眼等当前主流视觉搜索引擎所做的那样。


  采用第一种方案,可以保证用户较为方便地使用,由于传图密度较大,可以保证图片的质量比较好,但是缺点也是显而易见的,该策略会造成较大的网络传输量以及服务器端计算的压力;采用第二种方案,缺点是需要加入用户的交互,提高了操作的难度,且要考虑所在应用(如微信扫一扫)已有交互习惯的搭配性,因此其关键点是如何在保证图片质量的情况下大幅减小网络传输量和服务器运算压力。


二、技术介绍


(一)拍照识别与实时识别


  图像识别是需要大数据量和大计算量的,所以一定是要放在云端。图像识别的方式有拍照识别,也有实时识别,但是我们看到市面上的所有产品几乎都是用的拍照识别的方式。其实早在做SOSO慧眼的时候,模式识别团队的同学就在思考一个问题,为什么一定要拍?我想拍照识别的最大好处就是用户意图明确,从而流量大幅减少。但是拍照识别的一个坏处就是用户一定要主动触发,而用户主动触发的情况下,只会进行一次识别尝试,一旦没有识别结果,用户的感受就会很差。如前面所述,实时识别才是更好的用户体验,但是不停传送图片的方法会造成大量的流量浪费,也会造成服务器压力过大。也正是因为此我们在上文中所提到的这些同类产品都没有实时识别的功能,而唯一有实时识别的 Goggles,经过测试,其采用的方案基本上也是定时上传的,只需用一会儿流量消耗就会很大。


  那么我们的想法就是如何判断用户的意图?也就是只有用户确实在对准一个物体的时候会自动地上传一张图片进行识别?而在用户运动的过程中,或者图像模糊的情况下,能够不进行传输。通过这样的方式,实现了智能判断上传识别图像的方法,传输的数据量大幅缩减。


(二)基于运动估计的智能传图算法


1) 运动估计


  运动估计的英文名称是(Motion Estimation). 是视频编码和视频处理(例如去交织)中广泛使用的一种技术。我们这里将本来用于视频编码的运动估计思想移植到手机摄像头来,视频与手机摄像头的图像序列均有共同的连续图像相关性,因此运动估计算法是可以通用的。但是同时这二者又有很多不同点,比如手机摄像头获取图像分辨率往往较低,同时在用户实际使用的时候手机不会有太大幅度的运动。更主要的是,视频编码中所用的全局运动估计算法是非常慢的,即使在PC上也往往不能达到实时,因此我们进行这些特性进行了修改,来使得算法在各种低端手机上也能达到非常高效的性能。

图2.1 块匹配算法示意


  我们采用的是最简单的基于块匹配的运动估计算法,示意图如图2.1所示。根据传入视频图像大小,对于视频帧中间的特定区域在其周围的一个有限邻域内采用由里到外的方式进行搜索。找到最相似的块后,根据二者位置获取两帧之间的运动矢量。搜索过程采用逼近算法,首先进行大步长的移动,找到相似度相对较小的区域,然后在区域内减小步长,逐步逼近得到最终的搜索结果。为了保证算法的高速,对于超过一定阈值的过大的视频帧图像,我们首先进行了降采样的处理。获取的运动矢量包含了方向和幅度两个信息。在手机这种场景中,根据实际的需求,我们所需要判断的运动主要有以下4种状态:运动、静止、运动到静止、静止到运动。其中前两个状态是根据实际的运动幅度判断出来的,后两个状态是根据前面的状态生成的。而运动到静止就是通常使我们认为可以上传图片的时机,而静止过程中的图片我们可以认为其图像区域没有明显的变化(或只有小幅移动),因此只需要上传其中一张就可以了。当然,虽然有了运动矢量,但具体到实际问题,更重要的是考虑防止抖动的影响以及用户慢速运动等很多情况,不能简单用阈值区分。运动估计算法整体流程图如图2.2所示。

 

图2.2 运动估计算法流程图


2) 图像有效性判别


有了上面的运动估计,我们已经可以较好地预测用户的意图,从而在运动到静止状态的时候启动传图到后台的识别过程。但是用户的手机存在对焦过程,并不是每一帧都是清晰的,即使是清晰的图像也不一定适合进行图像或者文字识别。因此有必要对于需要上传的图像进行有效性判断。
为了提高识别率,以及根据图像识别的特征,我们采用基于FAST特征点的清晰度判别算法。针对实际使用的图片,修改训练了一套自己的FAST角点检测引擎,能够有较好的速度和角点检测能力。我们对于有效图片的定义是,第一清晰,第二具有较为丰富的纹理。这两点正好符合FAST的特征,在图片不清晰的时候,往往FAST点较少,在比如较多空白或者单一颜色的图片中,FAST点同样很少,因此只需要对于需要上传图片的FAST点进行判断,即可以获得较为有效的上传图片。
在我们的实际应用中,仅需要在检测到运动到静止状态时,进行FAST点判断的过程,如果为清晰则直接上传当前帧,如果不清晰而后面仍然为静止状态,则在后面的帧中继续进行FAST角点检测,直到获得符合上传条件的帧图像。


经过优化,我们的引擎在iOS主流机型上均具有很好的性能,在每秒处理10帧的情况下,通常1-2帧处理即可进行运动和有效性估计。占用的CPU资源更是几乎忽略不计:

 

三、微信如何“扫”

用户只需要打开微信“扫一扫”界面,进入“封面”或者“翻译”模式,即可进入识别状态,如下图所示:

 

图3.1 微信扫封面界面


其中客户端的处理流程如下:

 

图3.2 客户端-后台处理流程

 

  “扫一扫”从摄像头获取实时的图像,预判逻辑会以一定的时间间隔从实时视频流当中截取图像进行处理,在规定的状态发生后,会自动触发图片发送逻辑,将图片发送至后台进行检索。


四、后续改进


  虽然运动估计的算法已经能够比较简单而且快速地解决了智能上传图像识别的问题,但是后续仍然可以有很多改进的空间,比如可以区分图像和文字特征的不同,采用不同的清晰度判别方法,比如可以加入跟踪算法从而保持在已经识别到的物体尚在视频区域内时,不论其旋转或者拉远拉近,均不会因为图像发生变化而再次启动识别,等等。


  这种探索只是一个简单而初步的尝试,但随着研究的深入,相信实时识别的技术一定会成为图像识别的主流。


附记:


感谢关注微信模式识别团队的最新技术:


微信5.0:


http://weixin.qq.com/

SOSO慧眼:


http://huiyan.qq.com/

转载于:https://www.cnblogs.com/yingkong1987/p/3268980.html

这篇关于微信扫一扫背后的秘密:基于运动估计的智能传图算法(转)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/418265

相关文章

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

微信公众号脚本-获取热搜自动新建草稿并发布文章

《微信公众号脚本-获取热搜自动新建草稿并发布文章》本来想写一个自动化发布微信公众号的小绿书的脚本,但是微信公众号官网没有小绿书的接口,那就写一个获取热搜微信普通文章的脚本吧,:本文主要介绍微信公众... 目录介绍思路前期准备环境要求获取接口token获取热搜获取热搜数据下载热搜图片给图片加上标题文字上传图片

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

如何用java对接微信小程序下单后的发货接口

《如何用java对接微信小程序下单后的发货接口》:本文主要介绍在微信小程序后台实现发货通知的步骤,包括获取Access_token、使用RestTemplate调用发货接口、处理AccessTok... 目录配置参数 调用代码获取Access_token调用发货的接口类注意点总结配置参数 首先需要获取Ac

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

使用Python实现表格字段智能去重

《使用Python实现表格字段智能去重》在数据分析和处理过程中,数据清洗是一个至关重要的步骤,其中字段去重是一个常见且关键的任务,下面我们看看如何使用Python进行表格字段智能去重吧... 目录一、引言二、数据重复问题的常见场景与影响三、python在数据清洗中的优势四、基于Python的表格字段智能去重

Spring AI集成DeepSeek三步搞定Java智能应用的详细过程

《SpringAI集成DeepSeek三步搞定Java智能应用的详细过程》本文介绍了如何使用SpringAI集成DeepSeek,一个国内顶尖的多模态大模型,SpringAI提供了一套统一的接口,简... 目录DeepSeek 介绍Spring AI 是什么?Spring AI 的主要功能包括1、环境准备2

Spring AI与DeepSeek实战一之快速打造智能对话应用

《SpringAI与DeepSeek实战一之快速打造智能对话应用》本文详细介绍了如何通过SpringAI框架集成DeepSeek大模型,实现普通对话和流式对话功能,步骤包括申请API-KEY、项目搭... 目录一、概述二、申请DeepSeek的API-KEY三、项目搭建3.1. 开发环境要求3.2. mav

Python3脚本实现Excel与TXT的智能转换

《Python3脚本实现Excel与TXT的智能转换》在数据处理的日常工作中,我们经常需要将Excel中的结构化数据转换为其他格式,本文将使用Python3实现Excel与TXT的智能转换,需要的可以... 目录场景应用:为什么需要这种转换技术解析:代码实现详解核心代码展示改进点说明实战演练:从Excel到