finetune cnocr
- 制作数据集
- 这里用的是text-render制作的数据集, 这个开源项目可以制作包含中英文字符的数据,但是这里我们想要制作包含希腊字母的数据,项目本身不支持希腊字母,因此首先需要下载支持希腊字母的字体,我下载的是Gentium和arial-unicode-ms,下载完之后还需要制作一个包含要生成希腊字符的txt文件greek.txt。我的文件里不仅包含希腊字符还包含了数学符号和英文字母。到时候生成数据的时候就是从这个txt里随机选取字符。同时还要注意将额外添加的希腊字母添加到./data/label_cn.txt中否则无法生成图片
- 具体操作指令见这里, 最后生成的图片会./output/greek/路径下,除了图片还有有一个label.txt文件,文件中包含了图片名字,以及图片字符在./data/label_cn中对应的id(位置)
- 处理数据
- 将./output/greek/路径下的图片分为train和text,同时生成一个train.txt和text.txt文件, 最后整理得到一个含有图片和txt的文件夹greek-dataset,文件内容包括 greek, train.txt, test.txt
- 执行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
作者提供的train指令是从头开始训练的指令,如果想finetune的话需要执行上边的指令. 如果需要在GPU上训练,把上面命令中的参数 --gpu 0改为--gpu <num_gpu>,其中的<num_gpu> 为使用的GPU数量。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/
- 注意,使用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
- 当我们给字典添加额外字符后,需要修改