解锁 PaddleOCR 的超能力

news2024/11/18 16:23:55

d00f690c5201b3a07b59402bf3825532.jpeg

光学字符识别(OCR)是一项强大的技术,使机器能够从图像或扫描文档中识别和提取文本。OCR 在各个领域都有应用,包括文件数字化、从图像中提取文本以及基于文本的数据分析。在本文中,我们将探讨如何使用 PaddleOCR,一款基于深度学习的先进OCR工具包,进行文本检测和识别任务。我们将逐步演示一个代码片段,展示了整个过程。

1.先决条件

在我们深入代码之前,让我们确保我们已经准备好运行 PaddleOCR 库。确保您的计算机上安装了以下必要先决条件:

  • Python(3.6 或更高版本)

  • PaddleOCR 库

  • 其他必要的依赖项(例如 NumPy、pandas 等)

您可以使用以下 pip 命令安装 PaddleOCR:

pip install paddleocr

2.设置 PaddleOCR

一旦您安装了 Python 和所需的库,我们来设置 PaddleOCR。您可以使用 PaddleOCR 的预训练模型,这些模型可用于文本检测和识别。

代码概

使用 PaddleOCR 进行文本检测和识别的代码片段包括以下主要组件:

  1. 图像预处理:加载输入图像并执行必要的预处理步骤,例如调整大小或归一化。

  2. 文本检测:使用 PaddleOCR 文本检测模型来定位输入图像中文本区域的边界框。

  3. 文本识别:对于每个检测到的边界框,使用 PaddleOCR 文本识别模型来提取相应的文本。

  4. 后处理:整理检测到的文本和识别结果以进行进一步分析或显示。

3.逐步实现

让我们分解代码片段,详细解释每个步骤:

文本检测

该代码是一个名为 DecMain 的类的一部分,该类专为使用真实数据进行光学字符识别(OCR)评估而设计。它使用 PaddleOCR 从图像中提取文本,然后计算指标(如准确率、召回率和字符错误率 [CER])来评估 OCR 系统的性能。

class DecMain:
    def __init__(self, image_folder_path, label_file_path, output_file):
        self.image_folder_path = image_folder_path
        self.label_file_path = label_file_path
        self.output_file = output_file


    def run_dec(self):
        # Check and update the ground truth file
        CheckAndUpdateGroundTruth(self.label_file_path).check_and_update_ground_truth_file()


        df = OcrToDf(image_folder=self.image_folder_path, label_file=self.label_file_path, det=True, rec=True, cls=False).ocr_to_df()


        ground_truth_data = ReadGroundTruthFile(self.label_file_path).read_ground_truth_file()


        # Get the extracted text as a list of dictionaries (representing the OCR results)
        ocr_results = df.to_dict(orient="records")


        # Calculate precision, recall, and CER
        precision, recall, total_samples = CalculateMetrics(ground_truth_data, ocr_results).calculate_precision_recall()


        CreateSheet(dataframe=df, precision=precision, recall=recall, total_samples=total_samples,
                    file_name=self.output_file).create_sheet()

让我们分解代码并解释每个部分:

class DecMain:


def __init__(self, image_folder_path, label_file_path, output_file):


self.image_folder_path = image_folder_path


self.label_file_path = label_file_path


self.output_file = output_file

DecMain 类有一个 __init__方法,用以下参数初始化对象:

  •  image_folder_path:用于 OCR 的输入图像所在文件夹的路径。

  •  label_file_path:包含图像的实际文本内容的真实标签文件的路径。

  •  output_file:评估结果将保存在的输出文件的文件名。

def run_dec(self):
       # Check and update the ground truth file
       CheckAndUpdateGroundTruth(self.label_file_path).check_and_update_ground_truth_file()

run_dec方法负责运行 OCR 评估过程。首先,它使用 CheckAndUpdateGroundTruth 类来检查并更新真实标签文件。

df = OcrToDf(image_folder=self.image_folder_path, label_file=self.label_file_path, det=True, rec=True, cls=False).ocr_to_df()

