从Java转行大模型应用,基于 BLIP 的图生文实战案例
·
一、项目简介
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 快速搭建可视化界面
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)