轻量检测模型NonoDet-Plus解析

官方解读:超简单辅助模块加速训练收敛,精度大幅提升!移动端实时的NanoDet升级版NanoDet-Plus来了! - 知乎

official implementation:https://github.com/RangiLyu/nanodet

Backbone

backbone部分没有变化,还是和nanodet一样,采用ShuffleNet v2。 

Neck

和nanodet相比,neck部分的改进包括三个部分

  • 借鉴GhostNet,设计了Ghost-PAN
  • 输出增加了一层P6
  • 下采样由nanodet中的插值改成5x5的深度可分离卷积

具体来说,nanodet中不同层级的特征通过上、下采样对齐尺度后,通过add的方式进行融合。在nanodet-plus中首先进行concatenate,然后经过一个GhostBlock的处理进行融合。

inner_out = self.top_down_blocks[len(self.in_channels) - 1 - idx](torch.cat([upsample_feat, feat_low], 1)
)

其中GhostBlock由若干个GhostBottleneck构成,这里为1个。GhostBottleneck又由2个GhostModule构成,关于GhostNet的具体介绍见GhostNet(CVPR 2020) 原理与代码解析。GhostBlock的具体结构如下,其中全是stride=1的bottleneck,没有使用se通道注意力,shortcut中的深度卷积核由3x3改成5x5

PicoDet在nanodet的三层特征上又下采样增加了一层特征,这里也一样neck的输出额外增加了一层P6。

# extra layers
for extra_in_layer, extra_out_layer in zip(self.extra_lvl_in_conv, self.extra_lvl_out_conv
):outs.append(extra_in_layer(inputs[-1]) + extra_out_layer(outs[-1]))

 这里extra_in_layer和extra_out_layer都是5x5的深度可分离卷积,如下

Head

head部分原本的3x3的卷积改成了5x5的深度可分离卷积,其它没有变化。

Label Assignment 

在nanodet中采用的是静态标签分配策略ATSS,这里作者想要改成动态分配策略,动态分配策略需要根据模型的输出计算cost matrix,然后再进行正负样本的分配。模型的预测越准,标签分配的结果也会越好,但在nanodet中采用了轻量的检测头,比起FCOS检测头中分类、回归两个分支,每个分支都包含4个256通道的3x3卷积,nanodet检测头中只有2个192通道的3x3卷积同时预测分类和回归,预测的精度可能会下降,这反过来又会影响标签分配的结果。

为了解决这个问题,作者设计了一个训练辅助模块Assign Guidance Module(AGM),这里借鉴了《LAD:Improving Object Detection by Label Assignment Distillation》这篇文章,其中用教师模型的预测去引导学生模型的标签分配,但是蒸馏需要实现训练好一个教师模型比较耗费资源。这里AGM结构就和FCOS的检测头一样,不同尺度特征共享检测头,检测头内分为分类、回归两个分支,每个分支包含4个3x3卷积和一个输出卷积。相比于蒸馏,这里耗费的资源更少,且只在训练时使用,推理时丢弃,不会增加推理时间。

具体实现如下,其中的aux_head就是AGM,这里作者还增加了一个aux_fpn,aux_fpn和原始的neck结构是一样的,原始neck的输出和aux_fpn的输出concat一起作为aux_head的输入。其中detach_epoch=10,即只在前10个epoch中aux_fpn和aux_head的梯度会反向传播,10个epoch后梯度就不回流了。

class NanoDetPlus(OneStageDetector):def __init__(self,backbone,fpn,aux_head,head,detach_epoch=0,):super(NanoDetPlus, self).__init__(backbone_cfg=backbone, fpn_cfg=fpn, head_cfg=head)self.aux_fpn = copy.deepcopy(self.fpn)self.aux_head = build_head(aux_head)self.detach_epoch = detach_epochdef forward_train(self, gt_meta):img = gt_meta["img"]feat = self.backbone(img)fpn_feat = self.fpn(feat)if self.epoch >= self.detach_epoch:aux_fpn_feat = self.aux_fpn([f.detach() for f in feat])dual_fpn_feat = (torch.cat([f.detach(), aux_f], dim=1)for f, aux_f in zip(fpn_feat, aux_fpn_feat))else:aux_fpn_feat = self.aux_fpn(feat)dual_fpn_feat = (torch.cat([f, aux_f], dim=1) for f, aux_f in zip(fpn_feat, aux_fpn_feat))head_out = self.head(fpn_feat)aux_head_out = self.aux_head(dual_fpn_feat)loss, loss_states = self.head.loss(head_out, gt_meta, aux_preds=aux_head_out)return head_out, loss, loss_states

在训练过程中只用aux_head输出计算cost matrix,在推理时,采用自身的head计算cost matrix。cost由三部分组成,分类cost、回归cost、距离cost

在nanodet中加入动态分配策略Dynamic Soft Label Assign(DSLA)和辅助模块AGM,提升如下

Loss

