A-tech AI赛道:基于AI边缘计算的技术思考

作者简介:方曦,上海交通大学图像所三年级研究生,Kaggle Master,自2016年起从事计算机视觉相关研究至今

.9999战队成员:方曦(AI)、董胤蓬(AI)、庞天宇(AI)、童永鳌(攻防)、郑同舟(攻防)

01

竞赛简介

数据集与评测

第一届A-tech科技精英赛AI赛道比赛任务为野生动物识别。由于野外复杂的环境因素,要实现生态保护区野生动物监测和大数据分析,人工智能技术已经是动物保护工作技术发展的必然趋势。比赛要求设计一套低功耗高速度高精准的AI识别系统,检测识别出现在保护区摄像头中的32种野生物种。

最终得分计算规则为如下公式:

评分规则中精度使用mAP50评估,即50% IOU下的mAP。精度评分占总比分60%,且mAP50需要大于0.7,否则总分记为0分;同时,由于算法部署需要契合落地场景所需的AI边缘计算能力,算法速度也成为了比赛所要考量的一个重要部分,速度(FPS)占总比分40%,上限为1000FPS。

问题难点

赛题首要难点应当是速度与精度的trade off,由于赛题契合实际AI边缘运算需求,把速度作为评分指标中很重要的一项(40%得分占比),模型推理速度成为整个系统设计中非常重要的一个问题。

除了目标检测的常见难点外,实际场景上还面临着长尾分布(long tail)、小样本(few shot)、脏数据(noise label)等诸多问题。这些也是AI工程落地面临着的一些最常见的问题,这些问题也在这个比赛中悉数出现。

除了数据和任务上的难点,比赛出题方也为选手“精心设计”了更多额外的困难和陷阱。训练数据分三批发放,在指定时间点或指定条件下,选手才能得到下一批训练数据,这三批数据样本数和类别数由少到多,数据中的噪声也从简单逐渐变为复杂,涉及增量学习、数据下毒、半监督学习、对抗样本等多个计算机视觉子领域。数据集中也存在大量夜间红外灰度影像以及各种强噪声、对抗或者下毒样本图片。测试集中这类强噪声图片的比例可能更高,也使得本地验证集和线上测试集分数之间存在巨大gap,考验模型和方法的安全性与鲁棒性。(第一批数据集A规模较小,只存在部分类别样本;第二批数据集B规模中等,存在数据下毒和更多的自然噪声;第三批数据C规模较大噪声最多,且分为两部分C_data1和C_data2,分别为对抗样本和普通样本,均是只有标注框但缺失类别标注的半监督标注样本)

比赛有48h的时间限制,由于同时需要完成验证码识别分赛道来获取第三批训练数据,导致实际可用时间小于48h,使得实验规划得从简设计,最终解决方案也需要稳定可靠且易于实现,模型的训练速度也成为了很关键的因素。

图一 训练集样本示例

其中第一列为第一批小数据中的正常样本,分为白天RGB照片和夜间红外影像;第二列为第二批数据中存在的数据下毒样本,表现为动物身体上增加了猎枪水印;第三列为第三批样本中的对抗样本,增加了多种对抗攻击后的噪声;第四列为图片或标注增加多种自然噪声。我们猜测线上测试集中非正常数据的比例可能会更高。

比赛思路

首先,我们把问题定义为一个目标检测任务。mAP50为精度得分,对IoU在50%以上的样本就视为召回,说明问题侧重点在于召回和分类,bbox的回归部分可以适当减弱以提速。速度占40%的分数,最高可以达到1000FPS才能满分,可以预见的是mAP50拉开差距的难度远远高于提升速度,所以本次比赛需要设计一个轻量化的目标检测算法。

算法速度得首先考虑,在设计算法之前,算法部署方案得首先考虑。从语言效率考虑,肯定是用 C++版本tensorRT进行部署以及加速更为可靠,但由于比赛服务器权限和环境限制以及时间因素的考虑,我们最后还是选择了使用Pytorch直接进行inference,在模型inference阶段使用半精度进行推理,使用jit script对模型加速。

除了部署效率,目标检测算法的速度主要受限为三个部分:数据读写及预处理、目标检测模型、NMS及后处理。这三部分都有相应的加速方法:

