ZH ·
🌏 English

MMOCR 安装指南及自定义数据集训练

什么是 OCR?

根据维基百科,OCR(光学字符识别)是将打字、手写或印刷文本的图像转换为机器编码文本的电子或机械过程。

为什么选择 MMOCR?

安装

MMOCR 官方文档 提供了详细的安装指南。以下是我在机器上的配置过程。

首先创建一个隔离的虚拟环境:

conda create -n open-mmlab python=3.8
conda activate open-mmlab

安装 PyTorch 1.10(适配 CUDA 10.2):

conda install pytorch=1.10.0 torchvision cudatoolkit=10.2 -c pytorch

安装 MMCV 和 MMDetection:

pip install mmcv-full -f https://download.openmmlab.com/mmcv/dist/cu102/torch1.10.0/index.html
pip install mmdet

克隆 MMOCR 仓库并安装:

git clone https://github.com/open-mmlab/mmocr.git
cd mmocr
pip install -r requirements.txt
pip install -v -e . # 或 "python setup.py develop"

注意:官方文档建议将仓库路径添加到 PYTHONPATH 环境变量中。如果你的项目需要跨目录调用 MMOCR,请执行此操作;若仅在仓库内开发,则无需此步骤。

简单测试

可以通过以下命令进行端到端的检测与识别测试,系统会自动下载预训练权重:

python mmocr/utils/ocr.py demo/demo_text_ocr.jpg --print-result --imshow

若仅需进行文本检测,可以使用 TextSnake 算法:

python mmocr/utils/ocr.py demo/demo_text_det.jpg --output demo/det_out.jpg --det TextSnake --recog None --export demo/

使用自己的数据训练

由于 MMOCR 训练通常需要 COCO 格式,而我的标注数据为 PASCAL VOC 格式,因此需要进行转换。

1. 生成 ID 列表

在项目根目录下创建一个 gen_ids.py 脚本,用于划分训练集和测试集 ID:

import os
import argparse

def parse_args():
    parser = argparse.ArgumentParser(description='generate id list file.')
    parser.add_argument('--path', type=str, default=None, help='path to annotation files dir.')
    return parser.parse_args()

def generate_ids(anno_path):
    with open("./train_ids.txt", 'w') as ftrain, open("./test_ids.txt", 'w') as ftest:
        cntr=0
        for path, folders, files in os.walk(anno_path):
            for file_name in files:
                if cntr % 10 == 0:
                    ftest.write(file_name.split('.')[0] + '\n')
                else:
                    ftrain.write(file_name.split('.')[0] + '\n')
                cntr += 1
                
def main():
    args = parse_args()
    generate_ids(args.path)
    
if __name__ == '__main__':
    main()

运行脚本:python gen_ids.py --path ./Annotations/

2. 格式转换

创建 voc2coco.py 脚本(代码略,请参考下文实现)将 VOC XML 转换为 COCO JSON。确保创建一个 coco.names 文件,内容为 text

执行转换命令:

python voc2coco.py --ann_dir ./Annotations/ --ann_ids ./train_ids.txt --labels ./coco.names --output ./annotations/instances_training.json --ext xml
python voc2coco.py --ann_dir ./Annotations/ --ann_ids ./test_ids.txt --labels ./coco.names --output ./annotations/instances_test.json --ext xml

3. 开始训练

  1. configs/_base_/det_datasets/ 下创建 new_dataset.py,参考 icdar2015.py 修改路径配置。
  2. configs/textdet/dbnet/ 下创建 dbnet_r50dcnv2_fpnc_1200e_new_dataset.py,并在 _base_ 中引用自定义的 new_dataset.py
  3. 使用多 GPU 进行训练:
./tools/dist_train.sh configs/textdet/dbnet/dbnet_r50dcnv2_fpnc_1200e_new_dataset.py work_dirs/dbnet_r50dcnv2_fpnc_1200e_new_dataset 8

总结

MMOCR 配置简便且运行稳定,训练日志记录详尽。尽管其 C++ 部署代码仍处于实验阶段,但我已成功将其转换为 ONNX 并集成到 C++ 项目中。