<think>我们已知用户需要一段利用PaddleOCR训练图像识别的代码示例。根据之前提供的训练步骤,这里重点给出文本识别(Recognition)模型的训练代码示例,因为用户特别提到“图像识别训练”,在OCR上下文中通常指文本识别部分。
注意:完整的OCR训练包括文本检测(Detection)和文本识别(Recognition)两个步骤,但用户可能更关注识别部分。以下代码示例将展示如何准备数据、配置模型和启动训练。
步骤:
1. 准备数据集:按照PaddleOCR要求的格式组织图像和标注文件。
2. 修改配置文件:选择或创建适合的配置文件(如rec_chinese_lite_train.yml)。
3. 启动训练:使用PaddleOCR提供的训练脚本。
由于训练代码通常通过命令行调用,我们将提供命令行示例和必要的Python代码示例(如自定义数据集读取等)。
此外,根据引用[1],PaddleOCR支持多语言场景,我们将以中英文识别为例。
注意:以下代码示例假设已经安装PaddleOCR和PaddlePaddle。
</think>以下是一个利用PaddleOCR训练文本识别模型的完整代码示例,结合了数据准备、模型配置、训练和评估的全流程:
### 1. 环境安装与准备
```bash
# 安装PaddlePaddle和PaddleOCR
pip install paddlepaddle-gpu==2.5.1 postcard paddleocr==2.7.0.2
```
### 2. 数据准备脚本
```python
import os
import shutil
from paddleocr.ppocr.utils.utility import initial_logger
logger = initial_logger()
# 创建数据集目录结构
def prepare_dataset(raw_dir, output_dir):
os.makedirs(f"{output_dir}/train", exist_ok=True)
os.makedirs(f"{output_dir}/val", exist_ok=True)
# 生成标注文件(示例)
with open(f"{output_dir}/train/train_label.txt", "w") as f_train, \
open(f"{output_dir}/val/val_label.txt", "w") as f_val:
for i, img_name in enumerate(os.listdir(raw_dir)):
if img_name.endswith(('.jpg', '.png')):
# 实际应用中应替换为真实标签
label = "TEXT" + str(i).zfill(3)
# 80%作为训练集
if i % 5 != 0:
shutil.copy(f"{raw_dir}/{img_name}", f"{output_dir}/train/{img_name}")
f_train.write(f"train/{img_name}\t{label}\n")
# 20%作为验证集
else:
shutil.copy(f"{raw_dir}/{img_name}", f"{output_dir}/val/{img_name}")
f_val.write(f"val/{img_name}\t{label}\n")
logger.info(f"数据集准备完成,共处理 {i+1} 张图片")
# 调用示例
prepare_dataset("/path/to/raw_images", "/dataset/ocr_data")
```
### 3. 训练配置与执行
```python
# train_rec.py
import paddle
from paddleocr import PPOCRModelTrainer
import os
# 设置运行设备
paddle.set_device('gpu') # 或 'cpu'
# 文本识别训练配置
model_type = "ch_PP-OCRv4_rec" # 最新轻量级模型[^1]
config = {
"Global": {
"pretrained_model": None, # 可替换为预训练模型路径
"epoch_num": 100,
"log_smooth_window": 20,
"print_batch_step": 10,
"save_model_dir": "./output/rec_model",
"save_epoch_step": 5,
"eval_batch_step": [0, 1000],
"cal_metric_during_train": True,
"character_dict_path": "ppocr/utils/ppocr_keys_v1.txt",
"max_text_length": 25,
"infer_mode": False,
"use_space_char": True
},
"Optimizer": {
"name": "Adam",
"beta1": 0.9,
"beta2": 0.999,
"lr": {
"name": "Cosine",
"learning_rate": 0.001,
"warmup_epoch": 5
},
"regularizer": {
"name": "L2",
"factor": 0.00001
}
},
"Train": {
"dataset": {
"name": "SimpleDataSet",
"data_dir": "/dataset/ocr_data",
"label_file_list": ["./dataset/ocr_data/train/train_label.txt"],
"transforms": [
{"DecodeImage": {"img_mode": "BGR", "channel_first": False}},
{"RecResizeImg": {"image_shape": [3, 48, 320]}},
{"KeepKeys": {"keep_keys": ["image", "label"]}}
],
"batch_size": 64,
"shuffle": True
},
"loader": {
"num_workers": 8,
"use_shared_memory": True
}
},
"Eval": {
"dataset": {
"name": "SimpleDataSet",
"data_dir": "/dataset/ocr_data",
"label_file_list": ["./dataset/ocr_data/val/val_label.txt"],
"transforms": [
{"DecodeImage": {"img_mode": "BGR", "channel_first": False}},
{"RecResizeImg": {"image_shape": [3, 48, 320]}},
{"KeepKeys": {"keep_keys": ["image", "label"]}}
],
"batch_size": 64
},
"loader": {
"num_workers": 4
}
}
}
# 初始化训练器并开始训练
trainer = PPOCRModelTrainer(config, model_type)
trainer.train()
```
### 4. 模型评估与推理
```python
# eval_and_infer.py
from paddleocr import PaddleOCR, draw_ocr
from PIL import Image
# 1. 加载训练好的模型
ocr = PaddleOCR(
rec_model_dir='./output/rec_model/best_accuracy',
use_angle_cls=True,
lang='ch'
)
# 2. 评估模型性能
eval_results = trainer.eval()
print(f"模型准确率: {eval_results['acc']:.2%}")
# 3. 单图推理示例
result = ocr.ocr('test_image.jpg', cls=True)
image = Image.open('test_image.jpg').convert('RGB')
boxes = [line[0] for line in result[0]]
txts = [line[1][0] for line in result[0]]
scores = [line[1][1] for line in result[0]]
# 可视化结果
im_show = draw_ocr(image, boxes, txts, scores)
im_show = Image.fromarray(im_show)
im_show.save('result.jpg')
```
### 关键参数说明
1. **模型选择**:
- `ch_PP-OCRv4_rec`:最新轻量级识别模型,平衡精度与速度[^1]
- `ch_ppocr_server_v2.0_rec`:高精度服务器版模型
2. **训练优化**:
- **学习率调度**:余弦退火(Cosine)配合5轮预热
$$ \eta_t = \eta_{min} + \frac{1}{2}(\eta_{max} - \eta_{min})(1 + \cos(\frac{T_{cur}}{T_{max}}\pi)) $$
- **数据增强**:`RecResizeImg`自动调整输入尺寸
3. **部署优化**:
```bash
# 模型导出为推理格式
paddleocr --rec_model_dir output/rec_model/best_accuracy \
--output inference/rec_model \
--rec_image_shape 3,48,320
```
> **注意**:实际使用时需调整以下参数:
> - 数据路径(`data_dir`)
> - 字符字典路径(`character_dict_path`)
> - 输入图像尺寸(`image_shape`)
> - 批量大小(`batch_size`)根据显存调整