Skip to content

Latest commit

 

History

History
225 lines (151 loc) · 11 KB

README_CN.md

File metadata and controls

225 lines (151 loc) · 11 KB

English | 中文

FCENet

FCENet: Fourier Contour Embedding for Arbitrary-Shaped Text Detection

1. 概述

FCENet

FCENet是一种基于分割的场景文本检测算法。在场景文本检测中,基于分割这类算法可以更加准确的描述各种形状的场景文本(比如弯曲形状的文本),而变得越来越流行。 FCENet的一大亮点就是在任意不规则形状的文本场景上表现优异,这得益于它采用了可变形卷积[1]和傅里叶变换技术。 除此之外,FCENet还具有后处理简单和高泛化性的优点,在少量训练数据上训练就可以达到很好的效果。

可变形卷积

可变形卷积的思想非常简单,就是将原来固定形状的卷积核变成可变的,在原始卷积的位置基础上,可变形卷积会产生一个随机方向的位置偏移,如下图所示:

Figure 1

图 1. 可变形卷积

图(a)是原始的卷积核,图(b)是产生了随机方向位置偏移的可变形卷积核,图(c)(d)是图(b)的两种特殊情况。可以看出,这样做的好处是可以提升卷积核的几何变换能力,使其不仅局限于原始卷积核矩形的形状,而是可以支持更丰富的不规则形状。可变形卷积对不规则形状特征提取的效果会更好[1],也更加适用于自然场景的文本识别场景。

傅里叶轮廓线

傅里叶轮廓线是基于傅里叶变换的一种曲线拟合方法,随着傅里叶级数的项数k越大,就引入更多的高频信号,对轮廓刻画就越准确。下图展示了不同傅里叶级数情况下对不规则曲线的刻画能力:

Image

图 2. 傅里叶轮廓线渐进估计效果

可以看出,随着傅里叶级数的项数k越大,其可以刻画的曲线是可以变得非常精细的。

傅里叶轮廓线编码

傅里叶轮廓线编码是《Fourier Contour Embedding for Arbitrary-Shaped Text Detection》论文提出的一种将文本的轮廓的封闭曲线转化为一个向量(vector)的方法,也是FCENet算法需要用到的一种编码轮廓线的基础能力。傅里叶轮廓线编码方法通过在轮廓线上等间距的采样一些点,然后将采样的点的序列转化为傅里叶特征向量。值得注意的是,即使对于同一轮廓线,采样的点不同,对应生成的傅里叶特征向量也不相同。所以在采样的时候,需要限制起始点、间距和方向,保证对同一轮廓线生成的傅里叶特征向量的唯一性。

FCENet算法框架

Image

图 3. FCENet算法框架图

像大多数OCR算法一样,FCENet的网络结构大体可以分为backbone,neck,head三个部分。其中backbone采用可变形卷积版本的Resnet50用于提取特征;neck部分采用特征金字塔[2],特征金字塔是一组不同大小的卷积核,适用于提取原图中不同大小的特征,从而提高了目标检测的准确率,在一张图片中有不同大小的文本框的场景效果比较好;head部分有两条分支,一条是分类分支,用于预测文本区域和文本中心区域的热力图,通过比较该热力图与监督信号的交叉熵作为分类分支的损失值,另一条是回归分支,回归分支预测傅立叶特征向量,该向量用于通过傅立叶逆变换重构文本轮廓,通过计算重构文本轮廓线和监督信号的轮廓线在图像空间的smooth-l1 loss作为回归分支的损失值。

2. 实验结果

MindOCR中的FCENet网络在ICDAR 2015数据集上训练。训练结果如下:

ICDAR2015

模型 环境配置 骨干网络 预训练数据集 Recall Precision F-score 训练时间 吞吐量 单步训练时间 配置文件 模型权重下载
FCENet D910x4-MS2.0-F ResNet50 ImageNet 81.51% 86.90% 84.12% 95.59 s/epoch 10.36 img/s 2978.65 ms/step yaml ckpt | mindir

注释:

  • 环境配置:训练的环境配置表示为 {处理器}x{处理器数量}-{MS模式},其中 Mindspore 模式可以是 G-graph 模式或 F-pynative 模式。
  • FCENet的训练时长受数据处理部分和不同运行环境的影响非常大。
  • 链接中模型FCENet的MindIR导出时的输入Shape为(1,3,736,1280)

3. 快速上手

3.1 安装

请参考MindOCR套件的安装指南

3.2 数据准备

3.2.1 ICDAR2015 数据集

请从该网址下载ICDAR2015数据集,然后参考数据转换对数据集标注进行格式转换。

完成数据准备工作后,数据的目录结构应该如下所示:

