微信扫码背后的图像超分辨率技术

微信扫码引擎功能强大,但同时也面临着越来越多的挑战。在长按识别场景中,许多码图像经过截图、朋友圈和聊天多次压缩转发,质量严重受损,分辨率下降,边缘变得模糊不清,这给识别带来了很大的困难。具体来说,这主要体现在以下两个方面:

图像分辨率小。例如一些嵌入在海报(如图1)或远距离拍摄的码,其分辨率远小于通常情况下的码图像。

图片

图1.海报中的二维码占比很小

图像质量较低。长按识别的码图像,有很多是经过了多次的压缩和转发,存在严重的人工效应(如振铃效应)干扰。

图片

图2. 经过多次转发压缩的二维码图像质量严重下降

这严重影响了传统的识别算法。一旦遇到这些低质量的码图像,传统算法往往很难给出令人满意的结果。

针对这些问题,我们在识别流程中引入了超分辨率策略,在提高扫码图像分辨率的同时,改善图像质量,以提高识别率。作为QBarAI扫码引擎的一部分,该算法精简高效,支持二维码、小程序码、一维码、PDF417等多种主流码格式。在真实场景下的测试表明,这一策略大大提高了扫码引擎对低质量图像的鲁棒性和识别成功率,使其能够适用于更加广泛和复杂的场景。由于实际应用中二维码占了非常大的比例,下面我们就以二维码为例介绍一下这个码图超分技术。

 

02

算法简介

 

通常情况下,相比于低分辨率图像,高分辨率图像能够提供更丰富的细节,呈现出良好的视觉效果,对于二维码识别这种以图像作为输入的后续流程,也有助于提高系统的整体表现。然而,受成像设备、存储空间和网络资源的限制,我们常常只能获得较低分辨率的图像。于是,超分辨率技术便派上了用场。

超分辨率技术以低分辨率图像作为输入,重建高分辨率输出,是计算机视觉领域的一个经典问题。传统的基于像素插值的超分算法以其计算简单、速度快的优势,被广泛采用,如最近邻(nearest)插值,双线性(bilinear)插值以及双三次(bicubic)插值等。但它们无法适应多样的图像内容,感知能力较差,难以重建出图像的高频信息,输出图像过于模糊,应用于压缩图像时,甚至会放大人工效应干扰。

 

图片

图3. 模型结构

近年来,计算机视觉技术和深度学习飞速发展,学术界开始关注利用深度学习解决图像重建问题。我们根据扫码图像的特点,设计了适用于移动端的超分网络,实现了快速高效的码图像重建,并改善图像质量,大大提高了扫码算法的识别成功率。网络结构如图3所示。图4展示了我们的算法的重建效果。

 

图片

图4. 超分还原效果展示

我们主要实现了以下效果:

扫码图像的的超分还原。对分辨率较小的码图像进行超分还原,得到高分辨率输出,保证编码区域边缘锐利,清晰可辨。

图像质量增强。对于多次压缩转发后的码进行图像质量增强,减小人工效应对后续识别流程造成的干扰。

模型体积小,计算速度快。经过量化压缩后的网络模型仅有13K,远小于当前学术界常用的主流超分模型。

 

图片

表1. 与不同的算法对比

表1对比了不同算法的效果,其中运行时间是在iPhone7上基于ncnn框架使用双线程实际测试得出的。可以看到,我们的算法在识别率和效率上均具有很大优势。

03

相关工作

 

SRCNN[3]将传统的基于稀疏编码的超分方法视为一个卷积神经网络,首次将深度学习应用于超分辨率重建问题中,实现了高低分辨率图像间端到端的映射,图5展示了SRCNN的网络结构。随后又涌现出了FSRCNN[2]、ESPCN[4]、VDSR[5]、EDSR[1]、IDN[6]等许多后继的研究,网络深度和模型复杂度不断增加,旨在提高重建的准确率,得到更高的峰值信噪比(PSNR),并提出了一系列措施在保持网络训练稳定性的同时加快收敛。此处不做赘述,感兴趣的读者可以参阅相关文献。

 

