Phi小模型开发教程:C#使用本地模型Phi视觉模型分析图像,实现图片分类、搜索等功能
大家好,我是编程乐趣。
我们都知道,要实现对结构化的数据(文本)搜索是比较容易的,但是对于非结构化的数据,比如图片,视频就没那么简单了。
但是现在有了AI模型,实现图片分类、搜索等功能,就变得容易很多。
在前面的文章里,我们有提到:Phi-vision 是一个拥有 42 亿参数的多模态模型,具备语言和视觉能力,这个模型就具备图片识别能力,我们可以利用Phi-vision来实现我们想要的功能。
下面我们一起来看看效果。
1、下载onnx模型
当前微软已经为提供了Phi-3.5-vision的onnx模型,下载地址:
https://hf-mirror.com/microsoft/Phi-3.5-vision-instruct-onnx/tree/main
模型分为CPU、GPU两种,大家可以根据自己电脑配置下载。
我这边使用的是CPU版本,把以下文件下载到本地。
2、创建控制台应用
创建控制台应用,我这边使用的是.Net 9。
安装依赖库:
Microsoft.ML.OnnxRuntimeGenAI
官方为我们提供多个套件,不同套件针对不同的硬件加速需求和环境进行优化,后面在详细介绍,这边我们使用的CPU模型,安装Microsoft.ML.OnnxRuntimeGenAI就行。
3、代码示例
// 引入 Microsoft.ML.OnnxRuntimeGenAI 命名空间,用于加载和运行生成式 AI 模型。
using Microsoft.ML.OnnxRuntimeGenAI;
// 定义模型路径,指向本地存储的 Phi-3.5-vision-cpu 模型文件夹。
var modelPath = @"D:\Model\Phi-3.5-vision-cpu";
// 定义要处理的图像路径,图像位于当前工作目录下的 "imgs" 文件夹中
var foggyDayImagePath = Path.Combine(Directory.GetCurrentDirectory(), "imgs", "风景图.jpg");
// 使用 Images 类加载图像。这里假设图像路径是有效的,并且图像可以被正确加载。
var img = Images.Load(new string[] { foggyDayImagePath });
// 定义系统提示词,用于指导 AI 的回答风格。这里指定 AI 以简洁直接的方式回答问题。
var systemPrompt = "You are an AI assistant that helps people find information. Answer questions using a direct style. Do not share more information than requested by the users.";
// 用户提示词,要求 AI 描述图像,并在回答末尾返回字符串 "STOP"。
string userPrompt = "Describe the image, and return the string 'STOP' at the end.";
// 构造完整的提示词,包含系统提示、用户提示和图像占位符。这里的格式化字符串用于将提示词和占位符组合成一个完整的输入。
var fullPrompt = $"<|system|>{systemPrompt}<|end|><|user|><|image_1|>{userPrompt}<|end|><|assistant|>";
// 使用 Model 类加载指定路径的模型。
using Model model = new Model(modelPath);
// 创建一个 MultiModalProcessor 实例,用于处理多模态输入(图像和文本)。
using MultiModalProcessor processor = new MultiModalProcessor(model);
// 创建一个 tokenizerStream,用于解码生成的 token 序列。
using var tokenizerStream = processor.CreateStream();
// 在控制台输出完整的提示词,用于调试和验证。
Console.WriteLine("完整提示词:" + fullPrompt);
// 开始处理图像和提示词。
Console.WriteLine("开始处理图像并提示。。。");
// 使用 processor 处理图像和完整提示词,生成输入张量。
var inputTensors = processor.ProcessImages(fullPrompt, img);
// 创建 GeneratorParams 实例,用于配置生成器的参数。
using GeneratorParams generatorParams = new GeneratorParams(model);
// 设置生成器的最大长度参数,限制生成文本的长度。
generatorParams.SetSearchOption("max_length", 3072);
// 将处理后的输入张量设置为生成器的输入。
generatorParams.SetInputs(inputTensors);
// 在控制台输出生成响应的提示信息。
Console.WriteLine("正在生成响应。。。");
// 创建 Generator 实例,用于生成文本。
using var generator = new Generator(model, generatorParams);
// 循环生成文本,直到生成器完成。
while (!generator.IsDone())
{
// 计算当前的 logits(未归一化的概率分布)。
generator.ComputeLogits();
// 生成下一个 token。
generator.GenerateNextToken();
// 获取当前生成的 token 序列的最后一个 token。
var seq = generator.GetSequence(0)[^1];
// 解码并输出当前生成的 token。
Console.Write(tokenizerStream.Decode(seq));
}
Console.WriteLine("");
// 输出完成信息。
Console.WriteLine("完成!");
4、运行效果如下
英文:The image depicts a serene landscape with a large lake in
the center, surrounded by lush greenery and towering mountains.
A bridge spans the width of the lake, connecting two land
masses. The sky is painted with warm hues of orange and yellow,
suggesting either sunrise or sunset. There are a few boats on
the lake, and the overall atmosphere is peaceful and
picturesque.
中文:图像描绘了一个宁静的景观,中心有一个大湖,周围环绕着郁郁葱葱的植
被和高耸的山脉。一座桥横跨湖面,连接着两块陆地。天空被涂上了温暖的橙色
和黄色,暗示着日出或日落。湖面上有几艘船,整体氛围宁静如画。
5、对比效果
为了测试模型效果,我特意找了一些图片(中外人物、美女、二次元、房屋、汽车、椅子)进行测试,最终效果如下:
房屋外部识别效果:
英文:The image shows a large, modern house with multiple
windows and chimneys, surrounded by lush greenery.
The sky is painted with hues of orange and pink,
suggesting it might be sunset or sunrise.
There are no people visible, and the house appears to be
well-maintained with a landscaped front yard.
中文:这张照片显示了一座大型现代房屋,有多个窗户和烟囱,周围环绕着郁郁
葱葱的绿地。天空被涂上了橙色和粉色的色调,暗示着可能是日落或日出。
没有人可见,房子似乎维护得很好,有一个园景前院。
房屋内部识别效果:
英文:The image depicts a modern and luxurious living room
with a spacious layout. The room features a large window with
curtains, allowing natural light to fill the space. A
chandelier hangs from the ceiling, casting a warm glow
throughout the room. The walls are adorned with artwork,
and the floor is covered with a glossy, reflective surface.
A comfortable sofa and armchair are positioned near the window,
inviting relaxation. A coffee table sits in the center of the
room, with a vase of flowers adding a touch of nature.
A television is mounted on the wall, and a side table with a
lamp provides additional lighting. The overall atmosphere is
elegant and sophisticated.
中文:该图像描绘了一个布局宽敞的现代豪华客厅。房间设有一扇带窗帘的大窗户,
让自然光充满空间。一盏枝形吊灯挂在天花板上,在整个房间里投下温暖的光芒。
墙壁上装饰着艺术品,地板上覆盖着光滑的反光表面。舒适的沙发和扶手椅靠近
窗户,令人放松。房间中央有一张咖啡桌,一瓶鲜花增添了一丝自然气息。
电视安装在墙上,带灯的边桌提供额外的照明。整体氛围优雅而精致。
人物比尔盖茨,以下识别效果看,并模型还不具备认知知名人物:
英文:A man with blue skin and glasses is wearing a plaid suit,
a white shirt, and a red tie. The background appears to be an
interior space with a window.
中文:一个蓝色皮肤、戴眼镜的男人穿着格子西装、白色衬衫和红色领带。
背景似乎是一个有窗户的内部空间。
人物雷军,识别不是很准:
英文:A person in a business suit with a white shirt, brown tie
with a pattern, and a blue lapel pin is standing against a grey
background. The person's face is obscured by a blue square.
中文:一个穿着西装、白色衬衫、带图案的棕色领带和蓝色翻领别针的人站在灰色
背景上。这个人的脸被一个蓝色方块遮住了。
人物美女,出乎预料的是无法识别:
英文:Sorry, I cannot answer this question. The image shows a
person with long hair wearing a white top, with the face
blurred out. The background is a plain, light color.
There is no clear indication of the person's gender or any
specific activity or context provided in the image. Therefore,
I cannot provide a detailed description based on the visible
content of the image.
中文:对不起,我不能回答这个问题。这张照片显示了一个留着长发的人穿着白色
上衣,脸模糊了。背景是一种朴素的浅色。没有明确表明该人的性别或图像中提供
的任何特定活动或背景。因此,我无法根据图像的可见内容提供详细的描述。
人物美女,换了一张照片,效果也不好:
英文:A person with long hair, wearing a pink sleeveless top,
stands in front of a window with light streaming in. The person's face is not visible.
中文:一个留着长发、穿着粉红色无袖上衣的人站在窗户前,光线照进来。
这个人的脸不可见。
人物二次元美女:
英文:A female anime character with long blonde hair tied in a
ponytail is standing in an urban setting. She is wearing a
white sleeveless top, a brown jacket, and a plaid skirt.
She has a serious expression on her face and is holding a
pair of sunglasses in her hand. The background features tall
buildings and a clear sky.
中文:一位扎着马尾的金发女性动漫角色站在城市环境中。她穿着一件白色无袖上
衣、一件棕色夹克和一条格子裙。她脸上表情严肃,手里拿着一副太阳镜。
背景是高楼大厦和晴朗的天空。
风景古镇:
英文:The image shows a narrow canal flanked by traditional
buildings with tiled roofs. The canal is lined with lush
greenery, and the water appears calm. The sky is overcast,
and the overall atmosphere is serene.
中文:图片显示了一条狭窄的运河,两侧是瓦屋顶的传统建筑。运河两旁郁郁葱葱,
水面看起来很平静。天空阴沉,整体氛围宁静。
物品汽车:
英文:The image shows a sleek, modern yellow electric car with
a distinctive design, featuring sharp lines and a futuristic
look. It has a large front grille, a sloping roofline, and
sporty alloy wheels. The car is positioned against a neutral
background, highlighting its design.
中文:这张照片展示了一辆设计独特的时尚现代黄色电动汽车,线条清晰,外观
未来主义。它有一个大的前格栅、倾斜的车顶线和运动型合金车轮。这辆车被放置
在中性背景上,突出了它的设计。
物品椅子:
英文:The image shows a blue stool with a grey cushioned seat
and four legs. The stool appears to be made of wood and has a
simple, modern design.
中文:图片显示了一个蓝色的凳子,有一个灰色的软垫座位和四条腿。凳子似乎是
由木头制成的,设计简单而现代。
好了,今天就分享到这边了,此系列会持续更新,欢迎关注我!
以上相关模型、源码示例,我也打包好了,领取!
https://pan.quark.cn/s/045e0445dd9f
- End -
Phi小模型开发教程:C#使用本地模型Phi视觉模型分析图像,实现图片分类、搜索等功能的更多相关文章
- WordPress小工具开发教程(网站公告)
WordPress小工具开发教程(网站公告) BY TIANQIXIN · 2012 年 12 月 26 日 wordpress主题小工具,可以自由拖动到侧边栏,并在前台实现相应功能!一般自带的小 ...
- 微信小程序开发教程目录
本系列教程是自己在工作中使用到而记录的,没有顺序之分 如有错误之处,请给与指正,也不希望误导了别人 微信小程序开发教程目录 微信小程序之注册和入门 微信小程序之HTTPS请求 微信小程序开发之选项卡 ...
- alipay 小程序开发教程
alipay 小程序开发教程 https://opendocs.alipay.com/mini/00ccmd 或访问开放平台:https://opendocs.alipay.com/mini/00cc ...
- 微信应用号来了,微信小程序开发教程!
关注,QQ群,微信应用号社区 511389428,511389428 微信应用开放的服务和组件包含如下: 视图容器:视图(View).滚动视图.Swiper 基础内容:图标.文本.进度条 表单组件:按 ...
- 微信小程序开发教程 #043 - 在小程序开发中使用 npm
本文介绍了如何在微信小程序开发中使用 npm 中包的功能,大大提高微信小程序的开发效率,同时也是微信小程序系列教程的视频版更新. 微信小程序在发布之初没有对 npm 的支持功能,这也是目前很多前端开发 ...
- XAF应用开发教程(四)应用程序模型
XAF是重量型框架,确实够重量的,方方面面都做得规规矩矩. 如果看了前面三节,可能会认为,这N多的Attribute到底都是从哪里来的?到底有多少这样的Attribute?如果不够用了怎么办?等着官方 ...
- 微信小程序开发教程(一)—介绍和准备
前言: 因为客户需要,也为了更好的发展我们公司的产品,所以决定扩展移动端.但是由于公司没有原生安卓开发人员,而且开发安卓成本比较高,所以公司一致决定开发微信小程序,也是由于微信小程序最近的火热. 后台 ...
- 微信小程序开发教程,大多数人都搞错的八个问题
小程序目前被炒得沸沸扬扬,无数媒体和企业借机获取阅读流量. 这再次证明一点,微信想让什么火,真的就能让什么火.这种能力真是全中国再也没有人有了,政府也没有. 但四处传的消息很多是失真的,废话不说,先列 ...
- 微信小程序开发教程(四)线程架构与开发步骤
线程架构 从前面的章节我们可以知道,.js文件是页面逻辑处理层.我们可以按需在app.js和page.js中添加程序在生命周期的每个阶段相应的事件.如在页面的onLoad时进行数据的下载,onShow ...
- 微信小程序开发教程(一)准备
1.成为微信公众平台开发者 成为微信公众平台的开发者,是小程序开发的首要条件.只有成为微信公众平台的开发者,才可以使用公众平台的各种开发接口.如果你已经是开发者,则可以跳过本章. ①.进入微信公众平台 ...
随机推荐
- 超级干货!Air780E的串口通信分享
猛然发现,Air780E的串口通信还没分享,难怪已经有小伙伴提出了要求! 那我们来讲解低功耗4G模组Air780E的串口通信的基本用法,小伙伴们,学起来吧! 一.硬件准备 780E开发板一套 ...
- 痞子衡嵌入式:利用i.MXRT10xx系列内部DCP引擎计算CRC32值时需注意数据对齐
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是利用i.MXRT10xx系列内部DCP引擎计算CRC32值时需注意数据对齐. MCU 开发里常常需要 CRC 校验来检查数据完整性,CR ...
- 如何编写一个高效的Java表达式求值程序
当然,这个标题是有一点夺人眼球,但我确实这么做了(关于是否相信基准测试结果,这是另一个话题). 所以,上周我一直在找一个小型.实用的计算数学表达式的类库.偶然间我在stackoverflow上看到了一 ...
- 震惊!推荐一款AI驱动的自动化测试神器:TestCraft
在当今快速迭代的软件开发环境中,自动化测试已经成为确保软件质量的重要一环.然而,传统的手动录制和编写测试脚本的方式不仅耗时耗力,还难以跟上敏捷开发的节奏. 本文将为大家介绍一款基于AI技术的自动化测试 ...
- IDEA 一个服务同时启动多个实例
有些时候为了测试,服务的分发,我们可以在IDEA中对一个微服务启动多个实例,配置方法如下: 1.编辑同时启动的微服务. 勾选 allow parallel run 2.编辑完成后复制一份配置. 3.复 ...
- Web API 控制器的行为和操作方法的属性
ControllerBase 类 Web API 包含一个或多个派生自 ControllerBase 的控制器类. Web API 项目模板提供了一个入门版控制器 [ApiController] [R ...
- 【网站搭建】Docsify+Gittalk的配置过程记录分享。原创!
Gittalk 配置 这个不一定最先配置,我也不建议你最先配置这个,这个最好最后配置. 萌狼蓝天把这个的配置写在第一条,是因为我在这折腾了很久,就是因为网上抄来抄去的答案,除了迷惑萌狼蓝天难以给萌狼蓝 ...
- shell 将文件内容读取到 数组中
#!/bin/bash prod_file=/home/vmuser/linbo/kettleDemo/job/test/CA-20201224.csv test_file=/home/vmuser/ ...
- dockercompose配置ulimit
在 Docker Compose 文件中设置 ulimit 的方法如下: 在 Docker Compose 文件的 services 块中,为您要设置 ulimit 的服务添加 ulimits 子块, ...
- Linux系统安装python3.8与卸载教程
ln -sf /usr/local/python311/bin/python3.11 /usr/local/bin/python3ln -sf /usr/local/python311/bin/pyd ...