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

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

相关文章

基于Python实现智能天气提醒助手

《基于Python实现智能天气提醒助手》这篇文章主要来和大家分享一个实用的Python天气提醒助手开发方案,这个工具可以方便地集成到青龙面板或其他调度框架中使用,有需要的小伙伴可以参考一下... 目录项目概述核心功能技术实现1. 天气API集成2. AI建议生成3. 消息推送环境配置使用方法完整代码项目特点

如何基于Python开发一个微信自动化工具

《如何基于Python开发一个微信自动化工具》在当今数字化办公场景中,自动化工具已成为提升工作效率的利器,本文将深入剖析一个基于Python的微信自动化工具开发全过程,有需要的小伙伴可以了解下... 目录概述功能全景1. 核心功能模块2. 特色功能效果展示1. 主界面概览2. 定时任务配置3. 操作日志演示

JavaScript实战:智能密码生成器开发指南

本文通过JavaScript实战开发智能密码生成器,详解如何运用crypto.getRandomValues实现加密级随机密码生成,包含多字符组合、安全强度可视化、易混淆字符排除等企业级功能。学习密码强度检测算法与信息熵计算原理,获取可直接嵌入项目的完整代码,提升Web应用的安全开发能力 目录

Redis迷你版微信抢红包实战

《Redis迷你版微信抢红包实战》本文主要介绍了Redis迷你版微信抢红包实战... 目录1 思路分析1.1hCckRX 流程1.2 注意点①拆红包:二倍均值算法②发红包:list③抢红包&记录:hset2 代码实现2.1 拆红包splitRedPacket2.2 发红包sendRedPacket2.3 抢

利用Python实现Excel文件智能合并工具

《利用Python实现Excel文件智能合并工具》有时候,我们需要将多个Excel文件按照特定顺序合并成一个文件,这样可以更方便地进行后续的数据处理和分析,下面我们看看如何使用Python实现Exce... 目录运行结果为什么需要这个工具技术实现工具的核心功能代码解析使用示例工具优化与扩展有时候,我们需要将

SpringBoot后端实现小程序微信登录功能实现

《SpringBoot后端实现小程序微信登录功能实现》微信小程序登录是开发者通过微信提供的身份验证机制,获取用户唯一标识(openid)和会话密钥(session_key)的过程,这篇文章给大家介绍S... 目录SpringBoot实现微信小程序登录简介SpringBoot后端实现微信登录SpringBoo

使用雪花算法产生id导致前端精度缺失问题解决方案

《使用雪花算法产生id导致前端精度缺失问题解决方案》雪花算法由Twitter提出,设计目的是生成唯一的、递增的ID,下面:本文主要介绍使用雪花算法产生id导致前端精度缺失问题的解决方案,文中通过代... 目录一、问题根源二、解决方案1. 全局配置Jackson序列化规则2. 实体类必须使用Long封装类3.

Springboot实现推荐系统的协同过滤算法

《Springboot实现推荐系统的协同过滤算法》协同过滤算法是一种在推荐系统中广泛使用的算法,用于预测用户对物品(如商品、电影、音乐等)的偏好,从而实现个性化推荐,下面给大家介绍Springboot... 目录前言基本原理 算法分类 计算方法应用场景 代码实现 前言协同过滤算法(Collaborativ

基于Python打造一个智能单词管理神器

《基于Python打造一个智能单词管理神器》这篇文章主要为大家详细介绍了如何使用Python打造一个智能单词管理神器,从查询到导出的一站式解决,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 项目概述:为什么需要这个工具2. 环境搭建与快速入门2.1 环境要求2.2 首次运行配置3. 核心功能使用指

Python实现微信自动锁定工具

《Python实现微信自动锁定工具》在数字化办公时代,微信已成为职场沟通的重要工具,但临时离开时忘记锁屏可能导致敏感信息泄露,下面我们就来看看如何使用Python打造一个微信自动锁定工具吧... 目录引言:当微信隐私遇到自动化守护效果展示核心功能全景图技术亮点深度解析1. 无操作检测引擎2. 微信路径智能获