Paper : https://arxiv.org/abs/2002.10200v2
Code : https://github.com/aim-uofa/AdelaiDet
Code : https://github.com/Yuliang-Liu/bezier_curve_text_spotting
作者交流报告会:https://www.bilibili.com/video/BV1W54y1D7ap?p=8
基于 FPN 的 Anchor-Free 的文本检测模块,连接检测和识别的采样模块,轻量级的识别模块。
使用参数化的 Bezier 曲线 自适应的拟合任意形状的文本
-
为了在图像中准确定位定向的和弯曲的场景文本,首次使用 Bezier 曲线引入了一种新的简洁的弯曲场景文本的参数化表示形式。 与标准边界框表示相比,它引入的计算开销可忽略不计。
-
提出了一种采样方法,也称为 BezierAlign,用于精确的特征对齐,因此识别分支可以自然地连接到整个结构。 通过共享主干特征,可以将识别分支设计为轻型结构。
-
方法的简单性使其可以实时执行推理。 ABCNet 在两个具有挑战性的数据集 Total-Text 和 CTW1500 上实现了最先进的性能,展示了有效性和效率上的优势
Bezier Curve Detection
c ( t ) = ∑ i = 0 n b i B i , n ( t ) , 0 ≤ t ≤ 1 , (1) c(t) = \sum_{i=0}^n b_i B_{i, n}(t), 0 \leq t \leq 1, \tag{1} c(t)=i=0∑nbiBi,n(t),0≤t≤1,(1)
n
n
n 代表角度,
b
i
b_i
bi 代表第
i
i
i 个控制点,
B
i
,
n
(
t
)
B_{i,n}(t)
Bi,n(t) 代表伯恩斯坦基本多项式(Bernstein):
B
i
,
n
(
t
)
=
(
n
i
)
t
i
(
1
−
t
)
n
−
i
,
i
=
0
,
…
,
n
,
(2)
B_{i,n}(t) = \begin{pmatrix} n \\ i\end{pmatrix} t^i (1-t)^{n-i}, i=0,\dots, n, \tag{2}
Bi,n(t)=(ni)ti(1−t)n−i,i=0,…,n,(2)
其中
(
n
i
)
\begin{pmatrix} n \\ i\end{pmatrix}
(ni) 是一个二项式系数。为了用 Bezier 曲线拟合一个文本的多边形形状,从存在的数据集和实际场景中观察了多边形形状的场景文本,发现使用三次的 Bezier 曲线可以有效的拟合不同种类的多边形形状的场景文本。
基于三次 Bezier 曲线,可以把多边形场景文本的检测简化为一个使用 8 个控制点的边框回归。有四个控制点的直文本是多边形场景文本的典型情况。为了保持一致,我们在每个长边的三分点上插入了另外两个控制点。
Δ
x
=
b
i
x
−
x
m
i
n
,
Δ
y
=
b
i
y
−
y
m
i
n
,
(3)
\Delta_x = b_{ix} - x_{min}, \Delta_y = b_{iy} - y_{min}, \tag{3}
Δx=bix−xmin,Δy=biy−ymin,(3)
x
m
i
n
,
y
m
i
n
x_{min}, y_{min}
xmin,ymin 分别代表四个顶点的最小
x
x
x 和最小
y
y
y 。在检测部分,使用一个有16通道的卷积层学习
Δ
x
\Delta_x
Δx 和
Δ
y
\Delta_y
Δy
Bezier Ground Truth Generation
给定曲线边框标注点 { p i } i = 1 n \{p_i\}_{i=1}^n {pi}i=1n , p i p_i pi 代表第 i i i 个标注点,主要目标是获得公式 ( 1 ) (1) (1) 中三次 Bezier 曲线的最优参数。可以简单地应用标准最小二乘法:
[ B 0 , 3 ( t 0 ) … B 3 , 3 ( t 0 ) B 0 , 3 ( t 1 ) … B 3 , 3 ( t 1 ) ⋮ ⋱ ⋮ B 0 , 3 ( t m ) … B 3 , 3 ( t m ) ] [ b x 0 b y 0 b x 1 b y 1 b x 2 b y 2 b x 3 b y 3 ] = [ p x 0 p y 0 p x 1 p y 1 ⋮ ⋮ p x m p y m ] (4) \begin{bmatrix} B_{0, 3}(t_0) & \dots & B_{3,3}(t_0) \\ B_{0, 3}(t_1) & \dots & B_{3,3}(t_1) \\ \vdots & \ddots & \vdots\\ B_{0, 3}(t_m) & \dots & B_{3,3}(t_m) \end{bmatrix} \begin{bmatrix} b_{x_0} & b_{y_0} \\ b_{x_1} & b_{y_1} \\ b_{x_2} & b_{y_2} \\ b_{x_3} & b_{y_3} \end{bmatrix} = \begin{bmatrix} p_{x_0} & p_{y_0} \\ p_{x_1} & p_{y_1} \\ \vdots & \vdots \\ p_{x_m} & p_{y_m} \end{bmatrix} \tag{4} ⎣⎢⎢⎢⎡B0,3(t0)B0,3(t1)⋮B0,3(tm)……⋱…B3,3(t0)B3,3(t1)⋮B3,3(tm)⎦⎥⎥⎥⎤⎣⎢⎢⎡bx0bx1bx2bx3by0by1by2by3⎦⎥⎥⎤=⎣⎢⎢⎢⎡px0px1⋮pxmpy0py1⋮pym⎦⎥⎥⎥⎤(4)
以下图为例,右边一项是标注点,中间一项是要求的贝塞尔曲线的控制点。为了求解控制点,需要算出系数 t ,t 通过折线段的累计长度与七个点的折线段的周长的比值来确定,根据贝塞尔的公式可以求得所有的伯恩斯坦多项式的值,又由于方程的个数大于解的个数,可以通过最小二乘法反解出四个控制点的坐标值。
其中
m
m
m 是曲线边框的标注点的数量。Total-Text 和 CTW1500 ,
m
m
m 分别是 5 和 7 。
t
t
t 是通过使用累积长度与多边形周长之比来计算的。根据公式
(
1
)
(
4
)
(1) (4)
(1)(4) ,把原始多边形标注转变为参数化的 Bezier 曲线。直接使用第一个和最后一个标注点作为第一和最后一个控制点。基于结构化后的 Bezier 曲线边框,可以在没有剧烈变形的情况下很容易地通过 BezierAlign 把曲线文本转为水平文本。
BezierAlign
给定输入特征图和 Bezier 曲线控制点,我们同时处理大小为 h o u t × w o u t h_{out}×w_{out} hout×wout 的矩形输出特征图的所有输出像素。
以位置
(
g
i
w
,
g
i
h
)
(g_{iw}, g_{ih})
(giw,gih) 处的像素
g
i
g_i
gi 为例,可以通过以下公式计算
t
t
t:
t
=
g
i
w
w
o
u
t
t = \frac{g_{iw}}{w_{out}}
t=woutgiw
然后使用
t
t
t 和公式
(
1
)
(1)
(1) 计算 Bezier 曲线的上边界点
t
p
tp
tp 和下边界点
b
p
bp
bp,使用
t
p
tp
tp 和
b
p
bp
bp ,可以通过公式
(
6
)
(6)
(6) 计算出索引采样点
o
p
op
op 的位置:
o
p
=
b
p
⋅
g
i
h
h
o
u
t
+
t
p
⋅
(
1
−
g
i
h
h
o
u
t
)
op = bp \cdot \frac{g_{ih}}{h_{out}} + tp \cdot (1 - \frac{g_{ih}}{h_{out}})
op=bp⋅houtgih+tp⋅(1−houtgih)
通过
o
p
op
op 的位置,我们可以轻松地应用双线性插值来计算结果。
Recognition branch
与主干网络共享特征图,设计了一个轻量级的识别分支
在 TotalText上的结果:
在 CTW1500 上的结果:
文本截取的对比: