基于深度学习的多类别电表读数识别方案详解

基于深度学习的多类别电表读数识别方案详解

  • 多类别电表读数识别方案详解
    • 项目背景
      • 项目难点
      • 最终项目方案
      • 系列项目全集:
    • 安装说明
      • 环境要求
    • 数据集简介
    • 数据标注
    • 模型选型
      • 明确目标,开始下一步的操作
    • 检测模型训练
    • 模型评估与推理
    • 番外篇:基于目标检测方案的探索

多类别电表读数识别方案详解

项目背景

我国电力行业发展迅速,电表作为测电设备经历了普通电表、预付费电表和智能电表三个阶段的发展。虽然智能电表具有通信功能,但环境和设备使得智能电表具有不稳定性,非智能电表仍然无法实现自动采集。采集到的大量电表图片如果能够借助人工智能技术批量检测和识别,将会大幅提升效率和精度。

在本系列项目中,使用Paddle工具库实现一个OCR垂类场景。原始数据集是一系列电度表的照片,类型较多,需要完成电表的读数识别,对于有编号的电表,还要完成其编号的识别。
在这里插入图片描述

项目难点

  • 数据方面:电表种类多、数据少,拍摄角度多样且部分数据反光严重。
  • 电表数据没有开源数据集,如何从零标注数据应当选择何种标注软件能够最快速度构建数据集?
  • 在技术路线选择也面临多方面的问题,例如是通过文字检测来反向微调,还是通过目标检测从零训练?

最终项目方案

使用飞桨文字识别开发套件PaddleOCR,完成PP-OCR模型完成微调与优化,由于其检测部分基于DB的分割方法实现,对于数据中的倾斜问题能够良好解决。PP-OCR模型经过大量实验,其泛化性也足以支撑复杂垂类场景下的效果。

系列项目全集:

  • 主线篇

    • PPOCR:多类别电表读数识别
    • PPOCR:使用TextRender进行电表编号识别的finetune
    • 数据标注懒人包:PPOCRLabel极速增强版——以电表识别为例(二)
  • 番外篇

    • PPOCR+PPDET电表读数和编号检测

安装说明

环境要求

  • PaddlePaddle >= 2.1.0
  • 3.5 <= Python < 3.9
  • PaddleOCR >= 2.1
# 克隆项目
!git clone https://gitee.com/paddlepaddle/PaddleOCR.git

# 安装ppocr
!pip install fasttext==0.8.3
!pip install paddleocr --no-deps -r requirements.txt

%cd PaddleOCR/

数据集简介

(注:数据集稍后公开,尽请期待)

首先,我们来简单看一下数据集的情况。总的来说,这个场景面临几个比较大的问题:

  • 电表类型较多,相比之下,现有数据量(500张)可能不够。
  • 照片角度倾斜较厉害,有些电表可能不具备正面拍照条件。
  • 反光严重,影响目标框定位和数字识别。
  • 表号是点阵数字,不易识别。
  • 对检测框精准度要求非常高。

数据标注

在数据标注工具上,使用PPOCRLabel作为实现半自动标注,内嵌PP-OCR模型,一键实现机器自动标注,且具有便捷的修改体验。支持四点框、矩形框标注模式,导出格式可直接用于PaddleOCR训练。

标注文件格式如下所示:

" 图像文件名                    json.dumps编码的图像标注信息"
ch4_test_images/img_61.jpg    [{"transcription": "MASA", "points": [[310, 104], [416, 141], [418, 216], [312, 179]]}, {...}]

模型选型

PaddleOCR包含丰富的文本检测、文本识别以及端到端算法。在PaddleOCR的全景图中,我们可以看到PaddleOCR支持的文本检测算法。

在标注数据的基础上,基于通用的文本检测算法finetune,我们就可以训练一个能将电表识别中的多余文本框自动去除,只留下目标的电表读数、编号的电表文本检测模型。

明确目标,开始下一步的操作

检测模型训练

为节省训练时间,提供了一个效果不错的预训练模型以及配置文件,读者可以选择基于预训练模型finetune或是从头训练。

!pip install Polygon3 -i https://pypi.tuna.tsinghua.edu.cn/simple
!pip install lanms-nova
!pip install rapidfuzz

# 从头开始训练
!python tools/train.py -c configs/det/ch_PP-OCRv2/ch_PP-OCRv2_det_student.yml

模型评估与推理

通过上述代码训练好模型后,运行 tools/eval.py, 指定配置文件和模型参数即可评估效果。

# 提供的预训练模型和配置文件
!tar -xvf ../my_exps.tar -C ./

# 查看提供的模型训练效果
!python tools/eval.py -c configs/det/ch_PP-OCRv2/ch_PP-OCRv2_det_student.yml  -o Global.checkpoints="my_exps/det_dianbiao_size1600_copypaste/best_accuracy"
``

`

## 模型导出和串接

这里用了个比较取巧的方式,先将模型导出,然后把whl下预测用的检测模型用新训练的模型直接替换掉,就可以看到finetune后的检测效果了!

```python
# 模型导出
!python tools/export_model.py -c configs/det/ch_PP-OCRv2/ch_PP-OCRv2_det_student.yml -o Global.pretrained_model=./my_exps/det_dianbiao_size1600_copypaste/best_accuracy Global.save_inference_dir=./inference/det_db
from paddleocr import PaddleOCR, draw_ocr

