code: Nanodet
之前就有关注过NanoDet,在轻量级检测模型中,卓越的性能,引起了广泛讨论,正巧前端时间看到NanoDet作者更新了第二代模型NanoDet-Plus,同时最近在做一些知识蒸馏的工作,看到NanoDet-Plus也引入了LAD[2]的工作,于是研究了一下NanoDet-Plus代码并进行一些修改实验。关于NanoDet-Plus的实验原理等,直接见作者的文章[1],写得很详细,写得非常棒。本文主要基于NanoDet-Plus的代码进行理解,补充一些细节和自己的理解。
二、主体结构
NanoDetPlus较为简单,跟onestage检测器差不多,差别在于为了引入辅助检测头(aux_head)做出的改动。aux_head是相对原来head效果更强的检测头,同时为了aux_head发挥更好的效果,作者复制了原来的FPN作为aux FPN,并且和原来的FPN进行concat,得到dual_fpn_feat, 最终将dual_fpn_feat提取的特征送辅助head。注意,在训练的时候,代码中选择在10th epoch的时候进行detach。
三、head
aux head相对原head,主要有更多的卷积(4个3x3的卷积),更大的channel数,GN等。详细的可以见simple_conv_head.py
,代码较为简洁明了。辅助模块只在训练阶段用到,不参与inference,不影响推理速度,十分友好。
四、Label Assignment distillation
Label Assignment是影响目标检测性能的一个比较重要的因素,像静态匹配时期比较经典的ATSS等。这里要强烈推荐YOLOX[3]的动态匹配策略simOTA,实现简洁,在很多模型上都取得了不错的效果。
NanoDetPlus针对动态匹配在小模型上效果不好的问题,提出用学习能力更强的东西来指导小模型的检测头进行匹配。参考LAD[2]的工作,通过label assignment distillation来提升性能。LAD就是使用教师网络预测的结果去计算标签匹配,来指导学生网络训练。额外训练一个教师模型,需要的资源大大增加,所以NanoDet-Plus设计了一种简单轻量的训练辅助模块(AGM)。
计算loss的时候需要注意,Label Assignment distillation的核心代码:把aux pred结果进行label assign, 再用这个label assign的结果分别给到原head和aux head的预测结果进行计算loss,最后把两边的loss相加作为总的loss。
[1] 超简单辅助模块加速训练收敛,精度大幅提升!移动端实时的NanoDet升级版NanoDet-Plus来了!
[2] Nguyen C H, Nguyen T C, Tang T N, et al. Improving Object Detection by Label Assignment Distillation[C]//Proceedings of the IEEE/CVF Winter Conference on Applications of Computer Vision. 2022: 1005-1014.
[3] Ge Z, Liu S, Wang F, et al. Yolox: Exceeding yolo series in 2021[J]. arXiv preprint arXiv:2107.08430, 2021.
[4] Li G, Li X, Wang Y, et al. Knowledge Distillation for Object Detection via Rank Mimicking and Prediction-guided Feature Imitation[J]. arXiv preprint arXiv:2112.04840, 2021.
[4] Li X, Wang W, Wu L, et al. Generalized focal loss: Learning qualified and distributed bounding boxes for dense object detection[J]. Advances in Neural Information Processing Systems, 2020, 33: 21002-21012.
[5] 大白话 Generalized Focal Loss
ps://zhuanlan.zhihu.com/p/147691786)