本文讲解了CVPR 2019的一篇文字检测算法《Character Region Awareness for Text Detection》的原理,并给出我使用C++和TensorRT重新实现的推理,速度比原版代码快12倍。
论文:https://arxiv.org/pdf/1904.01941.pdf
官方代码:https://github.com/clovaai/CRAFT-pytorch
基于C++和TensorRT的推理代码:https://github.com/yinnhao/CRAFTcpp
目录
- 1. 文字检测数据集情况总结
- 2. Introduction
- 3. Method
- 3.1 输入图片到Score Map的获取
- 3.2. Score Map到检测框的获取
- 3.3 训练
- 4. 基于C++和TensorRT的推理实现
1. 文字检测数据集情况总结
- 矩形框数据集
ICDAR2013:英文;229训练样本+233测试样本;
ICDAR2015:英文;1000训练样本+500测试样本;
ICDAR2017:九种语言(包括中文);7200训练样本+9000测试样本;
MSRA-TD500:英文+中文;300训练样本+200测试样本; - 多边形数据集
TotalText:英文;1255训练样本+300测试样本;内含曲线文本
CTW-1500:英文+中文;1000训练样本+500测试样本;内含曲线文本
2. Introduction
-
文字检测的用途
即时翻译、图像检索、场景解析、地理位置和盲导航 -
基于Bouding Box的文字检测方法的局限性
之前的文字检测方法的都是通过预测bouding box来解决,但是在一些难以处理的情况下,例如弯曲、变形或极长的文本,单个边界框的检测可能很难完成。
-
本文的思路
做到字符级别的感知,通过自下而上的连接相邻字符,可以处理上述难例;
但是前提是需要解决问题:现存的数据集通常都是单词级别的label,不包括字符级别的label; -
方法简介
- 我们的框架被称为Character Region Awareness for Text Detection(CRAFT),即字符区域感知文本检测
- 模型输出两个score map:region score(区域分数) and affinity score(亲和力分数),区域分数用于定位单个字符,亲和力分数用于将单个字符组合成一个实例;
- 为了弥补缺乏字符级别注释的问题,我们提出了一个弱监督的学习框架,该框架可以在现有的实际单词级别数据集中估算字符级别的地面真值
3. Method
3.1 输入图片到Score Map的获取
-
模型基于vgg-16-bn构建,编码+解码结构,类似于Unet
-
模型输出两个score map:region score(区域分数) and affinity score(亲和力分数)。其中region score代表了当前像素点是字符中心点的概率,而affinity score是当前像素点是相邻字符空白区域中心点的概率,一个例子如下图所示。
-
输出的map的分辨率是输入图像的1/2,也就是说模型的输入尺寸(1,3,h,w),输出尺寸为(1,2,h//2,w//2)
3.2. Score Map到检测框的获取
根据需要可以得到下面的3种框。
-
字符级框
字符级的框可以直接根据region socre map使用分水岭算法得到 -
四角点box
- 初始化一个和输入图像一样大的全0矩阵M,若位置p中的两个score值有一个大于对应的阈值,那么就将M§赋值为1;
- cv2.connectedComponents 标记连通域
- cv2.minAreaRect 获取四角点坐标
- 初始化一个和输入图像一样大的全0矩阵M,若位置p中的两个score值有一个大于对应的阈值,那么就将M§赋值为1;
-
多边形框
- 第一步是沿着扫描方向(x方向)找到字符区域的局部极大值线,在图中表示为在椭圆内部且垂直扫描方向的最长线。
- 连接局部极大值的所有中心点的线称为中心线,用黄色表示。
- 将局部极大值线旋转到垂直于中心线的位置,以反映字符的倾斜角,用红色箭头表示。局部极大值线的端点是文本多边形边缘控制点的候选点。
- 为了完全覆盖文本区域,将最倾斜的两条局部极大值线沿着局部极大值中心线向外移动,形成最终的控制点(绿色点)。移动的终止点为刚好左右椭圆相切的地方。
3.3 训练
训练的前提是需要解决数据问题:1.现存的数据集没有score map对应的真实值; 2. 通常也不包括字符级别的label;
-
合成数据集上的label生成
合成数据集上有单个字符的坐标数据,因此可以通过Warp 2D 高斯map的方式构建两个score的label:
区域分数的中心是对角线交点,亲和力分数的中心如上图左图所示,是上三角形中心的连接线; -
真实图像数据集使用Weakly-Supervised Learning
只有单词级别的label,没有字符级别的坐标数据;
对于真实图像数据集,会先对文字部分进行crop,然后使用模型的能力获取score map,并根据字符可划分数量的比例,建立一个confidence map,加入到loss函数中:
-
训练过程
- 在合成数据上先训练50k次迭代,然后在真实数据集上进行微调;
- 微调时,将真实数据以1:5的比例投入使用;
4. 基于C++和TensorRT的推理实现
原版使用pytorch推理,并且在score map到文字框的过程是在cpu上基于opencv完成,效率较低,我基于cuda c++进行了重写,并使用tensorrt推理,目前不支持多边形框。代码在https://github.com/yinnhao/CRAFTcpp