# 模型路径下必须含有model和params文件
ocr = PaddleOCR(det_model_dir='./inference/det_db', use_angle_cls=True)
img_path = './M2021/test.jpg'
result = ocr.ocr(img_path, cls=True)
for line in result:
    print(line)

# 显示结果
from PIL import Image

image = Image.open(img_path).convert('RGB')
boxes = [line[0] for line in result]
txts = [line[1][0] for line in result]
scores = [line[1][1] for line in result]
im_show = draw_ocr(image, boxes, txts, scores)
im_show = Image.fromarray(im_show)
im_show.save('result.jpg')

如果您想要进一步优化识别结果,可以通过以下两种思路:

  1. 重新训练识别模型

    • 通过 导出识别数据 功能在PPOCRLabel中导出识别数据:包含已经裁切好的识别图片与label。
    • 如果真实数据量太小,使用Textrenderer、StyleText等造数据工具,制造合成数据(可能需要提供字体文件等)。
    • 将数据按照识别模型训练文档整理数据后启动训练,通过调整学习率、调整相应的合成与真实数据比例(保证每个batch中真实:合成=10:1左右)等操作优化识别模型。
  2. 通过后处理解决,包括调整阈值、将非数字内容处理掉等。

如果您对本项目以及PaddleOCR应用有更深入的需求,欢迎扫码加群交流:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

番外篇:基于目标检测方案的探索

工业场景中对于文字的检测也可以算是目标的一种,因此我们也探索了通用目标检测的方法在该场景中的效果。

整体方案的流程首先将PPOCRLabel的标注文件格式转换为VOC格式,然后训练YOLOv3模型进行文本检测。 具体代码可参考 PPOCR+PPDET电表读数和编号识别。

最终预测效果如下:

(预测结果图片)

从上面的预测结果看来,我们发现直接用矩形框检测也存在问题。由于输入图片会存在歪斜,导致矩形框可能会框住多余的文字,进而影响文字识别效果。

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

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

相关文章

C++力扣题目701--二叉搜索树中的插入操作

给定二叉搜索树&#xff08;BST&#xff09;的根节点 root 和要插入树中的值 value &#xff0c;将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 &#xff0c;新值和原始二叉搜索树中的任意节点值都不同。 注意&#xff0c;可能存在多种有效的插入方式&a…

蓝桥杯省赛无忧 STL 课件17 map

01 map 02 multimap 03 unordered_map 04 代码示例

微信商家转账到零钱怎么开通?场景模板

商家转账到零钱是什么&#xff1f; 使用商家转账到零钱这个功能&#xff0c;可以让商户同时向多个用户的零钱转账。商户可以使用这个功能用于费用报销、员工福利发放、合作伙伴货款或分销返佣等场景&#xff0c;提高效率。 商家转账到零钱的使用场景有哪些&#xff1f; 商家…

ES API 批量操作 Bulk API

bulk 是 elasticsearch 提供的一种批量增删改的操作API。 bulk 对 JSON串 有着严格的要求。每个JSON串 不能换行 &#xff0c;只能放在同一行&#xff0c;同时&#xff0c; 相邻的JSON串之间必须要有换行 &#xff08;Linux下是\n&#xff1b;Window下是\r\n&#xff09;。bul…

【AUTOSAR】--01 AUTOSAR网络管理基础

AUTOSAR网络管理做了几个项目了&#xff0c;但发现还是有些理解不够深入的地方&#xff0c;最近趁着有个新项目也要做AUTOSAR网络管理&#xff0c;再从头梳理一下AUTOSAR网络管理&#xff0c;预计用2-3篇文章&#xff0c;把AUTOSAR网络重新梳理完成。 这是第一篇&#xff0c;主…

鸿蒙开发-UI-组件-状态管理

鸿蒙开发-序言 鸿蒙开发-工具 鸿蒙开发-初体验 鸿蒙开发-运行机制 鸿蒙开发-运行机制-Stage模型 鸿蒙开发-UI 鸿蒙开发-UI-组件 文章目录 前言 一、什么是状态管理 二、管理组件拥有的状态 1.组件内状态 State装饰器 2.父子组价单向同步 Prop装饰器 3.父子双向同步 Link装…

yolov5模型Detection输出内容与源码详细解读

文章目录 前言一、Detiction类源码说明二、Detection类初始化参数解读三、Detection的训练输出源码解读四、Detection的预测输出源码解读1、self.grid内容解读2、xy/wh内容解读3、推理输出解读 总结 前言 最近&#xff0c;需要修改yolov5推理结果&#xff0c;通过推理特征添加…

青动CRM-E售后 售后工单CRM系统 erp系统 带前端小程序全开源可二开

应用介绍 一款基于FastAdminThinkPHP和uniapp开发的CRM售后管理系统&#xff0c;旨在助力企业销售售后全流程精细化、数字化管理&#xff0c;主要功能&#xff1a;客户、合同、工单、任务、报价、产品、库存、出纳、收费&#xff0c;适用于&#xff1a;服装鞋帽、化妆品、机械机…

change事件传递多个参数

1.传递value页面参数 change"handleChange($event,123)" 2.传递选中的keyvalue或是选中的item 我用的是a-auto-complete&#xff0c;试验了用a-select也可以 就是在option里面&#xff0c;:value"JSON.stringify(d)" 然后在eval(( value ))转化就可…

zepplin记录1

zepplin记录1 文章目录 zepplin记录1前言一、配置python环境二、测试可用性1.配置interpreter2.测试代码 总结 前言 Apache Zeppelin是一个开源的数据分析和可视化的交互式笔记本&#xff0c;类似于Jupyter Notebook。它支持多种编程语言&#xff08;如Scala、Python、R、SQL等…

智慧园区数字孪生智能可视运营平台解决方案:PPT全文82页,附下载

关键词&#xff1a;智慧园区解决方案&#xff0c;数字孪生解决方案&#xff0c;数字孪生应用场景及典型案例&#xff0c;数字孪生可视化平台&#xff0c;数字孪生技术&#xff0c;数字孪生概念&#xff0c;智慧园区一体化管理平台 一、基于数字孪生的智慧园区建设目标 1、实现…

【技术选型】Doris vs starRocks

比对结论 仅从当前能看到的数据中&#xff0c;相比于doris&#xff0c;starRocks在性能方面具备优势&#xff0c;且更新频率高&#xff08;降低维护成本&#xff09;。 目标诉求 并发性不能太低——相比于clickhouse不到100的QPS支持大表关联——降低数据清洗的压力&#xf…

【PlantUML】- 时序图

写在前面 本篇文章&#xff0c;我们来介绍一下PlantUML的时序图。这个相对类图来讲&#xff0c;比较简单&#xff0c;也不需要布局。读完文章&#xff0c;相信你就能实际操作了。 目录 写在前面一、基本概念二、具体步骤1.环境说明2.元素3.语法4.示例 三、参考资料写在后面系列…

Spring Boot 3 + Vue 3实战:引入数据库实现用户登录功能

文章目录 一、实战概述二、实战步骤&#xff08;一&#xff09;创建数据库&#xff08;二&#xff09;创建用户表&#xff08;三&#xff09;后端项目引入数据库1、添加相关依赖2、用户实体类保持不变3、编写应用配置文件4、创建用户映射器接口5、创建用户服务类6、修改登录控制…

【Fiddler抓包】微信扫码访问链接打不开网页

又来每天进步一点点~~~ 背景&#xff1a;某天发版的时候&#xff0c;手机连接电脑抓包查看用户登录之前的sessionID&#xff0c;由于业务需要&#xff0c;是需要用户登录微信扫码跳转至某一页面的&#xff0c;微信&#xff08;分身&#xff09;扫码成功&#xff0c;跳转时打不…

HarmonyOS 通过 animateTo讲解尺寸动画效果

上文 HarmonyOS讲解并演示 animateTo 动画效果 我们已经做出了基本的动画效果 也对 animateTo 的使用比较熟悉了 第一个参数是 配置动画参数的json 第二个参数 则是改变我们元素属性值的事件 但属性值 远远不止位置属性 本文 我们来说 通过尺寸变化 完成动画效果 如果你有看过…

指针理解C部分

目录 1.二级指针 2.指针数组 2.1指针数组的定义和表现形式 2.2指针数组模拟实现二维数组 2.2.1二维数组 2.2.2使用指针数组模拟实现二维数组 3.字符指针 2.数组指针 3.二维数组传参 4.函数指针 4.1函数指针变量的定义和创建 4.2函数指针变量的使用 4.3两段有趣的代码 4.…

【NI国产替代】USB‑7846 Kintex-7 160T FPGA,500 kS/s多功能可重配置I/O设备

Kintex-7 160T FPGA&#xff0c;500 kS/s多功能可重配置I/O设备 USB‑7846具有用户可编程FPGA&#xff0c;可用于高性能板载处理和对I/O信号进行直接控制&#xff0c;以确保系统定时和同步的完全灵活性。 您可以使用LabVIEW FPGA模块自定义这些设备&#xff0c;开发需要精确定时…

NLP论文阅读记录 - 2022 | WOS 一种新颖的优化的与语言无关的文本摘要技术

文章目录 前言0、论文摘要一、Introduction1.1目标问题1.2相关的尝试1.3本文贡献 二.前提三.本文方法四 实验效果4.1数据集4.2 对比模型4.3实施细节4.4评估指标4.5 实验结果4.6 细粒度分析 五 总结思考 前言 A Novel Optimized Language-Independent Text Summarization Techni…

Linux系统编程(十):线程同步(下)

参考引用 UNIX 环境高级编程 (第3版)嵌入式Linux C应用编程-正点原子 1. 为什么需要线程同步&#xff1f; 线程同步是为了对共享资源的访问进行保护 共享资源指的是多个线程都会进行访问的资源&#xff08;如&#xff1a;全局变量&#xff09; 保护的目的是为了解决数据一致性…