图片

图5. SRCNN网络结构

然而,直接将这些算法应用于二维码图像超分存在一些问题,主要集中在以下两点:

上述模型为了得到更高的重建准确率,体积较大,处理速度慢,不适合在移动端部署。

这些算法针对自然图像的通用超分问题而设计,没有关注到二维码图像本身所具有的特点。

因此,有必要探索尝试新的精简高效的方法。

 

04

二维码超分算法

 

我们基于深度学习设计的超分算法,对特征图进行了充分的重利用,在减小计算量的同时保持良好的重建效果。同时,根据二维码图像的特点,采用了专门的损失函数,以提高后续识别的成功率。

4.1网络结构

为了精简模型体积,加快运算速度,就要压缩神经网络的深度和宽度,这样会带来精度的损失。为了减小这种损失,我们参考DenseNet[7]的做法,在网络中利用密集连接的方式,将网络浅层特征与深层特征连接,来保证层与层之间最大程度的信息传输。

 

图片

图6. 与原始DenseNet的对比

与原始的DenseNet不同的是,我们采用了更精简的瓶颈结构,使3 x 3卷积在低于增长率的特征维度下进行,进一步减小了模型的体积和计算量。上图展示了二者的区别(为了简洁,忽略了激活函数和左图的BN)。根据NTIRE2017 Super-Resolution Challenge冠军队伍[1]的做法,我们去掉了BN层。另外,针对参数量和运算量均较大的3 x 3卷积,我们将其改为depthwise卷积[8],最后增加了一个1 x 1卷积用于特征通道的组合与升维。对于激活函数,相比于ReLU,采用Leaky ReLU可以获得0.6%的识别率提升。

在网络的上采样与重建模块,我们发现,较多的通道数对图像重建的帮助很大,同时,使用额外的重建层对上采样结果进一步增强,也可提升效果。为了兼顾准确率与效率,我们采用了类似的基于depthwise的瓶颈结构实现上采样与重建。

4.2残差学习

 

我们使用原始的低分辨率图像作为输入,在网络最后的重建层使用反卷积上采样到目标分辨率,这样整个计算过程在低分辨率空间中进行,减小了运算量。

 

图片

图7. 残差学习

在超分辨率问题中,主要的任务是估计出图像的高频信息,而输入图像包含了主要的低频信息。如果直接预测高分辨率图像,那么我们可以将网络的学习任务作如下分解[5]:

1)将低频输入信息传递至输出端(auto-encoder的作用);

2)预测图像高频细节。而实际上,低频输入无需网络重建,学习auto-encoder造成了训练时间的浪费。

为了加快收敛速度,我们将这两个任务显式地分离,使用计算量很小的最邻近插值直接将输入图像放大至目标尺寸,作为低频信息与网络输出相加,得到最终输出。通过这种方式,网络只需学习高频残差,从而加快收敛。实验证明,残差学习不仅可以加快收敛,也提高了重建准确度,识别率提高了0.5%。

4.3目标函数

 

与通用超分不同,二维码图像是二值图像,而超分目的是提高后续的识别成功率。因此,最终的衡量标准不再是常用的PSNR,而是识别成功率。下图展示了二维码的基本结构:

 

图片

图8. 二维码的基本结构

相比于自然图像,二维码的纹理模式比较单一,边界分明。识别流程的第一步是将图像二值化,然后根据扫描像素行/列匹配对应比例来寻找定位点。根据这些特点,我们尝试了以下损失函数:

L1/L2 损失。超分重建是个回归问题,可以直接使用L1或L2 loss,经过验证,二者相差不大,L2 loss略优于L1 loss;

