YOLOv5+PaddleOCR手写签名识别

2023-11-18

YOLOv5+PaddleOCR手写签名识别

介绍:

参加了一个中国移动的比赛,比赛的数据集是一个工单,上面有多个人的签名还有手写的时间。因为主办方不允许数据公开,所以在这一系列博客中,我主要讲一下实现的思路,在YOLO演示的时候我会用其他的数据代替。

要求:开发一个模型,对比赛提供的工单进行手写汉字(主要是签名)的截取和识别。

数据:

  • 提供图片训练集467张,均带有标注结果。每张表单上有三个人的签名以及一些表单数据。
  • 提供图像测试集118张,需提交在测试集的识别结果。

总结:
简单来说比赛主要由三部分组成:

  1. 从表单上将签名部分识别出来并进行切割
  2. 将切割的签名进行预处理
  3. 将签名进行训练并识别

目前手写汉字识别存在的问题:

  • 字体多样:常见字体包括楷书、行书、草书等,字体结构各不相同
  • 书写随意:由于各人书写风格不同,造成手写字差别过大或变形严重
  • 形近字多︰如“土、士”、“往、住”等

检测模型的选择:

目前较好的检测模型有两种,分别是R-CNN和YOLO系列。下面简单介绍一下原理:

R-CNN:

在这里插入图片描述
R-CNN的想法是很暴力的,就是从整个图片中随机切出来很多块区域,然后把这些区域进行特征提取,再放到分类器中进行分类。当然,只要切得区域足够多,那么一定可以切到我们需要识别的物体。具体步骤如下:

  1. 从图片中选出2000个独立的候选区域(Region Proposal),提出了一个叫做Selective Search的算法.
  2. 每一个区域提取一个固定长度(4096)的特征向量
  3. 对每个目标(类别)训练—分类器(类似于SVM)
  4. 训练一个回归器,修正候选区域中目标的位置

足够多的区域也加重了训练的消耗,资源的占用,所以提出了一个区域选择算法。也就是在有可能的区域进行搜索。但是这样的训练所需的资源仍然是巨大的。

YOLO:

在这里插入图片描述
YOLO这个系列也已经提出来了6,7年了,相比于以前的算法绝对是一个史无前例的创新。关于YOLO网上有很多大佬都做了解释,我就不再叙述。关于YOLO的原理可以参考下面的几篇文章:
写给小白的YOLO
目标检测|YOLO原理与实现
YOLO-YOLOV5算法原理及网络结构整理

本项目也是使用的YOLO。我感觉最大的特点就是快又准。在YOLO标注的时候我们将表单中的签名和日期分开标注,然后在获取最终数据的时候也是分为两个文件夹。在这个系列第二篇会推出我实现YOLOv5的步骤。

识别模型的选择:

OCR识别算法的输入数据一般是文本行﹐背景信息不多﹐文字占据主要部分﹐识别算法目前可以分为两类算法:
1.基于CTC的方法;即识别算法的文字预测模块是基于CTC的,常用的算法组合为CNN+RNN+CTC。目前也有一些算法尝试在网络中加入transformer模块等等。
2.基于Attention 的方法;即识别算法的文字预测模块是基于Attention的,常用算法组合是CNN+RNN+Attention。

我们使用的是基于百度飞桨的paddocr,其中的PP-OCRv3的识别模块是基于文本识别算法SVTR优化。SVTR不再采用传统的RNN结构,通过引入Transformers结构更加有效地挖掘文本行图像的上下文信息,从而提升文本识别能力。为IJCAl 2022最新收录的文本识别算法SVTR(论文名称: SVTR:Scene Text Recognition with a Single Visual Model)
模型有以下特点:

  1. 利用Attention指导CTC训练,融合多种文本特征的表达,是一种有效的提升文本识别的策略。
  2. 在PP-OCRv3中,针对两个不同的SVTR_LCNet和Attention结构,对他们之间的PP-LCNet的特征图、SVTR模块的输出和Attention模块的输出同时进行监督训练
  3. 核心思想是利用高精度的文本识别大模型对无标注数据进行预测,获取伪标签,并且选择预测置信度高的样本作为训练数据,用于训练小模型。

