C# PaddleOCR ch_PP-OCRv3 ch_PP-OCRv4测试

333 阅读1分钟

效果

未开启Onnx,V3

 未开启Onnx,V4

 开启Onnx,V3

 开启Onnx,V4

 项目

VS2022+.net 4.8+OpenCvSharp4

Sdcb.PaddleInference/2.5.0-preview.1

Sdcb.PaddleOCR/2.6.0.6-preview.1

代码

using OpenCvSharp;
using Sdcb.PaddleInference;
using Sdcb.PaddleOCR;
using Sdcb.PaddleOCR.Models;
using Sdcb.PaddleOCR.Models.Online;
using System;
using System.Drawing;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace OCRTest_V4
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
        }

        Bitmap bmp;
        string fileFilter = "*.*|*.bmp;*.jpg;*.jpeg;*.tiff;*.tiff;*.png";
        string img = "";

        DateTime dt1 = DateTime.Now;
        DateTime dt2 = DateTime.Now;

        StringBuilder sb = new StringBuilder();

        Mat src;

        FullOcrModel model_v3;
        PaddleOcrAll all_v3;

        FullOcrModel model_v4;
        PaddleOcrAll all_v4;

        bool OnnxOpen = false;

        private void button2_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = fileFilter;
            if (ofd.ShowDialog() != DialogResult.OK) return;

            pictureBox1.Image = null;

            img = ofd.FileName;
            bmp = new Bitmap(img);
            pictureBox1.Image = new Bitmap(img);
            textBox1.Text = "";

            src = Cv2.ImRead(img);
        }


        private void TestV4()
        {
            sb.Clear();
            dt1 = DateTime.Now;
            PaddleOcrResult result = all_v4.Run(src);
            dt2 = DateTime.Now;
            foreach (PaddleOcrResultRegion region in result.Regions)
            {
                sb.AppendLine($"Text: {region.Text}, Score: {region.Score}");
            }
            sb.AppendLine("------------------------------------");
            sb.AppendLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));
            sb.AppendLine("Open Onnx:" + OnnxOpen);
            sb.AppendLine("V4耗时:" + (dt2 - dt1).TotalMilliseconds + "ms");
            textBox1.Text = sb.ToString();
        }

        private void TestV3()
        {
            sb.Clear();
            dt1 = DateTime.Now;
            PaddleOcrResult result = all_v3.Run(src);
            dt2 = DateTime.Now;
            foreach (PaddleOcrResultRegion region in result.Regions)
            {
                sb.AppendLine($"Text: {region.Text}, Score: {region.Score}");
            }
            sb.AppendLine("------------------------------------");
            sb.AppendLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));
            sb.AppendLine("Open Onnx:" + OnnxOpen);
            sb.AppendLine("V3耗时:" + (dt2 - dt1).TotalMilliseconds + "ms");
            textBox1.Text = sb.ToString();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            TestV3();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            TestV4();
        }

        private void button4_Click(object sender, EventArgs e)
        {
            OnnxOpen = false;
            _ = Init();
            MessageBox.Show("ok");
        }

        async Task Init()
        {
            model_v3 = await OnlineFullModels.ChineseV3.DownloadAsync();
            all_v3 = new PaddleOcrAll(model_v3, PaddleDevice.Mkldnn());
            all_v3.AllowRotateDetection = true; /* 允许识别有角度的文字 */
            all_v3.Enable180Classification = false; /* 允许识别旋转角度大于90度的文字 */

            //model_v4 = await OnlineFullModels.ChineseV4.DownloadAsync();
            //all_v4 = new PaddleOcrAll(model_v4, PaddleDevice.Mkldnn());
            //all_v4.AllowRotateDetection = true; /* 允许识别有角度的文字 */
            //all_v4.Enable180Classification = false; /* 允许识别旋转角度大于90度的文字 */

            model_v4 = await OnlineFullModels.ChineseV4.DownloadAsync();
            all_v4 = new PaddleOcrAll(model_v4,
                    PaddleDevice.Mkldnn(),
                    PaddleDevice.Mkldnn(),
                    c =>
                    {
                        Sdcb.PaddleInference.Native.PaddleNative.PD_ConfigEnableONNXRuntime(c.UnsafeGetHandle());
                        Sdcb.PaddleInference.Native.PaddleNative.PD_ConfigEnableORTOptimization(c.UnsafeGetHandle());
                        // c.CpuMathThreadCount = 8;
                    });

            all_v4.AllowRotateDetection = true; /* 允许识别有角度的文字 */
            all_v4.Enable180Classification = false; /* 允许识别旋转角度大于90度的文字 */
        }

        private void button5_Click(object sender, EventArgs e)
        {
            OnnxOpen = true;
            _ = Init_Onnx();
            MessageBox.Show("ok");
        }

        async Task Init_Onnx()
        {
            model_v3 = await OnlineFullModels.ChineseV3.DownloadAsync();
            all_v3 = new PaddleOcrAll(model_v3,
                    c => Sdcb.PaddleInference.Native.PaddleNative.PD_ConfigEnableONNXRuntime(c.UnsafeGetHandle()),
                    PaddleDevice.Mkldnn(),
                    c => Sdcb.PaddleInference.Native.PaddleNative.PD_ConfigEnableONNXRuntime(c.UnsafeGetHandle()));

            all_v3.AllowRotateDetection = true; /* 允许识别有角度的文字 */
            all_v3.Enable180Classification = false; /* 允许识别旋转角度大于90度的文字 */

            model_v4 = await OnlineFullModels.ChineseV4.DownloadAsync();
            all_v4 = new PaddleOcrAll(model_v4,
                    c => Sdcb.PaddleInference.Native.PaddleNative.PD_ConfigEnableONNXRuntime(c.UnsafeGetHandle()),
                    PaddleDevice.Mkldnn(),
                    c => Sdcb.PaddleInference.Native.PaddleNative.PD_ConfigEnableONNXRuntime(c.UnsafeGetHandle()));

            all_v4.AllowRotateDetection = true; /* 允许识别有角度的文字 */
            all_v4.Enable180Classification = false; /* 允许识别旋转角度大于90度的文字 */
        }
    }
}

Demo下载