在 🤗 Transformers 中使用 PP-OCRv5_mobile_det:轻量级多语言文本检测模型实战指南
【免费下载链接】transformers🤗 Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.项目地址: https://gitcode.com/GitHub_Trending/tra/transformers
导读
PP-OCRv5_mobile_det 是 PaddleOCR 团队 PP-OCRv5 检测系列中的轻量级文本检测模型,专注于高效完成简体中文、繁体中文、英文、日文等多种语言,以及手写、竖排、旋转、弯曲文本等多样化场景下的文字区域检测。本文基于 PP-OCRv5_mobile_det 官方文档 展开,结合其模块源码与测试用例,系统讲解模型架构(骨干 + 颈 + 头三段式)、在Pipeline/AutoModel下的单图与批量推理、关键配置参数与图像预处理参数的实际语义,以及如何解读检测输出。读完本文你将能够独立完成基于 PP-OCRv5_mobile_det 的文档分析、车牌识别、场景文本检测等文本检测任务的搭建与调参。
PP-OCRv5_mobile_det 于 2026-03-13 由社区贡献并合入 Hugging Face Transformers。
模型总览与定位
PP-OCRv5_mobile_det是一个面向文本检测任务的专用轻量级模型。与它同属于 PP-OCRv5_det 系列的还有服务端检测模型PP-OCRv5_server_det(参见其官方文档)。mobile 版本的核心价值在于:在保留对复杂版面、不同文字尺寸与复杂背景鲁棒性的同时,通过骨干网络瘦身与颈网络简化换取更低的参数量和计算开销,更适合移动端与边缘场景部署。
从实现上看,PP-OCRv5_mobile_det 的检测器输出的是二值文本分割概率图(每个像素属于文本区域/背景),再由图像处理器通过轮廓分析转换为可读的文本框。因此它在 Transformers 中注册的任务类型是object-detection,但产物与常规 anchor / query 式检测器不同——其类别是单一的,即id2label = {0: "text"}(见 configuration_pp_ocrv5_mobile_det.py)。
模型架构:Backbone + Neck + Head
PP-OCRv5_mobile_det 采用经典的检测三段式结构。源码组织上,其定义在 modeling_pp_ocrv5_mobile_det.py(由 modular_pp_ocrv5_mobile_det.py 自动生成,改动需在 modular 文件中进行)。模块文档对其架构的核心描述如下:
- 通过
PPOCRV5MobileDetModel(Backbone + Neck + Head 组成的核心类)生成面向文本检测任务的二值文本分割图; - 支持复杂版面、多样文字尺寸与困难背景;
- 覆盖手写、竖排、旋转、弯曲文本等多样式文本;适用语言包括简体中文、繁体中文、英文、日文;
- 应用场景涵盖文档分析(document analysis)、车牌识别(license plate recognition)与场景文本检测(scene text detection)。
骨干网络:PP-LCNet_v3
骨干(Backbone)通过通用load_backbone机制加载。在配置初始化阶段(见 configuration_pp_ocrv5_mobile_det.py),若不显式传入backbone_config,将默认采用pp_lcnet_v3(详见 PP-LCNet_v3 文档),并附带如下默认参数:
default_config_kwargs = { "scale": 0.75, # 通道缩放系数,取值 0.75 进一步压缩通道 "out_features": ["stage2", "stage3", "stage4", "stage5"], # 取 4 个阶段特征 "out_indices": [2, 3, 4, 5], # 对应骨干输出索引 "divisor": 16, # 通道数对齐到 16 的整数倍 }骨干后接一组 1×1 卷积把各阶段输出通道映射到layer_list_out_channels指定的通道数(见 modeling_pp_ocrv5_mobile_det.py),随后送入 Neck。scale=0.75的 PP-LCNet_v3 即是"mobile(移动端)"属性的来源。
颈网络:残差 Squeeze-and-Excitation 特征融合
Neck 负责多尺度特征融合,实现在PPOCRV5MobileDetNeck(见 modeling_pp_ocrv5_mobile_det.py)。其关键设计是Residual Squeeze-and-Excitation (RSE) Layer:
- 插入层(insert_conv):对 backbone 各阶段特征用 1×1 RSE 层统一到
neck_out_channels通道; - 自顶向下融合:按
p4→p3→p2顺序将相邻尺度特征上采样相加(上采样模式由interpolate_mode控制); - 输入层(input_conv):对融合后的特征再做 3×3 RSE 层(输出
neck_out_channels // 4通道); - 重采样拼接:按
[1, 2, 4, 8]的放大系数将四路特征统一到最大分辨率后torch.cat拼接,作为 Head 的输入。
其中 SE 模块(PPOCRV5MobileDetSqueezeExcitationModule)实现了通道注意力重标定:全局平均池化后经两次 1×1 卷积降维/升维,并执行torch.clamp(0.2 * hidden_states + 0.5, min=0.0, max=1.0)的钳位激活以稳定训练(见 modeling_pp_ocrv5_mobile_det.py)。
检测头:轻量分割头
PPOCRV5MobileDetHead继承自服务端模型的分割头基类PPOCRV5ServerDetSegmentationHead,覆盖其forward(见 modeling_pp_ocrv5_mobile_det.py):
def forward(self, hidden_states: torch.Tensor) -> tuple[torch.Tensor, torch.Tensor]: hidden_states = self.conv_down(hidden_states) # kernel_list[0] 卷积降通道 hidden_states = self.conv_up(hidden_states) # kernel_list[1] 转置卷积上采样 hidden_states = self.conv_final(hidden_states) # kernel_list[2] 输出单通道 hidden_states = torch.sigmoid(hidden_states) return hidden_states与 ServerDet 相比,MobileDet不返回残差特征(不进行 Progressive Fusion Head 的本地精修),直接输出 sigmoid 概率图,计算更省。
与 ServerDet 的代码复用关系
为了最大化复用,mobile 版本在其 modular 模块中直接继承了服务端模块的若干组件:
| 组件 | 来源 | 说明 |
|---|---|---|
PPOCRV5MobileDetPreTrainedModel | PPOCRV5ServerDetPreTrainedModel(见 modeling_pp_ocrv5_mobile_det.py) | 预训练基类,main_input_name = "pixel_values" |
PPOCRV5MobileDetForObjectDetection | PPOCRV5ServerDetForObjectDetection(见 modeling_pp_ocrv5_mobile_det.py) | 目标检测头包装,输出兼容 Transformers 检测 API |
| 图像处理器 | PPOCRV5ServerDetImageProcessor | 无独立 mobile 图像处理器,直接复用 server 版本(见 image_processing_pp_ocrv5_server_det.py) |
因此模型在前向计算时,PPOCRV5MobileDetForObjectDetection会依次完成"骨干提特征 → Neck 融合 → Head 输出 logits",最终返回与检测 API 兼容的输出。
快速上手:单张图片推理
官方文档给出两条等效路径:Pipeline一行式调用,或AutoModel底层化调用。两者使用同一检查点:
PaddlePaddle/PP-OCRv5_mobile_det_safetensors官方示例采用的测试图片来自 PaddleOCR 生态公开示例图general_ocr_001.png,为一张含多行文字的通用 OCR 图片。本仓库集成测试亦使用该图(见 test_modeling_pp_ocrv5_mobile_det.py)。
方式一:Pipeline
import requests from PIL import Image from transformers import pipeline image = Image.open( requests.get( "https://paddle-model-ecology.bj.bcebos.com/paddlex/imgs/demo_image/general_ocr_001.png", stream=True ).raw) detector = pipeline( task="object-detection", model="PaddlePaddle/PP-OCRV5_mobile_det_safetensors", device_map="auto", ) results = detector(image) for result in results: print(result)要点说明:
device_map="auto"会自动把模型分配到可用设备(GPU / CPU / MPS);- Pipeline 依赖检测类别为单一
text的配置(id2label = {0: "text"}),因此无需手工传标签映射; - 输出
results中每个元素是一个字典,含boxes、scores、labels字段(详见下文"输出解读")。
方式二:AutoModel 底层调用
import requests from PIL import Image from transformers import AutoImageProcessor, AutoModelForObjectDetection model_path = "PaddlePaddle/PP-OCRv5_mobile_det_safetensors" model = AutoModelForObjectDetection.from_pretrained(model_path, device_map="auto") image_processor = AutoImageProcessor.from_pretrained(model_path) image = Image.open(requests.get("https://paddle-model-ecology.bj.bcebos.com/paddlex/imgs/demo_image/general_ocr_001.png", stream=True).raw).convert("RGB") inputs = image_processor(images=image, return_tensors="pt").to(model.device) outputs = model(**inputs) results = image_processor.post_process_object_detection(outputs, target_sizes=inputs["target_sizes"]) for result in results: print(result["boxes"]) print(result["scores"])这条路径揭示了完整的数据流:
AutoImageProcessor完成缩放、归一化、BGR→RGB 通道重排,输出pixel_values与原始尺寸target_sizes;- 模型以
pixel_values为唯一必填输入(forward签名即为pixel_values,由测试test_forward_signature校验,见 test_modeling_pp_ocrv5_mobile_det.py); - 由于该模型不直接回归边界框,必须调用
image_processor.post_process_object_detection(...)完成概率图后处理,才会产出boxes/scores。
Auto 机制注册点:
PPOCRV5MobileDetConfig注册于 auto_mappings.py 的CONFIG_MAPPING_NAMES(键"pp_ocrv5_mobile_det"),PPOCRV5MobileDetForObjectDetection注册于 modeling_auto.py 的MODEL_FOR_OBJECT_DETECTION_MAPPING_NAMES,故两个 Auto 类均可自动路由。
批量推理(Batched Inference)
模型天然支持将多张图片组成 batch 一次前向。官方文档提供了把同一张图重复两次构成 batch 的示例,展示了在代码上将列表传入的两种等价姿势。
方式一:Pipeline 批量
import requests from PIL import Image from transformers import pipeline image = Image.open( requests.get( "https://paddle-model-ecology.bj.bcebos.com/paddlex/imgs/demo_image/general_ocr_001.png", stream=True ).raw) detector = pipeline( task="object-detection", model="PaddlePaddle/PP-OCRV5_mobile_det_safetensors", device_map="auto", ) results = detector([image, image]) for result in results: print(result)传入列表[image, image]后,results是长度为 2 的列表,每个元素对应一张图的检测结果。
方式二:AutoModel 批量
import requests from PIL import Image from transformers import AutoImageProcessor, AutoModelForObjectDetection model_path = "PaddlePaddle/PP-OCRv5_mobile_det_safetensors" model = AutoModelForObjectDetection.from_pretrained(model_path, device_map="auto") image_processor = AutoImageProcessor.from_pretrained(model_path) image = Image.open(requests.get("https://paddle-model-ecology.bj.bcebos.com/paddlex/imgs/demo_image/general_ocr_001.png", stream=True).raw).convert("RGB") inputs = image_processor(images=[image, image], return_tensors="pt").to(model.device) outputs = model(**inputs) results = image_processor.post_process_object_detection(outputs, target_sizes=inputs["target_sizes"]) for result in results: print(result["boxes"]) print(result["scores"])批量处理的底层细节
为支持不同尺寸图片混合批处理,图像处理器实现了"按原始形状分组"的两阶段策略(见 image_processing_pp_ocrv5_server_det.py):
- 先按原始图片尺寸
group_images_by_shape分组,每组取一张代表图计算缩放目标尺寸并整组 resize,记录"原始尺寸 → 目标尺寸"映射; - resize 完成后再次按形状分组做 rescale/normalize 与 BGR→RGB 通道重排;
- 各图最终统一为 32 的整数倍边长(
round(h/32)*32,最小 32),以保证 backbone 下采样对齐; target_sizes中保存每张图的原始尺寸(预处理前),供后处理把检测框坐标映射回原图坐标。
因此即使你的批内图片长宽比不同,框架也能自动对齐并正确处理坐标还原;测试中batch_size=3、image_size=128的标准用例亦验证了 batch 前向的正确性(见 test_modeling_pp_ocrv5_mobile_det.py)。
配置参数详解
PPOCRV5MobileDetConfig的全部可调参数及官方默认值如下表(默认值与字段声明见 configuration_pp_ocrv5_mobile_det.py):
| 参数 | 类型 | 默认值 | 含义与影响 |
|---|---|---|---|
reduction | int | 4 | 特征通道维度的压缩因子。用于减少模型参数与计算量,同时保持特征表达能力(决定 SE 模块中间通道in_channels // reduction)。 |
neck_out_channels | int | 96 | Neck 输出通道数。Neck 负责在送入 Head 前完成特征融合与精炼。 |
interpolate_mode | str | "nearest" | Neck 中特征图上/下采样的插值方式。支持"nearest"(最近邻)与"bilinear"(双线性)。 |
kernel_list | List[int] | [3, 2, 2] | Head 中卷积层的 kernel 尺寸列表,用于多尺度特征提取以检测不同大小的文本区域(对应 conv_down / conv_up / conv_final 三个卷积核)。 |
layer_list_out_channels | List[int] | [12, 18, 42, 360] | backbone 各阶段对应的输出通道列表,用于配置 Neck 中 RSE 层的输入通道,实现多尺度特征融合。 |
backbone_config | dict/PreTrainedConfig/None | None(缺省时构造 PP-LCNet_v3) | 骨干网络配置。作为子配置由AutoConfig解析,支持任意模型类型。 |
id2label | dict | {0: "text"}(缺省时) | 类别标签映射。为兼容 object-detection pipeline,未显式指定时强制为单一text类(见 configuration_pp_ocrv5_mobile_det.py)。 |
backbone_config 子配置示例
测试套件展示了如何显式构造 backbone 子配置来控制各 stage 结构(见 test_modeling_pp_ocrv5_mobile_det.py):
backbone_config = { "model_type": "pp_lcnet_v3", "scale": 1, # 测试中放大到 1.0 "out_features": ["stage2", "stage3", "stage4", "stage5"], "out_indices": [2, 3, 4, 5], "divisor": 16, "block_configs": [ # 逐阶段定义卷积块 [kernel, in, out, stride, use_se] [[3, 16, 32, 1, False]], [[3, 32, 32, 2, False], [3, 32, 32, 1, False]], [[3, 32, 32, 2, False], [3, 32, 32, 1, False]], [[3, 32, 32, 2, False], [5, 32, 32, 1, False], [5, 32, 32, 1, False], [5, 32, 32, 1, False], [5, 32, 32, 1, False]], [[5, 32, 32, 2, True], [5, 32, 32, 1, True], [5, 32, 32, 1, False], [5, 32, 32, 1, False]], ], } config = PPOCRV5MobileDetConfig( backbone_config=backbone_config, reduction=4, hidden_act="hardswish", layer_list_out_channels=[12, 24, 42, 360], neck_out_channels=96, kernel_list=[3, 2, 2], interpolate_mode="nearest", )手工构造PPOCRV5MobileDetConfig后可将其传给PPOCRV5MobileDetForObjectDetection(config=config)进行随机权重初始化与快速验证,不需要任何预训练权重下载。
图像预处理与后处理参数
模型的输入输出行为高度依赖复用自 ServerDet 的图像处理器(见 image_processing_pp_ocrv5_server_det.py),其预处理器默认常量如下:
| 参数 | 默认值 | 说明 |
|---|---|---|
resample | 2(双线性) | 缩放插值方式 |
image_mean/image_std | [0.406, 0.456, 0.485]/[0.225, 0.224, 0.229] | 归一化均值/方差(PaddleOCR 风格统计值) |
size | {"height": 960, "width": 960} | 目标尺寸参考 |
do_resize/do_rescale/do_normalize | True | 默认开启缩放、反标准化、归一化 |
limit_side_len | 960 | 边长限制值(最大/最小边长目标) |
limit_type | "max" | 缩放策略:"max"(长边超 960 才缩小)、"min"、"resize_long" |
max_side_limit | 4000 | 允许的最大边长(防止超长图被放得过大) |
缩放逻辑由get_image_size实现(见 image_processing_pp_ocrv5_server_det.py):
limit_type="max":仅当max(h, w) > limit_side_len时按limit_side_len / max(h, w)比例缩小,否则不缩放;limit_type="min":仅当短边小于limit_side_len时放大;limit_type="resize_long":无论长短,长边固定缩放到limit_side_len;- 计算后若仍超
max_side_limit再次等比压缩; - 最后长宽取整到32 的整数倍(
max(round(h/32)*32, 32)),并输出SizeDict目标尺寸与原始尺寸张量。
post_process_object_detection 关键参数
后处理将 sigmoid 概率图(形状(batch, 1, H, W))二值化后提取文本框,签名如下(见 image_processing_pp_ocrv5_server_det.py):
post_process_object_detection( predictions, threshold: float = 0.3, target_sizes=None, box_threshold: float = 0.6, max_candidates: int = 1000, min_size: int = 3, unclip_ratio: float = 1.5, )| 参数 | 默认值 | 作用 |
|---|---|---|
threshold | 0.3 | 概率图二值化阈值,高于则判为文本像素 |
box_threshold | 0.6 | 候选框置信度过滤阈值(框内像素平均概率低于则丢弃) |
max_candidates | 1000 | 最多处理的轮廓(candidate)数量 |
min_size | 3 | 检测框短边最小长度过滤 |
unclip_ratio | 1.5 | 文本框外扩比例(先缩小再放大可去除粘连边缘,再按比例还原文本区域) |
从源码看,后处理管线为:二值化 mask →cv2.findContours找轮廓 →_get_mini_boxes计算最小外接矩形 →_get_box_score计算框内平均置信度 →_unclip依据area * unclip_ratio / perimeter外扩还原 → 坐标映射回原图(见 image_processing_pp_ocrv5_server_det.py)。由于轮廓本身可能为旋转四边形,cv2.minAreaRect保证了竖排/旋转文本也能得到紧凑的轴对齐或旋转框。
输出结构解读
无论走 Pipeline 还是 AutoModel + 后处理,最终检测结果的每个元素都是一个字典:
boxes:形状(N, 4),角点格式(xmin, ymin, xmax, ymax),坐标已映射回原始图像尺寸,单位像素,数据类型为int16(见 image_processing_pp_ocrv5_server_det.py);scores:形状(N,)的 float32 张量,为每个框的置信度(框内像素平均概率);labels:形状(N,)的 long 张量,由于模型只检测文本,恒为类别0(text)。
集成测试佐证
仓库集成测试对预训练 checkpoint 在general_ocr_001.png上的真实输出做了数值校验(见 test_modeling_pp_ocrv5_mobile_det.py),可作为对模型行为的客观参考:
- 输出 logits(概率图)形状为
(1, H//3, W, ...)对应的单通道分割图; - 共检出 4 个文本区域,其轴对齐盒的 4 角点落在原图 408–587 像素纵区间,例如
[[76, 550], [451, 539], [452, 576], [77, 587]]; - 置信度约在
[0.8170, 0.8746]区间(如[0.8363, 0.8170, 0.8746, 0.8694])。
集成测试还覆盖了float32/float16/bfloat16三种精度的加速器推理(见 test_modeling_pp_ocrv5_mobile_det.py),说明该模型支持半精度混合精度部署以降低显存占用。
调参与实践建议
结合配置与后处理参数的源码语义,给出如下实操建议(均为基于本文档与源码结构的推断,可结合你的数据集验证):
- 文本过密或长文本漏检:适当调低
threshold(如 0.2)可提高召回,同时注意提高box_threshold过滤噪声框; - 检测框偏小、文本边缘被截断:增大
unclip_ratio(如 1.8~2.0)让外扩还原更充分; - 小字文本:增大预处理
limit_side_len(如 1280)并保持limit_type="max",让模型看到更高分辨率;max_side_limit可相应调大; - 追求速度(移动端/边缘):
interpolate_mode="nearest"比"bilinear"更快;保持scale=0.75的 PP-LCNet_v3 骨干即为轻量取向,若进一步调参可降低neck_out_channels; - 纯 CPU / 半精度:可使用
device_map="auto"自动分配,或显式.to("cuda").half()(参考测试中float16用例)。
完整类参考
PPOCRV5MobileDetForObjectDetection:面向文本检测任务的目标检测模型类,返回兼容 Transformers 检测 API 的输出;PPOCRV5MobileDetConfig:模型结构配置类,用于控制骨干、颈、头各模块的超参数;PPOCRV5MobileDetModel:由 Backbone、Neck、Head 组成并生成二值文本分割图的核心模型类。
三者构成完成 PP-OCRv5_mobile_det 推理的全部 Python 入口。若需要读取识别(文本内容)而非仅检测位置,可进一步查阅同一系列的 PP-OCRv5_mobile_rec 文档,与本文检测模型组合为完整的"检测 + 识别"OCR 流水线。
【免费下载链接】transformers🤗 Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.项目地址: https://gitcode.com/GitHub_Trending/tra/transformers
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考