最好用的图文识别OCR -- PaddleOCR(4) 模型微调
一、简介
PaddleOCR 是一个两阶段的 OCR 系统,其文本检测算法采用 DB,文本识别算法采用 CRNN,并在检测和识别模块之间加入文本方向分类器,以应对不同方向文本的识别需求。本文介绍如何进行日语(或其他多语言)模型的微调,包括环境配置、数据集准备和模型训练。
二、环境配置与工具安装
2.1 Clone 必要的仓库
首先,克隆 PaddleOCR 项目及相关工具仓库:
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 环境。以下为安装步骤:
-
从 Anaconda 官方网站 下载适合您系统的版本。
-
安装后,执行以下命令更新环境变量:
source ~/.bash_profile conda --help # 检查安装是否成功
2.3 创建 PaddleOCR 环境
使用以下命令创建独立环境:
conda create -n paddleOCR python=3.10 -y
# 进入PaddleOCR环境
conda activate paddleOCR
# 查看python版本是否正确
python --version
2.4 安装 PaddleOCR 依赖
确保 PaddlePaddle 和相关依赖已正确安装:
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
pip install PPOCRLabel
pip install opencv-contrib-python-headless==4.2.0.32 # 如果下载过慢请添加"-i https://mirror.baidu.com/pypi/simple"
2.5.2 启动工具
根据需求启动:
-
普通模式:
PPOCRLabel --lang ch
-
KIE 模式(支持关键字提取):
PPOCRLabel --lang ch --kie True
-
通过Python脚本运行PPOCRLabel
cd ./PPOCRLabel # 切换到PPOCRLabel目录 python PPOCRLabel.py --lang ch
-
PPOCRLabel 启动相关主要参数(均可选):
--lang --gpu --kie --det_model_dir --rec_model_dir --rec_char_dict_path --cls_model_dir --label_font_path
启动成功后,界面如下所示:
2.5.3 安装过程中的报错解决
- 安装opencv-contrib-python-headless
- 报错
ERROR: No matching distribution found for opencv-contrib-python-headless==4.2.0.32
- 解决:安装4.4.0.46 或者直接安装最新版
pip install opencv-contrib-python-headless\==4.4.0.46 #pip install opencv-contrib-python-headless
- 启动
PPOCRLabel
报错
- 报错:command not found: PPOCRLabel
- 解决:找到 PPOCRLabel 的安装路径:
检查输出路径中的 site-packages,找到 PPOCRLabel 文件夹。pip show PPOCRLabel
进入该目录并使用PPOCRLabel.py
运行:cd /path/to/site-packages/PPOCRLabel python PPOCRLabel.py --lang ch
三、数据集准备
3.1 自建数据集
-
在
PaddleOCR/train_data/
文件夹中存放训练图片。
-
使用刚才启动的
PPOCRLabel
打开train_data
目录(文件 -> 打开目录)
-
点击左下角的自动标注
-
检查每一张图片自动识别的效果,如果有错误的进行手动改正识别结果,没有识别到的地方手动进行矩形标注或多点标注,标注后点击重新识别。没问题后点击右下角的确定!!!(不然白做),修改完成的图片在左侧会变为绿色✅状态
-
所有图片标记和修改完成后,分别点击
文件 -> 导出标记结果
和文件 -> 导出识别结果
-
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/图片名 识别出的文字)
- 前往PPOCRLabel目录下执行数据分类:
此时train_data目录下会出现det 和 rec 两个文件夹,其中det是用来训练文字检测的数据集,rec是用来训练文字识别的数据集python gen_ocr_train_val_test.py --trainValTestRatio 6:2:2 --datasetRootPath ./train_data/
到这里文字检测和文字识别的训练数据集就准备完毕!
3.2 使用公共数据集
若使用 ICDAR 等公开数据集,可按以下步骤处理:
-
下载数据集
可以使用 ICDAR 2019 的 Multi-script text detection数据来训练PaddleOCR模型
https://rrc.cvc.uab.es/?ch=15&com=downloads (登陆后下载)
-
用 PPOCRLabel 标注生成格式化的标注文件。
使用PPOCRLabel工具来辅助生成数据,把下载后的 Multi-script text detection 相关图片数据单独存储,并使用PPOCRLabel打开图片所在文件夹,点击自动标注等待完成,之后手动点击一个编辑后的图片点击保存。然后点击导出标记结果 & 导出识别结果
-
下载TrainSetGT数据并解压:
其中 tr_img_06001.txt - tr_img_07000.txt 文件为日语图片标记识别结果(保留自己想要的识别结果部分数据文件即可) -
构建训练PaddleOCR所需要的数据集格式:
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} 文件完成")
- 执行数据分类
参考自建数据部分
到这里文字检测和文字识别的训练数据集就准备完毕!
四、模型训练
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目录下执行以下命令开始训练
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:要检测的图片路径。
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目录下执行以下命令开始训练
python tools/train.py -c configs/rec/PP-OCRv4/ch_PP-OCRv4_rec.yml
- 训练结束
- 输出文件结构
4.5.3 模型测试
-
Global.pretrained_model:训练好并且需要测试的模型
-
Global.infer_img:要检测的图片路径。
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 检测模型 转换
- 转换命令
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 识别模型 转换
- 转换命令
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/"
- 转换结果
六、推理模型的应用
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
原文地址:https://blog.csdn.net/qq_36228377/article/details/144910901
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!