PaddleOCR数据集生成和图片半自动标注

最近项目业务涉及到书法汉子识别与评价,决定采用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--                   放大
↑→↓←                  移动标记框

待所有标注完成后,点击左上角 文件—>导出标记结果即可得到对应标注信息,位置最好别动它,训练时指定图片资源位置即可

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