“神奇动物在哪里”—A-tech极速野生动物检测算法与对抗攻击的防御

作者简介

廖培元,卡内基梅隆大学 (Carnegie Mellon University) 计算机系2023届本科生,研究方向为机器学习系统。Kaggle Grandmaster,历史最高排名全球前17。

404 战队AI组成员: 杨剑飞(AI)、乔世吉(AI)、廖培元(AI)、高昌盛(攻防)、郭明磊(攻防)

问题描述

·本次赛题是针对野生动物的目标检测问题。

·数据集:包括三个部分, data_s0 为干净数据, data_s1  data_s2 为噪音数据,其中 data_s1 含有手枪目标与原始目标叠加的样本,数量为 2000 张左右; data_s2  中包括两部分,第一部分是通过 FGSM 与其他对抗攻击生成的样本,第二部分为干净数据;但是, data_s2 整体没有标签信息,只有 bounding box

·评测指标: mAP50 FPS

问题精炼、总览和解决思路

1.在 Anchor-based 系列方法的框架下,目标检测主要有两个难题:对于 anchor 的分类,以及对于检测框的回归 (bounding-box  regression )。

因此,不同的评价检测模型的指标有时会更偏向于二者之一。在本次比赛使用的 mAP50 中,我们可以注意到其对检测框的质量要求不高(相比 COCO AP@(0.5:0.05:0.95) 中的较高的 0.95 IoU 要求),因此我们大部分的分析和优化都或多或少的侧重 anchor 分类。

我们的解决方案很多也受到了” 1st Place Solutions for OpenImage2019 – Object Detection “ 一文的启发:在那场比赛中,评价标准同样是 mAP50 [10] 。这也是为什么我们在拿到题目后没有去尝试在模型库中同样很有竞争力的 Cascade RCNN ,因为后者解决的核心问题是”高精度检测悖论“ the paradox of high-quality detection )[11 ]。

2. Baseline 模型:应当同时考虑 mAP 和推理时间。因此,我们在主流检测模型 EfficientDet [1] Yolov5 [2] 中选择了 Yolov5 ,并且使用一个较小的模型 v5l ,分辨率为 480

3.对抗样本与困难数据:使用 AI  防御手段与数据增强方法。 AI 防御手段主要是针对我们推测的对抗样本为基于类 FGSM 的攻击方法 [3] ,反向使用 self-adversarial training 训练梯度。数据增强手段为观察测试样本后的逆工程,主要包括加雨、加雾、光线条件、 ISO 噪点、 Color Jitter Medium blur 、Gaussian blur和加遮挡。

4. data_s2 无标签数据:干净数据使用 self-training [4] ,把置信度高的样本挑出来做半监督学习;对抗样本用 adversarial training [5] ,使得 CNN 输出的特征对于 clean domain attack domain 无法被一个二分类器区分。

5.对于野生动物识别问题,动物本身存在先验信息,我们已知动物的习性为白天经常出没和晚上经常  出没,而数据中包括了白天彩色数据和黑夜红外数据。因为不同数据含有不同的 X Y 的分布,所以我们可以训练两个 detection model ,并且用一个 gate 结构来判断测试样本应当通过哪个模型。

6.对于模型加速,我们使用 Tensorrt C++ 优化,使得模型的推理时间仅为 5ms 每张,而由于时间关系,没有能够实现完 C++ 的内存读取与 IO 优化。

Baseline 模型、细节与优化

1. Yolo 模型: YOLOv5 训练/推理速度快,但结构较为固定,由于本次比赛需综合考虑准确度与效率,因此我们选择了 YOLOv5 作为我们的提交模型。

2. 数据验证划分:因为数据集的类别分布高度不均衡,我们根据类别的比例来划分 10-fold cross validation

3. 模型选择:在比赛初期,使用 data_s0 进行模型效果测试,得到 mAP50 结果为 YOLOv5l > YOLOv5m > YOLOv5x ;因此采用 YOLOv5l 作为基本模型。值得注意的是,虽然训练中验证集的 mAP50 和测试集的结果相差较大,但不同尺度模型在 validationtest 上的 mAP50 变化趋势是一致的,因此训练中的 mAP50 仍然有参考意义。

