前言

上一篇文章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任务的示例的更多相关文章

  1. 在Web.Config文件中使用configSource,避免动态修改web.config导致asp.net重启(另添加一个Config文件用于管理用户数据)

    原文:在Web.Config文件中使用configSource,避免动态修改web.config导致asp.net重启(另添加一个Config文件用于管理用户数据) 我们都知道,在asp.net中修改 ...

  2. 自己封装的一个js方法用于获取显示的星期和日期时间

    自己封装的一个js方法用于获取显示的星期和日期时间 /** * 获取用于显示的星期和日期时间 * @param date * @returns {string} */ function getWeek ...

  3. 写一个 setter 方法用于完成 @property (nonatomic, retain) NSString *name,

    写一个 setter 方法用于完成 @property (nonatomic, retain) NSString *name 写一个 setter 方法用于完成 @property (nonatomi ...

  4. 实现一个名为Person的类和它的子类Employee,Manager是Employee的子类,设计一个方法add用于涨工资,普通员工一次能涨10%,经理能涨20%。

    1.实现一个名为Person的类和它的子类Employee,Manager是Employee的子类,设计一个方法add用于涨工资,普通员工一次能涨10%,经理能涨20%.具体要求如下:(1)Perso ...

  5. Python之小测试:用正则表达式写一个小爬虫用于保存贴吧里的所有图片

    很简单的两步: 1.获取网页源代码 2.利用正则表达式提取出图片地址 3.下载 #!/usr/bin/python #coding=utf8 import re # 正则表达式 import urll ...

  6. eShopOnContainers 是一个基于微服务的.NET Core示例框架

    找到一个好的示例框架很难,但不是不可能.大多数是小型Todo风格的应用程序,通常基于SimpleCRUD.值得庆幸的是,Microsoft已经为eShopOnContainers创建了一个基于微服务的 ...

  7. 腾讯云技术专家卢萌凯手把手教你Demo一个人脸识别程序!

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文来自腾讯云技术沙龙,本次沙龙主题为Serverless架构开发与SCF部署实践 卢萌凯:毕业于东南大学,曾就职于华为,熟悉云行业解决方案 ...

  8. IOS开发之小实例--创建一个简单的用于视频录制和回放的应用程序

    前言:还是看了一下国外的入门IOS文章:<Create a Simple App for Video Recording and Playback>,主要涉及视频录制和回放的功能的基本实现 ...

  9. Android学习小Demo一个显示行线的自定义EditText

    今天在处理一个EditText的时候,想着把EditText做成像一本作业本上的纸一样,每一行都可以由线条隔开,具体效果如下: 1)最开始的思路 一开始的想法是很简单的,找出每一行的高度,然后一行一行 ...

  10. ios进度条Demo一个

    一个很简单的Dmo.就拿出来分享一下. 一个简单的阴影效果 _progressView.frame = CGRectMake(size.width * progress-size.width, H_H ...

随机推荐

  1. SQL SERVER (MSSQL) 学习笔记 性能

    refer: 看懂SqlServer查询计划 How do I identify slow queries in sql server? join operator, hash, merge, nes ...

  2. GPT最佳实践:五分钟打造你自己的GPT

    前几天OpenAI的My GPTs栏目还是灰色的,就在今天已经开放使用了.有幸第一时间体验了一把生成自己的GPT,效果着实惊艳!!!我打造的GPT模型我会放到文章末尾,大家感兴趣也可以自己体验一下. ...

  3. Nuxt Kit 中的布局管理

    title: Nuxt Kit 中的布局管理 date: 2024/9/18 updated: 2024/9/18 author: cmdragon excerpt: 摘要:本文详述了在Nuxt.js ...

  4. 基于 Session 实现短信登录

    短信验证 一.基于Session 1.登录流程 1)发送验证码 用户在提交手机号后,会校验手机号是否合法,如果不合法,则要求用户重新输入手机号 如果手机号合法,后台此时生成对应的验证码,同时将验证码进 ...

  5. HTTP——简介

    HTTP   

  6. 可持久化线段————主席树(洛谷p3834)

    洛谷P3834 可持久化线段树 2 问题描述: 给定n各整数构成的序列,求指定区间[L,R]内的第k小值(求升序排序后从左往右数第k个整数的数值) 输入: 第一行输入两个整数n,m,分别代表序列长度n ...

  7. [OI] 二项式期望 DP

    OSU OSU yet Another OSU yet yet Another OSU OSU 的题目是这样的:有一些相邻的块,给定每一个块的联通概率,每个连通块对答案有 \(size^{3}\) 的 ...

  8. vsphere8.0 VCenter部署

    一.vCenter Server 介绍 vCenter Server是VMware提供的一种集中管理平台,用于管理和监控虚拟化环境中的虚拟机.主机.存储和网络等资源.它提供了一套功能强大的工具和界面, ...

  9. emmc寿命

    EMMC器件寿命 1)先确认EMMC器件NAND FLASH类型,是MLC还是TLC,一般是TLC,器件手册标称1000-3000次,取平均值2000次作为评估: 2)在OS下查看EMMC器件当前使用 ...

  10. 将一个Eigen::Matrix中的数据(数组格式),按行写入到json文件当中.

    1.这里主要实现如何以数组的形式写入到json文件当中,因为c++的Jsoncpp库中的.append只支持一个字符的写入(还是python的json友好).去网上找了老久的解决办法,发现中文解答全是 ...