Ultralytics YOLO27: 加入候补名单。
开始使用

使用 Ultralytics YOLO26 进行场景文本 OCR

什么是场景文本 OCR?#

光学字符识别 (OCR) 可检测并读取图像中的文本。OCR 解决方案 将 Ultralytics YOLO26 文本检测器与文本识别后端结合使用。它支持水平检测框、 旋转框 (OBB) 和分割多边形,然后按阅读顺序返回识别出的文本。

检测和识别是独立组件,因此你可以将场景文本检测器与 PaddleOCR 或你自己的 识别模型搭配使用。

为什么使用场景文本 OCR?#

  • 灵活的文本几何形状:使用检测、OBB 或分割模型处理水平、旋转或不规则文本。
  • 识别器可互换:无需编写额外的集成代码即可运行 PaddleOCR,也可以传入其他模型的可调用对象。
  • 结构化输出:通过一个结果对象获取识别文本、识别和检测置信度、源几何信息,以及带标注的 图像。

使用 YOLO26 运行场景文本 OCR#

PaddleOCR 是可选依赖;使用 recognizer="paddleocr" 创建 OCR 时会加载 PaddleOCR,并在缺少相关依赖时安装 PaddleOCR 3.x 和 CPU 版 PaddlePaddle。若要使用 GPU 识别,请先安装匹配的 paddlepaddle-gpu 版本;Ultralytics 的基础依赖中 不会添加 OCR 软件包。

向 OCR 解决方案传入图像和文本检测器。结果包含带标注的图像和识别出的文本:

使用 Ultralytics YOLO26 进行场景文本 OCR
yolo solutions ocr model="scene-text-obb.pt" source="path/to/video.mp4" recognizer="paddleocr"

YOLO26-Text 检查点#

公开的 YOLO26-Text 系列提供 n、s、m、l 和 x OBB 检查点。将 ULTRALYTICS_API_KEY 设置为你自己的 Ultralytics Platform API 密钥,然后通过 Platform URI 加载检查点:

export ULTRALYTICS_API_KEY="your-api-key"
ocr = solutions.OCR(model="ul://ultralytics-yolo/yolo26-text/yolo26n-text", recognizer="paddleocr")
result = ocr(im0)

将 yolo26n-text 替换为 yolo26s-text、yolo26m-text、yolo26l-text 或 yolo26x-text,即可使用更大的模型。

OCR 参数#

下面是 OCR 参数表:

参数类型默认值说明
modelstrNoneUltralytics YOLO 模型文件的路径。
recognizerstr 或 Callable'paddleocr'文本识别后端或可调用对象,接收 BGR 裁剪图并返回 (text, confidence)。
line_widthint2解决方案绘制的框、关键点和计数的线条粗细。
verboseboolTrue启用逐帧日志,记录输入形状、类别计数和处理速度。跟踪调用本身始终不会输出日志。

此外,还支持以下可视化设置:

参数类型默认值说明
showboolFalse如果 True,则在窗口中显示带标注的图像或视频。适用于在开发或测试期间即时查看结果。
show_confboolTrue在每个检测结果的标签旁显示置信度分数,帮助了解模型对该检测结果的确信程度。
show_labelsboolTrue在可视化输出中显示每个检测结果的标签,便于立即了解检测到的对象。

场景文本 OCR 的工作原理#

  1. 检测文本:YOLO26 会生成水平检测框、旋转框或分割多边形。
  2. 生成识别裁剪图:检测框会裁剪至图像范围内。OBB 会沿水平跨度最大的边进行仿射校正, 使接近正方形的检测框保持正向,并让倾斜的文本行沿阅读 方向水平排列。对于分割多边形,会校正最小面积旋转矩形,同时保留原始多边形。高至少为宽 1.5 倍的裁剪图会逆时针旋转 90°,与 PaddleOCR 的处理方式一致。
  3. 识别文本:PaddleOCR 会以每批 16 个裁剪图的方式进行处理。自定义识别器每次接收一个裁剪图。
  4. 排列并渲染结果:文本会按水平文本行分组,并按从上到下、从左到右的顺序排列。可视化使用支持中文等非 ASCII 文本的 Unicode 字体。

坐标始终对应原始图像,而不是检测器输入或识别裁剪图。

使用自定义识别器#

传入一个可调用对象,即可集成其他识别模型,而无需更改检测、几何处理或排序流程。 对于每个非空的 BGR numpy.ndarray 裁剪图,该可调用对象都会运行一次。每次调用返回一个 (text, confidence) 元组,而不是 批量结果列表:

元组项接受的类型说明
textstr此裁剪图解码后的文本。未识别出文本时,返回 ""。
confidencefloat、int 或 numpy.floating数值型识别置信度,由解决方案转换为 float。
def recognize(crop):
    # 在此处对 BGR 裁剪图运行你的识别模型并解码其输出。
    return "example", 0.95

ocr = solutions.OCR(model="custom-text.pt", recognizer=recognize)
result = ocr(im0)

不支持的后端名称会引发 ValueError。如果未检测到文本,result.texts 将为空,并且不会调用识别器。

OCR 结果#

每次调用都会返回一个 SolutionResults 对象。使用 result.plot_im 获取带标注的图像,使用 result.texts 获取按确定性阅读顺序排列的记录:

键类型说明
textstr识别出的文本。
confidencefloat识别置信度,与检测置信度分开保存。
detection_confidencefloatYOLO 检测器置信度。
detection_indexint按阅读顺序排序前的源检测索引。
polygonlist[list[float]]原始图像中的多边形:检测框和 OBB 检测结果对应四个角点,分割检测结果对应掩码轮廓。

依赖项和许可证#

组件必填角色许可证
Ultralytics是YOLO 检测、裁剪图几何处理和结果编排AGPL-3.0
PaddlePaddle仅用于 recognizer="paddleocr"识别运行时Apache-2.0
PaddleOCR 3.x仅用于 recognizer="paddleocr"文本行识别模型和推理适配器Apache-2.0
自定义可调用对象否用户自有的识别集成由后端定义

PaddleOCR 可能会在首次使用时下载识别权重。将这些文件打包或部署前,请查看所选模型的模型卡和再分发 条款。自定义检查点的许可证另行规定。

常见问题#

  • 可以。将可调用对象作为 recognizer 传入,并为每个 BGR 裁剪图返回 (text, confidence)。有关输入和输出约定,请参阅 使用自定义识别器。

  • 不会。OCR 会独立处理每张输入图像,不提供跟踪 ID,也不会缓存识别结果。需要逐帧进行 OCR 时,请将视频的每一帧 作为单独输入处理。

  • 你可以使用常规的导出模式导出 YOLO 检测器,但 PaddleOCR 或自定义识别器 不会嵌入 ONNX、TensorRT 或其他检测器产物中。请将导出的检测器和识别 运行时作为独立组件部署,或保留此 Python 组合层。

贡献者

评论

提出问题、分享结果,或帮助其他人。