English | 中文
FCENet: Fourier Contour Embedding for Arbitrary-Shaped Text Detection
FCENet是一种基于分割的场景文本检测算法。在场景文本检测中,基于分割这类算法可以更加准确的描述各种形状的场景文本(比如弯曲形状的文本),而变得越来越流行。 FCENet的一大亮点就是在任意不规则形状的文本场景上表现优异,这得益于它采用了可变形卷积[1]和傅里叶变换技术。 除此之外,FCENet还具有后处理简单和高泛化性的优点,在少量训练数据上训练就可以达到很好的效果。
可变形卷积的思想非常简单,就是将原来固定形状的卷积核变成可变的,在原始卷积的位置基础上,可变形卷积会产生一个随机方向的位置偏移,如下图所示:
图 1. 可变形卷积
图(a)是原始的卷积核,图(b)是产生了随机方向位置偏移的可变形卷积核,图(c)(d)是图(b)的两种特殊情况。可以看出,这样做的好处是可以提升卷积核的几何变换能力,使其不仅局限于原始卷积核矩形的形状,而是可以支持更丰富的不规则形状。可变形卷积对不规则形状特征提取的效果会更好[1],也更加适用于自然场景的文本识别场景。
傅里叶轮廓线是基于傅里叶变换的一种曲线拟合方法,随着傅里叶级数的项数k越大,就引入更多的高频信号,对轮廓刻画就越准确。下图展示了不同傅里叶级数情况下对不规则曲线的刻画能力:
图 2. 傅里叶轮廓线渐进估计效果
可以看出,随着傅里叶级数的项数k越大,其可以刻画的曲线是可以变得非常精细的。
傅里叶轮廓线编码是《Fourier Contour Embedding for Arbitrary-Shaped Text Detection》论文提出的一种将文本的轮廓的封闭曲线转化为一个向量(vector)的方法,也是FCENet算法需要用到的一种编码轮廓线的基础能力。傅里叶轮廓线编码方法通过在轮廓线上等间距的采样一些点,然后将采样的点的序列转化为傅里叶特征向量。值得注意的是,即使对于同一轮廓线,采样的点不同,对应生成的傅里叶特征向量也不相同。所以在采样的时候,需要限制起始点、间距和方向,保证对同一轮廓线生成的傅里叶特征向量的唯一性。
图 3. FCENet算法框架图
像大多数OCR算法一样,FCENet的网络结构大体可以分为backbone,neck,head三个部分。其中backbone采用可变形卷积版本的Resnet50用于提取特征;neck部分采用特征金字塔[2],特征金字塔是一组不同大小的卷积核,适用于提取原图中不同大小的特征,从而提高了目标检测的准确率,在一张图片中有不同大小的文本框的场景效果比较好;head部分有两条分支,一条是分类分支,用于预测文本区域和文本中心区域的热力图,通过比较该热力图与监督信号的交叉熵作为分类分支的损失值,另一条是回归分支,回归分支预测傅立叶特征向量,该向量用于通过傅立叶逆变换重构文本轮廓,通过计算重构文本轮廓线和监督信号的轮廓线在图像空间的smooth-l1 loss作为回归分支的损失值。
MindOCR中的FCENet网络在ICDAR 2015数据集上训练。训练结果如下:
模型 | 环境配置 | 骨干网络 | 预训练数据集 | 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)
。
请参考MindOCR套件的安装指南 。
请从该网址下载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进行训练即可,详细信息可参考下面几节教程。
在配置文件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个部分组成:backbone
、neck
和head
。具体来说:
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
- 单卡训练
请确保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 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
。
评估环节,在yaml配置文件中将ckpt_load_path
参数配置为checkpoint文件的路径,设置distribute
为False,然后运行:
python tools/eval.py --config configs/det/fcenet/fce_icdar15.yaml
请参考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