4. Dynamic NMS :我们发现本次数据的特性为少样本检测。但由于测试集中加入了对抗样本,大量图片中的目标不能被检测到或检测到的置信度过低。因此需要对阈值进行调整,但高阈值使得检测不到目标的图片过多,低阈值使得部分图片检测到过多的目标并且增加检测时间增加。

因此,我们希望能设计出一种动态调整阈值的方法,能够在 nms 的基础上兼顾不同类型的图片,使得正常图片按照原有的阈值进行处理,加入对抗后导致置信度过低的图片能够自动调整降低阈值。

综上所述,我们设计了 Dynamic NMS ,动态调整过滤阈值。参数包括 max_conf_thresmin_conf_thresdelta 。具体流程为先计算图片中预测结果最大置信度,然后将置信度 -delta 作为新阈值并用 max_conf_thresmin_conf_thres 对置信度 -delta 进行 clip 操作,公式如下:

final_conf_thres = min(

max_conf_thres, max(min_conf_thres, (max_pred_conf – delta))

)

通过 Dynamic nms ,大量没有检测出目标的图片得到了检测结果, mAP50 提高 3% ,其中 max_conf_thres = 0.4,min_conf_thres = 0.05,delta=0.1 。脚本实现在 Validation/yolov5/util/general.py

针对对抗/噪声样本的解决方案

我们在抽样检查测试样本时,发现了大量的各种各样的噪声样本,有些是自然噪声,有些是明显的人为  生成噪声(对抗样本)。自然噪声主要包括黑暗、 ISO 噪点和虚焦。人为噪声主要包括加雨、加雾、 Jigsaw 拼图底纹(纹理攻击), Color Jitter Glass blur Gaussian blur 、叠加其他目标(手枪)。以下为这些样本在测试数据集和 data_s1, datas_2 中的示例。

FGSM 对抗样本:图片本身特殊的彩色纹路让我们意识到这可能是由某种 FGSM 家族的算法生成的。虽然攻击者不清楚我们具体使用的模型,我们也不知道在攻击者的威胁模型下哪个训练目标收到了攻击(可   能是分类,也可能是目标检测),这种独特的花纹仍然给我们的检测器带来了很大的困扰。

手枪叠加样本:经过简略的数据分析,我们推断这种扰动背后的逻辑是在某些样本中把一个统一的卡通  手枪图像叠加至图像中的一些真实样本框。

这样会给我们的解决方案带来两个挑战:首先,图像叠加存在多种实现方法(覆盖像素值,像素值加权和,等等),在攻击者实现未知的情况下很难去在短时间内  判断具体方法并给出相应的数据清洗算法;

其次,这种叠加会在统计意义上干扰检测器对于检测目标分类的推断:假如只有两种野生动物 A B 在数据集中的实例被手枪图标所污染,则在测试时,若给出被同样方法污染的野生动物 C 的图像,很容易导致其被错判成 A/B 中的一种。

噪点、加雨:前者类似于图像增强中有时会使用的 ISO 噪音,而后者则可能是由某种随机算法生成的透明雨滴图样所污染。

模糊,加雾:

依照这些问题,我们提出了如下解决方案:

1. 普适数据增强:数据增强可以用于应对加雨、加雾、 ISO 早点、各种 Blur 和光线问题,因此,我们在训练代码中使用了 albumentations 中的 transform ,在算法目录的 yolov5_bbaug/utils/datasets.py 中加入了这些新的增强方法,配合 mosaic 增强方法一起使用。

2. 遮挡数据增强:针对数据中很多目标存在遮挡的问题,我们在 Yolov5 中实现了 bounding box augmentation [6] ,对遮挡问题具有较好的鲁棒性。

3. 基于 FGSM  self-adversarial training 算法:由于测试集中有大量对抗样本(异常纹理和不规则改动),我们决定在训练时使用对抗训练来增强 detector 的分类器边界的平滑性。当使用 I-FGSM [7] 攻击时,给每个训练样本中迭代添加噪音:

于是我们将攻击样本作为增强方式继续加入训练中,在每次 back-propagation 后,计算对抗样本,进行第二次 back-propagation ,代码在 yolov5_SAT 中。

