OCR第三个方案:PP-OCRv4的初步探索

news2025/4/2 14:49:22

一、PP-OCR历史简要回顾

先请出PP-OCR官网,理解上有出入的,以官网为准。

1.1 PP-OCR系列历史

  • PP-OCRv1(2020):首创3.5M超轻量模型,奠定两阶段架构基础(检测+方向分类+识别)
  • PP-OCRv2(2021):引入知识蒸馏和增强数据策略,检测精度提升5%
  • PP-OCRv3(2022):采用SVTR识别架构,中文识别准确率突破80%
  • PP-OCRv4(2023):融合Transformer与CNN的混合架构,实现多维度性能突破

1.2 PP-OCRv4核心技术升级

检测模块四大创新:
  • LCNetV3:通过可学习仿射变换模块增强特征提取能力,Hmean提升0.84%
  • PFHead:并行多尺度特征融合结构,使小文本检测召回率提升3.2%
  • DSR策略:动态调整收缩比例(0.4→0.6),提升弯曲文本适应能力
  • CML蒸馏:KL散度损失优化师生网络交互,模型泛化性提升

二、PP-OCRv4的技术强项

2.1 极致的轻量化设计

  • 移动端模型仅17M(检测4.7M+分类1.4M+识别10M)
  • 量化后模型体积缩减60%,CPU推理速度达76ms/帧

2.2 多场景高精度表现

场景类型v3准确率v4准确率提升幅度
中文印刷体71.5%75.8%+4.3%
英文手写体64.0%70.1%+6.1%
阿拉伯语系72.9%75.5%+2.6%
(数据来源:PaddleOCR官方技术报告)

2.3 多语言支持能力

  • 新增缅甸语、希伯来语等小语种支持,总支持语言达83种
  • 混合语种识别准确率超75%(如中英混排场景)

2.4 动态适应能力

  • 多尺度训练策略:随机选择32/48/64三种高度进行训练
  • 自适应图像处理:最大边限制960px时,长宽比>3的文本识别准确率提升12%

三、实践指南:从入门到进屋

3.1 环境搭建

# 创建虚拟环境
conda create -n paddleocr python=3.9
conda activate paddleocr

# 安装依赖
pip install paddlepaddle paddleocr opencv-python

# 命令行快速识别
paddleocr --image_dir ./imgs/11.jpg --use_angle_cls true 

亲测,即使不用镜像下载安装速度也可以的。

3.2 简单中文图片识别

import torch
from paddleocr import PaddleOCR

# 初始化识别器(自动下载预训练模型)
ocr = PaddleOCR(use_angle_cls=True, lang='ch')  # 自动处理旋转文本

# 执行OCR识别
img_path = 'pic002.png'  # 测试图片路径
result = ocr.ocr(img_path, cls=True)

# 解析并打印结果
for line in result[0]:  # result[0]表示第一张图片的识别结果
    coordinates = line[0]  # 文字框坐标(四点坐标)
    text = line[1][0]  # 识别文本
    confidence = line[1][1]  # 置信度(0~1)

    print(f"位置:{coordinates}")
    print(f"内容:{text} | 可信度:{confidence:.2%}")
    print("-" * 40)

同样的一张图片,PP-OCRv4的识别效果最好,结果如下:

[2025/03/30 13:20:33] ppocr DEBUG: dt_boxes num : 3, elapsed : 0.20115971565246582
[2025/03/30 13:20:33] ppocr DEBUG: cls num  : 3, elapsed : 0.06674575805664062
[2025/03/30 13:20:33] ppocr DEBUG: rec_res num  : 3, elapsed : 0.2163543701171875
位置:[[1.0, 8.0], [107.0, 8.0], [107.0, 30.0], [1.0, 30.0]]
内容:五、中文识别 | 可信度:99.95%
----------------------------------------
位置:[[2.0, 56.0], [141.0, 56.0], [141.0, 78.0], [2.0, 78.0]]
内容:六、高级应用场景 | 可信度:99.67%
----------------------------------------
位置:[[6.0, 76.0], [173.0, 78.0], [173.0, 101.0], [6.0, 98.0]]
内容:5.1结构化数据提取 | 可信度:99.81%

