C# OpenCvSharp DNN 实现百度网盘AI大赛-表格检测第2名方案第三部分-表格方向识别

目录

说明

效果

模型

项目

​编辑

代码

参考

下载

其他


说明

百度网盘AI大赛-表格检测的第2名方案。

该算法包含表格边界框检测、表格分割和表格方向识别三个部分,首先,ppyoloe-plus-x 对边界框进行预测,并对置信度较高的表格边界框(box)进行裁剪。裁剪后的单个表格实例会送入到DBNet中进行语义分割,分割结果通过opencv轮廓处理获得表格关键点(point)。之后,我们根据DBNet计算的关键点在裁剪后的单个表格实例上绘制表格边界。最后,PP-LCNet结合表格边界先验和表格实例图像,对表格的方向进行预测,并根据之前定义的几何轮廓点与语义轮廓点的对应关系,将几何轮廓点映射为语义轮廓点。

本文使用C# OpenCvSharp DNN 实现百度网盘AI大赛-表格检测第2名方案第三部分-表格方向识别

效果

模型

Model Properties
-------------------------
---------------------------------------------------------------

Inputs
-------------------------
name:input
tensor:Float[-1, 3, 624, 624]
---------------------------------------------------------------

Outputs
-------------------------
name:linear_1.tmp_1
tensor:Float[-1, 4]
---------------------------------------------------------------

项目

代码

using OpenCvSharp;
using OpenCvSharp.Dnn;
using System;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;

namespace OpenCvSharp_DNN_Demo
{
    public partial class frmMain : Form
    {
        public frmMain()
        {
            InitializeComponent();
        }

        string fileFilter = "*.*|*.bmp;*.jpg;*.jpeg;*.tiff;*.tiff;*.png";
        string image_path = "";
        string startupPath;
        string classer_path;

        DateTime dt1 = DateTime.Now;
        DateTime dt2 = DateTime.Now;
        string model_path;
        Mat image;

        Mat result_mat;
        Mat result_image;
        Mat result_mat_to_float;

        Net opencv_net;
        Mat BN_image;

        float[] result_array;

        int max_image_length;
        Mat max_image;
        Rect roi;

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

            pictureBox1.Image = null;
            pictureBox2.Image = null;
            textBox1.Text = "";

            image_path = ofd.FileName;
            pictureBox1.Image = new Bitmap(image_path);
            image = new Mat(image_path);
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            string model_path = "model/paddle_cls.onnx";
            opencv_net = CvDnn.ReadNetFromOnnx(model_path);

            image_path = "test_img/1.jpg";
            pictureBox1.Image = new Bitmap(image_path);

        }

        private unsafe void button2_Click(object sender, EventArgs e)
        {
        
            if (image_path == "")
            {
                return;
            }

            if (image_path == "")
            {
                return;
            }
            textBox1.Text = "检测中,请稍等……";
            pictureBox2.Image = null;
            Application.DoEvents();

            Mat image = new Mat(image_path);

            //缩放图片
            max_image_length = image.Cols > image.Rows ? image.Cols : image.Rows;
            max_image = Mat.Zeros(new OpenCvSharp.Size(max_image_length, max_image_length), MatType.CV_8UC3);
            roi = new Rect(0, 0, image.Cols, image.Rows);
            image.CopyTo(new Mat(max_image, roi));

            //数据归一化处理
            BN_image = CvDnn.BlobFromImage(max_image, 1 / 255.0, new OpenCvSharp.Size(624, 624), new Scalar(0, 0, 0), true, false);

            //配置图片输入数据
            opencv_net.SetInput(BN_image);

            dt1 = DateTime.Now;
            //模型推理,读取推理结果
            result_mat = opencv_net.Forward();
            dt2 = DateTime.Now;

            //将推理结果转为float数据类型
            result_mat_to_float = new Mat(1, 4, MatType.CV_32F, result_mat.Data);

            //将数据读取到数组中
            result_mat_to_float.GetArray<float>(out result_array);

            float max = result_array.Max(); // 
            int maxIndex = Array.IndexOf(result_array, max); // 获取最大值的索引位置
            //语义左上角位于几何左上角,定义为0;
            //语义左上角位于几何右上角,定义为1;
            //语义左上角位于几何右下角,定义了2;
            //语义左上角位于几何左下角,定义为3。
            
            textBox1.Text = "推理耗时:" + (dt2 - dt1).TotalMilliseconds + "ms\r\n";
            string msg = "";
            if (maxIndex == 0) {
                msg = "语义左上角位于几何左上角";
            }
            else if (maxIndex == 1)
            {
                msg = "语义左上角位于几何右上角";
            }
            else if (maxIndex == 2)
            {
                msg = "语义左上角位于几何右下角";
            }
            else if (maxIndex == 3)
            {
                msg = "语义左上角位于几何左下角";
            }
            textBox1.Text += "\r\n" + msg;
        }