OcrToDf 类用于将 OCR 结果转换为 pandas DataFrame(`df`)。它接受以下参数:

  • image_folder:包含 OCR 输入图像的文件夹的路径。

  • label_file:真实标签文件的路径。

  • det=True和 rec=True参数表示 DataFrame 将包含文本检测和识别结果。

ground_truth_data = ReadGroundTruthFile(self.label_file_path).read_ground_truth_file()

ReadGroundTruthFile 类用于读取真实标签文件并将其内容加载到 ground_truth_data变量中。

# Get the extracted text as a list of dictionaries (representing the OCR results)
        ocr_results = df.to_dict(orient="records")

从 DataFrame  df 中获取的 OCR 结果转换为字典列表(ocr_results),每个字典代表单个图像的 OCR 结果。

# Calculate precision, recall, and CER
        precision, recall, total_samples = CalculateMetrics(groun
        d_truth_data, ocr_results).calculate_precision_recall()

CalculateMetrics 类用于计算 OCR 评估指标:准确率、召回率和评估的总样本数。该类将真实数据和 OCR 结果作为输入。

CreateSheet(dataframe=df, precision=precision, recall=recall, total_samples=total_samples,


                   file_name=self.output_file).create_sheet()

CreateSheet 类负责创建输出表格(例如 Excel 或 CSV),其中包含评估指标和 OCR 结果。它接受 DataFrame `df`、准确率、召回率、总样本数和输出文件名作为输入。

总的来说,DecMain 类提供了一种有条理的方式,使用真实数据和 PaddleOCR 的文本检测和识别功能来评估 OCR 模型的性能。它计算重要的评估指标,并将结果存储在指定的输出文件中,以供进一步分析。

注意:真实标签文件的格式

要使用 DecMain 类和提供的代码进行 OCR 评估,必须正确格式化真实标签文件。真实标签文件应采用 JSON 格式,其结构如下所示:

image_name.jpg [{"transcription": "215mm 18", "points": [[199, 6], [357, 6], [357, 33], [199, 33]], "difficult": False, "key_cls": "digits"}, {"transcription": "XZE SA", "points": [[15, 6], [140, 6], [140, 36], [15, 36]], "difficult": False, "key_cls": "text"}]

真实标签文件应为 JSON 格式。文件的每一行代表图像的 OCR 真实标签。

每一行包含图像的文件名,后跟 JSON 对象形式的该图像的 OCR 结果。

JSON 对象应具有以下几点:

"transcription":图像的真实文本转录。

"points":表示图像中文本区域边界框坐标的四个点的列表。

"difficult":一个布尔值,指示文本区域是否难以识别。

"key_cls":OCR 结果的类别标签,例如 "digits" 或 "text"。

在创建用于准确评估 OCR 模型性能的真实标签文件时,请确保遵循此格式。

文本识别

代码定义了一个名为 RecMain 的类,该类旨在使用预训练的 OCR 模型在图像文件夹上运行文本识别(OCR)并生成一个评估 Excel 表格。

class RecMain:
    def __init__(self, image_folder, rec_file, output_file):
        self.image_folder = image_folder
        self.rec_file = rec_file
        self.output_file = output_file


    def run_rec(self):
        image_paths = GetImagePathsFromFolder(self.image_folder, self.rec_file). \
            get_image_paths_from_folder()


        ocr_model = LoadRecModel().load_model()


        results = ProcessImages(ocr=ocr_model, image_paths=image_paths).process_images()


        ground_truth_data = ConvertTextToDict(self.rec_file).convert_txt_to_dict()


        model_predictions, ground_truth_texts, image_names, precision, recall, \
            overall_model_precision, overall_model_recall, cer_data_list = EvaluateRecModel(results,
                                                                                            ground_truth_data).evaluate_model()


        # Create Excel sheet
        CreateMetricExcel(image_names, model_predictions, ground_truth_texts,
                          precision, recall, cer_data_list, overall_model_precision, overall_model_recall,
                          self.output_file).create_excel_sheet()