关于一个报错
OSError: [WinError 127] 找不到指定的程序。 Error loading “D:\xxxx.venv\Lib\site-packages\torch\lib\shm.dll” or one of its dependencies.
最开始遇到这个问题真是莫名其妙,找到资料也都怀疑是我安装的库有问题,索性把torch和paddleocr都重装了。继续按照官方的快速入门文档编写运行,依然报错。
就尝试一步步调试,先在python控制台中确认torch安装是否成功,import后,再次运行paddleocr,结果可以。
就尝试把import torch加上,一试果然成功。罢了罢了!

3.3 车牌识别

import torch
from paddleocr import PaddleOCR
import cv2
import re


class PlateRecognizer:
    def __init__(self):
        self.ocr = PaddleOCR(
            use_angle_cls=True,
            lang="ch",
            det_db_thresh=0.5,
            rec_image_shape="3, 48, 320",
            show_log=False  # 关闭调试日志
        )

        self.plate_pattern = re.compile(
            r'^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领]{1}'
            r'[A-Z]{1}'
            r'([A-Z0-9]{5}|[A-Z0-9]{4}[A-Z0-9学警港澳]{1})$'  # 扩展新能源车牌格式
        )
        self.province_short = ['京', '津', '沪', '渝', '冀', '豫', '云', '辽', '黑', '湘',
                               '皖', '鲁', '新', '苏', '浙', '赣', '鄂', '桂', '甘', '晋',
                               '蒙', '陕', '吉', '闽', '贵', '粤', '青', '藏', '川', '宁', '琼']

    def preprocess(self, img):
        # 灰度化 + CLAHE增强
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
        return clahe.apply(gray)

    def recognize_plate(self, img_path):
        try:
            raw_img = cv2.imread(img_path)
            if raw_img is None:
                raise ValueError("无法读取图像文件")

            processed_img = self.preprocess(raw_img)

            # 调试:预处理图像
            cv2.imshow("debug_preprocess", processed_img)
            cv2.waitKey(0)

            # 执行OCR识别
            result = self.ocr.ocr(processed_img)
            print(f'resuilt:{result}')
            if not result or not result[0]:
                return "未识别到有效字符"

            # 合并结果并筛选高置信度
            texts = []
            for line in result[0]:
                if line[1][1] > 0.6:  # 置信度阈值
                    texts.append(line[1][0].upper())

            combined = ''.join(texts)
            print(f'combined:{combined}')
            # 后处理修正
            final_text = self.postprocess2(combined)
            return final_text if final_text else "无法识别有效车牌"

        except Exception as e:
            return f"处理异常: {str(e)}"

    def postprocess2(self, text):
        # 替换易混淆字符
        replace_rules = {
            'O': '0', 'I': '1',
            '-': '',
            '·': '', ' ': '', '_': ''
        }
        corrected = ''.join([replace_rules.get(c, c) for c in text.upper()])
        print(f'corrected={corrected}')
        province_chars = ''.join(self.province_short)
        valid_pattern = fr'[^{province_chars}A-Z0-9学警港澳使领]'
        # 过滤所有非字母数字字符
        corrected = re.sub(valid_pattern, '', corrected.upper())
        print(f'corrected={corrected}')
        # 长度校验(新能源车牌可能8位)
        if 7 <= len(corrected) <= 8:
            # 调整正则表达式
            patterns = [
                r'^([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领])'
                r'([A-Z])'
                r'([0-9A-Z]{5})$',  # 普通车牌
                r'^([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领])'
                r'([A-Z])'
                r'([0-9A-Z]{5}[0-9A-Z学警港澳])$'  # 新能源/特殊车牌
            ]

            for pattern in patterns:
                match = re.match(pattern, corrected)
                if match and match.group(1) in self.province_short:
                    return match.group()

        return None


# 使用示例
if __name__ == "__main__":
    recognizer = PlateRecognizer()
    print(recognizer.recognize_plate("pic006.png"))

上述实现,在图像预处理上没有做太多。请读者自行研究,这是一门大学问。
在车牌识别的结果上,强于很多库和模型了。
在这里插入图片描述

resuilt:[[[[[38.0, 48.0], [926.0, 41.0], [927.0, 240.0], [39.0, 247.0]], ('粤C-F12345', 0.9607976078987122)]]]
combined:粤C-F12345
粤CF12345

resuilt:[[[[[58.0, 57.0], [966.0, 57.0], [966.0, 287.0], [58.0, 287.0]], ('粤C·D12345', 0.9694777727127075)]]]
combined:粤C·D12345
粤CD12345

近期小结

连续调研了三个OCR库(模型或方案),给出下面一个简单的对比。

