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.成为微信公众平台开发者 成为微信公众平台的开发者,是小程序开发的首要条件.只有成为微信公众平台的开发者,才可以使用公众平台的各种开发接口.如果你已经是开发者,则可以跳过本章. ①.进入微信公众平台 ...
随机推荐
- element-ui resetFields 无效的问题
1.问题 触发bug的条件是先打开,编辑进行赋值,后打开新增 先点开编辑 再打开新增 这个时候你会发现刚刚赋值过的数据还遗留在表单里面 即使在打开 dialog 的时候执行了重置也没有效果 res ...
- UUID和雪花(Snowflake)算法该如何选择?
UUID 和 Snowflake 都可以生成唯一标识,在分布式系统中可以说是必备利器,那么我们该如何对不同的场景进行不同算法的选择呢,UUID 简单无序十分适合生成 requestID, Snowfl ...
- linux之Zip
安装: apt-get) apt-get install zip yum) yum install -y unzip zip 语法: zip [选项] 压缩包名 源文件或源目录列表 注意,zip 压缩 ...
- 案例 | 某药企引进正也科技S2P系统 整合营销业务
为了获取更大的市场空间,医药健康行业正迎来一波前所未有的产业升级.尽管不少企业取得了许多成绩,但仍面临诸多挑战. 天津某医药公司是集医药研发.药品生产.医药商业.大健康产业于一体的大型企业.敢为人先开 ...
- ORCA避障源码笔记
参考资料 https://gamma.cs.unc.edu/ORCA/publications/ORCA.pdf https://gamma.cs.unc.edu/RVO2/ 数学知识 1.向量的点乘 ...
- nodejs安装和环境配置
nodejs安装和环境配置 1.下载安装node.js 官方下载地址: https://nodejs.org/en/ 下载LTS版本(长期稳定版本) 安装可以更改安装路径(我的更改是D:\Progra ...
- Bugku-CTF getshell
题目: <?php define('pfkzYUelxEGmVcdDNLTjXCSIgMBKOuHAFyRtaboqwJiQWvsZrPhn', __FILE__); $cPIHjUYxDZVB ...
- tar 分卷压缩和解压缩
示例将 jdk1.8.0_221 文件夹按 98m 进行分卷压缩和解压缩压缩: tar -czvf - jdk1.8.0_221/ |split -b 98m - jdk1.8.0_221.tar.g ...
- 龙哥量化:通达信macd黄白线变色公式macd金叉怎么写macd死叉怎么写(需要继续优化,各种变色方式)
你提出的任何逻辑要求,只要是软件能实现的,我都能用通达信写出来,我レメLong622889通达信.大智慧.文华.博易的编程逻辑差不多,只是个别函数不一样.TB交易开拓者.金字塔和文华8,都是专业的期货 ...
- Mac 配置多版本JDK
@ 目录 前言 一.下载并安装多个JDK版本 二.配置环境变量 三.切换JDK版本 四.下篇预告!!! 总结 前言 请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i. 提示:以下是本篇文章正文 ...