让我们分解代码并解释每个部分:

class RecMain:
    def __init__(self, image_folder, rec_file, output_file):
        self.image_folder = image_folder
        self.rec_file = rec_file
        self.output_file = output_file

RecMain类有一个__init__方法,用以下参数初始化对象:

  • image_folder: 包含用于文本识别的输入图像的文件夹路径。

  • rec_file: 包含图像实际文本内容的地面真实标签文件的路径。

  • output_file: 保存评估结果的输出Excel表格的文件名。

def run_rec(self):
        image_paths = GetImagePathsFromFolder(self.image_folder, self.rec_file).get_image_paths_from_folder()

run_rec方法负责运行文本识别过程。它首先使用GetImagePathsFromFolder类来获取指定image_folder内所有图像的图像路径列表。这一步确保OCR模型将处理给定目录内的所有图像。

ocr_model = LoadRecModel().load_model()

LoadRecModel类用于加载用于文本识别的预训练OCR模型。它可能使用PaddleOCR或其他OCR库来加载模型。

results = ProcessImages(ocr=ocr_model, image_paths=image_paths).process_images()

ProcessImages类负责使用加载的OCR模型来处理图像。它以OCR模型(ocr_model)和图像路径列表(image_paths)作为输入。

ground_truth_data = ConvertTextToDict(self.rec_file).convert_txt_to_dict()

ConvertTextToDict类用于读取地面实况标签文件并将其转换为字典格式(ground_truth_data)。这一转换准备了地面实况数据,以便与OCR模型的预测进行比较。

model_predictions, ground_truth_texts, image_names, precision, recall, \
            overall_model_precision, overall_model_recall, cer_data_list = EvaluateRecModel(results,
                                                                                            ground_truth_data).evaluate_model()

EvaluateRecModel类负责将OCR模型的预测与地面实况数据进行比较,并计算评估指标,如精度、召回率和字符错误率(CER)。它以OCR模型的预测(results)和地面实况数据(ground_truth_data)作为输入。

# Create Excel sheet
        CreateMetricExcel(image_names, model_predictions, ground_truth_texts,
                          precision, recall, cer_data_list, overall_model_precision, overall_model_recall,
                          self.output_file).create_excel_sheet()

CreateMetricExcel类负责创建包含评估指标和OCR结果的输出Excel表。它接受各种输入数据,包括图像名称、模型预测、地面实况文本、评估指标和输出文件名(self.output_file)。

总之,RecMain类组织了整个文本识别过程,从加载OCR模型到生成包含详细指标的评估Excel表。它提供了一种有组织和可重复使用的方法,用于评估OCR模型在给定一组图像上的性能。

注:地面实况文本文件格式

使用RecMain类和提供的代码进行OCR评估时,正确格式化地面实况(GT)文本文件至关重要。GT文本文件应采用以下格式:

image_name.jpg text

文件的每一行表示一个图像的GT文本。

每一行包含图像的文件名,后跟一个制表符(\t),然后是该图像的GT文本。

确保GT文本文件包含图像文件夹中指定的所有图像的GT文本条目。GT文本应与图像中实际文本内容相匹配。这种格式对于准确评估OCR模型的性能是必需的。

您可以在这里找到源代码:

https://github.com/vinodbaste/paddleOCR_rec_dec?source=post_page

结论

我们探讨了如何使用基于深度学习的PaddleOCR进行文本检测和识别的过程。我们逐步演示了文本检测和识别的实现。有了PaddleOCR强大的预训练模型和易于使用的API,对图像执行OCR变得更加容易。

·  END  ·

HAPPY LIFE

ad19aae99b5083bb42dd62929e1d6966.png

本文仅供学习交流使用,如有侵权请联系作者删除

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

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

相关文章

LeetCode【923】三数之和的多种可能性

