fastApi中的ocr

发布于:2025-07-31 ⋅ 阅读:(16) ⋅ 点赞:(0)

1. Tesseract

优点

  • 完全免费开源

  • 支持100多种语言

  • 可以本地运行,无需网络连接

  • 适合简单的OCR需求

缺点

  • 准确率相对商业方案较低

  • 对复杂布局(如表格)处理能力有限

  • 需要自行训练以提高特定场景的准确率

接口常用方法: 

由于Tesseract引入是以pytesseract进行封装引入的

tesseract下载路径Index of /tesseract,安装时勾选语言包
# 指定 tessdata 路径
os.environ['TESSDATA_PREFIX'] = r'E:\python\tesseract\tessdata'
pytesseract.pytesseract.tesseract_cmd = r'E:\python\tesseract\tesseract.exe'
# 基本识别
text = pytesseract.image_to_string(Image.open("image.jpg"), lang="eng")

# 获取文本框、置信度等详细信息
data = pytesseract.image_to_data(Image.open("image.jpg"), output_type=pytesseract.Output.DICT)

# 仅识别数字
text = pytesseract.image_to_string(Image.open("image.jpg"), config="--psm 6 digits")

# 获取 OCR 的 HOCR 输出(包含位置信息)
hocr = pytesseract.image_to_pdf_or_hocr("image.jpg", extension="hocr")
  • 多语言混合识别

    text = pytesseract.image_to_string(image, lang="eng+chi_sim")
  • 输出格式控制

    • image_to_boxes: 返回字符边界框

    • image_to_data: 返回单词级信息(坐标、置信度)

    • image_to_osd: 检测方向和脚本

  • 自定义配置文件
    创建 config.txt 文件,内容如:

    tessedit_char_whitelist 0123456789  # 仅识别数字

    调用时加载配置:

    pytesseract.image_to_string(image, config="path/to/config.txt")

2. PaddleOCR 

优点

  • 由百度开发的中文OCR效果优秀

  • 支持中英文混合识别

  • 轻量级模型可选

  • 支持版面分析

  • 相比 Tesseract,它在中文场景和复杂布局(如多方向文本、表格)上表现更优

缺点

  • 英文识别能力不如Tesseract

  • 需要一定配置和依赖

 核心功能与方法

(1) 单张图片识别(检测+识别)
# 识别图片文本(返回结果包含文本框坐标、文本内容、置信度)
result = ocr.ocr("image.jpg", cls=True)  # cls=True启用方向分类

# 解析结果
for line in result:
    boxes = line[0]  # 文本框坐标(4个点,格式:[x1,y1], [x2,y2], [x3,y3], [x4,y4])
    text = line[1][0]  # 识别文本
    confidence = line[1][1]  # 置信度(0~1)
    print(f"文本: {text}, 置信度: {confidence}, 位置: {boxes}")
(2) 仅文本检测
# 只检测文本位置(不识别内容)
det_result = ocr.ocr("image.jpg", det=True, rec=False)
for boxes in det_result:
    print("文本框坐标:", boxes[0])  # 输出检测框
(3) 仅文本识别
# 对已裁剪的文本区域进行识别(需提供单行文本图片)
rec_result = ocr.ocr("cropped_text.jpg", det=False, rec=True)
print("识别结果:", rec_result[0][1][0])
端到端OCR(检测+识别)
# 默认端到端模式
result = ocr.ocr("image.jpg", cls=True)

# 保存可视化结果
image = draw_ocr("image.jpg", result, font_path="simfang.ttf")  # 指定中文字体
image.save("output.jpg")
表格识别
from paddleocr import PPStructure

table_engine = PPStructure(recovery=True)  # 恢复表格结构
result = table_engine("table.jpg")
for region in result:
    print(region['type'])  # 'table' 或 'text'
    print(region['res'])
多语言混合识别
# 需下载混合语言模型(如中英)
ocr = PaddleOCR(lang="ch_en")
自定义字典
# 添加用户词典(如专业术语)
ocr = PaddleOCR(rec_char_dict_path="custom_dict.txt")

3. EasyOCR 

优点

  • 简单易用

  • 支持80+语言

  • 适合初学者

  • 相比 Tesseract 和 PaddleOCR,它的优势在于 开箱即用多语言支持和 简洁的 API

缺点

  • 准确率中等

  • 模型较大

快速识别文本

import easyocr

