PaddleOCR #使用PaddleOCR进行光学字符识别(PP-OCR文本检测识别)

news2024/9/21 18:50:34

引言: PaddleOCR 是一个 OCR 框架或工具包,它提供多语言实用的 OCR 工具,帮助用户在几行代码中应用和训练不同的模型。PaddleOCR 提供了一系列高质量的预训练模型。这包含三种类型的模型,使 OCR 高度准确并接近商业产品。它提供文本检测、文本方向分类器和文本识别。PaddleOCR 在其工具包中提供了多种模型,包括旗舰 PP-OCR 和最新算法,如 SRN、NRTR 等。
OCR-002
PaddleOCR 还根据大小提供不同的模型。

  • 轻量级模型 ——占用更少内存、速度更快但准确性有所妥协的模型。
  • 服务器模型(重量级)——占用更多内存但更准确但速度有所妥协的模型。

PaddleOCR 支持 80 多种语言(取决于使用的 OCR 算法)。但是旗舰级的PP-OCR提供了中英文两种语言的支持。旗舰 OCR 算法 PP-OCR 是可用的最佳 OCR 工具之一。到目前为止,它已经有PP-OCR、PP-OCRv2 和 PP-OCRv3三个版本。如前一节所述,所有这些模型都建立在 CRNN 之上,并且是超轻量级的。让我们来看看并将其应用到一些各种类型的场景中。

 

一、OCR环境搭建

接下来我们将实现 PaddleOCR 的 PP-OCRv3。
首先,让我们安装所需的工具包和依赖项。这些依赖项和工具将帮助我们访问 OCR 实验环境所需的所有必需文件和脚本。

Windows 下的 PIP 安装:
更多环境安装请参考官方文档:Windows 下的 PIP 安装-使用文档-PaddlePaddle深度学习平台

1.1 环境准备

1)查看你的环境
需要确认 python 的版本是否满足要求。WIN键+R打开CMD命令窗口,使用以下命令确认是 3.6/3.7/3.8/3.9/3.10

python --version

参考结果:
ocr-02-04

2)需要确认 pip 的版本是否满足要求,要求 pip 版本为 20.2.2 或更高版本

python -m pip --version

参考结果:
ocr-02-06
3)需要确认 Python 和 pip 是 64bit,并且处理器架构是 x86_64(或称作 x64、Intel 64、AMD64)架构

python -c "import platform;print(platform.architecture()[0]);print(platform.machine())"

下面的第一行输出的是”64bit”,第二行输出的是”x86_64”、”x64”或”AMD64”即可:
ocr-02-08
 

1.2 开始安装

如果你的计算机有 NVIDIA GPU,请在 CMD 模式中运行以下命令安装 GPU 版的 PaddlePaddle:

pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple

如果你的计算机没有 NVIDIA GPU,请在 CMD 模式中运行以下命令安装 CPU 版的 PaddlePaddle(小编用的是CPU环境)

# 安装最新版本方式
pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
# 安装指定版本方式
pip install paddlepaddle==2.4.2 -i https://pypi.tuna.tsinghua.edu.cn/simple

ocr-02-10

 

1.3 验证安装

安装完成后你可以使用 python 进入 python 解释器,输入import paddle ,再输入 paddle.utils.run_check()
如果出现 PaddlePaddle is installed successfully!,说明你已成功安装。
ocr-02-12
 

1.4 如何卸载

如需卸载或重新安装,请使用以下命令卸载 PaddlePaddle:

  • CPU 版本的 PaddlePaddle: python -m pip uninstall paddlepaddle
  • GPU 版本的 PaddlePaddle: python -m pip uninstall paddlepaddle-gpu

 

二、OCR便捷使用

下载 opencv 开源项目: https://github.com/spmallick/learnopencv/tree/master/Optical-Character-Recognition-using-PaddleOCR

2.1 命令行使用

PaddleOCR 源码提供了一系列测试图片,位置:.\Optical-Character-Recognition-using-PaddleOCR\PaddleOCR\doc\imgs
如果没有,点击 这里 下载并解压,然后在终端中切换到相应目录。
如果不使用提供的测试图片,可以将下方 --image_dir 参数替换为自己相应的测试图片路径。

2.1.1 中英文模型