4. Auxiliary-BN : 我们实现了 Auxiliary-BN [9] ,让对抗样本和普通样本共享 CNN 权重,但通过不同的 BN 层,为了不让对抗样本( data_s2 )干扰训练,我们使用一个辅助 BN 层来过对抗样本,普通的 BN 来过正常样本,这样在不干扰 BN 的情况下使用了对抗样本进行训练,增加了模型对对抗样本的鲁棒性,同时利用了对抗样本的有效信息训练 CNN

5. Data_s1 中清洗含有手枪的训练样本:我们设计脚本,通过判断 RGB 三通道像素值的异同,成功过滤了黑暗图片中叠加的 1300 张含有手枪的对抗样本。

脚本逻辑为:

检测图片中三通道像素相等比例大于 90% 的图片(判断是否是黑夜) ->

提取图片中的目标像素位置以及图片中三个通道不相等的像素位置(判断枪的位置) ->

去掉图片边框 ->

取目标像素与枪的像素交集,若不为零则图片为手枪攻击样本

6. 数据清洗:对于没有意义的 90% 黑暗的图像(肉眼不可识别),不作为训练样本使用。

特殊数据增强:对于加水滴和仿制类 FGSM 方法,因为时间不足,我们没有具体处理。

半监督学习

1. 问题: data_s2/data2 中含有未受污染的样本和检测框,但缺少类别标签。

2. 伪类别标签 [4]:为了使用半监督方法,先用已经在 data_s0 训练好的模型过一遍 data_s2/data2 ,把之心度高的的数据当做伪类别标签,再把这部分数据加入到训练样本中,反复迭代此过程。

3. 方法:由于现有预测结果在目标数量上可能与原有目标数量不同,因此我们将打标签问题看做一个  分配问题,为尽可能多的目标匹配一个不重复的预测结果,使得选中的目标在原有目标框和预测目  标框上的重叠面积最大。最终采用匈牙利算法求得分配结果。

基于动物先验信息的白天黑夜检测器(原创思路)

由于本次是野生动物的目标检测问题,根据动物的先验知识,我们知道动物可以拥有不同的生活习性,  白天和夜间活动的动物不同,这就导致了白天黑夜的数据分布不同。而给定数据中,白天为彩色数据,黑夜为红外功能的黑白数据,可以根据这个特点编写脚本区分黑白数据。

我们通过统计,发现训练和测  试数据中白天与黑夜数据的比例均近似为 2:1 ,而不同类别的出现频率也大不相同,统计脚本在服务器的 train20/if_rgb.py

因此,我们可以针对白天和黑夜分别训练两个模型,在输入图像时判断使用哪个模型( Gate 设计)。我们用上述脚本把训练集分成了两个部分,分别训练了两个模型,在 Yolov5_dark 里和普通 Yolov5 里。

虽然训练、判断黑白和数据脚本都已经完成,遗憾的是,由于后半段时间安排的问题,我们并没有在提交 中加入这个 Gate 和双模型。

基于 Tensorrt 的加速方案(原生 C++实现)

1. 我们使用 Tensorrt C++ 实现了 Yolov5 的推理,有效的把推理时间从 22ms 降到了 6ms 。虽然服务器已经预装了 tensorrt ,但是我们还是要装依赖库,由于管理员权限问题,我们在装 OpenCV CMake 编译浪费了大量时间。最后 C++ 版本的代码中包括了加速推理和 Dynamic NM S 的实现。

2. 代码地址: ~/tensorrt/tensorrtx/yolov5/

3. 我们实现的具体逻辑如下:

a. 使用 python 脚本完成对模型的训练

b. 通过 gen_wts.py 对 PyTorch 权重文件进行转换

c. 通过 C++ 中定义的模型结构将权重转换至 t ensorrt runtime 可以识别的格式

d. 通过 C++ 推理代码编译符合提交的推理逻辑

