图文匹配评分(BLIP ITM)
更新时间:2026-09-11
简介
用 BLIP 的 ITM(image-text matching)判别头给出「这张图与这段文本是否匹配」的概率分数:逐行把图像与配对文本送进判别头,输出 [0, 1] 的匹配概率。算子只产出分数,不做阈值过滤,筛样本交给 pipeline。
功能描述
- 模型走 transformers
BlipProcessor+BlipForImageTextRetrieval,前向时use_itm_head=True,取itm_score的 2 类 logits([不匹配, 匹配])做 softmax,输出匹配类概率,保留 6 位小数 - 分数量纲是判别头的概率,取值
[0, 1];与 CLIP 双塔余弦不是同一个尺度,阈值不能互相搬用 - 只对「图像列非空 且 文本列非空(字符串去空白后非空)」的行做推理,其余行直接输出
None - 按
batch_size切微批推理,某个微批抛异常时只把该批的行留成None并记exception日志,不影响其他批 - 文本侧交给 processor 做
padding=True, truncation=True,超长文本按分词器上限截断 - 图像统一
convert("RGB")后送入 processor,pixel_values按dtype转精度 - 设备为
cuda:(rank % 可见卡数)(use_gpu 且 CUDA 可用)否则 cpu;CPU 上指定float16会打 warning 并回退 float32 - 权重目录
{model_path}/{model_name}不存在时构造期抛FileNotFoundError,不联网下载 - 构造期校验
image_src_type与dtype取值 - 两列长度不一致时抛
ValueError
算子参数
输入
| 输入 | 含义 |
|---|---|
| images | 图像输入列,内容形式由 image_src_type 决定(URL/本地或 BOS 路径 / Base64 字符串 / 二进制) |
| texts | 文本列,与图像逐行配对;空串或空白串视为无效 |
输出
| 输出 | 含义 |
|---|---|
| itm_score | float64 —— ITM 判别头 softmax 后的匹配概率,取值 [0, 1];任一侧为空或该微批失败时为 None |
参数
| 参数名称 | 类型 | 默认值 | 描述 |
|---|---|---|---|
| image_src_type | str | "image_url" | 图像输入类型:image_url(本地/BOS 路径)、image_base64、image_binary |
| model_path | str | "/opt/aihc/model" | 权重根目录 |
| model_name | str | "Salesforce/blip-itm-base-coco" | 相对 model_path 的权重子目录 |
| dtype | str | "float32" | 权重精度:float16 / float32 / bfloat16;CPU 上 float16 回退 float32 |
| batch_size | int | 16 | 算子内部推理微批大小 |
| rank | int | 0 | 多卡场景 worker 序号,设备取 cuda:(rank % 可见卡数) |
注意事项
- ITM 判别头与 CLIP 双塔余弦不可互换:前者是跨模态判别概率,后者是归一化向量点积,量纲与语义都不同,阈值必须分别标定。
- 权重必须是带 retrieval/ITM 头的 BLIP 权重(如
blip-itm-base-coco);BLIP captioning 权重没有 ITM 头,加载会失败。 - 算子不带
min_score/max_score之类的过滤参数,输出只是分数,按分数筛样本需要在 pipeline 里另加过滤步骤。
调用示例
Python
1from __future__ import annotations
2
3import os
4
5import daft
6from daft import col
7
8from daft.aihc.common.udf import aihc_udf
9from daft.aihc.functions.multimodal.image_text_matching_score import ImageTextMatchingScore
10
11if __name__ == "__main__":
12 if os.getenv("DAFT_RUNNER", "native") == "ray":
13 import ray
14 ray.init(ignore_reinit_error=True)
15 daft.set_runner_ray()
16 daft.set_execution_config(actor_udf_ready_timeout=6000, min_cpu_per_task=0)
17
18image = "bos://your-bucket/sample.jpg"
19 ds = daft.from_pydict({"image": [image, image], "text": ["a photo", ""]})
20 ds = ds.with_column(
21 "itm_score",
22 aihc_udf(
23 ImageTextMatchingScore,
24 construct_args={
25 "image_src_type": "image_url",
26 "model_path": "/path/to/models",
27 "model_name": "Salesforce/blip-itm-base-coco",
28 },
29 num_cpus=1,
30 num_gpus=1,
31 concurrency=1,
32 batch_size=2,
33 )(col("image"), col("text")),
34 )
35 ds.show()
评价此篇文章
