文字识别,mmcor的个人使用记录

mmocr官方代码 : https://github.com/open-mmlab/mmocr

首先感谢一波大佬们的无私,把代码都开源了,还有辛勤的商汤的大佬们一直维护更新。这次写点自己的使用记录,给同我一样刚入门的萌新们。

一、mmocr的使用

  1. 环境配置

    常规的配置参考官网的教程Getting Started(再次感谢大佬们搞的这么仔细的教程),然后如果是30系列的显卡,因为只支持cuda11,所以环境配置有点麻烦,我这边是3070,就把自己的配置过程放上来:

    # mmocr for 3070
    
    conda create -n open-mmlab python=3.7 -y
    conda activate open-mmlab
    
    # install latest pytorch prebuilt with the default prebuilt CUDA version (usually the latest)
    conda install pytorch==1.8.0 torchvision torchaudio cudatoolkit=11.1 -c pytorch -c nvidia
    
    # install the latest mmcv-full
    pip install mmcv-full -f https://download.openmmlab.com/mmcv/dist/cu111/torch1.8.0/index.html
    # install mmdetection
    pip install mmdet
    
    # install mmocr
    git clone https://github.com/open-mmlab/mmocr.git
    cd mmocr
    
    pip install -r requirements.txt
    pip install -v -e .  # or "python setup.py build_ext --inplace"
    export PYTHONPATH=$(pwd):$PYTHONPATH
    

    此后运行代码,可能还会有个cocoapi的小问题,报错 AttributeError: COCO object has no attribute get_cat_ids ,有多种解决方案

    # 方法1 
    git clone https://github.com/open-mmlab/cocoapi.git
    cd cocoapi/pycocotools
    pip install .
    # 方法2
    pip uninstall pycocotools
    pip install mmpycocotools
    

    然后我们就可以跑个官方demo看看环境是否OK了

    python demo/ocr_image_demo.py demo/demo_text_det.jpg demo/output.jpg
    
  2. 准备自己的训练数据

    官方教程Datasets Preparation介绍得很详细了,我再补充点小细节

    Text Detection 数据

    我是转换成coco类格式的数据,关于coco数据的格式可以参考GemfieldCOCO数据集的标注格式。如果你是标准学术的数据集,官方代码 tools里面包含各种数据互相转换的脚本。数据目录设置都在configs对应的.py文件中设置,如下例子

    # 指定数据类型,此类型使.txt的标签文件, 'IcdarDataset' 类使用.json标签文件
    dataset_type = 'TextDetDataset'
    # 图片目录前缀
    img_prefix = 'tests/data/toy_dataset/imgs'
    # annotation文件
    test_anno_file = 'tests/data/toy_dataset/instances_test.txt'
    

    我使用的是 ‘IcdarDataset’ 类数据,官方config基本也都是此类数据,最重要的是.json格式的annotation文件,可以参考官方给的文件样例,字典格式,keys主要是 “images” ,“categories” 和 “annotations” :

    "images"

    “images” 的value是一个字典列表,列表每个元素是一个字典,包含图片的信息,例子

    {"file_name": "training/0336.png", "height": 1200, "width": 1600, "segm_file": "training/0336.xml", "id": 0}
    
    • “file_name” 指定文件位置,要注意和前面设置的“img_prefix”目录前缀对应,确保能读取到文件
    • “segm_file” 每张图片单独的标注文件,可有可无,实际在"annotations"中定义
    • “id” 图片id,很重要,后面的annotation要会对应每个image_id

    "categories"

    "categories"的value是一个字典列表,即标签类别,因为我们ocr里面都是文本类别,所以只要一类就行,无脑复制粘贴即可

    "categories": [{"id": 1, "name": "text"}] 
    

    "annotations"

    “annotations” 的value也是一个字典列表,列表每个元素是一个字典,即最终读取的ground truth标签,例子

    {"iscrowd": 0, "category_id": 1, "bbox": [213, 16, 370, 1163], "area": 168314.0, "segmentation": [[485, 1179, 306, 991, 252, 800, 213, 608, 215, 413, 274, 214, 402, 16, 535, 130, 471, 291, 296, 460, 301, 620, 365, 777, 490, 931, 583, 1089]], "image_id": 0, "id": 0}
    
    • “iscrowd”, 0是polygon格式segmentation;1是RLE格式segmentation,参考上面coco数据格式
    • “category_id” 目标类别,反正都是文本
    • “bbox” [x,y,w,h]形式的gt,前两个是左上角点坐标,w h 是框的宽高
    • “area” segmentation面积
    • “segmentation” [x1,y1,x2,y2…]多边形的gt,每两个是一个点的一对坐标
    • “image_id” 对应图片的id,要一一对应哈
    • “id” 很重要,每个图片可能有多个目标,此id要全局唯一性,所以取值[0-总segmentation个数],不能每次遍历一张图片时,id又从0开始

    根据自己不同的数据,按上面格式写好保存成.json文件,然后configs里面填好对应目录即可。跑代码时,如果能跑,但是没有出现loss,只会保存权重文件,那就是你的数据格式有问题,或者对应的目录设置错了

    Text Recognition数据

    此类数据比较简单,annotation每行只要指定 文件名和对应的文字label即可,前提是你要把一个个segmentation的区域抠出来做成单独的图片数据,例子:

    train_words/1001724.jpg Chiquita
    

    第一部分是文件的路径,绝对路径相对路径都行,和config中的设置相对应就好了;第二部分是文字的真实label

    然后在config文件中定义数据和detection差不多,此处直接’OCRDataset’类型就可以,然后train_prefix 指定图片目录前缀,train_ann_file指定对应的annotation文件位置,test设置也是一样。

    dataset_type = 'OCRDataset'
    train_prefix = 'data/chinese/'
    train_ann_file = train_prefix + 'labels/train.txt'
    

    另外需要注意的就是,文字识别需要一个词汇字典,由dict_file定义,如果是做中文文字识别,官方的sar模型已经有预训练的权重了,可以直接下载然后自己fine-tune一下,效果很好的,mmocr官方简直是直接喂饭,大家只要张嘴就好了…

    dict_file = 'data/chineseocr/labels/dict_printed_chinese_english_digits.txt'
    
  3. 训练模型 测试结果

    其实数据准备好了,其他的都很简单,水到渠成,官方的教程也有十分详细的资料,我就不再赘述了。提下自己的操作,因为官方教程训练和测试都是通过调用 .sh脚本执行,有时候不是很方便,其实看下脚本代码就知道,就是调用tools下的 train.py 等文件,那我们可以直接执行.py文件干活,举个简单的例子:

    # 导入官方的模型训练,第一个参数 config文件,  --work-dir 指定log 权重保存位置等;--load-from 先load模型再训练;--resume-from 继续训练;--gpus 使用的gpu个数; --gpu-ids 指定使用的gpu id
    
    python ./tools/train.py configs/textrecog/sar/sar_r31_parallel_decoder_chinese.py  --work-dir ./results/sar/  --load-from   checkpoints/sar_chineseocr.pth  --gpus 1 --gpu-ids 4
    

    直接看对应的.py文件,看它需要哪些args就知道各个参数了。一般在训练的时候会有evaluation,在config最后一行进行设置。同时在最开始行,会有_base参数,第一个是定义优化器学习率等,第二个是权重保存间隔等。

    evaluation = dict(interval=10, metric='hmean-iou')
    _base_ = [
        '../../_base_/schedules/schedule_1200e.py',
        '../../_base_/default_runtime.py'
    ]
    

若有后续再补充…

  • 12
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 33
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 33
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值