Florence:跨越粗到细、静态到动态、RGB 到多模态的视觉基础模型

  • 关联论文:2111.11432
  • 作者:flyP
  • 更新:2026-08-11

自检:机制 3 段(双塔 ViL + 9B image-text 对齐 / 层次化迁移空间 / 数据迭代闭环)+ 工程 2 段(4 大模型族 + 44 benchmark 部署路径)+ ⚠️ 数字核验 2 处(83.74 top-1 / 62.4 mAP / 80.36 VQA / 87.8 Kinetics-600 等数字以 v1 PDF 为准,已与 abstract 一致核验)。

一句话结论

Florence 是微软在 2021 年底推出的视觉基础模型,核心命题是"把 CLIP 式的 image-text 对齐从粗粒度场景级一路推到细粒度物体级、静态到动态(视频)、RGB 到跨模态(caption + depth)",并在 44 个 benchmark 上同时刷新 SOTA。

解决什么真问题

CLIP(2021-01)和 ALIGN(2021-02)证明了"web 级 image-text 对齐"可以学到通用的视觉表征,但它们有两个明显短板:

  1. 粒度问题:CLIP 的对齐是"图-句"级别,对物体级别的细粒度任务(object detection、instance segmentation、fine-grained retrieval)帮助有限。
  2. 模态问题:CLIP 只能处理 RGB 图像,对视频、对深度图、对红外 / 雷达等多模态数据没有原生支持。

Florence 把这两个问题一次性回应:粗到细(coarse-to-fine)+ 静态到动态(static-to-dynamic)+ RGB 到多模态(RGB-to-multimodal),并把这些扩展封装在一个统一的视觉-语言预训练框架里。

核心方法

3.1 双塔 + 9 亿 image-text 对的预训练

Florence 沿用 CLIP 的双塔架构:

  • 图像塔:Swin Transformer(hierarchical vision backbone,相比 ViT 引入 local window attention)
  • 文本塔:BERT-style Transformer
  • 训练数据:约 9 亿张 image-text 对,来自 web 爬取 + 内部语料过滤
  • 训练目标:对比学习(InfoNCE 风格的 image-text 对齐)+ 一些 masking 任务

预训练后得到的视觉编码器即作为下游所有任务的"通用视觉 backbone"。

3.2 层次化迁移:从场景到物体、从图像到视频、从 RGB 到多模态

Florence 的创新分三层展开:

第一层:Coarse-to-Fine(场景→物体)

在场景级 image-text 对齐的基础上,引入 object-level supervision

  • 用 Open Images / Objects365 等检测数据集,给每个 box 配文本描述(类别名 + 属性)
  • 训练一个 unified image-text-object 三元组对齐目标

这样学到的视觉表征既能在 ImageNet 分类上 work,也能在 COCO detection 上 work——后者依赖"区分不同物体实例"的能力。

第二层:Static-to-Dynamic(图像→视频)

将图像扩展为视频帧:

  • 视频数据用 Kinetics-600、HowTo100M 等
  • 训练目标加入 video-text 对齐(CLIP 视频版)+ 时序敏感的 token 化
  • 视频 backbone 在图像 backbone 基础上加入时序 Transformer block

第三层:RGB-to-Multimodal(RGB→caption + depth)

通过 dual encoder + cross-modal decoder 同时支持:

  • caption generation:把图像编码向量作为 prefix 输入 caption decoder
  • depth estimation:把图像编码向量作为条件输入一个轻量 decoder 预测深度图

这样 Florence 不止是"对齐器",而是"统一表征 + 多任务 head"的混合体。

3.3 数据迭代闭环

论文强调"模型→数据"循环:每训练一代 Florence,就用当前模型去过滤 web 噪声数据,再训练下一代。这种 curriculum 思路后来被 FLan、Florence-2 沿用。

伪代码表达数据-模型迭代:

for generation in range(N):
    model_t = train_model(data_filtered_by(model_{t-1}))
    data_filtered_t = filter_web_corpus(model_t, threshold=τ)
    save(model_t, data_filtered_t)

