邓亚峰:如何打造一流的视觉AI技术
导读 :本次分享主要分以下几个部分 :首先简要介绍一下计算机视觉技术的邓亚打造相关背景,然后结合格灵深瞳的峰何实践 ,从算法研发、视觉训练平台、技术智能数据处理 、邓亚打造异构计算等几个方面着重介绍如何打造一流的峰何视觉AI技术 ,最后介绍格灵深瞳在相关技术落地方面的视觉情况。
01
计算机视觉及其相关技术
1.计算机视觉概述
计算机视觉作为人工智能领域最重要的技术技术方向之一,其基础是邓亚打造机器学习算法,而深度学习算法无疑是峰何当前最受欢迎的机器学习算法 。随着计算机算力的视觉不断增强 ,海量数据的技术增长,深度学习算法的邓亚打造提出使得用更大量数据训练更深的网络成为可能,在限定的峰何场景下 ,一些图像识别算法的视觉准确率已经超越了人类 。从应用角度,我们正处于计算机视觉应用爆炸性增长的智能时代 ,包括移动互联网、自动驾驶 、智慧城市、智慧医疗、机器人 、增强现实 、智慧工业等在内的多个方向 ,都取得了非常多的进步 。从另外一个视角看 ,计算机视觉是对物理世界的数字化 ,是智慧物联网时代最大入口 ,和大数据技术结合拥有非常广阔的应用场景 。
2. 计算机视觉技术愿景
计算机视觉技术从广义上讲是让计算机看懂世界 ,狭义上讲就是通过丰富的视觉传感器 ,理解物理世界中每个物体的位置、属性、身份以及行为等信息。
计算机视觉技术从算法方面期待:
- 功能更加丰富 :感知方面从位置检测 、属性识别、身份识别,逐步向行为识别和关系识别(不同物体间的关系)发展;
- 目标类别更全:分析目标从人脸、人体 、车辆 ,拓展到商品 ,再拓展到其它物体;
- 理解粒度更细 :从理解图像中包含什么物体的分类任务 ,到理解物体在图中的具体位置和数目的检测任务,进一步到理解物体的部件以及关键点位置的关键点定位技术 ,更进一步到理解每个像素所属类别的语义分割任务 。
计算机视觉技术从产品性能角度则期待:
精度更高 、速度更快 、成本更低、支持规模更大、功能更丰富 。
--
02
如何打造一流的视觉AI技术
1. 构建计算机视觉系统的基本流程
对于一个视觉应用系统而言,需要先将应用系统划分为不同的子模块 ,比如人脸识别系统,就包括人脸检测 、特征点定位、人脸识别等不同子模块 。对于每一个子模块,都由输入输出定义 、数据收集、数据标注,训练框架选择 ,算法实现 ,模型训练,模型选择,模型上线等不同步骤组成。
2. 构建视觉计算系统的关键因素
构建计算机视觉计算系统主要包含下面几个关键因素 :
- 核心算法研发 :即如何开发出更准确、更快、更多功能的算法;
- 自动化大规模训练框架 :即如何支持更大规模集群 ,更加自动化地训练算法;
- 智能数据挖掘和标注 :即如何做到高效的数据挖掘和低成本的标注;
- 基于硬件平台的计算优化:即如何选择硬件平台,以及在硬件平台上做性能优化 。
(1)核心算法研发
算法研发是一个不断迭代、精心打磨的过程 ,工业界和学术界最大的区别是学术界希望创造更多的算法,追求更多的是新颖性和创造性,而工业界追求的是系统的功能、性能 、稳定性指标 ,并不要求发明最新颖的算法,而是要依据业务需求和资源限制做出最好用的系统 。在工业界进行算法改进 ,包括很多维度 ,如数据如何处理、数据规模和来源,参数设置、模型结构 ,还包括损失函数设计 ,模型加速算法等,每一个因素都可能对最终结果影响很大 。还有非常重要的一点是 ,需要从系统角度去解决问题 ,比如设计新的系统处理流程 ,比如把问题定义为检测问题还是识别问题 。
- 人脸识别损失函数演进
以人脸识别算法为例 ,由于我们无法训练一个能分类世界上所有人的分类模型 ,所以人脸识别最终是希望训练一个将人脸图像转换为表示能力非常强的特征模型 ,这里面非常核心的是损失函数的设计 。最早的人脸识别算法是采用了softmax损失函数,但softmax损失函数的缺陷是当类别数非常大时参数规模非常大,并且 ,要求每个人的样本数比较均衡,且不能太少 ,很多时候无法满足 。后来出现了pair-wise形式的损失函数 ,这个损失函数将分类转换为两类问题,即同一个人以及不同人两类 ,希望同一个人两张图片之间的距离尽可能小 ,而不同人两张图片之间的距离尽可能大 ,从而不会有类别太多的参数规模问题,且不对样本数目有太多要求 。后来还出现了Triplet 损失函数形式,要求同一个人图片之间的距离小于不同人图片之间的距离。但是pair-wise和triplet损失函数的缺陷是容易受数据噪声影响 ,比较难训练 ,收敛也比较慢。后来大家又发现,将softmax形式做改进可以取得很好的效果,包括对特征的归一化 、权重矩阵的归一化以及加margin等 。所以 ,我们看到仅仅是人脸识别损失函数这样一个技术点,就包含了非常多的选择和迭代。在工业界,想真正做好一个算法模型 ,就都需要跟踪很多工作 ,同时由于论文里的很多结论在大规模实际数据情况下,和论文中的结果可能会不同,所以需要结合实际数据和场景进行一一验证 。这要求我们在工业界真正想做一流的算法 ,不仅仅要求我们可以正确理解论文中的算法思路,还要求能够在工业界的数据规模下正确实现 ,并设置正确的参数和训练技巧 ,同时还需要结合实际情况去改进 。
对于人脸识别系统而言 ,损失函数是影响人脸模型表示的一个因素。除此之外还包括训练数据的数据量 、纯度和数据分布,数据增强的方式,比如收集的数据往往数据质量比较高,为了使得模型在低分辨率数据上有好的效果,需要在训练过程加入相应的扰动 。除此之外 ,人脸识别的前序模块,比如人脸检测和特征点定位的精度也会影响识别效果。还有包括如何利用模型蒸馏等方法进行速度提升,如何利用人脸的多个部件融合进行效果提升,在视频中 ,如何通过人脸质量属性选择最优的人脸进行识别,如何融合多帧图像进行处理等。对于一个人脸识别系统而言 ,上述的每一个因素都会影响最终的系统效率和用户体验 ,每一点都需要精细打磨。
每一个智能系统都是由多个智能算法模型组成的 ,以我们针对智慧城市、智慧商业领域研发的智能视频理解系统而言,包括几百个模型 。这个系统里面,从大的方面讲,包括物体检测 、人脸识别、人体智能分析 、车辆智能分析等几个大模块,具体到比如智能车辆分析这个子方向而言 ,则包括车牌识别、车型车款识别、车辆以图搜图(ReID)、车身颜色识别、标志物识别、未系安全带、开车打电话等很多子模型 。
对于如此多的算法模型,如果每个模型都需要不断迭代,同时要支持不同硬件平台的不同版本 ,在研发人员和训练硬件资源受限条件下 ,如何持续打磨核心算法是一个很大的挑战 。传统的算法开发模式 ,算法工程师往往提起数据标注任务,由数据标注员标注完成数据标注 ,但算法工程师需要关心如何开发标注工具 、如何培训标注人员、如何转换数据格式 、如何提纯标注完的数据,最后再手工方式在一台物理机上将模型训练出来。这种模式下,算法工程师有60%的时间都在处理和数据相关的工作 ,比如搜集数据、指导开发标注工具 、清洗标注数据或者发起二次标注;还有20%的时间是在调参数 ,看训练日志 ,包括处理磁盘空间不足 、GPU被别人占用等意外;其实只有大约15%左右的时间在实现算法 ,仅有5%的时间在思考算法 。同时,这个模式的缺点是数据标注成本很高,算法工程师的时间利用率很低,同时由于没有统一协调 ,GPU或者空闲或者被大家抢占,GPU的利用率也很低。
更好的一种模式是为算法研发团队配备一个数据平台开发团队 ,专门负责算法团队所需要的数据以及训练平台 。也就是说 ,算法团队仅仅需要提出数据的需求和要求 ,其它都由数据平台团队去完成 。数据平台团队负责数据的收集、标注前处理 、标注工具开发 、标注后处理、训练和测试数据管理等工作,其目标是为算法团队用最高效低成本的方式提供高质量的训练数据。同时,为了提升训练效率,数据平台团队还需要负责打造统一的训练平台。这种模式下,算法工程师的工作20%花在沟通确定数据处理流程 ,同时由于有统一的训练平台 ,算法工程师只需要花费大约10%的时间在训练调参上 。那么自然就会花费更多的时间在实现算法和思考算法上。这种模式下,不仅仅算法工程师的效率得到提升,而且数据标注成本在降低 ,数据增长速度在提升 ,GPU利用率也在提高 。还有一点非常重要的是,智能数据处理平台在正常运行下 ,只需要标注人员进行标注,数据量就会不断增长 ,不依赖算法以及开发人员的投入,这是未来任何一个智能学习系统需要具备的特性。
(2) 自动化大规模训练框架
构建自动化训练管理平台的目的是为了提升人员产出效率,节省人力,提高训练资源的利用率 。一方面对训练数据进行统一管理 ,每台机器都能访问,避免在机器间拷贝;第二,对训练代码和参数进行管理,实现代码 、参数 、环境自由在多台机器间拷贝 ,省去环境搭建的时间;第三,对计算资源和任务进行管理,省去工程师关注资源空闲的时间 ,同时,可以在没有空闲资源时任务排队 ,省去关注时间,同时提升资源利用效率。此外,为了避免算法人员看日志的时间花费,增加模型评估和选择,自动评估和选择模型 。对算法人员而言,可以在网页新建任务,选择训练数据 ,确定代码和参数 ,就可以开始训练,同时可以设置几套参数进行训练,最终等待训练产出的最优模型即可 。
现在已经有很多优秀的深度学习开源框架 ,比如tensorflow、mxnet 、pytorch等 。有一些创业公司,自己自行开发了一套自己的开源框架,但我个人认为其实没有太大的必要 。一方面 ,私有的框架,很难保证比开源框架更加先进,开源框架吸收了世界上最先进的思想,有很多优秀的人会产生贡献 ,创业公司很难有这样的实力做得更好。此外,自己开发的框架 ,对于新入职员工而言有使用门槛,此外,由于很多好的算法都是在开源软件基础上做的 ,使用自己的框架也不利于进行技术交流 。但是,是不是直接利用开源软件就够了呢 ?我想答案也是否定的。现在的开源框架 ,在大规模数据训练方面做得还不是很好,总是会有一些特别的任务是开源软件无法支持的 。所以,基于现有开源软件 ,根据自己的任务做框架改进是一个对大多数公司而言都更加合理的选择。
比如对于人脸识别任务而言,最终是一个上亿类别的分类问题,如果直接采用现有框架 ,是无法完成这个任务的 。采用softmax作为损失函数,在特征维度仅仅是128维时,最后一个权重矩阵的数据规模是几十G,远远超过了现在显卡的显存 。我们必须实现一种新的框架来完成数亿类别的训练任务。我们采用了一种“数据并行+模型并行”的方法 ,先将数据分配到不同的GPU上 ,先进行前向预测计算得到经过卷积网络之后的特征,然后将不同卡上的特征进行汇聚。但权重矩阵在一台机器上是无法保存下的,因此,需要把权重矩阵分配到不同的机器上进行运算这个时候就用到模型并行思路。我们知道 ,在并行计算中,计算是比较容易通过并行解决的,但是,通信量往往会成为瓶颈。我们设计的这个数据并行加模型并行的方式,只需要把所有样本的特征在多机间做同步 ,数据量很少,所以可以得到很高的加速比。
(3) 智能数据挖掘和标注
我们大家都知道数据很重要 ,但如何低成本、高效地获取大量高质量数据其实是一件不那么容易的事情 。最简单处理数据的方法就是收集数据直接人工标注,但直接标注的缺陷是效率很低,比如直接标注百万级别人脸数据,需要花费近百万费用,如果标注数亿数据,费用显然是无法承受的 。一种常见思路是选择标注工作量小的有先验约束的数据源 ,如相册数据,每个人的相册基本上都是来自于家人或者朋友的数据,这样的数据,直接标注也不合理,比如隐私问题,比如人的标注准确率问题 。
我们实现了一套人脸自动数据标注系统 ,包括如何从图片中检测 、定位人脸 ,包括人脸区域割取、特征提取,包括人脸质量获取,以及基于人脸质量做过滤 ,包括做子集中的聚类,以及类间去重 ,以及训练人脸模型 ,同时,人脸模型还可以反馈重新进行人脸特征提取和聚类,不断迭代。当然,实际系统要更加复杂 ,有非常多的参数和细节逻辑,但是,这样的一套系统,使得人脸识别数据标注成为一个自动化的过程,基本上不需要人工再参与,节省了大量的标注人力。类似的案例还有很多,比如可以依据车牌号码进行车辆相关数据收集 ,可以只标注一辆车的属性就可以得到同一个车牌的多辆车的结果。总之 ,实践表明,在数据上花费的所有努力都是值得的 ,这已经成为技术驱动的创新型公司的核心竞争力之一。
数据平台团队,除了准备数据和开发训练平台外 ,还可以参与算法的训练和改进工作。很多算法,经过算法工程师的迭代之后,在算法方面已经相对确定,更多的是调参和数据相关工作。这一块是可以由数据平台工程师通过数据驱动的方式来改进的。比如,我们在一些任务中,就在算法工程师基本不需要参与的情况下,数据平台工程师通过高效挖掘困难数据并标注的方式可以使算法持续改善。
上述的智能数据处理和自动化训练平台系统,结合起来,在我们的内部被称为深瞳大脑项目 。深瞳大脑的终极目标是希望将人工智能中人工的部门减少到最少 ,打造一套动态更新的“数据采集->标注->算法研发->模型训练->产品落地->数据产生”的闭环系统,最终仅仅在数据标注环节依赖人工 ,成为一套真正的基于自主学习的智能系统。
(4)基于硬件平台的计算优化