PaddleOCR训练集配置
PaddleOCR训练集配置

PaddleOCR训练集配置

目录树
  • 数据集图片生成
    • 这里采用TextRecognitionDataGenerator作为数据集图片的生成工具
    • pip install trdg ↑
    • trdg –output_dir “.\train\” –thread_count 16 –background 3 –image_dir “.\bg\” –font “.\pglh.ttf” –language cn –dict “.\word.txt” –word_split –text_color “#F3E6D6” -bl 1 –count 20000
    • 字典word.txt请使用utf-8编码,以\r\n换行
参数副参数作用
–output_dir生成图片输出路径
-i/–input_file生成图片中文字的源文件(路径),不指定用项目默认文件
-l/–language指定目标语言
-c/–count生成的图片数量
-rs/–random_sequences-let/–include_letters
-num/–include_numbers
-sym/–include_symbols
用字符随机生成单词,用于随机生成单词的字符中包含字母
用字符随机生成单词,用于随机生成单词的字符中包含数字
用字符随机生成单词,用于随机生成单词的字符中包含符号
-w/–length随机生成图片包含的单词数
-r/–random
以-w设置的单词数为上限,随机生成不同单词数的图片
-f/–format
生成图片的像素高度(水平排版),生成图片的像素宽度(竖直排版)
-e/–extension
生成图片的保存格式,默认”jpg“
-t/–thread_count运行程序使用的线程数,实测8线程下,生成一万张图片仅需 6s,设置较高的线程可以明显提速
-k/–skew_angle文字在图片中的倾斜角度
-rk/–random_skew在倾斜角度 -k 设置的情况下,比如设为 a,则生成图片文字的倾斜角度在 -a~a之间随机选择
-wk/–use_wikipedia用维基百科作为单词源,生成图片,实测好像会连接失败
-bl/–blur设定图片的高斯模糊值,默认为0,即无高斯模糊处理,输入数据为int
-rbl/–random_blur在设定高斯模糊值 -rbl 的情况下,比如设为b,则生成图片的高斯模糊值在 0~b之间随机取值
-b/–background设置图片的背景,0-高斯噪声; 1-白色背景; 2-quasicrystal; 3-自定义图片
-id/–image_dir在设定背景参数 -b 的值为3的情况下,从指定的图片文件夹中读取图片作为背景。
-hw/–handwritten利用训练好的RNN模型,生成手写字体图片(强大。。。)
-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,(#000000,#282828)
-sw/–space_width设定图片中单词之间的像素间隔,默认为1像素
-cs/–character_spacing设定图片中字符之间的像素间隔,默认为0像素
-m/–margins设定图片中文本,上下左右的空白间隔,以间隔的像素值表示,默认(5,5,5,5,)
-fi/–fit是否按文本裁切图片,使图片中文本上下左右的间隔均为0,默认为 False
-ft/–font设定生成文本所用的字体文件(.ttf)格式
-fd/–font_dir设定生成文本所用字体的文件夹,生成的图片从文件夹中随机选择字体
-ca/–case设定图片中生成的文字大小写:upper/lower
-dt/–dict设定从字典文件(路径)中选择单词生成图片
-ws/–word_split设定是设定根据单词还是字符分隔文字,True-根据单词 Talse-根据字符
trdg参数解释
  • 数据集目录xxxxx_data 用于保存训练需要的数据 PaddleOCR\train_data\xxxxx_data
    • generate_txt.py 粘贴到 PaddleOCR\train_data\xxxxx_data\ 下,运行生成train_list、test_list、word_dict文件
路径说明是否为必填项
xxxxx_data/train存放训练图片必须
xxxxx_data/test存放测试识别图片必须
xxxxx_data/train/train_list.txt训练图片统计列表必须
xxxxx_data/test/test_list.txt测试图片统计列表必须
xxxxx_data/word_dict.txt字典文件(一行一个字符)非必须
去重网站 分割网站
# generate_txt.py
import os

# 生成字典
def word_dict():
    rootdir = "./train/"
    file_list = os.listdir(rootdir)
    dict={}
    for i in range(0, len(file_list)):
        path = os.path.join(rootdir, file_list[i])
        if os.path.isfile(path):
            for s in os.path.basename(path).split(".")[0].split("_")[0]:
                dict.update({s:0})
    print(dict.__len__())
    with open("./word_dict.txt", "w", encoding="utf-8") as file_object:
        for s in list(dict):
            print(s)
            file_object.write(s+"\n")
    

# 生成测试图片列表
def generate_list(folder_name):
    rootdir = "./"+folder_name+"/"
    file_list = os.listdir(rootdir)
    with open("./" + folder_name+"_list.txt", "w", encoding="utf-8") as file_object:
        for i in range(0, len(file_list)):
            path = os.path.join(rootdir, file_list[i])
            if os.path.isfile(path):
                str = folder_name + "/" + os.path.basename(path) + "\t" + os.path.basename(path).split(".")[0].split("_")[0] + "\n"
                file_object.write(str)
                print(str)


generate_list("test")
generate_list("train")
word_dict()
  • 修改 PaddleOCR\configs\rec\rec_chinese_common_train_v2.0.yml
配置里对应的键说明是否必改项
Global->pretrained_model预训练模型必须./ch_ppocr_server_v2.0_rec_pre/best_accuracy
Global->save_model_dir训练结果模型存放处可选./output/xxx_data
Global->character_dict_path使用的字典必须./train_data/xxx_data/word_dict.txt
Train->data_dir使用的训练图片目录必须./train_data/xxx_data
Train->label_file_list使用的训练图片统计列表文件必须[“./train_data/xxx_data/train_list.txt”]
Eval->data_dir使用的测试识别图片目录必须./train_data/xxx_data
Eval->label_file_list使用的测试识别图片统计列表文件必须[“./train_data/xxx_data/test_list.txt”]
  • 运行训练
    • python tools/train.py -c configs\rec\ch_ppocr_v2.0\rec_chinese_common_train_v2.0.yml
  • 将训练结果转换为识别模型(可选)
    • python tools/export_model.py -c configs/rec/ch_ppocr_v2.0/rec_chinese_common_train_v2.0.yml -o Global.pretrained_model=./output/xxxxx_data/best_accuracy Global.save_inference_dir=./inference/xxxxx_data/
  • 测试识别
    • python tools/infer_rec.py -c configs/rec/ch_ppocr_v2.0/rec_chinese_common_train_v2.0.yml -o Global.checkpoints=./output/xxxxx_data/best_accuracy -o Global.infer_img=”./xxxxx_data/test/”

问题汇总

  1. Out of memory error on GPU 0. Cannot allocate 640.000244MB memory on GPU 0, 3.707971GB memory has been allocated and available memory is only 298.912501MB.

GPU0内存不足,解决方案

  • 1.切到/添加其他GPU
#运行代码更改为
set CUDA_VISIBLE_DEVICES=0,1 ; python tools/train.py -c configs\rec\ch_ppocr_v2.0\rec_chinese_common_train_v2.0.yml
  • 2.减小batch size