- 人工智能
- 深度学习
- 计算机视觉
- OCR
【免费下载链接】doctr
docTR (Document Text Recognition) - a seamless, high-performing & accessible library for OCR-related tasks powered by Deep Learning. Ongoing development and maintenance by t2k.
导读
docTR(Document Text Recognition)是一个面向 OCR 相关任务、基于深度学习的开源库,其doctr.contrib贡献模块为文档分析流程提供了 OCR 主线之外的附加能力。本文聚焦该模块中目前唯一公开的贡献组件ArtefactDetector:它以 YOLOv8 目标检测架构为内核,能够在一张文档图像中同时识别条形码(bar_code)、二维码(qr_code)、Logo 与照片(photo)四类人工制品,并输出带置信度与坐标框的结构化结果。读完本文,你将掌握 contrib 模块的安装方式、ArtefactDetector的完整调用流程与参数语义,并能用自定义 YOLOv8 ONNX 模型替换默认权重,把它无缝接入 docTR 的文档分析流水线。
一、contrib 模块是什么
doctr.contrib是 docTR 中“所有可用贡献模块”的集合,官方 API 文档在 docs/source/modules/contrib.rst 中如此定义:
This module contains all the available contribution modules for docTR.
从源码布局看,该模块的结构非常精简:包入口 doctr/contrib/init.py 只导出一个公开类ArtefactDetector,其实现位于 doctr/contrib/artefacts.py,底层通用预测器基类则定义在 doctr/contrib/base.py 中。
contrib 模块与 docTR 主库的定位差异在于:主库的检测 / 识别 / 分类模型专注于“文字本身”,而 contrib 模块关心的是文档图像中与文字伴生的“人工制品”——例如商品包装上的条码、海报角落的二维码、票据上的公司 Logo。这些元素虽然不参与 OCR 文字输出,但对版面理解、文档分类和流程决策(如“这张单据是否含二维码”)很有价值。因此,contrib 模块可以看作主分析流水线的外围补充能力层。
二、安装与依赖
contrib 模块依赖 ONNX Runtime 来加载并执行 YOLOv8 导出的 ONNX 模型。安装有两种等价方式:
# 方式一:使用 docTR 提供的 contrib extra,一次性装齐 pip install python-doctr[contrib] # 方式二:手动安装推理引擎 pip install onnxruntime # CPU 版本 # pip install onnxruntime-gpu # GPU 版本其中 extra 依赖的定义可以在 pyproject.toml 中查到:contrib = ["onnxruntime>=1.11.0"]。也就是说,contrib 的核心硬性依赖只有一个onnxruntime包。代码层面,基类在初始化时会调用requires_package("onnxruntime", ...)做运行期检查,若未安装会直接抛出提示:
`.contrib` module requires `onnxruntime` to be installed.另外,如果你希望调用ArtefactDetector.show()做可视化,还需要安装matplotlib(源码中通过requires_package("matplotlib", ".show()requires matplotlib installed")强制校验)。
三、ArtefactDetector 快速上手
3.1 最小可用示例
ArtefactDetector的用法与 docTR 其他预测器保持一致的风格:先加载文档,再实例化检测器,直接调用即可。官方文档 docs/source/using_doctr/using_contrib_modules.rst 给出了完整示例:
from doctr.io import DocumentFile from doctr.contrib.artefacts import ArtefactDetector # 加载文档(支持单张或多张图像) doc = DocumentFile.from_images(["path/to/your/image"]) # 创建检测器,显式指定批大小与两个阈值 detector = ArtefactDetector(batch_size=2, conf_threshold=0.5, iou_threshold=0.5) # 执行推理,返回结构化结果 artefacts = detector(doc) # 可视化检测结果(红框 + 标签 + 置信度) detector.show()其中DocumentFile.from_images来自 doctr/io 模块,它会将图像解码为np.ndarray列表;ArtefactDetector接受任意图像数组列表作为输入,并不限定必须来自DocumentFile。
3.2 返回结果的结构
调用检测器后得到的是一个 Python 列表,其结构为“图像 -> 图像内的人工制品 -> 单个人工制品字典”三层嵌套:
[ [ # 第 1 张图的所有检测结果 { "label": "bar_code", # 类别标签:bar_code / qr_code / logo / photo "confidence": 0.9321, # 置信度分数(float) "box": [xmin, ymin, xmax, ymax], # 像素坐标框,四个值均为 int }, ... ], ... ]每个结果字典固定包含三个键:label(类别名)、confidence(置信度)、box(归一化回原始图像尺寸的像素边界框)。这个结构契约由单元测试 tests/common/test_contrib.py 严格校验,其中断言了结果类型、字典键、box 长度为 4、坐标类型为int、置信度为float,可作为你解析结果时的权威参考。
3.3 默认模型的四类标签
ArtefactDetector的默认配置定义在 doctr/contrib/artefacts.py 的default_cfgs字典中,键为yolov8_artefact:
| 配置项 | 默认值 | 说明 |
|---|---|---|
input_shape | (3, 1024, 1024) | 模型输入张量形状:通道数 3、高 1024、宽 1024 |
labels | ["bar_code", "qr_code", "logo", "photo"] | 四类检测目标 |
url | 官方托管权重(v0.8.1 版 YOLOv8 ONNX 模型) | 首次使用时自动下载并缓存 |
也就是说,开箱即用的检测器能识别条形码、二维码、Logo、照片四类对象,适用于票据、证件、包装盒等常见文档场景。
四、构造参数详解
ArtefactDetector的构造函数签名如下(源码见 doctr/contrib/artefacts.py):
ArtefactDetector( arch: str = "yolov8_artefact", batch_size: int = 2, model_path: str | None = None, labels: list[str] | None = None, input_shape: tuple[int, int, int] | None = None, conf_threshold: float = 0.5, iou_threshold: float = 0.5, **kwargs, )各参数语义如下:
arch:使用的模型架构名,目前仅"yolov8_artefact"。它决定了从default_cfgs中读取默认权重 URL、标签表和输入尺寸。batch_size(默认2):推理批大小。输入图像会按此值切成若干批次依次送入 ONNX 会话,用于平衡吞吐与显存/内存占用。model_path(默认None):自定义 ONNX 模型文件路径。一旦提供,将跳过权重下载,直接加载本地文件(详见第五节)。labels(默认None):类别标签列表。None时取default_cfgs[arch]["labels"];提供自定义模型时需与你的模型输出类别顺序一一对应。input_shape(默认None):(C, H, W)形式的三元组,None时取默认(3, 1024, 1024)。预处理阶段会据此把输入图像 resize 到(H, W)。conf_threshold(默认0.5):置信度阈值。后处理时,只有最高类别分数>= conf_threshold的检测框才会保留。iou_threshold(默认0.5):非极大值抑制(NMS)的 IoU 阈值,用于去除重叠框。**kwargs:透传给download_from_url的参数(如自定义缓存目录等),仅在使用默认 URL 下载权重时生效。
五、使用自定义 YOLOv8 模型
contrib 模块的一大亮点是支持替换为自训练的 YOLOv8 模型。官方文档给出的自定义模型用法:
from doctr.contrib import ArtefactDetector detector = ArtefactDetector( model_path="path/to/your/model.onnx", labels=["table", "figure"], # 你的模型自己的类别 )也就是说,你完全可以用自己训练(或微调)的 YOLOv8 权重检测任意目标——比如示例中的table、figure。使用自定义模型时有两点硬性前提,官方文档已明确标注:
- 模型必须是 ONNX 导出的格式,且需要动态 batch size(不能固定为静态 batch),因为
_BasePredictor会按batch_size切分输入,动态维度是必要的。 - 暂不支持 Oriented Bounding Box(OBB)推理——即旋转框检测尚未覆盖,请使用常规的水平框(HBB)模型。
当同时提供model_path时,模型加载流程完全绕过download_from_url(见 doctr/contrib/base.py 的判断逻辑:model_path if model_path else download_from_url(url, ...))。底层会以ort.InferenceSession创建推理会话,并按顺序尝试CUDAExecutionProvider与CPUExecutionProvider——也就是说,装有 CUDA 环境时自动走 GPU,否则回退到 CPU,无需手动指定执行后端。
六、源码级原理:从图像到检测框的完整链路
ArtefactDetector本身只实现了预处理与后处理,通用推理调度由基类_BasePredictor(doctr/contrib/base.py)负责。整个调用链路可拆解为四个阶段:
6.1 模型加载(_BasePredictor._init_model)
基类构造时接收url与model_path,二者必须提供其一,否则抛出ValueError("You must provide either a url or a model_path")。模型文件来源为:
- 本地路径:直接使用;
- URL:通过
doctr.utils.data.download_from_url下载,缓存目录为models,之后每个进程只需下载一次。
随后创建onnxruntime.InferenceSession,providers 依次为["CUDAExecutionProvider", "CPUExecutionProvider"]。注意:ArtefactDetector的模型会话是标准的 ONNX Runtime 会话,不依赖 PyTorch,这也是为什么 contrib 模块只要求安装onnxruntime而非完整的深度学习框架。
6.2 预处理(ArtefactDetector.preprocess)
针对单张图像,预处理只有两步(doctr/contrib/artefacts.py):
def preprocess(self, img: np.ndarray) -> np.ndarray: return np.transpose(cv2.resize(img, (self.input_shape[2], self.input_shape[1])), (2, 0, 1)) / np.array(255.0)- 用
cv2.resize将图像缩放为(1024, 1024)(即input_shape的 H、W); - 通过
np.transpose(..., (2, 0, 1))把(H, W, C)的 OpenCV 布局转为(C, H, W); - 除以 255 完成像素归一化到
[0, 1]。
基类__call__会按batch_size把输入切块,对每个 batch 内所有图像执行上述预处理并打包成dtype=np.float32的张量,然后调用 ONNX 会话的session.run(None, {model_inputs[0].name: batch})。
6.3 后处理(ArtefactDetector.postprocess)
后处理是最核心的部分,其逻辑(doctr/contrib/artefacts.py)包含四个关键步骤:
- 解析原始输出:遍历模型输出的每一行
(x, y, w, h, class_scores...),取各类别分数最大值max_score与对应class_id;仅当max_score >= conf_threshold时保留。 - 坐标反缩放:YOLOv8 输出的中心点
(x, y)与宽高(w, h)是在 1024×1024 的输入坐标系下的,需换算为原始图像坐标:xmin = int((x - w/2) * width_scale)等,其中width_scale = 原图宽 / 1024,height_scale = 原图高 / 1024。 - NMS 去重:对候选框调用
cv2.dnn.NMSBoxes(boxes, scores, conf_threshold, iou_threshold)过滤重叠框。 - 组装结果:为每个保留框输出
{"label": self.labels[class_id], "confidence": float(max_score), "box": [xmin, ymin, xmax, ymax]}。
6.4 可视化(ArtefactDetector.show)
show()需要matplotlib支持(缺少时抛出明确提示)。它会遍历_inputs与_results,用红色矩形框标注每个检测对象,并在框左上角叠加"{label} {confidence:.2f}"文本(doctr/contrib/artefacts.py)。该方法接受**kwargs并透传给plt.show,因此在脚本中可传block=False实现非阻塞展示(测试环境即如此使用)。
七、测试验证:行为契约一览
contrib 模块配有专门的单元测试文件 tests/common/test_contrib.py,它从侧面印证了上文的所有行为:
test_base_predictor:验证既不传url也不传model_path时抛出ValueError;验证基类preprocess/postprocess未实现时抛出NotImplementedError——说明它们必须由子类覆盖。test_artefact_detector:用一张真实示例图(测试 fixture 定义于 tests/conftest.py,来自 docTR v0.8.1 release 附带的artefact_dummy.jpg)跑完整推理,断言:- 结果整体为
list,每个元素为dict; - 每个 dict 含
label、confidence、box三键; box长度为 4 且坐标全部为int,confidence为float;- 该示例图上应检出 9 个人工制品;
show(block=False)可正常执行可视化。
- 结果整体为
这些断言为你集成ArtefactDetector时提供了可直接对照的输入输出契约。
八、将 ArtefactDetector 融入完整流水线
ArtefactDetector可以独立使用,也可以与 docTR 主库的检测、识别、分类预测器协同,构成更完整的文档分析管线。一个典型组合场景:
from doctr.io import DocumentFile from doctr.models import ocr_predictor from doctr.contrib.artefacts import ArtefactDetector doc = DocumentFile.from_images(["invoice.jpg"]) # 1. 主流水线:文字检测 + 识别 predictor = ocr_predictor(det_arch="db_resnet50", reco_arch="crnn_vgg16_bn", pretrained=True) result = predictor(doc) # 2. 补充能力:人工制品检测 artefact_detector = ArtefactDetector(batch_size=2, conf_threshold=0.5, iou_threshold=0.5) artefacts = artefact_detector(doc) # 3. 按需处理:例如根据二维码位置裁切 ROI 再做 OCR,或统计票据上的 Logo for img_artefacts in artefacts: for artefact in img_artefacts: if artefact["label"] == "qr_code": xmin, ymin, xmax, ymax = artefact["box"] # crop ROI 并交给 OCR 流水线 ...关于主流水线ocr_predictor的更多用法,可参考 docs/source/using_doctr/using_models.rst;contrib 模块的官方综合说明见 docs/source/using_doctr/using_contrib_modules.rst。
九、注意事项与已知限制
根据官方文档与源码,使用 contrib 模块时需留意以下几点:
- 推理引擎:contrib 模块不依赖 PyTorch 或 TensorFlow,只依赖
onnxruntime;所有 contrib 模型均以 ONNX 格式分发与加载。 - OBB 支持:当前 YOLOv8 推理暂不支持 Oriented Bounding Box(旋转框),自定义模型需导出为水平框格式。
- 动态 batch:自定义 ONNX 模型必须支持动态 batch 维度,因为基类按
batch_size动态切批。 - 首次运行下载权重:不传
model_path时会从官方 URL 下载权重(当前为 v0.8.1 的yolo_artefact-f9d66f14.onnx),请确保网络可达;之后会缓存到本地models目录。 - 阈值调优:
conf_threshold与iou_threshold分别控制召回率与重叠框抑制力度,在密集排版或低质量扫描件场景下,建议结合可视化结果微调这两个值。
结语
doctr.contrib是 docTR 为文档分析流程提供的“外围能力扩展层”,而ArtefactDetector是当前该模块中可直接上手的组件。它基于 YOLOv8 架构,开箱即可识别条形码、二维码、Logo 与照片四类人工制品,支持自定义 ONNX 模型替换,且整套调用风格与 docTR 主库保持一致。你可以从 doctr/contrib/artefacts.py 阅读其全部实现,从 tests/common/test_contrib.py 查看其行为契约,再配合本文的参数与原理说明,快速将它接入自己的文档分析管线。
- 人工智能
- 深度学习
- 计算机视觉
- OCR
【免费下载链接】doctr
docTR (Document Text Recognition) - a seamless, high-performing & accessible library for OCR-related tasks powered by Deep Learning. Ongoing development and maintenance by t2k.
相关推荐
OpenCvSharp图像识别实战:条形码与二维码检测
OpenCvSharp图像识别实战:条形码与二维码检测 引言:你还在为多码识别烦恼吗? 在现代物流、零售和移动支付场景中,条形码与二维码已成为信息传递的重要载体
计算机视觉图像处理Ember CLI Rails性能优化:从本地开发到生产环境的加速策略
Ember CLI Rails性能优化:从本地开发到生产环境的加速策略 Ember CLI Rails作为连接Ember前端与Rails后端的桥梁,其性能优化直
后端PhysicsLayout社区贡献指南:如何参与开源物理布局项目
PhysicsLayout社区贡献指南:如何参与开源物理布局项目 PhysicsLayout是一个基于JBox2D的Android物理布局库,它能让你的应用界面
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考