目录
- 1. 新建文件夹
- 2. 准备数据
- 3. 数据集的划分
- 注意1
- 注意2
- 4. 下载预训练模型
- 5. 训练文字检测模型
- 6. 训练文字识别模型
- 7. 测试
- 8. 转换为推理模型
- 9. 检测模型和识别模型推理
1. 新建文件夹
进入PPOCRLabel源码目录,在上一层目录新建文件夹train_data,在train_data中新建文件夹drivingData。
2. 准备数据
在PPOCRLabel中标注好的数据,如下图
将标注好的数据拷贝到drivingData文件夹。
3. 数据集的划分
cd到PPOCRLabel源码路径,运行划分数据集代码
python gen_ocr_train_val_test.py--trainValTestRatio6:2:2--datasetRootPath../train_data/drivingData会在train_data文件夹下出现如下文件夹
可删除drivingData文件夹。
注意1
新版本gen_ocr_train_val_test.py中,做了操作系统兼容处理,在linux下不会报错,代码如下(部分代码)
withopen(label_file_path,"r",encoding="UTF-8")aslabel_file:label_file_content=label_file.readlines()random.shuffle(label_file_content)label_record_len=len(label_file_content)forindex,label_record_infoinenumerate(label_file_content):image_relative_path,image_label=label_record_info.split("\t")image_name=os.path.basename(image_relative_path)ifflag=="det":image_path=os.path.join(data_abs_path,image_name)elifflag=="rec":image_path=os.path.join(data_abs_path,args.recImageDirName,image_name)老版本gen_ocr_train_val_test.py中,
labelFileRead=open(labelFilePath,"r",encoding="UTF-8")labelFileContent=labelFileRead.readlines()random.shuffle(labelFileContent)labelRecordLen=len(labelFileContent)forindex,labelRecordInfoinenumerate(labelFileContent):imageRelativePath=labelRecordInfo.split('\t')[0]imageLabel=labelRecordInfo.split('\t')[1]imageName=os.path.basename(imageRelativePath)ifflag=="det":imagePath=os.path.join(dataAbsPath,imageName)elifflag=="rec":imagePath=os.path.join(dataAbsPath,"{}\\{}".format(args.recImageDirName,imageName))在windows下使用以上代码,在linux下,将上面代码最后一行的“{}\{}”改为“{}/{}”。
注意2
如果是在云端(AutoDL)上进行训练,建议在云端(linux)进行上面的数据划分代码,如果在windows下划分的数据集路径为如下格式,训练要在云端,需要改路径
D:\项目\train_data\det\train\2026_6_18_11_22_25_Digital.jpg[{"transcription":"23.6","points":[[287,152],[509,152],[509,277],[287,277]],"difficult":false},{"transcription":"89","points":[[369,271],[505,271],[505,401],[369,401]],"difficult":false}]D:\项目\train_data\det\train\2026_6_16_16_25_30_Digital.jpg[{"transcription":"21.5","points":[[300,197],[480,197],[480,283],[300,283]],"difficult":false},{"transcription":"41.9","points":[[280,278],[485,278],[485,372],[280,372]],"difficult":false}]D:\项目\train_data\det\train\2026_6_17_15_29_20_Digital.jpg[{"transcription":"20.2","points":[[305,154],[507,154],[507,280],[305,280]],"difficult":false},{"transcription":"56","points":[[373,271],[502,271],[502,400],[373,400]],"difficult":false}]train.txt文件中"D:\项目\train_data\det\train"替换
/root/PaddleOCR/PaddleOCR-main/train_data/det/train/val.txt替换
/root/PaddleOCR/PaddleOCR-main/train_data/det/val/test.txt替换
/root/PaddleOCR/PaddleOCR-main/train_data/det/test/#rec文件夹也类似替换。
4. 下载预训练模型
模型列表
将下载的预训练模型放在如下文件夹下
5. 训练文字检测模型
打开如下文件
做如下修改
Global: model_name: PP-OCRv5_server_det# To use static model for inference.debug:falseuse_gpu:trueepoch_num:&epoch_num500log_smooth_window:20print_batch_step:10save_model_dir: /root/autodl-fs/output-1/PP-OCRv5_server_det save_epoch_step:10eval_batch_step: -0-200cal_metric_during_train:falsecheckpoints: pretrained_model: /root/PaddleOCR/PaddleOCR-main/pretrain_models/PP-OCRv5_server_det_pretrained.pdparams save_inference_dir: null use_visualdl:falseinfer_img: doc/imgs_en/img_10.jpg save_res_path: ./checkpoints/det_db/predicts_db.txt distributed:trueArchitecture: model_type: det algorithm: DB Transform: null Backbone: name: PPHGNetV2_B4 det: True Neck: name: LKPAN out_channels:256intracl:trueHead: name: PFHeadLocal k:50mode:"large"Loss: name: DBLoss balance_loss:truemain_loss_type: DiceLoss alpha:5beta:10ohem_ratio:3Optimizer: name: Adam beta1:0.9beta2:0.999lr: name: Cosine learning_rate:0.001#(8*8c)warmup_epoch:2regularizer: name: L2 factor: 1e-6 PostProcess: name: DBPostProcess thresh:0.3box_thresh:0.6max_candidates:1000unclip_ratio:1.5Metric: name: DetMetric main_indicator: hmean Train: dataset: name: SimpleDataSet data_dir: /root/PaddleOCR/PaddleOCR-main/train_data label_file_list: - /root/PaddleOCR/PaddleOCR-main/train_data/det/train.txt ratio_list:[1.0]transforms: - DecodeImage: img_mode: BGR channel_first:false- DetLabelEncode: null - CopyPaste: null - IaaAugment: augmenter_args: - type: Fliplr args: p:0.5- type: Affine args: rotate: --10-10- type: Resize args: size: -0.5-3- EastRandomCropData: size: -640-640max_tries:50keep_ratio:true- MakeBorderMap: 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: scale:1./255. mean: -0.485-0.456-0.406std: -0.229-0.224-0.225order: hwc - ToCHWImage: null - KeepKeys: keep_keys: - image - threshold_map - threshold_mask - shrink_map - shrink_mask loader: shuffle:truedrop_last:falsebatch_size_per_card:8num_workers:8Eval: dataset: name: SimpleDataSet data_dir: /root/PaddleOCR/PaddleOCR-main/train_data label_file_list: - /root/PaddleOCR/PaddleOCR-main/train_data/det/val.txt transforms: - DecodeImage: img_mode: BGR channel_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_tags loader: shuffle:falsedrop_last:falsebatch_size_per_card:4num_workers:8profiler_options: null
打开anaconda,激活虚拟环境,进入到PaddleOCR-Main路径下,输入下列代码开始训练:
python tools/train.py-c configs/det/PP-OCRv5/PP-OCRv5_server_det.yml6. 训练文字识别模型
做如下修改
Global: model_name: PP-OCRv5_server_rec# To use static model for inference.debug:falseuse_gpu:trueepoch_num:500log_smooth_window:20print_batch_step:10save_model_dir: /root/autodl-fs/output-1/PP-OCRv5_server_rec save_epoch_step:10eval_batch_step:[0,200]cal_metric_during_train:truecalc_epoch_interval:1pretrained_model: /root/PaddleOCR/PaddleOCR-main/pretrain_models/PP-OCRv5_server_rec_pretrained.pdparams checkpoints: save_inference_dir: use_visualdl:falseinfer_img: doc/imgs_words/ch/word_1.jpg character_dict_path: ./ppocr/utils/dict/weily.txt max_text_length:&max_text_length25infer_mode:falseuse_space_char:truedistributed:truesave_res_path: /root/autodl-fs/output/rec/predicts_ppocrv5.txt d2s_train_image_shape:[3,48,320]Optimizer: name: Adam beta1:0.9beta2:0.999lr: name: Cosine learning_rate:0.0005warmup_epoch:1regularizer: name: L2 factor:3.0e-05 Architecture: model_type: rec algorithm: SVTR_HGNet Transform: Backbone: name: PPHGNetV2_B4 text_rec: True Head: name: MultiHead head_list: - CTCHead: Neck: name: svtr dims:120depth:2hidden_dims:120kernel_size:[1,3]use_guide: True Head: fc_decay:0.00001- NRTRHead: nrtr_dim:384max_text_length: *max_text_length Loss: name: MultiLoss loss_config_list: - CTCLoss: - NRTRLoss: PostProcess: name: CTCLabelDecode Metric: name: RecMetric main_indicator: acc Train: dataset: name: MultiScaleDataSet ds_width:falsedata_dir: /root/PaddleOCR/PaddleOCR-main/train_data ext_op_transform_idx:1label_file_list: - /root/PaddleOCR/PaddleOCR-main/train_data/rec/train.txt transforms: - DecodeImage: img_mode: BGR channel_first:false- RecAug: - MultiLabelEncode: gtc_encode: NRTRLabelEncode - KeepKeys: keep_keys: - image - label_ctc - label_gtc - length - valid_ratio sampler: name: MultiScaleSampler scales:[[320,32],[320,48],[320,64]]first_bs:&bs128fix_bs:falsedivided_factor:[8,16]# w, his_training: True loader: shuffle:truebatch_size_per_card: *bs drop_last:truenum_workers:16Eval: dataset: name: SimpleDataSet data_dir: /root/PaddleOCR/PaddleOCR-main/train_data label_file_list: - /root/PaddleOCR/PaddleOCR-main/train_data/rec/val.txt transforms: - DecodeImage: img_mode: BGR channel_first:false- MultiLabelEncode: gtc_encode: NRTRLabelEncode - RecResizeImg: image_shape:[3,48,320]- KeepKeys: keep_keys: - image - label_ctc - label_gtc - length - valid_ratio loader: shuffle:falsedrop_last:falsebatch_size_per_card:128num_workers:4
weily.txt文件如下
0123456789-.输入下列代码开始训练:
python tools/train.py-c configs/rec/PP-OCRv5/PP-OCRv5_server_rec.yml7. 测试
文本检测模型测试
python tools/infer_det.py-c configs/det/PP-OCRv5/PP-OCRv5_server_det.yml-o Global.pretrained_model=./output/PP-OCRv5_det/best_accuracy.pdparams Global.infer_img="C:\Users\langr\Desktop\PaddleOCR\PaddleOCR-main\test.jpg"文本识别模型测试
python tools/infer_rec.py-c configs/rec/PP-OCRv5/PP-OCRv5_server_rec.yml-o Global.pretrained_model=./output/PP-OCRv5_rec/best_accuracy.pdparams Global.infer_img="C:\Users\langr\Desktop\PaddleOCR\PaddleOCR-main\test_crop.jpg"8. 转换为推理模型
文本检测模型
python tools/export_model.py-c"./configs/det/PP-OCRv5/PP-OCRv5_server_det.yml"-o Global.pretrained_model="./output/PP-OCRv5_server_det/best_accuracy.pdparams"Global.save_inference_dir="./inference_model/det/"文本识别模型
python tools/export_model.py-c"./configs/rec/PP-OCRv5/PP-OCRv5_server_rec.yml"-o Global.pretrained_model="./output/PP-OCRv5_server_rec/latest.pdparams"Global.save_inference_dir="./inference_model/rec/"9. 检测模型和识别模型推理
步骤8的权重放在inference_model中,测试代码如下,
frompaddleocrimportPaddleOCR,TextDetection,TextRecognition model=PaddleOCR(det_model_dir=r"/root/PaddleOCR/PaddleOCR-main/inference_model/det",rec_model_dir=r"/root/PaddleOCR/PaddleOCR-main/inference_model/rec",use_doc_orientation_classify=False,use_doc_unwarping=False,use_textline_orientation=False,text_det_unclip_ratio=1.5,text_det_limit_side_len=1580,# 1080*2text_det_limit_type='max',text_det_thresh=0.3,text_det_box_thresh=0.6)output=model.predict(r"/root/PaddleOCR/PaddleOCR-main/train_data/det/test/2026_8_6_10_44_04_Digital.jpg")forresinoutput:res.save_to_img(save_path="./output/")res.save_to_json(save_path="./output/res.json")