4. 我们同时实现了在 C++ 上的 dynamic NMS ,其推理结果和 Python 脚本类似(不完全一致,测试中 mAP 会有很小的浮动。具体的基于 Python 的对齐脚本也可以在代码中找到。

提交方案

由于时间关系的原因,我们的提交为模型优化(二)+增强方案(三)+ Tensorrt/C++ 加速(七)。半监督学习(五)和先验黑白 Gate 网络(六)都已经实现,代码在服务器中可见,但是由于没有充足时间重新利用新数据( data_s2 )训练,所以未能提交最新的解决方案,也未能最终做模型的集成。由于提交的推理部分算法全部使用 C++ ,所有的算法( Dynamic  NMS,ensemble 等)都要从零写,整个方案的原生代码量太大,所以很遗憾没有提交出最完整的解决方案(设计方案时过于理想化,没有考虑好时间)。

未完成方案

1. 模型集成。一般来说模型集成可以带来 2-3% mAP 提升,甚至更多,在本次比赛中,由于 IO 的计算开销大,集成带来的 mAP 收益应当大于其 FPS 的负收益。没有时间做集成是我们mAP 最后没有提升的一个原因。主要的 C ++ 代码已经完成,但是依然存在 bug ,我们最后两次测试提交都没有成功。

2. 小分辨率。最后为了提升 FPS ,应该训练几个小分辨率的模型。

3.多线程 IO 。代码库中完成了 Python 的多线程 IO 程序,在比赛的最后,实现 Tensorrt C++ 版本后,需要再次实现 C++ 的文件 IO 优化,所以没有时间完成。

致谢

感谢各位裁判老师不计劳苦陪我们熬夜,帮我们澄清了提交系统和赛制的很多细节。同时感谢出题老师别出心裁的设计,综合了大量的知识点,我们通过调研和实验,也得到了很多有趣的结论,增强了我们对目标检测和 AI 对抗攻击的认识。

来年再见,后会有期!

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

该战队在分析数据集时,发现数据中包括了白天彩色数据和黑夜红外数据,由此想到可以训练两个model进行分类。采用了多种数据增强方式,增强了模型的鲁棒性。

而对于对抗样本的处理,他们猜测使用的是FGSM生成的对抗样本,因此采用adversarial training来增强对对抗样本的抵抗性。

从思路上来看,404战队对原始数据有着不错的分析,并且在应对对抗样本方面相比其他队有更完善的应对方案,采用TensorRT进行了推理加速,在速度方面进行了不错的优化。

但整个方案内容比较多,导致部分内容没有在规定时间内完成,如果在方案设计的时候能多考虑时间规划的问题,相信能取得更好的成绩。

—浙江大学网络空间安全学院研究员 杨子祺

参考文献:

[1] Tan, Mingxing, Ruoming Pang, and Quoc V. Le. “Efficientdet: Scalable and efficient object

detection.” Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition. 2020.

[2] Redmon, Joseph, et al. “You only look once: Unified, real-time object detection.” Proceedings of the IEEE conference on computer vision and pattern recognition. 2016.

[3] Goodfellow, Ian J., Jonathon Shlens, and Christian Szegedy. “Explaining and harnessing adversarial examples.” arXiv preprint arXiv:1412.6572 (2014).

[4] Tang, Yuxing, et al. “Visual and semantic knowledge transfer for large scale semi- supervised object detection.” IEEE transactions on pattern analysis and machine intelligence 40.12 (2017): 3045-3058.

[5] Yuan, Xiaoyong, et al. “Adversarial examples: Attacks and defenses for deep learning.” IEEE transactions on neural networks and learning systems 30.9 (2019): 2805-2824.

[6] Zoph, Barret, et al. “Learning data augmentation strategies for object detection.” arXiv preprint arXiv:1906.11172 (2019).

[7] Kurakin A, Goodfellow I, Bengio S. Adversarial examples in the physical world[J]. arXiv preprint arXiv:1607.02533, 2016.

[8] Kurakin, Alexey, et al. “Adversarial attacks and defences competition.” The NIPS’17 Competition: Building Intelligent Systems. Springer, Cham, 2018. 195-231.

[9] Xie, Cihang, et al. “Adversarial examples improve image recognition.” Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition. 2020.

[10] Liu, Yu, et al. “1st Place Solutions for OpenImage2019 – Object Detection.” arXiv preprint arXiv:2003.07557, 2019.

[11] Cai, Zhaowei, et al. “Cascade R-CNN: High Quality Object Detection and Instance Segmentation.” arXiv preprint arXiv:1906.09756v1, 2019.

点击收看《燃烧吧!天才程序员》完整版节目