.
├── test
│   ├── images
│   │   ├── img_1.jpg
│   │   ├── img_2.jpg
│   │   └── ...
│   └── test_det_gt.txt
└── train
    ├── images
    │   ├── img_1.jpg
    │   ├── img_2.jpg
    │   └── ....jpg
    └── train_det_gt.txt

用户如果想要使用自己的数据集进行训练,请参考数据转换对数据集标注进行格式转换。并配置yaml文件,然后使用单卡或者多卡运行train.py进行训练即可,详细信息可参考下面几节教程。

3.3 配置说明

在配置文件configs/det/fcenet/fce_icdar15.yaml中更新如下文件路径。其中dataset_root会分别和data_dir以及label_file拼接构成完整的数据集目录和标签文件路径。

...
train:
  ckpt_save_dir: './tmp_det'
  dataset_sink_mode: False
  ema: True
  dataset:
    type: DetDataset
    dataset_root: dir/to/dataset          <--- 更新
    data_dir: train/images                <--- 更新
    label_file: train/train_det_gt.txt    <--- 更新
...
eval:
  ckpt_load_path: '/best.ckpt'            <--- 更新
  dataset_sink_mode: False
  dataset:
    type: DetDataset
    dataset_root: dir/to/dataset          <--- 更新
    data_dir: test/images                 <--- 更新
    label_file: test/test_det_gt.txt      <--- 更新
...

【可选】可以根据CPU核的数量设置num_workers参数的值。

FCENet由3个部分组成:backboneneckhead。具体来说:

model:
  resume: False
  type: det
  transform: null
  backbone:
    name: det_resnet50  # 暂时只支持ResNet50
    pretrained: True    # 是否使用ImageNet数据集上的预训练权重
  neck:
    name: FCEFPN        # FCENet的特征金字塔网络
    out_channels: 256
  head:
    name: FCEHead
    scales: [ 8, 16, 32 ]
    alpha: 1.2
    beta: 1.0
    fourier_degree: 5
    num_sample: 50

3.4 训练

  • 单卡训练

请确保yaml文件中的distribute参数为False。

# train fcenet on ic15 dataset
python tools/train.py --config configs/det/fcenet/fce_icdar15.yaml
  • 分布式训练

请确保yaml文件中的distribute参数为True。

# n is the number of GPUs/NPUs
mpirun --allow-run-as-root -n 2 python tools/train.py --config configs/det/fcenet/fce_icdar15.yaml

训练结果(包括checkpoint、每个epoch的性能和曲线图)将被保存在yaml配置文件的ckpt_save_dir参数配置的路径下,默认为./tmp_det

3.5 评估

评估环节,在yaml配置文件中将ckpt_load_path参数配置为checkpoint文件的路径,设置distribute为False,然后运行:

python tools/eval.py --config configs/det/fcenet/fce_icdar15.yaml

3.6 MindSpore Lite 推理

请参考MindOCR 推理教程,基于MindSpore Lite在Ascend 310上进行模型的推理,包括以下步骤:

  • 模型导出

请先下载已导出的MindIR文件,或者参考模型导出教程,使用以下命令将训练完成的ckpt导出为MindIR文件:

python tools/export.py --model_name_or_config fcenet_resnet50 --data_shape 736 1280 --local_ckpt_path /path/to/local_ckpt.ckpt
# or
python tools/export.py --model_name_or_config configs/det/fcenet/fce_icdar15.yaml --data_shape 736 1280 --local_ckpt_path /path/to/local_ckpt.ckpt

其中,data_shape是导出MindIR时的模型输入Shape的height和width,下载链接中MindIR对应的shape值见ICDAR2015注释

  • 环境搭建

请参考环境安装教程,配置MindSpore Lite推理运行环境。

  • 模型转换

请参考模型转换教程,使用converter_lite工具对MindIR模型进行离线转换。

  • 执行推理

假设在模型转换后得到output.mindir文件,在deploy/py_infer目录下使用以下命令进行推理:

python infer.py \
    --input_images_dir=/your_path_to/test_images \
    --det_model_path=your_path_to/output.mindir \
    --det_model_name_or_config=../../configs/det/fcenet/fce_icdar15.yaml \
    --res_save_dir=results_dir

参考文献

[1] Dai, J., Qi, H., Xiong, Y., Li, Y., Zhang, G., Hu, H., & Wei, Y. (2017). Deformable Convolutional Networks. 2017 IEEE International Conference on Computer Vision (ICCV), 764-773.

[2] T. Lin, et al., "Feature Pyramid Networks for Object Detection," in 2017 IEEE Conference on Computer Vision and Pattern Recognition (CVPR), Honolulu, HI, USA, 2017 pp. 936-944. doi: 10.1109/CVPR.2017.106