C# PaddleOCR ch_PP-OCRv3 ch_PP-OCRv4测试

news2024/9/17 7:43:42

效果

未开启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下载 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/729979.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spark—通过Java、Scala API实现WordCount案例的基本操作

实验原理 Spark的核心就是RDD,所有在RDD上的操作会被运行在Cluster上,Driver程序启动很多Workers,Workers在(分布式)文件系统中读取数据后转化为RDD(弹性分布式数据集),然后对RDD在…

Centos7编译安装ffmpeg

1、准备工作,安装必要的环境 yum install autoconf automake bzip2 cmake freetype-devel gcc gcc-c git libtool make mercurial pkgconfig zlib-devel 2、创建目录 ffmpeg_sources 目录是下载软件包的目录 ffmpeg 目录是安装目录 mkdir /usr/local/ffmpeg_sour…

库表实验操作

目录 1、创建数据库Market,在 Market中创建数据表customers。​编辑 2、在Market中创建数据表orders。 3、创建数据库Team,定义数据表player。 1、创建数据库Market,在 Market中创建数据表customers。 (1)mysql>…

CentOS7下安装设置MySQL

CentOS7下安装设置MySQL 1.下载MySQL 1.1下载安装MySQL官方yum源配置 wget http://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm 1.2yum下安装MySQL yum -y install mysql57-community-release-el7-11.noarch.rpm 1.3安装MySQL服务器 yum -y install mysq…

一文讲解Linux上部署Web项目(war包)

一文讲解Linux上部署Web项目(war包) 生成war包 ​ 首先,我们要先将Web项目打成war包 ​ 连接Linux服务器 ​ 这里我们通过SSH客户端,连接远程Linux服务器,需要提前知道Linux的IP地址、登录用户名、密码等&#x…

zabbix基础5——screen屏幕展示、主机模板的使用、用户权限设置

文章目录 一、screen1.1 zabbix屏幕展示1.2 screen命令 二、zabbix模板2.1 创建模板2.2 复制模板2.3 模板导出2.4 模板删除2.5 模板导入 三、主机和主机组3.1 添加主机组3.2 导出主机模板3.3 导入主机模板 四、用户和用户组4.1 创建用户组4.2 创建用户4.3 用户权限设置 一、scr…

ETHERNET/IP 转ETHERCAT连接ethercat总线伺服如何控制

远创智控YC-EIP-ECT网关连接到ETHERNET/IP总线中做为从站使用,连接到ETHERCAT总线中做为从站使用,可以同时满足多种工业生产的需求。支持广泛的设备类型,可以和多种不同的设备进行通讯。 技术参数 ETHERNET/IP 技术参数 ● 网关做为 ETHERN…

LeetCode 方法整理(部分更新中)

1、迭代,链表反转 listNode prev null, next, curr head; while (curr ! null) {next curr.next;curr.next prev;curr next;prev curr;curr next; } return prev;2、递归,链表反转 /*// 两个节点时 head.next.next head; head.next…

苹果手机怎么设置日程安排提醒闹钟?简单几步

在忙碌的工作和生活中,我们经常会忘记重要的约会、会议和任务。这时候,一个可靠的日程提醒闹钟就显得尤为重要了。通过在手机上设置日程安排提醒闹钟,让我们不再错过任何重要的事情。 那么苹果手机怎么设置日程安排提醒闹钟? 敬…

硬件电路设计--运算放大器(一)参数和分类

文章目录 前言一、运放分类1.1 功能分类1.2 按单颗IC封装1.3 第一脚的判断 二、运放参数2.1 理想运放2.2 实际运放2.3 数据手册中的重要参数2.3.1 供电电压Vs(power supply)2.3.2 虚短虚断2.3.3 输入偏置电流Ib2.3.4 噪声Vn2.3.5 静态电流IQ2.3.6 输入失…

用户端Web测试方法与技术

目录: WEB 测试概念WEB 测试的价值WEB 测试学习路线WEB 基础知识html讲解javascript讲解css讲解web项目测试流程web测试设计思路web端常见bug解析Litemall购物车功能测试用例设计浏览器开发者工具web兼容测试策略Litemall购物车功能测试执行 1.WEB 测试概念 WEB…

【InnoDB 存储引擎】5.4.5 The Slow Query Log(慢日志实验)

文章目录 1 慢日志实验环境准备2 开始实验2.1 实验 1:超过查询时间相关慢日志并观察2.2 实验 2:不使用索引相关慢日志并观察2.3 实验 3:打印额外的慢日志信息2.4 实验 4:使用 mysqldumpslow 工具分析日志文件2.5 实验 5&#xff1…

《UNUX环境高级编程》(7)进程环境

1、引言 2、main函数 main函数的原型/*argc是命令行参数的数目,argv是指向各个指针所构成的数组*/ int main(int argc,char *argv[]);3、进程终止 有八种方式使进程终止。其中5种是正常,它们是: 从main函数返回调用exit调用_exit或_Exit最后…

看一看LRU与LFU

LRU(Least recently used:最近最少使用)和LFU(Least frequently used:最不经常使用),两个都是以链表结构为基础,一般是作为缓存使用,当然,既然是缓存&#xf…

第六章:L2JMobius学习 – 源码讲解网络数据通信

本章节介绍客户端和服务器端的网络数据通信,使用的技术是Java NIO(也就是套接字Socket)。服务器端和客户端使用Socket通信的原因在于,它是双向的,持久的。也就是说,服务器端可以随时的向客户端发送数据&…

Tomcat7部署war包getshell 漏洞复现

为方便您的阅读,可点击下方蓝色字体,进行跳转↓↓↓ 01 漏洞描述02 验证方式03 利用方式04 修复方案 01 漏洞描述 Tomcat支持在后台部署war文件,可以直接将webshell部署到web目录下。其中,欲访问后台,需要对应用户有相…

pycharm如何给一串中文快捷加引号(方法一)

点击上方“Python爬虫与数据挖掘”,进行关注 回复“书籍”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 门前冷落鞍马稀,老大嫁作商人妇。 大家好,我是皮皮。 一、前言 前几天在Python白银群【此类生物】问了一个Pycharm基础的问题&a…

Linux文件管理常用命令补充

(该图由AI绘制 关注我 学习AI画图) 目录 一、查看文件内容 more分屏显示文件内容(了解) less分屏显示文件内容(重点) 二、文件统计命令 1、wc命令 2、du命令 三、文件处理命令 1、find命令 2、gr…

unity相机视角平移一段距离

using System.Collections; using System.Collections.Generic; using UnityEngine;public class ControlCamera : MonoBehaviour {//相机视角焦点平移一段距离//需求 相机视角 内的3D对象A 在视角内平移到屏幕C点 public Vector3 InitCameraPos;// Start is called be…

代码随想录算法训练营第十一天 | 二叉树系列2

二叉树系列2 101 对称二叉树二叉树很重要的一点:确定遍历顺序关于递归代码随想录的代码我的代码(理解后编写) 100 相同的树我的代码 572 另一个树的子树我的代码录友的代码,只用递归!!! 104 二叉树的最大深度重点代码随…