Kernel Memory 中使用 PaddleSharp OCR

Kernel Memory 中使用 PaddleSharp OCR

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

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

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

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

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

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

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

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

markdown 复制代码
Sdcb.PaddleInference
Sdcb.PaddleOCR
Sdcb.PaddleInference.runtime.win64.mkl
OpenCvSharp4.runtime.win
Sdcb.PaddleOCR.Models.Local

然后实现 IOcrEngine 接口:

csharp 复制代码
    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 服务:

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

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

csharp 复制代码
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}");

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

参考