当前位置:   article > 正文

【CVPR代码复现】BiFormer图像分类实战教程

biformer

零、BiFormer介绍

标题:BiFormer: Vision Transformer with Bi-Level Routing Attention
论文:https://ieeexplore.ieee.org/document/10203555
https://arxiv.org/abs/2303.08810
GitHubhttps://github.com/rayleizhu/BiFormer

模型结构
image-20240324112114448

1.论文介绍:

BiFormer是一种新型的视觉Transformer架构,它通过引入一种称为Bi-Level Routing Attention(BRA)的机制来提高计算效率和性能。这种机制通过在粗粒度的区域级别上过滤掉与查询无关的键值对,然后在剩余的候选区域(即路由区域)中应用细粒度的令牌对令牌注意力。BiFormer的设计旨在使查询能够以自适应的方式关注一小部分最相关的令牌,从而在不受到其他无关令牌干扰的情况下提高性能。BiFormer在多个计算机视觉任务上进行了实证测试,包括图像分类、目标检测和语义分割,证明了其设计的有效性。

2.核心创新点:

  • Bi-Level Routing Attention (BRA): BiFormer的核心创新是BRA机制,它通过两级路由来实现动态、查询感知的稀疏性。在第一阶段,它在区域级别上构建一个亲和图,并通过剪枝来保留每个节点的前k个连接。这样,每个区域只需要关注前k个路由区域。在第二阶段,它应用令牌对令牌的注意力,通过聚集关键值对来实现高效的注意力计算。

  • 内容感知的计算分配: BiFormer通过BRA机制实现了对计算的灵活分配,使得每个查询只关注与其语义上最相关的一小部分键值对,从而提高了计算效率。

  • GPU友好的实现: BiFormer的设计考虑到了GPU的内存操作特性,通过密集矩阵乘法而不是稀疏矩阵乘法来实现注意力机制,从而提高了模型在现代GPU上的运行效率。

3.应用效果:

BiFormer在多个计算机视觉任务上展示了显著的性能提升:

  1. 在图像分类任务中,BiFormer-T在ImageNet-1K数据集上达到了83.8%的top-1准确率,这是在类似计算预算下没有使用外部数据或蒸馏技术的最佳结果。
  2. 在目标检测和实例分割任务中,BiFormer在COCO 2017数据集上的表现超过了一些最具有竞争力的现有方法,尤其是在处理小物体时。
  3. 在语义分割任务中,BiFormer在ADE20K数据集上的表现也优于一些现有的方法。

一、环境配置

  1. 先下载源代码,我直接用的作者开源GitHub里的代码
    https://github.com/rayleizhu/BiFormer
  2. 开始时,建议使用代码给出的环境建立虚拟环境
conda env create -f environment.yaml -n biformer
  • 1

如果在已经有torch的环境里,使用下面语句安装没有安装的包库

conda env update -f environment.yaml
  • 1

安装.yaml环境的教程来自于:
https://blog.csdn.net/qq_42536162/article/details/134666873


(因为我使用安装好了torch和mmcv的环境,下面是我额外需要安装的。如果用上面方法安装好了环境,请跳过后面所有环境安装部分)

安装 timm,hydra,submitit,omegaconf,fvcore,einops
使用pip就行,例如安装timm命令:

pip install timm
  • 1

二、训练

  1. 使用分布式训练
python hydra_main.py \
    data_path=./data/in1k input_size=224  batch_size=128 dist_eval=true \
    +slurm=${CLUSTER_ID} slurm.nodes=1 slurm.ngpus=8 \
    model='biformer_small'  drop_path=0.15 lr=5e-4
  • 1
  • 2
  • 3
  • 4
  1. 单卡训练
python main.py --data-path ./data/MRI --output_dir ./run --input-size 224 --batch-size 32 --model biformer_small
  • 1

成功开始训练:
在这里插入图片描述
我使用了医疗肿瘤分类数据集
最终300epoch结果为:

  • Acc@1 63.452 Acc@5 100.000 loss 1.052
    Accuracy of the network on the 394 test images: 63.5%
    Max accuracy: 65.23%
    Training time 3:38:14

时间还是挺短的,确实是效率高,不过精度一般

三、报错调bug

1.报错: ModuleNotFoundError: No module named ‘hydra’

环境里输入:

pip install hydra-core --upgrade
  • 1

2.报错:No module named ‘torch._six’

将 from torch._six import inf 调整为下面

from torch import inf 
  • 1

3.报错:Set the environment variable HYDRA_FULL_ERROR=1 for a complete stack trace.

因为GitHub里给的训练命令是分布式的,而如果只有一张卡,不使用分布式,运行就会报错。所以使用下面代码:

python main.py --data-path ./data/MRI --output_dir ./run --input-size 224 --batch-size 32 --model biformer_small
  • 1

4.报错:AttributeError: ‘Namespace’ object has no attribute ‘log_dir’

在main.py添加下面语句,因为源代码里没有定义log_dir(运行结果存储位置)

parser.add_argument('--log_dir', type=str, default='run',
                        help='Directory for saving model checkpoints and TensorBoard logs')
  • 1
  • 2

如下面图所示:
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/704432
推荐阅读
相关标签
  

闽ICP备14008679号