题目&#xff1a; 思路&#xff1a; https://www.jianshu.com/p/544cbb422300 代码&#xff1a; int threeSumMulti(vector<int>& A, int target) {//Leetcode923:三数之和的多钟可能//initialize some constint kMod 1e9 7;int kMax 100;//calculate frequenc…

25 _ 红黑树(上):为什么工程中都用红黑树这种二叉树?

上两节,我们依次讲了树、二叉树、二叉查找树。二叉查找树是最常用的一种二叉树,它支持快速插入、删除、查找操作,各个操作的时间复杂度跟树的高度成正比,理想情况下,时间复杂度是O(logn)。 不过,二叉查找树在频繁的动态更新过程中,可能会出现树的高度远大于log2n的情况…

拦截器学习(黑马程序员)

实现步骤&#xff1a; 定义拦截器注册配置拦截器 1 自定义拦截器&#xff1a;实现HandlerInterceptor接口&#xff0c;并重写其所有方法&#xff1a; //自定义拦截器 Component public class LoginCheckInterceptor implements HandlerInterceptor { //目标资源方法执行前执…

Tcl语言:基础入门(二)

相关阅读 Tcl语言https://blog.csdn.net/weixin_45791458/category_12488978.html?spm1001.2014.3001.5482 变量 set命令用来给一个变量赋值。它接受两个参数&#xff0c;第一个参数是变量的名字&#xff0c;第二个参数是一个值。变量的名字可以是任意长度的&#xff0c;且区…

基于vue的cron表达式组件——vue-crontab插件

前言&#xff1a; vue 的 cron 组件&#xff0c;支持解析/反解析 cron 表达式&#xff0c;生成最近五次的符合条件时间&#xff0c;依赖 vue2 和 element-ui 效果图&#xff1a; 一、下载安装依赖插件 npm install vcrontab 二、引用方式 //全局引入 import vcrontab f…

ZZ308 物联网应用与服务赛题第H套

2023年全国职业院校技能大赛 中职组 物联网应用与服务 任 务 书 &#xff08;H卷&#xff09; 赛位号&#xff1a;______________ 竞赛须知 一、注意事项 1.检查硬件设备、电脑设备是否正常。检查竞赛所需的各项设备、软件和竞赛材料等&#xff1b; 2.竞赛任务中所使用的…

WPS数组

一、创建数组方法和数组的读取、修改、写入 数组是值的有序集合&#xff0c;其中的值叫作元素。每个元素有一个数值表示的位置&#xff0c;叫作索引&#xff0c;数组中的不同元素可以是不同数据类型。 function demo(){var arr1[99,"人","abc",[3,4,5]];…

LeetCode【701】二叉搜索数的插入操作

题目&#xff1a; 思路&#xff1a; https://zhuanlan.zhihu.com/p/272781596 代码&#xff1a; class Solution {public TreeNode insertIntoBST(TreeNode root, int val) {return process(root,val); }//递归public TreeNode process(TreeNode root,int val){//base ca…

在程序中链接静态库

现在我们把上面src目录中的add.cpp、div.cpp、mult.cpp、sub.cpp编译成一个静态库文件libcalc.a。 add_library(库名称 STATIC 源文件1 [源文件2] ...) link_libraries(<static lib> [<static lib>...]) 参数1&#xff1a;指定出要链接的静态库的名字 可以是全…

01:2440----点灯大师

目录 一:点亮一个LED 1:原理图 2:寄存器 3:2440的框架和启动过程 A:框架 B:启动过程 4:代码 5:ARM知识补充 6:c语言和汇编的应用 A:代码 B:分析汇编语言 C:内存空间 7:内部机制 二:点亮2个灯 三:流水灯 四:按键控制LED 1:原理图 2:寄存器配置 3:代码 一:点…

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException:

错误描述如下所示&#xff1a; 我们将错误拉到最下面如下所示为导致异常的原因&#xff1a; Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type com.example.reviewmybatisplus.Service.UserService available: expec…

基于Mahony互补滤波的IMU数据优化_学习笔记整理

