基于Ollama Python的本地多模态大模型

0,背景

最近测试Ollama,发现之前直接下载开源模型在我电脑上都跑不动的模型,居然也能运行了(AMD 7840HS核显/32GB内存),突发奇想那些多模态大模型能不能基于Python接口使用,所以决定尝试一下。

1,安装环境与模型选择

安装过程略,可以参考文章:Ollama在Windows11部署与使用QWen2模型_ollama run qwen2 "内容-CSDN博客

模型选择上,选取多模态大模型BakLLaVA 

BakLLaVA 是一款由 SkunkworksAI 与 LAION、Ontocord 和 Skunkworks OSS AI 团队合作开发的多模态语言模型,通过改进基础模型、调整训练过程、引入定制数据集及架构优化,实现了接近 GPT-4 级别的多模态语言处理能力。它在图像描述生成、语音识别和理解、自然语言问答等应用中表现出色,并且支持多种 GPU 配置,具有较强的适应性。作为开源项目,BakLLaVA 为研究人员和开发者提供了广阔的探索和改进空间。

ollama run bakllava

2,Ollama的Python接口测试

使用指令安装库

pip install ollama

然后运行下面的程序测试:

import ollama

response = ollama.chat(model='bakllava', messages=[
  {
    'role': 'user',
    'content': 'Why is the sky blue?',
  },
])

print(response['message']['content'])

能够得到返回结果

3,代码实现

(1)导入必要的库

首先,我们需要导入处理图像和与 Ollama 模型交互所需的库。

import base64
from io import BytesIO
from PIL import Image
import ollama

(2)定义图像转换函数

我们需要一个函数来将 PIL 图像转换为 Base64 编码字符串。这对于将图像数据发送给模型是必要的步骤。

# 将PIL图像转换为Base64编码字符串
def convert_to_base64(pil_image):
    buffered = BytesIO()
    # 将图像转换为RGB模式
    pil_image = pil_image.convert("RGB")
    pil_image.save(buffered, format="JPEG")
    img_str = base64.b64encode(buffered.getvalue()).decode("utf-8")
    return img_str

 (3)定义图像加载函数

该函数用于从指定路径加载图像,并将其转换为 Base64 编码字符串。

# 从指定路径加载图像并转换为Base64编码字符串
def load_image(file_path):
    pil_image = Image.open(file_path)
    return convert_to_base64(pil_image)

(4)定义与模型交互的函数

这个函数将图像和问题发送给 BakLLaVA 模型,并获取模型的回答。

# 将图像和问题发送给Ollama的bakllava模型并获取回答
def chat_with_model(image_base64, question):
    response = ollama.chat(model='bakllava', messages=[
        {
            'role': 'user',
            'content': question,
            'images': [image_base64]
        }
    ])
    return response['message']['content']

 (5)主程序逻辑

在主程序中,我们加载图像,将其转换为 Base64 编码,然后向模型提问,并打印模型的回答。

if __name__ == "__main__":
    # 图片所在地址
    file_path = "2.jpg"
    
    # 加载并转换图像
    image_b64 = load_image(file_path)
    
    # 提问
    question = "What is written in the picture, and answer the question."
    
    # 与模型对话
    answer = chat_with_model(image_b64, question)
    
    # 打印回答
    print(answer)

上传的图片其实很简单,如下

 完整程序如下:

import base64
from io import BytesIO
from PIL import Image
import ollama

# 将PIL图像转换为Base64编码字符串
def convert_to_base64(pil_image):
    buffered = BytesIO()
    # 将图像转换为RGB模式
    pil_image = pil_image.convert("RGB")
    pil_image.save(buffered, format="JPEG")
    img_str = base64.b64encode(buffered.getvalue()).decode("utf-8")
    return img_str

# 从指定路径加载图像并转换为Base64编码字符串
def load_image(file_path):
    pil_image = Image.open(file_path)
    return convert_to_base64(pil_image)

# 将图像和问题发送给Ollama的phi3模型并获取回答
def chat_with_model(image_base64, question):
    response = ollama.chat(model='bakllava', messages=[
        {
            'role': 'user',
            'content': question,
            'images': [image_base64]
        }
    ])
    return response['message']['content']

if __name__ == "__main__":
    # 图片所在地址
    file_path = "2.jpg"
    
    # 加载并转换图像
    image_b64 = load_image(file_path)
    
    # 提问
    question = "What is written in the picture,and answer the question."
    
    # 与模型对话
    answer = chat_with_model(image_b64, question)
    
    # 打印回答
    print(answer)

4,运行得到结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/760277.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Qt之Pdb生成及Dump崩溃文件生成与调试(含注释和源码)

文章目录 一、Pdb生成及Dump文件使用示例图1.Pdb文件生成2.Dump文件调试3.参数不全Pdb生成的Dump文件调试 二、个人理解1.生成Pdb文件的方式2.Dump文件不生产的情况 三、源码Pro文件mian.cppMainWindowUi文件 总结 一、Pdb生成及Dump文件使用示例图 1.Pdb文件生成 下图先通过…

Springboot+vue电商平台

管理员权限操作的功能包括管理商家,管理商家星级信息,管理用户,管理商品等。 商家权限操作的功能包括管理商品,回复商品评价,管理商品订单等。 用户权限操作的功能包括查看商家,购买商品,提交…

Django之邮箱注册

目录 一、邮箱验证-环境搭建 1.1、注册流程 1.2、环境搭建 二、封装工具类 三、发送邮件接口开发 四、用户调用发送邮件接口 4.1、Fetch API 4.1.1、GET请求 4.1.2、POST请求 五、完成注册功能 一、邮箱验证-环境搭建 1.1、注册流程 1.2、环境搭建 创建项目 django-a…

