ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

InternImage配置参数完全指南:config.json逐行解读,depths、groups与21841类背后是什么

InternImage配置参数完全指南:config.json逐行解读,depths、groups与21841类背后是什么

【免费下载链接】internimage_h_jointto22k_384

项目地址:https://ai.gitcode.com/OpenGVLab/internimage_h_jointto22k_384
点击查看免费下载

InternImage(internimage_h_jointto22k_384)是 OpenGVLab 推出的 1.08B 参数视觉大模型,其 config.json 文件定义了网络深度、DCNv3 分组数和 21841 类分类头。本文逐行解读这份 InternImage 配置参数,带你一次看懂 depths、groups 和 21841 类的含义。

📄 快速上手:config.json 是什么

在 Hugging Facetransformers体系中,加载模型前会先读取config.json,把网络结构"按图施工"地搭建出来。本仓库的三个关键文件各司其职:

  • config.json —— 网络结构的全部超参数
  • configuration_internimage.py —— 参数对应的 Python 类InternImageConfig,带默认值
  • modeling_internimage.py —— 真正消费这些参数、搭建网络的主干代码

_name_or_path字段写着模型名,auto_map则告诉框架"自定义类在哪个文件":

"auto_map": { "AutoConfig": "configuration_internimage.InternImageConfig", "AutoModel": "modeling_internimage.InternImageModel", "AutoModelForImageClassification": "modeling_internimage.InternImageModelForImageClassification" }

也就是说,用AutoModel.from_pretrained(..., trust_remote_code=True)加载时,AutoModel得到的是不带分类头的纯主干(内部强制num_classes=0),而AutoModelForImageClassification才会接上 21841 类的分类头(见 modeling_internimage.py)。

🗂️ 参数速查总表

参数值作用一句话
channels320第一阶段的特征图通道数,后续阶段依次翻倍
depths[6, 6, 32, 6]4 个阶段各自堆叠的 block 数量
groups[10, 20, 40, 80]各阶段 DCNv3 的分组数(可变形卷积的注意力头数)
dw_kernel_size5生成偏移量/权重前用的深度卷积核大小(H/G 专用)
mlp_ratio4.0MLP 隐层展宽倍率
num_classes21841分类头输出的类别数
use_clip_projectortrue启用 CLIP 风格的特征投影分类头(H/G 专用)
core_op"DCNv3"核心算子:第三代可变形卷积
drop_rate/drop_path_rate0.0正则化强度(推理仓库中均为 0)
torch_dtype"float32"推理默认精度

🔢 depths:4 个阶段、50 个 block 怎么排布

"depths": [6, 6, 32, 6]表示网络分成4 个阶段(stage),每个阶段由若干个InternImageBlock串联。在 InternImageBlock 中,depth直接决定nn.ModuleList里创建多少个InternImageLayer:

self.blocks = nn.ModuleList([InternImageLayer(...) for i in range(depth)])
阶段depths通道数384px 输入下的特征图
Stage 1632096 × 96
Stage 2664048 × 48
Stage 332128024 × 24
Stage 46256012 × 12

两个细节值得注意:

  • 通道数翻倍、分辨率减半:每个阶段末尾(最后阶段除外)有一个 DownsampleLayer,用 3×3、stride=2 卷积把特征图减半、通道翻倍。num_features因此是channels × 2³ = 2560(modeling_internimage.py)。
  • Stage 3 占了 32 个 block,是计算量的大头——深层语义理解主要靠它,这种"中间厚、两头薄"的布局与主流大模型一致。

🧩 groups:DCNv3 的"注意力头数",为什么是 10/20/40/80

"groups": [10, 20, 40, 80]传给 DCNv3 的group参数(dcnv3.py)。DCNv3 是 InternImage 的灵魂算子:每个像素动态预测一组偏移量(offset)和一组 softmax权重(mask),实现"注意力式的可变形采样"。groups 本质上就是这种采样注意力的头数。

它与通道数存在一条"必须整除"的硬约束(见 dcnv3.py):

if channels % group != 0: raise ValueError('channels must be divisible by group, but got {channels} and {group}')

本配置恰好满足:

  • 320 ÷ 10 =32、640 ÷ 20 =32、1280 ÷ 40 =32、2560 ÷ 80 =32

每个 head 分到 32 个通道——是 2 的幂次。源码里有一行注释专门解释了原因:CUDA 实现中每个 attention head 维度为 2 的幂更高效。这正是 groups 逐阶段翻倍、始终比通道数"慢一拍"的原因。

另外,groups也决定了偏移量的参数量:每个像素要输出group × kernel² × 2个 offset 和group × kernel²个 mask(dcnv3.py),所以 groups 越大,DCNv3 越"精打细算",但参数和计算也越多。

🎯 num_classes:21841 到底是什么?

"num_classes": 21841是这份配置最有"故事"的字段:

  • 它是ImageNet-22k 的类别数(原始类别表约 21843 项,去掉第 0 位未使用类和缺失类后为 21841)。
  • 模型名里的jointto22k指的是 InternImage-H 先在内部 427M 数据集上联合预训练、再在IN-22K(ImageNet-22k)上继续预训练。
  • 而仓库 README 中 README.md 标注的 90.1%+ Top-1 是在ImageNet-1K(1000 类子集)评测的结果——1K 的类正是 22k 类别的子集,所以同一个 21841 维的分类头天然兼容两种评测。

分类头长什么样?