这周自己被安排进行优化软件 IMU 姿态解算项目&#xff0c;之前自己只简单了解四元数&#xff0c;对IMU数据处理从未接触&#xff0c;通过这一周的学习感觉收获颇丰&#xff0c;在今天光棍节之际&#xff0c;&#xff0c;&#xff0c;用大半天的时间对这一周的收获进行整理&…

【蓝桥杯 第十三届省赛Java B组】真题训练(A - F)

目录 A、星期计算 - BigInteger B、山 - 暴力判断 字符串 C、字符统计 - 简单哈希 D、最少刷题数 - 排序 思维 二分 分情况讨论 &#xff08;1&#xff09;&#xff08;错误&#xff09;自写哈希表 &#xff08;2&#xff09;正解 E、求阶乘 - 数学思维 二分 F、…

AI 引擎系列 5 - 以 AI 引擎模型为目标运行 AI 引擎编译器(2022.1 更新)

AI 引擎系列 5 - 以 AI 引擎模型为目标运行 AI 引擎编译器&#xff08;2022.1 更新&#xff09; 简介 在先前的 AI 引擎系列博文中&#xff0c;我们以 x86 模型为目标运行了 AI 引擎编译器&#xff0c;并运行了 X86 仿真器来验证 AI 引擎应用的功能模型。在本文中&#xff0c;…

吴恩达《机器学习》8-1->8-2:非线性假设、神经元和大脑

一、非线性假设 在之前学到的线性回归和逻辑回归中&#xff0c;存在一个缺点&#xff0c;即当特征数量很多时&#xff0c;计算的负荷会变得非常大。考虑一个例子&#xff0c;假设我们使用 &#x1d465;₁, &#x1d465;₂ 的多项式进行预测&#xff0c;这时我们可以很好地应…

汽车制动系统技术分析概要

目录 1.基本功能概述 2. 基本工作原理分析 2.1 Two-Box系统架构(Bosch_IBooster) 2.2 One-Box系统架构(Bosch_IPB) 2.3 ​​​​​​​ABS技术 2.4 TCS技术 2.5 VDC技术 2.6 EPB技术 2.7 小结 3. 该场景应用发展趋势分析 1.基本功能概述 传统汽车的底盘主要由传动系、…

容器网络-Underlay和Overlay

一、主机网络 前面讲了容器内部网络&#xff0c;但是容器最终是要部署在主机上&#xff0c;跨主机间的网络访问又是怎么样的&#xff0c;跨主机网络主要有两种方案。 二、 Underlay 使用现有底层网络&#xff0c;为每一个容器配置可路由的网络IP。也就是说容器网络和主机网络…

视频剪辑助手:轻松实现视频随机分割并提取音频保存

随着社交媒体和视频平台的日益普及&#xff0c;视频制作和分享已成为人们日常生活的一部分。无论是分享个人生活&#xff0c;还是展示才艺&#xff0c;或是推广产品&#xff0c;视频都是一个非常有效的工具。但是&#xff0c;视频制作往往涉及到大量的视频剪辑工作&#xff0c;…

FM3793A-高性能PWM控制芯片 超低成本18W-20W 恒功率PD快充

产品描述&#xff1a; FM3793A是一款应用于离线反激式转换器中的高性能电流模式PWM控制器。在 FM3793A中&#xff0c;PWM开关频率最大为65KHz。在轻载和空载条件下&#xff0c;该FM3793A启动间歇模式从而降低开关频率。FM3793A具有丰富的芯片异常状况保护功能&#xff0c;如欠压…

数据分析实战 | KNN算法——病例自动诊断分析

目录 一、数据及分析对象 二、目的及分析任务 三、方法及工具 四、数据读入 五、数据理解 六、数据准备 七、模型训练 八、模型评价 九、模型调参 十、模型改进 十一、模型预测 一、数据及分析对象 CSV文件——“bc_data.csv” 数据集链接&#xff1a;https://dow…