尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

DynamicHead 源码解析(一):DyHead 模块与多尺度注意力融合的实现细节

DynamicHead 源码解析(一):DyHead 模块与多尺度注意力融合的实现细节 DynamicHead 源码解析一DyHead 模块与多尺度注意力融合的实现细节【免费下载链接】DynamicHead项目地址: https://gitcode.com/gh_mirrors/dy/DynamicHeadDynamicHeadDyHead是 CVPR 2021 论文《Dynamic Head: Unifying Object Detection Heads with Attentions》的官方开源实现它的核心思路是把尺度感知、空间感知与任务感知三种注意力统一进目标检测头在不增加计算开销的前提下显著提升检测精度。本文是DynamicHead 源码解析系列的第一篇聚焦 DyHead 模块与多尺度注意力融合的实现细节带你看懂核心代码的运行机制。DynamicHead 源码结构一览核心文件如何分布开始逐行分析之前先认识一下项目里与 DyHead 相关的几个核心文件后续分析都会围绕它们展开文件路径作用dyhead/dyhead.pyDyHead 与 DyConv 核心模块本文主角dyhead/dyrelu.pyDYReLU 动态激活函数任务注意力落点dyhead/deform.py可变形卷积封装空间注意力载体dyhead/config.pyDyHead 的 NUM_CONVS / CHANNELS 配置项extra/resnet.py与 Detectron2 骨干网络FPN的接入extra/atss.pyATSS 检测头与 Focal Loss 计算整个项目基于 Detectron2 搭建setup.py还会把dyhead/csrc/下的 CUDA 算子编译成dyhead._C扩展供可变形卷积在 GPU 上高速运行。三步看懂 DyHead 模块的接入方式DyHead 本质上是把检测头塞进了骨干网络的位置让 FPN 输出的多尺度特征先经过 DyHead 再进入后续的检测塔。接入过程可以分为三步第一步注册骨干构建函数。在extra/resnet.py中通过BACKBONE_REGISTRY.register()注册了build_retinanet_resnet_fpn_dyhead_backbone它会先构建 ResNet FPN再用DyHead(cfg, backbone)把 FPN 包起来backbone FPN(...) # 先构建 ResNet FPN dyhead DyHead(cfg, backbone) # 再用 DyHead 包装 return dyhead第二步在配置文件中启用。打开configs/dyhead_r50_atss_fpn_1x.yaml可以看到BACKBONE.NAME指向了上面注册的构建函数DYHEAD.NUM_CONVS默认 6 层、CHANNELS为 256定义在dyhead/config.py中。第三步走一遍前向流程。DyHead.forwarddyhead/dyhead.py的逻辑非常简洁先跑骨干网络再把结果交给由 6 个 DyConv 堆叠而成的dyhead_towerdef forward(self, x): x self.backbone(x) dyhead_tower self.dyhead_tower(x) return dyhead_tower核心拆解DyConv 如何完成多尺度注意力融合真正干活的是DyConv它把尺度 空间 任务三种注意力融合在了同一个模块里代码位于dyhead/dyhead.py。理解它只需要抓住三个关键设计关键点一三个可变形卷积对应三个尺度来源。DyConv 内部维护了 3 个ModulatedDeformConvstride 分别为 1、1、2用于处理当前层、上一层、下一层特征self.DyConv[1]处理当前层的特征stride 1self.DyConv[2]处理更粗的上一层特征stride 2 下采样self.DyConv[0]处理更细的下一层特征结果再上采样回当前分辨率关键点二偏移量与掩码由一个小卷积一次性预测。空间注意力通过可变形卷积实现其 offset 和 mask 由一个输出 27 通道的卷积生成——3×3 卷积核需要 18 个 offset 通道加 9 个 mask 通道offset_mask self.offset(feature) offset offset_mask[:, :18, :, :] mask offset_mask[:, 18:, :, :].sigmoid()关键点三跨层融合用注意力加权求均值。三个来源的特征各自经过AttnConv自适应池化 1×1 卷积算出注意力分数经h_sigmoid归一化后作为权重最终得到加权平均特征再送入 DYReLU 激活spa_pyr_attn self.h_sigmoid(torch.stack(attn_fea)) mean_fea torch.mean(res_fea * spa_pyr_attn, dim0) next_x[name] self.relu(mean_fea)尺度注意力跨金字塔层的特征加权论文中的尺度感知注意力在代码里体现为上面的跨层加权平均每个特征金字塔层都会聚合它的相邻层信息并由AttnConv学出各层的重要程度。AttnConv的实现非常轻量——一个全局平均池化加一个 1×1 卷积加 ReLU几乎不增加参数量却能让网络自适应地决定该信哪一层。这也正是论文强调的no computational overhead零额外计算开销的关键所在。空间注意力可变形卷积的 offset 与 mask 细节空间注意力由ModulatedDeformConvdyhead/deform.py承担。它与普通卷积的区别在于每个采样点的位置不是固定的而是由网络学出的 offset 动态调整同时 mask 还能为每个采样点赋予不同的重要性权重。值得注意的实现细节是ModulatedDeformConv的前向/反向都通过dyhead._C.modulated_deform_conv_forward调用了 CUDA 扩展dyhead/csrc/cuda/下的.cu文件这也是项目在 GPU 上保持高性能的底层保障。ModulatedDeformConvPack还提供了一键生成 offset mask的封装版本不过 DyHead 选择自己预测 27 通道再手工拆分控制粒度更细。任务注意力DYReLU 动态激活机制任务注意力落点在一个有趣的动态激活函数 DYReLU 上dyhead/dyrelu.py。它不再是一个固定的 ReLU 打天下而是先对输入做全局池化再经两层全连接生成动态的斜率与截距用 max 组合两条线性函数a1, b1, a2, b2 torch.split(y, self.oup, dim1) out torch.max(x_out * a1 b1, x_out * a2 b2)也就是说每个通道的激活形状是根据输入内容动态生成的。这让检测头能针对不同的任务分支分类 or 回归自适应地调整特征表达这正是论文中task-aware任务感知的实现本质。DynamicHead 实测效果COCO 上的表现一览多尺度注意力融合到底值不值项目 README 的 Model Zoo 给出了答案R50 骨干 1x 训练模型组合COCO mAPFaster R-CNN DyHead40.3RetinaNet DyHead39.9ATSS DyHead42.4ATSS Swin-Tiny DyHead2x 多尺度训练49.8同样基于 ResNet-50ATSS DyHead 能达到 42.4 mAP比同配置的普通 ATSS 高出约 3 个点而 DyHead 引入的参数量几乎可以忽略性价比相当突出。小结与下篇预告本文完成了DynamicHead 源码解析一的核心内容我们看到了 DyHead 如何包在 FPN 之上、DyConv 如何用三个可变形卷积 注意力加权 DYReLU完成多尺度注意力融合也理清了尺度、空间、任务三种注意力的代码落点。下一篇将深入extra/atss.py看看 ATSS 检测头如何与 DyHead 配合完成 anchor 匹配、Focal Loss 与回归损失的计算欢迎继续关注。【免费下载链接】DynamicHead项目地址: https://gitcode.com/gh_mirrors/dy/DynamicHead创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表