# 初始化 Reader(指定语言,例如英文和中文)
reader = easyocr.Reader(['en', 'ch_sim'])  # 'ch_sim' 是简体中文

# 读取图片并识别文本
result = reader.readtext('image.jpg')

# 打印结果
for detection in result:
    print(detection[1])  # 打印识别到的文本

输出示例

[([[10, 20], [100, 20], [100, 50], [10, 50]], 'Hello', 0.99),
 ([[50, 80], [200, 80], [200, 120], [50, 120]], '你好', 0.98)]

每个结果包含:

  • detection[0]:文本框坐标(四个点的 [x, y] 坐标)

  • detection[1]:识别的文本

  • detection[2]:置信度(0~1)

核心功能

(1) 多语言识别

EasyOCR 支持 80+ 种语言,例如:

reader = easyocr.Reader(['en', 'ch_sim', 'ja', 'ko', 'fr'])  # 英文、中文、日文、韩文、法文

(2) 检测 + 识别

默认情况下,readtext() 会执行 文本检测(Detection) 和 文本识别(Recognition)

result = reader.readtext('image.jpg')

(3) 仅文本检测

bounds = reader.readtext('image.jpg', detail=0)  # 只返回文本,不返回坐标和置信度

(4) 调整识别参数

result = reader.readtext(
    'image.jpg',
    decoder='beamsearch',  # 解码方式('greedy' 或 'beamsearch')
    beamWidth=5,          # beamsearch 的宽度(越大越准,但越慢)
    batch_size=1,         # 批处理大小(GPU 可增大)
    contrast_ths=0.1,     # 对比度阈值(低对比度文本可能被忽略)
    adjust_contrast=0.5,  # 自动调整对比度(0~1)
    width_ths=0.5,        # 合并相邻文本框的宽度阈值
    height_ths=0.5,       # 合并相邻文本框的高度阈值
)

3. 图像预处理优化

EasyOCR 内置预处理,但某些场景需手动优化:

(1) 调整对比度 & 亮度

import cv2