测试集EasyOCRPaddleOCRTesseract
CTW300089.7%91.2%72.5%
ICDAR201585.3%87.9%68.4%
自建票据93.1%90.5%65.2%

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

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

相关文章

ICLR 2025 Spotlight:让机器人实现「自主进化」,蚂蚁数科、清华提出具身协同框架 BodyGen

最近&#xff0c;全球 AI 和机器学习顶会 ICLR 2025 公布了论文录取结果&#xff1a;由蚂蚁数科与清华大学联合团队提出的全新具身协同框架 BodyGen 成功入选 Spotlight&#xff08;聚光灯/特别关注&#xff09;论文。 论文出自蚂蚁数科与清华大学兴军亮老师团队合作的科研项目…

第十九章:Python-pyttsx3 库实现文本转语音功能

前言 在开发语音交互应用或需要文本转语音功能的项目时&#xff0c;pyttsx3 是一个非常实用的 Python 库。它支持离线语音合成&#xff0c;无需联网即可将文本转换为语音。本文将详细介绍 pyttsx3 的功能、用法以及常见问题的解决方法&#xff0c;并通过示例代码帮助你快速上手…

SvelteKit 最新中文文档教程(16)—— Service workers

前言 Svelte&#xff0c;一个语法简洁、入门容易&#xff0c;面向未来的前端框架。 从 Svelte 诞生之初&#xff0c;就备受开发者的喜爱&#xff0c;根据统计&#xff0c;从 2019 年到 2024 年&#xff0c;连续 6 年一直是开发者最感兴趣的前端框架 No.1&#xff1a; Svelte …

Flutter项目之构建打包分析

目录&#xff1a; 1、准备部分2、构建Android包2.1、配置修改部分2.2、编译打包 3、构建ios包3.1、配置修改部分3.2、编译打包 1、准备部分 2、构建Android包 2.1、配置修改部分 2.2、编译打包 执行flutter build apk命令进行打包。 3、构建ios包 3.1、配置修改部分 3.2、编译…

24、网络编程基础概念

网络编程基础概念 网络结构模式MAC地址IP地址子网掩码端口网络模型协议网络通信的过程&#xff08;封装与解封装&#xff09; 网络结构模式 C/S结构&#xff0c;由客户机和服务器两部分组成&#xff0c;如QQ、英雄联盟 B/S结构&#xff0c;通过浏览器与服务器进程交互&#xf…

Mentalab Explore Pro携手 Wearanize + 数据集,推动睡眠科学研究

在神经科学和睡眠研究的领域&#xff0c;精确监测大脑活动是获取深入见解的关键。传统多导睡眠监测&#xff08;PSG&#xff09;设备虽然提供了详尽的数据&#xff0c;但其操作的复杂性和成本限制了其在更广泛场景中的应用。可穿戴技术的兴起提供了一种新的数据收集方式&#x…

基于 RK3588 的 YOLO 多线程推理多级硬件加速引擎框架设计(代码框架和实现细节)

一、前言 接续上一篇文章&#xff0c;这个部分主要分析代码框架的实现细节和设计理念。 基于RK3588的YOLO多线程推理多级硬件加速引擎框架设计&#xff08;项目总览和加速效果&#xff09;-CSDN博客https://blog.csdn.net/plmm__/article/details/146542002?spm1001.2014.300…

【Yolov8部署】 VS2019+opencv+onnxruntime 环境下部署目标检测模型

文章目录 前言一、导出yolov8模型为onnx文件二、VS2019中环境配置三、源码与实际运行 前言 本文主要研究场景为工业场景下&#xff0c;在工控机与工业相机环境中运行的视觉缺陷检测系统&#xff0c;因此本文主要目的为实现c环境下&#xff0c;将yolov8已训练好的检测模型使用o…

论文阅读:Dual Anchor Graph Fuzzy Clustering for Multiview Data

论文地址:Dual Anchor Graph Fuzzy Clustering for Multiview Data | IEEE Journals & Magazine | IEEE Xplore 代码地址&#xff1a;https://github.com/BBKing49/DAG_FC 摘要 多视角锚图聚类近年来成为一个重要的研究领域&#xff0c;催生了多个高效的方法。然而&#…

乐橙R10 AI智能锁:以「技术减法」终结智能家居「参数内卷」