在源码中找一张中文图片:
ocr-02-14
检测 + 方向分类器 + 识别全流程:

  • --use_angle_cls true 设置使用方向分类器识别180度旋转文字
  • --use_gpu false 设置不使用 GPU
paddleocr --image_dir ./doc/imgs/11.jpg --use_angle_cls true --use_gpu false

结果是一个list,每个item包含了文本框,文字和识别置信度:
ocr-02-16
查看源码可知,默认开启的是中文 ch 模式,检测(–det)默认已开启,识别(–rec)默认已开启。

  • img:这是ocr函数中的第一个参数。在此,传递图像数组或图像路径以执行OCR
  • det:以 bool 作为参数并指定是否使用检测器
  • rec:以 bool 作为参数并指定是否使用识别器
  • cls:以bool为参数,指定是否使用角度分类器

ocr-02-18

单独使用检测:设置 --rec 为 false

paddleocr --image_dir ./doc/imgs/11.jpg --rec false

单独使用识别:设置 --det 为 false

paddleocr --image_dir ./doc/imgs_words/ch/word_4.jpg --det false

2.1.2 多语言模型

1)英语

ocr-02-20
PaddleOCR 目前支持80个语种,可以通过修改 --lang 参数进行切换,比如使用英文模型,指定 --lang=en

paddleocr --image_dir ./doc/imgs_en/model_prod_flow_en.png --lang=en

结果是一个list,每个item包含了文本框,文字和识别置信度:
ocr-02-22

2)日语

像这样一张带有日文的图片:
ocr-02-24
CMD 执行命令:

paddleocr --image_dir ./doc/imgs/japan_1.jpg --lang=japan

如果设置的语言,在本机环境中没有对应的语言包,则会自动进行下载:
ocr-02-26
附 常用的多语言简写包括:
ocr-02-28

 

2.2 Python脚本使用

通过 Python 脚本使用 PaddleOCR whl 包,whl 包会自动下载 ppocr 轻量级模型作为默认模型。

pip install "paddleocr>=2.0.1" # 推荐使用2.0.1+版本

对于Windows环境用户:直接通过pip安装的shapely库可能出现 [winRrror 126] 找不到指定模块的问题。建议从 这里下载 shapely安装包完成安装。小编下载的版本是 Shapely-1.8.2-cp311-cp311-win_amd64.whl

备注:2.2 节点用到的测试图片皆来自于源码项目目录:Optical-Character-Recognition-using-PaddleOCR\input_images

检测 + 方向分类器 + 识别全流程,工具类代码案例(.\PaddleOCR\applications\ocr_img_util.py):

# Importing required methods for inference and visualization.
from paddleocr import PaddleOCR, draw_ocr
# 显示结果
from PIL import Image

# Importing required libraries.
import os
import cv2
import matplotlib.pyplot as plt

# 初始化OCR,OCR会自动下载PP-OCRv3检测器、识别器和角度分类器
ocr = PaddleOCR(use_angle_cls=True)

# 指定输出路径和字体路径
out_path = './output_images'
font = './doc/fonts/simfang.ttf'



# Applying OCR
def ocr_img(img_path):
  print("OCR 图片识别地址:", img_path)

  result = ocr.ocr(img_path)
  print("OCR 图片识别结果:", result)

  # 通过使用 result = result[0] 移除外部的一维来解决 paddleocr\tools\infer\utility.py 文件中 draw_ocr 函数的 TypeError: '<' not supported between instances of 'tuple' and 'float'
  result = result[0]
  print("移除一维后图片识别结果:", result)

  # 保存可视化OCR检测识别结果
  save_ocr(img_path, out_path, result, font)



