二维码扫码优化技术方案

1、背景

在过去的 2017 年,支付宝的线下场景不断扩大,收钱码、口碑、共享单车、充电宝、停车缴费等产品让咱们的生活愈来愈便利。二维码由于成本低、兼容性好成为了线上线上最主要的链接工具,也所以面临更多新的挑战。由于二维码是一种点阵式信息编码方式,任何视觉上的缺损、弯曲以及光线做用都会极大的影响识别成功率,若是识别困难也就意味着用户可能选择放弃,影响支付体验也影响用户心智。面试

iOS开发交流技术群:563513413,无论你是大牛仍是小白都欢迎入驻 ,分享BAT,阿里面试题、面试经验,讨论技术, 你们一块儿交流学习成长!算法

用户扫码体验的最关键的主要有如下几个因素:app

  1. 识别率:这是扫码服务的基础指标,识别率能直接体现识别能力,识别率若是没法提升意味着大量的用户将没法使用更便捷的服务;
  2. 识别耗时:包括 app 启动耗时以及图像识别耗时,这是衡量一个用户从点击 app 到正确识别到内容耗时,每增长 1s,将有至关大量的用户放弃等待并离开;
  3. 精准反馈:识别结果不只须要及时反馈给用户,还须要很是精准,特别是在目前线下有多个二维码的场景下,须要避免用户二次操做;

本文将从以上三个方面,分享支付宝扫码技术团队是如何为用户打造一个又准又快又稳的极致扫码体验。框架

2、提升识别率

咱们对用户反馈进行了大量统计分析,发现绝大部分识别失败都是由于二维码并不标准,而且很遗憾的是在使用咱们早期的扫码版本进行识别率测试时发现识别率只有 60%;机器学习

** 策略 1:优化桩点查找算法长宽比耐受
以往的扫码算法,检查长宽比例时容许差别 40%,可是因为使用前向偏差,判断结果跟长宽的前后顺序相关,这会致使有些长宽比失调的码,横着扫不出来,可是旋转 90 度竖着却能扫出来了 (^OMG^)。函数

优化策略工具

  • 经过修改长宽比的断定规则,长宽比将再也不受前后顺序影响;
  • 对于已知长度,修改规则将可接受的宽度范围扩大,加强长宽比的耐受;

在咱们对比测试集中,识别率提升了 1% 左右。学习

策略 2:新增 1:5:1 桩点识别模式模式

在一张图片中,要找到二维码,关键在找二维码特征定位点:测试

image.png

三个角的回字型图案,这就是二维码特征定位点。中间区域的黑白色块比例是 1:1:3:1:1优化

image.png

以往的扫码算法,桩点识别是经过状态机 查找 11311 模式后 取中间位置肯定 x 位置 (此时扫描线在第一行 11311 比例处) 在 x 位置纵向搜索 11311 模式, 肯定 y 位置再以 (x,y) 位置横向搜索 11311 比例,修正 x 位置。这种模式在桩点污损的状况下,识别能力较差只要在任何一次 11311 模式搜索中遇到干扰点,哪怕是一个像素的椒盐噪声也能使桩点查找失败。(支付宝蓝的桩点,会在蓝色区域产生大量噪点,致使识别率低下)

image.png

为此,咱们新增了一种桩点识别方式。在状态机达到 151 模式的时候,开始尝试确认桩点。(此时扫描线在第一行 151 比例处)。
image.png

优化效果

  • 新的查找方法将再也不受桩点中心或边缘部分被污损的影响,支付宝蓝色桩点码识别率明显提高;
  • 修改后识别率总体提高了接近 1%,但识别失败的耗时有所提高;

策略 3: 添加一种对角线过滤规则

在枚举全部可能桩点组合 O(N^3) 以前,对全部可疑桩点进行一次对角线检查过滤。因为桩点对角线也应该知足 11311 模式 ,用这个规则作一次过滤可疑有效减小运算量,也就有效下降了识别成功和失败的耗时。
image.png

策略 4: 基于 Logistic Regression 的二维码分类器

在以往的扫码算法中在拿到三个桩点后,基于夹角,长度误差,单位长度查三个数值,用简单公式计算获得阈值,判断是否为可能的二维码,误判几率较大。

为此,咱们引入机器学习中的逻辑回归算法模型。基于支付宝丰富的二维码数据集,训练出逻辑回归模型,做为二维码分类器,明显下降了误判几率,也将明显下降无二维码时识别失败的耗时。

策略 5: 修改跳行扫描的间隔数

