当前位置:网站首页>NanoDet代码逐行精读与修改(零)Architecture
NanoDet代码逐行精读与修改(零)Architecture
2022-08-09 03:34:00 【HNU跃鹿战队】
NanoDet是一个单阶段的anchor-free模型,其设计基于FCOS模型,并加入了动态标签分配策略/GFL loss和辅助训练模块。由于其轻量化的设计和非常小的参数量,在边缘设备和CPU设备上拥有可观的推理速度。其代码可读性强扩展性高,是目标检测实践进阶到深入的不二选择。作者在知乎上有一篇介绍的文章,指路:超简单辅助模块加速训练收敛,精度大幅提升!移动端实时的NanoDet升级版NanoDet-Plus来了!
笔者已经为nanodet增加了非常详细的注释,代码请戳此仓库:nanodet_detail_notes: detail every detail about nanodet 。
此仓库会跟着文章推送的节奏持续更新!
话不多说,从结构上我们直接分backbone、neck、head、assist module、dynamic label assigner五个模块进行超級详细的介绍。
0. Architecture
surprise!首先当然要介绍一下整体的架构了。先看看整个模型的架构图:
直观来看,最大的不同就是新增的Assign Guidance Module模块。检测框架还是FCOS式的一阶段网络,neck改为了GhostPAN,同时摒弃了FCOS的标签分配策略转向动态软标签分配并加入辅助训练模块也就是前述的AGM,它将作为教师模型帮助head获得更好的训练。头部的回归和标签预测仍然继承之前的Generalized Focal Loss。
以NanoDet-m (320x320)为例让我们先看一下config/下的配置文件中和网络架构有关的选项:
name: NanoDetPlus
detach_epoch: 10
backbone:
name: ShuffleNetV2 # 默认使用shuffleNetV2
model_size: 1.0x # 模型缩放系数,更大的模型就是相应扩大各层feature map的大小
out_stages: [2,3,4] # backbone中输出特征到FPN的stage
activation: LeakyReLU # 激活函数采用LeakyReLU
fpn:
name: GhostPAN # 用ghostNet的模块对不同特征层进行融合
in_channels: [116, 232, 464] # 输入fpn的feature map尺寸
out_channels: 96 #
kernel_size: 5 # 卷积核大小
num_extra_level: 1 # 输出额外一层,即在最底层的基础上再上采样得到更大的feature map
use_depthwise: True # 是否使用深度可分离卷积
activation: LeakyReLU # 激活函数
head:
name: NanoDetPlusHead # 检测头,还提供了之前的nanodet头和最简单的卷积头
num_classes: 80 # 类别数
input_channel: 96 # 输入通道数
feat_channels: 96 # 和输入通道数一致
stacked_convs: 2 # 头的卷积层数
kernel_size: 5 # nanodet-plus也换用了5x5的大核卷积
strides: [8, 16, 32, 64] # 有四个头,分别对应不同尺度特征的检测,这是不同head检测时的下采样倍数
activation: LeakyReLU
reg_max: 7 # 用于DFL的参数,head的回归分支会预测框的分布,即用回归reg_max+1个离散的几个值来表示一个分布
norm_cfg:
type: BN # head选用Batch Norm进行归一化操作
loss:
# loss仍然继承了nanodet,使用GFL,并且这些loss有不同的权重
loss_qfl:
name: QualityFocalLoss
use_sigmoid: True
beta: 2.0
loss_weight: 1.0
loss_dfl:
name: DistributionFocalLoss
loss_weight: 0.25
loss_bbox:
name: GIoULoss # 选取计算IOU loss的方法为GIoU
loss_weight: 2.0
# Auxiliary head, only use in training time.
# 新增的辅助训练模块,其实就是一个常规的检测头(上面的头是简化过的版本,表达能力显然不如标准头)
aux_head:
name: SimpleConvHead
num_classes: 80
input_channel: 192 # 可以看到输入通道数也比nanodet head多
feat_channels: 192
stacked_convs: 4 # 堆叠4层而不是上面的2层,反正是训练不是推理
strides: [8, 16, 32, 64] # 对应nanodet head的四个头
activation: LeakyReLU
reg_max: 7 # 同head中的参数
下图是训练时feature的流图,backbone的输出进入两个Ghost PAN,其中一个是为AGM专门搭建的,另一个pan和head连接。AGM会将两个PAN的输出拼接在一起作为输入(猜想这样可以更好的获取当前Head的训练情况,同时也能获取更多特征),其有两个分支,分别负责生成用作标签分配的cls_pred和reg_pred。对于Ghost PAN中的不同层特征,AGM采用相同的参数(参数共享)进行运算,大大减小了训练时的参数数和运算量,提升精度的同时使得训练速度不会增加太多。AGM的输出在训练初期将会作为Head标签分配的参考,并且AGM的loss也会进行回传,帮助网络更快地收敛。经过数个epoch(默认是10个)的训练后Head的预测已经有较好的准确度,此时将AGM模块分离,直接由Head的输出自行完成标签分配的任务。
在训练完成进行推理时,直接去除AGM和aux_fpn,得到非常精简的网络结构。
边栏推荐
猜你喜欢
PhotoShop软件笔记
rk3399 PCIe rc设备枚举之设备资源识别分析
One Pass 1258 - Digital Pyramid (Dynamic Programming)
Cholesterol-PEG-Maleimide,CLS-PEG-MAL,胆固醇-聚乙二醇-马来酰亚胺用于科研实验
已解决ModuleNotFoundError: No module named ‘Workbook‘
SQL注入(3)
3年半测试经验,20K我都没有,看来是时候跳槽了...
Image.new() 及 img.paste() 的用法记录
别了,IE浏览器
给一时兴起想要学习 “ 测试 ” 的同学的几条建议.....
随机推荐
cmd路径空格问题解决方案
以赛促练-力扣第84场双周赛反思以及第305场周赛补题
leetcode-23. Merge K ascending linked lists
H264之sps解析分辨率
嵌入式系统驱动高级【2】——平台总线式驱动开发上_基础框架
33 Basic Statistics - One Item Nonparametric Test
leetcode-23.合并K个升序链表
[Network Tutorial] IPtables Official Tutorial - Study Notes 3
作为常用的荧光标记试剂Cy5 亚磷酰胺(CAS号:182873-67-2)有哪些特点了?
29 机器学习中常常提到的正则化到底是什么意思
leetcode 2021春季挑战赛 1. 采购方案
qt字符串之 QString详解
30 norm
2022-08-08 The fifth group Gu Xiangquan study notes day31-collection-junit unit test
荣耀路由(WS831)做无线中继时LAN网段与WAN网段冲突解决方法
JSON beautification plugin for Chrome
Arrays and slices
powershell 执行策略
SQL注入(4)
技术分享 | 如何模拟真实使用场景?mock 技术来帮你