边界损失[10]。对于定位图形的检测,边缘清晰与否是一个至关重要的因素。为了使模型能够尽可能准确地重建出清晰的边缘,我们使用sobel算子提取出图像的边缘信息,作为损失函数的权重,以加大这些位置预测偏差的代价。实验表明,这样的目标函数将识别准确率提升了0.8%。

二值模式限制(Binary Pattern Constraint)损失[9]。二维码图像是二值图像,仅有黑白两种颜色组成。但退化后的图像可能会产生介于黑白之间的灰色像素。为此,我们采用二值模式限制损失函数加大对错误计算的灰色像素的惩罚。在L2 Loss的基础上,使用Sigmoid函数的一阶导数作为权重:

 

图片

 

该函数图像如下图:

 

图片

图9. 二值模式限制的权值函数

该函数对落在中间灰色区间的灰度值施以更大的惩罚,从而促使网络输出更符合二维码特性的重建结果,与普通的L2 Loss相比,识别率提高了1%。

此外,我们还对训练数据做了额外的处理。比如,二维码中心区域的logo信息对识别没有帮助,我们直接将其擦除。为了在超分放大的同时提高图像质量,我们还在训练数据集中引入了多种图像退化类型,以增强模型的鲁棒性和泛化能力。

4.4模型蒸馏

在深度网络的应用中,人们常常倾向于设计更为庞大复杂的网络模型以获取更好的效果,但随之而来的是空间与时间消耗的急剧上升。显然,为了能成功地将我们的算法部署在移动端,就要严格控制资源的消耗。有研究表明深度模型具有较大的信息参数冗余,这就为模型的蒸馏提供了可能。所谓模型蒸馏就是将训练好的复杂模型的“知识”迁移到一个结构更为简单的网络中,或者通过简单的网络去学习复杂模型中“知识”。代表工作可参考文献[11]。

在我们的实验尝试中,大模型识别率高但消耗资源多,小模型与之相反。为了进一步提升小模型的效果,我们使用不经压缩的大模型来引导小模型的训练。我们实验了两种蒸馏策略:1)特征层蒸馏,即额外加入大模型的中间特征层作为监督信号;2)直接令小模型拟合大模型的预测结果。实验中,第一种策略没有帮助反而会降低识别效果,而第二种策略则在不同的设定下都可取得0.1%~0.3%不等的提升。模型蒸馏在测试过程中不会带来额外开销,对速度和模型体积均不会产生影响。

经过一系列的精心设计,最终我们的模型量化后体积仅有13K。在困难验证集上的实验测试中,与普通的bicubic插值相比,我们的超分算法的将识别率由39.69%提高到了60.31%,在iPhone7上真机单帧耗时仅6.39ms(100x100),完全可以满足移动端的需求。

05

总结与展望

 

我们针对小分辨率低质量的码图像,综合考虑性能与效率,设计了适用于移动端的超分算法,在保证速度的同时提高了扫码算法的识别成功率。后续我们会结合实际中遇到的问题,继续优化算法,不断完善。

06

参考文献

 

[1]Lim B, Son S, Kim H, et al. Enhanced Deep Residual Networks for Single Image Super-Resolution[C]. Computer Vision and Pattern Recognition Workshops, 2017: 1132-1140.

[2]Dong C, Loy C C, Tang X. Accelerating the super-resolution convolutional neural network[C]. European Conference on Computer Vision, 2016: 391-407.

[3]Dong C, Loy C C, He K, et al. Image super-resolution using deep convolutional networks[J]. IEEE transactions on pattern analysis and machine intelligence, 2016, 38(2): 295-307.

[4]Shi W, Caballero J, Huszár F, et al. Real-time single image and video super-resolution using an efficient sub-pixel convolutional neural network[C]. Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition, 2016: 1874-1883.

[5]Kim J, Kwon Lee J, Mu Lee K. Accurate image super-resolution using very deep convolutional networks[C]. Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition, 2016: 1646-1654.