1 行业迷思&#xff1a;当「技术内卷」背离用户真实需求 “三摄猫眼”、“0.3秒人脸解锁”、“DeepSeek大模型”……智能锁行业的营销话术日益浮夸&#xff0c;但用户体验却陷入“功能冗余”与“操作复杂”的泥潭。 一位用户在社交平台直言&#xff1a;“我的智能锁有六个摄像…

如何使用 FastAPI 构建 MCP 服务器

哎呀&#xff0c;各位算法界的小伙伴们&#xff01;今天咱们要聊聊一个超酷的话题——MCP 协议&#xff01;你可能已经听说了&#xff0c;Anthropic 推出了这个新玩意儿&#xff0c;目的是让 AI 代理和你的应用程序之间的对话变得更顺畅、更清晰。不过别担心&#xff0c;为你的…

当 EcuBus-Pro + UTA0401 遇上 NSUC1500

文章目录 1.前言2.EcuBus-Pro简介2.1 官方地址2.2 概览 3.纳芯微NSUC1500简介3.1 NSUC1500概述3.2 产品特性 4.测试环境5.基础功能5.1 数据发送5.2 数据监控 6.自动化功能6.1 脚本创建6.2 脚本编辑6.3 脚本编辑与测试 7.音乐律动7.1 导入例程7.2 效果展示 ECB工程 1.前言 最近…

【FreeRTOS】裸机开发与操作系统区别

&#x1f50e;【博主简介】&#x1f50e; &#x1f3c5;CSDN博客专家 &#x1f3c5;2021年博客之星物联网与嵌入式开发TOP5 &#x1f3c5;2022年博客之星物联网与嵌入式开发TOP4 &#x1f3c5;2021年2022年C站百大博主 &#x1f3c5;华为云开发…

Deepseek API+Python 测试用例一键生成与导出 V1.0.4 (接口文档生成接口测试用例保姆级教程)

接口文档生成接口测试用例保姆级教程 随着测试需求的复杂性增加,测试用例的设计和生成变得愈发重要。Deepseek API+Python 测试用例生成工具在 V1.0.4 中进行了全方位的优化和功能扩展,特别是对接口测试用例设计的支持和接口文档的智能解析处理。本文将详细介绍 V1.0.4 版本…

CET-4增量表

CET-4词表-增量表 注&#xff1a; 【1】所谓增量&#xff0c;是相对于高中高考之增量 即&#xff0c;如果你是在读大学生&#xff0c;高中英语单词过关了&#xff0c;准备考CET-4&#xff0c;那么侧重下面的增量词表的学习&#xff0c;也算是一条捷径吧 ^_^ 【2】本结果数据 官…

DeepSeek详解:探索下一代语言模型

文章目录 前言一、什么是DeepSeek二、DeepSeek核心技术2.1 Transformer架构2.1.1 自注意力机制 (Self-Attention Mechanism)(a) 核心思想(b) 计算过程(c) 代码实现 2.1.2 多头注意力 (Multi-Head Attention)(a) 核心思想(b) 工作原理(c) 数学描述(d) 代码实现 2.1.3 位置编码 (…

FOC 控制笔记【三】磁链观测器

一、磁链观测器基础 1.1 什么是磁链 磁链&#xff08;magnetic linkage&#xff09;是电磁学中的一个重要概念&#xff0c;指导电线圈或电流回路所链环的磁通量。单位为韦伯&#xff08;Wb&#xff09;&#xff0c;又称磁通匝。 公式为&#xff1a; 线圈匝数 穿过单匝数的…

SpringBoot项目读取自定义的配置文件

先说使用场景: 开发时在resource目录下新建一个 config 文件夹, 在里面存放 myconf.properties 文件, 打包后这个文件会放到与jar包同级的目录下, 如下图 关键点&#xff1a;自定义的文件名(当然后缀是.properties)&#xff0c;自定义的存放路径。 主要的要求是在打包后运行过…

在PyCharm 中免费集成Amazon CodeWhisperer

CodeWhisperer 是Amazon发布的一款免费的AI 编程辅助小工具&#xff0c;可在你的集成开发环境&#xff08;IDE&#xff09;中生成实时单行或全函数代码建议&#xff0c;帮助你快速构建软件。简单来说&#xff0c;Amazon CodeWhisperer就是你写一段注释&#xff08;支持中文&…

[7-02-02].第15节:生产经验 - 消费者相关操作

Kafka笔记大纲 五、生产经验——分区的分配以及再平衡: 4.1.生产经验——分区的分配以及再平衡 4.2.参数&#xff1a; 5.4.1 Range 以及再平衡