☰
深度拆解Unlimited-OCR-2视觉编码器:CLIP-L+SAM如何看懂复杂文档版面
2026/11/3 2:48:53 网站建设 项目流程
  • 人工智能
  • 计算机视觉
  • OCR
  • 多模态
  • 大模型

【免费下载链接】Unlimited-OCR-2

项目地址:https://ai.gitcode.com/hf_mirrors/baidu/Unlimited-OCR-2
点击查看免费下载

Unlimited-OCR-2 是百度开源的超长文档 OCR 模型,主打"无限页"解析:把整本书、上百页 PDF 一次性喂给它也能稳定输出结构化文本。它的"眼睛"——视觉编码器——采用了一套名为deeplip_b_l的双塔设计:CLIP-L 负责理解版面语义,SAM ViT-B 负责保留像素级细节,两者特征融合后经投影器送入 MoE 语言模型。本文将带你从配置到源码,看懂这套视觉编码器的工作原理。

1. 先认识整体结构:一只"双塔"眼睛

打开模型入口文件 modeling_unlimitedocr.py,UnlimitedOCRModel.__init__里只有三行代码就搭好了视觉前端:

  • self.sam_model = build_sam_vit_b()—— SAM 高分辨率塔
  • self.vision_model = build_clip_l()—— CLIP-L 全局语义塔
  • self.projector = MlpProjector(...)—— 2048 → 1280 的线性投影器

对应的参数配置写在 config.json 的vision_config字段中,model_name正是deeplip_b_l,里面分两组:clip-l-14-224与sam_vit_b,一眼就能看出是"两个视觉骨干拼一台"。

组件输入分辨率结构输出维度角色
SAM ViT-B(高分辨率塔)1024×1024,patch 16 → 64×6412 层、768 维、窗口注意力1024 通道(经 neck 下采样)细节:小字、表格线、印章
CLIP-L(全局语义塔)224×224,patch 14 → 15×1524 层、1024 维1024(去掉 cls 后)版面理解:标题、段落、图表布局
MlpProjector—单层 Linear1280(对齐 LLM)把 2048 维视觉特征"翻译"成语言模型能读懂的 token 嵌入

2. SAM 塔:用窗口注意力扛住 1024 高清输入

SAM 骨干的构建函数在 deepencoder.py 的build_sam_vit_b,真正的超参在_build_sam:

  • 输入 1024×1024、patch 16,得到 64×64=4096 个 patch token——比 CLIP 的 225 个 token 多了近 20 倍,这是它能看清小字的关键;
  • 注意力不全是"全图注意力":window_size=14的窗口注意力 + 第[2,5,8,11]层做全局注意力(global_attn_indexes),这是经典 SAM ViT 的"窗口省算力、全局保感知"混合策略,实现见 Block;
  • 注意力中启用了use_rel_pos=True的相对位置偏置,见 Attention,让同一窗口内的 token 知道自己"挨得多近";
  • 输出的 256 通道特征再经过两次卷积下采样net_2/net_3(ImageEncoderViT 末尾),把空间分辨率压到 32×32、通道升到 1024。

一句话:SAM 塔产出的是"高细节、低密度"的特征图,专门兜底 OCR 里最容易丢的小字和细线。

3. CLIP-L 塔:一个"被改造过"的 CLIP

CLIP-L 的超参在 deepencoder.py:24 层、1024 维、16 头、224 输入、14 的 patch——即标准 CLIP-L/14 规格,由build_clip_l构建。

但有两处针对 OCR 场景的改造值得注意:

  1. patch embedding 可以"外接"。CLIPVisionEmbeddings.forward 里有个分支:如果传入了现成的patch_embeds,就跳过自己的卷积。模型正是利用这一点,把 SAM 塔的低层特征注入 CLIP,让它做语义加工时"看得见原始像素级信息",而不是只看一张 224 的小图。
  2. 位置编码支持双三次插值(get_abs_pos),输入尺寸变化时位置编码可以平滑缩放,这也是后文"动态切块"能稳定工作的基础。

4. 核心设计:SAM 特征如何"喂"进 CLIP

融合逻辑全部写在 UnlimitedOCRModel.forward,核心就三步:

  1. SAM 先跑:local_features_1 = sam_model(patches);
  2. CLIP 复用 SAM 的 patch 特征:vision_model(patches, local_features_1)——注意第二个参数,CLIP 的卷积被 SAM 的输出顶掉了;
  3. 拼接后投影:
