最近项目业务涉及到书法汉子识别与评价,决定采用PaddlleOCR来完成识别流程。OCR文字识别中最重要的训练数据集非常重要,官方提供了很多已经训练好的模型,但是在某些垂类场景中还没有特定模型,需要自己训练适合业务的模型。
操作环境:Mac Os,Anconda
一,TextRecognitionDataGenerator数据集生成
TextRecognitionDataGenerator是一个强大的文本生成器,提供了各种参数来批量生成各种不同的文字
项目地址:https://github.com/Belval/TextRecognitionDataGenerator
这里建议将项目clone到本地操作,不建议直接pip install trdg,这里假设将项目clone至 /User/local/TextRecognitionDataGenerator目录下
cd /User/local/TextRecognitionDataGenerator ##基本用法,生成500个汉字图片 python ./run.py -l cn -c 500 其中run.py中有很多参数可以选择,具体参数如下:
参数 | 参数说明 |
–output_dir | 生成图片输出目录路径 |
-i/–input_file | 生成图片中文字的源文件(路径),不指定用项目默认文件,如果 指定了生成哪些文字,可以指定 |
-l/–language | 语言:en—英文,ch—中文,默认英文 |
-c/–count | 生成的图片数量 |
-w/–length | 随机生成图片包含的单词数 |
-r/–random | 以-w设置的单词数为上限,随机生成不同单词数的图片 |
-f/–format | 生成图片的像素高度(水平排版),生成图片的像素宽度(竖直排版) |
-t/–thread_count | 运行程序使用的线程数,实测8线程下,生成一万张图片仅需 6s, 设置较高的线程可以明显提速 |
-e/–extension | 生成图片的保存格式,默认”jpg“ |
-k/–skew_angle | 文字在图片中的倾斜角度 |
-rk/–random_skew | 在倾斜角度 -k 设置的情况下,比如设为 a,则生成图片文字的倾斜 角度在 -a~a之间随机选择 |
-bl/–blur | 设定图片的高斯模糊值,默认为0,即无高斯模糊处理 |
-rbl/–random_blur | 在设定高斯模糊值 -rbl 的情况下,比如设为b,则生成图片的高斯模糊值 在 0~b之间随机取值 |
-b/–background | 设置图片的背景,0-高斯噪声; 1-白色背景; 2-图片 |
-id/–image_dir | 在设定背景参数 -b 的值为2(即图片)的情况下,从指定的图片文件夹中 读取图片作为背景。 |
-hw/–handwritten | 利用训练好的RNN模型,生成手写字体图片,依赖tensorflow |
-na/–name_format | 生成图片的命名格式,图片名称通常包含标签,对于一些包含特殊符号的图片, 由于图片命名中不能包含特殊图片,所以另生成一个文本记录标签。 |
-om/–output_mask | 对于每一张生成的图片,输出同样尺寸的掩码(全黑图片),训练的时候 作为一种trick |
-d/–distorsion | 对生成图片中的文字进行扭曲,默认为0。1-正弦扭曲,2-余弦扭曲 |
-do/–distorsion_orientation | 在 -d 设定为正弦扭曲或者余弦扭曲的情况下,设定扭曲方向, 0 – 竖直方向上的扭曲 1-横向扭曲 |
-wd/–width | 设定图片的像素宽度,在不指定的情况下,宽度为文本的宽度+10, 假如设定宽度,过短会截取部分文本 |
-al/–alignment | 在设定文本宽度参数 -wd的情况下,截取文本的方式,0 -从左侧开始 截取 1- 从中心向两边截取 2-从右侧开始截取 |
-or/–orientation | 文本在图片中的排版,0- 横向排版,1- 竖向排版,默认横向排版 |
-tc/–text_color | 文本的颜色,通过设定的颜色,或者颜色范围,生成特定颜色的文本, 颜色格式为16进制 如:#282828, |
-sw/–space_width | 设定图片中单词之间的像素间隔,默认为1像素 |
-cs/–character_spacing | 设定图片中字符之间的像素间隔,默认为0像素 |
-m/–margins | 设定图片中文本,上下左右的空白间隔,以间隔的像素值表示,默认5 |
-fi/–fit | 是否按文本裁切图片,使图片中文本上下左右的间隔均为0,默认为 False |
-ft/–font | 设定生成文本所用的字体文件(.ttf)格式 |
-fd/–font_dir | 设定生成文本所用字体的文件夹,生成的图片从文件夹中随机选择字体 |
-ca/–case | 设定图片中生成的文字大小写:upper/lower |
-dt/–dict | 设定从字典文件(路径)中选择单词生成图片 |
-ws/–word_split | 设定是设定根据单词还是字符分隔文字,True-根据单词 Talse-根据字符 |
-let/–include_letters | 用字符随机生成单词,用于随机生成单词的字符中包含字母 |
-num/–include_numbers | 用字符随机生成单词,用于随机生成单词的字符中包含数字 |
-sym/–include_symbols | 用字符随机生成单词,用于随机生成单词的字符中包含符号 |
本例子采用命令
python run.py -i D:\xxx\char_source.txt -fd D:\User\local\TextRecognitionDataGenerator\trdg\fonts\cn -l cn -c 500 -w 1 -f 60 -t 5 -e jpg -k 10 -rk -bl 1 -rbl -b 1 -d 0 -wd 60 -or 0 -m 6 -al 1 --output_dir G:\train_datas

