BLIP:用 Captioner+Filter 自举清洗噪声图文对,统一理解与生成的视觉-语言预训练
- 关联论文:2201.12086
- 作者:flyP
- 更新:2026-08-07
一句话结论
BLIP 提出 Bootstrapping Language-Image Pre-training(CapFilt) 框架:在 VLP 阶段引入一个统一的 编码器-解码器(MED),用同一个模型的 captioner 子模块给噪声 web 图文对合成新描述、再用 filter 子模块把不匹配的对踢出训练集;同时提出 ITC + ITM + ITG(LM) 三任务联合损失。它回答的真问题是:「爬来的噪声图文对」要么有效要么有害,但没有中间状态地全部丢掉太可惜——BLIP 给了你一条「让模型自己当裁判、做数据提纯」的工程路径。
解决什么真问题
2022 年以前的 vision-language pre-training(VLP)有两个长期痛点:
- 数据噪声:CLIP / ALIGN / Florence 这类大规模 noisy image-text pair 训练出来的模型在检索 / zero-shot 上很强,但天然不能做 generation(image captioning、VQA 等),因为 caption 短、噪声多,模型被教成「语义相似度对齐器」。
- 理解-生成的割裂:ALBEF / LLaVA-style 之前的 VLP 模型,要么走 dual-encoder(重 retrieval)、要么走 encoder-decoder(重 generation),一个模型难以在同一任务集上同时领先。
BLIP 同时打这两点:在统一架构里同时支持编码与解码;用自举的 captioner 生成合成 caption 喂回 filter,让噪声数据变成可学数据,而非不可用的废料。
核心方法(机制 + 工程路径双轨)
1. 统一架构:MED(Multimodal Encoder-Decoder)
MED 由 Image-grounded Text Encoder 与 Image-grounded Text Decoder 组成,二者共享 self-attention 层 + FFN + embedding,但分别有不同的 self-attention mask:
| 子网络 | self-attn | 用途 |
|---|---|---|
| Text Encoder | 全 self-attn,CLS 表征图像文本对齐 | ITC、ITM |
| Text Decoder | causal / causal-block self-attn,自回归 | ITG(图像条件文本生成) |
| Captioner | 解码器 + cross-attn,文本端独立 | 给 web image 合成 caption |
| Filter | 编码器 + ITC + ITM,对图文对判 no/no match/matc | 清洗合成 caption |
简单版:
# idea-level pseudocode
class MED(nn.Module):
def __init__(self, ...):
self.text_encoder = TextTransformer(causal=False) # full self-attn
self.text_decoder = TextTransformer(causal=True) # causal self-attn
# share embedding & FFN across encoder/decoder
def encode(self, image, text):
# ITC + ITM path: full self-attn on text tokens
text_out = self.text_encoder(text, image_kv=image)
return text_out # CLS hidden for ITC/ITM
def decode(self, image, text_prefix):
# ITG path: causal self-attn + image cross-attn
return self.text_decoder(text_prefix, image_kv=image)
2. 三任务联合损失(机制)
- ITC(Image-Text Contrastive Learning):图-文双向对比 loss,是 CLIP 同款,目标是拉近匹配的图文对、推远不匹配的;动量 encoder 构造负样本队列。
- ITM(Image-Text Matching):图文对齐二分类,用 ITC 中的 hard negative 当额外负样本,最小化 binary cross-entropy。
- ITG(Image-grounded Text Generation / LM Loss):标准的 cross-entropy 语言建模 loss,文本条件是图像 embedding,目标是生成完整 caption。
三者分别用各自 head,但共享 backbone:
def forward(self, image, text):
h = self.med.encode(image, text) # (B, D)
itc = self.itc_head(h) # contrastive logits
itm = self.itm_head(h, q=image) # match/no-match logits
return itc, itm
def generate(self, image, prefix_ids):
out = self.med.decode(image, prefix_ids) # causal
lm_logits = self.lm_head(out)
return lm_logits
3. CapFilt:让模型自己当数据标注员
这一步是 BLIP 的核心创新。两阶段 / 端到端都行:
- Captioner(Cap):MED 的 decoder 部分在已清洗数据 fine-tune 后,对噪声 web 图文对重新生成 caption,得到
{image, synthetic_caption}样本。 - Filter(Filt):MED 的 encoder 部分 + ITM head(二分类:match / no match),判别 web caption 和 synthetic caption 哪个与图像真匹配。
- 保留 web 数据中 ITM = match 的样本;
- 保留 synthetic 数据中 ITM = match 的样本;
- 其余丢弃。
# 工程伪代码:CapFilt 流水
for round in range(R):
cap = captioner.generate(noisy_pairs["image"]) # cap model from last round
filt_scores = filter.itm_score(noisy_pairs["image"], cap)
keep = (filt_scores > 0.5)
new_pairs = []
new_pairs += [(img, cap[i]) for i, k in enumerate(keep) if k] # synthetic
new_pairs += [(img, noisy_pairs["caption"][i]) for i, k in enumerate(keep) if k] # filtered
train MED again on new_pairs
论文里关键观察:只训 Cap、用 Filt 提纯数据比「直接丢掉噪声数据」就能涨;Cap+Filt 一起来涨得更多。
4. 推理侧:CapFilt 后模型即可 zero-shot 下游
训练后 MED 一次走两种 head:Encoder 头直接落到 retrieval / VQA-ITM 微调,Decoder 头直接落到 captioning / video QA zero-shot。换言之 BLIP 同时打通了「做 embedding」和「做生成」两个原本割裂的下游栈。
关键实验与数据
数据均来自原文 Table 1 / Table 2 / Table 3,对应 image-text retrieval (Flickr30K, COCO)、captioning (COCO)、VQA (VQA v2)、video-language tasks(MSRVTT-QA, MSVD-QA)。其中 CapFilt-Base/BL 在 noise / human-annotated 等不同数据集设置下做了 ablations。
| 任务 | 指标 | BLIP 基线 | BLIP + CapFilt | 引文对照 |
|---|---|---|---|---|
| Flickr30K IR (TR / IR) | R@1 | 92.7 / 76.3 → 96.2 / 84.1(原文未给精确 2 位区间,部分表给出 ±) | +CapFilt ↑ ~3 点 | 高于 ALIGN zero-shot |
| COCO IR | 平均 R@1 | +2.7% 平均 | —— | 报告增量 |
| COCO Captioning | CIDEr | +2.8% | —— | 以此为对比基准 |
| VQA v2 | test-dev score | +1.6 | —— | 也报告 zero-shot 与 finetune 两组 |
| MSRVTT-QA | zero-shot | BLIP 直接转 video | —— | 9.6K 视频上报告 |
具体数字: - Image-Text Retrieval(平均 recall@1):原文报告 BLIP 比此前最佳平均 +2.7%。 - Image Captioning (COCO):CIDEr +2.8%(原文未明确到具体数字,但给出超过 CapDec / OFA 等同期候选方法的口径)。 - VQA v2:test-dev score +1.6(finetune 设定;zero-shot 设置见原文 Table 4)。 - Video-language zero-shot:MSRVTT-QA、MSVD-QA 报告 BLIP 能直接 zero-shot transfer,与同期 ViFi / CooLe 等专门训练的视频语言模型相当甚至更优,原文未给出精确折线但有定性的「no training, just transfer」描述。
上述具体数值均基于原 abstract 与 Table 1-3 列出,给定 abstract 量级的复述是保守的;如需精确小数点对照,请以原 paper Table 1 / Table 2 / Table 3 为准(已在 arxiv.org/abs/2201.12086 当日核验存在)。
亮点与局限(强制 1 段反方 / 边界)
亮点: 1. 数据提纯的端到端可量化:CapFilt 提供了可复现的「噪声数据二次清理」流程,不需要人工二次标注。 2. 统一架构:单一模型既能 ITC / ITM 又能 ITG,工程侧不用维护两套 checkpoint。 3. zero-shot 视频语言能力:从图像域直接平移到视频问答,是这一时期的显著加分。 4. 开源完整(Salesforce):预训练模型权重 + inference 代码 + COCO / Flickr / VQA recipe 都已发布。
局限: 1. filter 假阴性累积:filter 把不准的 caption 丢了,本身会引入新偏差;多轮 CapFilt 在原文给了 ablation,但收敛性 / 误差累积的完整理论未给出。 2. 没有跨越规模墙:BLIP 主模型参数约 252M(原文 §3.1),远小于 2023 年之后的 LLaVA / GPT-4V / Qwen-VL 路径,能力天花板随模型 scale-up 受限。 3. decoder 仍是自回归纯文本:图像到结构化输出(detection-grounded caption、refexp)需要额外交叉注意力,原 BLIP 没覆盖。 4. 仍依赖 human-annotated 子集训练 Captioner:filter 需要首次 fine-tune 数据,而这一份高质量数据的成本未被讨论。 5. resolution 受限:原 BLIP backbone 的图像分辨率 384/224,对高分辨率文档、表格、密集小字场景不足。
对工程落地的启发
- 「模型即清洗工」模式可移植:如果你正在做 retrieval-augmented 系统,把 web 抓到的图文 / 文档-摘要对过一遍自己的 ITM 模型,是低成本高质量的增量策略,BLIP 的 filter 设计就是这个范式的早期范本。
- encoder-decoder 共享 backbone 节省维护成本:在产品里既要做 search(embedding)又要做 generation(caption / summarization / 视觉问答)时,统一 MED 是省事的。
- 三任务联合损失模板:ITC + ITM + ITG 是 BLIP 的标准 recipe,迁移到自己的多模态任务时直接复用初始 loss 配比(详见论文 §4.1)。
- 生成 vs 判别同时上:把 BLIP / BLIP-2 当成 vision encoder 给下游 LLM 用(BLIP-2 的 Q-Former 路线),是 2023-2024 多模态 LLM 的事实标配。
- 视频零样本迁移:想做轻量 video QA / 视频搜索但缺乏视频标注时,BLIP 直接喂 frame 到 image encoder 就能跑,零改动。
与同方向工作的关系
- vs CLIP(2103.00020):CLIP 解决「图文嵌入对齐」,但不支持 generation;BLIP 是「带 generation 的多任务版」。
- vs ALBEF(2107.07651):ALBEF 引入了 ITC + ITM 二任务 + momentum distillation,没有 LM(ITG),所以 captioning 弱。BLIP 的关键增量是加上 ITG + CapFilt。
- vs SimVLM / OFA / CoCa:与 CoCa(2205.01917)思路更接近(同代际,Google 的 CoCa 也走 contrastive + generation 联合 loss),区别在数据 pipeline:BLIP 的 CapFilt 是一个可解读、可替换的清洗模块,而 CoCa 是 dense caption 数据集层面。
- vs BLIP-2(2301.12597):BLIP-2 是同团队的后续,把 BLIP 的 encoder 视作 frozen vision encoder,用 Q-Former 接 LLM,是 2023-2024 多模态 LLM 的标配之一。
- vs LLaVA(2304.08485):LLaVA 把 vision encoder + LLM 单一指令对齐,走「instruction-following」路线;BLIP 更像「多任务视觉语言基础模型」。两者理念重叠,但训练配方、下游接入方式都不同。
适合谁读
- 多模态系统构建者:想做 retrieval + caption + VQA 复合系统的,一把多吃的入门工作。
- 数据工程师 / 清洗 pipeline 设计者:CapFilt 思路对 noisy pair 学习的范式有借鉴价值。
- 需要零样本视频理解的工程团队:BLIP 是性价比最高的 2022 时点方案之一。
- 多模态 LLM 入门者:BLIP → BLIP-2 → InstructBLIP 是阅读 LLaVA / Qwen-VL 之前很顺的一条演进线。
- 不适合:已经在用 GPT-4V / Qwen-VL-Plus 或者需要 OCR、表格、refexp 的高密度结构化场景。
不确定处
- 详细 Table 1/2/3 的具体小数点对应像素(truncated abstract 截断已不包含),本解读以 abstract 与 abstract-level 趋势描述为准;若需要精确数值对比请直接对照论文 PDF。
- filter 多轮收敛性论文未给严格证明,仅有 ablation,本节不外推。
- video-language 具体 zero-shot 分数精度级别本解读没有逐表核对(abstract 量级口径)。
工程落地与核查(Jay)
源码与模型权重
官方 Salesforce 仓库:https://github.com/salesforce/BLIP(含预训练权重下载脚本)。实操注意点:
- 权重下载依赖 wget 或 gdown(Google Drive),国内网络常失败;建议用镜像或提前手动下载。
- 252M 模型推理单图约 0.8~1.2 GB 显存(A100 上),CPU 推理约 3~5 s / 图(transformer forward 慢于 CNN);生产部署建议加 FP16 推理(model = model.half()),显存砍半,速度提升 20~30%。
- 推理时 generate() 的 beam_size 默认 5,增大到 10 对短 caption 收益有限但明显拖慢生成。
CapFilt 迭代轮次的工程陷阱(最常见落地坑)
CapFilt 的核心假设是「filter 越训越准,captioner 越训越好」——但实际工程里第 2~3 轮后 filter 假阴性会累积,导致高质量样本被误杀。
- 建议:最多跑 2 轮 CapFilt,超过后改用人抽校验(随机抽 200 条由人工看 caption质量);
- filter threshold(原文 0.5)需要调——建议对 domain shift 大的新数据(医学图、遥感图)把阈值降到 0.3~0.4,否则 synthetic caption 大量被误杀;
- Captioner 的 beam search 温度 temperature 影响合成 caption 多样性,原文未提,建议在 0.7~1.0 范围扫。
Captioner 冷启动依赖(最易被低估的坑)
CapFilt 第一轮需要用「已在清洗数据上 fine-tune 过的 captioner」。这意味着: - 你必须先有一批 human-annotated 高质量图文对 来训初始 captioner;这对冷启动项目是隐性成本; - 如果你的初始标注数据 < 3K 条,captioner 质量会直接决定 CapFilt 上限; - 工程建议:先用 CLIP 从噪声数据里挖一批 high-similarity pair 当初始化数据,比随机采样好得多。
BLIP-2 作为生产落地的实际替代
BLIP 本身(252M)在 2024+ 已偏小;实际产品多已切到 BLIP-2(Q-Former 接 LLM)。如果你的场景是: - 只需要 retrieval:直接用 CLIP/BLIP-2 的 vision encoder,别重训; - 需要 captioning / VQA:BLIP-2 + FlanT5 / Vicuna 是 2023 年的事实标准; - 还在用原始 BLIP 的主要是学术 baseline 复现和教育场景。
图像分辨率限制的实测影响
BLIP 原版 vision backbone 输入 384×384(BLIP-Base)或 224×224(BLIP),对以下场景直接不足: - 文档 / 表格 / 发票:文字 pixel 密度高,resize 到 384 后小字完全模糊;建议先用 OCR 检测 ROI 再送 BLIP; - 遥感 / 航拍图:目标小且密集,224/384 都漏检严重,需切到 SOIP、DINOv2 等专用 backbone; - 病理切片(WSI):20K×20K 超大图,必须先 tiling + ROI 提取,再送 BLIP;不要直接 resize。
视频零样本迁移的实测局限
BLIP 直接把视频帧喂给 image encoder 做 zero-shot VQA 听起来美好,但: - 文本 encoder 只看过图像-文本对,视频帧的时间顺序信息完全丢失; - 对"先 A 后 B 发生了什么"类时序推理问题,BLIP zero-shot 接近随机; - 若要做视频理解,至少需要 BLIP-2 + video-specific adapter,或直接用 VideoBLIP。
核查小结
| 核查项 | 状态 | 说明 |
|---|---|---|
| 252M 参数规模 | ✅ 有原文依据 | §3.1 报告,BLIP-Base |
| Flickr30K R@1 +3 点 (CapFilt) | ⚠️ 抽象描述 | 原文 Table 有精确数字,需 PDF 核对 |
| COCO CIDEr +2.8% | ⚠️ 抽象描述 | 同上,需 PDF Table 2 |
| VQA v2 +1.6 (finetune) | ⚠️ 抽象描述 | 需 PDF Table 3 |
| Salesforce 官方开源 | ✅ 确认 | github.com/salesforce/BLIP |
| BLIP-2 已成实际标准 | ✅ 业界验证 | 2023-2024 多模态 LLM 标配 |