🙋🏻♀️ 编者按:本文是支付宝体验科技沙龙第 3 期-走进蚂蚁端智能技术回顾系列文章。蚂蚁集团算法工程师面海聚焦移动端视觉算法方向,介绍了面向支付宝 APP 和 IoT 设备双端的算法应用场景、技术挑战、演进路线和架构方案。
本文主要包括三个部分:第一部分会介绍移动端视觉算法在支付宝里的应用场景,以及业务表现情况。第二部分会比较大篇幅地介绍支付宝端视觉算法的一些技术框架,以及我们的一些研发方案。第三部分会简单介绍下我们当前正在做的一些工作,以及面向未来的一些工作。
端视觉算法 @ Alipay
首先给大家介绍整个终端视觉算法在支付宝里面的一些具体应用场景,基本上可以把它分为四个大类。
第一个大类是平台运营。比如大家熟知的新春扫福,就是使用到了移动端的算法,还有很多支付设备里面的互动玩法。这里用到了一些互动技术,以及针对线下很多场景提供的 AR 打卡的功能,这些都会偏运营属性的业务。
第二个大类是平台工具。比如扫一扫里面的识物,比如在支付宝里面的短视频拍摄,也有一些直播,这样一些拍摄工具,里面也会用到很多端上的视觉算法。
第三个大类是个人业务。很多用户会在支付宝里操作的一些个人业务,比如绑卡、转账、开通会员、会员认证,包括做一些基金或者其他金融业务的开户操作等等。这里面都会用到大量的移动端的算法能力,以提升整体用户的一些使用体验。
第四个大类是垂直场景。比如针对商品识别所做的线下 IoT 设备,AI inside 的这种能力,以及在疫情期间,我们为很多线上的服务提供了智能化识别算法,来提升整体效率。
支付宝移动端视觉算法整体的应用范围是非常的广泛,应用的业务场景类型变化也比较大。主要是因为支付宝是一个数字生活平台,基于这个大的定位和背景,业务对于算法侧,无论在能力还是性能层面上,都有非常高的要求。
算法能力上,现在整个支付宝计算机视觉的算法能力已经覆盖了包括分类检测、分割、OCR 等主流的 CV 算法方向。
模型性能上,因为本身支付宝是一个国民级的 APP,它里面有很多的业务,会有大量的比较重的负载场景。我们这个算法也是针对这样一个大背景,实现了低资源消耗,高性能计算这样的能力。
开放生态上,整个支付宝有一个非常强的开放生态。我们在小程序体系里面有很多外部的商家,还有一些机构在里面会为终端用户提供服务。我们的移动端视觉算法会为这些场景提供几乎零计算成本的智能服务。
从业务的角度来看,现在支付宝 APP 线上有数百个活跃模型,这个数字在不断地在更新迭代。除此之外,我们 IoT 也有数十万家的内外部设备会使用到移动端的视觉技术。这是对于内部业务,对于外部业务,大家可以在 APP 上通过小程序的方式接入我们提供的一些解决方案。同时我们的视觉解决方案也会通过蚂蚁的 mPaaS 商业化产品,给外部的 APP 进行输出。
移动端算法在支付宝生态的优势
移动端视觉算法在支付宝里面能够有这么多的应用场景,产生这么多的业务价值,和支付宝整个生态是有比较大的关系,它的优势也比较能够发挥出来。首先第一个,支付宝本身有广泛的业务场景,第二个,支付宝整个用户体量是比较大的。在这两个背景下,一个好的体验,好的移动端的算法,可以为各种各样的业务提供非常低成本的业务使用。
除此之外,大家在使用支付宝的过程中有一个比较大的心智,就是支付宝是非常安全的。移动端上整个数据的获取、加工、处理,都是在用户自己的手机上进行操作,也避免了用户对于个人数据隐私的担忧。同时我们的外部业务也会关心到外部机构的数据合规问题,通过建设移动端算法能力,也能够规避这些合规的风险。
端视觉算法研发挑战
基本上,要能够实现移动端视觉算法在支付宝生态里面的优势。本质上来讲,我们整个算法需要有足够的能力支撑这些业务。当然这是一个非常挑战的事情,同时随着整个手机硬件的不断发展,这个挑战也是在不断地变化。比如在早期,我们最早 2018 年端引擎上线,是配合整个视觉算法的应用场景一起上线。那个时候我们面对的问题是整个算力存储资源和网络流量的这些限制。这个对模型的大小、速度和内存都有比较高的要求,而当时整个业界基本上的能力还是比较单一的。
那个时候虽然出现了一些例如 mobilenet 这种分类网络结构。但是它对于 CV 场景的覆盖是比较少的。同时在应用层面上,也只有一些特定场景的算法。例如我们的人脸检测,基于 cascade 的人脸检测算法,或者是传统的字符分割和识别的 OCR 算法。这种算法对于支付宝的这种广泛业务场景,是比较难以往其他的场景去拓展的。这个时候我们面临的一个最大的挑战就是,我如何样能够有一个统一的框架去研发不同类型的视觉算法。
随着硬件的发展,我们出现了各种各样的芯片,GPU 也好, NPU 也好,这种芯片会越来越强。这个时候我们又面临了另外一个挑战,即碎片化的硬件环境问题,因为支付宝内有 3000+ 机型,现在的端智能到这个阶段,我们看到业界各个大厂在移动端算法的研发上,发展是比较迅速的。但其实大部分都局限于单模型的研发设计思路,或者放弃一些机器覆盖问题。对于支付宝来说,这是不行的。因为支付宝可能一款机型就有几十万上百万的用户,或者说虽然有更好的芯片,但是为了覆盖会牺牲掉高端机的体验。所以在不同的时间阶段,我们面临了不同的挑战。
支付宝端视觉算法发展历程
整个移动端视觉算法的发展历程,也是在挑战的过程当中不断地建设起来的。
这里我们给了几个比较重要的时间节点。第一个,2018 年 2 月份,是端算法在五福场景里面第一次进行大规模的验证。这个时候也开启了传统 CV 算法检测分类的大规模应用。同时在 2018 年,我们也针对支付宝里的个人业务对 OCR 需求旺盛的特点,结合移动端算法在隐私保护、实时体验和数据风险保护方面的天然优势,聚焦了 OCR 这一非常有挑战的 CV 技术方向进行移动端轻量化的工作。这个工作也持续到今天,并在持续进行。在这四五年的发展过程当中,也一直持续保持着比较高的技术水位。
在 2019 年,整个短视频业务兴起,在整个视觉互动方向,我们看到各个 APP 里面都已经培养成了一个非常强的用户心智。我们针对支付宝整个业务的特点,聚焦了视觉互动的一个基础功能,去布局建设了支付宝整个视觉互动技术。
从 2021 年开始,我们着重开始面对碎片化的硬件环境,和引擎团队一起合作,提出了可伸缩建模的技术方案。同时在应用算法层的多个方向,已经验证了一些有效性,后面我将详细介绍这方面的工作。
端视觉算法技术架构
经过这几年的发展,我们形成了一个从模型的研发部署到应用的系统性技术框架。基本上可以分为两个大层。首先下面的两层是属于核心的算法研发部分。其中包括了应用算法,网络结构设计这部分,以及我们和引擎团队在研发模式工具链上面的一些共建的操作。这些工作可以更好地去应对前面提到的有限的计算资源以及碎片化影响环境的双重挑战,从而提升整个端视觉算法的核心竞争力。
向上是我们对于业务侧或者是用户侧的一个透出,包含了两个层面。第一个是属于这种场景模型的自主研发。因为 CV 的算法场景性是比较重的。可能这个业务今天要识别一个杯子,那个业务明天要识别一个笔记本。所以常规性的这种需求会非常多。特别是对于支付宝来讲,自主研发功能可以大幅提升整个应用算法的研发效率,也帮助实现在各个业务场景里普惠使用移动端视觉算法能力。
除此之外,有很多可复用的产品化能力,多个业务方都可以接入。这些能力我们可以封装成一些插件或者 SDK 的形式提供给到不同的业务团队或者是技术团队来接入。
算法轻量化设计思想
面对运行环境以及资源限制,算法轻量化的设计本身对于移动端来说,需要优化的目标是非常多的,可归结为以下三个方面:
首先在网络结构设计上,核心是基础网络充分实现轻量化和精度的平衡,第二,在网络设计好之后,如何充分利用轻量化网络的容量,来充分挖掘网络的容量。第三,移动端本身也有应用层面上的优势,这些优势的使用,可以进一步提升整个移动端算法最终给用户呈现的效果。所以移动端算法的整个研发,不只是一个网络设计的问题,它需要通过算法建模到整个识别流程进行全方位的设计,来达到整体效果的提升。
1. 网络结构设计:网络结构选型
在整个网络结构设计层面上,除了网络对于整个深度宽度这样的调整之外,其实整个设计思想借鉴了 2017 年谷歌提出来的 depth wise 的卷积,以及 2018 年 group convolution 的卷积。这些思想的提出也推进了整个轻量化网络设计比较大的进步。这几个基础的卷积层的操作就形成了几个比较典型或者比较有名的 block 的框架,比如说 Involved Residual Block 或者说 Shuffle Block 这种结构。我们在不同的任务里面也大量地借鉴了这样的卷积层设计,或者称为 block 的设计思想。
此外还有一些工作,我可以引入一些相对来说比较轻量化的计算模块,增强一些特征表达。这对于一些需要提升提取高层语义的任务会非常有效。例如文字识别。这里简单给几个数据,就是前面提到的移动端 OCR。因为 OCR 本身是一个非常重计算量的视觉方向。我们通过在网络结构这方面的调整,已经实现了 OCR 检测和识别模型加在一起,基本上能达到 1M 左右大小的规模。同时在计算速度上,检测速度基本可以在 40 毫秒,即可完成一张图的文字检测。单行文字的识别速度可以达到 9 毫秒。
有了网络结构设计之后,第二部分的容量已经定了。那么如何能够更好地去使用这个容量,去学习我们需要完成的识别任务呢?比较直观的一个做法就是蒸馏。它可以很好地挖掘模型容量。移动端整个网络结构设计还是从一个服务端的大网络转化而来的,所以通过大网络对小网络进行蒸馏的学习,可以进一步地提升整个网络容量的利用效率,有利于提升整个网络精度,减少整体训练时间,提升训练稳定性。
2. 训练策略:容量的充分利用
关于第 2 个部分,需要强调的一点是数据对于轻量化网络设计的重要性。这里给了一个简单的例子,例如一个线性分类器和一个非线性分类器。更多的训练数据更有助于比较简单或者轻量化分类器的参数学习。
对于轻量化网络来说,数据会变得非常重要。同时数据本身对于所有的算法研发来说,都是一个难题。特别是对于一些新兴的业务。这时候我们大量使用到弱监督学习这个技术方向里面的技术来提升数据的使用率,让整个小模型也能够学到很好的知识。
模型有了网络结构训练好了之后,第三个工作就是可以使用定点化。定点化计算方案可以实现网络容量的进一步压缩。从我们整个实测来看,现在的一个 INT8 计算代替浮点计算,整个计算速度基本上可以加速一倍。同时也可以减少一半的内存占用,这对整体尤其是低端机的受益是非常大的。
这里我给个示例,关于训练策略的使用,这是比较特殊的一类网络的轻量化。即对抗生成模型,GAN 网络的轻量化工作。本身 GAN 这个方向的模型结构差异是非常大的。不同网络的整个模型结构差异很大。同时它的轻量化难度比较大,因为它有生成模型,有对抗模型。它训练中可能还有多个对抗模型,所以它牵扯到多个网络的同时轻量化,它的训练其实很难保证稳定。我们基本上采用了一个蒸馏的框架来完成这项工作,把这个效果的调优和我们轻量化的设计进行一个解耦。我们使用一个统一的轻量化网络结构来完成这个训练。大网络主要是为轻量化网络提供它学习用的数据。对于全图大分辨率的计算速度,以及人脸小分辨率的计算速度,都能够达到实时或者准实时的要求。
3. 场景化设计:精度进一步提升
整个网络结构的模型训练已经完成了,在使用到移动端时,移动端本身的特点可以进一步地对网络精度进行提升。这里我们称移动端的流式识别和本地化的实时计算优势的结合。因为数据采集和计算都在本地完成的,所以通过实时视频流里的多帧信息融合,可以进一步提升算法在应用层的一些效果。这里可以通常来讲,我们可以在前处理和后处理的部分都会增加一些这种流式识别的融合模式。
我举两个例子,一个是场景化数据,这是在前处理层面上。例如在人脸的检测,或者是肢体关键点检测,因为它可能有多方向的很多姿态的。但是因为整个的动作是一个连续的动作,所以我们在整个使用过程中,在预测推理的过程中,会使用前一阵的预测角度去对它进行一个预转正。就是在整个模型学习的过程中,我更加关注去学习一个相对正的人脸,比如说关键点,比如一个正的人体的姿态的学习,这样一个紧凑的样本空间,本身就可以降低模型的学习的难度。这些应用本身大量是使用在互动场景,它对实时性要求非常高。所以我可以把整个模型压得更小。从整个测试来看,它的预测误差或者预测精度会有比较大的提升。除了这种前处理的方式,另外一个就是后处理,后处理相对来说比较直观一点。它主要是提升精度,或者是在感知方面来提升精度,对于互动方向主要来提升整体稳定性。例如前面提到的五福的模型,我们不是以单帧的结果来作为最终的结果。它是有一个多帧投票策略在里面,它的识别精度可以提升到 99.9% 以上。
对于互动场景来说,例如对于人脸的 2D 3D 的关键点回归,中间的结果平滑可以对一些大角度,快速或者慢速的运动效果都能够达到一个比较好的跟踪效果。下方有个演示视频,上面是带后处理模块的,下面是不带后处理模块的。如果没有这种后处理,它的抖动是非常明显的。特别是对于大角度看,眼睛部分的关键点已经开始飘了。
面向碎片化硬件的模型研发
前面我主要介绍了我们在应用算法层面上的一些研发思路和整个研发过程。现在将介绍另外一个挑战,即碎片化硬件环境的问题。之前我们所有的研发模式基本上都是叫单模型的研发模式。就是为了保证在支付宝 APP 所覆盖的这些机型的覆盖率。因为一款机器可能有几十万上百万的用户在使用,所以我们基本上是以最低端设备作为我们的优化目标,这个时候便带来了一个问题,我的算力越强,我可以用更大或者性能更好的模型,这个时候为了兼顾低端机去牺牲了它的体验。
为了避免这个问题,我们在手动研发模式的时候,会采用一种方式叫分级模型研发。我会在中高低端手机里面会挑几款主流的机型去进行模型研发。这种模式本身的研发成本和我们选择机型的数量就是相关的。这个效率其实是很低的。针对这个问题,我们也和引擎团队一起去探索另外一种新的研发模式:可收缩建模。框架层会提供整个模型训练的研发框架,我们在应用算法层面上,会进行这个建模方案的设计。
这里举一个例子,是我们今年上半年做的一个工作。我们首先要定义一个权重共享的动态化的超网。在每次训练过程当中,会采样里面的不同子网进行更新。收敛之后,这些子网之间的权重是可以共享的。这个子网训练成之后,就可以对不同的子网精度和耗时有相应的分布点状图。有了这个点状图,我们可以根据不同机型的性能要求,对里面进行采样,然后达到自动化的分级模型研发。一次训练便可以产生不同性能消耗下的多级模型。同时它本身是带有网络搜索这样的概念在里面。所以相对于手动设计,它可以探索到更多样的网络结构。
基于可伸缩建模的端算法研发
在整个可伸缩建模里面,在应用算法设计层面上,我们其实要考虑几个因素。第一个,算法研发的 Loss 和评价要一致,这个是蛮重要的。因为我们在很多任务里面使用这种框架,有可能它的训练会不稳定,有可能会搜出来的这种网络结构不够好。很大一部分是因为里面的一些不一致的问题影响的,那么这个便可以提升整个超网训练的稳定性。
第二个,整个移动端算法会有异构的问题存在。异构的情况下,模型的设计层面需要去使用这些适用于不同 backend 的结构或者算子。这是需要算法和引擎团队一起去配合,去做一些挑选的。
第三个,这本身是一个为了提升效率的方案,我不太可能拿一个非常大的模型,或者大的搜索空间去进行搜索,这非常的耗时,耗计算资源。所以在整个应用算法层,我们在定义搜索空间时,会在已有的轻量化网络结构周围进行搜索,从而降低整个搜索的复杂度。
下面这部分给大家介绍的是一个使用案例,这有两个业务模型,handcraft 是我们最早的手动设计的网络结构。后面这个是我们通过可伸缩建模搜索出来的。然后从这里面去采样了高中低档三档的模型结构。
从两个业务模型的角度来看,首先结果来看,我们可以到得到一个一致性的结论。第一,本身这样的框架能够一次性产出多个高性能的分级模型。第二,它有助于下探一个模型的性能。就是在这个结构搜索空间进行定义之后,得到的这种 tiny 的模型,在同等计算量情况下,它的精度其实是普遍提升的。或者是我们一个相同精度下,它的速度提升其实也比较明显,所以这个是我们目前在 OCR 分割检测分类这些任务里面都会频繁使用的这样模型设计思维的一个研发模式。
支付宝端视觉算法能力
通过端视觉算法全链路的建设,以及和引擎团队在可伸缩建模研发方案上面的探索,现在我们在蚂蚁或者支付宝的移动端视觉算法里面,无论是我们的网络结构、视觉算法的类型,还是上层应用透出,都已经达到了非常大的覆盖。这里大概列出了几个我们常用的一些场景,包含了视觉感知类的任务,以及视觉互动类的任务。同时这些任务也在支付宝里面通过了一些封装,会以插件的形式给到内部或者外部的用户去使用。
端视觉研发未来展望
最后介绍一下我们当前正在做的一些工作,以及未来一两年内可能会持续探索的三个方面。
第一,网络结构的演进,我们其实和引擎团队一起在配合,在深挖,就是 transformer 这种新的架构在端上的使用,因为它的计算量还是比较大的。我们目前已经在一些相应的任务上使用,主要聚焦在视觉感知这个方向。比如说 OCR 的检测和 OCR 的识别,当然它现在性能层面上比传统的 CNN 结构还要差一些,还没有达到那么快的速度。但它的精度提升是非常大的,我们在这个方向也在持续的演进。
第二,训练方式的演进,移动端视觉算法对于数据的依赖非常重。我们之前的方案都是希望能够例如通过弱监督或者主动学习这样的学习方案,去尽量使用不完整的标注样本,或者是带噪音的标注样本。我们今天也在去探索预训练模型在整个轻量化模型、网络结构训练过程当中的作用。我们现在在分割场景、大规模商品识别场景里已经有了一些初步的结果,希望后面能够有机会再和大家进行分享。
第三,研发模式的演进。主要是面向我们整个异构的 backend。基于跟引擎团队在可伸缩建模上面的研发,希望能够打通从模型结构设计到模型结构搜索,在应用部署层面上能够打通整条链路。能够在支付宝 APP 里面实现真正的千机千模概念,能够真正的在视觉上为不同的机型的用户能够提供更好的用户体验和算法服务。