水表数字识别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-size | params(M) | GFLOPs | Accuracy |
LPRNet | 94×24 | 0.48M | 0.147GFlops | 0.9000 |
CRNN | 160×32 | 8.35M | 1.06GFlops | 0.9150 |
PlateNet | 168×48 | 1.92M | 1.25GFlops | 0.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水表数字识别数据
水表数字识别的训练数据和测试数据的数据格式,要求非常简单:
- 对水表数字区域进行裁剪时,请尽量保证数字的完整性,其他非数字区域尽量去除
- 强烈建议对水表进行倾斜校正,避免倾斜带来的影响;本项目已经实现水表数字区域的倾斜校正,具体方法请参考:Python OpenCV实现文档自动矫正(含源码和测试数据)
- 一张图片仅包含一个水表,不能出现多个水表
- 水表数字图片文件命名规则:水表数字_序号ID ;如【007225_image_000.jpg】,其中【007225】表示这个张图片的真实数字,【image_000】是序号ID,这个序号ID是为了避免水表数字重复,序号ID可以是任意字符;模型训练时,仅取水表数字作为label进行训练,序号ID会被忽略。
- 如果,你需要新增自己的水表数字识别数据集,请按照上面的要求制作即可
以下是水表数字识别数据的样本数据,请参考格式制作即可;项目源码已经附带了制作好的水表数字识别数据集,可以直接用于水表数字识别模型训练:
(3)构建模型
项目实现了三个识别模型:CRNN,LPRNet和PlateNet,其计算量和参数量参考如下:
- CRNN:最经典的OCR模型了,采用CNN+RNN的网络结构,提出CTC-Loss对齐算法解决不定长序列对齐问题;原始源码是用于文字识别的,稍微改成水表数据集,即可用于水表数字识别了
- LPRNet:相比经典的CRNN模型,LPRNet 没有采用RNN结构;是专门设计用于车牌识别的轻量级的模型,整个网络结构设计高度轻量化,参数量仅有0.48M
- PlateNet:LPRNet网络结构中存在MaxPool3d等算子,在端上部署时,会存在OP不支持等问题,PlateNet模型去除MaxPool3d,改成使用MaxPool2d,保证模型可端上部署成功。
模型 | input-size | params(M) | GFLOPs |
LPRNet | 94×24 | 0.48M | 0.147GFlops |
CRNN | 160×32 | 8.35M | 1.06GFlops |
PlateNet | 168×48 | 1.92M | 1.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_data | str, list | - | 训练数据文件,可支持多个文件 |
test_data | str, list | - | 测试数据文件,可支持多个文件 |
class_name | str | - | 类别文件 |
train_transform | str | train | 训练数据数据处理方法 |
test_transform | str | test | 测试数据数据处理方法 |
work_dir | str | work_space | 训练输出工作空间 |
net_type | str | CRNN | 骨干网络,支持CRNN,LPRNe和PlateNet等模型 |
intput_size | list | [160,32] | 模型输入大小 |
rgb_mean | list | [0.5,0.5,0.5] | 图像归一化均值 |
rgb_std | list | [0.5,0.5,0.5] | 图像归一化方差 |
resample | bool | True | 进行样本均衡 |
batch_size | int | 128 | 批训练大小 |
lr | float | 0.001 | 初始学习率大小 |
optim_type | str | Adam | 优化器,{SGD,Adam} |
milestones | list | [30,80,100] | 降低学习率的节点 |
momentum | float | 0.9 | SGD动量因子 |
num_epochs | int | 200 | 循环训练的次数 |
num_workers | int | 8 | DataLoader开启线程数 |
weight_decay | float | 5e-4 | 权重衰减系数 |
gpu_id | list | [ 0 ] | 指定训练的GPU卡号,可指定多个 |
log_freq | int | 10 | 显示LOG信息的频率 |
pretrained | str | model.pth | pretrained的模型 |
(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-size | params(M) | GFLOPs | Accuracy |
LPRNet | 94×24 | 0.48M | 0.147GFlops | 0.9393 |
CRNN | 160×32 | 8.35M | 1.06GFlops | 0.9343 |
PlateNet | 168×48 | 1.92M | 1.25GFlops | 0.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支持对倾斜的图片进行透视变换矫正
相关文章:

水表数字识别3:Pytorch CRNN实现水表数字识别(含训练代码和数据集)
水表数字识别3:Pytorch CRNN实现水表数字识别(含训练代码和数据集) 目录 水表数字识别3:Pytorch CRNN实现水表数字识别(含训练代码和数据集) 1.前言 2. 水表数字识别的方法 3. 水表数字识别数据集 4. 水表数字分割模型训练 5. 水表数字识别模型训…...
oracle数据文件损坏和误删dbf文件处理方法
加油,新时代打工人! 打开sqlplus sqlplus> “/as sysdba” (命令行登录sqlplus) SQL>shutdown abort; (关闭oracle数据库服务器) SQL>startup mount ;(挂载oracle数据库,这…...

postMessageXss续2
原文地址如下:https://research.securitum.com/art-of-bug-bounty-a-way-from-js-file-analysis-to-xss/ 在19年我写了一篇文章,是基于postMessageXss漏洞的入门教学:https://www.cnblogs.com/piaomiaohongchen/p/14727871.html 这几天浏览mXss技术的时候ÿ…...
【深度学习】sdxl的Lora训练技巧
在进行SDXL LoRA训练时,有一些技巧和最佳实践可以帮助你获得更好的结果。以下是一些重要的建议: 图像选择与标注: 选择多样化的高质量图像是关键,建议至少使用30到50张分辨率为1024x1024的图像【8†source】【9†source】。使用Vi…...

推荐一款 Android 手机端的 SSH 远程连接工具
https://andi.cn/page/621590.html...
3.1、matlab双目相机标定实验
1、双目相机标定原理及流程 双目相机标定是将双目相机系统的内外参数计算出来,从而实现双目视觉中的立体测量和深度感知。标定的目的是确定各个摄像头的内部参数(如焦距、主点、畸变等)和外部参数(如相机位置、朝向等),以便将双目相机捕获的图像转换为三维空间坐标。 双…...

IntelliJ IDEA 直接在软件中更新为最新版
当我们的 IDEA 工具许久没有更新,已经拖了好几个版本,想跨大版本更新,比如从2020.2.1 -> 2023.x.x 此时,我们菜单栏点击 Help -> Check for Updates… ,右下角会有提示更新,如下图: 点…...
库卡机器人示教器 KPC2 00107-264 KPC200.107-264
库卡驱动器是一种高性能的控制器,其作用类似于变频器在普通交流马达中的应用。它通过位置、速度和力矩三种方式对伺服马达进行控制,以满足各种高精度定位系统的需求。库卡驱动器是伺服系统的重要组成部分,广泛应用于各种工业自动化领域。 库…...

数据传输安全--VPN
目录 前置知识 VPN概念 VPN诞生的原因 VPN分类 根据建设的单位不同分类 企业自建的VPN 运营商搭建的VPN 根据组网方式不同来进行分类 Client to LAN VPN LAN to LAN VPN按层次划分 VPN常用技术 VPN的核心技术 VPN封装过程的角色 VPN包含的技术 身份认证技术 加…...
【人工智能】人工智能可解释性和透明度的详细探讨
人工智能的可解释性和透明度是当前AI领域的重要议题,它们对于AI系统的公正性、可靠性、用户信任以及合规性等方面都具有深远的影响。以下是对人工智能可解释性和透明度的详细探讨: 一、人工智能的可解释性 定义: 可解释性是指机器学习模型…...

vscode+wsl2+anaconda环境的配置与使用
目录 下载anaconda Anaconda使用参考 vscodeubuntuanaconda 先用vscode连接本地ubuntu。 如果没有安装wsl2与ubuntu,可点击下面的链接。 问题:wsl install 无法解析服务器 成功记录: 在vscode终端用ubuntu安装anaconda。 创建pytho…...

【Linux网络】套接字编程
本篇博客整理了 socket 套接字编程的相关内容,包括 socket 网络通信原理、socket 相关的系统调用接口等,分别演示了基于UDP协议、TCP协议的 socket 网络编程,旨在让读者更加深入理解网络通信原理和设计,对网络编程有初步的认识和掌…...

在线 PDF 制作者泄露用户上传的文档
两家在线 PDF 制作者泄露了数万份用户文档,包括护照、驾驶执照、证书以及用户上传的其他个人信息。 我们都经历过这样的情况:非常匆忙,努力快速制作 PDF 并提交表单。许多人向在线 PDF 制作者寻求帮助,许多人的祈祷得到了回应。 …...
SQL概述及其规则与规范
SQL概述及其规则与规范 1.SQL概述 1.1 SQL背景知识 1946年,世界第一台电脑诞生,如今,互联网已经非常壮大,在这几十年间互联网得到了飞速的发展,无数的技术在其中起起伏伏,但是有一门技术从未消失…...

开源模型应用落地-FastAPI-助力模型交互-进阶篇-RequestDataclasses(三)
一、前言 FastAPI 的高级用法可以为开发人员带来许多好处。它能帮助实现更复杂的路由逻辑和参数处理,使应用程序能够处理各种不同的请求场景,提高应用程序的灵活性和可扩展性。 在数据验证和转换方面,高级用法提供了更精细和准确的控制&#…...
2024.7.20 暑期训练记录(6)
CF 1391D - 505(思维状压dp) 首先简化问题,发现一个矩阵如果要满足条件,那它其中的每一个 2 2 2\times 2 22 的小矩阵都要满足条件,于是很容易发现 4 4 4\times4 44 的矩阵是一定不满足条件的(因为是…...
firefly rk3288 ubuntu23.10 网卡名为end0 改为eth0
1、内核源码修改u-boot/include/env_default.h文件第32行的bootargs参数,修改后: "bootargs net.ifrenames0 " CONFIG_BOOTARGS "\0"2、修改rootfs里的lib/systemd/network/99-default.link文件: [M…...

git使用总结
概述 简介 Git是一种代码托管技术,很多代码托管平台也是基于Git来实现的。 Git可以帮我们做到很多的事情,比如代码的版本控制,分支管理等。 网址 git官网:https://git-scm.com/ 版本控制系统【VCS】 可以完整保存项目的快照&#…...

使用多进程和多线程实现服务器并发【C语言实现】
在TCP通信过程中,服务器端启动之后可以同时和多个客户端建立连接,并进行网络通信,但是在一个单进程的服务器的时候,提供的服务器代码却不能完成这样的需求,先简单的看一下之前的服务器代码的处理思路,再来分…...

深入理解Linux网络(三):TCP对象创建
深入理解Linux网络(三):TCP对象创建 TCP对象创建inet_createsock_init_data TCP对象创建 常见的三句TCP编程: int main() {int sk socket(AF_INET, SOCK_STREAM, 0);connect(sk, ...)recv(sk, ...) }简单的两三⾏代码ÿ…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...

基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...

协议转换利器,profinet转ethercat网关的两大派系,各有千秋
随着工业以太网的发展,其高效、便捷、协议开放、易于冗余等诸多优点,被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口,具有实时性、开放性,使用TCP/IP和IT标准,符合基于工业以太网的…...

leetcode73-矩阵置零
leetcode 73 思路 记录 0 元素的位置:遍历整个矩阵,找出所有值为 0 的元素,并将它们的坐标记录在数组zeroPosition中置零操作:遍历记录的所有 0 元素位置,将每个位置对应的行和列的所有元素置为 0 具体步骤 初始化…...
从零手写Java版本的LSM Tree (一):LSM Tree 概述
🔥 推荐一个高质量的Java LSM Tree开源项目! https://github.com/brianxiadong/java-lsm-tree java-lsm-tree 是一个从零实现的Log-Structured Merge Tree,专为高并发写入场景设计。 核心亮点: ⚡ 极致性能:写入速度超…...