Variables Reference for vscode

Predefined variables Visual Studio Code 支持在调试、任务配置文件以及一些特定的设置中使用变量替换。这些变量可以使用 ${variableName} 语法在 launch.json 和 tasks.json 文件的某些键和值字符串中使用。 Predefined variables Visual Studio Code 支持以下预定义变量…

【分布式计算框架 MapReduce】高级编程—多任务数据分析

目录 一、对于 sogou_500w_utf 数据,使用 MapReduce 编程模型完成对以下数据的分析任务。 1. 统计搜索的关键字查询频度,找出搜索次数超过 20 次的关键字的个数。 ① 运行截图 ② 源代码 二、改造 WordCount 程序,使得结果的排序规则为按…

APP逆向 day7 JAVA基础2

一.前言 昨天我们讲了点java基础,大家是不是觉得就特别简单,今天讲点稍微难一丢丢的基础,也就是java基础2.0,今天我要和大家说的内容十分的重要,直接关乎到下一节的内容,所以,好好学&#xff0…

React 打包时如何关闭源代码混淆

React 开发中,使用 npm build 命令进行生产代码打包,为了压缩代码并尽量保证代码的安全性,React 打包时会代码进行压缩和混淆,但是有时我们需要 debug 生产环境的源代码,例如当我们调试 SSR 的项目时,需要禁…

<电力行业> - 《第10课:变电》

1 变电 变电环节,顾名思义就是改变电压的环节,主要是在变电站和变电所完成的。变电站和变电所主要区别在于:变电站比变电所更大。 发电厂的变压器和配电变压器也属于“变电”,但我们在说电网环节时,变电特指电网公司…

Android常用加解密算法总结

Android开发中对于数据的传输和保存一定会使用加密技术,加密算法是最普遍的安保手段,多数情况数据加密后在需要使用源数据时需要再进行解密,但凡是都有例外。下面从可逆加密、不可逆、不纯粹加密三种方式记录一下常见的加解密算法。 加密技术…

计算机毕业设计Thinkphp/Laravel校园体育器材管理系统

校园体育器材管理系统在流畅性,续航能力,等方方面面都有着很大的优势。这就意味着校园体育器材管理系统的设计可以比其他系统更为出色的能力,可以更高效的完成最新的体育器材、器材借用、器材归还、器材损坏、采购入库、器材报废、维修记录等…

局域网必备文件传输神器,吾爱再出精品,支持电脑、手机无缝对接!

今天给大家带来的不是一般的干货,而是一款让阿星我爱不释手的局域网文件传输神器,而且是吾爱大佬出品。无论是工作还是生活,它都能给你带来极大的便利。这年头,谁还没个跨设备传输文件的需求呢? 手机、电脑、平板&…

AI agent是什么,什么技术栈

AI agent,也称为会话代理或聊天机器人, 是一种通过文本或语音模拟人类对话的计算机程序。 它们旨在以自然且引人入胜的方式理解和响应用户输入。 AI agent 被广泛用于各种应用中,包括客户服务、营销、 销售和教育。 有两种主要类型的 AI agen…

Webpack: 前端资深构建工具

概述 如果你是一名前端工程师,相信之前或多或少听过、用过 Webpack 这一构建工具,它能够融合多种工程化工具,将开发阶段的应用代码编译、打包成适合网络分发、客户端运行的应用产物如今,Webpack 已经深深渗入到前端工程的方方面面…

snat、dnat和firewalld

目录 概述 SNAT源地址转换 DANT目的地址转换 抓包 firewalld 端口管理 概述 snat :源地址转换 内网——外网 内网ip转换成可以访问外网的ip 也就是内网的多个主机可以只有一个有效的公网ip地址访问外部网络 DNAT:目的地址转发 外部用户&#…

使用Python绘制太阳系图

使用Python绘制太阳系图 太阳系图太阳系图的优点使用场景 效果代码 太阳系图 太阳系图(Sunburst Chart)是一种层次结构图表,用于表示数据的分层结构。它使用同心圆表示各个层级,中心圆代表最高层级,向外的圆环代表逐级…

Ubuntu内存占用高怎么办?docker容器查看内存占用,按照内存占用排序,查看进程占用

Ubuntu内存占用高怎么办?docker容器查看内存占用,按照内存占用排序,查看进程占用 问题描述(废话)解决方案 问题描述(废话) 今天突然注意到服务器内存占用很高,想查看一下内存的占用情况。 首先想到了系统的命令,用top命…

基于vue脚手架创建的图书商城

功能简介 此项目包括首页, 搜索列表, 商品详情, 购物车, 订单, 支付, 用户登陆/注册等多个子模块,使用 Vue 全家 桶ES6WebpackAxios 等技术,采用模块化、组件化、工程化的模式开发。 功能模块图 2.1首页 2.2.搜索列表 2.3.商品详情 2.4.购物车 2.5.支…

python工作目录与文件目录

工作目录 文件目录:文件所在的目录 工作目录:执行python命令所在的目录 D:. | main.py | ---data | data.txt | ---model | | model.py | | train.py | | __init__.py | | | ---nlp | | | bert.py | …

架构师篇-9、从事件风暴到微服务设计的落地过程

用户付款功能第二个版本的设计实现 单一职责原则(SRP) 软件系统中的每个元素只完成自己职责内的事,将其他的事交给别人去做“职责”通常人理解为一个事情,与该事情相关的事都是它的责任 一个职责是软件变化的一个原因 第二次需求…

springboot异常产生原因

DataIntegrityViolationException Cause: java.sql.SQLException: Field ‘id’ doesn’t have a default value org.springframework.dao.DataIntegrityViolationException: ### Error updating database. Cause: java.sql.SQLException: Field id doesnt have a default …