通常OCR中,文字检测都是由目标检测继承而来,目标检测大多都是基于先验框的(anchor base),近期出现的no-anchor模式本质上也是基于先验框的。anchor-base模式在目标检测衍生到OCR领域就有很多缺陷,比如:倾斜(或扭曲)文字检测不准、过长文字串检测不全、过短文字串容易遗漏、距离较近的无法分开等缺点。近期,渐进式扩展网络(PSENet)横空出世,以另一种思路解决了这些问题,下面我们来梳理一下该模型,不妥之处敬请指正。
模型概述
PSENet是一种新的实例分割网络,它有两方面的优势。 首先,psenet作为一种基于分割的方法,能够对任意形状的文本进行定位.其次,该模型提出了一种渐进的尺度扩展算法,该算法可以成功地识别相邻文本实例(该算法在下文会详细介绍)。
整体框架

如上图所示该模型主干网络使用ResNet系列(可以根据自己需要调整),输入图像维度为: [ B , 3 , H , W ] [B, 3, H, W] [B,3,H,W],通过下采样,特征融合,上采样,最后得到得到与原图片尺寸相同的输出F,维度大小为: [ B , C , H , W ] [B, C, H, W] [B,C,H,W],其中C的大小为确定的kernel_num,这里记为n, 这样就得到最终的 S 1 . . . S n S_1...S_n S1...Sn图片,然后利用广度优先算法从 S 1 S_1 S1开始,到 S n S_n Sn结束,获取到最终的文本连通域。其中连通域的数量在 S 1 S_1 S1中就已经确定, S 1 S_1 S1是预测的图片中目标文字的核心区域(并不是全部范围)。
算法介绍
该论文提出了渐进式尺度扩展算法,我们将每个文本实例分配给多个预测的分割区域,记作 S 1 . . . . . . S n S_1......S_n S1......Sn。我们将这些分割区域表示为本文中的“核”,并且对于一个文本实例,有几个对应的内核。每个内核与原始的整个文本实例共享相似的形状,并且它们都位于相同的中心点但在比例上不同。这些“核“对应的Ground Truth的产生流程如下:

如上图所示:(a)中
p
i
p_i
pi为第
i
i
i个核,
p
n
p_n
pn是第
n
n
n个核,
d
i
d_i
di为
p
i
p_i
pi与
p
n
p_n
pn边缘之间的距离;(b)为最原始的文本区域;©为产生的多个分割区域。
如何得到分割实例对应的label呢?为了依次获得例如图©中的缩小的掩模,我们利用Vatti clipping algorithm来缩小原来的多边形
p
n
p_n
pn的
d
i
d_i
di像素,并得到缩小多边形
p
i
p_i
pi (见图(a))。随后,每个缩小的多边形
p
i
p_i
pi被转换成一个0/1的二进制掩码,用于分割标签的Ground Truth。我们将这些Ground Truth分别表示为
G
1
.
.
.
.
.
G
n
G_1.....G_n
G1.....Gn。从数学上讲,如果我们认为比例是
r
i
r_i
ri,那么
p
n
p_n
pn与
p
i
p_i
pi之间的范围
d
i
d_i
di可以计算为:
d
i
=
A
r
e
a
(
p
n
)
(
1
−
r
i
2
)
P
e
r
i
m
e
t
e
r
(
p
n
)
d_i = \frac{Area(p_n)(1-r_i^2)}{Perimeter(p_n)}
di=Perimeter(pn)Area(pn)(1−ri2)
其中
A
r
e
a
(
p
n
)
Area(p_n)
Area(pn)为多边形
p
n
p_n
pn的面积,
P
e
r
i
m
e
t
e
r
(
p
n
)
Perimeter(p_n)
Perimeter(pn)为多边形
p
n
p_n
pn的周长,
r
i
r_i
ri为
p
n
p_n
pn与
p
i
p_i
pi之间的比例。
r
i
r_i
ri的计算如下:
r
i
=
1
−
(
1
−
m
)
∗
(
n
−
i
)
n
−
1
r_i = 1 - \frac{(1-m)*(n-i)}{n-1}
ri=1−n−1(1−m)∗(n−i)
其中
m
m
m为缩小比例,取值范围在(0, 1];
n
n
n为文本分割实例的数量,即”核“的数量。
对于预测的n个分割实例
S
1
.
.
.
.
.
.
S
n
S_1......S_n
S1......Sn,为了得到最终的检测结果,我们采用了渐进的尺度扩展算法。 它基于广度优先搜索(BFS), 由三个步骤组成:
- 从具有最小尺度的核 S 1 S_1 S1开始(在此步骤中可以区分实例,不同实例有不同的连通域);
- 通过逐步在较大的核中加入更多的像素来扩展它们的区域;
- 完成直到发现最大的核。
模型输出的为7个核,把这7个核输出展示如下(从右到左依次减小):


