
深度解析Conformer核心原理FCU特征耦合单元如何实现CNN与Transformer双向交互【免费下载链接】ConformerOfficial code for Conformer: Local Features Coupling Global Representations for Visual Recognition项目地址: https://gitcode.com/gh_mirrors/con/ConformerConformer 是一款混合 CNN 与 Transformer 的视觉识别模型ICCV 2021 接收它通过 **FCU 特征耦合单元Feature Coupling Unit**让 CNN 的局部特征与 Transformer 的全局表征在不同分辨率下双向奔赴CNN 分支把局部特征下采样送入 Transformer 分支Transformer 分支再把全局语义上采样喂回 CNN 分支。本文将带你从零理解这套架构的设计动机、FCU 的实现细节与双向交互流程并附代码导航与上手指南。一、为什么要把 CNN 和 Transformer 结合起来两条技术路线各有短板模型路线擅长短板CNN如 ResNet提取局部细节边缘、纹理、轮廓感受野有限难以捕捉长距离全局依赖视觉 Transformer如 DeiT自注意力天然建模全局长距离依赖patch 化之后局部细节被磨平一个朴素的思路是先卷积、再 Transformer的串联结构但这会让信息单向流失。Conformer 的核心创新是采用并行的 concurrent 结构两条分支同时保留、层层交互让局部特征和全局表征都保留到最大程度。二、整体架构一览双分支并行、逐块耦合Conformer 的网络整体结构如下图中上半部分是 Transformer 分支Patch Embeddings 多头自注意力 MLP下半部分是 CNN 分支一系列卷积块中间被高亮的区域就是 FCU 耦合单元图 a 是 FCU 的放大示意图 b 是耦合流程图 c 是整个网络的分层组织方式从输入到输出数据流大致分为Stem 阶段7×7 卷积 最大池化得到 1/4 分辨率的特征图224→56Stage 1CNN 分支用卷积块处理特征图同时 Transformer 分支用带步长的 patch 卷积从同一特征图生成 patch embedding并拼上可学习的cls_token后进入第一个 Transformer BlockStage 2 ~ Stage 4共 12 个ConvTransBlock每个块内部都由一个 FCU 把两条分支焊在一起细节见下文双分类头CNN 分支做全局平均池化后接分类头Transformer 分支取cls_token接另一个分类头两个输出一起用于训练和推理。模型规模分三档在 ImageNet 上的表现官方 Model Zoo模型参数量MACsTop-1 准确率Conformer-Ti23.5 M5.2 G81.3 %Conformer-S37.7 M10.6 G83.4 %Conformer-B83.3 M23.3 G84.1 %同等参数量下Conformer-S 比 DeiT-B 高 2.3 个点——这就是双向耦合带来的收益。三、FCU 特征耦合单元一个压缩、一个解压FCU 由两个方向相反的小模块组成相当于两条分支之间的双向翻译器3.1 FCUDownCNN → Transformer下行通道把高分辨率特征图翻译成 Transformer 能消化的 patch token 序列流程是1×1 卷积先做通道投影把 CNN 的通道数映射到 Transformer 的 embedding 维度平均池化按dw_stride下采样并展平得到 patch token 序列LayerNorm GELU对齐 Transformer 分支的归一化风格最后把cls_token拼回序列头部保证 token 数量不变。3.2 FCUUpTransformer → CNN上行通道把 patch token 序列翻译回 CNN 特征图流程是去掉cls_token后把序列 reshape 回 2D 特征图1×1 卷积 BatchNorm ReLU投影回 CNN 的通道空间并归一化插值上采样按up_stride恢复分辨率与 CNN 分支特征图对齐。两个模块的实现都很简洁核心代码位于 conformer.py 中的FCUDown与FCUUp类全文不到 50 行值得逐行读一读。四、ConvTransBlock双向交互的完整走位ConvTransBlock是把 FCU 嵌进主干的基本作战单元前向传播的顺序非常有讲究CNN 分支先行标准 ResNet 风格卷积块1×1 → 3×3 → 1×1提取局部特征下行耦合FCUDown 把 CNN 中间特征图压缩成 patch token与上一步的 Transformer token 相加自注意力Transformer BlockMulti-head Self-Attention MLP在全局范围内整合信息上行耦合FCUUp 把增强后的 token 展开、上采样回 CNN 分辨率融合卷积一个 Fusion ConvBlock 接收自身 CNN 特征 Transformer 反馈两路输入把全局语义真正注入卷积特征图。注意这里的信息流是双向的每个块中 CNN 的局部特征进入 TransformerTransformer 的全局表征也回到 CNN——而不是像串联结构那样一锤子买卖。三个 stage 的dw_stride逐级减半patch 尺寸分别为 4、2、1 的倍数意味着耦合发生在多种分辨率上浅层耦合保细节、深层耦合管语义。上图的特征图可视化直观验证了这种互补性以孔雀图为例CNN 分支b、f借助 Transformer 的全局线索激活区域覆盖了孔雀完整的身体而不只是头部和尾巴这种局部片段对比 ResNet-101 的 a、eTransformer 分支d、h吸收了 CNN 的局部细节孔雀轮廓更完整背景被有效抑制对比 DeiT-S 的 c、g 模糊的块状响应。一句话总结CNN 变全了Transformer 变细了这正是 FCU 双向耦合的价值。五、快速上手训练、测试与代码导航 ️5.1 环境与数据安装 PyTorch 1.7.0 与timm0.3.2并将 ImageNet 按train/、val/的标准目录结构准备好即可。仓库地址https://gitcode.com/gh_mirrors/con/Conformer5.2 训练与测试仓库提供的 run.sh 就是训练 Conformer-S 的完整入口8 卡、300 epochs、batch 1024单卡评测只需给 main.py 加上--eval与预训练权重路径例如--model Conformer_small_patch16。模型注册定义集中在 models.pyConformer_tiny_patch16、Conformer_small_patch16、Conformer_small_patch32、Conformer_base_patch16四档规格一览无余。5.3 代码导航想了解看这里FCU / ConvTransBlock / Conformer 主干conformer.pyFCUDown、FCUUp、ConvTransBlock、Conformer 四个类模型规格定义Ti/S/B、patch16/32models.py训练/评测脚本与参数main.py、run.sh对比基线 DeiT 实现vision_transformer.py检测/分割的骨干网络移植版mmdetection/mmdet/models/backbones/Conformer.py六、不止分类作为通用骨干用于检测与分割Conformer 的双分支结构天然适合做多任务骨干。项目内集成了 MMDetection 版本在 MSCOCO 上Conformer 用于 Faster R-CNN 时检测 mAP 比 ResNet-101 高3.7实例分割高3.6。相关配置文件位于mmdetection/configs/下的faster_rcnn/、mask_rcnn/、paa/目录例如faster_rcnn_conformer_small_patch32_fpn_1x_coco.py。下图是检测任务在自然图像上的典型输出效果可以看到不同尺度目标都被稳定框出七、小结一张图记住 FCU 的精髓 并行而非串联CNN 特征图与 Transformer token 全程并存信息不单向流失FCUDown 下行1×1 卷积 池化把局部特征压缩给 TransformerFCUUp 上行reshape 1×1 卷积 插值把全局表征解压回 CNN多尺度耦合三个 stage 逐级改变下采样倍率浅层管细节、深层管语义双头输出卷积分支与 Transformer 分支各自出分类结果互为正则。理解了 FCU 这一双向翻译器Conformer 的全部架构就清晰了。建议直接打开conformer.py从FCUDown读到ConvTransBlock.forward不到 100 行代码就能把全文逻辑串起来。【免费下载链接】ConformerOfficial code for Conformer: Local Features Coupling Global Representations for Visual Recognition项目地址: https://gitcode.com/gh_mirrors/con/Conformer创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考