多线程/多进程数据读取和预处理,但是太多的进程线程又会带来额外的开销,选择合适的进程数速度最优。

目标检测方法上我们对比了包括EfficientDet,YOLO系列在内的多种轻量化目标检测算法,最后从训练/推理速度和模型性能角度,选择了YOLO v5作为基础目标检测算法,并针对任务和性能要求进行了一系列改进以兼顾目标检测速度、性能以及模型鲁棒性。

NMS算法的选择需要兼顾性能和速度,考虑到实际情况我们最终选用torch vision封装的免编译的标准cuda NMS作为基础进行参数调优,而未使用Fast NMS、Cluster NMS、Matrix NMS或Soft NMS之类更新的NMS方法。

02

解决方案

模型选择

YOLO v5x单模型[1]

训练策略

A. 迁移学习:YOLOv5x在COCO上的预训练模型finetune,加速收敛且增加鲁棒性。

B. 使用8张显卡同步BatchNorm (SyncBN)[2],保证大的batchsize以提升性能。

C. 混合精度训练[3],保证大batch size和加速训练。

D. 使用Onecycle学习率策略[4] + SGD加速拟合并收敛到更低loss,获取”super convergence”。

E. 回归使用GIOU loss [5]并赋予较小权重,分类使用标准Cross Entropy Loss并赋予较大权,这个权重比例针对mAP50指标优化,减弱标注框回归噪声的影响,更加重视召回和分类。

F. Finetune时使用大学习率防止过拟合和噪声标注的影响 (SGD with 0.01 Learning Rate)

G. 下采样使用pixel shuffle的逆操作(达摩院TResNet一文中称此操作为space_to_depth,YOLO中称为Focus),激活使用Leakly ReLU,而非计算量更大的Swish或者Mish激活。

H. 使用EMA防止过拟合,稳定训练过程。

I. 减少预设anchor数目,设计更符合目标尺寸的anchor横纵比,减少计算量提升推理速度的同时,也加速了模型训练收敛过程。

数据增广

使用了强数据增广,包括随机灰度变换(以适应大量夜间场景)、水平翻转、亮度对比度增广、饱和度色相等颜色增广、随机JPEG压缩、随机高斯噪声、随机ISO噪声、随机gamma变换、随机直方图均衡化、随机裁切等等,以及yolo v4/v5中出现的mosaic增广和mixup。强数据增广以做到领域风险最小化(VRM),增强模型泛化能力,同时mixup能减少噪声标注以及缓解long tail和few shot的影响。(随机雨雾增广由于速度过慢,故不使用)

课程学习

三批数据陆续来到,考虑到每批数据逐渐变多且噪声也越来越多。我们打算采用类似课程学习(curriculum learning)的方法。设三批数据分别为A,B,C,其中C(半监督样本)分为两类,C_data1(对抗样本), C_data2(常规样本)。

我们第一个课程设置为A∪B, 第二个为A∪B∪C_data2, 最后一个课程为 A∪B∪C_data2∪C_data1。首先在第一个课程上训练,然后依次在第二、第三个课程上finetune我们的模型。

处理数据下毒

针对第二批到来的数据B,我们通过观察数据发现第十类和第十一类样本标注框内图片处加了猎枪水印,我们猜测为数据下毒。下毒意图很明显,让我们的模型学习到错误的猎枪水印特征,以至于让我们的模型把所有出现猎枪水印的物体都识别为这两个类别,而测试集中很可能把其他类别样本加上相同水印,误导我们的模型去错误判断目标类别。使用这些样本进行训练将极大影响模型正确性。我们选择直接删除了第二批数据中被下毒的这两个类别的所有样本,虽然损失了部分训练数据,但是这也是我们在有限时间里能想到的最安全稳妥的解决方案。

处理对抗样本

第三批数据,我们发现其中data1为多种对抗攻击方法生成的对抗样本,data2为普通样本,两者均只有标注框,无类别标注。对抗样本加入训练,即对抗训练,一般而言增加模型对于对抗样本的鲁棒性的同时会导致模型性能下降。较好的解决方案应当是使用advProp[6]这类方法,使用辅助BN来处理对抗样本的训练。但是由于第三批训练数据到达时,比赛剩余时间已经很少,不足够去尝试使用较为冒险的方案,于是我们使用了简单的低通滤波去除这些对抗样本的高频纹理,再用滤波后的对抗样本来进行inference生成伪标签并用于半监督学习的训练。