至此汉字资源生成完成
二,图片信息标注
我们生成的各种字体下的文字,需要转换成paddleocr训练模型能识别的标记数据才行,使用paddleocr自带的即可PPOCRLabel
1)下载PaddleOcr源码到本地
git clone https://github.com/PaddlePaddle/PaddleOCR.git
2)进入PaddleOCR文件夹安装paddleocr所需的包
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
3)继续进入PPOCRLabel
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
由于PPOCRLabel是基于QT5进行开发的UI框架,可能会与opencv中qt插件冲突,导致安装或者运行过程中错误,常见错误如
.... File "/Users/fplei/opt/anaconda3/envs/paddle_env/lib/python3.9/site-packages/imgaug/__init__.py", line 7, in <module> from imgaug.imgaug import * # pylint: disable=redefined-builtin File "/Users/fplei/opt/anaconda3/envs/paddle_env/lib/python3.9/site-packages/imgaug/imgaug.py", line 53, in <module> cv2.INTER_NEAREST, cv2.INTER_LINEAR, cv2.INTER_AREA, cv2.INTER_CUBIC] AttributeError: module 'cv2' has no attribute 'INTER_NEAREST'
解决方案是先将opencv相关的模块先使用pip uninstall 卸载,或者通过 conda uninstall xx 卸载,卸载完成后安装opencv-contrib-python-headless接口
pip install opencv-contrib-python-headless -i https://pypi.tuna.tsinghua.edu.cn/simple
4)启动并使用PPOCRLabel
python PPOCRLabel.py --lang ch

导入图片后工具会自动识别标注文字所在区域,但是有些是无法识别的,这些数据需要我们手动调整文字区域,并且将未识别的结果正确输入,每修改一个保存一下ctrl+v
PPOCRLabel快捷键 Ctrl + shift + R 对当前图片的所有标记重新识别 W 新建矩形框 Q 新建四点框 Ctrl + E 编辑所选框标签 Ctrl + R 重新识别所选标记 Ctrl + C 复制并粘贴选中的标记框 Ctrl + 鼠标左键 多选标记框 Backspace 删除所选框 Ctrl + V 确认本张图片标记 Ctrl + Shift + d 删除本张图片 D 下一张图片 A 上一张图片 Ctrl++ 缩小 Ctrl-- 放大 ↑→↓← 移动标记框
待所有标注完成后,点击左上角 文件—>导出标记结果即可得到对应标注信息,位置最好别动它,训练时指定图片资源位置即可

至此完成了文字数据生成以及数据标注,下一步可以送入预训练模型进行参数训练。