如何自己动手实现一个图片解答小助手

news/2024/10/9 11:46:37

有一张图片如下所示:

Kimi上有一个功能,就是解析图片内容,给出回答:

image-20241008185201298

这样可以用于拍照向AI提问的场景,我自己也有这方面的需求,因此动手实践了一下。

自己动手实现的效果如下所示:

image-20241008185722470

那么自己如何实现呢?

可以通过添加一个OCR的功能来实现。中文图片文字识别也就是OCR效果比较好的是百度开源的PaddleOCR,之前介绍过PaddleOCR的.NET绑定PaddleSharp,见这篇文章:C#使用PaddleOCR进行图片文字识别。

之前使用PaddleOCR的时候,我已经在电脑上安装了一个虚拟环境,因为需求比较简单,就是将图片进行文字识别之后返回文本就行了,因此今天玩个不一样的,不用.NET绑定,直接调用Python脚本就好了。

那么现在拆解任务就是:

C#如何调用Python脚本?

那么就先来试一下,最简单的调用,调用Python脚本输出一个Hello:

print("Hello")

可以使用 System.Diagnostics.Process 类来启动一个外部进程来运行Python脚本:

 string pythonScriptPath = @"D:\学习路线\人工智能\图片文字识别\test.py"; // 替换为你的Python脚本路径string pythonExecutablePath = @"D:\SoftWare\Anaconda\envs\paddle_env\python.exe"; // 替换为你的Python解释器路径                                                                                     ProcessStartInfo start = new ProcessStartInfo();start.FileName = pythonExecutablePath;start.Arguments =$"{pythonScriptPath}";start.UseShellExecute = false;start.RedirectStandardOutput = true;start.RedirectStandardError = true;start.CreateNoWindow = true;using (Process process = Process.Start(start)){using (System.IO.StreamReader reader = process.StandardOutput){string result = reader.ReadToEnd();MessageBox.Show(result);}using (System.IO.StreamReader errorReader = process.StandardError){string errors = errorReader.ReadToEnd();if (!string.IsNullOrEmpty(errors)){MessageBox.Show("Errors: " + errors);}}}      

其中ProcessStartInfo各属性的解释如下:

  1. FileName
    • 含义:指定要启动的程序或文档的名称。
    • 示例:在这里,pythonExecutablePath 是 Python 解释器的路径,如 "C:\path\to\python.exe"
  2. Arguments
    • 含义:指定传递给要启动程序的命令行参数。
    • 示例:在这里,pythonScriptPath 是你要执行的 Python 脚本的路径,如 "C:\path\to\hello.py"
  3. UseShellExecute
    • 含义:指定是否使用操作系统 shell 来启动进程。如果设置为 false,则直接启动进程;如果设置为 true,则通过 shell 启动进程。
    • 示例:在这里,设置为 false,表示不使用 shell 启动进程,而是直接启动 Python 解释器。
  4. RedirectStandardOutput
    • 含义:指定是否将子进程的标准输出重定向到 Process.StandardOutput 流。
    • 示例:在这里,设置为 true,表示将 Python 脚本的输出重定向到 Process.StandardOutput,以便你可以读取它。
  5. RedirectStandardError
    • 含义:指定是否将子进程的标准错误输出重定向到 Process.StandardError 流。
    • 示例:在这里,设置为 true,表示将 Python 脚本的错误输出重定向到 Process.StandardError,以便你可以读取它。
  6. CreateNoWindow
    • 含义:指定是否在新窗口中启动进程。如果设置为 true,则不会创建新窗口;如果设置为 false,则会创建新窗口。
    • 示例:在这里,设置为 true,表示不创建新窗口,即在后台运行 Python 脚本。

现在查看一下运行效果:

image-20241008191313678

获取到了Python脚本输出的值。

那么再拆解一下任务,我们需要在命令行中传入一个参数,该如何实现呢?

import sys# 检查是否有参数传递
if len(sys.argv) > 1:n = sys.argv[1]print(f"hello {n}")
else:print("请提供一个参数")

只需修改下图中,这两处地方即可:

image-20241008191639208

现在再来试下效果:

image-20241008191805671

成功在命令行中传入了一个参数。

那么现在我们的准备工作已经做好了。

PaddleOCR的使用脚本如下:

import sys
import logging
from paddleocr import PaddleOCR, draw_ocr# Paddleocr目前支持的多语言语种可以通过修改lang参数进行切换
# 例如`ch`, `en`, `fr`, `german`, `korean`, `japan`# 检查是否有参数传递
if len(sys.argv) > 1:imagePath = sys.argv[1]
else:print("请提供一个参数")# 配置日志级别为 WARNING,这样 DEBUG 和 INFO 级别的日志信息将被隐藏
logging.basicConfig(level=logging.WARNING)# 创建一个自定义的日志处理器,将日志输出到 NullHandler(不输出)
class NullHandler(logging.Handler):def emit(self, record):pass# 获取 PaddleOCR 的日志记录器
ppocr_logger = logging.getLogger('ppocr')# 移除所有默认的日志处理器
for handler in ppocr_logger.handlers[:]:ppocr_logger.removeHandler(handler)# 添加自定义的 NullHandler
ppocr_logger.addHandler(NullHandler())ocr = PaddleOCR(use_angle_cls=True, lang="ch")  # need to run only once to download and load model into memory
img_path = imagePath
result = ocr.ocr(img_path, cls=True)
for idx in range(len(result)):res = result[idx]   for line in res:print(line[1][0])