image = cv2.imread('image.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
image = cv2.equalizeHist(image)  # 直方图均衡化
result = reader.readtext(image)

(2) 二值化(黑白处理)

_, binary_image = cv2.threshold(image, 150, 255, cv2.THRESH_BINARY)
result = reader.readtext(binary_image)

(3) 降噪(去模糊)

image = cv2.GaussianBlur(image, (3, 3), 0)  # 高斯模糊去噪
result = reader.readtext(image)

(4) 批量识别(GPU 加速)

results = reader.readtext_batch(['img1.jpg', 'img2.jpg'], batch_size=2)  # GPU 批处理

(5) 自定义模型路径

reader = easyocr.Reader(
    ['en', 'ch_sim'],
    model_storage_directory='custom_models/',  # 自定义模型存储路径
    download_enabled=False  # 禁用自动下载模型
)

(6) 识别特定区域(ROI)

import numpy as np

image = cv2.imread('image.jpg')
roi = image[100:300, 200:400]  # 截取感兴趣区域
result = reader.readtext(roi)

4.LaTeX-OCR

✅ 优点

  1. 高精度识别数学公式

    • 相比通用 OCR(如 Tesseract),LaTeX-OCR 针对数学符号、上下标、分式、矩阵等复杂结构优化,识别率更高。

    • 适合学术论文、教材、试卷等场景。

  2. 输出 LaTeX 代码

    • 可直接生成 LaTeX 格式,方便在 Overleaf、Markdown($E=mc^2$)等场景使用。

  3. 支持手写公式识别(部分工具)

    • 如 MyScriptMathpix Handwriting 可识别手写公式。

  4. 开源替代方案可用

    • 如 pix2tex(基于深度学习),可本地运行,无需依赖 API。


❌ 缺点

  1. 依赖清晰印刷体

    • 手写潦草或低分辨率图片识别率下降。

  2. 复杂公式可能出错

    • 嵌套结构(如多重积分、复杂矩阵)可能解析错误。

  3. 部分工具需要付费

    • Mathpix 免费版限制 100 次/月,商用需订阅。

  4. 训练数据要求高(自定义模型)

    • 如果需要训练自己的模型,需大量标注数据。


二、常用 LaTeX-OCR 工具及方法

1. Mathpix(推荐,高精度)

安装与使用
import requests
import base64

# 使用 Mathpix API(需注册获取 app_id 和 app_key)
def mathpix_ocr(image_path):
    with open(image_path, "rb") as f:
        img_base64 = base64.b64encode(f.read()).decode()
    
    headers = {
        "app_id": "YOUR_APP_ID",
        "app_key": "YOUR_APP_KEY",
        "Content-type": "application/json"
    }
    data = {"src": f"data:image/png;base64,{img_base64}", "formats": ["latex"]}
    response = requests.post("https://api.mathpix.com/v3/text", json=data, headers=headers)
    return response.json()["latex"]

latex_code = mathpix_ocr("equation.png")
print(latex_code)  # 输出 LaTeX,如 "\frac{x}{y} = \sqrt{2}"

适用场景:学术论文、精准公式提取。


2. pix2tex(开源替代)

安装
pip install pix2tex[gui]  # 安装带 GUI 的版本
pip install pix2tex[gui] -i https://pypi.tuna.tsinghua.edu.cn/simple #镜像版本
使用
from pix2tex.cli import LatexOCR

model = LatexOCR()
latex_code = model(Image.open("equation.png"))  # 识别图片
print(latex_code)  # 输出 LaTeX 代码

适用场景:本地免费使用,适合简单公式。


4. Tesseract + 自定义训练(低成本方案)

如果坚持使用 Tesseract,可尝试:

python

复制

下载

import pytesseract
from PIL import Image

# 预处理图片(二值化 + 增强对比度)
img = Image.open("equation.png").convert("L")  # 转灰度
pytesseract.image_to_string(img, config="--psm 6 --oem 3 -c tessedit_char_whitelist=0123456789+-=(){}[]")

适用场景:简单印刷体公式,无复杂结构。

5.自研OCR 

  • 优点

    • 完全定制化(针对特定场景优化)

    • 数据隐私可控(本地部署)

    • 长期成本可控(无API调用费)

  • 缺点

    • 需标注大量训练数据

    • 开发周期长(模型训练/迭代)

    • 维护成本高

  • 适用场景:特殊格式(工业标签/手写体)、数据敏感领域

核心流程

自研 OCR 通常分为以下阶段:

  1. 图像预处理 → 提升图像质量

  2. 文本检测(Text Detection) → 定位文本位置

  3. 文本识别(Text Recognition) → 识别文本内容

  4. 后处理(Post-processing) → 矫正错误


2. 关键技术方法

(1) 图像预处理

目标:增强文本区域,抑制噪声。

  • 灰度化

    import cv2
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
  • 二值化(固定阈值/Otsu):

    _, binary = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY_INV)
  • 去噪(中值滤波/高斯模糊):

    denoised = cv2.medianBlur(binary, 3)
  • 边缘增强(CLAHE):

    clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
    enhanced = clahe.apply(gray)

(2) 文本检测(Text Detection)

传统方法
  • MSER(最大稳定极值区域) + SWT(笔画宽度变换)

  • OpenCV 轮廓检测

    contours, _ = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    for cnt in contours:
        x, y, w, h = cv2.boundingRect(cnt)
        cv2.rectangle(image, (x,y), (x+w,y+h), (0,255,0), 2)
深度学习方法
  • CTPN(Connectionist Text Proposal Network) → 适合水平文本

  • EAST(Efficient and Accurate Scene Text Detector) → 支持多方向文本

  • DBNet(Differentiable Binarization Network) → 高精度二值化检测

  • YOLOv8/PP-YOLOE(检测+OCR 端到端) → 适用于特定场景(如车牌)

示例(使用 PaddleDetection)

from paddledetection import PPYOLOE
model = PPYOLOE(model_dir='text_det_model')
results = model.predict('image.jpg')

(3) 文本识别(Text Recognition)

深度学习方法
  • CRNN(CNN + RNN + CTC) → 经典序列识别

  • Transformer-based(如 TrOCR) → 高精度但计算量大

  • SVTR(百度自研) → 中文场景优化

示例(CRNN 训练)

import torch
model = CRNN(num_classes=len(charset))  # 字符集大小
criterion = torch.nn.CTCLoss()
optimizer = torch.optim.Adam(model.parameters())

6. MMOCR

优点

  • 支持多种语言和多种算法

  • 各组件可灵活替换(如backbone、neck、head)

  • 提供大量预训练模型

缺点

  • 资源消耗,部分模型(如SAR)需要较大显存

  • 对结构化文档(如表格)支持有

7.GPT-4V 

