图像描述生成
更新时间:2026-09-11
简介
BLIP2 图像描述(caption)生成算子,对每张图生成 caption_num 条候选描述,再按 keep_candidate_mode 归约成输出。权重只从本地目录加载。
功能描述
- 模型走 transformers
AutoProcessor+Blip2ForConditionalGeneration,权重目录为{model_path}/{model_name},目录不存在直接抛FileNotFoundError,不联网下载、不做运行时 pip 安装 - 候选生成方式:同一批图重复调用
generatecaption_num次,每次得到一条候选;do_sample=False时多次调用退化成同一条贪心结果 keep_candidate_mode三种归约:all返回全部候选;random_any随机取一条;similar_one_simhash取与参考文本 simhash 汉明距离最小的一条,参考文本缺失时退化为random_anysimilar_one_simhash的 simhash 是算子自带的 64 位实现(window_size=2 的 shingle + 汉明距离),不依赖额外 C 扩展;候选文本极端相近时汉明距离可能打平,选中哪一条不保证稳定prompt非空时对整批图使用同一条提示词,为None时不带提示- 本算子是列式算子,行数恒定,输出列直接给归约后的 caption 列表,是否保留原样本由 pipeline 决定
- 逐行解码图像,单行解码失败只记日志并留空列表;整批
generate失败时该批涉及的行全部为空列表,不中断整列 - 输入图像为
None时该行输出空列表 - 算子内部按
batch_size再切微批做推理,与aihc_udf的batch_size是两个独立参数 - 构造期校验
image_src_type、keep_candidate_mode取值以及caption_num > 0
算子参数
输入
| 输入 | 含义 |
|---|---|
| image | 图像输入列,内容形式由 image_src_type 决定(URL/本地或 BOS 路径 / Base64 字符串 / 二进制) |
| reference_text | 可选第二列,keep_candidate_mode=similar_one_simhash 时作为参考文本;不传或非字符串时该行退化为随机取一条 |
输出
| 输出 | 含义 |
|---|---|
| captions | list<large_string> —— 归约后的 caption 列表。all 模式给全部 caption_num 条,其余模式给 1 条;无图或失败给空列表 |
参数
| 参数名称 | 类型 | 默认值 | 描述 |
|---|---|---|---|
| image_src_type | str | "image_url" | 图像输入类型:image_url(本地/BOS 路径)、image_base64、image_binary |
| model_path | str | "/opt/aihc/model" | 权重根目录 |
| model_name | str | "Salesforce/blip2-opt-2.7b" | 相对 model_path 的 BLIP2 权重子目录 |
| dtype | str | "float16" | 权重精度:float32 / float16 / bfloat16。GPU 上建议 float16 |
| caption_num | int | 1 | 每张图生成的候选数,必须为正 |
| keep_candidate_mode | str | "random_any" | 候选归约方式:random_any / similar_one_simhash / all |
| prompt | str 或 None | None | 全局提示词,None 表示不带提示 |
| max_new_tokens | int | 128 | 生成长度上限 |
| do_sample | bool | True | 是否采样,caption_num > 1 时需为 True 才有多样性 |
| batch_size | int | 8 | 算子内部推理微批大小 |
| rank | int | 0 | 多卡场景 worker 序号,设备取 cuda:(rank % 可见卡数),无 GPU 时为 cpu |
注意事项
- 权重缺失时构造期直接抛
FileNotFoundError,不会自动联网下载。 caption_num > 1时必须保持do_sample=True,否则重复的贪心解码会给出完全相同的候选。all模式下输出列长度等于caption_num,其余模式恒为 1;下游按固定长度取值时要区分。- 算子本身不做样本增删,输出行数恒等于输入行数;需要「保留原样本」「生成样本翻倍」这类语义要在 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_captioning import ImageCaptioning
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
18ds = daft.from_pydict({"image": ["bos://your-bucket/sample.jpg"]})
19 ds = ds.with_column(
20 "captions",
21 aihc_udf(
22 ImageCaptioning,
23 construct_args={
24 "image_src_type": "image_url",
25 "model_path": "/path/to/models",
26 "model_name": "Salesforce/blip2-opt-2.7b",
27 "dtype": "float16",
28 "caption_num": 2,
29 "keep_candidate_mode": "all",
30 "max_new_tokens": 32,
31 "batch_size": 2,
32 },
33 num_cpus=1,
34 num_gpus=1,
35 concurrency=1,
36 batch_size=1,
37 )(col("image")),
38 )
39 ds.show()
评价此篇文章
