水表数字识别3:Pytorch CRNN实现水表数字识别(含训练代码和数据集)

水表数字识别3:Pytorch  CRNN实现水表数字识别(含训练代码和数据集)


目录

水表数字识别3:Pytorch  CRNN实现水表数字识别(含训练代码和数据集)

1.前言

2. 水表数字识别的方法

3. 水表数字识别数据集

4. 水表数字分割模型训练

5. 水表数字识别模型训练

(1)项目安装

(2)构建Train和Test水表数字识别数据

(3)构建模型

(4)修改配置文件:configs/config_crnn.yaml

(5)开始训练

(6)可视化训练过程

(7)一些说明和优化建议

6.水表识别数字识别效果(Python版本)

7.水表识别数字识别效果(Android版本)

8.水表识别数字识别项目源码下载


1.前言

本项目将实现水表数字识别,整套方案采用二阶段方法实现,即首先使用文本(数字)检测模型DBNet定位水表数字的区域,然后进行校正并裁剪水表数字区域,再使用CRNN模型对水表数字的区域进行文本(数字)识别。

整套项目分为:数据集说明,DBNet文本(数字)检测模型训练、CRNN文本(数字)识别模型训练,以及水表数字识别边缘侧部署C++/Android等多个章节,本篇是项目《​​​​水表数字识别》系列文章之《Pytorch  CRNN实现水表数字识别》;为了方便后续模型工程化和Android平台部署,项目对文字检测模型和文字识别模型进行轻量化,并提供Python/C++/Android多个版本;

整套水表数字检测和识别系统,在普通Android手机上可以达到实时的检测效果,CPU(4线程)约40ms左右,GPU约30ms左右 ,基本满足业务的性能需求。下表格给出CRNN,LPRNet和PlateNet模型的计算量和参数量以及其数字识别的准确率:

模型input-sizeparams(M)GFLOPsAccuracy
LPRNet94×240.48M0.147GFlops0.9000
CRNN160×328.35M1.06GFlops0.9150
PlateNet168×481.92M1.25GFlops0.9275

【尊重原创,转载请注明出处】https://blog.csdn.net/guyuealian/article/details/139998788


更多项目《水表数字识别》系列文章请参考:

  • 水表数字识别1:水表数字数据集说明(含下载链接) 
  • 水表数字识别2:Pytorch  DBNet实现水表数字检测(含训练代码和数据集)
  • 水表数字识别3:Pytorch  CRNN实现水表数字识别(含训练代码和数据集)
  • 水表数字识别4:C++实现水表数字识别(含源码 可实时检测)
  • 水表数字识别5:Android实现水表数字识别(含源码 可实时检测)

      


2. 水表数字识别的方法

传统的水表数字识别的方法主要采用字符分割的方法实现字符识别,即先将水表的图像按照预定的规则将字符一个一个切割,并按照模式匹配的方法识别字符;显然该方法效率低,准确率也不高。在深度学习算法中,实质上,水表数字识别也可以看成是OCR识别的技术范畴,其实现流程可先进行文本检测,然后再进行文本识别:

(1)水表(文本)数字检测:主要实现水表数字区域的定位,可以采用目标检测方案,如使用SSD、YOLO等目标模型进行水表检测,但精度较差;也可以采用分割方法,如本文使用的DBNet,Fast-SCNN等方法。Fast-SCNN是轻量化分割模型,可以部署到Android平台或者开发板上,在多线程或者GPU下,可以达到实时检测效果

(2)水表(文本)数字识别:主要实现水表数字识别,项目支持CRNN或LPRNet文本识别算法;为方便后续工程化,项目对CRNN模型进行魔改,提出一个PlateNet模型,用于支持部署到Android平台或者开发板上


3. 水表数字识别数据集

目前收集了2个水表数字的检查数据集:Water-Meter-Det1和Water-Meter-Det2,总数约6000+张图片,主要用于水表数字检测模型或分割模型训练和开发;

具体介绍,请参考:《水表数字识别1:水表数字数据集说明(含下载链接)》


4. 水表数字分割模型训练

本篇主要分享水表数字识别模型训练,关于水表数字分割模型训练,请参考《水表数字识别2:Pytorch DBNet实现水表数字检测(含训练代码和数据集)》


5. 水表数字识别模型训练

(1)项目安装

.
├── configs           # 配置文件
├── core              # 文本识别相关模型
├── data              # 相关测试数据
├── docs              # 相关说明文档
├── libs              # 依赖库
├── output            # 输出结果
├── README.md         # 说明文档
├── requirements.txt  # 项目python依赖文件
├── demo.py           # 测试文件
├── demo.sh           # 测试脚本
├── train.py          # 训练文件
└── train.sh          # 训练脚本

​ 推荐使用Python3.8或Python3.7,更高版本可能存在版本差异问题,Python依赖环境,使用pip安装即可,项目代码都在Ubuntu系统和Windows系统验证正常运行,请放心使用;若出现异常,大概率是相关依赖包版本没有完全对应

Cython==3.0.2
easydict==1.10
editdistance==0.6.2
efficientnet-pytorch==0.7.1
imageio==2.31.1
imgaug==0.4.0
imgviz==1.7.5
matplotlib==3.3.4
numpy==1.24.4
onnx==1.13.1
onnx-simplifier==0.4.33
onnxruntime==1.14.1
onnxruntime-gpu==1.15.1
onnxsim==0.4.33
opencv-contrib-python==4.8.1.78
opencv-python==4.8.0.76
Pillow==9.5.0
pyclipper==1.3.0.post5
pycocotools==2.0.6
PyQt5==5.13.2
PyQt5-Qt5==5.15.2
PyQt5-sip==12.13.0
PySocks==1.7.1
PythonWebHDFS==0.2.3
pytools==2023.1.1
PyYAML==6.0
QtPy==2.3.1
scikit-image==0.21.0
scikit-learn==1.2.2
scipy==1.10.1
seaborn==0.12.2
segmentation-models-pytorch==0.3.3
semantic-version==2.10.0
sentencepiece==0.1.99
stack-data==0.6.2
starlette==0.27.0
tensorboard==2.13.0
tensorboard-data-server==0.7.1
tensorboardX==2.6.1
timm==0.9.2
toolz==0.12.0
torch==1.13.1+cu117
torchaudio==0.13.1+cu117
torchinfo==1.8.0
torchstat==0.0.7
torchsummary==1.5.1
torchvision==0.14.1+cu117
tqdm==4.65.0
typing_extensions==4.6.3
transformers==4.31.0
Werkzeug==2.3.6
urllib3==1.26.16
xmltodict==0.13.0
basetrainer==0.8.4
pybaseutils==2.0.0

 项目安装教程请参考(初学者入门,麻烦先看完下面教程,配置好开发环境):

  • 项目开发使用教程和常见问题和解决方法
  • 视频教程:1 手把手教你安装CUDA和cuDNN(1)
  • 视频教程:2 手把手教你安装CUDA和cuDNN(2)
  • 视频教程:3 如何用Anaconda创建pycharm环境
  • 视频教程:4 如何在pycharm中使用Anaconda创建的python环境
  • 推荐使用Python3.8或Python3.7,更高版本可能存在版本差异问题

(2)构建Train和Test水表数字识别数据

水表数字识别的训练数据和测试数据的数据格式,要求非常简单:

  1. 对水表数字区域进行裁剪时,请尽量保证数字的完整性,其他非数字区域尽量去除
  2. 强烈建议对水表进行倾斜校正,避免倾斜带来的影响;本项目已经实现水表数字区域的倾斜校正,具体方法请参考:Python OpenCV实现文档自动矫正(含源码和测试数据)
  3. 一张图片仅包含一个水表,不能出现多个水表
  4. 水表数字图片文件命名规则:水表数字_序号ID ;如【007225_image_000.jpg】,其中【007225】表示这个张图片的真实数字,【image_000】是序号ID,这个序号ID是为了避免水表数字重复,序号ID可以是任意字符;模型训练时,仅取水表数字作为label进行训练,序号ID会被忽略。
  5. 如果,你需要新增自己的水表数字识别数据集,请按照上面的要求制作即可

以下是水表数字识别数据的样本数据,请参考格式制作即可;项目源码已经附带了制作好的水表数字识别数据集,可以直接用于水表数字识别模型训练:

(3)构建模型

项目实现了三个识别模型:CRNN,LPRNet和PlateNet,其计算量和参数量参考如下:

  • CRNN:最经典的OCR模型了,采用CNN+RNN的网络结构,提出CTC-Loss对齐算法解决不定长序列对齐问题;原始源码是用于文字识别的,稍微改成水表数据集,即可用于水表数字识别了
  • LPRNet相比经典的CRNN模型,LPRNet 没有采用RNN结构;是专门设计用于车牌识别的轻量级的模型,整个网络结构设计高度轻量化,参数量仅有0.48M
  • PlateNet:LPRNet网络结构中存在MaxPool3d等算子,在端上部署时,会存在OP不支持等问题,PlateNet模型去除MaxPool3d,改成使用MaxPool2d,保证模型可端上部署成功。
模型input-sizeparams(M)GFLOPs
LPRNet94×240.48M0.147GFlops
CRNN160×328.35M1.06GFlops
PlateNet168×481.92M1.25GFlops

(4)修改配置文件:configs/config_crnn.yaml

准备好数据好,下一步是修改配置文件configs/config_crnn.yaml的数据路径:

  • 修改train_data和test_data为你自己的数据路径
  • 其他参数保持默认即可
train_data:- '/home/pan/dataset/WaterMeter/水表数据集/Water-Meter-Rec1/train'- '/home/pan/dataset/WaterMeter/水表数据集/Water-Meter-Rec2/train'test_data:- '/home/pan/dataset/WaterMeter/水表数据集/Water-Meter-Rec1/val'
data_type: "image_data"
class_name: "data/name_table.txt"
train_transform: "train"
test_transform: "test"
batch_size: 32
net_type: 'CRNN'
flag: "Perspective"
input_size: [ 160, 32 ]
rgb_mean: [ 0.5, 0.5, 0.5 ]
rgb_std: [ 0.5, 0.5, 0.5 ]
resample: False
work_dir: "work_space"
num_epochs: 200
optim_type: 'Adam'
lr: 0.001
weight_decay: 0.0
milestones: [ 100,150,170 ]
momentum: 0.0
gpu_id: [ 0 ]
num_workers: 8
log_freq: 20
pretrained: "data/pretrained/CRNN/CRNN.pth"

配置文件每个参数含义如下: 

参数类型参考值说明
train_datastr, list-训练数据文件,可支持多个文件
test_datastr, list-测试数据文件,可支持多个文件
class_namestr-类别文件
train_transformstrtrain训练数据数据处理方法
test_transformstrtest测试数据数据处理方法
work_dirstrwork_space训练输出工作空间
net_typestrCRNN骨干网络,支持CRNN,LPRNe和PlateNet等模型
intput_sizelist[160,32]模型输入大小
rgb_meanlist[0.5,0.5,0.5]图像归一化均值
rgb_stdlist[0.5,0.5,0.5]图像归一化方差
resampleboolTrue进行样本均衡
batch_sizeint128批训练大小
lrfloat0.001初始学习率大小
optim_typestrAdam优化器,{SGD,Adam}
milestoneslist[30,80,100]降低学习率的节点
momentumfloat0.9SGD动量因子
num_epochsint200循环训练的次数
num_workersint8DataLoader开启线程数
weight_decayfloat5e-4权重衰减系数
gpu_idlist[ 0 ]指定训练的GPU卡号,可指定多个
log_freqint10显示LOG信息的频率
pretrainedstrmodel.pthpretrained的模型

(5)开始训练

整套训练代码非常简单操作,项目源码已经给出CRNN,LPRNet和PlateNet的配置文件;用户只需要修改好配置文件的的数据路径,即可开始训练了。

  • 训练CRNN模型
python train.py -c  configs/config_crnn.yaml
  • 训练LPRNet模型
python train.py -c  configs/config_lprnet.yaml
  •  训练PlateNet模型
python train.py -c  configs/config_platenet.yaml

(6)可视化训练过程

训练过程可视化工具是使用Tensorboard,使用方法:

# 基本方法
tensorboard --logdir=path/to/log/
# 例如(请修改自己的训练的模型路径)
tensorboard --logdir=work_space/CRNN_Perspective_20240621_135211_3840/log

 

下表格给出CRNN,LPRNet和PlateNet模型的计算量和参数量以及其水表数字识别的准确率:

模型input-sizeparams(M)GFLOPsAccuracy
LPRNet94×240.48M0.147GFlops0.9393
CRNN160×328.35M1.06GFlops0.9343
PlateNet168×481.92M1.25GFlops0.9583

(7)一些说明和优化建议

  • 数据长尾问题:文本识别的数据集经常存在数据长尾问题,即某些字符的数据较多,而某些字符的数据较少,这会导致模型识别结果偏向于数据较多的样本类别。为了均衡样本,解决方法可以从数据增强,样本重采样,数据收集等方法优化。
  • 图片倾斜的问题:现实场景中,由于摄像头角度等因素,抓拍的图片往往是倾斜的,这会影响识别模型的效果;建议对图片进行透视变换和倾斜矫正,提高文本识别的效果;项目实现了水表数字透视矫正算法,可参考这篇文章进行实现:Python OpenCV实现文档自动矫正(含源码和测试数据)

6.水表识别数字识别效果(Python版本)

demo.py文件用于推理和测试模型的效果,填写好模型文件以及测试图片即可运行测试

  • 测试CRNN模型
python demo.py --image_dir data/test_image --model_file work_space/CRNN_Perspective_20240621_135211_3840/model/latest_model_199_0.9000.pth --net_type CRNN --use_det
  • 测试LPRNet模型
python demo.py --image_dir data/test_image --model_file work_space/LPRNet_Perspective_20240620_192443_9824/model/latest_model_199_0.8950.pth --net_type LPRNet --use_det
  • 测试PlateNet模型
python demo.py --image_dir data/test_image --model_file data/weight/PlateNet_Perspective_20230104102743/model/best_model_186_0.9583.pth --net_type PlateNet --use_detector
  • 测试视频文件(video_file填写视频文件路径,如data/test-video.mp4)
    
python demo.py --video_file data/test-video.mp4 --model_file work_space/PlateNet_Perspective_20240620_180901_1771/model/latest_model_199_0.8950.pth --net_type PlateNet --use_det
  • 测试摄像头(video_file填写摄像头USB ID号,一般是0,1,2)
    
python demo.py --video_file 0 --model_file work_space/PlateNet_Perspective_20240620_180901_1771/model/latest_model_199_0.8950.pth --net_type PlateNet --use_det

水表数字识别Demo效果展示:

   


7.水表识别数字识别效果(Android版本)

已经完成Android版本水表数字检测分割和识别算法开发,APP在普通Android手机上可以达到实时的检测和识别效果,CPU(4线程)约40ms左右,GPU约30ms左右 ,基本满足业务的性能需求。详细说明请查看:水表数字识别5:Android实现水表数字识别(含源码 可实时检测)

Android Demo体验:https://download.csdn.net/download/guyuealian/89537381

  


8.水表识别数字识别项目源码下载

整套项目源码内容包含:水表数字识别数据集+水表数字识别训练代码和测试代码

整套项目下载地址:Pytorch CRNN实现水表数字识别(含训练代码和数据集)

(1)水表数字识别数据集:

  • 水表数字检测数据集:Water-Meter-Det1,train训练集共有800张图片,val测试集共有200张图片,可用于水表数字检测模型和分割模型训练和开发。
  • 水表数字检测数据集:Water-Meter-Det2,仅包含训练集train,共有5742张图片,可用于水表数字检测模型和分割模型训练和开发。
  • 水表数字识别数据集:Water-Meter-Rec1,train训练集共有1600张图片,val测试集共有400张图片,可用于水表数字识别模型训练和开发
  • 水表数字识别数据集:Water-Meter-Rec2,仅包含训练集train,共有11436张图片,可用于水表数字识别模型训练和开发。

(2)水表数字识别训练代码和测试代码(Pytorch)

  • 提供水表数字识别模型训练代码,模型支持CRNN,LPRNet和PlateNet模型,train.py训练简单,简单配置config文件,即可开始训练
  • 提供训练好的水表数字识别模型权重文件,可直接运行demo.py进行测试
  • 提供训练好的水表数字分割模型权重文件
  • demo.py支持图片,视频和摄像头测试;
  • demo.py支持导出onnx文件(export=True)
  • demo.py支持对倾斜的图片进行透视变换矫正

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

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

相关文章

Qt中 .pro、.pri、.prf、.prl文件简解

一、pro文件 .pro就是工程文件(project),是Qt项目的主配置文件,用于描述整个项目的基本信息和编译配置。在Qt中用qmake生成makefile文件,它是由.pro文件生成而来的,.pro文件的具体格式语法如下&#xff1a…

Linux 显示文件行号命令

cat (可能要搭配grep 进行过滤) vi 或 vim (缺点可能会因为粗心,改动文件,如果要修改当没说)

分布式系列之ID生成器

背景 在分布式系统中,当数据库数据量达到一定量级后,需要进行数据拆分、分库分表操作,传统使用方式的数据库自有的自增特性产生的主键ID已不能满足拆分的需求,它只能保证在单个表中唯一,所以需要一个在分布式环境下都…

昇思25天学习打卡营第23天 | 基于MindSpore的红酒分类实验

学习心得:基于MindSpore的红酒分类实验 在机器学习的学习路径中,理解和实践经典算法是非常重要的一步。最近我进行了一个有趣的实验,使用MindSpore框架实现了K近邻(KNN)算法进行红酒分类。这个实验不仅加深了我对KNN算…

idea如何让包结构分层

文章目录 前言1.选中前项目包结构2.取消后项目包结构3.情况二 前言 在大型项目中,代码的分层管理至关重要。IDEA编辑器提供了强大的package分层结构功能,帮助开发者更好地组织和管理代码。通过合理配置,我们可以清晰地看到各个package之间的…

stm32平台为例的软件模拟时间,代替RTC调试

stm32平台为例的软件模拟时间,代替RTC调试 我们在开发项目的时候,如果用到RTC,如果真正等待RTC到达指定的时间,那调试时间就太长了。 比如每隔半个小时,存储一次数据,如果要观察10次存储的效果&#xff0…

在服务器调用api操作rabbitmq

不同的rabbitmq版本可能api不同,仅做参考,RabbitMQ 3.7.18。同时,我基本没看官方api文档,根据rabbitmq客户端控制台调用接口参数来决定需要什么参数。例如: 1、添加用户 curl -u 用户名:密码 -H “Content-Type: a…

蓝屏死机不再怕!CrowdStrike故障修复指南中心上线!

系统之家于7月22日发出最新报道,安全公司CrowdStrike因其Windows更新引发全球 850 万台电脑蓝屏死机问题后,上线了全新的“修复和指南中心”(Remediation and Guidance Hub),该中心汇集了与其错误更新相关的详细信息&a…

Android音视频—OpenGL 与OpenGL ES简述,渲染视频到界面基本流程

文章目录 OpenGL 简述特点和功能主要组件OpenGL ES当前状态 OpenGL ES 在 Android 上进行视频帧渲染总体流程 OpenGL 简述 OpenGL(Open Graphics Library)是一个跨平台的、语言无关的应用程序编程接口(API),用于开发生…

基于FPGA的数字信号处理(18)--半加器和全加器

前言 在数字系统中,加法运算是最常见的算术运算,同时它也是进行各种复杂运算的基础。 半加器 最简单的加法器叫做 半加器(Half Adder),它将2个输入1bit的数据相加,输出一个2bits的和,和的范围为…

航片转GIS数据自动化管线

近年来,计算机视觉领域的进步已显著改善了物体检测和分割任务。一种流行的方法是 YOLO(You Only Look Once)系列模型。YOLOv8 是 YOLO 架构的演进,兼具准确性和效率,是各种应用的绝佳选择,包括分割卫星航拍…

抖音短视频seo矩阵系统源码开发技术分享(二)--SaaS开源

目录 市场背景分析 一、抖音短视频seo矩阵系统开发部署流程 二、 源码开发功能构思 三、 抖音短视频seo源码开发部署注意事项 四、 部分开发代码展示 市场背景分析 抖音短视频seo矩阵系统是通过不同平台不同账号之间建立联系,通过将同一品牌下不同平台不同账号…

currentTarget和target

*.wxml *.js 点击按钮 发现 currentTarget 获取的是事件绑定者的参数 target 获取的是事件触发者的参数

ZYNQ 入门笔记(零):概述

文章目录 引言产品线Zynq™ 7000 SoCZynq UltraScale™ MPSoCZynq UltraScale RFSoCVersal™ Adaptive SoC 开发环境 引言 Xilinx FPGA 产品线从经济型的 Spartan、Artix 系列到高性能的 Kintex、Virtex、Versal 系列,可以说涵盖了 FPGA 的绝大部分应用场景&#x…

【iOS】内存对齐

内存对齐 OC基本数据类型所占字节数对比 注1:BOOL在32位机器被定义为char、在64位机器被定义为bool boolean_t在32位机器被定义为unsigned int、在64位机器被定义为int NSInteger在32位机器被定义为int、在64位机器被定义为long NSUInteger在32位机器被定义为unsig…

公司技术栈用到了RocketMQ,我对此块知识进行了回顾(初始RocketMQ)

前言 作为24届的校招生,不知道大伙儿们是否都已经到了工作岗位上。为了以后更方便的接触到公司的业务,我司为我们安排了将近一个月的实操。虽然不用敲代码,但是… 了解到我司使用到的技术栈,在空闲时间正好对RocketMQ这块技术做个…

服务器配置两个默认网关必须配置路由优先级

背景 对于具备多网口的服务器来说,启用多个网口很正常,正常情况下应该只有一个默认网关,其他网口配置明细路由,如果将服务器做为软路由,并且有两个外网网络,1主1备,则会需要配置网关默认网关&am…

C++笔试强训7

文章目录 一、选择题1-5题6-10题 二、编程题题目一题目二 一、选择题 1-5题 基础知识,函数代码少,频繁调用的时候才适合定义内联函数。 故选C。 在C中,inline关键字是用来向编译器建议将函数体在每个调用点“内联展开”的。这意味着编译器会…

前端表格解析方法

工具类文件 // fileUtils.tsimport { ref } from vue; import * as xlsx from xlsx;interface RowData {[key: string]: any; }export const tableData ref<RowData[]>([]);export async function handleFileSelect(url: string): Promise<void> {try {const res…

《无线互联科技》是什么级别的期刊?是正规期刊吗?能评职称吗?

​问题解答 问&#xff1a;《无线互联科技》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知网收录的正规学术期刊。 问&#xff1a;《无线互联科技》级别&#xff1f; 答&#xff1a;国家级。主管单位&#xff1a;江苏省科学技术厅 主办单位&#xff1a…