半监督学习

第三批数据均是只有bbox标注、无类别标注的样本,我们设定了一个规则利用这些样本进行半监督学习:

A. 使用之前两批数据训练的模型在这些图片上inference,取一个较小的阈值如0.1过滤bbox。

B. 根据inference结果使用IOU>0.2匹配标注框,即使用模型给这些缺失类别的标注框assign类别。当匹配失败时则不保留整张图片,匹配成功且符合置信度阈值要求则保留类别assign结果作为新的训练集内容。需要注意的是,这里其实可以用self-training方法进行迭代,不断使用增加了半监督样本的数据集重新训练新模型,再用新模型重新在半监督样本上生成新的伪标签,反复迭代上述过程进行进一步提分。受比赛时间限制我们只生成了一次伪标签。

推理速度优化

A. 量化到半精度模型 + 半精度的图像输入

B. 多线程dataloader加速IO

C. 调整阈值缩小NMS的输入bbox数量

D. NMS实现中CPU – GPU调度细节优化提速

E. 优化检测结果文件的写入,在内存中全部整理好要写入的文本再一次性写入,防止for循环反复调用文件句柄重复写入单个文件造成的延迟。

03

小结

大多数数据科学比赛追求的是精度而不是速度,因此,大模型,TTA,模型融合等方法盛行。而在第一届A-tech科技精英赛中,赛题却是更加契合实际场景的AI边缘计算任务,需要选手在保证算法精度的同时追求算法速度和效率。分析其评分指标,速度作为一个重要指标纳入了评分中,同时mAP50作为精度的评分指标也更加符合实际场景要求,即更强调召回和分类精度而不需要太高定位精度。

AI边缘计算即“本地化”的人工智能,一般运行在本地嵌入式设备中,而无需连入云计算资源,本地化计算能力需要模型也有足够小的体积和足够高的实时性。这种便携小体积的AI边缘计算设备配合上对算力和功耗要求较低的“口袋模型”,可以极大节约网络带宽,适应复杂环境,降低功耗需求,保护隐私安全。野生动物保护识别的公益赛题也是AI边缘计算最佳的应用实例之一。

比赛成果切实推动了“口袋模型”的产出,在未来将应用到桃花源生态保护基金会的app中,在最极端的环境下能够发挥出强大的计算能力和分析能力,从而真正改变保护区的困难局面。我们相信,科技不仅为我们创造更美好的生活,还是这个时代最大的公益。

A-tech科技精英赛导师点评

“.9999战队取得了AI模型排行榜的第一名,他们对于数据进行了较多的分析和观察,并能够对数据观测的结果提出有效的解决方案,例如通过分析速度在指标上的影响,推断应该侧重优化模型速度。另外,他们观测到绝大多数的图片只有一个bbox,一个图片只有一个类别因此也直接使用了单网络,但也导致了性能提升的局限性,后续模型落地可以通过改进网络得到进一步的性能提升。”

——中国科学院计算技术研究所副研究员 庄福振

“.9999战队对于AI赛道的任务理解以及算法使用方面相对胜出,技术报告撰写最为完整清晰。在AI和攻防的合作战中,对于旋转图形验证码的赛题,采用了最新的RestNeSt主网络,提高了识别精度,体现出团队在有限的比赛时间内对于赛题的把握和战术的选择还是十分出色的。”

——复旦大学计算机科学技术学院副教授 池明旻

[1] https://github.com/ultralytics/yolov5

[2] Peng C, Xiao T, Li Z, et al. Megdet: A large mini-batch object detector[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2018: 6181-6189.

[3] https://github.com/NVIDIA/apex

[4] Smith L N, Topin N. Super-convergence: Very fast training of neural networks using large learning rates[C]//Artificial Intelligence and Machine Learning for Multi-Domain Operations Applications. International Society for Optics and Photonics, 2019, 11006: 1100612.

[5] Rezatofighi H, Tsoi N, Gwak J Y, et al. Generalized intersection over union: A metric and a loss for bounding box regression[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2019: 658-666.

[6] Xie C, Tan M, Gong B, et al. Adversarial examples improve image recognition[C]//Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition. 2020: 819-828.