paddleocr安装,数据集制作,训练自己的模型,调用训练好的模型
文章目录
- 一. PaddleOCR环境安装
- 二.OCR识别
- 三.标注自己的数据集
- 四.训练自己的模型
- 训练自己的文字检测模型
PaddleOCR官网
PaddleOCR官网教程
一. PaddleOCR环境安装
cuda:cuda_11.8.0_522.06_windows
cudnn:cudnn-windows-x86_64-8.9.7.29_cuda11-archive
conda create -n paddleocr python=3.10
python -m pip install paddlepaddle-gpu==3.0.0 -i https://www.paddlepaddle.org.cn/packages/stable/cu118/
pip install paddleocr -i https://pypi.mirrors.ustc.edu.cn/simple/
pip install paddleocr -i https://pypi.mirrors.ustc.edu.cn/simple/
git clone https://github.com/PaddlePaddle/PaddleOCR.git
cd PaddleOCR
pip install -r requirements.txt -i https://pypi.mirrors.ustc.edu.cn/simple/
二.OCR识别
from paddleocr import PaddleOCR
from datetime import datetime
import cv2ocr = PaddleOCR(use_doc_orientation_classify=False, # 通过 use_doc_orientation_classify 参数指定不使用文档方向分类模型use_doc_unwarping=False, # 通过 use_doc_unwarping 参数指定不使用文本图像矫正模型use_textline_orientation=False, # 通过 use_textline_orientation 参数指定不使用文本行方向分类模型
)img = cv2.imread("example_ocr.png")
x, y, w, h = 0, 0, 600, 111 # x, y 是左上角坐标,w 和 h 是宽度和高度
roi = img[y:y+h, x:x+w] # 截取感兴趣区域
cv2.rectangle(roi, (250, 0), (385, 111), (255, 255, 255), -1) # 绘制矩形
# cv2.imshow("1", roi)
# cv2.waitKey(0)
result = ocr.predict(roi)# 定义日期和时间的格式
datetime_format = '%Y-%m-%d%H:%M:%S'# 将合并后的字符串转换为 datetime 对象
datetime_obj = datetime.strptime(result[0]["rec_texts"][0] + result[0]["rec_texts"][1], datetime_format)
formatted_date = datetime_obj.strftime("%Y%m%d_%H%M%S") # 输出格式为 "20250608_171034"
print(formatted_date)
PaddleOCR可选参数含义:
参数名 | 默认值 | 作用说明 |
---|---|---|
input / -i | 必填 | 要识别的图像、PDF 或文件夹路径 |
lang | “ch” | 指定语言模型:ch, en, fr, japan, korean, german 等 |
ocr_version | “PP-OCRv5” | 选择算法版本:PP-OCRv3 / v4 / v5 / v5_server 等 |
device | “gpu:0” | 运行设备:cpu , gpu , gpu:1 … |
use_doc_orientation_classify | False | 是否启用整图方向分类(0°/90°/180°/270°) |
use_doc_unwarping | False | 是否对弯曲/倾斜文档做展平校正 |
use_textline_orientation | False | 是否对每个文字行再做 180° 纠正 |
text_det_limit_side_len | 960 | 检测阶段图片最长边限制,大图会被等比缩放 |
text_det_limit_type | “max” | 缩放策略:max (按长边)或 min (按短边) |
text_det_thresh | 0.3 | 检测概率图二值化阈值,越大越严格 |
text_det_box_thresh | 0.6 | 检测框置信度过滤阈值 |
text_det_unclip_ratio | 1.5 | 检测框外扩比例,越大框越宽松 |
text_rec_score_thresh / drop_score | 0.5 | 识别结果置信度过滤阈值,低于该值丢弃 |
save_path | “./output” | 结果保存目录(命令行方式) |
page_num | 0 | PDF 场景下要识别的前 N 页,0 表示全部 |
use_angle_cls | False | 是否使用方向分类器(传统 cls 模型) |
det_model_dir | 内置 | 自定义检测模型路径 |
rec_model_dir | 内置 | 自定义识别模型路径 |
cls_model_dir | 内置 | 自定义方向分类模型路径 |
use_mp | False | 是否开启多进程加速(CPU 场景) |
cpu_threads | 10 | CPU 预测时的线程数 |
precision | “fp32” | 计算精度:fp32 , fp16 , int8 (TensorRT 下有效) |
ir_optim | True | 是否打开计算图优化 |
use_tensorrt | False | 是否启用 TensorRT 加速 |
benchmark | False | 是否开启 benchmark 日志统计耗时与显存 |
predict函数中可选参数的含义:
参数名 | 类型/默认值 | 作用说明 |
---|---|---|
input | Any | 要识别的原始输入,可以是图片路径、np.ndarray、PIL.Image、pdf 文件路径、甚至 http url 等。 |
use_doc_orientation_classify | bool / None | 是否启用文档方向分类(0°/90°/180°/270°)。如果为 True,会在真正 OCR 前先把整个图片旋转到正向,提高后续文字检测和识别准确率。 |
use_doc_unwarping | bool / None | 是否启用文档去畸变/展平(dewarping)。对拍摄的书页、折皱纸张、弯曲曲面等场景有效,先把曲面拉平再做 OCR。 |
use_textline_orientation | bool / None | 是否启用单行文字方向分类。有些场景里,单行文字本身可能是竖排或旋转 180°,打开后会给每一行文字再做一次方向校正。 |
text_det_limit_side_len | int / None | 检测阶段最长边限制。图片会先等比缩放,使长边 ≤ 该值;过大图片会被缩小以节省显存,过小会被放大以提高小字召回率。常见设置 960、1536、2048 等。 |
text_det_limit_type | str / None | 当长边超过 limit_side_len 时的缩放方式。常见取值: - “max”(默认)——按长边比例整体缩放; - “min” ——按短边比例整体缩放; - “none” ——不缩放。 |
text_det_thresh | float / None | 检测网络输出的概率图二值化阈值。值越大,检测框越少、越“有把握”,但容易漏检;值越小,框越多,容易引入噪声。典型 0.3~0.5。 |
text_det_box_thresh | float / None | 对检测框再做一次置信度过滤的阈值。低于该值的框会被丢弃。通常比 text_det_thresh 稍高,如 0.5~0.6。 |
text_det_unclip_ratio | float / None | 控制检测框“外扩”比例。检测网络给出的是文字区域的收缩核,需要按一定比例向外扩张才能包住完整文字。值越大,框越宽松,易粘连;值越小,框偏紧,可能切字。常用 1.5~2.0。 |
text_rec_score_thresh | float / None | 识别阶段的置信度阈值。识别模型会给每个字符一个概率,整张文字行的平均概率低于该值就会被丢弃。一般设为 0.3~0.5,想更严格就调高。 |
三.标注自己的数据集
ppocrlabel官方教程
conda create -n ppocrlabel python=3.7
conda activate ppocrlabel
pip3 install --upgrade pip
python -m pip install paddlepaddle==2.5.2 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install PPOCRLabel -i https://pypi.tuna.tsinghua.edu.cn/simple
PPOCRLabel --lang ch
数据集划分
cd ./PPOCRLabel # 将目录切换到PPOCRLabel文件夹下
python gen_ocr_train_val_test.py --trainValTestRatio 8:2:0 --datasetRootPath E:\numberplate
四.训练自己的模型
PaddleOCR算法主要包含三个部分,分别是:
- DB文本检测(detection)
- 检测框矫正(classification)
- CRNN文本识别(recognition)
在训练时,这三个模型单独进行训练,得到三个模型的训练权重,在推理预测时会把三个模型整合在一起,即PaddleOCR推理模型的最终结果是由上述三个模型串联推理而得,推理步骤大致如下:
- 第一步,进行文本检测,得到文本位置的检测框;
- 第二步,根据得到的文本检测框对其进行角度分类;
- 第三步,进行文本识别。
训练自己的文字检测模型
官网教程
-
准备数据集
数据集下载地址:icdar2015数据集,首次下载需注册。
数据集标签下载cd PaddleOCR/ wget -P ./train_data/ https://paddleocr.bj.bcebos.com/dataset/train_icdar2015_label.txt wget -P ./train_data/ https://paddleocr.bj.bcebos.com/dataset/test_icdar2015_label.txt
将下载好的图像和标签按以下路径进行存放:
/PaddleOCR/train_data/icdar2015/text_localization/└─ icdar_c4_train_imgs/ icdar数据集的训练数据└─ icdar_c4_test_imgs/ icdar数据集的测试数据└─ train_icdar2015_label.txt icdar数据集的训练标注└─ test_icdar2015_label.txt icdar数据集的测试标注
-
预训练模型下载
预训练官网模型下载地址 -
训练模型
模型训练是根据yaml文件进行各个参数的配置的,配置文件在下载的代码目录:D:\code\PaddleOCR-main\configs\det\PP-OCRv5中
其中主要修改训练数据集目录和与训练模型文件目录
开始训练的脚本代码,其中-c configs/det/PP-OCRv5/PP-OCRv5_server_det.yml这个参数指定了你的训练配置文件python tools/train.py -c configs/det/PP-OCRv5/PP-OCRv5_server_det.yml
出现以下则说明开始正常训练
配置文件参数说明:Global:model_name: PP-OCRv5_server_det # 模型标识符,指定选用那个模型debug: false # 是否开启调试模式(false表示关闭)use_gpu: true # 是否使用GPU训练/推理(true启用GPU)epoch_num: &epoch_num 500 # 总训练轮数(设为500轮)log_smooth_window: 20 # 日志平滑窗口大小(取20个batch的损失平均值)print_batch_step: 10 # 每隔多少batch打印一次日志(每10个batch打印)save_model_dir: ./output/PP-OCRv5_server_det # 模型保存目录save_epoch_step: 10 # 每隔多少轮保存一次模型eval_batch_step: # 每隔多少轮进行一次评估- 0- 1500cal_metric_during_train: false # 训练中是否实时计算指标checkpoints: # 本地预训练模型路径pretrained_model: D:\code\PaddleOCR-main\models\PP-OCRv5_server_det_pretrained.pdparams # 预训练模型下载地址(官方提供的PPHGNetV2_B4权重)save_inference_dir: null # 转换后的推理模型保存目录use_visualdl: false # 是否使用VisualDL可视化工具infer_img: doc/imgs_en/img_10.jpg # 单张测试图片路径save_res_path: ./checkpoints/det_db/predicts_db.txt # 推理结果保存路径distributed: true # 是否使用分布式训练Architecture:model_type: det # 任务类型(det表示检测任务)algorithm: DB # 核心算法(DB即Differentiable Binarization)Transform: null # 输入图像预处理(null表示无需额外变换)Backbone:name: PPHGNetV2_B4 # 主干网络(PPHGNetV2_B4,高性能CNN)det: True # 是否为检测任务定制(true)Neck:name: LKPAN # 特征融合模块(LKPAN,改进的特征金字塔)out_channels: 256 # 输出通道数(256)intracl: true # 是否使用层内连接(true)Head:name: PFHeadLocal # 检测头类型(PFHeadLocal,渐进式特征头)k: 50 # 关键点数量(50)mode: "large" # 规模模式(large表示大模型)Loss:name: DBLoss # 损失类型(DBLoss,专用于DB算法)balance_loss: true # 是否平衡正负样本损失(true启用)main_loss_type: DiceLoss # 主损失函数(DiceLoss,处理类别不平衡)alpha: 5 # 二值图损失权重(5)beta: 10 # 阈值图损失权重(10)ohem_ratio: 3 # 难例挖掘比例(3:1的负/正样本比例)Optimizer:name: Adam # 优化器类型(Adam)beta1: 0.9 # Adam动量参数(0.9/0.999)beta2: 0.999 # Adam动量参数(0.9/0.999)lr:name: Cosine # 学习率调度策略(Cosine余弦退火)learning_rate: 0.001 #(8*8c) # 初始学习率(0.001)warmup_epoch: 2 # 学习率预热轮数(2轮)regularizer:name: L2 # 正则化方法(L2权重衰减)factor: 1e-6 # 正则化系数(1e-6)PostProcess:name: DBPostProcess # 后处理方法(DBPostProcess)thresh: 0.3 # 二值化阈值(0.3)box_thresh: 0.6 # 框得分阈值(高于0.6才保留)max_candidates: 1000 # 最大候选框数量(1000)unclip_ratio: 1.5 # 框扩展比例(1.5倍)Metric:name: DetMetric # 指标计算器(DetMetric)main_indicator: hmean # 核心评估指标(hmean即F1-score)Train:dataset:name: SimpleDataSet # 数据集类型(SimpleDataSet)data_dir: D:\code\PaddleOCR-main\train_data\icdar2015\text_localization\ # 训练数据目录(ICDAR2015路径)label_file_list: # 训练标签文件路径- D:\code\PaddleOCR-main\train_data\icdar2015\text_localization\train_icdar2015_label.txtratio_list: [1.0] # 数据采样比例([1.0]表示全采样)transforms: # 数据增强流水线- DecodeImage: # 图像解码(BGR格式img_mode: BGRchannel_first: false- DetLabelEncode: null # 标签解析- CopyPaste: null # 复制粘贴增强- IaaAugment: # 多策略增强(翻转/旋转/缩放)augmenter_args:- type: Fliplrargs:p: 0.5- type: Affineargs:rotate:- -10- 10- type: Resizeargs:size:- 0.5- 3- EastRandomCropData: # 随机裁剪(640x640)size:- 640- 640max_tries: 50keep_ratio: true- MakeBorderMap: # 生成阈值图(配合DB算法)shrink_ratio: 0.4thresh_min: 0.3thresh_max: 0.7total_epoch: *epoch_num- MakeShrinkMap: # 生成二值图(文本区域收缩)shrink_ratio: 0.4min_text_size: 8total_epoch: *epoch_num- NormalizeImage: # 标准化(ImageNet均值/方差)scale: 1./255.mean:- 0.485- 0.456- 0.406std:- 0.229- 0.224- 0.225order: hwc- ToCHWImage: null # 转换张量维度(HWC → CHW)- KeepKeys: # 指定需保留的数据键keep_keys:- image- threshold_map- threshold_mask- shrink_map- shrink_maskloader:shuffle: true # 数据打乱(true)drop_last: false # 是否丢弃末尾不完整batch(false)batch_size_per_card: 8 # 单GPU batch大小(8)num_workers: 8 # 数据加载线程数(8)Eval:dataset:name: SimpleDataSetdata_dir: D:\code\PaddleOCR-main\train_data\icdar2015\text_localization\label_file_list:- D:\code\PaddleOCR-main\train_data\icdar2015\text_localization\test_icdar2015_label.txttransforms:- DecodeImage:img_mode: BGRchannel_first: false- DetLabelEncode: null- DetResizeForTest:- NormalizeImage:scale: 1./255.mean:- 0.485- 0.456- 0.406std:- 0.229- 0.224- 0.225order: hwc- ToCHWImage: null- KeepKeys:keep_keys:- image- shape- polys- ignore_tagsloader:shuffle: falsedrop_last: falsebatch_size_per_card: 1num_workers: 2 profiler_options: null # 性能分析工具选项(null表示不启用)
-
导出模型
python tools/export_model.py -c configs/det/PP-OCRv5/PP-OCRv5_server_det.yml