根据YOLOv5切割出来的数据集,制作paddocr的数据集,然后进行模型训练。最终训练的准确度如下:
在这里插入图片描述

训练集的准确度达到了96.4%。最终我们利用九天提供的数据进行测试数据,得到的评分为95分。
如下所示:
在这里插入图片描述

模型的提升

  1. 加强去噪:型可提升空间不大。但是两种报告单的数据集存在有较大的差异,验收单的噪音较多。
  2. 增加更多的数据集:现在数据集比较少。增加数据集之后会对模型的泛化行,以及适用性有一个较好的提升
  3. 提高切割精度:减少图片数据中除手写字体外不必要的部分
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

YOLOv5+PaddleOCR手写签名识别 的相关文章

  • 【Mo 人工智能技术博客】图卷积网络概述及其在论文分类上的应用

    近年来 深度学习在计算机视觉 自然语言处理等领域大放异彩 这些领域所面对的数据都是结构化的 如图像 音频 文本等 它们内部都有明确的排列规则 结构化的数据由于具有这些确定的规则而方便处理 但是在现实生活中 非结构化的关系数据才是主流 我们无
  • Ubuntu 18.04换国内源 中科大源 阿里源 163源 清华源

    国内有很多Ubuntu的镜像源 包括阿里的 网易的 还有很多教育网的源 比如 清华源 中科大源 我们这里以中科大的源为例讲解如何修改Ubuntu 18 04里面默认的源 编辑 etc apt sources list文件 在文件最前面添加以
  • 华为OD机试 - 跳格子1(Java)

    题目描述 小明和朋友玩跳格子游戏 有 n 个连续格子 每个格子有不同的分数 小朋友可以选择以任意格子起跳 但是不能跳连续的格子 也不能回头跳 给定一个代表每个格子得分的非负整数数组 计算能够得到的最高分数 输入描述 给定一个数列 如 1 2
  • 3D游戏设计大作业

    Unity大作业 粒子系统效果 一 前言 1 此篇文章记录了2022年第二学期中山大学软件工程3D游戏与编程的大作业 本次大作业可选择范围众多 最终我选择了粒子系统效果作为了本次大作业的主题 2 一个粒子系统可以模拟并渲染许多称为粒子的小图
  • CRC校验总结

    事实上网上很多CRC校验算法 在接收端进行CRC校验时 余数不为零 这往往是因为CRC校验算法本身是有问题的 但不妨碍我们进行校验 接收端可以对需要校验的字段带入CRC校验算法 计算得到校验值 并与发送数据中的校验值进行比较 如果两者相等
  • 生信技能树R语言学习

    一 数据类型和向量 1 数据类型 1 1 判断数据类型class 1 2 按Tab键自动补全 1 3 数据类型的判断和转换 1 is 族函数 判断 返回值为TRUE或FALSE is numeric 123 is character a i

