LangChain 6根据图片生成推广文案HuggingFace中的image-caption模型

根据图片生成推广文案, 用的HuggingFace中的image-caption模型

  1. LangChain 实现给动物取名字
  2. LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字
  3. LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄
  4. LangChain 4用向量数据库Faiss存储,读取YouTube的视频文本搜索Indexes for information retrieve
  5. LangChain 5易速鲜花内部问答系统

生成效果
在这里插入图片描述

先安装相关的lib

pip install --upgrade langchain
pip install transformers
pip install pillow
pip install torch torchvision torchaudio

根据以下图片生成的文案
在这里插入图片描述
这段代码展示了如何使用深度学习模型来生成图像的字幕,并结合LangChain智能体框架进行自动化处理.(代码为黄佳老师的课程Demo,如需要知道代码细节请读原文):

实现代码 pic_talk.py

import os  # 导入os库,用于操作系统级别的接口,比如环境变量
import requests  # 导入requests库,用于执行HTTP请求
from PIL import Image  # 导入PIL库的Image模块,用于图像处理
from transformers import BlipProcessor, BlipForConditionalGeneration  # 导入transformers库中的Blip模块,用于图像字幕生成
from langchain.tools import BaseTool  # 导入langchain的BaseTool类,用于创建新的工具
from langchain import OpenAI  # 导入langchain中的OpenAI模块,用于与OpenAI API交互
from langchain.agents import initialize_agent, AgentType  # 导入langchain的agent初始化和类型定义
from dotenv import load_dotenv  # 导入dotenv库,用于加载环境变量

load_dotenv()  # 加载.env文件中的环境变量

# 初始化图像字幕生成模型
hf_model = "Salesforce/blip-image-captioning-large"  # 指定使用HuggingFace中的模型

processor = BlipProcessor.from_pretrained(hf_model)  # 初始化处理器,用于图像的预处理
model = BlipForConditionalGeneration.from_pretrained(hf_model)  # 初始化模型,用于生成字幕

# 定义图像字幕生成工具类
class ImageCapTool(BaseTool):
    name = "Image captioner"
    description = "为图片创作说明文案."

    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)  # 解码字幕
        return caption
    
    def _arun(self, query: str):
        raise NotImplementedError("This tool does not support async")  # 异步函数未实现

# 初始化并运行LangChain智能体
llm = OpenAI(temperature=0.2)  # 使用OpenAI模型

tools = [ImageCapTool()]  # 创建工具实例
agent = initialize_agent(
    agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
    tools=tools,
    llm=llm,
    verbose=True,
)
img_url = 'https://mir-s3-cdn-cf.behance.net/project_modules/hd/eec79e20058499.563190744f903.jpg'  # 定义图像URL
agent.run(input=f"{img_url}\n请创作合适的中文推广文案")  # 使用智能体处理图像并生成字幕

在这里插入图片描述

代码

  • https://github.com/zgpeace/pets-name-langchain/tree/feature/picTalk

参考

  • https://github.com/huangjia2019/langchain/blob/main/00_%E5%BC%80%E7%AF%87%E8%AF%8D_%E5%A5%87%E7%82%B9%E6%97%B6%E5%88%BB/02_%E7%9C%8B%E5%9B%BE%E8%AF%B4%E8%AF%9D.py
以下是基于分数阶微分的image caption模型的代码: ```python import torch import torch.nn as nn import torchvision.models as models import numpy as np from scipy import signal class FractionalDiff(nn.Module): def __init__(self, order, device): super(FractionalDiff, self).__init__() self.order = order self.device = device self.conv = nn.Conv1d(1, 1, 3, stride=1, padding=1, bias=False) filter = self.get_diff_filter() filter = torch.from_numpy(filter).float().to(self.device) filter = filter.view((1, 1, filter.shape[0])) self.conv.weight.data = filter self.conv.weight.requires_grad = False def forward(self, x): x = x.unsqueeze(1) out = self.conv(x) out = out.squeeze(1) return out def get_diff_filter(self): n = 201 h = np.zeros(n) h[0] = 1 a = self.order - 0.5 for i in range(1, n): h[i] = -h[i-1] * a / i h = np.concatenate((h, np.zeros(n))) window = signal.hann(2*n) h = h * window H = np.fft.fft(h) w = np.linspace(-np.pi, np.pi, 2*n) H = np.exp(1j*w*(self.order-0.5))*H h = np.real(np.fft.ifft(H)) h = h[:n] h = h / np.sum(np.abs(h)) return h class ImageCaption(nn.Module): def __init__(self, vocab_size, embedding_dim, hidden_dim, num_layers, order, device): super(ImageCaption, self).__init__() self.device = device self.order = order self.encoder = models.resnet18(pretrained=True) self.encoder.fc = nn.Linear(512, embedding_dim) self.embedding = nn.Embedding(vocab_size, embedding_dim) self.lstm = nn.LSTM(embedding_dim, hidden_dim, num_layers, batch_first=True) self.fc = nn.Linear(hidden_dim, vocab_size) self.fdiff = FractionalDiff(order, device) def forward(self, images, captions): features = self.encoder(images) features = features.view(features.size(0), -1) embeddings = self.embedding(captions) embeddings = torch.cat((features.unsqueeze(1), embeddings), 1) embeddings = self.fdiff(embeddings) hiddens, _ = self.lstm(embeddings) outputs = self.fc(hiddens) return outputs ``` 该模型使用了一个名为`FractionalDiff`的自定义模块,用于计算分数阶微分。在这个模块,我们使用了一个可以生成分数阶微分滤波器的函数,该函数返回的滤波器可以应用于一维信号。在`ImageCaption`模型,我们使用了ResNet-18来提取图像特征,然后使用一个LSTM来生成对应的标题。在输入标题之前,我们将图像特征与一个起始符(SOS)连接起来,然后将它们传递给分数阶微分模块,该模块将对它们进行分数阶微分。最后,我们使用一个全连接层将隐藏状态映射到词汇表的大小。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值