ViTDet
让普通 ViT backbone 无需层次化改造即可做目标检测,复现 FAIR ViTDet 论文的
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
让普通 ViT backbone 无需层次化改造即可做目标检测,复现 FAIR ViTDet 论文的
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
想象一下,你训练了一个强大的通用图像理解模型——Vision Transformer(ViT),它在大规模图像分类数据上表现出色。但当你想要用它来做更精细的任务——比如在一张复杂街道图里标出每辆车的位置、每个行人的轮廓——却发现这些通用模型并不「适配」目标检测这个下游任务。传统做法是专门为检测任务从头设计一个层次化的 backbone 网络(类似 Swin Transformer),但这意味着要放弃已经训练好的通用 ViT 权重。
Facebook AI Research(FAIR)的团队在 2022 年 ECCV 会议上提出了一个反直觉的发现:plain ViT 不需要层次化改造也能做目标检测。他们设计了 ViTDet 框架,仅用两个简单策略:单尺度特征金字塔(无需 FPN)和少量跨窗口传播块(window attention + global attention),就能让普通 ViT backbone 在 COCO 数据集上达到 61.3 APbox,与当时主流的层次化方法平起平坐。
本项目 ViTAE-Transformer/ViTDet 是该论文的 非官方 PyTorch 实现,由 ViTAE-Transformer 研究团队维护,提供了完整的训练/测试代码、预训练权重和 Docker 构建方案。

图1:ViTDet 在 COCO val2017 上的检测效果,图像叠加了检测框和实例分割掩码。
长期以来,目标检测领域的共识是:backbone 网络必须是层次化的(如 ResNet 的金字塔结构,或 Swin 的多阶段层级),因为检测任务需要从粗糙到精细的多尺度特征。在 ViTDet 出现之前,没有人敢想象把一个单一尺度、全局自注意力的 ViT 直接接到检测头上。
ViTDet 的核心洞察是:单尺度 ViT 的输出 patch embed 本身就包含了足够的多尺度信息,只需要一个轻量级模块将它们重组为特征金字塔。这个设计完全跳过了 FPN(Feature Pyramid Network),用极其简洁的方式解决了多尺度问题。
纯全局自注意力的计算量是 O(N²),对高分辨率图像来说完全不可行。ViTDet 采用 window attention(Swin 的核心设计):将图像划分为不重叠的窗口,在每个窗口内独立做自注意力。这将复杂度降为 O(N)。为了弥补窗口间的信息隔绝,每隔几个 block 插入一个 global attention block,少量跨窗口传播足以整合全局信息。
这种「窗口内局部 + 稀疏全局」的混合注意力模式,使得 ViTDet 在保持高效计算的同时,兼顾了全局感受野——这对目标检测中大尺度目标的识别尤为关键。
ViTDet 基于 OpenMMLab 生态构建,核心依赖:
mmcv-full 提供 CUDA 算子和训练工具,是整个 open-mmlab 生态的基础项目代码组织严格遵循 mmdetection 规范,核心目录:
| 目录/文件 | 说明 |
|---|---|
configs/ViTDet/ | ViTDet 系列配置文件(ViT-Base/ViTAE-Base/ViTAE-Small) |
tools/train.py | 分布式训练入口 |
tools/test.py | 测试/推理入口 |
tools/dist_train.sh | 多卡分布式训练脚本 |
docker/Dockerfile | 完整训练镜像(PyTorch 1.6 + CUDA 10.1) |
docker/serve/Dockerfile | TorchServe 推理服务镜像 |
mmdet/ | 核心修改:ViTDet backbone 适配层、检测 Neck、配置注册 |
ViTDet 提供了四组基准配置:
# 核心训练配置示例
ViTDet-ViT-Base-100e.py # ViT-Base backbone,100 epochs,Mask RCNN,51.1 mAP
ViTDet-ViTAE-Base-100e.py # ViTAE-Base backbone(带固有归纳偏置),51.6 mAP
ViTDet-ViTAE-Small-100e.py # ViTAE-Small backbone(小模型,20M参数),45.6 mAP
lsj_100e_coco_instance_r1024.py # 大尺度抖动(LSJ)数据增强,1024px 测试
所有配置都基于 OpenMMLab config 系统,支持 --cfg-options model.pretrained=<PATH> 的命令行覆盖预训练路径。

图2:mmdetection 数据处理 Pipeline,包含图像增强、GT 标注变换和批量整理流程。
项目提供了两套 Docker 路径:
训练镜像 (docker/Dockerfile):基于 pytorch/pytorch:1.6-cuda10.1-cudnn7-devel,需要手动编译 mmcv-full,过程复杂且耗时(通常需要 30 分钟到数小时)。这是因为 mmcv-full 的 CUDA 算子必须与目标 PyTorch/CUDA 版本严格匹配。
推理服务镜像 (docker/serve/Dockerfile):基于 TorchServe 0.4.0,支持将训练好的 .pth 模型转化为 .mar 格式进行部署。提供了 mmdet_handler.py 自定义处理器和 config.properties 配置文件。
值得注意的是,项目还支持 ONNX 导出(tools/deployment/pytorch2onnx.py)和 TensorRT 加速(tools/deployment/onnx2tensorrt.py),覆盖了从训练到端侧部署的完整链路。
项目内置了完整的 鲁棒性评测工具链(tools/analysis_tools/ 目录),包括:

图3:ViTDet 在不同图像损坏类型下的性能表现,用于评估模型的鲁棒性与泛化能力。
项目遵循严格的工程规范:
.pre-commit-config.yaml):代码格式化(black/isort)、类型检查(mypy)、commitlint.readthedocs.yml):支持多语言文档(英文 + 简体中文)tests/ 目录下包含单元测试README 详细覆盖了:所有模型在 COCO 上的 benchmark 结果(含 config/log/weight 链接)、完整的安装步骤(mmcv 编译、mmdet 安装、环境变量)、分布式训练命令(单机多卡 + 多机多卡)、各模块的设计动机和技术细节,以及未来计划(TODO)透明公开。
作为纯研究工具包,项目不涉及任何数据上传或云端调用。所有训练和推理均在本地 GPU 上完成。
mmcv-full 的安装是本项目最大的痛点。官方推荐从源码编译 MMCV_WITH_OPS=1 pip install -e .,但这要求:gcc/g++ 版本与 CUDA 版本严格匹配;PyTorch 版本与 mmcv 版本一一对应(mmcv 1.3.14 仅支持 PyTorch 1.6.0 到 1.9.0);编译过程在 16GB GPU 上可能 OOM。
项目虽然提供了预编译 wheel 的安装方式(-f https://download.openmmlab.com/mmcv/dist/...),但预编译包覆盖的平台有限,macOS 和较新的 CUDA 版本往往找不到匹配版本。
目标检测的训练对硬件要求极高。根据 benchmark 记录,ViT-Base 模型的训练使用了 4 台 A100(每台 2 卡),batch size 64,训练 100 个 epoch。即便只是推理测试,也需要至少 16GB VRAM 的 GPU(如 RTX 3090 / A5000)。这使得本项目对个人开发者和小型团队极不友好。
作为非官方实现,项目需要持续跟进 mmdetection 的版本更新。如果 mmdetection 2.x 主版本升级,相关 API 可能不兼容,需要手动适配。这对长期维护来说是一个持续的人力消耗。
ViTDet 的成功证明了一个重要观点:backbone 的层次化不是目标检测的必要条件。这一发现影响了后续大量工作,包括 MViTv2、DINO、DINOv2 等视觉基础模型在检测任务上的应用。
如今,OpenMMLab 的 MMDetection 已经内置了 ViTDet 的支持(configs/vitdet/),用户可以直接用 mmdet 自带的 API 调用 ViTDet backbone,无需手动适配。本项目作为「先行实验田」,在官方实现之前验证了工程可行性。
本项目同时包含了对 ViTAE(Vision Transformer Advanced by Exploring Intrinsic Inductive Bias)backbone 的适配实验,发现 ViTAE-Base 比普通 ViT-Base 更高 0.5 mAP,说明 固有归纳偏置(局部性、通道注意力)对目标检测任务仍有正向增益。这为后续 ViTAEv2、SegFormer 等工作提供了实验支撑。
# 1. 克隆 mmcv 并切换到兼容版本
git clone https://github.com/open-mmlab/mmcv.git
cd mmcv && git checkout v1.3.9
MMCV_WITH_OPS=1 pip install -e .
# 2. 克隆 ViTDet
cd .. && git clone https://github.com/ViTAE-Transformer/ViTDet.git
cd ViTDet && pip install -v -e .
# 3. 安装 timm 和 einops
pip install timm==0.4.9 einops
# 4. 下载预训练权重(MAE 或 ViTAE)
# 5. 启动分布式训练
bash tools/dist_train.sh configs/ViTDet/ViTDet-ViT-Base-100e.py 8 \
--cfg-options model.pretrained=/path/to/pretrained.pth
ViTAE-Transformer/ViTDet 是一个工程价值极高的目标检测研究实现。它不仅复现了 FAIR 论文的核心思想,还通过 ViTAE backbone 的扩展实验证明了「plain ViT + 检测适配」这一范式的可行性。项目代码规范、文档完整、benchmark 透明,是目标检测方向研究者和工程师的重要参考。
但也必须正视其局限:mmcv-full 编译复杂度、极高的 GPU 显存需求、以及非官方实现带来的同步维护负担,使得这个项目更适合有经验的研发团队用于深入研究或模型调优,而非快速原型验证。

图4:项目基于 OpenMMLab 生态构建,Logo 版权归 open-mmlab 所有。