# 绘制和保存结果
def save_ocr(img_path, out_path, result, font):
  save_path = os.path.join(out_path, img_path.split('/')[-1].split('.')[0] + '-test-output.jpg')
  print("save_path:", save_path)
  
  # 函数用于从磁盘加载图像文件并将其作为NumPy数组加载到内存中。可以通过该数组进行进一步的图像处理和分析操作。
  image = cv2.imread(img_path)

  # 从输出列表中提取框、文本及其分数
  boxes = [line[0] for line in result]
  print("boxes:", boxes)

  txts = [line[1][0] for line in result]
  print("txts:", txts)

  scores = [line[1][1] for line in result]
  print("scores:", scores)

  # 使用 PaddleOCR 内置函数绘制输出
  # 可视化OCR检测识别结果
  #   参数:
  #       图像(图像|数组):RGB图像
  #       盒子(列表):形状为(N, 4, 2)的盒子
  #       txts(list): 文本
  #       scores(list): txxs对应的分数
  #       drop_score(float):只有大于 drop_threshold 的分数才会被可视化
  #       font_path:用于绘制文字的字体路径
  #   返回(数组):
  #       可视化 img
  im_show = draw_ocr(image, boxes, txts, scores, 0.5, font)
  
  # imwrite 是OpenCV库中的一个函数,用于将图像保存到文件中。它接受两个参数:文件路径和要保存的图像。
  cv2.imwrite(save_path, im_show)

  # cvtColor 是OpenCV库中的一个函数,用于颜色空间转换。
  # 它可以将一幅图像从一个颜色空间转换为另一个颜色空间,比如将彩色图像转换为灰度图像或将图像从BGR颜色空间转换为RGB颜色空间。
  img = cv2.cvtColor(im_show, cv2.COLOR_BGR2RGB)

  # 函数用于在图像窗口中显示图像。
  # 它接受一个图像作为输入,并在一个新的窗口中显示该图像。通常,它用于图像的可视化和调试,以便查看处理后的图像结果。
  plt.imshow(img)

1)收据

收据是 OCR 被广泛使用并具有大量商业用途的文档之一。它可用于提取重要信息,如账单金额、税金、买家信息等。例如,查看此图像并对其应用 OCR。
ocr-02-30

from ocr_img_util import ocr_img

# Applying OCR
img_path = './input_images/05-receipt1.jpg'
ocr_img(img_path)

结果可视化:
ocr-02-32
让我们在另一张小票图片上测试我们的 OCR。
ocr-02-34

from ocr_img_util import ocr_img

# Applying OCR
img_path = './input_images/05-receipt1.jpg'
ocr_img(img_path)

ocr-02-36
可以看出,OCR 在收据上的表现非常出色。它已经能够捕获几乎所有的详细信息,例如金额、订单、订单号等,并且与收据的数字顺序相同。因此,我们可以说 PP-OCR 在收据和类似文件上的表现相当不错。

2)身份证

身份证主要用于安全目的和识别目的。当 OCR 应用于 ID 卡时,它可用于提取姓名、代码、分支机构等信息,这些信息可用于在电子门上进行访问或将信息存储在数据库中。我们将在下图上尝试 OCR。
ocr-02-38

from ocr_img_util import ocr_img

# Applying OCR
img_path = './input_images/09-id-card.jpg'
ocr_img(img_path)

ocr-02-40
哇!!那很快而且非常准确。它检测了所有字段,如船号、日期、ID 号等,即使文本倾斜,这些也是这里的关键信息。

3)文件

文档识别一直是 OCR 的重要研究领域之一。在我们的生活中几乎每天都在使用文档。当 OCR 应用于文档时,它可用于检索重要信息、检索表单字段、分析布局、数字存储以及阅读旧手稿。所有这些任务都可以使用 OCR 轻松完成。
ocr-02-42

from ocr_img_util import ocr_img

# Applying OCR
img_path = './input_images/11-document-1.jpg'
ocr_img(img_path)

ocr-02-44
输出在检测和识别方面都非常准确。PP-OCR 能够检测文档中的所有文本字段,并且识别器在识别这些文本方面做得非常出色。识别出来的文字看起来很准确,对特殊字符和空格的检测也很准确。

我们在另一个类似的文档上实现 OCR。
ocr-02-46

from ocr_img_util import ocr_img

# Applying OCR
img_path = './input_images/13-document-2.png'
ocr_img(img_path)

ocr-02-48
此图像中的检测器遗漏了此文档图像中的一些文本。但是,无论检测器检测到什么文本,OCR 都能正确预测。从文档图像来看,我们可以说检测器和识别器不擅长处理小文本。当遇到小文本时,它会错过或错误地预测输出。

4)手写文件

我们还可以在手写文本文档上测试我们的管道。例如,我们来试试这张图片。
ocr-02-50

from ocr_img_util import ocr_img

