VLM-OCR-Demo:一个使用VLM用于OCR任务的示例
前言
上一篇文章TesseractOCR-GUI:基于WPF/C#构建TesseractOCR简单易用的用户界面中我们构建了一个方便使用TesseractOCR的用户界面,今天构建一个类似的界面,使用Semantic Kernel接入视觉模型,测试一下用视觉模型做OCR任务的效果。在之前的文章使用Tesseract进行图片文字识别的总结中说了使用VLM做这个任务的缺点,经过测试之后,发现确实存在。
效果
在进行下一步之前,先大概了解一下效果。
测试图片1:

查看效果:

测试图片2:

查看效果:

在写好提示词的情况下,识别的效果还不错。
但是还是不免会出现幻觉:

需要自己调整到效果最好的模型。
普通用户使用
跟之前的软件一样,我已经在GitHub发布了压缩包,点击下载,然后解压即可。
GitHub地址:https://github.com/Ming-jiayou/VLM-OCR-Demo

这里我选择依赖框架的版本:

下载解压之后如下所示:

有一个.env文件,用于配置VLM的API Key。这是因为我电脑的配置不太行,无法本地用Ollama跑视觉模型,因此只能使用大模型服务商的。由于SiliconCloud还有额度,并且兼容了OpenAI格式,因此我这里选择接入SiliconCloud。现在注册有送2000万token的活动,最nice的一点是送的token没有时间期限。想试试的朋友可以点击链接:https://cloud.siliconflow.cn/i/Ia3zOSCU,注册使用。
注册之后,复制一个API Key:

打开.env填入API Key,注意API Key不要随意泄露,放心这是存储在自己的电脑上,我不会知道。
如下所示,不要留空格:

然后打开VLM-OCR-Demo.exe即可使用啦!!
我已经写好了一个用于OCR的Prompt:

缺点还是会存在,这里自动翻译成了中文,可以再试一下:

又正常了,也可以重新调整一下Prompt。
当然VLM如果只是用于OCR有点太奢侈了,OCR只是VLM的一个基础功能,还可以执行其他与图像有关的任务。
描述图片:


分析图表:


更多功能可由读者自行探索。
WPF/C# 程序员使用
将项目Fork到自己账号下,git clone 到本地,打开解决方案,项目结构如下:

由于.env文件包含API Key这个敏感信息,因此我没有上传到GitHub上,自己在同样的位置新建一个.env文件,格式如下所示:
SILICON_CLOUD_API_KEY=sk-xxx
填入自己的SILICON_CLOUD_API_KEY,如下所示:

设置.env文件的属性:

这样设置一下,应该就可以启动了。
开发工具:Visual Studio 2022
.NET版本:.NET 8
使用SemanticKernel很方便我们接入大语言模型到我们自己的应用中,之前只接入过对话模型,还没有试过接入视觉模型,其实接入也很简单,SemanticKernel大大简化了接入操作。
核心代码:
private async Task ExecuteAskAICommand()
{
if (AskAIResponse != "")
{
AskAIResponse = "";
}
if (SelectedVLM == null)
{
SelectedVLM = "Pro/OpenGVLab/InternVL2-8B";
}
IKernelBuilder kernelBuilder = Kernel.CreateBuilder();
kernelBuilder.AddOpenAIChatCompletion(
modelId: SelectedVLM,
apiKey: SiliconCloudAPIKey,
endpoint: new Uri("https://api.siliconflow.cn/v1")
);
Kernel kernel = kernelBuilder.Build();
var chatCompletionService = kernel.GetRequiredService<IChatCompletionService>();
if (SelectedFilePath == null)
{
return;
}
byte[] bytes = File.ReadAllBytes(SelectedFilePath);
// Create a chat history with a system message instructing
// the LLM on its required role.
var chatHistory = new ChatHistory("你是一个描述图片的助手,全程使用中文回答");
// Add a user message with both the image and a question
// about the image.
chatHistory.AddUserMessage(
[
new TextContent(AskAIText),
new ImageContent(bytes, "image/jpeg"),
]);
// Invoke the chat completion model.
var response = chatCompletionService.GetStreamingChatMessageContentsAsync(
chatHistory: chatHistory,
kernel: kernel
);
await foreach (var chunk in response)
{
AskAIResponse += chunk;
}
}
这只是一个简单的Demo,可供学习使用,具体的最佳使用方式,可根据自己的项目需求调整,其他代码可自行探索。
最后
本项目是一个使用VLM用于OCR任务与使用SemanticKernel将VLM接入自己应用的简单Demo,对WPF/C#新手程序员,也可以当作一个简单的练手小项目。
如果对你有所帮助,点颗star,就是最大的支持!!
VLM-OCR-Demo:一个使用VLM用于OCR任务的示例的更多相关文章
- 在Web.Config文件中使用configSource,避免动态修改web.config导致asp.net重启(另添加一个Config文件用于管理用户数据)
原文:在Web.Config文件中使用configSource,避免动态修改web.config导致asp.net重启(另添加一个Config文件用于管理用户数据) 我们都知道,在asp.net中修改 ...
- 自己封装的一个js方法用于获取显示的星期和日期时间
自己封装的一个js方法用于获取显示的星期和日期时间 /** * 获取用于显示的星期和日期时间 * @param date * @returns {string} */ function getWeek ...
- 写一个 setter 方法用于完成 @property (nonatomic, retain) NSString *name,
写一个 setter 方法用于完成 @property (nonatomic, retain) NSString *name 写一个 setter 方法用于完成 @property (nonatomi ...
- 实现一个名为Person的类和它的子类Employee,Manager是Employee的子类,设计一个方法add用于涨工资,普通员工一次能涨10%,经理能涨20%。
1.实现一个名为Person的类和它的子类Employee,Manager是Employee的子类,设计一个方法add用于涨工资,普通员工一次能涨10%,经理能涨20%.具体要求如下:(1)Perso ...
- Python之小测试:用正则表达式写一个小爬虫用于保存贴吧里的所有图片
很简单的两步: 1.获取网页源代码 2.利用正则表达式提取出图片地址 3.下载 #!/usr/bin/python #coding=utf8 import re # 正则表达式 import urll ...
- eShopOnContainers 是一个基于微服务的.NET Core示例框架
找到一个好的示例框架很难,但不是不可能.大多数是小型Todo风格的应用程序,通常基于SimpleCRUD.值得庆幸的是,Microsoft已经为eShopOnContainers创建了一个基于微服务的 ...
- 腾讯云技术专家卢萌凯手把手教你Demo一个人脸识别程序!
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文来自腾讯云技术沙龙,本次沙龙主题为Serverless架构开发与SCF部署实践 卢萌凯:毕业于东南大学,曾就职于华为,熟悉云行业解决方案 ...
- IOS开发之小实例--创建一个简单的用于视频录制和回放的应用程序
前言:还是看了一下国外的入门IOS文章:<Create a Simple App for Video Recording and Playback>,主要涉及视频录制和回放的功能的基本实现 ...
- Android学习小Demo一个显示行线的自定义EditText
今天在处理一个EditText的时候,想着把EditText做成像一本作业本上的纸一样,每一行都可以由线条隔开,具体效果如下: 1)最开始的思路 一开始的想法是很简单的,找出每一行的高度,然后一行一行 ...
- ios进度条Demo一个
一个很简单的Dmo.就拿出来分享一下. 一个简单的阴影效果 _progressView.frame = CGRectMake(size.width * progress-size.width, H_H ...
随机推荐
- CSS – Box Shadow & Text Shadow
前言 之前在 CSS – W3Schools 学习笔记 (3) 介绍过这个功能, 但一直不熟练. 每次用都卡卡的, 估计是没有写一篇独立的笔记的缘故. 特此写一篇. Text Shadow 下面这个是 ...
- DOM – Browser Reflow & Repaint
前言 没有深入研究过, 懂个概念就好, 等性能遇到问题在来看看. 以前写的笔记: 游览器 reflow 参考: reflow和repaint引发的性能问题 精读<web reflow> R ...
- C++ 数据输入cin (解决CLoin输入中文程序出错)
数据输入cin 语法:cin >> 变量 解决 CLoin 使用cin输入中文程序无法正常运行 按住Ctrl+alt+shift+/键 弹出对话框选择注册表 取消勾选run.process ...
- Spring —— 整合JUnit
整合JUnit
- `->` 操作符重载的注意事项
在 C++ 中,-> 操作符可以被重载,用于对象的指针成员访问. 重载后的 -> 操作符主要用于模拟指针访问行为,常见于智能指针的实现等复杂场景. -> 操作符重载后的调用触发流程: ...
- 深度学习卷积、全连接层、深度可分离层参数量和FLOPs计算公式
来源 卷积: 输入尺寸 ,卷积核的大小为 * ,输出的尺寸大小为 参数量 (1)不考虑bias:(2)考虑bias: FLOPs (1)不考虑bias 解释:先计算输出的中一个元素需要的计算量, ...
- Python | os.path.join() method
Python中的os.path.join()方法可以连接一个或多个路径组件. 此方法将各个路径组成部分,与每个非空部分路径组成部分恰好用一个目录分隔符(" /")连接起来. 如果要 ...
- signalR的身份认证
- Android复习(五)设备兼容—>多apk支持
1. 对于不同的屏幕发布单独的apk https://developer.android.google.cn/training/multiple-apks/screensize 2.多窗口模式 在An ...
- jenkins 配置flyway报错No value provided for placeholder expressions: ${name}
业务场景:使用flyway将一个数据库的变更同步到另一个数据库,数据同步到一半的时候报错 No value provided for placeholder expressions: ${name}. ...