一、项目简介

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 离线本地部署

  1. 首次运行自动下载模型权重,后续无网络也可使用
  2. 模型路径默认缓存至:C:\Users\用户名\.cache\huggingface
  3. 可手动下载模型本地加载,断网环境可用

六、常见问题 & 避坑

  1. 图片报错必须使用 convert("RGB"),过滤 RGBA 透明通道、灰度图异常问题。
  2. 中文生成质量差BLIP 原生弱中文,复杂场景建议使用 BLIP-2 / Qwen-VL 替代。
  3. 显存不足增加轻量化配置,CPU 强制运行:
    model = model.to("cpu")
    
  4. 生成文案重复调低 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 中文图像字幕专属微调模型
  • 优势:
    1. 原生中文输出,无翻译割裂感
    2. 人物、风景、商品、美食、场景识别更强
    3. 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") 兼容,直接使用即可。

七、效果对比

  1. 原版 BLIP:英文描述 + 强行翻译中文,语句生硬、识别模糊
  2. 中文微调 BLIP
    • 风景图:精准描述天气、环境、构图
    • 人物图:动作、服饰、场景自然描述
    • 商品图:适合电商种草、图文自媒体配图文案

八、进阶升级(可选)

如果需要更强效果:

  1. 更长文案、细节拉满:使用 blip-large-chinese-caption 大尺寸微调模型
  2. 图文问答、多轮对话:搭配 BLIP 中文 VQA 微调版
  3. 网页在线演示:结合 Gradio 快速搭建可视化界面
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