local_features = cat([clip_out[:, 1:], sam_out.flatten(...)], dim=-1) # 1024+1024=2048 local_features = self.projector(local_features) # 2048 → 1280

对应源码见 modeling_unlimitedocr.py。投影器就是一个linear类型的 MlpProjector,把 2048 维视觉特征压到 1280 维——正好等于 LLM 的hidden_size,随后通过masked_scatter_直接替换掉 prompt 中<image>占位符的 token 嵌入(L785)。

为什么这样设计?CLIP 擅长回答"这块是标题还是表格",SAM 擅长回答"这个像素是 0 还是 6"。拼接(而不是相加)保留了两个塔各自的完整信息,代价只是投影器输入翻倍,工程上非常划算。

5. 双视角:全局视图 + 动态切块(gundam 模式)

Unlimited-OCR-2 对每一页图会生成两种视角的 token 序列,输入构造逻辑在_uocr_build_inputs:

  • base 模式(全局视图):整页 pad 到 1024×1024 进 SAM/CLIP,得到 273 个图像 token(对应config.json里的per_page_image_tokens: 273)。多页文档推理时默认用它——所有页面各自一个全局视图,模型靠跨页上下文合并版式;
  • gundam 模式(动态切块):单页推理时默认开启,用dynamic_preprocess把大图切成 2~16 块 640 像素的 tile,每块单独过一遍双塔编码器,细节密度大幅提高。

视角之间还插了两个可学习的"标点符号":

  • image_newline:每行视角 token 末尾追加,相当于视觉版的"换行符"(L751-L754);
  • view_seperator:局部 tile 视角和全局视角之间的分隔符(L762)。

这两个 1280 维参数定义在 modeling_unlimitedocr.py,它们让语言模型能明确区分"这是局部细节 / 这是整页概览",是版面感知的重要一环。

6. 视觉特征之后:稀疏注意力如何"接住"它

视觉 token 进入语言模型后,12 层 MoE 解码器(64 路由专家 + 2 共享专家,见 config.json 的n_routed_experts)并不会对超长序列做全量注意力——sparse_attention_config里配置了基于<PAGE>标记的按页分块稀疏注意力(page_token_id: 128827、sparse_block_size: 32)。解码时每个输出 token 只回看"自己所在页"的图像块,相关机制可参考 dash_attention.py 和 _uocr_dash_decode_allow。

这正是"双塔编码器 + 按页稀疏注意力"的组合拳:前端把一页压缩成固定数量的视觉 token,后端只让注意力按页检索,于是文档页数再多,解码延迟和显存也基本恒定——这就是 Unlimited-OCR-2 所谓"unlimited-horizon"的来源。

7. 关键文件速查清单 📌

想做什么看哪里
双塔如何装配进模型modeling_unlimitedocr.py#L632-L642
SAM/CLIP 骨架实现deepencoder.py(ImageEncoderViT、VitModel、build_sam_vit_b、build_clip_l)
双塔特征融合与投影modeling_unlimitedocr.py#L731-L743
切块/视角 token 构造modeling_unlimitedocr.py#L531-L580
视觉编码器超参config.json 的vision_config
稀疏注意力与页面约束dash_attention.py、config.json 的sparse_attention_config

8. 小结

Unlimited-OCR-2 的视觉编码器可以用三句话概括:

  1. SAM ViT-B 在 1024 分辨率上做窗口注意力,产出细节特征;
  2. CLIP-L 复用 SAM 的 patch 特征做版面语义编码,两塔输出拼接后经线性投影对齐 LLM 维度;
  3. 全局视图与动态切块双视角 + 换行/分隔 token,配合按页稀疏注意力,让"看清小字"与"看懂整页版面"兼得。

这套设计对做文档理解的工程师很具参考价值:不堆更大的单塔,而是让"语义塔 + 细节塔"分工协作,再用稀疏注意力控制长文档成本,值得收藏研究。

  • 人工智能
  • 计算机视觉
  • OCR
  • 多模态
  • 大模型

【免费下载链接】Unlimited-OCR-2

项目地址:https://ai.gitcode.com/hf_mirrors/baidu/Unlimited-OCR-2
点击查看免费下载

相关推荐

上一篇:LatticeDB WAL日志与崩溃恢复机制详解:嵌入式数据库如何实现ACID持久化的新手指南
下一篇:【一键下载】到梦空间自动报名指南:1分钟上手,热门活动不再拼手速

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询