该算法的具体图解如下:

由于正常情况下非文本区域远大于文本区域,所以使用二分类的交叉熵损失会使得结果更加偏向于非文本区域,因此该模型中使用了dice coefficient。定义如下:
D
(
S
i
,
G
i
)
=
2
∗
∑
x
,
y
(
S
i
,
x
,
y
∗
G
i
,
x
,
y
)
∑
x
,
y
S
i
,
x
,
y
2
+
∑
x
,
y
G
i
,
x
,
y
2
D(S_i, G_i) = \frac{2*\sum_{x, y}(S_{i, x, y}*G_{i, x, y})}{\sum_{x, y}S_{i, x, y}^2+\sum_{x, y}G_{i, x, y}^2}
D(Si,Gi)=∑x,ySi,x,y2+∑x,yGi,x,y22∗∑x,y(Si,x,y∗Gi,x,y)
S
x
,
y
S_{x, y}
Sx,y为预测实例中像素点(x, y)的值,
G
x
,
y
G_{x, y}
Gx,y为label中像素点(x, y)的值。
该模型定义了新的损失函数,损失计算如下:
L
=
λ
L
c
+
(
1
−
λ
)
L
s
L = \lambda L_c + (1-\lambda)L_s
L=λLc+(1−λ)Ls
L
c
L_c
Lc为文本区域分类损失,
L
s
L_s
Ls为收缩文本实例损失,计算方式如下:
L
c
=
1
−
D
(
S
n
∗
M
,
G
n
∗
M
)
L
s
=
1
−
1
n
−
1
(
∑
i
=
1
n
−
1
D
(
S
i
∗
W
,
G
i
∗
W
)
)
W
=
{
1
i
f
S
n
,
x
,
y
>
=
0.5
0
o
t
h
e
r
w
i
s
e
\begin{aligned} &L_c = 1 - D(S_n*M, G_n*M)\\ &L_s = 1 - \frac{1}{n-1}(\sum_{i=1}^{n-1}D(S_i*W, G_i*W))\\ &W=\begin{cases} 1\space\space\space if \space S_{n, x, y} >= 0.5 \\ 0\space\space\space otherwise \end{cases} \end{aligned}
Lc=1−D(Sn∗M,Gn∗M)Ls=1−n−11(i=1∑n−1D(Si∗W,Gi∗W))W={1 if Sn,x,y>=0.50 otherwise
M
M
M的取值采用在线难例挖掘(online hard example miniing,OHEM)的方式生成,也是一个0/1的掩码。OHEM算法的核心思想是根据输入样本的损失进行筛选,筛选出难例,表示对分类和检测影响较大的样本,然后将筛选得到的这些样本应用在随机梯度下降中训练。具体到该模型中,选取所有正样本(主要是正样本本来就偏少,所以就全取)以及困难样本,过滤掉easy的负样本。被选中的像素点取值为1,未选中的取值为0。
最后说一些感受,OCR中文本检测本人用过YOLO、CTPN、PSENet。对于这三个模型的感受是,YOLO和CTPN的检测速度较快,PSENet的检测速度稍慢,YOLO对于长文本或短文本的很容易出现缺损或丢失的情况,CPTN在长短文本方面效果好一些,但是文本对齐效果不理想,PSENet在检测效果方面是碾压了前两者的。PSENet不仅适应任意角度的文本检测,而且对近距离文本分割效果更好。