Kernel Memory 中使用 PaddleSharp OCR

发布时间 2024-01-08 08:02:30作者: 宵伯特

Kernel Memory 中使用 PaddleSharp OCR

Kernel Memory 中进行文档处理的时候可以上传图片作为文档,这时候就需要使用到 OCR 技术来识别图片中的文字。

官方默认的库中,提供了 Azure Document Intelligence 的扩展服务,可以通过 Azure 的服务来进行 OCR。

方法也非常简单,只需要在构建 Kernel Memory 的时候,调用 WithAzureAIDocIntel 方法,提供相应的参数即可。

var _ = new KernelMemoryBuilder(appBuilder.Services)
    //...
    .WithAzureAIDocIntel(new AzureAIDocIntelConfig()) // <- register azure document intelligence
    .Build();

如果没有Azure 服务的话,也可以使用自定义的 OCR 服务,例如 PaddleSharp OCR。

实现自定义的 OCR 服务,需要实现 IOcrEngine 接口,该接口的定义相对比较简单,其中只有一个ExtractTextFromImageAsync方法。


public interface IOcrEngine
{
    Task<string> ExtractTextFromImageAsync(Stream imageContent, CancellationToken cancellationToken = default(CancellationToken));
}

使用 PaddleSharp 我们需要安装以下 Nuget 包:

Sdcb.PaddleInference
Sdcb.PaddleOCR
Sdcb.PaddleInference.runtime.win64.mkl
OpenCvSharp4.runtime.win
Sdcb.PaddleOCR.Models.Local

然后实现 IOcrEngine 接口:


    public class PaddleSharpOcrEngine(FullOcrModel model) : IOcrEngine
    {
        private readonly FullOcrModel _model = model;

        public async Task<string> ExtractTextFromImageAsync(Stream imageContent, CancellationToken cancellationToken = default)
        {
            using var all = new PaddleOcrAll(_model, PaddleDevice.Mkldnn());
            using var memoryStream = new MemoryStream();
            await imageContent.CopyToAsync(memoryStream);
            using Mat src = Cv2.ImDecode(memoryStream.ToArray(), ImreadModes.Color);
            PaddleOcrResult result = all.Run(src);
            return result.Text;
        }
    }

在构建 Kernel Memory 的时候,注册自定义的 OCR 服务:

var model = LocalFullModels.EnglishV3;
var memory = new KernelMemoryBuilder(appBuilder.Services)
    //...
    .AddSingleton<IOcrEngine>(new PaddleSharpOcrEngine(model))// <- register paddle ocr
    .Build();

注册完成之后,后续处理图片文件的过程中,就会自动调用 PaddleSharp OCR 服务了。

await memory.ImportDocumentAsync("./kernel_memory_readme.png");

var question = "What's Kernel Memory?";

var answer = await memory.AskAsync(question);

Console.WriteLine($"Q: {question}");
Console.WriteLine($"A: {answer.Result}");

Alt text

以上代码实现已经上传至 GitHub.

参考