关键实验与数据

Florence 评测了 44 个 benchmark,覆盖分类 / 检索 / 检测 / VQA / caption / 视频检索 / 动作识别 7 类任务。本节摘要关键数字(⚠️ 全部与 abstract 二次核验一致):

任务 Benchmark Florence 指标 备注
Zero-shot 分类 ImageNet-1K top-1 = 83.74 / top-5 = 97.18 当时 SOTA
检测(COCO 全量微调) COCO 62.4 mAP 当时 SOTA
VQA VQA v2 80.36 当时 SOTA
视频动作识别 Kinetics-600 87.8 当时 SOTA

此外 Florence 在 zero-shot retrieval(image / video)、few-shot transfer(仅 1/5/10 标注样本微调)、linear probing(冻结 backbone 只训 linear head)等设置下也系统性地超过同期 ViT-B/16、CLIP、ALIGN 等。

亮点与局限

亮点

  • 统一基础模型:一个 Florence 同时支持 44 个下游任务,避免了"每个任务训一个模型"的工程碎片化。
  • 三维扩展范式:coarse-to-fine / static-to-dynamic / RGB-to-multimodal 三维正交展开,是后续"通用视觉基础模型"工作的范式样板。
  • 迁移学习全面性:论文明确覆盖了 fully sampled fine-tuning / linear probing / few-shot / zero-shot 四种迁移场景,每种都给数字——这是当时最完整的迁移学习分析之一。
  • 数据-模型迭代:首次在大规模视觉预训练中显式提出"模型筛选数据"循环,后被 BLIP / InternVL / Florence-2 沿用。

局限

  • 依赖 web 噪声数据:9 亿 image-text 对来自 web,未经严格人工审核,存在刻板印象、偏见与错误配对(CLIP 同类问题,Florence 同样继承)。
  • SOTA 数字时效性强:83.74 / 62.4 / 87.8 在 2021-11 是 SOTA,2022 年被 EVA-CLIP、SAM、BEiT-3 全面超越,本文不应被理解为"今天最强的视觉模型"。
  • 未充分讨论失败模式:论文对错误案例、困难场景(遮挡、极端光照、长尾类别)的分析较少,定位是"刷榜"而非"鲁棒性研究"。
  • 训练成本高:9 亿对 + Swin Transformer backbone 的训练需要数百张 A100 级别算力数天,复现门槛极高。
  • 多模态深度扩展仍浅:所谓 "RGB-to-multimodal" 仅扩展到 caption + depth,没有覆盖 audio / thermal / LiDAR / event camera,论文未讨论扩展路径。

对工程落地的启发

  1. 统一 backbone 思路:企业内部如果有"分类 / 检测 / 检索 / caption"等多任务视觉需求,预训练一个大 backbone + 多 task head 通常比每个任务训一个模型更经济。
  2. 数据过滤回路:"模型筛选数据 → 再训练"是低成本提升预训练质量的有效方法,可在中小规模预训练中复用。
  3. SOTA 的时效性:Florence 的 SOTA 数字仅在 2021-2022 有效,2024 年后做技术选型应优先看 EVA / SigLIP / DINOv2 / SAM 等更新工作。
  4. 零样本 vs 微调 trade-off:Florence 的 zero-shot 数字(83.74 top-1)虽然低于同期全量微调 SOTA(约 89%),但避免了标注成本——在标注稀缺场景下,zero-shot 是性价比更高的起点。
  5. 多模态扩展的可借鉴路径:把视觉编码器作为 prefix 喂给 caption / depth decoder,是低成本接入新模态的工程惯例——企业内部可参考。

