最好用的图文识别OCR -- PaddleOCR(4) 模型微调

模型微调

    • 一、简介
    • 二、环境配置与工具安装
      • [2.1 Clone 必要的仓库](#2.1 Clone 必要的仓库)
      • [2.2 安装 Anaconda](#2.2 安装 Anaconda)
      • [2.3 创建 PaddleOCR 环境](#2.3 创建 PaddleOCR 环境)
      • [2.4 安装 PaddleOCR 依赖](#2.4 安装 PaddleOCR 依赖)
      • [2.5 安装并启动 PPOCRLabel](#2.5 安装并启动 PPOCRLabel)
        • [2.5.1 安装 PPOCRLabel](#2.5.1 安装 PPOCRLabel)
        • [2.5.2 启动工具](#2.5.2 启动工具)
        • [2.5.3 安装过程中的报错解决](#2.5.3 安装过程中的报错解决)
    • 三、数据集准备
      • [3.1 自建数据集](#3.1 自建数据集)
      • [3.2 使用公共数据集](#3.2 使用公共数据集)
    • 四、模型训练
      • [4.1 下载预训练模型](#4.1 下载预训练模型)
      • [4.2 配置文件选择](#4.2 配置文件选择)
      • [4.3 配置项解释](#4.3 配置项解释)
      • [4.4 det 检测模型 训练](#4.4 det 检测模型 训练)
        • [4.4.1 修改配置文件](#4.4.1 修改配置文件)
        • [4.4.2 启动训练](#4.4.2 启动训练)
        • [4.4.3 模型测试](#4.4.3 模型测试)
      • [4.5 rec 识别模型 训练](#4.5 rec 识别模型 训练)
        • [4.5.1 修改配置文件](#4.5.1 修改配置文件)
        • [4.5.2 启动训练](#4.5.2 启动训练)
        • [4.5.3 模型测试](#4.5.3 模型测试)
    • 五、训练模型转换为`推理模型`
        • [5.1 检测模型 转换](#5.1 检测模型 转换)
        • [5.2 识别模型 转换](#5.2 识别模型 转换)
    • 六、推理模型的应用

一、简介

PaddleOCR 是一个两阶段的 OCR 系统,其文本检测算法采用 DB,文本识别算法采用 CRNN,并在检测和识别模块之间加入文本方向分类器,以应对不同方向文本的识别需求。本文介绍如何进行日语(或其他多语言)模型的微调,包括环境配置、数据集准备和模型训练。


二、环境配置与工具安装

2.1 Clone 必要的仓库

首先,克隆 PaddleOCR 项目及相关工具仓库:

bash 复制代码
git clone https://github.com/PaddlePaddle/PaddleOCR.git
cd PaddleOCR

git clone https://github.com/PFCCLab/PPOCRLabel.git
# 用于数据标注的工具

git clone https://github.com/PaddlePaddle/PaddleX.git
# PaddleX 是一个便捷的高层次深度学习开发工具
最终目录结构
复制代码
PaddleOCR/
├── PaddleX/
├── PPOCRLabel/
└── ...(其他文件)

2.2 安装 Anaconda

推荐使用 Anaconda 管理 Python 环境。以下为安装步骤:

  1. Anaconda 官方网站 下载适合您系统的版本。

  2. 安装后,执行以下命令更新环境变量:

    bash 复制代码
    source ~/.bash_profile
    conda --help  # 检查安装是否成功

2.3 创建 PaddleOCR 环境

使用以下命令创建独立环境:

bash 复制代码
conda create -n paddleOCR python=3.10 -y

# 进入PaddleOCR环境
conda activate paddleOCR

# 查看python版本是否正确
python --version

2.4 安装 PaddleOCR 依赖

确保 PaddlePaddle 和相关依赖已正确安装:

bash 复制代码
pip install --upgrade pip
pip install paddlepaddle==3.0.0b2 -i https://mirror.baidu.com/pypi/simple
pip install opencv-contrib-python-headless==4.4.0.46

若出现下载慢或版本问题,可切换源或安装其他版本。


2.5 安装并启动 PPOCRLabel

PPOCRLabel 是 PaddleOCR 的配套标注工具,用于生成训练数据。

2.5.1 安装 PPOCRLabel
bash 复制代码
pip install PPOCRLabel

pip install opencv-contrib-python-headless==4.2.0.32 # 如果下载过慢请添加"-i https://mirror.baidu.com/pypi/simple"
2.5.2 启动工具

根据需求启动:

  • 普通模式:

    bash 复制代码
    PPOCRLabel --lang ch
  • KIE 模式(支持关键字提取):

    bash 复制代码
    PPOCRLabel --lang ch --kie True
  • 通过Python脚本运行PPOCRLabel

    bash 复制代码
    cd ./PPOCRLabel  # 切换到PPOCRLabel目录
    python PPOCRLabel.py --lang ch
  • PPOCRLabel 启动相关主要参数(均可选):

    bash 复制代码
    --lang
    --gpu
    --kie
    --det_model_dir
    --rec_model_dir
    --rec_char_dict_path
    --cls_model_dir
    --label_font_path

启动成功后,界面如下所示:

2.5.3 安装过程中的报错解决
  1. 安装opencv-contrib-python-headless
  • 报错 ERROR: No matching distribution found for opencv-contrib-python-headless==4.2.0.32

  • 解决 :安装4.4.0.46 或者直接安装最新版

    bash 复制代码
    pip install opencv-contrib-python-headless\==4.4.0.46
    #pip install opencv-contrib-python-headless
  1. 启动PPOCRLabel报错
  • 报错:command not found: PPOCRLabel

  • 解决 :找到 PPOCRLabel 的安装路径:

    bash 复制代码
    pip show PPOCRLabel

    检查输出路径中的 site-packages,找到 PPOCRLabel 文件夹。
    进入该目录并使用PPOCRLabel.py运行:

    bash 复制代码
    cd /path/to/site-packages/PPOCRLabel
    python PPOCRLabel.py --lang ch

三、数据集准备

3.1 自建数据集

  1. PaddleOCR/train_data/ 文件夹中存放训练图片。

  2. 使用刚才启动的PPOCRLabel打开train_data目录(文件 -> 打开目录)

  3. 点击左下角的自动标注

  4. 检查每一张图片自动识别的效果,如果有错误的进行手动改正识别结果,没有识别到的地方手动进行矩形标注或多点标注,标注后点击重新识别。没问题后点击右下角的确定!!!(不然白做),修改完成的图片在左侧会变为绿色✅状态

  5. 所有图片标记和修改完成后,分别点击 文件 -> 导出标记结果文件 -> 导出识别结果

  6. PPOCRLabel会在图片所在文件夹生成相关目录和文件:

  • Cache.cache - PPOCRLabel自动标注生成的标注和识别结果格式为 (图片所在文件位置/图片名 {"transcription":"{识别出的文字}","points":\[\[识别出文字所在的四个标注定位坐标],"difficult":false}])
  • crop_img - 存放根据标注定位坐标从原图片截取的部分图片片段,用来训练文字识别模型。格式为:(图片所在文件位置/原图片名_crop_排序数字.jpg)
  • fileState.txt - 记录已手动点击确认的每张图片,记录图片的打标完成与否。 格式为: (图片所在文件位置/图片名 1)
  • Label.txt - 记录已手动点击确认的每张图片标记和识别结果,为训练文字检测模型的标签。 格式为: (图片所在文件位置/图片名 {"transcription":"{识别出的文字}","points":\[\[识别出文字所在的四个标注定位坐标],"difficult":false}])
  • rec_gt.txt - 记录 crop_img 中每张图片中的文字识别结果,训练文字识别模型的标签。 格式为: (crop_img/图片名 识别出的文字)
  1. 前往PPOCRLabel目录下执行数据分类:

    bash 复制代码
    python gen_ocr_train_val_test.py --trainValTestRatio 6:2:2 --datasetRootPath ./train_data/

    此时train_data目录下会出现det 和 rec 两个文件夹,其中det是用来训练文字检测的数据集,rec是用来训练文字识别的数据集

    到这里文字检测和文字识别的训练数据集就准备完毕!


3.2 使用公共数据集

若使用 ICDAR 等公开数据集,可按以下步骤处理:

  1. 下载数据集

    可以使用 ICDAR 2019 的 Multi-script text detection数据来训练PaddleOCR模型
    https://rrc.cvc.uab.es/?ch=15&com=downloads (登陆后下载)

  2. 用 PPOCRLabel 标注生成格式化的标注文件。

使用PPOCRLabel工具来辅助生成数据,把下载后的 Multi-script text detection 相关图片数据单独存储,并使用PPOCRLabel打开图片所在文件夹,点击自动标注等待完成,之后手动点击一个编辑后的图片点击保存。然后点击导出标记结果 & 导出识别结果

  1. 下载TrainSetGT数据并解压:

    其中 tr_img_06001.txt - tr_img_07000.txt 文件为日语图片标记识别结果(保留自己想要的识别结果部分数据文件即可)

  2. 构建训练PaddleOCR所需要的数据集格式:

python 复制代码
import os, json

train_japan_path = "/path/to/train-japan"
img_japan_path = "/path/to/img-japan"
Label_file = f"/{img_japan_path}/Label.txt"
fileState_file = f"/{img_japan_path}/fileState.txt"
rec_gt_file = f"/{img_japan_path}/rec_gt.txt"

train_files = sorted(os.listdir(train_japan_path))
img_files = sorted(os.listdir(img_japan_path))

with open(fileState_file, "w", encoding="utf-8") as fileState_f:
    with open(Label_file, "w", encoding="utf-8") as label_f:
        with open(rec_gt_file, "w", encoding="utf-8") as rec_gt_f:
            for train_file in train_files:
                img_name = train_file.split(".")[0]
                img_suffix = "jpg"
                print(f"开始处理 {img_name}.{img_suffix} 文件")
                fileState_f.write(f"img-japan/{img_name}.{img_suffix}\t1\n")
                with open(f"{train_japan_path}/{train_file}", "r", encoding="utf-8") as train_f:
                    label_content = []
                    rec_num = 0
                    for line_content in train_f:
                        parts = line_content.strip().split(",")
                        if len(parts) < 9:  # 跳过格式不完整的行
                            continue
                        # 提取坐标、语言、文字内容
                        points = [
                            [int(parts[0]), int(parts[1])],
                            [int(parts[2]), int(parts[3])],
                            [int(parts[4]), int(parts[5])],
                            [int(parts[6]), int(parts[7])]
                        ]
                        language = parts[8]
                        transcription = parts[9] if len(parts) > 9 else ""

                        # 忽略无意义的内容
                        if transcription in {"###", ""}:
                            continue
                        # print(points, language, transcription)
                        label_content_line = {
                            "transcription": transcription,
                            "points": points,
                            "difficult": False
                        }
                        label_content.append(label_content_line)
                        rec_gt_f.write(f"crop_img/{img_name}_crop_{rec_num}.{img_suffix}\t{transcription}\n")
                        rec_num += 1

                    if len(label_content) == 0:
                        continue
                    output_data = f"img-japan/{img_name}.{img_suffix}\t{json.dumps(label_content, ensure_ascii=False)}"
                    label_f.write(output_data + "\n")
                    print(f"处理 {img_name}.{img_suffix} 文件完成")
  1. 执行数据分类
    参考自建数据部分

到这里文字检测和文字识别的训练数据集就准备完毕!


四、模型训练

4.1 下载预训练模型

新建pretrain_models文件夹,在 PaddleOCR/pretrain_models 目录下下载检测与识别模型并解压。

4.2 配置文件选择

查看官网给出的每个模型所对应的配置文件,并在PaddleOCR文件夹中找到对应的配置文件:

  • det检测模型配置文件

中文检测模型这里官方给的是 configs/det/ch_PP-OCRv4/ch_PP-OCRv4_det_cml.yml

但是实际的训练过程中发现会导致训练极其的慢,并且在导出为推理模型时候会有很多Student模型和Teacher模型出现,所以这里修改为使用configs/det/ch_PP-OCRv4/ch_PP-OCRv4_det_student.yml

  • rec中文识别模型

中文识别模型这里官方给的是 configs/rec/PP-OCRv4/ch_PP-OCRv4_rec_distill.yml

但是实际的路径中并不存在该文件,所以这里修改为使用configs/rec/PP-OCRv4/ch_PP-OCRv4_rec.yml


4.3 配置项解释

  • Global
  • Optimizer
  • Architecture
  • Loss
  • PostProcess
  • Metric
  • Dataset

4.4 det 检测模型 训练

4.4.1 修改配置文件



4.4.2 启动训练
  • 进入PaddleOCR目录下执行以下命令开始训练

    bash 复制代码
    python tools/train.py -c configs/det/ch_PP-OCRv4/ch_PP-OCRv4_det_student.yml
  • 训练结束

  • 输出文件结构

4.4.3 模型测试

使用训练后的模型执行检测测试:

  • Global.pretrained_model:训练好并且需要测试的模型
  • Global.infer_img:要检测的图片路径。
bash 复制代码
python tools/infer_det.py \
-c configs/det/ch_PP-OCRv4/ch_PP-OCRv4_det_student.yml \
-o Global.pretrained_model=output/det_ppocr_v4/best_accuracy.pdparams \
Global.infer_img="./train_data/det/test/img9.jpg"
  • 测试结果:

4.5 rec 识别模型 训练

4.5.1 修改配置文件

修改参考上方的 检测模型配置,需要修改的位置差不多:


4.5.2 启动训练
  • 进入PaddleOCR目录下执行以下命令开始训练

    bash 复制代码
    python tools/train.py -c configs/rec/PP-OCRv4/ch_PP-OCRv4_rec.yml
  • 训练结束

  • 输出文件结构

4.5.3 模型测试
  • Global.pretrained_model:训练好并且需要测试的模型

  • Global.infer_img:要检测的图片路径。

    bash 复制代码
    python tools/infer_rec.py \
    -c configs/rec/PP-OCRv4/ch_PP-OCRv4_rec.yml \
    -o Global.pretrained_model=output/rec_ppocr_v4/best_accuracy.pdparams \
    Global.infer_img="./train_data/rec/test/img1_crop_2.jpg"
  • 测试结果:

五、训练模型转换为推理模型

查看模型测试后的结果,如果检测没有问题就可以把训练后的检测模型识别模型分别导出为推理模型

  • Global.pretrained_model:训练好并且需要推理的模型
  • Global.save_inference_dir:保存推理模型的位置
5.1 检测模型 转换
  • 转换命令

    bash 复制代码
    python tools/export_model.py \
    -c "./configs/det/ch_PP-OCRv4/ch_PP-OCRv4_det_student.yml" \
    -o Global.pretrained_model="./output/det_ppocr_v4/best_accuracy.pdparams" \
    Global.save_inference_dir="./inference_model/det/"
  • 转换结果

5.2 识别模型 转换
  • 转换命令

    bash 复制代码
    python tools/export_model.py \
    -c "./configs/rec/PP-OCRv4/ch_PP-OCRv4_rec.yml" \
    -o Global.pretrained_model="./output/rec_ppocr_v4/best_accuracy.pdparams" \
    Global.save_inference_dir="./inference_model/rec/"
  • 转换结果

六、推理模型的应用

python 复制代码
from paddleocr import PaddleOCR, draw_ocr
 
ocr = PaddleOCR(
		use_angle_cls=True, 
		det_model_dir='./inference_model/det',
		rec_model_dir='./inference_model/rec',
        use_gpu=False,
        lang='ch',
        show_log=False,
        )

result = ocr.ocr("./train_data/img8.jpg", cls=True)
for res in result[0]:
    print(res)

from PIL import Image
result = result[0]
image = Image.open("./train_data/img8.jpg").convert('RGB')
boxes = [line[0] for line in result]
txts = [line[1][0] for line in result]
scores = [line[1][1] for line in result]
im_show = draw_ocr(image, boxes, txts, scores, font_path='./doc/fonts/simfang.ttf')
im_show = Image.fromarray(im_show)
im_show.save('result.jpg')

后续可以将训练后的模型转为ONNX推理,加快推理速度用于工程项目中。


参考文章 : https://blog.hawkhai.com/t.htm?872cff6e

相关推荐
笨鸟先飞,勤能补拙5 小时前
AI 赋能网络安全:技术全景、成熟度评估与实战案例
人工智能·python·安全·web安全·网络安全·sqlite·github
长和信泰光伏储能6 小时前
京津冀光伏发电:绿色能源的未来之路
python·能源
浦信仿真大讲堂6 小时前
从重复操作到自动化闭环:如何让 CST 与 Python 真正协同起来
python·自动化·cst·仿真软件·达索软件
Gu Gu Study7 小时前
ScoutLoop开放域深度研究引擎(agent的初步设计想法)
人工智能·python
卷无止境8 小时前
写代码这件事,到底该讲究点什么?
后端·python
卷无止境8 小时前
循环复杂度到底在算什么,Python 代码怎么才能写得让人一看就懂
后端·python
lpfasd1238 小时前
MediaCrawler 项目深度分析
chrome·python·chrome devtools
Dxy12393102168 小时前
Python项目打包成EXE完整教程(PyInstaller实战避坑)
开发语言·python
bamb009 小时前
一个项目带你入门AI应用开发01
python
0566469 小时前
Python康复训练——常用标准库
开发语言·python·学习