7.1PT-4V 的核心优势(优点)

  1. 多模态能力

    • 同时处理图像和文本输入,支持自然语言交互(如“描述图片内容并总结要点”)。

    • 适用于复杂场景:文档解析、图表分析、自然场景文本识别等。

  2. 零样本学习(Zero-shot)

    • 无需微调即可完成大多数OCR和图像理解任务,开箱即用。

  3. 语义理解增强

    • 超越传统OCR:能结合上下文纠正识别错误(如将模糊的“1O1”修正为“101”)。

    • 支持问答和摘要生成(如“图片中的关键数据是什么?”)。

  4. 多语言支持

    • 覆盖主流语言(中、英、法等),但非拉丁语系(如中文)精度可能略低于专用OCR工具。

  5. 开发便捷性

    • 直接通过API调用,无需训练模型或部署复杂Pipeline。


7.2、GPT-4V 的局限性(缺点)

  1. 精度问题

    • 对模糊、小字体或复杂排版(如表格、公式)的识别率低于专用OCR工具(如PaddleOCR)。

    • 中文长文本可能出现分段错误。

  2. 成本高

    • API按Token计费,高分辨率图片的Token消耗大(需压缩优化)。

    • 不适合高频或大批量处理场景(成本难以控制)。

  3. 响应速度慢

    • 平均响应时间3-10秒,远高于本地OCR引擎(如Tesseract)。

  4. 隐私与合规风险

    • 图像数据需上传至OpenAI服务器,不适合敏感内容(如医疗记录、身份证)。

  5. 提示词敏感

    • 输出质量高度依赖指令设计(需反复调试Prompt)。


7.3、GPT-4V 的典型使用场景

场景 示例指令
文档文本提取 “提取图片中的所有文字,保留段落格式。”
表格解析 “将图片中的表格转换为Markdown格式,确保对齐列名和数据。”
图像问答 “图中菜单的素食选项有哪些?列出菜品和价格。”
语义纠错 “识别图片中的代码片段,修正可能的OCR错误(如0/O混淆)。”
多图关联分析 “对比两张价格表的差异,列出新增商品和价格变化。”

7.4、高效使用方法与技巧

1. 基础代码示例
from openai import OpenAI
import base64

# 初始化客户端(建议从环境变量读取API Key)
client = OpenAI(api_key="sk-your-key")

# 图片转Base64(需压缩)
def encode_image(image_path):
    with open(image_path, "rb") as image_file:
        return base64.b64encode(image_file.read()).decode('utf-8')

# 调用GPT-4V
response = client.chat.completions.create(
    model="gpt-4-vision-preview",
    messages=[
        {
            "role": "user",
            "content": [
                {"type": "text", "text": "提取图中的文字"},
                {"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{encode_image('image.jpg')}"}},
            ],
        }
    ],
    max_tokens=1000,  # 根据文本长度调整
    timeout=20,       # 设置超时
)
print(response.choices[0].message.content)
2. 优化策略
  • 图片压缩:限制分辨率(长边≤2048px)和体积(≤500KB),避免超时和高费用。

    from PIL import Image
    import io
    
    def compress_image(image_path, quality=85):
        img = Image.open(image_path)
        if img.mode == 'RGBA':
            img = img.convert('RGB')
        buffer = io.BytesIO()
        img.save(buffer, format="JPEG", quality=quality)
        return base64.b64encode(buffer.getvalue()).decode('utf-8')
  • 指令设计

    • 明确任务:避免模糊指令(如“分析图片”),改为“提取图中所有电话号码”。

    • 结构化输出:指定格式(如JSON、Markdown)。

  • 错误处理与重试

    import time
    from openai import APITimeoutError
    
    def call_with_retry(prompt, image_base64, retries=3):
        for i in range(retries):
            try:
                response = client.chat.completions.create(...)
                return response
            except APITimeoutError:
                if i == retries - 1:
                    raise
                time.sleep(2 ** i)  # 指数退避
3. 安全与成本控制
  • 隐私保护:避免上传敏感图片,必要时模糊关键信息。

  • 监控用量:通过OpenAI Dashboard设置API限额警报。

8.商业OCR软件 

1. Adobe Acrobat Pro

  • PDF文档OCR

  • 保持原始布局

  • 多语言识别

2. ABBYY FineReader

  • 表格识别准确率高

  • 支持190+种语言

  • 格式保留能力强

3. Readiris

  • 手写识别

  • 文档分类

  • 批量处理


网站公告

今日签到

点亮在社区的每一天
去签到