[mmocr官方代码](https://github.com/open-mmlab/mmocr) : https://github.com/open-mmlab/mmocr
首先感谢一波大佬们的无私,把代码都开源了,还有辛勤的商汤的大佬们一直维护更新。这次写点自己的使用记录,给同我一样刚入门的萌新们。
### 一、mmocr的使用
1. #### 环境配置
常规的配置参考官网的教程[Getting Started](https://mmocr.readthedocs.io/en/latest/getting_started.html)(再次感谢大佬们搞的这么仔细的教程),然后如果是30系列的显卡,因为只支持cuda11,所以环境配置有点麻烦,我这边是3070,就把自己的配置过程放上来:
```python
# 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** ,有多种解决方案
```python
# 方法1
git clone https://github.com/open-mmlab/cocoapi.git
cd cocoapi/pycocotools
pip install .
# 方法2
pip uninstall pycocotools
pip install mmpycocotools
```
然后我们就可以跑个[官方demo](https://mmocr.readthedocs.io/en/latest/demo.html)看看环境是否OK了
```python
python demo/ocr_image_demo.py demo/demo_text_det.jpg demo/output.jpg
```
2. #### 准备自己的训练数据
官方教程[Datasets Preparation](https://mmocr.readthedocs.io/en/latest/datasets.html)介绍得很详细了,我再补充点小细节
#### **Text Detection 数据**
我是转换成coco类格式的数据,关于coco数据的格式可以参考[Gemfield](https://www.zhihu.com/people/gemfield) 的 [COCO数据集的标注格式]([Gemfield](https://www.zhihu.com/people/gemfield))。如果你是标准学术的数据集,官方代码 tools里面包含各种数据互相转换的脚本。数据目录设置都在configs对应的.py文件中设置,如下例子
```python
# 指定数据类型,此类型使.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文件,可以参考官方给的[文件样例](https://download.openmmlab.com/mmocr/data/ctw1500/instances_training.json),字典格式,keys主要是 "images" ,"categories" 和 "annotations" :
**"images"**
"images" 的value是一个字典列表,列表每个元素是一个字典,包含图片的信息,例子
```python
{"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里面都是文本类别,所以只要一类就行,无脑复制粘贴即可
```python
"categories": [{"id": 1, "name": "text"}]
```
**"annotations"**
"annotations" 的value也是一个字典列表,列表每个元素是一个字典,即最终读取的ground truth标签,例子
```python
{"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的区域抠出来做成单独的图片数据,例子:
```python
train_words/1001724.jpg Chiquita
```
第一部分是文件的路径,绝对路径相对路径都行,和config中的设置相对应就好了;第二部分是文字的真实label
然后在config文件中定义数据和detection差不多,此处直接'OCRDataset'类型就可以,然后train_prefix 指定图片目录前缀,train_ann_file指定对应的annotation文件位置,test设置也是一样。
```python
dataset_type = 'OCRDataset'
train_prefix = 'data/chinese/'
train_ann_file = train_prefix + 'labels/train.txt'
```
另外需要注意的就是,文字识别需要一个词汇字典,由dict_file定义,**如果是做中文文字识别,官方的sAR模型已经有预训练的权重了**,可以直接下载然后自己fine-tune一下,效果很好的,mmocr官方简直是直接喂饭,大家只要张嘴就好了....
```python
dict_file = 'data/chineSEOcr/labels/dict_printed_chinese_english_digits.txt'
```
3. #### 训练模型 测试结果
其实数据准备好了,其他的都很简单,水到渠成,[官方的教程](https://mmocr.readthedocs.io/en/latest/getting_started.html)也有十分详细的资料,我就不再赘述了。提下自己的操作,因为官方教程训练和测试都是通过调用 .sh脚本执行,有时候不是很方便,其实看下脚本代码就知道,就是调用tools下的 train.py 等文件,那我们可以直接执行.py文件干活,举个简单的例子:
```python
# 导入官方的模型训练,第一个参数 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参数,第一个是定义优化器学习率等,第二个是权重保存间隔等。
```python
evaluation = dict(interval=10, metric='hmean-IoU')
_base_ = [
'../../_base_/schedules/schedule_1200e.py',
'../../_base_/default_runtime.py'
]
```
若有后续再补充...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。