loss部分和nanodet一样,采用的是GIoU Loss + Generalized Focal Loss。 

Training Strategy

改进如下

  • 优化器由SGD+momentum改成ADdamW
  • 学习率策略由MultiStepLr改成CosineAnnealingLR
  • 加入梯度裁剪
  • 加入EMA 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/327630.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

时序预测 | Matlab实现EEMD-SSA-BiLSTM、EEMD-BiLSTM、SSA-BiLSTM、BiLSTM时序预测对比

时序预测 | Matlab实现EEMD-SSA-BiLSTM、EEMD-BiLSTM、SSA-BiLSTM、BiLSTM时间序列预测对比 目录 时序预测 | Matlab实现EEMD-SSA-BiLSTM、EEMD-BiLSTM、SSA-BiLSTM、BiLSTM时间序列预测对比预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现EEMD-SSA-BiLSTM、…

TypeScript 从入门到进阶之基础篇(三) 元组类型篇

系列文章目录 TypeScript 从入门到进阶系列 TypeScript 从入门到进阶之基础篇(一) ts基础类型篇TypeScript 从入门到进阶之基础篇(二) ts进阶类型篇TypeScript 从入门到进阶之基础篇(三) 元组类型篇TypeScript 从入门到进阶之基础篇(四) symbol类型篇 持续更新中… 文章目录 …

Kettle Local引擎使用记录(基于Kettle web版数据集成开源工具data-integration源码)

Kettle Web 📚第一章 前言📚第二章 demo源码📗pom.xml引入Kettle引擎核心文件📗java源码📕 controller📕 service📕 其它📕 maven settings.xml 📗测试📕 测试…

Mac打包Unix可执行文件为pkg

Mac打包Unix可执行文件为pkg 方式一:通过packages页面打包 1.下载packages app Distribution:自定义化更高,包括修改安装页面的内容提示 我这里主要演示Distribution模式的项目:通过unix可执行文件postinstall.sh脚本实现通过ma…

软件测试|Docker exec命令详细使用指南

简介 Docker exec命令是Docker提供的一个强大工具,用于在正在运行的容器中执行命令。本文将详细介绍Docker exec命令的用法和示例,帮助大家更好地理解和使用这个命令。 Docker是一种流行的容器化平台,允许我们在容器中运行应用程序。有时候…

YOLOv5训练损失、精度、mAP绘图功能 | 支持多结果对比,多结果绘在一个图片(消融实验、科研必备)

一、本文介绍 本文给大家带来的是YOLOv5系列的绘图功能,我将向大家介绍YOLO系列的绘图功能。我们在进行实验时,经常需要比较多个结果,针对这一问题,我写了点代码来解决这个问题,它可以根据训练结果绘制损失(loss)和mAP(平均精度均值)的对比图。这个工具不仅支持多个文件…

MySQL数据库学习二

2 MySQL InnoDB 锁的基本类型 https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html 官网把锁分成了 8 类。所以我们把前面的两个行级别的锁(Shared and ExclusiveLocks),和两个表级别的锁(Intention Locks)…

国内代理IP推荐!

国内代理IP,日更新50w IP,全国200城市,可利用率高达99%。提供HTTP/HTTPS/SOCKS5协议,满足数据采集、爬虫业务需求。丰富的api参数选择,可自由选择时效地区等,按需求过滤重复资源。低延迟,提供丰…

安全加密基础—基本概念、keytool、openssl

安全加密基础—基本概念、keytool、openssl 目录 前言 一、概念 明文通信 无密钥密文通信 对称加密 非对称加密 数字签名 消息摘要(MD5) CA数字证书(解决公钥分发的问题) HTTPS 相关文件扩展名 常用后缀名 普通的pem文件内容 二、keytool 2.1常用的命令如下 2…

听GPT 讲Rust源代码--compiler(19)

File: rust/compiler/rustc_target/src/spec/mips_unknown_linux_gnu.rs 该文件(rust/compiler/rustc_target/src/spec/mips_unknown_linux_gnu.rs)是Rust编译器针对MIPS架构上的Linux系统的目标描述文件。它的作用是定义了在这个目标上编译时的一些配置…

阿里云服务器Centos安装宝塔面板

阿里云服务器Centos安装宝塔面板 1 背景1.1 aliyun1.2 Linux 2 安装步骤2.0 环境配置2.1 安装前准备2.2 宝塔安装2.3 建站 3 centos常用命令3.1 防火墙相关 1 背景 1.1 aliyun 阿里云服务器是阿里云提供的一项云计算服务,它能够帮助用户快速搭建网站、应用和服务&…

ENVI 各版本安装指南

ENVI下载链接 https://pan.baidu.com/s/1APpjHHSsrXMaCcJUQGmFBA?pwd0531 1.鼠标右击【ENVI 5.6(64bit)】压缩包(win11及以上系统需先点击“显示更多选项”)选择【解压到 ENVI 5.6(64bit)】。 2.打开解压后的文件夹&#xff0c…