# Applying OCR
img_path = './input_images/15-document-3.jpg'
ocr_img(img_path)

ocr-02-52
如图所见,从结果看原文,OCR 根本不准确。尽管检测器非常好,但识别器一点也不好。其背后的主要原因可能是 OCR 接受训练的数据。PP-OCR 在 MJSynth 和 SynthText 数据集上训练,这是一个合成文本数据集。这些数据集不是现实生活中的文本图像,而是计算机生成的文本图像。因此,由于训练数据集中缺少手写文本可能是 OCR 在这些类型的图像上表现不佳的一个重要因素。

5)牌照

车牌是 OCR 中最流行和最重要的用例之一,并且性能非常好。ALPR 现在用于各种商业和研究领域。已识别的车牌可用于查找任何违规行为、车辆登记、收费站等。
ocr-02-54

from ocr_img_util import ocr_img

# Applying OCR
img_path = './input_images/17-license-plate.jpg'
ocr_img(img_path)

ocr-02-56
那太精彩了!预测的边界框非常紧凑,甚至识别的文本也很准确。ALPR 也可以应用于视频源,并进行一些调整以提高准确性。

6)路标

可以应用 OCR 的最重要场景之一是路标。由于自动驾驶汽车的发展,这个应用程序变得非常重要,例如读取速度限制、停车标志等。
ocr-02-58

from ocr_img_util import ocr_img

# Applying OCR
img_path = './input_images/23-sign-board-1.jpg'
ocr_img(img_path)

ocr-02-60
那是相当准确的。OCR 能够识别所有文本,甚至包括括号等特殊字符。让我们在另一张图片上试试。
ocr-02-62

from ocr_img_util import ocr_img

# Applying OCR
img_path = './input_images/25-sign-board-2.jpg'
ocr_img(img_path)

ocr-02-64
这非常准确。通过检测每个文本字段,检测器工作得很好。OCR 在这些场景中也表现出色。我们可以肯定地说,自动驾驶汽车可以很容易地依赖这个 OCR。

7)交易卡

交易卡或收藏卡在当今从儿童到成人中非常流行,用于玩耍和交易。其中一些包含非常高的货币价值,高达数百万美元。因此,值得在这些卡片上尝试 OCR。
ocr-02-66

from ocr_img_util import ocr_img

# Applying OCR
img_path = './input_images/27-trading-card.jpg'
ocr_img(img_path)

ocr-02-68
OCR 在这方面不算太好,也不算太差。这里有几件事需要注意,OCR 预测了一些没有空格的文本,其中文本的尺寸有点小,类似于文档部分的情况。此外,检测器还没有检测到一些尺寸也非常小的文本字段

8)曲线文字

到目前为止,我们只看到了直线上的文本,但如果文本是弯曲的呢?OCR 和文本检测器的性能如何?我们也来试试。
ocr-02-70

from ocr_img_util import ocr_img

# Applying OCR
img_path = './input_images/19-curved-text-1.jpg'
ocr_img(img_path)

ocr-02-72
虽然是一张简单的图片,但是看识别结果,只有一个英文单词,有点惊讶。再来试一张:
ocr-02-74

from ocr_img_util import ocr_img

# Applying OCR
img_path = './input_images/21-curved-text-2.jpg'
ocr_img(img_path)

ocr-02-76
好吧,如图所见,结果非常糟糕。检测器无法检测到文本字段。原因是因为训练数据。训练默认检测器的数据包含所有直线文本。即使是神经网络也应该预测弯曲的边界框,这通过使用与现在使用的相同的网络是不可能的。因此,当看到弯曲的文本时,检测器无法检测到它。PaddleOCR 提供了一个名为 SAST 的文本检测器,专门为弯曲文本创建和训练。但截至目前,PaddleOCR 并未为此管道提供 OCR。

 

三、实验总结

从上面的实验中,我们可以得出结论,PP-OCR 是一种非常快速且高度准确的 OCR 以及文本检测器。但它 在某些情况下会失败,例如手写文本、弯曲文本和小文本,这些文本无法检测到或识别不准确。 为了解决这些问题,可以在更多数据集上对 OCR 和检测器进行微调,这有助于提高准确性并在各种不同场景中获得更好的性能。

 

四、参考文档