        private void pictureBox2_DoubleClick(object sender, EventArgs e)
        {
            Common.ShowNormalImg(pictureBox2.Image);
        }
        
        private void pictureBox1_DoubleClick(object sender, EventArgs e)
        {
            Common.ShowNormalImg(pictureBox1.Image);
        }
    }
}
 

using OpenCvSharp;
using OpenCvSharp.Dnn;
using System;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;

namespace OpenCvSharp_DNN_Demo
{
    public partial class frmMain : Form
    {
        public frmMain()
        {
            InitializeComponent();
        }

        string fileFilter = "*.*|*.bmp;*.jpg;*.jpeg;*.tiff;*.tiff;*.png";
        string image_path = "";
        string startupPath;
        string classer_path;

        DateTime dt1 = DateTime.Now;
        DateTime dt2 = DateTime.Now;
        string model_path;
        Mat image;

        Mat result_mat;
        Mat result_image;
        Mat result_mat_to_float;

        Net opencv_net;
        Mat BN_image;

        float[] result_array;

        int max_image_length;
        Mat max_image;
        Rect roi;

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

            pictureBox1.Image = null;
            pictureBox2.Image = null;
            textBox1.Text = "";

            image_path = ofd.FileName;
            pictureBox1.Image = new Bitmap(image_path);
            image = new Mat(image_path);
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            string model_path = "model/paddle_cls.onnx";
            opencv_net = CvDnn.ReadNetFromOnnx(model_path);

            image_path = "test_img/1.jpg";
            pictureBox1.Image = new Bitmap(image_path);

        }

        private unsafe void button2_Click(object sender, EventArgs e)
        {
        
            if (image_path == "")
            {
                return;
            }

            if (image_path == "")
            {
                return;
            }
            textBox1.Text = "检测中,请稍等……";
            pictureBox2.Image = null;
            Application.DoEvents();

            Mat image = new Mat(image_path);

            //缩放图片
            max_image_length = image.Cols > image.Rows ? image.Cols : image.Rows;
            max_image = Mat.Zeros(new OpenCvSharp.Size(max_image_length, max_image_length), MatType.CV_8UC3);
            roi = new Rect(0, 0, image.Cols, image.Rows);
            image.CopyTo(new Mat(max_image, roi));

            //数据归一化处理
            BN_image = CvDnn.BlobFromImage(max_image, 1 / 255.0, new OpenCvSharp.Size(624, 624), new Scalar(0, 0, 0), true, false);

            //配置图片输入数据
            opencv_net.SetInput(BN_image);

            dt1 = DateTime.Now;
            //模型推理,读取推理结果
            result_mat = opencv_net.Forward();
            dt2 = DateTime.Now;

            //将推理结果转为float数据类型
            result_mat_to_float = new Mat(1, 4, MatType.CV_32F, result_mat.Data);

            //将数据读取到数组中
            result_mat_to_float.GetArray<float>(out result_array);

            float max = result_array.Max(); // 
            int maxIndex = Array.IndexOf(result_array, max); // 获取最大值的索引位置
            //语义左上角位于几何左上角,定义为0;
            //语义左上角位于几何右上角,定义为1;
            //语义左上角位于几何右下角,定义了2;
            //语义左上角位于几何左下角,定义为3。
            
            textBox1.Text = "推理耗时:" + (dt2 - dt1).TotalMilliseconds + "ms\r\n";
            string msg = "";
            if (maxIndex == 0) {
                msg = "语义左上角位于几何左上角";
            }
            else if (maxIndex == 1)
            {
                msg = "语义左上角位于几何右上角";
            }
            else if (maxIndex == 2)
            {
                msg = "语义左上角位于几何右下角";
            }
            else if (maxIndex == 3)
            {
                msg = "语义左上角位于几何左下角";
            }
            textBox1.Text += "\r\n" + msg;
        }

        private void pictureBox2_DoubleClick(object sender, EventArgs e)
        {
            Common.ShowNormalImg(pictureBox2.Image);
        }
        