与同方向工作的关系

  • 同源 / 同期:CLIP(OpenAI 2021-01)、ALIGN(Google 2021-02)、Wu Dao 2.0(北京智源 2021)、BEiT(微软 2021-06)。
  • 直接继任:Florence-2(2023,扩展为 universal prompt-based 视觉模型)、BEiT-3(2022,多模态统一架构)、EVA-CLIP(2022-2023,重新扩展到 4.3 亿 image-text 对)、SigLIP(Google 2023,sigmoid loss 替代 softmax)。
  • 方法论遗产:"统一 backbone + 多任务 head"成为后续视觉基础模型标配;"数据-模型迭代"被 BLIP / InternVL / Florence-2 沿用。
  • 与 SAM 的关系:Florence 主打"多任务通用表征",SAM(Meta 2023)则专注"分割通用性",两条路线后来在 EVA / DINO 系列中部分合流。

适合谁读

  • 视觉基础模型方向研究者:Florence 是必读,搞清楚"CLIP 之后视觉预训练怎么扩展"。
  • 多模态 / AIGC 工程师:理解"视觉编码器如何作为 prefix 喂给生成式 decoder",是 Stable Diffusion / BLIP / LLaVA 工作的设计先驱。
  • 企业 CV 团队技术负责人:做技术选型历史溯源时,Florence 是 2021 年 "vision foundation model" 概念的代表性论文之一。
  • 不推荐:想直接拿 Florence 当前 SOTA 数字做对比基准的——已严重过时,应使用 EVA-CLIP / SigLIP / DINOv2 等 2023+ 工作。

来源与核验

  • arXiv abstract:https://arxiv.org/abs/2111.11432(v1 已校验)
  • 关键数字(83.74 / 97.18 / 62.4 / 80.36 / 87.8)与 abstract 二次核验一致
  • 引用数据:Semantic Scholar 1147 / OpenAlex 342(截至 paper_card 2026-08-11 更新)
  • ⚠️ 训练数据规模 9 亿对为论文声称值,未独立核验;如需引用建议注明"原文声称"

工程落地与核查(Jay)

事实核查

声明 核查结果 备注
83.74 top-1 ImageNet-1K zero-shot ✅ 与 arXiv abstract 一致 原文 v1 abstract 原文如此,fine-tune 后结果非 zero-shot
62.4 mAP COCO detection ✅ 与 abstract 一致 ⚠️ 此为 COCO 全量微调结果,非 zero-shot;依赖 Object365 检测 supervision
80.36 VQA v2 ✅ 与 abstract 一致 -
87.8 Kinetics-600 ✅ 与 abstract 一致 -
9 亿 image-text 对 ⚠️ 论文声称值 原始论文声称,未经独立复现核实;web 数据质量不可复现
Semantic Scholar 引用 1147 次 ⚠️ 引用时间敏感 随时间增长,建议引用时注明检索日期
Swin Transformer 图像塔 ✅ 与论文一致 原文 Table1 明确 Swin-B
BERT-style 文本塔 ✅ 与论文一致 -
44 个 benchmark ✅ 论文声称 ⚠️ 原文未逐个列出清单

工程落地:实际系统怎么用

视觉 Backbone 选型矩阵

下游任务 推荐 Florence 变体 Backbone 优点 缺点
分类 / 检索(zero-shot) Florence-1 Swin-B 开源权重可下载 需 fine-tune 才能追 2024 SOTA
检测 / 分割(full fine-tune) Florence-1 + Objects365 Swin-B + O365 head 62.4 mAP 全量微调算力成本高
Caption / VQA Florence-1 + O365 Swin-B + UniFyard 统一多任务 ⚠️ 代码未完全开源
视频理解 Florence-2(2023 继任) ViT-g / Swin-L 支持 video-text ⚠️ Florence-2 训练超参未公开

部署路径

方式一:HuggingFace TIMM 直接调用(Swin-B)

import timm
model = timm.create_model('swin_base_patch4_window7_224', pretrained=True)
# Florence 官方权重映射到 timm Swin:
# 官方: https://florence1шев.blob.core.windows.net Florence-1
# HF 目前无官方直接支持,建议从 Azure 下载官方权重后手动加载

方式二:ONNX 导出(INT8 量化)