opencv开源项目:https://github.com/spmallick/learnopencv/tree/master/Optical-Character-Recognition-using-PaddleOCR
opencv开放文档:https://learnopencv.com/optical-character-recognition-using-paddleocr/
paddlepaddle官方文档:https://www.paddlepaddle.org.cn/documentation/docs/zh/install/pip/windows-pip.html

系列攻略:
PaddleOCR #hello paddle: 从普通程序走向机器学习程序 - 初识机器学习
PaddleOCR #使用PaddleOCR进行光学字符识别 - OCR模型对比

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

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

相关文章

【Unity 2D AABB碰撞检测】铸梦之路

作者介绍&#xff1a;铸梦xy。IT公司技术合伙人&#xff0c;IT高级讲师&#xff0c;资深Unity架构师&#xff0c;铸梦之路系列课程创始人。 目录1.AABB 碰撞介绍2.常用2D碰撞盒3.为什么要学习如何编写碰撞检测4.2D BOX & BOX 碰撞检测原理和代码5.2D BOX &Shpere 碰撞检…

Linux信号编程、signal函数范例详解( 4 ) -【Linux通信架构系列 】

系列文章目录 C技能系列 Linux通信架构系列 C高性能优化编程系列 深入理解软件架构设计系列 高级C并发线程编程 期待你的关注哦&#xff01;&#xff01;&#xff01; 现在的一切都是为将来的梦想编织翅膀&#xff0c;让梦想在现实中展翅高飞。 Now everything is for the…

chatgpt赋能python:Python求1是什么?Python求1在SEO中的应用

Python求1是什么&#xff1f;Python求1在SEO中的应用 介绍Python求1 Python求1&#xff0c;也叫做1-bit计数器&#xff0c;是一种用来统计网页浏览量的技术。在Web开发中&#xff0c;我们需要记录网页的浏览次数&#xff0c;以便了解网站的流量和用户的使用情况。传统的做法是…

chatgpt赋能python:Python求绝对值:从初学者到高级工程师的必备知识

Python求绝对值&#xff1a;从初学者到高级工程师的必备知识 Python是一种有趣且功能强大的编程语言。它非常易于学习&#xff0c;同时又具有广泛的应用领域&#xff0c;比如Web开发、数据分析、机器学习和人工智能等。在Python的数学运算中&#xff0c;求绝对值是一个常见的需…

chatgpt赋能python:Python浮点型的两种表示方法

Python浮点型的两种表示方法 Python是一种解释型的动态语言&#xff0c;可以处理多种数据类型。其中&#xff0c;浮点型是其中一种数据类型&#xff0c;它包括十进制和科学计数法两种表示方法。 十进制表示法 十进制浮点数是Python的基本浮点类型&#xff0c;可以表示实数。…

2023 hnust 湖南科技大学 大数据技术与应用 期末考试 复习资料

前言 感谢&#xff1a;lqx&#xff08;主要内容来源&#xff09;&#xff0c;hqh 有自己的理解和魔改 可以参考的资料 课后题答案我爬取的老师布置的学习通课后题往年资料csdn里面找到的&#xff1a;1、2老师ppt上课划重点录音 不提供pdf文件&#xff0c;方便修改&#xff0…

探索技术极致,未来因你出‘粽’

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

chatgpt赋能python:Python游戏——为什么它成为未来最热门的游戏开发工具

Python游戏——为什么它成为未来最热门的游戏开发工具 在游戏开发中&#xff0c;Python一直是非常强大和受欢迎的语言。Python具有很多吸引人的特点和实用功能&#xff0c;它为游戏开发者提供了多种可能&#xff0c;我们在本文中将介绍Python游戏以及为什么它越来越受欢迎。 …

【从零开始学习JAVA | 第十一篇】ArrayList集合

目录 前言&#xff1a; ArrayList&#xff1a; 常用成员方法&#xff1a; 案例练习&#xff1a; 1.集合的遍历方式&#xff08;引用数据类型&#xff09;&#xff1a; 2&#xff1a;集合的遍历方式&#xff08;基本数据类型&#xff09;&#xff1a; 总结&#xff1a;…

一面、二面、三面有什么区别?