在vs code中运行效果如下所示:

image-20241008192131148

现在在WPF应用中调用结果如下:

image-20241009104512270

现在图片文字识别的部分已经搞定了。

现在就需要与大语言模型结合起来了,就是将识别出来的文字,丢给大语言模型。

可以这样写:

 public async IAsyncEnumerable<string> GetAIResponse4(string question, string imagePath){string pythonScriptPath = @"D:\学习路线\人工智能\图片文字识别\test.py"; // 替换为你的Python脚本路径string pythonExecutablePath = @"D:\SoftWare\Anaconda\envs\paddle_env\python.exe"; // 替换为你的Python解释器路径                                                                                         string arguments = imagePath; // 替换为你要传递的参数ProcessStartInfo start = new ProcessStartInfo();start.FileName = pythonExecutablePath;start.Arguments = $"{pythonScriptPath} {arguments}";start.UseShellExecute = false;start.RedirectStandardOutput = true;start.RedirectStandardError = true;start.CreateNoWindow = true;string result = "";using (Process process = Process.Start(start)){using (System.IO.StreamReader reader = process.StandardOutput){result = reader.ReadToEnd();                   }using (System.IO.StreamReader errorReader = process.StandardError){string errors = errorReader.ReadToEnd();if (!string.IsNullOrEmpty(errors)){MessageBox.Show("Errors: " + errors);}}}string skPrompt = """获取到的图片内容:{{$PictureContent}}。根据获取到的信息回答问题:{{$Question}}。                       """;await foreach (var str in _kernel.InvokePromptStreamingAsync(skPrompt, new() { ["PictureContent"] = result, ["Question"] = question })){yield return str.ToString();}}

就可以实现如下的效果了:

image-20241009104837084

全部代码可在https://github.com/Ming-jiayou/SimpleRAG看到。

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

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

相关文章

轻量虚拟机 multipass

multipass listmultipass info multipass shell 后续就可以 shell了

传奇霸业网页游戏单机版安装教程+GM后台+无需虚拟机

今天给大家带来一款单机游戏的架设:传奇霸业网页游戏。 另外:本人承接各种游戏架设(单机+联网) 本人为了学习和研究软件内含的设计思想和原理,带了架设教程仅供娱乐。教程是本人亲自搭建成功的,绝对是完整可运行的,踩过的坑都给你们填上了。如果你是小白也没问题,跟着教…

go抽象封装是一种简化认知的手段

通过 Kubernetes 看 Go 接口设计之道 原创 蔡蔡蔡菜 蔡蔡蔡云原生Go2024年10月01日 08:30 广东解耦依赖底层 在 Kubernetes 中能看到非常多通过接口对具体实现的封装。 Kubelet 实现了非常多复杂的功能,我们可以看到它实现了各种各样的接口,上层代码在使用的时候并不会直接实…

5.4 5.5

5.4 求解下列非线性规划:点击查看代码 import numpy as np from scipy.optimize import minimize def objective(x): return -np.sum(np.sqrt(x) * np.arange(1, 101)) def constraint1(x): return x[1] - 10 def constraint2(x): return 20 - (x[1] + 2*x[2]) def c…

升轨和降轨地表形变监测结果合成处理方法

一般情况下,InSAR处理得到的形变结果是视线方向形变(LOS)。在处理时候,输出结果可以选择垂直、坡向方向形变,甚至自定义方向上的形变,但这种结果往往是通过简单的勾股弦方式计算得到,理论精度不是很可靠。要想得到更精确的垂直向形变,甚至水平向(东西向、南北向)形变…

无线电通信卡:9-基于DSP TMS320C6678+FPGA XC7V690T的6U VPX信号处理卡

6U 6槽 VPX , AI加速计算 , 板 ,GPU计算主 图像处理卡 , 无线电通信一、概述 本板卡基于标准6U VPX 架构,为通用高性能信号处理平台,系我公司自主研发。板卡采用一片TI DSP TMS320C6678和一片Xilinx公司Virtex 7系列的FPGA XC7V690T-2FFG1761I作为主处理器,Xilinx 的Aritex …

vue 前端导出 excel

npm install xlsx-js-style import XLSX from xlsx-js-style;//导出数据 exportD(title,data,fileName){ title=["标题1","标题2","标题3","标题4","标题5","标题6"]; data=[["数据1…

[智能网联汽车/数据标准/法规政策] 标准解读:GB/T 44464-2024《汽车数据通用要求》

0 引言随着智能技术的不断发展,智能网联汽车作为新时代移动智能终端的代表,正引领着汽车产业向智能化、网联化深刻转型与升级。智能网联汽车与云端服务器、移动端、车端等设备存在大量的数据交互,包括车辆运行数据、用户个人信息等。缺乏对这些数据实施的有效监管与控制,将…