你已经制作好了一批鲜花的推广海报,想为每一个海报的内容,写一两句话,然后 post 到社交平台上,以期图文并茂。
下载 Salesforce/blip-image-captioning-large 图生文模型
通过以下几个命令下载该模型
pip install -U huggingface_hub
export HF_ENDPOINT=https://hf-mirror.com
huggingface-cli download Salesforce/blip-image-captioning-large
安装依赖包
- Transformers 库——开源大模型工具
- Pillow——Python 图像处理工具包
- PyTorch——深度学习框架
pip install transformers
pip install pillow
pip install torch torchvision torchaudio
初始化
import os
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
load_dotenv()
ai_model = os.getenv("OPENAI_MODEL")
# ---- Part 0 导入所需要的类
import requests
from PIL import Image
from transformers import BlipProcessor, BlipForConditionalGeneration
from langchain import PromptTemplate
from langchain.tools import BaseTool
from langchain.agents import initialize_agent, AgentType
加载图生文模型
# ---- Part I 初始化图像字幕生成模型
# 指定要使用的工具模型(HuggingFace中的image-caption模型)
hf_model = "Salesforce/blip-image-captioning-large"
processor = BlipProcessor.from_pretrained(hf_model)
model = BlipForConditionalGeneration.from_pretrained(hf_model)
定义图像字幕生成工具类
# ---- Part II 定义图像字幕生成工具类
class ImageCapTool(BaseTool):
name:str = "Image captioner"
description:str = "为图片创作说明文案."
def _run(self, url: str):
# 下载图像并将其转换为PIL对象
image = Image.open(requests.get(url, stream=True).raw).convert('RGB')
# 预处理图像
inputs = processor(image, return_tensors="pt")
# 生成字幕
out = model.generate(**inputs, max_new_tokens=20)
# 获取字幕
caption = processor.decode(out[0], skip_special_tokens=True)
print(caption)
return caption
def _arun(self, query: str):
raise NotImplementedError("This tool does not support async")
创建LangChain的agent
llm = ChatOpenAI(model=ai_model, temperature=0.2)
# 使用工具初始化智能代理并运行它
tools = [ImageCapTool()]
agent = initialize_agent(
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
tools=tools,
llm=llm,
verbose=True,
)
通过agent生成图片对应的宣传文案
img_url = 'https://mir-s3-cdn-cf.behance.net/project_modules/hd/eec79e20058499.563190744f903.jpg'
question = f"{img_url}\n请创作合适的中文推广文案"
prompt = PromptTemplate.from_template(question)
result = agent.run(prompt)
print(result)
运行效果如下: