水表数字识别2:Pytorch DBNet实现水表数字检测(含训练代码和数据集)

水表数字识别2:Pytorch DBNet实现水表数字检测(含训练代码和数据集)


目录

水表数字识别2:Pytorch DBNet实现水表数字检测(含训练代码和数据集)

1.前言

2. 水表数字识别的方法

3. 水表数字识别数据集

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

(1)项目安装

(2)构建Train和Test水表数据集

(3)构建模型

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

(5)开始训练

(6)可视化训练过程

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

6. 水表数字检测效果(Python版本)

7. 水表数字检测效果(Android版本)

8. 水表数字分割项目源码下载

(1)水表数字分割(推理版本)

(2)水表数字分割(训练版本)


1.前言

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

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

项目提供两个版本的水表数字分割模型DBNetFast-SCNN模型,其中DBNet参数量比较大,计算量也大,检测精度较高;Fast-SCNN是轻量化模型,参数量较小,计算量也小,但精度较小;下表格给出文本(数字)检测模型DBNet和Fast-SCNN的计算量和参数量,以及其预测结果的均方误差MSE:

模型input-sizeparams(M)GFLOPsMSEmIOU

DBNet

320×320

9722.27M

12.22M

0.1508

0.9333

Fast-SCNN

320×320

1.24M

939.01M

0.1997

0.9531

水表数字检测效果展示:

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


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

  • 水表数字识别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. 水表数字分割模型训练

(1)项目安装

.
├── configs             # 项目配置文件
├── segment             # 分割模型代码
├── data                # 项目相关数据
├── docs                # 一些说明文档
├── libs                # 第三方依赖库
├── output              # 运行输出结果
├── README.md           # 项目说明文档
├── demo.py             # 项目Demo测试文档
├── demo.sh             # 项目Demo测试脚本
├── 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水表数据集

下载水表检测数据集:Water-Meter-Det1和Water-Meter-Det2,具体介绍,请参考:《水表数字识别1:水表数字数据集说明(含下载链接)》,项目支持在该数据集直接训练,无须进行格式转换。

(3)构建模型

项目提供两个版本的水表数字分割模型DBNet和Fast-SCNN模型;DBNet属于高精度版本,参数量和计算量较大,检测精度较高,但比较耗时;Fast-SCNN模型属于轻量化版本,参数量和计算量较小,检测精度一般,速度较快,适合移动端部署。下表给出计算量和参数量:

模型input-sizeparams(M)GFLOPs

DBNet

320×320

9722.27M

12.22M

Fast-SCNN

320×320

1.24M

939.01M

  • DBNet: 是一种基于分割的文本检测算法,其核心思路是引入一个可微分二值化模块(Differentiable Binarization),生成一个的阈值图,使得模型分割能够自适应进行二值化GitHub - WenmuZhou/DBNet.pytorch: A pytorch re-implementation of Real-time Scene Text Detection with Differentiable Binarization

  • Fast-SCNN:是一种快速分割卷积神经网络(Fast-SCNN),是针对高分辨率图像数据的实时语义分割模型,适用于低内存嵌入式设备上的高效计算​​​​​​。https://github.com/Tramac/Fast-SCNN-pytorch

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

准备好数据好,下一步是修改配置文件configs/config_labelme_db.yaml的数据路径,其他参数默认即可:

  • 修改train_data和test_data为你自己的数据路径
  • 其他参数保持默认即可
train_data:- "/home/Pan/WaterMeter/Water-Meter-Det1/train/json"- "/home/Pan/WaterMeter/Water-Meter-Det2/train/json"
test_data: '/home/Pan/WaterMeter/Water-Meter-Det1/val/json'class_name: [ "BACKGROUND", "unique" ]
use_rgb: False
train_transform: "db_train"
test_transform: "db_test"
data_type: "labelme_db"
target: "regress" # matting,segment
padding: False
resample: False
work_dir: "work_space/WaterMeter_regress"
net_type: "dbnet_resnet18" # dbnet_MobileNetV3,dbnet_resnet18
loss_type: "DBLoss"  # FocalLoss,CrossEntropyLoss,LabelSmoothing,MODLoss,PaddleMODLoss,SmoothL1Loss
width_mult: 1.0
flag: "sr09"
input_size: [ 320, 320 ]
rgb_mean: [ 0.5, 0.5, 0.5 ]  # for normalize inputs to [-1, 1],Sequence of means for each channel.
rgb_std: [ 0.5, 0.5, 0.5 ]   # for normalize,Sequence of standard deviations for each channel.
batch_size: 32
lr: 0.01
optim_type: "SGD"             # SGD,Adam
momentum: 0.9              # SGD momentum
num_epochs: 200
num_warn_up: 3
num_workers: 8
scheduler: "multi-step"
milestones: [ 60,130,160 ]
weight_decay: 0.0005 #5e-4
gpu_id: [ 0 ]
start_save: -1
log_freq: 10
progress: True
check: False
pretrained: False
finetune: ""

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

参数类型参考值说明
train_datastr, list-训练数据文件,可支持多个文件
test_datastr, list-测试数据文件,可支持多个文件
data_typestrlabelme_db数据类型
class_namestr,list-类别文件
train_transformstrtrain训练数据数据处理方法
test_transformstrtest测试数据数据处理方法
work_dirstrwork_space训练输出工作空间
targetstrregress任务,regress表示回归任务,segment是分类任务
net_typestrdbnet_resnet18骨干网络,支持dbnet_resnet18
和fast_scnn_reg等模型
intput_sizelist[320,320]模型输入大小
rgb_meanlist[0.5,0.5,0.5]图像归一化均值
rgb_stdlist[0.5,0.5,0.5]图像归一化方差
batch_sizeint64批训练大小
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)开始训练

整套训练代码非常简单操作,项目源码已经给出DBNet和Fast-SCNN模型配置文件;用户配置好Python环境,只需要修改好配置文件的的数据路径,即可开始训练了。

  • 训练DBNet模型
python train.py -c  configs/config_labelme_db.yaml
  • 训练Fast-SCNN模型
python train.py -c  configs/config_labelme_reg.yaml

(6)可视化训练过程

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

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

Tensorboard的使用方法可以参考这里:项目开发使用教程和常见问题和解决方法_pip安装tensorboard-CSDN博客 

训练完成后,DBNet模型的测评指标均方误差MSE约0.1508左右;轻量化模型Fast-SCNN的均方误差MSE约0.1997左右;下表格给出水表数字检测模型DBNet和Fast-SCNN的计算量和参数量,以及其预测结果的均方误差MSE和mIOU:

指标说明:DBNet训练时,数据处理需要生成缩小轮廓的概率图增大轮廓的阈值图,导致与真实的轮廓有差异,从而导致最终的测评指标mIOU的结果偏低,但从指标均方误差MSE看,DBNet明显比Fast-SCNN效果好的

模型input-sizeparams(M)GFLOPsMSEmIOU

DBNet

320×320

9722.27M

12.22M

0.1508

0.9333

Fast-SCNN

320×320

1.24M

939.01M

0.1997

0.9531

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

本篇主要介绍水表数字分割模型训练,关于水表数字识别模型训练,请参考《

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


6. 水表数字检测效果(Python版本)

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

demo.py源码:

  • 测试图片
python demo.py --config_file work_space/WaterMeter_regress/regress_dbnet_resnet181.0_320_320_DBLoss_SGD_sr09_20240624153213/config_labelme_db.yaml --model_file work_space/WaterMeter_regress/regress_dbnet_resnet181.0_320_320_DBLoss_SGD_sr09_20240624153213/model/latest_model_199_0.9334.pth --image_dir data/test_image
  • 测试视频文件(video_file填写视频文件路径,如data/test-video.mp4)
python demo.py --config_file work_space/WaterMeter_regress/regress_dbnet_resnet181.0_320_320_DBLoss_SGD_sr09_20240624153213/config_labelme_db.yaml --model_file work_space/WaterMeter_regress/regress_dbnet_resnet181.0_320_320_DBLoss_SGD_sr09_20240624153213/model/latest_model_199_0.9334.pth --video_file data/test-video.mp4
  • 测试摄像头(video_file填写摄像头USB ID号,一般是0,1,2)
python demo.py --config_file work_space/WaterMeter_regress/regress_dbnet_resnet181.0_320_320_DBLoss_SGD_sr09_20240624153213/config_labelme_db.yaml --model_file work_space/WaterMeter_regress/regress_dbnet_resnet181.0_320_320_DBLoss_SGD_sr09_20240624153213/model/latest_model_199_0.9334.pth --video_file 0

 水表数字分割Demo效果展示(左是原图输入,中是模型输出分割效果,右是透视矫正后的效果):


7. 水表数字检测效果(Android版本)

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

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

  

8. 水表数字分割项目源码下载

整套项目源码分为训练版本和推理版本,推理版本只提供推理代码和推理模型,不包含数据和训练代码;训练版本提供推理代码和推理模型,并提供训练数据和训练相关的整套代码。

(1)水表数字分割(推理版本)

下载地址:Pytorch DBNet实现水表数字检测(Python推理版本)

  • 提供水表数字分割模型的推理和测试代码,不含水表数字识别模型
  • 提供高精度版本DBNe模型,参数量和计算量较大,检测精度较高,比较耗时;
  • 提供轻量化版本Fast-SCNN模型,参数量和计算量较小,检测精度一般,速度较快;
  • 提供DBNe和Fast-SCNN模型训练好的模型权重文件,可以直接使用,配置好环境,可直接运行demo.py
  • 提供推理测试文件demo.py,支持图片,视频和摄像头测试

(2)水表数字分割(训练版本)

下载地址:资源整理中。。。

水表数字数据集+水表数字分割训练代码和测试代码(Pytorch)

  • 提供整套项目水表数字分割模型推理和训练的完整代码,支持模型训练和测试,不含水表数字识别模型
  • 提供高精度版本DBNe模型,参数量和计算量较大,检测精度较高,比较耗时;
  • 提供轻量化版本Fast-SCNN模型,参数量和计算量较小,检测精度一般,速度较快;
  • 提供DBNe和Fast-SCNN模型训练好的模型权重文件,可以直接使用,配置好环境,可直接运行demo.py
  • 提供推理测试文件demo.py,支持图片,视频和摄像头测试
  • 提供水表数字数据集:Water-Meter-Det1和Water-Meter-Det2,总数约6000+张图片,主要用于水表数字检测模型或分割模型训练和开发;Water-Meter-Rec1和Water-Meter-Rec2,总数约12000+张图片,主要用于水表数字识别模型训练和开发

本篇是水表数字分割内容,如果需要实现水表数字识别,请参考第三篇文章:

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

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

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

相关文章

JavaSE 面向对象程序设计进阶 IO 压缩流 解压缩流

目录 解压缩流 压缩流 解压缩流 压缩包 压缩包里面的每一个文件在java中都是一个ZipEntry对象 把每一个ZipEntry按照层级拷贝到另一个文件夹当中 import java.io.*; import java.util.Date; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream;public cl…

c#与欧姆龙PLC通信——如何更改PLC的IP地址

前言 我们有时候需要改变欧姆龙Plc的ip地址,下图有两种更改方式,一种是已知之前Plc设置的Ip地址,还有一种是之前不知道Pl的Ip地址是多少,下面分别做介绍。 1、已知PLC的IP地址的情况下更改地址 假设已知PLC的Ip地址,比如本文中PLC的IP为192.168.1.2,我首先将电脑的IP地…

17:低功耗篇(PWR)---HAL库

一:PWR 1:简历 PWR(Power Control)电源控制 PWR负责管理STM32内部的电源供电部分,可以实现可编程电压监测器和低功耗模式的功能 可编程电压监测器(PVD)可以监控VDD电源电压,当VDD下降到PVD阀值以下或上升到…

51单片机9(使用左移实现流水灯编程)

一、序言:下面我们来给大家介绍一下这个流水灯,流水灯如何来实现?我们依然使用这个工程来完成它。 1、那要使用实现这个流水灯,那我们只需要让D1到D8逐个的点亮,那同样要实现它足够的点亮,也会涉及到延时&…

使用requirements.txt文件安装cuda(GPU)版本的pytorch

使用requirements.txt文件安装cuda(GPU)版本的pytorch 问题描述解决方法 问题描述 使用requirements.txt可以轻松地帮助我们配置新环境,然而,当使用requirements.txt安装pytorch时有时会出现仅能安装cpu版本pytorch的情况。 举例…

从汇编层看64位程序运行——函数的调用和栈平衡

函数调用 不知道有没有人想过一个问题:A函数调用B函数,B函数是如何知道在调用结束后回到A函数中的? 比如下面的代码,main函数调用foo。当foo执行完毕,需要执行main函数的return 0语句。但是main和foo是割裂的&#x…

Vulnhub靶场DC-3-2练习

目录 0x00 准备0x01 主机信息收集0x02 站点信息收集0x03 漏洞查找与利用1. joomla漏洞查找2. SQL注入漏洞3. 破解hash4. 上传一句话木马5. 蚁剑连接shell6. 反弹shell7. 提权 0x04 总结 0x00 准备 下载链接:https://download.vulnhub.com/dc/DC-3-2.zip 介绍&#…

一文清晰了解CSS——简单实例

首先一个小技巧: 一定要学会的vsCode格式化整理代码的快捷键,再也不用手动调格式了-腾讯云开发者社区-腾讯云 (tencent.com) CSS选择器用于选择要应用样式的HTML元素。常见的选择器包括: 类选择器:以.开头,用于选择具…

React Element介绍

React Element是React中的核心概念之一,它代表了React应用中的UI元素。React Element并不是真实的DOM节点,而是一个轻量级的、不可变的、描述性的对象,它包含了创建UI所需的类型(type)、属性(props&#xf…

前端框架前置知识之Node.js:模块化、导入导出语法、包的概念、npm介绍

什么是模块化? 在Node.js中,每一个文件都被视为一个单独的模块 概念:项目是由很多个模块文件组成的 好处:提高代码复用性,按需加载,独立作用域 使用:需要标准语法导出和导入进行使用 导入导…

在pycharm 2023.2.1中运行由R语言编写的ipynb文件

在pycharm 2023.2.1中运行由R语言编写的ipynb文件 背景与目标: 项目中包含由R语言编写的ipynb文件,希望能在pycharm中运行该ipynb文件。 最终实现情况: 未能直接在pycharm中运行该ipynb文件,但是替代的实现方法有:…

自然语言处理(NLP)——法国工程师IMT联盟 期末考试题

1. 问题1 (法语)En langue arabe lcrasante majorit des mots sont forms par des combinaisons de racines et de schmes. Dans ce mcanisme... (英语)In Arabic language the vast majority(十之八九) of…

ServiceNow UI Jelly模板注入漏洞复现(CVE-2024-4879)

0x01 产品简介 ServiceNow 是一个业务转型平台。通过平台上的各个模块,ServiceNow 可用于从人力资源和员工管理到自动化工作流程或作为知识库等各种用途。 0x02 漏洞概述 由于ServiceNow的Jelly模板输入验证不严格,导致未经身份验证的远程攻击者可通过构造恶意请求利用,在…

在线图书销售管理系统设计

在线图书销售管理系统的设计是一个涉及多个模块和功能的复杂项目,它旨在提高图书销售的效率,优化库存管理,提升用户体验,以及提供数据分析支持。以下是系统设计的一些关键组成部分: 1. 需求分析 用户需求&#xff1a…

[综述笔记]Functional neuroimaging as a catalyst for integrated neuroscience

论文网址:Functional neuroimaging as a catalyst for integrated neuroscience | Nature 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔…

Stable Diffusion 使用

目录 背景 最简单用法 进阶用法 高手用法 safetensor 一、概述 二、主要特点 背景 Stable Diffusion 开源后,确实比较火,上次介绍了下 Stable Diffusion 最简单的concept。今天继续介绍下,以Liblib 为例,介绍下如何使用参…

807.力扣每日一题7/14 Java(执行用时分布击败100%)

博客主页:音符犹如代码系列专栏:算法练习关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ 目录 解题思路 解题过程 时间复杂度 空间复杂度 Code 解题思路 首先…

LLM上下文长度扩展方案:YaRN

文章目录 I. 前言II. NTK-by-partsIII. YaRNIV. Dynamic NTK 题目: YaRN: Efficient Context Window Extension of Large Language Models 论文地址: YaRN: Efficient Context Window Extension of Large Language Models I. 前言 在之前的两篇文章中分…

RuoYi-后端管理项目入门篇1

目录 前提准备 下载若依前后端 Gitee 地址 准备环境 后端数据库导入 1 克隆完成 若依后端管理后端 Gitte 地址 :若依/RuoYi-Vue 2.1 创建Data Source数据源 2.2 填写好对应的数据库User 和 Password 点击Apply 2.3 新建一个Schema 2.4 填写对应数据库名称 这边演示写的…

【工具使用】adb下载和配置

【工具使用】adb下载和配置 一,简介二,操作步骤2.1 Bing搜索adb2.2 下载adb工具2.3 添加路径到环境变量 三,效果验证 一,简介 本文主要介绍如何下载adb并安装使用,供参考。 此时打开cmd,输入adb 会提示&am…