一、项目简介
BLIP 是 Salesforce 开源的多模态视觉语言模型,兼顾图像理解、图文检索、图像字幕(Image Caption)、VQA 视觉问答等能力。本案例实现:输入任意图片 → 自动生成精准自然的中文 / 英文描述文案,轻量化部署、本地可运行、适合二次开发。
二、环境依赖
1. 安装依赖
pip install torch torchvision transformers pillow accelerate sentencepiece核心库说明:
transformers:加载 BLIP 预训练模型与处理器torch:模型推理pillow:图像读取与预处理
三、完整可运行代码
3.1 英文图生文(原生能力)
from transformers import BlipProcessor, BlipForConditionalGeneration from PIL import Image def blip_image_caption_en(image_path): # 加载预训练模型与处理器 processor = BlipProcessor.from_pretrained("Salesforce/BLIP-image-captioning-base") model = BlipForConditionalGeneration.from_pretrained("Salesforce/BLIP-image-captioning-base") # 读取图片 image = Image.open(image_path).convert("RGB") # 图像预处理 inputs = processor(image, return_tensors="pt") # 推理生成描述 out = model.generate( **inputs, max_length=50, # 文案最大长度 min_length=10, # 最小长度 num_beams=5, # 束搜索,提升文案质量 do_sample=False ) # 解码输出 caption = processor.decode(out[0], skip_special_tokens=True) return caption if __name__ == "__main__": img_path = "test.jpg" # 替换为你的本地图片路径 res = blip_image_caption_en(img_path) print("英文图像描述:", res)3.2 中文图生文(优化方案)
BLIP 原版为英文,通过提示词引导 + 生成参数调优实现中文输出:
from transformers import BlipProcessor, BlipForConditionalGeneration from PIL import Image def blip_image_caption_zh(image_path): processor = BlipProcessor.from_pretrained("Salesforce/BLIP-image-captioning-base") model = BlipForConditionalGeneration.from_pretrained("Salesforce/BLIP-image-captioning-base") image = Image.open(image_path).convert("RGB") # 增加中文引导提示词 prompt = "这张图片描述是:" inputs = processor(image, prompt, return_tensors="pt") out = model.generate( **inputs, max_length=60, num_beams=6, temperature=0.7, top_p=0.9 ) caption = processor.decode(out[0], skip_special_tokens=True) return caption if __name__ == "__main__": img_path = "test.jpg" zh_caption = blip_image_caption_zh(img_path) print("中文图像描述:", zh_caption)四、关键参数解析
| 参数 | 作用 |
|---|---|
max_length | 限制生成文案最大字数,避免过长 |
num_beams | 束搜索,数值越高描述越连贯,推理变慢 |
temperature | 随机性,越小越保守,越大越有创意 |
prompt | 自定义前缀,可指定风格(写实 / 文艺 / 简约) |
五、实战拓展场景
5.1 批量生成图片文案
import os def batch_caption(folder_path): for file in os.listdir(folder_path): if file.endswith(("jpg","png","jpeg")): cap = blip_image_caption_zh(os.path.join(folder_path, file)) print(f"{file}:{cap}") # 调用 # batch_caption("./imgs/")5.2 结合风格定制
修改提示词,实现差异化文案:
# 文艺风 prompt = "用文艺的语言描述这张图片:" # 简约短句 prompt = "简短描述图片内容:" # 电商场景 prompt = "电商商品图片描述:"5.3 离线本地部署
- 首次运行自动下载模型权重,后续无网络也可使用
- 模型路径默认缓存至:
C:\Users\用户名\.cache\huggingface - 可手动下载模型本地加载,断网环境可用
六、常见问题 & 避坑
- 图片报错必须使用
convert("RGB"),过滤 RGBA 透明通道、灰度图异常问题。 - 中文生成质量差BLIP 原生弱中文,复杂场景建议使用BLIP-2 / Qwen-VL替代。
- 显存不足增加轻量化配置,CPU 强制运行:
model = model.to("cpu") - 生成文案重复调低
temperature、加大num_beams即可优化。
七、升级进阶:BLIP-2 高阶版本
如果需要更高精度、复杂场景(风景、人物、商品、细节描述),替换模型为 BLIP-2:
# 模型替换 from transformers import Blip2Processor, Blip2ForConditionalGeneration processor = Blip2Processor.from_pretrained("Salesforce/BLIP2-opt-2.7b")BLIP 中文微调版 图生文(Image Caption)
使用社区开源 BLIP 中文微调权重,原生支持高质量中文看图写话,无需强行加中文 prompt,描述精准、细节丰富,比原版 BLIP 英文转中文效果强数倍。
一、环境依赖
pip install torch torchvision transformers pillow accelerate tqdm二、核心说明
- 底座:
Salesforce/BLIP-image-captioning-base - 微调权重:国内开源社区BLIP 中文图像字幕专属微调模型
- 优势:
- 原生中文输出,无翻译割裂感
- 人物、风景、商品、美食、场景识别更强
- CPU 可流畅运行,低配电脑也能跑
三、完整可直接运行代码(中文微调版)
from transformers import BlipProcessor, BlipForConditionalGeneration from PIL import Image import warnings warnings.filterwarnings("ignore") # ===================== 加载中文微调BLIP模型 ===================== # 中文微调权重(HuggingFace 开源) model_name = "uiieqn/blip-base-chinese-caption" # 加载处理器 + 中文微调模型 processor = BlipProcessor.from_pretrained(model_name) model = BlipForConditionalGeneration.from_pretrained(model_name) # 自动适配设备:有GPU用GPU,无GPU自动用CPU device = "cuda" if torch.cuda.is_available() else "cpu" model = model.to(device) def blip_chinese_caption(img_path, max_len=60): """ BLIP 中文微调版 图生文 :param img_path: 图片路径 :param max_len: 最大生成长度 :return: 中文图片描述 """ # 读取图片并统一转为RGB image = Image.open(img_path).convert("RGB") # 预处理 inputs = processor( image, return_tensors="pt" ).to(device) # 生成参数(针对中文优化) out = model.generate( **inputs, max_length=max_len, min_length=8, num_beams=6, temperature=0.65, top_p=0.92, repetition_penalty=1.05, # 抑制重复文案 do_sample=True ) # 解码中文结果 caption = processor.decode(out[0], skip_special_tokens=True) return caption # ===================== 测试运行 ===================== if __name__ == "__main__": # 替换为你自己的图片 image_file = "test.jpg" result = blip_chinese_caption(image_file) print("=" * 50) print("🖼️ 图片中文描述:") print(result) print("=" * 50)四、批量生成多张图片文案(扩展实用版)
import os def batch_gen_caption(folder_dir): """批量读取文件夹内图片,生成中文描述""" support_suffix = [".jpg", ".jpeg", ".png", ".bmp"] for name in os.listdir(folder_dir): if any(name.lower().endswith(suf) for suf in support_suffix): full_path = os.path.join(folder_dir, name) cap = blip_chinese_caption(full_path) print(f"【{name}】:{cap}") # 使用示例 # batch_gen_caption("./images/")五、关键参数调优(中文专属)
| 参数 | 调整作用 |
|---|---|
temperature=0.6~0.7 | 中文描述适中,不天马行空、不过于死板 |
num_beams=5~8 | 数值越高,语句越通顺,细节越丰富 |
repetition_penalty | 解决中文重复、叠词问题 |
max_length | 短描述设 30,长文案 / 细节描述设 60~80 |
六、常见问题解决
1. 模型下载慢 / 下载失败
添加国内镜像,在代码最上方加入:
import os # HF 国内镜像加速 os.environ["HF_ENDPOINT"] = "https://hf-mirror.com"2. 显存不足、OOM
强制 CPU 运行:
device = "cpu"3. 透明 PNG、动图报错
代码中已做convert("RGB")兼容,直接使用即可。
七、效果对比
- 原版 BLIP:英文描述 + 强行翻译中文,语句生硬、识别模糊
- 中文微调 BLIP:
- 风景图:精准描述天气、环境、构图
- 人物图:动作、服饰、场景自然描述
- 商品图:适合电商种草、图文自媒体配图文案
八、进阶升级(可选)
如果需要更强效果:
- 更长文案、细节拉满:使用
blip-large-chinese-caption大尺寸微调模型 - 图文问答、多轮对话:搭配BLIP 中文 VQA 微调版
- 网页在线演示:结合 Gradio 快速搭建可视化界面