        private void pictureBox1_DoubleClick(object sender, EventArgs e)
        {
            Common.ShowNormalImg(pictureBox1.Image);
        }
    }
}

参考

https://github.com/hpc203/TableDetection

下载

源码下载

其他

C# OpenCvSharp DNN 第一部分-表格边界框检测-CSDN博客

C# OnnxRuntime 第二部分-表格分割-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

智源研究院与腾讯达成战略合作,推动大模型技术前沿探索和应用落地

2024 年 12 月 18日&#xff0c; 智源研究院与腾讯签署战略合作协议&#xff0c;双方将在大模型研发、人工智能技术前沿探索及开源生态建设等领域展开深入合作。智源研究院院长王仲远、副院长兼总工程师林咏华&#xff0c;腾讯集团高级执行副总裁、云与智慧产业事业群总裁汤道生…

C++特殊类设计(单例模式等)

目录 引言 1.请设计一个类&#xff0c;不能被拷贝 2. 请设计一个类&#xff0c;只能在堆上创建对象 为什么设置实例的方法为静态成员呢 3. 请设计一个类&#xff0c;只能在栈上创建对象 4. 请设计一个类&#xff0c;不能被继承 5. 请设计一个类&#xff0c;只能创建一个对…

[SAP ABAP] ALV报表练习1

销售订单明细查询报表 业务目的&#xff1a;根据选择屏幕的筛选条件&#xff0c;使用 ALV 报表&#xff0c;显示销售订单详情 效果展示 用户的输入条件界面 用户的查询结果界面(部分截图) 完整代码如下所示 主程序(zsd001_437) *&----------------------------------…

Docker日志与监控

一、引言 随着容器技术在生产环境中被广泛应用&#xff0c;Docker容器的日志管理与监控变得尤为重要。在现代应用程序中&#xff0c;容器化的应用通常是由多个容器组成的服务&#xff0c;而容器中的日志与监控则是确保服务健康运行、诊断问题和优化性能的关键。通过日志和监控…

信号槽【QT】

文章目录 对象树字符集信号槽QT坐标系信号与槽connect自定义槽自定义信号disconnect 对象树 #ifndef MYLABEL_H #define MYLABEL_H#include<QLabel> class MyLabel : public QLabel { public:// 构造函数使用带 QWidget* 版本的.// 确保对象能够加到对象树上MyLabel(QWi…

3.zabbix中文设置

1、zabbix中文设置 2、中文乱码的原因 zabbix使用DejaVuSan.ttf字体&#xff0c;不支持中文&#xff0c;导致中文出现乱码。解决方法很简单&#xff0c;把我们电脑里面字体文件传到zabbix服务器上。 3、解决zabbix乱码方法 3.1、从Window服务器找到相应的字休复制到zabbix S…

电脑连接不上手机热点 找不到到服务器的ip地址

手机热点连接不上 找不到到服务器的ip地址 emmm希望不会有人不会吧 解决方法&#xff1a; 1.点击右上角图标进入设置 2.点击更改所有wifi网络的DNS设置 3.查看自己的IP分配和DNS分配是不是DHCP自动分配&#xff0c;不是的话就不对了&#xff0c;需要点击编辑手动改一下 4.改完…

计算机网络之王道考研读书笔记-2

第 2 章 物理层 2.1 通信基础 2.1.1 基本概念 1.数据、信号与码元 通信的目的是传输信息。数据是指传送信息的实体。信号则是数据的电气或电磁表现&#xff0c;是数据在传输过程中的存在形式。码元是数字通信中数字信号的计量单位&#xff0c;这个时长内的信号称为 k 进制码…

MySQL数据库04|内置函数、存储过程、视图、事务、索引

目录 十三、MySQL常用内置函数 1、字符串函数 1️⃣拼接字符串&#xff1a;concat(str1,str2,…) 2️⃣包含字符个数&#xff1a;length(str) 3️⃣截取字符串&#xff1a;left(str,len)、right(str,len)、substring(str,pos,len) 4️⃣去除空格&#xff1a;ltrim(str)、r…

【Unity3D】实现可视化链式结构数据(节点数据)

关键词&#xff1a;UnityEditor、可视化节点编辑、Unity编辑器自定义窗口工具 使用Newtonsoft.Json、UnityEditor相关接口实现 主要代码&#xff1a; Handles.DrawBezier(起点&#xff0c;终点&#xff0c;起点切线向量&#xff0c;终点切线向量&#xff0c;颜色&#xff0c;n…

