一、前言
出于某些需要,阅读一下anchor-free
模型的代码,因为之前用过nanodet
,对其印象深刻,所以重温一下代码。好记性不如烂笔头,多记录、多总结、多分享。
正如作者博客说的:NanoDet
总体而言没有特别多的创新点,是一个纯工程化的项目,主要的工作就是将目前学术界的一些优秀论文,落地到移动端的轻量级模型上。
二、正文
1. 模型整体特点
模型之所以轻量,是因为作者用了
① 轻量的backbone
: 经典轻量级模型,如mobilenet
, shufflenet
等;
② 轻量的FPN
:完全去掉PAN
中的所有卷积,只保留1x1
卷积来进行特征通道维度的对齐,上采样和下采样均使用插值来完成;
③ 轻量的head
:深度卷积、减少卷积个数与维度、边框回归和分类共享同一组卷积。
此外还因为作者选择了
① 合适的损失函数GFocal Loss
;
② 合适的正负样本定义方法ATSS
;
③ 轻量但性能不弱的backbone
;
④ 成熟的模型架构 backbone + pan + head
;
⑤ head
不共享权重(检测头非常轻量的情况下,共享权重会降低其泛化能力);
使得模型虽然轻量,但性能不差。
2. nanodet anchor 大小及生成。
nanodet
虽说是anchor-free
路线,但还是有anchor
的,其作用主要体现在训练时的正负样本定义(ATSS)阶段,其他时候只会用到anchor
的中心坐标(如计算bbox
时)。
def get_single_level_center_point(
self, featmap_size, stride