对 H 这一档,use_clip_projector: true启用了专门的 CLIP 风格分类头(modeling_internimage.py):

  1. Stage 4 特征经 1×1 卷积 + PixelShuffle 投影到 1024 维;
  2. Stage 3 特征经 1×1 卷积后相加融合(多尺度信息);
  3. 过 AttentionPoolingBlock(16 头注意力池化)压到 768 维(CLIP 文本塔维度);
  4. 最后Linear(768 → 21841)输出 logits。

"cls_scale": 1.5则用于非 CLIP 头的路径:把 1×1 卷积输出通道放大 1.5 倍(2560 × 1.5 = 3840),再送入分类层(modeling_internimage.py)。

🧠 核心算子组:core_op、dw_kernel_size、offset_scale

参数值解读
core_op"DCNv3"指定核心算子;没装 CUDA 版 DCNv3 时自动回退到纯 PyTorch 实现(modeling_internimage.py)
dw_kernel_size5H/G 专用:先用 5×5 深度卷积提特征,再算 offset/mask,感受野比 3×3 更大
offset_scale1.0偏移量缩放系数,控制动态采样点的移动幅度
center_feature_scaletrueH/G 专用:动态融合"采样结果"与"中心像素投影",保留中心信息
remove_centerfalse采样时是否去掉中心点(要求卷积核为奇数)

在 DCNv3.forward 中流程很直观:input_proj→ 深度卷积dw_conv→ 线性层出 offset/mask → 核心采样 → 可选的 center 融合 →output_proj。

📐 归一化策略:res_post_norm 与 level2_post_norm

这份配置里归一化参数看似平淡,实则藏着 H/G 模型特有的稳定性设计:

  • post_norm: false—— 使用标准的 pre-norm(先 norm 再过 DCNv3/MLP),见 InternImageLayer.forward。
  • res_post_norm: true—— H/G 专用改进:在每个残差分支输出之后再加一层 LN(res_post_norm1/2),即x + norm(branch(x)),抑制深层特征幅值漂移。
  • level2_post_norm: true+level2_post_norm_block_ids: [5, 11, 17, 23, 29]—— 只在 Stage 3(32 个 block)中,对每 6 个 block 的末尾各插一次额外 LN。5 个 id 对应第 6/12/18/24/30 个 block,恰好均匀切分 Stage 3(32 = 5×6 + 2)。这个开关在组网时只对第 2 级生效(modeling_internimage.py)。
  • norm_layer: "LN"—— 全程 LayerNorm;act_layer: "GELU"—— 全程 GELU 激活。

🎲 正则化与推理开关

参数值说明
drop_rate0.0Dropout 率。源码默认是 0.2,本仓库为已训练完的推理权重,置 0 保证输出确定
drop_path_rate0.0Stochastic Depth(随机深度)率
drop_path_type"linear"Stochastic Depth 的分配方式:随深度线性递增(torch.linspace,modeling_internimage.py)
with_cpfalse是否用梯度检查点省显存;纯推理场景恒为 false
torch_dtype"float32"加载默认精度,可按需改为 bfloat16 等
transformers_version"4.37.2"记录生成配置时的 transformers 版本,仅作兼容性参考

🖼️ 配套输入:preprocessor_config.json

模型"吃什么"也由 preprocessor_config.json 定义,这里全是 ImageNet 标准配方:

  • size: 384/crop_size: 384—— 与模型名中的384对应:先缩放到短边 384,再中心裁剪 384×384(对应 StemLayer 两次 stride=2,输出 96×96 进入 Stage 1)。
  • image_mean: [0.485, 0.456, 0.406]/image_std: [0.229, 0.224, 0.225]—— ImageNet 经典归一化均值/标准差。
  • resample: 3—— PIL 的双三次插值(BICUBIC)。
  • feature_extractor_type: "CLIPFeatureExtractor"—— 直接复用 CLIP 的图像处理器,这也与use_clip_projector的 CLIP 血统一脉相承。

❓ 三个高频疑问

1. depths 和 groups 能改吗?参数层面可以任意填,但 model.safetensors 的权重是按当前配置训练的:改depths/groups/channels会导致权重形状对不上,加载直接报错。这套配置是为 1.08B 权重的 InternImage-H 量身定制的。

2. 为什么 groups 不是 [3, 6, 12, 24]?小模型(如 T/S/B)通道数少(64 起步),groups 小;H 的通道是 320 起步,为保持"每 head 32 通道且为 2 的幂"的 CUDA 高效布局,groups 相应放大到 10/20/40/80。

3. 21841 维 logits 想只测 1K 怎么办?ImageNet-1K 的 1000 类是 22k 类别的子集,取对应索引的 logits 即可评测;仓库 README 中 90.1% 的 Top-1 就是这么算出来的。

✅ 小结

一份 config.json 读完,InternImage-H 的骨架已尽览:320 通道起步、[6, 6, 32, 6] 的四级深浅布局、[10, 20, 40, 80] 的 DCNv3 分组、5 像素深度卷积、21841 类 CLIP 风格分类头、384px 输入。想进一步动手,推荐沿着 configuration_internimage.py → modeling_internimage.py → dcnv3.py 的顺序读源码,每行配置都能找到它落地的那几行 Python。

【免费下载链接】internimage_h_jointto22k_384

项目地址:https://ai.gitcode.com/OpenGVLab/internimage_h_jointto22k_384
点击查看免费下载
上一篇:Vibe-Trading 一目均衡表信号系统实战:TK 交叉三重过滤引擎与 78 根 K 线预热机制
下一篇:OpenViking 资源管理命令实战指南:ov CLI 下的增删改查、定时刷新与语义检索

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进