很多公司面试都分一面、二面、三面甚至更多&#xff0c;大家可能会好奇&#xff0c;为什么要面这么多面&#xff0c;每一面又有啥区别呢&#xff1f; 首先我来回答下为什么要这么多面&#xff0c;最核心的是最后3点&#xff1a; 如果光是一个人面&#xff0c;担心会看走眼&…

python基础学习6【DatatimeIndex与PeriodIndex函数+Timedelta类+连接数据库+agg()函数和aggregate()函数】

转换与处理时间序列数据 转换字符串时间为标准时间: Timestamp类型&#xff1a;最基础最常用。 pd.to_datetime(data[lock_time])#转换 如果超出时间戳最大值&#xff0c;最小值&#xff0c;时间戳存储可能不成功 &#xff1a; DatatimeIndex与PeriodIndex函数【其实俺暂时…

【Spring Cloud Sleuth 分布式链路跟踪】 —— 每天一点小知识

&#x1f4a7; S p r i n g C l o u d S l e u t h 分布式链路跟踪 \color{#FF1493}{Spring Cloud Sleuth 分布式链路跟踪} SpringCloudSleuth分布式链路跟踪&#x1f4a7; &#x1f337; 仰望天空&#xff0c;妳我亦是行人.✨ &#x1f984; 个人主页——微风撞见云…

scratch lenet(9): C语言实现tanh的计算

文章目录 1. 目的2. tanh ⁡ ( x ) \tanh(x) tanh(x) 的 naive 实现2.1 数学公式2.2 naive 实现 3. tanh ⁡ ( x ) \tanh(x) tanh(x) 的快速计算3.1 Maple 中的近似公式3.2 tan_c3()3.3 Gauss 连分数公式 (Continued Fraction) 4. 最终代码和运行结果代码运行结果 5. 其他Ref…

使用python制作常用图表

案例01 制作柱形图展示数据的对比关系——员工销售业绩统计表.xlsx import xlwings as xw app xw.App(visibleTrue, add_bookFalse) workbook app.books.open(员工销售业绩统计表.xlsx) # 打开要制作图表的工作簿 for i in workbook.sheets: # 遍历工作簿中的工作表chart i…

node.js安装及配置教程(win11)

node.js安装及配置教程&#xff08;win11&#xff09; 一、下载二、安装三、环境配置 一、下载 官网下载&#xff1a;点击下载 根据自己电脑的位数选择对应的版本即可 网盘下载&#xff1a;点击下载 二、安装 下载完成后&#xff0c;双击运行程序&#xff0c;点击next 勾…

iOS自动化环境搭建(超详细)

1.macOS相关库安装 libimobiledevice > brew install libimobiledevice 使用本机与苹果iOS设备的服务进行通信的库。 ideviceinstaller brew install ideviceinstaller 获取设备udid、安装app、卸载app、获取bundleid carthage > brew install carthage 第三方库…

【Redis】Redis最佳实践/经验总结

【Redis】Redis最佳实践/经验总结 文章目录 【Redis】Redis最佳实践/经验总结1. Redis键值设计1.1 优雅的key结构1.2 拒绝BigKey1.2.1 BigKey的危害1.2.2 如何发现BigKey1.2.3 如何删除BigKey 1.3 恰当的数据类型1.3.1 例11.3.2 例2 2. 批处理优化2.1 Pipeline2.1.1 单个命令的…

ROM和RAM的工作原理(DRAM和DROM)以及DRAM的刷新方法

只读存储器ROM: ROM和RAM都是支持随机存取的存储器&#xff0c;其中SRAM和DRAM均为易失性半导体存储器。而ROM中一旦有了信息&#xff0c;就不能轻易改变&#xff0c;即使掉电也不会丢失&#xff0c;它在计算机系统中是只供读出的存储器。ROM器件有两个显著的优点: 1)结构简单&…

RabbitMQ 消息丢失的场景,如何保证消息不丢失?

一.RabbitMQ消息丢失的三种情况 第一种&#xff1a;生产者弄丢了数据。生产者将数据发送到 RabbitMQ 的时候&#xff0c;可能数据就在半路给搞丢了&#xff0c;因为网络问题啥的&#xff0c;都有可能。 第二种&#xff1a;RabbitMQ 弄丢了数据。MQ还没有持久化自己挂了 第三种…

软考A计划-系统集成项目管理工程师--一般常识-中

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…