NET环境使用PaddleSharp的入门Demo-WebAPI

1、背景

在上一篇文章中《NET环境使用PaddleSharp的入门Demo-控制台》,以控制台的方式实现的,但是在实际工作中,不是每台电脑都有GPU或较高性能的CPU,因此在服务端提供API的接口,供客户端调用,是比较可行的。

2、具体实现

1、整个项目的目录文件

2、安装的package

安装的package如上图所示

3、appsettings.json的设置

csharp 复制代码
{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "PaddleDevice": "CPU"
}

4、在Program中以单例模式注册

csharp 复制代码
// Add services to the container.
builder.Services.AddSingleton(s => {
    Action<PaddleConfig> device =
    builder.Configuration["PaddleDevice"] == "GPU"
    ? PaddleDevice.Gpu()
    : PaddleDevice.Mkldnn();

    return new QueuedPaddleOcrAll(
        ()=>new PaddleOcrAll(LocalFullModels.ChineseV5,device)
        {
            Enable180Classification= true,
            AllowRotateDetection= true
        },
        consumerCount:1  //这个参数是指能进行的最大并发数,若资源充足,可调整增大
        );

});

5、在Controller中注册及实现

csharp 复制代码
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using OpenCvSharp;
using PaddleOCRAPI.Models;
using Sdcb.PaddleOCR;

namespace PaddleOCRAPI.Controllers
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class OCRTestController : ControllerBase
    {
        private readonly QueuedPaddleOcrAll _ocr;

        public OCRTestController(QueuedPaddleOcrAll queuedPaddleOcrAll)
        {
            _ocr = queuedPaddleOcrAll;
        }

        [HttpPost]
        public async Task<OcrResponse> Ocr(IFormFile file)
        {
            using MemoryStream ms = new();
            using Stream stream=file.OpenReadStream();
            stream.CopyTo(ms);

            using Mat src = Cv2.ImDecode(ms.ToArray(), ImreadModes.Color);
            PaddleOcrResult result = await _ocr.Run(src);

            return new OcrResponse
            {
                Text = result.Text,
                Regions = result.Regions
            };
        }
    }
}

6、设置返回结果OcrResponse.cs。返回的可以是string,也可以是其他的内容。此处自定义了一个类,用于包装返回结果

csharp 复制代码
using Sdcb.PaddleOCR;

namespace PaddleOCRAPI.Models
{
    public class OcrResponse
    {
        public string? Text { get; set; } 
        public PaddleOcrResultRegion[]? Regions { get; set; }
    }
}

7、测试

运行程序,使用postman进行测试

3、总结

1、还是非常适合作为整个项目的基础功能,赋能各业务系统

2、这个PaddleSharp是针对图片的OCR识别,那PDF如何识别呢?可以搜索PDFtoImage,非常简单,直接调用其静态方法既可