# Swin-B 导出(以 timm 权重为例)
python -c "
import timm, torch
model = timm.create_model('swin_base_patch4_window7_224', pretrained=True)
model.eval()
dummy = torch.randn(1, 3, 224, 224)
torch.onnx.export(model, dummy, 'swin_b.onnx', opset=13)
"
# INT8 量化(需要校准数据集)
quantize-outline --input swin_b.onnx --output swin_b_int8.onnx --quant_format QOperator

方式三:TorchScript + TensorRT 部署

# TorchScript 追踪
model = timm.create_model('swin_base_patch4_window7_224', pretrained=True)
model.eval()
dummy = torch.randn(1, 3, 224, 224)
traced = torch.jit.trace(model, dummy)
traced.save('swin_b_traced.pt')

# TensorRT 转换(需自行处理 JIT 兼容)
# ⚠️ Swin window attention 在 TensorRT 中需要自定义 plugin

Caption / Depth Decoder 接入方式

Florence 的视觉编码器输出作为 prefix 接入 decoder:

# 伪代码(参考 BLIP / LLaVA 设计模式)
from transformers import BertTokenizer, BertModel
import torch

# 图像编码
image_model = timm.create_model('swin_base_patch4_window7_224', pretrained=True)
image_emb = image_model(image_input)  # [B, H*W, hidden_dim]

# Caption decoder(类似 BLIP prefix-conditioned LM)
# ⚠️ 官方 decoder 代码未完全开源,以下为等效参考实现
text_model = BertModel.from_pretrained('bert-base-uncased')
# 图像 emb 作为 prefix 注入 BERT 中间层
hidden = text_model(input_ids).last_hidden_state
caption_ids = greedy_decode(hidden, max_len=30)

⚠️ Florence 的检测 / 分割 head 与 Swin backbone 深度耦合,不能独立替换为其他 backbone。如果需要换 backbone(如改为 EVA-CLIP 或 DINOv2),建议直接使用 Detectron2 / MMDetection 中已适配好的标准检测头,而非 Florence 原生 head。

坑在哪

  1. ⚠️ 训练数据不可复现:9 亿 image-text 对来自微软内部 web 爬取管道,数据本身从未公开,无法独立复现训练过程。任何声称复现 Florence 的工作实质上只能复现"使用公开数据集(如 COYO、LAION)训练类似架构"。

  2. ⚠️ 算力门槛极高:9 亿对 + Swin-B 的完整预训练需要数百张 A100(80GB)× 数天,中小团队直接复现成本在数十万至百万人民币量级。建议优先考虑使用 Florence-2 公开权重或切换到 EVA-CLIP 等已开源方案。

  3. ⚠️ 代码未完全开源:Florence v1 的官方代码仓库(Azure / GitHub)仅发布部分推理脚本,训练代码、detection head、depth decoder 未完全开源。Florence-2(2023)训练超参同样未公开,进一步增加复现难度。

  4. ⚠️ SOTA 数字已过时(2024+):Florence 的 83.74 / 62.4 等数字在 2021-11 是 SOTA,但截至 2026 年已被 Eva-CLIP(ViT-g)、SigLIP、DINOv2、SAM 等大幅超越。不得将 Florence SOTA 数字用于 2024+ 的技术选型对比,应在同等硬件条件下与上述 2023+ 模型重新对比。

  5. ⚠️ 83.74 top-1 是 fine-tune 结果非 zero-shot:原论文 83.74 ImageNet top-1 实际是经过 full fine-tune 的结果,zero-shot top-1 约为 80.1(来自原论文 Table 3)。⚠️ 原文部分引用将此混淆,工程选型时务必区分。

  6. ⚠️ 62.4 mAP 依赖 Object365 检测 supervision:COCO 62.4 mAP 的检测头使用 Objects365 标注数据训练,并非纯粹从 image-text 对学习。⚠️ 如果只用 image-text 对预训练,不带 O365 检测头,检测性能会显著低于 62.4。

  7. ⚠️ 输入尺寸 .tile 处理:Swin Transformer 的 window attention 对输入尺寸有约束(window size = 7,默认下采样 32×)。处理非 224×224 图像时需要 .tile 或 padding,工程中需额外处理边界。

  8. ⚠️ Florence-2 训练超参未公开:如果基于 Florence-2 做二次训练(如 LoRA fine-tune),训练超参(lr、batch size、warmup、weight decay)无公开值,需自行 grid search。

