数据集:/PaddleOCR/doc/doc_ch/datasets.md
数据合成工具:/PaddleOCR/doc/doc_ch/data_synthesis.md
文字识别训练:/PaddleOCR/doc/doc_ch/recognition.md
暂时没有自己的数据,只能用开源数据练手。
根据recognition.md中的说明一步一步地操作,一般训练都是在Linux下操作的,我是在win10下训练的,所以原文档可能有些对我不太适合,可能原文档也有些错误。
1、下载数据
icdar15用于识别的数据集已经下载不到,可以从我的百度网盘下载:链接:https://pan.baidu.com/s/1c_8qzXPeJ6WMd30PaHx8LA
提取码:s1wk
其中的图片虽然后缀是.jpg其实是png文件,需要自己用脚本修改后缀为png。
脚本如下:
ren *.jpg *.png
比如起个名字叫rename.bat,放到图片文件夹下,双击执行,就会将.jpg后缀的文件重命名为.png后缀的文件。
PaddleOCR 提供了一份用于训练 icdar2015 数据集的标签文件,通过以下方式下载:
# 训练集标签
wget -P ./train_data/ic15_data https://paddleocr.bj.bcebos.com/dataset/rec_gt_train.txt
# 测试集标签
wget -P ./train_data/ic15_data https://paddleocr.bj.bcebos.com/dataset/rec_gt_test.txt
最终训练集应有如下文件结构:
|-train_data
|-ic15_data
|- rec_gt_train.txt
|- train
|- word_001.png
|- word_002.png
|- word_003.png
| ...
同训练集类似,测试集也需要提供一个包含所有图片的文件夹(test)和一个rec_gt_test.txt,测试集的结构如下所示:
|-train_data
|-ic15_data
|- rec_gt_test.txt
|- test
|- word_001.png
|- word_002.png
|- word_003.png
| ...
2、启动训练
PaddleOCR提供了训练脚本、评估脚本和预测脚本,本节将以 CRNN 识别模型为例:
首先下载pretrain model,您可以下载训练好的模型在 icdar2015 数据上进行finetune
cd PaddleOCR/
# 下载MobileNetV3的预训练模型
wget -P ./pretrain_models/ https://paddleocr.bj.bcebos.com/dygraph_v2.0/en/rec_mv3_none_bilstm_ctc_v2.0_train.tar
# 解压模型参数
cd pretrain_models
tar -xf rec_mv3_none_bilstm_ctc_v2.0_train.tar && rm -rf rec_mv3_none_bilstm_ctc_v2.0_train.tar
开始训练:
如果您安装的是cpu版本,请将配置文件中的
use_gpu
字段修改为false
# GPU训练 支持单卡,多卡训练,通过--gpus参数指定卡号
# 训练icdar15英文数据 训练日志会自动保存为 "{save_model_dir}" 下的train.log
python3 -m paddle.distributed.launch --gpus '0,1,2,3' tools/train.py -c configs/rec/rec_icdar15_train.yml
由于我是在win10下训练的,并且只有一个显卡,训练脚本如下:
# GPU训练 支持单卡,多卡训练,通过--gpus参数指定卡号
# 训练icdar15英文数据 训练日志会自动保存为 "{save_model_dir}" 下的train.log
python tools/train.py -c configs/rec/rec_icdar15_train.yml
同时rec_icdar15_train.yml文件中的一些相关路径也是有问题的,需要改成自己实际的路径:
需要注意的是下面三个路径:character_dict_path:、data_dir:、label_file_list:
之前我就遇到过,character_dict_path:路径前面少了一个“./”导致训练时 acc 一直为0.
一些说明:
1、使用了预训练模型,下面的rec_icdar15_train.yml文件中又相应的内容(测试通过)
pretrained_model: ./pretrain_models/rec_mv3_none_bilstm_ctc_v2.0_train/best_accuracy
2、如果不在pretrained_model: 后面添加预训练模型路径,通过命令行使用预训练模型应该也是可以的,参考如下(测试未通过):
# GPU训练 支持单卡,多卡训练,通过--gpus参数指定卡号
# 训练icdar15英文数据 训练日志会自动保存为 "{save_model_dir}" 下的train.log
python tools/train.py -c configs/rec/rec_icdar15_train.yml -o Global.pretrain_weights=./pretrain_models/rec_mv3_none_bilstm_ctc_v2.0_train/best_accuracy
3、字母大写支持,需要两方面的改动,字符集添加大写字母,标签大写字母(未测试)。
参考如下:
Global:
use_gpu: true
epoch_num: 720
log_smooth_window: 20
print_batch_step: 10
save_model_dir: ./output/rec/ic15/
save_epoch_step: 3
# evaluation is run every 2000 iterations
eval_batch_step: [0, 2000]
# if pretrained_model is saved in static mode, load_static_weights must set to True
cal_metric_during_train: True
pretrained_model: ./pretrain_models/rec_mv3_none_bilstm_ctc_v2.0_train/best_accuracy
checkpoints: #./output/rec/ic15/best_accuracy
save_inference_dir:
use_visualdl: False
infer_img: doc/imgs_words_en/word_10.png
# for data or label process
character_dict_path: ./ppocr/utils/ic15_dict.txt
character_type: ch
max_text_length: 25
infer_mode: False
use_space_char: False
Optimizer:
name: Adam
beta1: 0.9
beta2: 0.999
learning_rate: 0.0005
regularizer:
name: 'L2'
factor: 0
Architecture:
model_type: rec
algorithm: CRNN
Transform:
Backbone:
name: MobileNetV3
scale: 0.5
model_name: large
Neck:
name: SequenceEncoder
encoder_type: rnn
hidden_size: 96
Head:
name: CTCHead
fc_decay: 0
Loss:
name: CTCLoss
PostProcess:
name: CTCLabelDecode
Metric:
name: RecMetric
main_indicator: acc
Train:
dataset:
name: SimpleDataSet
data_dir: ./train_data/ic15_data/
label_file_list: ["./train_data/ic15_data/rec_gt_train.txt"]
transforms:
- DecodeImage: # load image
img_mode: BGR
channel_first: False
- CTCLabelEncode: # Class handling label
- RecResizeImg:
image_shape: [3, 32, 100]
- KeepKeys:
keep_keys: ['image', 'label', 'length'] # dataloader will return list in this order
loader:
shuffle: True
batch_size_per_card: 256
drop_last: True
num_workers: 8
use_shared_memory: False
Eval:
dataset:
name: SimpleDataSet
data_dir: ./train_data/ic15_data/
label_file_list: ["./train_data/ic15_data/rec_gt_test.txt"]
transforms:
- DecodeImage: # load image
img_mode: BGR
channel_first: False
- CTCLabelEncode: # Class handling label
- RecResizeImg:
image_shape: [3, 32, 100]
- KeepKeys:
keep_keys: ['image', 'label', 'length'] # dataloader will return list in this order
loader:
shuffle: False
drop_last: False
batch_size_per_card: 256
num_workers: 4
use_shared_memory: False
因为使用了预训练模型,acc一上来就比较高
下面是训练时截取的片段:
[2021/04/25 22:55:46] root INFO: epoch: [33/720], iter: 560, lr: 0.000500, loss: 0.326820, acc: 0.968750, norm_edit_dis: 0.986556, reader_cost: 0.07451 s, batch_cost: 0.16704 s, samples: 2560, ips: 1532.54
[2021/04/25 22:55:47] root INFO: save model in ./output/rec/ic15/latest
[2021/04/25 22:55:47] root INFO: save model in ./output/rec/ic15/iter_epoch_33
[2021/04/25 22:55:47] root INFO: Initialize indexs of datasets:['./train_data/ic15_data/rec_gt_train.txt']
[2021/04/25 22:55:50] root INFO: epoch: [34/720], iter: 570, lr: 0.000500, loss: 0.256092, acc: 0.968750, norm_edit_dis: 0.989618, reader_cost: 0.07875 s, batch_cost: 0.17310 s, samples: 2560, ips: 1478.88
[2021/04/25 22:55:52] root INFO: save model in ./output/rec/ic15/latest
[2021/04/25 22:55:52] root INFO: Initialize indexs of datasets:['./train_data/ic15_data/rec_gt_train.txt']
[2021/04/25 22:55:53] root INFO: epoch: [35/720], iter: 580, lr: 0.000500, loss: 0.221114, acc: 0.972656, norm_edit_dis: 0.992008, reader_cost: 0.02936 s, batch_cost: 0.05761 s, samples: 768, ips: 1333.150
[2021/04/25 22:55:56] root INFO: epoch: [35/720], iter: 590, lr: 0.000500, loss: 0.212451, acc: 0.972656, norm_edit_dis: 0.992313, reader_cost: 0.07461 s, batch_cost: 0.16886 s, samples: 2560, ips: 1516.03
[2021/04/25 22:55:58] root INFO: save model in ./output/rec/ic15/latest
[2021/04/25 22:55:58] root INFO: Initialize indexs of datasets:['./train_data/ic15_data/rec_gt_train.txt']
[2021/04/25 22:56:00] root INFO: epoch: [36/720], iter: 600, lr: 0.000500, loss: 0.217688, acc: 0.972656, norm_edit_dis: 0.991217, reader_cost: 0.04877 s, batch_cost: 0.10549 s, samples: 1536, ips: 1456.10
[2021/04/25 22:56:03] root INFO: epoch: [36/720], iter: 610, lr: 0.000500, loss: 0.230538, acc: 0.972656, norm_edit_dis: 0.990990, reader_cost: 0.07450 s, batch_cost: 0.16910 s, samples: 2560, ips: 1513.88
[2021/04/25 22:56:03] root INFO: save model in ./output/rec/ic15/latest
[2021/04/25 22:56:03] root INFO: save model in ./output/rec/ic15/iter_epoch_36
[2021/04/25 22:56:03] root INFO: Initialize indexs of datasets:['./train_data/ic15_data/rec_gt_train.txt']
[2021/04/25 22:56:06] root INFO: epoch: [37/720], iter: 620, lr: 0.000500, loss: 0.200544, acc: 0.976562, norm_edit_dis: 0.991990, reader_cost: 0.07021 s, batch_cost: 0.15514 s, samples: 2304, ips: 1485.15
简单的示例跑通就可以替换自己的数据跑识别训练了。
然后单张测试:
# 预测英文结果
python tools/infer_rec.py -c configs/rec/rec_icdar15_train.yml -o Global.pretrained_model=./output/rec/ic15/latest Global.load_static_weights=false Global.infer_img=./train_data/ic15_data/test/word_10.png
测试结果:
[2021/04/25 22:56:17] root INFO: train with paddle 2.0.0 and device CUDAPlace(0)
W0425 22:56:17.050060 3624 device_context.cc:362] Please NOTE: device: 0, GPU Compute Capability: 6.1, Driver API Version: 10.2, Runtime API Version: 10.2
W0425 22:56:17.062021 3624 device_context.cc:372] device: 0, cuDNN Version: 7.6.
[2021/04/25 22:56:19] root INFO: load pretrained model from ['./output/rec/ic15/latest']
[2021/04/25 22:56:19] root INFO: infer_img: ./train_data/ic15_data/test/word_10.png
[2021/04/25 22:56:19] root INFO: result: ('pain', 0.99994206)
[2021/04/25 22:56:19] root INFO: success!
实际图片如下,可见识别正确。
数据集:/PaddleOCR/doc/doc_ch/datasets.md数据合成工具:/PaddleOCR/doc/doc_ch/data_synthesis.md文字识别训练:/PaddleOCR/doc/doc_ch/recognition.md暂时没有自己的数据,只能用开源数据练手。
本文来自于fujiabin,本篇会使用scikit-learn这个开源机器学习库来对iris数据集进行分类练习。我将分别使用两种不同的scikit-learn内置算法——DecisionTree(决策树)和kNN(邻近算法),随后我也会尝试自己实现kNN算法。目前为止,我还是在机器学习的入门阶段,文章中暂不详细解释算法原理,如果想了解细节信息可自行搜索。scikit-learn中预制了很多经典数据集,非常方便我们自己练习用。使用方式也很容易:
load_iris返回的结果有如下属性:feature_names-分别为:sepal
模型加载了名为 "rec_chinese_common_v2.0" 的检查点,并且将其设为了最佳精度。
在检查点中的 "acc" 值为 0.0。
在检查点中的 "norm_edit_dis" 值为 2.7777770073011965e-07。
在检查点中的 "fps" 值为 2.7724356030695527。
最佳精度的训练轮数为 75。
当前正在...
统一到一个字典里,会造成最后一层FC过大,增加模型大小。如果有特殊需求的话,可以把需要的几种语言合并字典训练模型,合并字典之后如果引入过多的形近字,可能会造成精度损失,字符平衡的问题可能也需要考虑一下。在PaddleOCR里暂时将语言字典分开。
3、如何对检测模型finetune,比如冻结.
PaddleOCR文字识别模型训练数据准备中文场景文字识别技术创新大赛数据集启动训练
本文主要介绍PaddleOCR中文字识别模型的训练、评估及测试。
数据准备
中文场景文字识别技术创新大赛数据集
数据集共212023张文字图片。数据集地址
将训练图片放入同一个文件夹(train_images),并用一个txt文件(rec_gt_train.txt)记录图片路径和标签。
注意: 默认请将图片路径和图片标签用 \t 分割,如用其他方式分割将造成训练报错
" 图像文件名
最近不是在做关于字符识别的项目嘛,同事用的paddleocr做字符识别自己测试的效果还行,结果到客户那边跑了一下没出结果,尴尬了。。。我感觉用paddleocr整体是没什么问题的,问题可能出在字符的定位方面。
借着这个机会我也学习了一下paddleocr,毕竟后面同事离职我要接手这个项目的(因为同事都是大佬,一个要去读香港理工大学研究生,一个要去读英国伦敦大学研究生,还有一个保研中南大学研究生)
一、paddleocr环境搭建
目录前言一、ai studio平台训练1.1、clone paddocr1.2、安装各种包1.3、准备好数据集1.3.1、导入数据集1.3.2、数据集解压1.3.3、划分训练集和验证集1.4、下载预训练权重并解压1.5、修改配置文件1.6、train1.7、验证1.8、保存测试结果1.9、yaml模型配置文件1.10、infer_rec.py二、Win10训练Reference
前面一节介绍了一下win10平台下的
一、ai studio平台训练
1.1、clone paddocr
1.2、安装各种
目录简介1 预处理流程初探2 算子处理过程2.1 DecodeImage2.2 DetResizeForTest2.2.1 构造方法2.2.2 调用方法2.3 NormalizeImage2.4 ToCHWImage2.5 KeepKeys3 预处理结果
导出ONNX格式的模型后,在部署模型时,需要对模型的输入进行预处理,转换成符合模型输入维度的张量;模型输出张量结果后,也需要通过后处理,将张量转换成需要的预测结果。
在Java中尝试通过OnnxRuntime部署PaddleOCR文字检测模型时,发现
由于官方提供的Paddleocr模型是一个通用的OCR识别模型,在很多的日常的场景中识别准确还是可以的,但是在一些比较特殊的场景中,识别的精确度就不是很好。如果要让我们的模型更加符合自己的业务需要,那么就需要训练我们自己的OCR识别模型。OCR识别分为文本检测和文本识别,文本检测就是让模型找到文字所在的位置,而文本识别是在文本检测到的位置上进行文本识别。训练自己的模型第一步就是需要数据集,从理论上来说,只要给模型喂入数据集越庞大那么,那么模型的效果就会越好。
对于...
Python语言可以利用笔记本电脑内置的语音识别技术来进行语音转文字的操作。具体实现方法如下:
1. 安装语音识别库:Python语言有很多语音识别库可供使用,如SpeechRecognition、PocketSphinx等,可以根据具体需求选择相应的库,并通过pip install命令进行安装。
2. 载入语音数据:从麦克风或音频文件读取语音数据,并将其转换为Python可处理的格式。
3. 进行语音识别:将载入的语音数据通过所选用的语音识别库进行识别,得到识别结果。
4. 文字输出:将识别结果以文字的形式输出,可以保存为文本文件,也可以通过语音合成技术将其转换为语音输出。
需要注意的是,语音识别技术仍处于不断发展改进的阶段,识别准确率受到多个因素的影响,如语言环境、发音习惯等,因此在实际应用中需要对识别结果进行验证和纠正。