Group FLUX - Beta Sprint Essay2

文章目录 I. SCRUMAchievements from yesterday’s stand-up meeting to the present Commit recordFrontend-CommitsBackend-Commits PM ReportBurnup mapRunning image of our current program I. SCRUM Achievements from yesterday’s stand-up meeting to the present Zh…

硬盘清洁器 -一个功能出色的的文件与使用纪录清理工具,不仅可以将磁盘中不必要的暂存盘一次扫除,供大家学习研究参考

【核心功能】 1.硬件性能检测。 2.清理日常垃圾信息。 3.永久性删除文件。不可恢复擦除可用空间。 4.系统恢复和还原。 5.磁盘管理。 6.重复文件删除。坏链清除&#xff0c;删除非必要文件。 7.恢复删除文件。含电子照片、PDF、视频等。 8.批量重命名。 下载&#xff1a;https:…

[Linux] 进程信号概念 | 信号产生

&#x1fa90;&#x1fa90;&#x1fa90;欢迎来到程序员餐厅&#x1f4ab;&#x1f4ab;&#x1f4ab; 主厨&#xff1a;邪王真眼 主厨的主页&#xff1a;Chef‘s blog 所属专栏&#xff1a;青果大战linux 总有光环在陨落&#xff0c;总有新星在闪烁 为什么我的课设这么难…

流程引擎Activiti性能优化方案

流程引擎Activiti性能优化方案 Activiti工作流引擎架构概述 Activiti工作流引擎架构大致分为6层。从上到下依次为工作流引擎层、部署层、业务接口层、命令拦截层、命令层和行为层。 基于关系型数据库层面优化 MySQL建表语句优化 Activiti在MySQL中创建默认字符集为utf8&…

51c视觉~合集36

我自己的原文哦~ https://blog.51cto.com/whaosoft/12275223 #无监督盲超分算法MLMC 即插即用的解决方案 本文介绍了一种新的无监督盲超分辨率算法MLMC&#xff0c;该算法结合了元学习和马尔可夫链蒙特卡罗核估计&#xff0c;无需监督预训练或参数先验&#xff0c;即可实现…

Firecrawl教程①:自动化抓取与数据转化,赋能AI应用

Firecrawl教程①:自动化抓取与数据转化,赋能AI应用 前言一、功能特点1. 支持 LLM 可处理的数据格式2. 全面抓取网站3. 强大的操作支持4. 灵活的定制选项5. 支持多种编程语言 SDK二、如何开始使用 Firecrawl第一步:获取 API 密钥第二步:官网在线工具使用第三步:安装 Firecr…

关于目标检测YOLO 各版本区别v1-v11/X/R/P

概述 YOLO&#xff08;You Only Look Once&#xff0c;你只看一次&#xff09;是一系列开创性的实时目标检测模型&#xff0c;它们彻底改变了计算机视觉领域。由Joseph Redmon开发&#xff0c;后续版本由不同研究人员迭代&#xff0c;YOLO模型以其在图像中检测对象的高速度和准…

SpringBoot3整合FastJSON2如何配置configureMessageConverters

在 Spring Boot 3 中整合 FastJSON 2 主要涉及到以下几个步骤&#xff0c;包括添加依赖、配置 FastJSON 作为 JSON 处理器等。下面是详细的步骤&#xff1a; 1. 添加依赖 首先&#xff0c;你需要在你的 pom.xml 文件中添加 FastJSON 2 的依赖。以下是 Maven 依赖的示例&#…

java全栈day19--Web后端实战(java操作数据库3)

一、MyBatis 1.1介绍 前提引入&#xff1a; controller(控制层)作用&#xff1a;接受请求&#xff0c;响应数据 service(业务层)作用&#xff1a;负责具体的逻辑处理 dao(持久层)作用&#xff1a;数据访问层 一般的访问流程&#xff1a;浏览器发起请求过来&#xff0c;先…

社区版 IDEA 开发webapp 配置tomcat

1.安装tomcat 2.构建webapp项目结构 3.配置tomcat 安装smart tomcat插件 完成后settings会多一个选项tomcat server&#xff0c;然后我们把本地的tomcat配置过去。 4.为项目配置tomcat 配置项目路径&#xff0c;端口号。Context path 配置/ 表示直接用localhost就能访问 5.添加…