机器之心专栏
作者:腾讯光影研究室
MAI(Mobile AI Workshop)是由 CVPR 主办的 Workshop 竞赛。MAI 2021 挑战赛赛已于 2021 年 2 月至 4 月线上举行。近期,MAI 2021 公布了各项挑战赛的最终结果,腾讯光影研究室的 Tencent GYLab 团队在单目深度估计项目上以绝对优势获得冠军。
竞赛结果及相关论文可见:https://arxiv.org/pdf/2105.08630.pd
任务介绍
MAI 2021 单目深度估计挑战赛:基于 RGB 图的实时高性能单目深度估计,任务要求在移动端硬件上对输入的图像实时计算出其场景深度。
输入:输入文件为 RGB 图像,其分辨率为 480x640;
输出:对每一张输入文件,计算出其场景深度。输出深度的分辨率与输入图像分辨率相同;
评价指标:评价方式分为精度指标和速度指标两部分,参赛队伍提交模型(TFLite),由比赛主办方负责在标准平台上测试得出两部分指标。
其中,精度指标:si-RMSE,表征预测得到的深度和 Ground Truth 在 Log 域上的距离,即 Scale 的距离;速度指标:通过测试 TFLite 模型在树莓派(Raspberry Pi 4)上的运行耗时得到。最终排名以精度指标和速度指标相结合的方式呈现,其计算公式为:
团队成绩:来自腾讯光影研究室的 Tencent GYLab 团队以绝对优势获得冠军。
比赛难点有以下两点:
引言
单目深度估计任务与语义分割任务类似,都是针对输出的特征图(Feature Map)在像素层级上的监督。两者的区别在于传统的语义分割可以视为对每个像素点的分类任务,而深度估计可以看作对每个像素点的回归。
Tencent GYLab 团队参考常规语义分割模型的设计方式,使用编码器 - 解码器( Encoder - Decoder)的结构,并加以知识蒸馏的方法,实现了移动端高效且高精度的单目深度估计算法。
算法技术方案
模型结构设计
涉及到移动端上的模型优化,网络结构是绕不去的一环。单目深度估计模型采用类语义分割模型的编码器 - 解码器结构,在此基础上逐步进行模型的剪枝与小型化。
由于模型部署的硬件是树莓派(Raspberry Pi 4),且模型会在 FP32 精度下以常规 CPU 测试,因此首先需要明确此次模型小型化的优化目标:对 CPU 运算友好的结构,且不含各类框架、指令集的优化。
我们采用了以 Depthwise 卷积为基础的 MobileNetV3 作为模型的编码器,以逐层两倍上采样的方法构建 解码器,两者之间以残差连接(Skip Connection)相连。在上采样的过程中,我们使用 Resize + Depthwise 卷积的方案代替传统的 反卷积(Deconvolution),以求在保持精度的情况下获得高快的速度。
我们以此模型框架创建了不同宽度的单目深度模型,以求在速度和精度之间找到平衡点。根据我们在自己划分的 trainval 测试集上的实验结果,模型在树莓派上的推理速度大致与其计算量呈线性关系。我们选取了综合指标最高的 90MFLOPS 模型作为后续迭代优化的基础实验,它在树莓派上的运行速度已经高于 10FPS,单帧图像的推理耗时小于 100ms。
备注:以上精度指标 si-RMSE 在自己划分的 trainval 测试集上得到。
知识蒸馏体系
在模型规模变小的过程中,势必会伴随着精度损失。当前常规模型小型化的手段包括剪枝和蒸馏,此处我们采用蒸馏方案 (Knowledge Distillation)。
我们的 Teacher 模型采用开源的 Bts 算法,其模型权重是在此次比赛提供的数据上重新训练获得。由于单目深度估计任务可以看做对输出的特征图上每个点的回归,直接在输出层做软标签(Soft Label)的蒸馏会使模型的监督产生二义性,因此我们选择对模型解码器中每一个分辨率的特征图采取 Hint Feature 的蒸馏监督。
在蒸馏训练过程中,Teacher 和 Student 保持相同的输入分辨率 (128x160),由此在解码器处可以拿到分辨率相同但宽度不同的特征图。我们在 Student 解码器模型后为每一个分辨率增加一层随机初始化的 1x1 Conv,使得两者的形状能够完全相同而监督能够生效。这一层 1x1 Conv 只会在模型训练中发挥作用,在模型推理和部署时,这些冗余的卷积层会被剥离使得模型速度完全不受影响。
通过蒸馏,Baseline 90MFLOPS 模型的精度从 0.3304 提升到了 0.3141,并且模型的推理速度得以保持不变。
数据扩增方案
比赛官方给出了 7385 张训练集图片(带 GT)和 500 张验证集图片(不带 GT),这一数量对于训练一个深度学习模型是不足的,因此我们自然会产生数据增强的需求。
我们以在训练过程中在线数据增强的形式扩展数据集。数据增强分为颜色和形变两个维度。颜色空间上的数据增强包括常规的亮度、对比度、饱和度变化,也会以一定的概率进行颜色空间反转和椒盐噪声增强。
图像形变上的数据增强包括常规的镜像、仿射变换等。除此之外,我们实现了单目深度 RGBD 图像的随机 Crop,利用相似三角形的原理实现深度补偿,在按比例 Crop 出一块区域后将其中的深度值按比例放大。其背后的原理类似于使用相机拍摄时,把画面放大和拍摄者向前走能达到一样的效果。
模型转换链路
Mobile AI Depth 竞赛要求提交的模型以 Float32 TFLite 形式在树莓派(Raspberry Pi 4)上以 CPU 运行。这意味着传统针对卷积等基础算子在 CPU 上的计算优化是不可用的,模型的速度实打实的和模型计算量正相关。
我们当前的模型采用 PyTorch 框架进行训练,为了满足比赛提交要求,我们打通了从 PyTorch -> Onnx -> Keras -> TFLite 这条转换路径的完整链路,并且确保了转换前后模型推理的端到端误差小于 1e-6。
在转换的过程中,从 Onnx 向 Keras 转换的步骤是最困难的,其原因在于当前 Onnx 只支持 CHW 的排布,而 Keras(TF)在 CPU 模式下只支持 HWC 排布,当前没有开源工具能够处理好这一转换环节。在不正确的转换工具下,常规的 Conv2d Layer 会被转换成 Split、Permute、Concat、Conv、Split、Permute、Concat 的组合,其速度自然大幅降低。
为此,我们专门针对这一转换环节开发了常规 PyTorch Layer 向 TensorFlow 转换的工具,使得模型部署不会成为比赛的瓶颈。
在实际的比赛过程中,模型的输入分辨率是 128x160,而比赛的测试图像是 480x640。出于模型速度的考量,模型在获取输入图像后事先 Resize 到输入分辨率,经过模型输出后再 Resize 回图像分辨率。我们将这两个 Resize 环节同样在 TFLite 模型中实现。
结果与总结
采用上述方案,Tencent GYLab 团队在最终的测试集上达到了 129.41 的综合评分,大幅领先其他参赛团队获得冠军。
在保证模型精度的情况下,模型的性能在树莓派上达到 10FPS,证明了该方案在移动端上的有效性。在其他常见移动端芯片的 GPU 环境下,该方案同样保证了高效的性能。
成果落地应用
当前光影研究室的各项 AR 玩法中,或多或少都有单目深度估计技术的身影。通过模型压缩、剪枝、蒸馏获得的小模型可以实时运行在手机移动端,覆盖 iOS 和 Android 各类机型,达到 90% 以上的覆盖率。目前单目深度估计技术已作为基础能力在多个 AR 玩法中发挥作用。
在手机 QQ 的 AR 蛋糕等贴纸类玩法中,单目深度估计技术提供了贴纸目标在空间中的方向与位置,使得 AR 算法能够快速初始化。
在水淹房间特效中,单目深度估计模型可以提供视野中每个点距离相机的远近,结合相机内外参可以计算其在世界坐标系下的位置,从而实现 AR 特效。此外,单目深度也可以单独作为一种 AI 能力,形成雾气等特效效果。