发布时间:2023-05-11 19:30
论文提出的GID框架能够自动选择可辨别目标用于知识蒸馏,而且综合了feature-based、relation-based和response-based知识,全方位蒸馏,适用于不同的检测框架中。从实验结果来看,效果十分不错,值得一看
来源:晓飞的算法工程笔记 公众号
论文: General Instance Distillation for Object Detection
在目标检测应用场景中,模型的轻量化和准确率是同样重要的,往往需要在速度和准确率之间权衡。知识蒸馏(Knowledge Distillation)是解决上述问题的一个有效方法,将大模型学习到的特征提取规则(知识)转移到小模型中,提升小模型的准确率,再将小模型用于实际场景中,达到模型压缩的目的。
目前的知识蒸馏方法大都针对分类任务,目标检测由于正负样本极度不平衡,直接将现有的方法应用到检测中一般都收益甚微。而目前提出的针对目标检测任务的知识蒸馏方法大都对知识进行了特定的约束,比如控制蒸馏的正负样本比例或只蒸馏GT相关的区域。此外,这些方法大都不能同时应用于多种目标检测框架中。为此,论文希望找到通用的知识蒸馏方法,不仅能应用于各种检测框架,还能转移尽可能多的知识,同时不用关心正负样本。
为了达到上述目的,论文结合response-based知识、feature-based知识和relation-based知识,提出了基于可辨别目标的蒸馏方法GID(general instances Distillation),主要优点有以下:
总结起来,论文的主要贡献如下:
有研究提出GT附近的特征区域包含有助于知识蒸馏训练的丰富信息,而论文发现不仅GT附近的区域,即使属于背景的区域,只要是可辨别区域(discriminative patch)都对知识蒸馏有帮助。基于上面的发现,论文设计了通用实例选择模块(general instance selection module, GISM),用于从teacher和student的输出中选择关键实例进行蒸馏。其次,为了更好地利用teacher的信息,论文综合使用了feature-based、relation-based和response-based知识用于蒸馏。
在检测模型中,预测结果能够指出信息最丰富的区域,而teacher和student的丰富区域的差异恰恰就是性能的差异。为了量化每个结果的差异,选择可辨别实例用于蒸馏,论文提出了两个指标:GI score和GI box,在每次迭代中动态计算。为了减少计算消耗,通过计算分类分数的L1 score作为GI score,而GI box则直接选择分类分数更高的box。
整个GI的选择过程如图2所示,对于实例 r r r,其score和box的选择定义为:
P G I P_{GI} PGI和 B G I B_{GI} BGI分别为GI score和GI box。对于one-stage检测器, P t P_t Pt和 P s P_s Ps为teacher和student的分类分数,而对于two-stage检测器则为RPN的objectness分数, B t B_t Bt和 B s B_s Bs同理。 R R R为预测框数目, C C C为类别数。由于论文将teacher和student的detection head设置成完全一样的,所以预测框也是可以根据位置一一对应的。
需要注意的是,高GI score的实例可能重合度比较高,导致蒸馏损失翻倍。为解决这一问题,使用NMS来去重,递归选择重复实例中GI score最高的实例。在实际使用中,NMS的IoU为0.3,最终每张图片只选择top-K个实例。
FPN结合了主干网络的不同层特征,能够显著提升检测模型对多尺度目标的鲁棒性。于是,论文打算将FPN加入到蒸馏中,根据GI box的尺寸选择对应的FPN层特征。
由于每个FPN层的目标特征大小不同,直接进行pixel-wise蒸馏会导致模型更倾向于大目标。于是论文转而采用ROIAlign将不同大小的特征输出为相同大小再进行蒸馏,如图a所示。feature-based蒸馏损失计算如下:
K K K为GISM选择的GI数目, t i t_i ti和 s i s_i si为ROIAlign处理后的FPN特征, f a d a p t f_{adapt} fadapt用于将 s i s_i si缩放到 t i t_i ti的相同大小。
物体间的关系信息是分类任务进行蒸馏的关键,但还没在检测任务蒸馏中进行尝试。同一场景中的物体,不管是前景还是背景,都是高度相关的,这对student网络的收敛有很大帮助。
为了挖掘GIs中的关系知识,使用欧式距离来度量实例间的距离,然后用L1距离来传递知识。如图a所示。relation蒸馏损失计算如下:
K 2 = { ( i , j ) ∣ i ≠ j , 1 ≤ i , j ≤ K } \mathbb{K}^2=\{(i,j)|i\ne j, 1\le i,j\le K\} K2={(i,j)∣i=j,1≤i,j≤K}, ϕ \phi ϕ为归一化因子, l l l为smooth L1损失。
知识蒸馏的关键主要是来自teacher的response-based知识的约束,这里的response-based知识指的是模型的最终输出。但因为检测输出往往存在正负样本不平衡或过多负样本的情况,如果直接将detection head的所有输出进行蒸馏,这种情况带来的噪声反而会损害student的性能。
有研究提出只蒸馏detection head的正样本,但这种方法忽略了可辨别的负样本的作用。为此,论文设计了distillation mask,将分类分支和回归分支的输出与GIs挂钩,比只选择正样本要高效。
不同检测模型的输出是不同的,论文定义了一个通用的方法来进行detection head的蒸馏,如图b所示。首先,基于GIs的distillation mask计算为:
函数 F F F是标签指定算法,输入为GI box,当匹配时,输出1,否则输出0。函数 F F F对不同的模型的定义是不同的,对于RetinaNet,使用anchor和GIs间的IoU决定是否匹配,而对于FCOS则所有中心点在GIs外的输出都是0。
然后,response-based损失计算如下:
R R R为所有与选择的GIs匹配的输出,teacher和student对应的输出其中一个匹配即可。 y t y_t yt和 y s y_s ys为分类分支输出, r t r_t rt和 r s r_s rs为回归分支输出, L c l s L_{cls} Lcls和 L r e g L_{reg} Lreg为分类损失函数和回归损失函数。需要注意的是,为了简便,对于two-stage检测器只蒸馏RPN输出。
模型的训练是端到端的,student的整体损失函数为:
L G T L_{GT} LGT为模型原本的损失函数, λ \lambda λ为调节超参数。
在VOC上对比蒸馏效果。
在COCO上对比蒸馏效果。
选择的GI box可视化,前面为5000迭的选择,后面为90000迭的选择。绿色代表GT,红色为正样本,黄色为中间(非正非负)样本,青色为负样本。
论文提出的GID框架能够自动选择可辨别目标用于知识蒸馏,而且综合了feature-based、relation-based和response-based知识,全方位蒸馏,适用于不同的检测框架中。从实验结果来看,效果十分不错,值得一看。
如果本文对你有帮助,麻烦点个赞或在看呗~
更多内容请关注 微信公众号【晓飞的算法工程笔记】
R语言决策树和随机森林分类电信公司用户流失churn数据和参数调优、ROC曲线可视化
Java项目:在线农产品商城(java+SSM+JSP+bootstrap+jQuery+mysql)
2022年全国中职组网络安全国赛赛题思路(仅自己一个做题的思路)——网络安全竞赛试题(1)
全网最系统、最清晰 深入微服务架构——Docker和K8s详解
技术解析|Doris Connector 结合 Flink CDC 实现 MySQL 分库分表 Exactly Once精准接入
mysql学生管理系统毕业设计_学生成绩管理系统设计与实现(MySQL)
Java&C++题解与拓展——leetcode829.连续整数求和【么的新知识】