使用KernelMemory与Sdcb.OpenVINO打造AntSK的离线OCR知识导入

        随着数字化信息的爆炸式增长,机器视觉技术和自然语言处理技术在信息获取与处理中扮演着越来越重要的角色。今天,我们来谈谈在.Net环境下如何利用Sdcb.OpenVINO打造一个高效稳定的离线OCR功能,并将其集成到我们的知识库项目AntSK中。

AntSK知识库与OCR的结缘

        AntSK作为一个内容丰富的知识库项目,已经支持文本、PDF和Excel等多种格式的知识内容导入。为了提升用户体验,丰富内容的接入形式,我们决定引入图片内容的处理能力。在这里,OCR技术的加入显得尤为关键。

        但是,OCR技术的实现充满挑战。它不仅要求高准确率,而且需要适应不同的操作系统和环境。面对这一挑战,我们选择使用周杰大佬提供的Sdcb.OpenVINO这一强大的工具包提供OCR服务。

https://github.com/sdcb/openvino.net

KM与OCR:实现透明高效集成

        KM提供了一个十分优雅的OCR抽象层,使得OCR功能的集成变得十分简洁。通过以下代码即可实现:

new KernelMemoryBuilder().WithCustomImageOcr(new AntSKOcrEngine());

        在创建KernelMemoryBuilder的实现时,我们使用WithCustomImageOcr方法将自定义的OCR功能注入KM。而这个自定义OCR功能就是我们即将深入探讨的AntSKOcrEngine

Sdcb.OpenVINO的选择及配置

        在我们的OCR实现中,Sdcb.OpenVINO扮演了重要的角色。以下是所需的依赖包清单:

<PackageReference Include="Microsoft.KernelMemory.Core" Version="0.35.240321.1" />
<PackageReference Include="OpenCvSharp4.runtime.win" Version="4.9.0.20240103" />
<PackageReference Include="Sdcb.OpenCvSharp4.mini.runtime.debian.12-x64" Version="4.8.0.20231125" />
<PackageReference Include="Sdcb.OpenVINO" Version="0.6.4" />
<PackageReference Include="Sdcb.OpenVINO.PaddleOCR.Models.Online" Version="0.6.2" />
<PackageReference Include="Sdcb.OpenVINO.PaddleOCR" Version="0.6.3" />
<PackageReference Include="Sdcb.OpenVINO.runtime.ubuntu.22.04-x64" Version="2024.0.0" />
<PackageReference Include="Sdcb.OpenVINO.runtime.win-x64" Version="2024.0.0" />

        引入这些依赖旨在兼容Windows和容器环境(比如debian),确保不同平台下的顺畅运行。

AntSKOcrEngine:简洁强大的OCR实现

        下面,让我们一同走进AntSKOcrEngine的内部实现。核心代码如下:


public class AntSKOcrEngine : IOcrEngine
{
    FullOcrModel model;
    public Task<string> ExtractTextFromImageAsync(Stream imageContent, CancellationToken cancellationToken = default)
    {
        try
        {
            if (model == null)
            {
                model = OnlineFullModels.ChineseV4.DownloadAsync().Result;
            }
            using (PaddleOcrAll all = new(model)
            {
                AllowRotateDetection = true,
                Enable180Classification = true,
            })
            {
                Mat src = Cv2.ImDecode(StreamToByte(imageContent), ImreadModes.Color);
                PaddleOcrResult result = all.Run(src);
                return Task.FromResult(result.Text);
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
            return Task.FromResult("");
        }
    }

    private byte[] StreamToByte(Stream stream)
    {
        using (var memoryStream = new MemoryStream())
        {
            byte[] buffer = new byte[1024]; //自定义大小,例如 1024
            int bytesRead;
            while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0)
            {
                memoryStream.Write(buffer, 0, bytesRead);
            }
            byte[] bytes = memoryStream.ToArray();
            return bytes;
        }
    }
}

        在这个AntSKOcrEngine中,我们实现了IOcrEngine接口,并定义了ExtractTextFromImageAsync方法来处理图片的文本提取任务。采用Sdcb.OpenVINO中的PaddleOCR模型进行实际的OCR处理,能够自动检测图像角度并进行矫正,保证了高准确率的文本识别。

兼容性与部署:跨环境运行的保障

        在部署到debian容器环境时,必须安装相关的依赖:

apt update && apt install -y libpugixml-dev libtbb-dev

        这些依赖对OpenVINO的运行至关重要,因此不可忽视。

AntSK集成OCR:效果显著

        整合OCR技术后,AntSK在处理jpeg、png、tiff等格式的图片内容时显得游刃有余。文本的提取变得既快速又准确,大大提升了知识库的使用便利性,并拓宽了其应用场景。

        开启OCR以后我们就可以正常导入图片类型的文件啦!

结语

        OCR技术的集成是知识库建设过程中的一次重大升级。在.Net环境下,利用KM的强大整合能力和Sdcb.OpenVINO的高效OCR实现,AntSK知识库项目成功迈出了将非结构化图片内容转化为可用信息的重要一步。面向企业和个人用户,我们相信AntSK的升级将为他们带来更加丰富和便捷的知识管理体验。

https://github.com/AIDotNet/AntSK

        以上是我们今天要分析和讨论的内容。感谢大家的阅读,欢迎大家在评论区交流自己的看法或经验。同时,如果你有兴趣探索更多.Net开发技术或人工智能应用,请继续关注我们的公众号。未来,我们将带来更多前沿的技术分享,助你走在技术变革的最前沿。

同时也欢迎大家关注公众号《许泽宇的技术分享》发送“进群” 加入我们的AI交流群

  • 10
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
sdcb.rotationdetector 是一个用于检测设备旋转的功能。在移动设备中,我们可以通过检测设备的旋转来实现一些相应的界面布局或功能调整。 sdcb.rotationdetector 提供了一些函数和方法,可以帮助我们获取设备的旋转角度或方向。通过调用这些函数,我们可以根据设备的旋转状态来调整界面的布局和显示。 例如,在一个横屏和竖屏切换的应用程序中,我们可以使用 sdcb.rotationdetector 来检测设备的旋转状态。当设备从竖屏转为横屏时,我们可以重新布局界面,以适应更宽的显示区域。反之,当设备从横屏转为竖屏时,我们可以根据界面的需要进行相应的调整。 sdcb.rotationdetector 还可以用于游戏开发中。在一些需要依赖设备旋转的游戏中,我们可以使用该功能来监测用户旋转设备的动作,然后根据不同的旋转方向进行相应的游戏操作。 除了以上的用例,sdcb.rotationdetector 还可以用于其他领域,如AR(增强现实)应用。当用户在使用AR应用时,sdcb.rotationdetector 可以帮助我们检测设备旋转的角度和方向,从而提供更加准确和逼真的AR体验。 总之,sdcb.rotationdetector 是一个非常有用的功能,可以帮助我们根据设备的旋转状态来调整界面布局和实现一些功能。通过使用 sdcb.rotationdetector,我们可以提升用户体验,并为开发者提供更多的可能性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

许泽宇的技术分享

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值