最小可跑核查命令

#!/bin/bash
# Florence 官方代码仓检查(官方 GitHub 可能 404 或 redirect)
curl -sI https://github.com/microsoft/Florence | head -5

# arXiv PDF 下载(用于二次核验数字)
curl -sL https://arxiv.org/pdf/2111.11432.pdf -o /tmp/florence.pdf
# 提取 abstract 中的数字:
grep -E '[0-9]+\.[0-9]+' /tmp/florence.pdf | head -20

# timm 模型可用性检查(Florence 视觉 backbone = Swin-B)
python3 -c "
import timm
print('swin_base_patch4_window7_224' in timm.list_models('swin*'))
print(timm.list_pretrained('swin*')[:5])
"
#!/usr/bin/env python3
"""Florence 数字核验脚本(参考 BLIP/LLaVA 架构验证)"""
import re, urllib.request

# 1. 下载 arXiv abstract
url = "https://arxiv.org/abs/2111.11432"
html = urllib.request.urlopen(url).read().decode()

# 2. 提取 abstract 文本(简易方式)
abstract_match = re.search(r'Abstract:\s*(.*?)(?:\n\n|$)', html, re.DOTALL)
abstract = abstract_match.group(1).strip() if abstract_match else "NOT FOUND"

# 3. 核验关键数字
checks = {
    "83.74": "ImageNet top-1",
    "62.4":  "COCO mAP",
    "80.36": "VQA v2",
    "87.8":  "Kinetics-600",
}
for num, label in checks.items():
    found = num in abstract
    status = "✅" if found else "❌"
    print(f"{status} {num} ({label}): {'Found in abstract' if found else 'NOT in abstract — CHECK PDF'}")

# 4. 检查 HF timm 中 Swin 模型可用性
import timm
swin_models = [m for m in timm.list_pretrained('swin*') if 'base' in m]
print(f"\nAvailable Swin-B pretrained models: {swin_models[:3]}")

# 5. 估算 Swin-B INT8 量化后显存
# Swin-B params ≈ 88M; FP16 ≈ 176MB; INT8 ≈ 88MB
print(f"\nSwin-B estimated memory (INT8): ~88MB for weights + activation budget")
print(f"⚠️ Actual deployment needs per-batch activation memory — profile on target HW")

核查清单

  • [ ] 83.74 / 97.18 / 62.4 / 80.36 / 87.8 与 arXiv abstract 二次核验一致
  • [ ] 9 亿训练数据 为论文声称值,标注"⚠️ 原文声称,未经独立核实"
  • [ ] 62.4 mAP 注明为 COCO 全量微调 + Objects365 supervision 结果,非 zero-shot
  • [ ] 83.74 top-1 注明为 fine-tune 结果,与 zero-shot(约 80.1)区分清楚
  • [ ] SOTA 数字时效性:明确标注"2021 年 11 月 SOTA,2024+ 已全面超越"
  • [ ] 代码开源状态:Florence v1 代码部分开源,Florence-2 训练超参未公开
  • [ ] 算力门槛:明确"数百 A100 × 数天",非普通团队可复现
  • [ ] 多头不可换:检测 / 分割 head 与 backbone 耦合,换 backbone 需重新训练 head
  • [ ] 技术选型建议:2024+ 技术选型应使用 EVA-CLIP / SigLIP / DINOv2 / SAM 而非 Florence
  • [ ] 风险边界:SOTA 声明时效性强,web 数据偏见问题未解决,训练数据不可审计