首页 > 技术文章 > finetune cnocr

laozhanghahaha 2021-04-20 15:00 原文

  • 制作数据集
    1. 这里用的是text-render制作的数据集, 这个开源项目可以制作包含中英文字符的数据,但是这里我们想要制作包含希腊字母的数据,项目本身不支持希腊字母,因此首先需要下载支持希腊字母的字体,我下载的是Gentiumarial-unicode-ms,下载完之后还需要制作一个包含要生成希腊字符的txt文件greek.txt。我的文件里不仅包含希腊字符还包含了数学符号和英文字母。到时候生成数据的时候就是从这个txt里随机选取字符。同时还要注意将额外添加的希腊字母添加到./data/label_cn.txt中否则无法生成图片
    2. 具体操作指令见这里, 最后生成的图片会./output/greek/路径下,除了图片还有有一个label.txt文件,文件中包含了图片名字,以及图片字符在./data/label_cn中对应的id(位置)
  • 处理数据
    1. 将./output/greek/路径下的图片分为train和text,同时生成一个train.txt和text.txt文件, 最后整理得到一个含有图片和txt的文件夹greek-dataset,文件内容包括 greek, train.txt, test.txt
    2. 执行makefile数据处理的步骤,gen-lst和gen-rec
    ATA_ROOT_DIR = data/sample-data
    REC_DATA_ROOT_DIR = data/sample-data-lst
    
    # `EMB_MODEL_TYPE` 可取值:['conv', 'conv-lite-rnn', 'densenet', 'densenet-lite']
    EMB_MODEL_TYPE = densenet-lite
    # `SEQ_MODEL_TYPE` 可取值:['lstm', 'gru', 'fc']
    SEQ_MODEL_TYPE = fc
    MODEL_NAME = $(EMB_MODEL_TYPE)-$(SEQ_MODEL_TYPE)
    
    # 产生 *.lst 文件
    gen-lst:
        python scripts/im2rec.py --list --num-label 20 --chunks 1 \
            --train-idx-fp $(DATA_ROOT_DIR)/train.txt --test-idx-fp $(DATA_ROOT_DIR)/test.txt --prefix 
            $(REC_DATA_ROOT_DIR)/sample-data
    
    # 利用 *.lst 文件产生 *.idx 和 *.rec 文件。
    # 真正的图片文件存储在 `examples` 目录,可通过 `--root` 指定。
    gen-rec:
        python scripts/im2rec.py --pack-label --color 1 --num-thread 1 --prefix $(REC_DATA_ROOT_DIR) --root examples
    
  • finetune
    python scripts/cnocr_train.py --gpu 0\
          --emb_model_type $(EMB_MODEL_TYPE) \
          --seq_model_type $(SEQ_MODEL_TYPE)  \
          --epoch 20 --lr 1e-4 \
          --train_file $(REC_DATA_ROOT_DIR)/sample-data_train \
          --test_file $(REC_DATA_ROOT_DIR)/sample-data_test \
          --load_epoch 0040 --out_model_dir path/to/cn_ocr_model/
    
    作者提供的train指令是从头开始训练的指令,如果想finetune的话需要执行上边的指令. 如果需要在GPU上训练,把上面命令中的参数 --gpu 0改为--gpu <num_gpu>,其中的<num_gpu> 为使用的GPU数量。
  • 注意,使用GPU训练需要安装mxnet的GPU版本,如mxnet-cu90。在安装的时候要注意pip install cnocr会自动安装cpu版本mxnet,之后如果自己再安装gpu版本的mxnet, 运行的时候会报错。经多次尝试发现发现要先分别安装gluoncv和对应CUDA版本下的mxnet,再去除依赖直接安装cnocr。 安装顺序如下(顺序不要乱!)
    conda install -c anaconda cudatoolkit==9.0
    pip install gluoncv
    pip install mxnet-cu101
    pip install cnocr --no-dependencies
    
  • 给字典添加额外字符
    • 当我们给字典添加额外字符后,需要修改https://github.com/breezedeus/cnocr/blob/master/cnocr/hyperparams/cn_hyperparams.py中的self._num_classes的值, 将其改为目前字典中的字数+1,此外还要调整网络结构,更改网络最后的fc层的输出数目, 具体可以参看这篇文章link

推荐阅读