[6]Hui Z, Wang X, Gao X. Fast and Accurate Single Image Super-Resolution via Information Distillation Network[J], 2018.

[7]Huang G, Liu Z, Weinberger K Q, et al. Densely connected convolutional networks[J]. arXiv preprint arXiv:1608.06993, 2016.

[8]Howard A G, Zhu M, Chen B, et al. Mobilenets: Efficient convolutional neural networks for mobile vision applications[J]. arXiv preprint arXiv:1704.04861, 2017.

[9]Kato Y, Deguchi D, Takahashi T, et al. Low Resolution QR-Code Recognition by Applying Super-Resolution Using the Property of QR-Codes[C]. International Conference on Document Analysis and Recognition, 2011: 992-996.

[10]Svoboda P, Hradis M, Barina D, et al. Compression Artifacts Removal Using Convolutional Neural Networks[J]. Journal of Wscg, 2016, 24(2): 63-72.

[11]Hinton G, Vinyals O, Dean J. Distilling the Knowledge in a Neural Network[J]. Computer Science, 2015, 14(7): 38-39.

原文

https://mp.weixin.qq.com/s/ZEthIoGsIm1KsHheWUviZg

  • 2
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Android 微信扫码库是一种应用程序接口(API)工具包,可以让 Android 应用快速集成微信扫码识别功能。通过该库,应用程序可以轻松实现以下功能: 1. 实现二维码和条码的扫描,并将识别的数据返回给应用程序。 2. 支持多种扫码模式,包括持续扫码、单次扫码、连续扫码等。 3. 提供灵活的配置选项,可以根据应用程序的需求进行自定义设置,例如启动速度、识别准确度等。 4. 提供了丰富的回调函数,可以让应用程序在扫码过程中进行一些逻辑处理,例如弹出提示框、跳转页面等。 5. 集成方便,仅需在项目中添加少量代码即可实现微信扫码功能。 总的来说,Android 微信扫码库是一个非常方便的工具,可以帮助开发者快速实现扫码功能,提升应用程序的用户体验,同时也可以降低开发的难度和成本。 ### 回答2: Android 微信扫码库是一款在 Android 平台上使用的二维码识别库。 作为微信官方提供的扫码库,它可以轻松地与微信打通,使用微信的账号登录、分享与支付等功能。同时也可以识别常见的二维码和条码格式。 它的使用非常简单,只需要在你的 Android App 中添加相应的依赖库和权限配置,就可以快速地完成二维码的扫描功能了。 当然,它也支持自定义扫码界面和扫码结果的处理方式,可以满足不同的业务需求。 总之,Android 微信扫码库是一款优秀的二维码扫描库,简单易用且功能强大,值得开发者们去尝试使用。 ### 回答3: Android 微信扫码库是一个便于 Android 应用程序集成的工具库,其主要功能是使用微信支付SDK所提供的功能,实现二维码的扫描、解码、处理及生成等功能。 Android 微信扫码库内部的实现使用了Camera、SurfaceView、Core、QRCodeDecoder、ImageCode、VideoCode 等技术,综合应用了扫码、图像识别和视频处理技术,支持各种标准的二维码、条形码扫描和处理。同时,Android 微信扫码库还支持自定义二维码的生成,提供了多种生成二维码的接口和方法,使得应用程序可以满足不同的业务需求,使用起来十分灵活简便。 此外,Android 微信扫码库通过微信支付SDK提供的支付功能,可以对扫描的二维码进行支付,实现安全、便捷的支付功能。同时,Android 微信扫码库还支持微信扫一扫的功能,将扫码微信的社交功能相结合,可以方便地实现各种业务场景的交互和沟通,扩展应用程序的功能。 总之,Android 微信扫码库是一个实现二维码扫描、处理和生成的工具库,其功能强大、接口简单、使用便捷,是应用程序开发中不可或缺的一个工具。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值