随机推荐

  • 32位/64位WINDOWS驱动之-突破进程保护映射的方法进行跨进程读内存2

    32位 64位WINDOWS驱动之 突破进程保护映射的方法进行跨进程读内存2 一 在过保护读写筛选器中添加 读写驱动2 c 驱动层 代码如下 include
  • 黑马头条 热点文章实时计算、kafkaStream

    热点文章 实时计算 1 今日内容 1 1 定时计算与实时计算 1 2 今日内容 kafkaStream 什么是流式计算 kafkaStream概述 kafkaStream入门案例 Springboot集成kafkaStream 实时计算 用
  • cout 格式化输出

    将 cout 的 flag 保存到变量 以便修改后的恢复 ostream fmtflags old cout flag 无参将返回当前 flag 值 cout flag old 恢复到原先保存的值 将 bool 值以 literals 输出
  • 第六章课后习题及答案

    第六章习题答案 转载于 https www cnblogs com hhdn archive 2007 05 27 761356 html
  • Mysql字段设置默认值

    方法一 select 默认值 字段名 from 表名 方法二 SELECT 默认值 as 字段名 FROM 表名 以上方法 将默认值和表名互换 则可以产生给表名去别名的作用
  • 计算分组后的记录行数(count group)

    小弟有这样一个问题 想用hql计算分组之后的总记录行数 语句如 from aTable a left outer join bTable b group by a f1 b f1 现在要计算它的总记录数 select count from
  • 对useReducer的理解

    useReducer是React提供的一个高级Hook 它不像useEffect useState useRef等必须hook一样 没有它我们也可以正常完成需求的开发 但useReducer可以使我们的代码具有更好的可读性 可维护性 可预测
  • Android通用流行框架大全,零基础入门学习android

    Picasso transformations 一个为Picasso提供多种图片变换的库 Glide transformations 一个为Glide提供多种图片变换的库 Android gpuimage 基于OpenGL的Android过
  • Jenkins持续集成项目实践 —— 基于Python Selenium自动化测试(二)

    上一篇讲了如何搭建jenkins 这篇主要讲 怎么将自动化代码与jenkins衔接起来 jenkins上运行的两种方式 第一种 在jenkins上面运行本地代码 操作如下 新建项目 项目名称根据自己项目情况填写并选择自由模式 进行配置根据如
  • LaTeX中插入matlab代码(可添加中文注释)的几种方法

    最近在用LaTeX写文件时 需要插入matlab代码 但是matlab代码编写时没有注意到注释为中文所带来的不便 导致在编写LaTeX文件时总是报错 经查阅网上有关这方面的资料和自己不断地尝试之后 总结其中的方法如下 使用matlab的mc
  • 【满分】【华为OD机试真题2023 JS】字母组合

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 字母组合 知识点回溯 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 每个数字对应多个字母 对应关系如下 0 a b c 1 d e f 2 g h i 3 j
  • Android MVP 详解(上)

    作者 李旺成 时间 2016年4月3日 Android MVP 详解 下 已经发布 欢迎大家提建议 MVP 在 Android 上的使用其实已经有挺长一段时间了 长到似乎有点 过时 了 目前风头正劲的是MVVM 那为什么现在还要讲 MVP
  • tf.nn.atrous_conv2d如何实现空洞卷积?

    转载自 https blog csdn net mao xiao feng article details 78003730 介绍 关于空洞卷积的理论可以查看以下链接 这里我们不详细讲理论 1 Long J Shelhamer E Darr
  • 业务实战中如何利用MySQL函数来解决

    随着我们业务越来越复杂的情况下 完全基于java后台来解决首先是很麻烦 而且性能带来降低 代码的可读性下降 这个时候就需要一些MySQL的函数来解决了 这篇文章对于常见的MySQL函数不予介绍 concat函数 使用方法 CONCAT st
  • Flink设置Source数据源使用kafka获取数据

    流处理说明 有边界的流bounded stream 批数据 无边界的流unbounded stream 真正的流数据 Source 基于集合 package com pzb source import org apache flink ap
  • I Hate It

    很多学校流行一种比较的习惯 老师们很喜欢询问 从某某到某某当中 分数最高的是多少 这让很多学生很反感 不管你喜不喜欢 现在需要你做的是 就是按照老师的要求 写一个程序 模拟老师的询问 当然 老师有时候需要更新某位同学的成绩 Input 本题
  • volatile和synchronized的区别

    共性 volatile与synchronized都用于保证多线程中数据的安全 区别 1 volatile修饰的变量 jvm每次都从主存 主内存 中读取 而不会从寄存器 工作内存 中读取 而synchronized则是锁住当前变量 同一时刻只
  • 第一次 openwrt源码下载编译

    openwrt 学习记录 第一次 openwrt源码下载编译 MT7620开发板 安装虚拟机VMware 安装Ubnutu 先进入root账户 topeet ubuntu su 输入密码 1 搭建编译环境 参考 https blog csd
  • maven的使用

    目录 一 maven基本参数 二 maven基础结构 三 mvn的打包和运行 一 maven基本参数 groupId 是指项目里面的标识 一般写法是com mycom myapp 其中mycom是指你公司的域名 例如com google m
  • YOLOv5+PaddleOCR手写签名识别

    YOLOv5 PaddleOCR手写签名识别 介绍 参加了一个中国移动的比赛 比赛的数据集是一个工单 上面有多个人的签名还有手写的时间 因为主办方不允许数据公开 所以在这一系列博客中 我主要讲一下实现的思路 在YOLO演示的时候我会用其他的