AI-深度学习

嵌入式视觉模型进阶 22:OCR 检测:从文字区域到矫正图片

展开合集目录
  1. 嵌入式视觉模型进阶 01:怎样读懂一个实际模型
  2. 嵌入式视觉模型进阶 02:卷积进阶:分组、深度、逐点与空洞卷积
  3. 嵌入式视觉模型进阶 03:MobileNet:深度可分离卷积与倒残差
  4. 嵌入式视觉模型进阶 04:通道注意力与 MobileNetV3
  5. 嵌入式视觉模型进阶 05:ShuffleNet:通道拆分与重排
  6. 嵌入式视觉模型进阶 06:结构重参数化:训练分支怎样合为一个卷积
  7. 嵌入式视觉模型进阶 07:Backbone、Neck、Head 与多尺度特征
  8. 嵌入式视觉模型进阶 08:FPN 与 PAN:怎样融合不同尺度的信息
  9. 嵌入式视觉模型进阶 09:检测头:分类、位置与置信度
  10. 嵌入式视觉模型进阶 10:检测训练:标签分配与损失计算
  11. 嵌入式视觉模型进阶 11:完整 YOLOv8 推理:从图片到原图目标框
  12. 嵌入式视觉模型进阶 12:训练自己的检测器与错误分析
  13. 嵌入式视觉模型进阶 13:检测器导出对照与其他结构路线
  14. 嵌入式视觉模型进阶 14:跟踪基础:运动预测、匹配与轨迹生命周期
  15. 嵌入式视觉模型进阶 15:ByteTrack 思路:用低分框恢复已有轨迹
  16. 嵌入式视觉模型进阶 16:外观特征与 ReID:怎样比较两个目标
  17. 嵌入式视觉模型进阶 17:目标跟随:从轨迹到云台控制接口
  18. 嵌入式视觉模型进阶 18:视频系统:队列、时间戳与异步流水线
  19. 嵌入式视觉模型进阶 19:人脸处理流程:检测、关键点与对齐
  20. 嵌入式视觉模型进阶 20:特征识别:人脸向量、相似度与阈值
  21. 嵌入式视觉模型进阶 21:人体关键点与姿态估计
  22. 嵌入式视觉模型进阶 22:OCR 检测:从文字区域到矫正图片
  23. 嵌入式视觉模型进阶 23:OCR 识别:序列模型与 CTC
  24. 嵌入式视觉模型进阶 24:完整 OCR 流程与识别错误分析
  25. 嵌入式视觉模型进阶 25:轻量语义分割与实例分割
  26. 嵌入式视觉模型进阶 26:工业异常检测:缺陷样本少时怎么办
  27. 嵌入式视觉模型进阶 27:深度估计与图像恢复:两个专题入口
  28. 嵌入式视觉模型进阶 28:面向 NPU 的计算图与算子兼容
  29. 嵌入式视觉模型进阶 29:量化、蒸馏与剪枝的实际取舍
  30. 嵌入式视觉模型进阶 30:综合项目:检测、跟踪与云台跟随验收
嵌入式视觉模型进阶 22:OCR 检测:从文字区域到矫正图片的封面

第 22 / 30 课。 前置:上一课。本篇的运行范围以实验说明和验证记录为准,构造样例不代表真实任务精度或板端性能。

文字框为什么不总是水平矩形

路牌、包装和倾斜文档上的文字可能旋转或透视变形。文本检测器输出可能是四边形、多边形或概率图。概率图还需要二值化、连通区域、轮廓过滤和扩张等处理,具体规则取决于模型。

本课输入已经确定的四个角点,练习检测之后的裁剪矫正,不实现 DB 检测网络。四点按左上、右上、右下、左下顺序提供;上游应同时保存阅读方向。简单按坐标排序对极端旋转或退化形状可能失效。

透视变换比仿射更一般

用四对对应点求 3×3 单应矩阵,把原图四边形映射到规则矩形。变换可描述平面在透视下的形变,但弯曲纸面不一定能用一个矩阵完全矫正。

输出宽度可按上下边较长者估计,高度按左右边较长者估计。最小尺寸、长宽比和退化面积需要检查,避免生成零大小图或极大缓冲。

几何与识别分开验证

脚本在构造图片中标出四点,检查矩阵将四点映射到目标角点,并执行实际 warpPerspective。角点误差很小不代表文字一定可读;插值、模糊和裁剪缺边仍可能使识别失败。

修改任务

交换右下与左下的顺序,观察四边形自交;将所有点放在同一直线,确认程序拒绝退化输入。再给裁剪边缘增加适量空白,比较字符是否完整,但不要把统一扩张比例当作所有检测器的默认值。

多文本区域的阅读排序应另行设计。单行从左到右排序适合本课示例,复杂表格、多栏页面或竖排文字需要版面分析,不能只按一个 x 坐标处理。

配套实验与运行记录

实验:OCR 检测:从文字区域到矫正图片

查看完整代码:main.py
"""通过有序四边形和透视变换理解文字裁剪,保留阅读方向与边界信息。"""

import cv2
import numpy as np


def rectify(image, points):
    p = np.asarray(points, np.float32)
    if (
        p.shape != (4, 2)
        or not np.isfinite(p).all()
        or not cv2.isContourConvex(p)
        or abs(cv2.contourArea(p)) < 1
    ):
        raise ValueError("ordered nondegenerate convex quadrilateral required")
    width = max(2, round(max(np.linalg.norm(p[1] - p[0]), np.linalg.norm(p[2] - p[3]))))
    height = max(
        2, round(max(np.linalg.norm(p[3] - p[0]), np.linalg.norm(p[2] - p[1])))
    )
    if max(width, height) > 4096:
        raise ValueError("crop too large")
    dst = np.array(
        [[0, 0], [width - 1, 0], [width - 1, height - 1], [0, height - 1]], np.float32
    )
    matrix = cv2.getPerspectiveTransform(p, dst)
    projected = cv2.perspectiveTransform(p[None], matrix)[0]
    np.testing.assert_allclose(projected, dst, atol=1e-3)
    return cv2.warpPerspective(image, matrix, (width, height))


def main():
    image = np.full((120, 200, 3), 255, np.uint8)
    p = np.array([[25, 25], [170, 15], [180, 80], [20, 95]], np.float32)
    cv2.polylines(image, [p.astype(np.int32)], True, (0, 0, 0), 2)
    crop = rectify(image, p)
    print("rectified shape", crop.shape)
    try:
        rectify(image, [[0, 0], [1, 1], [2, 2], [3, 3]])
    except ValueError:
        print("degenerate quadrilateral rejected")
    else:
        raise AssertionError("degenerate accepted")


if __name__ == "__main__":
    main()
下载代码

在项目根目录执行;下载包解压后,在解压目录执行 python3 main.py。

cd 'content/posts/AI-深度学习/嵌入式视觉模型进阶/22-OCR 检测/code' && python3 main.py

在本篇代码目录执行 python3 main.py。依赖安装、可选入口见包内 README.md;实际运行结果见 verification.md。下载包包含本课使用的辅助模块与样例。

参考与进一步阅读

原始论文或官方文档用于核对结构、接口和适用范围。本篇代码是围绕教学目标编写的最小实验;除明确注明的完整入口外,不视为对应论文模型的完整复现。


完整进阶目录 · 入门系列 · 上一篇 · 下一篇