因为输入的相机帧分辨率高,像素点多,运算量大,以往的扫码算法在水平跟垂直方向跳行采样进行计算。但在实际运算中,因为跳过了太多列,错过了 11311 模式中某些 1 位置的点,致使桩点查找失败。

咱们经过将跳行计算行数修改成可配置项,经过线上 AB 灰度测试获得最合适的跳行策略,总体配置此跳行策略后,识别率获得明显提高。

上述优化在测试集的表现

image.png

综上优化,扫码核心识别能力,在 7744 张图片测试集上提升了 6.95 个百分点。

特殊策略优化

除此上述通用扫码优化以外,咱们还对特殊场景扫码能力进行提升。

1. 畸变?不怕不怕!

线下场景复杂多变。饮料瓶身上变形的二维码、超市小票卷起边角弯曲的二维码、路边小贩凹凸不平甚至折叠的二维码…这些畸变的二维码容易增长识别难度,甚至致使识别失败。以往的扫码算法抗畸变策略中,先用透视变换关系创建映射关系。优势是:适应性好,知足大多数应用场景。 不足也明显:对 Version 1 的码,由于映射关系退化为仿射变换,效果较差,手机必须和码平面平行才能方便识别。当物料表面不是平面的时候,效果较差。

优化策略

  • 假设采样坐标系到二维码坐标系遵照一个更复杂的映射关系,而且假设物料表面的卷曲较小,经过使用二次函数能够较好的拟合这个映射关系;
  • 实际发票上的二维码版本广泛大于等于 7,高版本二维码具备多个辅助定位点,更利于构造二次映射表;
  • 基于以上推论,使用新的映射代替旧的透视变换,进行更精准的采样;

用新的策略,发票码这个场景的二维码识别能力提高明显。

image.png

注意:因为采用了加强算法,请对准二维码稍做等待。

image.png

2. 容错识别能力提高

商户或者供应商生成二维码后,一般会在二维码的中间部分贴上 Logo,这部分有可能会使二维码 Decode 时出错。

优化策略:
对于采样后拿到的 BitMatrix,对于中间部分一块矩形区域内的点,采用某些策略来改变中间点的值,使它可以经过容错边界的检查。目前采用两种策略,第一种是反转,第二种是每个点随机取值。目前所取的矩形区域是长、宽的四分之一。

经过此项优化后,扫码的容错能力也获得明显提高。

image.png

3、更小的识别耗时

GPU 计算二值化,下降识别单帧耗时
所谓图像二值化就是将图像上的像素点的灰度值设置为 0 或 255,也就是将整个图像呈现出明显的只有黑和白的视觉效果。下图左边为原图,右边是二值化处理过的图。

image.png

在扫码算法解码前,有二值化计算,图像的二值化计算能使图像中数据量大为减小,并弱化图像模糊、颜色对比度不强、光线过强 / 太弱、图像污损等状况下其余信息的干扰,更利于检测识别。

传统算法是在 CPU 上进行二值化运算,很是消耗 CPU 资源,但其实 GPU 更擅长大规模并行计算,因此咱们选择使用 GPU 来作二值化计算。在安卓平台上使用 RenderScript,iOS 平台上使用 Metal,都是很底层的框架。

优化结果

1.iOS: 统一电池、角度、光线等环境变量, 在 iPhone6 上测试扫码核心 5 种摄像头二值化算法。表现以下:
image.png

image.png

能够看出,在图像二值化方面 Metal 有至关高的优点,相比原来的单纯 CPU 处理快了接近 150%, 同时下降了近 50 个百分点的 CPU 资源。

2.Android 机型众多,咱们抽取了线上数据,能够看到 GPU 在二值化处理中显著下降了单帧耗时 30% 以上。

史上最全的支付宝二维码扫码优化技术方案

4、调度维稳

线下物料千奇百怪,扫码算法为了解决一些不理想的场景,如二维码有遮挡、污损、模糊或角度很很差的特殊状况,须要使用一些比较耗时但比较强大的算法,但普通状况不须要这些算法。因此,咱们对识码算法定了优先级,经过时间推移、跳帧触发等方式调度:

优先级: 暂定高中低三个优先级。

  • 高优先级 每帧执行
  • 中优先级 降帧率执行
  • 低优先级 低帧率执行
  • 不一样优先级的功能执行时机可配置。 不一样功能属于哪一个优先级可配置

特殊场景算法:

为码核心的一种特定能力,如:

  • 反色码识别能力
  • 容错边界码识别能力
  • 污损桩点识别能力等
  • 条码识别能力
相关文章
相关标签/搜索