OCR 核心原理 + 模型 + 检测与识别

前面我们讲到了OCR怎么调用,今天我们来讲讲OCR模型到底在做什么,并能根据不同场景选择方案、调参数、分析识别失败原因。

今天围绕这这个过程,首先需要理解这个:

复制代码
			原始图片
               │
               ▼
        ┌──────────────┐
        │ 文字检测      │
        │ Detection     │
        └──────┬───────┘
               │
        找到文字的位置
               │
    ┌──────────┼──────────┐
    ▼          ▼          ▼
  区域1       区域2       区域3
    │          │          │
    ▼          ▼          ▼
Recognition Recognition Recognition
    │          │          │
    ▼          ▼          ▼
 "你好"      "订单号"     "A123"
    │          │          │
    └──────────┼──────────┘
               ▼
           后处理
               │
               ▼
          结构化数据

一.Detection:文字检测

OCR将图片化成若干个区域,可以知道文字到底在哪里?

二.Recognition:文字识别

看看区域里面是什么文字,区域不一定是矩形,因为它就是文字区域的四个角。

它也能识别倾斜文字,因为然后 OCR 系统可以进行:Text Rectification / 文字区域校正,大致流程:

复制代码
倾斜文字
    ↓
检测四个角
    ↓
透视变换
    ↓
变成水平文字
    ↓
Recognition

三.Detection和Recognition为什么要分开?

直接识别的话,模型不知道哪个区域有文字,文字在哪一行,置信度会非常低。

四.OCR结果如何排序和组织?后处理呢?

模型返回的顺序不一定永远就是:

复制代码
从上到下
从左到右

因此 OCR 应用经常需要自己排序。

我们需要从结果中得到json文件,具体流程是这样的:

复制代码
OCR
 ↓
字符串
 ↓
规则
 ↓
字段提取
 ↓
数据清洗
 ↓
结构化

可以使用正则表达式+OCR。

五.如何处理复杂图片?

1.Perspective Transformation,主要应用于手机扫描文档

复制代码
原始四边形
     ↓
四个角点
     ↓
透视变换
     ↓
标准矩形
     ↓
OCR

1.图片太小     提升拍摄分辨率
2.背景太复杂    裁剪,去除背景
3.文字倾斜    旋转矫正
4.反光         需要从拍摄,图像增强,OCR整条链路解决

六.做一个真正的小项目:图片 → OCR → JSON**

📄 图片信息提取器

输入:

复制代码
invoice.jpg

例如图片里面:

复制代码
订单编号:A123456
客户:张三
金额:199.00
日期:2026-08-17

输出:

json 复制代码
{
    "order_id": "A123456",
    "customer": "张三",
    "amount": 199.0,
    "date": "2026-08-17"
}

第一步:OCR

python 复制代码
from paddleocr import PaddleOCR

ocr = PaddleOCR(lang="ch")

result = ocr.predict("invoice.jpg")

第二步:拿到文字

这里你要根据你实际安装的 PaddleOCR 版本返回结构来取字段。

这是我特别强调的一点: **不要盲目复制网上旧教程里的字段访问方式。PaddleOCR 不同版本 API 有变化。所以我们采用一个非常好的工程习惯:

python 复制代码
for res in result:
    print(res)

先看真实结果。


第三步:文本清洗

假设得到:

复制代码
订单编号:A123456
客户:张三
金额:199.00
日期:2026-08-17

可以写:

python 复制代码
text = "金额:199.00"

text = text.strip()#去掉空格,换行,前后无意义字符

第四步:提取金额

python 复制代码
import re

def extract_amount(text):
    match = re.search(
        r"\d+(?:\.\d+)?",
        text
    )

    if match:
        return float(match.group())

    return None

测试:

python 复制代码
print(
    extract_amount("金额:199.00")
)

结果:

复制代码
199.0

第五步:提取订单编号

python 复制代码
def extract_order_id(text):
    match = re.search(
        r"[A-Z]\d+",
        text
    )

    if match:
        return match.group()

    return None

例如:

python 复制代码
extract_order_id("订单编号:A123456")

得到:

复制代码
A123456

讲到这里,你会发现,图片转成文字并不难,真正复杂的是:

复制代码
图片
 ↓
OCR
 ↓
文本
 ↓
理解文本
 ↓
提取字段
 ↓
结构化

所以以后我们会继续往:

OCR + NLP/LLM + 结构化数据

第六步.速度

假设你有10000张照片,每张需要1秒,那么一万张就要接近三个小时,如果业务量很大的情况下,必须考虑GPU,批处理,多进程/多线程,图片预处理优化 ,模型大小,模型推理速度,服务化部署。

所以OCR应用不只是需要准确 ,还需要考虑准确率 + 速度 + 成本,具体根据使用场景定。

总结一下上面的内容就是:

复制代码
			图片
             │
             ▼
      ┌──────────────┐
      │   Detection  │
      │   文字检测    │
      └──────┬───────┘
             │
       文字区域/坐标
             │
             ▼
      ┌──────────────┐
      │ Recognition  │
      │   文字识别    │
      └──────┬───────┘
             │
        文字+置信度
             │
             ▼
      ┌──────────────┐
      │   后处理      │
      └──────┬───────┘
             │
  ┌──────────┼──────────┐
  ▼          ▼          ▼
清洗       正则       规则
  │          │          │
  └──────────┼──────────┘
             ▼
        结构化数据
             │
             ▼
      你的实际业务

七.OCR的应用

场景 难点 处理思路
手机截图 通常清晰 直接 OCR
扫描 PDF 清晰但版面复杂 OCR + 版面分析
手机拍文档 倾斜、阴影 校正 + OCR
发票 字段固定 OCR + 字段提取
小票 排版复杂 OCR + 坐标分析
表格 行列关系 表格识别
手写字 字形变化大 专门模型
低清照片 信息缺失 图像增强 + OCR
竖排中文 阅读方向特殊 方向/版面处理

不同的场景对应着不同的OCR场景,大体可以分为三类:

1.通用OCR

适用于普通照片

2.文档OCR

适用于pdf,合同,报告,论文等等

3.表格OCR

适用于表格

注:OCR只负责文字识别,至于信息抽取,文档理解,现在非常重要的 Document AI 方向。

相关推荐
凤山老林1 小时前
零停机数据库演进:Spring Boot 集成 Flyway 与平滑DDL变更策略
数据库·spring boot·后端
曹牧2 小时前
Oracle:取固定分隔符字符串中第一个元素
数据库·oracle
szarron2 小时前
VNA6 便携式矢量网络分析仪:从入门到精通
数据库·嵌入式硬件·测试工具·5g·射频工程
临床数据科学和人工智能兴趣组2 小时前
R语言中,列表是一种非常灵活的数据结构,它可以存储不同类型的对象,如向量、矩阵、数据框、甚至其他列表
数据结构·数据库·r语言·r语言-4.2.1·临床试验
cmes_love2 小时前
期货五档Level2行情数据和分钟历史行情数据下载分析
数据库
某不知名網友2 小时前
MySQL数据库库级操作|创建、字符集、修改删除、备份恢复
数据库·mysql
zone_z3 小时前
Oracle 数据库基础故障排查系列(12 篇)
数据库·oracle·dba·troubleshooting·blog-series
DBA_G3 小时前
GBase 8a数据库RANGE分区操作详细解读
数据库·oracle
三言老师3 小时前
K8s 集群 Ceph 节点磁盘分区规划配置实操
linux·运维·数据库