https://mp.weixin.qq.com/s/N_P8ziqdlT3lSYloNLcKeg

https://github.com/AIDotNet/AntSK

随着数字化信息的爆炸式增长,机器视觉技术和自然语言处理技术在信息获取与处理中扮演着越来越重要的角色。今天,我们来谈谈在.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

文档更新时间: 2024-04-12 06:48   作者:admin