gemini-pro-vision 看图说话

news/2024/8/26 12:42:45 标签: python, gemini多模态, 看图说话, 图片问答

一、安装

   pip install -U langchain-google-vertexai

二、设置访问权限

        申请服务账号json格式key

三、完整代码

import gradio as gr
import json
import base64
from pathlib import Path
import os
import time
import requests
from fastapi import FastAPI, UploadFile, File
from fastapi.middleware.cors import CORSMiddleware
import uvicorn
from langchain_core.messages import HumanMessage
from langchain_google_vertexai import ChatVertexAI
from langchain_core.output_parsers import StrOutputParser

os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "xxx.json"
app = FastAPI()
app.add_middleware(
        CORSMiddleware,
        allow_origins=["*"],
        allow_credentials=True,
        allow_methods=["*"],
        allow_headers=["*"],
    )

def encode_image(image_path):
    with open(image_path, "rb") as image_file:
        return base64.b64encode(image_file.read()).decode("utf-8")

def generate(model, prompt, images_base64):
    llm = ChatVertexAI(model_name=model)
    # example
    message = HumanMessage(
        content=[
            {
                "type": "text",
                "text": prompt,
            },
            {"type": "image_url", "image_url": {"url": f"data:image/png;base64,{images_base64}"}},
        ]
    )
    parser = StrOutputParser()
    result = llm.invoke([message])
    parserResult = parser.invoke(result)
    return parserResult

def respond(model, image_path, prompt, chat_history):
    print(model, image_path, prompt)
    images_base64 = [encode_image(image_path)]
    bot_message = generate(model, prompt, images_base64)
    chat_history.append((prompt, bot_message))
    time.sleep(1)
    return "", chat_history

with gr.Blocks() as demo:
    gr.Image(value='xxx.png',height=30,width=70, interactive=False, show_download_button=False, show_label=False)
    gr.HTML("""<h1 align="center">图片问答</h1>""")
    
    model = gr.Textbox(value="gemini-pro-vision",label="gemini多模态模型:")
    with gr.Row():
        with gr.Column(scale=1):
            image_path = gr.Image(label="上传图片:",type="filepath", value='Picture1.png')
        with gr.Column(scale=3):
            chatbot = gr.Chatbot()
    prompt = gr.Textbox(label="用户:",value="大童在保险行业的地位如何?使用中文回答。")
    
    clear = gr.ClearButton([prompt, chatbot])
            
    prompt.submit(respond, [model, image_path, prompt, chatbot], [prompt, chatbot])

app = gr.mount_gradio_app(app, demo, path="/")

if __name__ == '__main__':
    uvicorn.run(app='web_gemini:app', host='0.0.0.0', port=8500, workers=1)

四、运行效果


http://www.niftyadmin.cn/n/5558047.html

相关文章

C++客户端Qt开发——常用控件QWidget

四、常用控件 属性 作用 enabled 设置控件是否可使用.true 表⽰可用&#xff0c;false 表示禁用 geometry 位置和尺寸&#xff0c;包含x,y,width,height四个部分 其中坐标是以⽗元素为参考进行设置的. windowTitle 设置widget标题 windowIcon 设置widget图标 windowO…

线性代数:多个随机变量相加的方差

对于多个随机变量相加的方差&#xff0c;我们可以按照独立和不独立的情况进行讨论。 1. 独立情况下的证明 假设我们有 n n n 个独立的随机变量 X 1 , X 2 , … , X n X_1, X_2, \ldots, X_n X1​,X2​,…,Xn​。 根据方差的性质&#xff0c;如果随机变量是独立的&#xff…

eclipse 新建类class文件增加copyright版权信息

1、Window -> Preferences 2、输入code,找到code templates Java > Code Style > Code Templates 比如进行如何的设置&#xff1a; 3、新增类文件&#xff0c;会自动增加版权&#xff1a;

在 Node.js 中使用 axios 配置代理并实现图片并发下载

文章目录 一、创建 Axios 实例二、图片并发下载三、参考资料 一、创建 Axios 实例 可以创建一个 axiosConfig.ts 文件用于创建和更新相关实例&#xff1a; // server/utils/axiosConfig.ts const axios require("axios"); const { HttpsProxyAgent } require(htt…

使用milvus-sdk-go的迭代器导出数据

使用milvus-sdk-go的迭代器导出数据 迭代器是一种功能强大的工具&#xff0c;可帮助您使用主键值和布尔表达式迭代集合中的大量数据或所有数据。这可以显著改善您检索数据的方式。与传统的offset和limit参数用法不同&#xff0c;后者可能会随着时间的推移而变得效率低下&#…

Java面试八股之Redis Stream的实现原理及应用场景

Redis Stream的实现原理及应用场景 Redis Stream是一种在Redis 5.0版本中引入的数据结构&#xff0c;它主要用于实现高效的消息队列服务。下面我将详细解释其实现原理以及一些常见的应用场景。 实现原理 1. 结构组成&#xff1a; - Redis Stream由一个或多个消息组成&#xf…

CSS3 transform rotate(旋转)锯齿/元素抖动模糊的解决办法

要解决CSS3 transform rotate&#xff08;旋转&#xff09;锯齿/元素抖动模糊的问题&#xff0c;可以尝试以下方法&#xff1a; 使用硬件加速 为元素添加transform: translateZ(0);或者will-change: transform;属性&#xff0c;以启用硬件加速&#xff0c;提高渲染性能。 .elem…

一键发布:抖音短视频矩阵系统批量上传与智能混剪功能解析

在数字化时代&#xff0c;抖音短视频已经成为人们日常生活中不可或缺的一部分。无论是记录生活点滴&#xff0c;还是展示个人才华&#xff0c;抖音都为我们提供了一个广阔的舞台。然而&#xff0c;对于内容创作者来说&#xff0c;如何高效、便捷地发布短视频&#xff0c;实现内…