0导语
上一篇我们已经大致介绍了FAST角点,原始的FAST能处理一些带角点的的字母如L,P,但是很难处理o,和8等情况。以o为例,见下图,像素值会被截成四个部分,这样的话就很难满足原始的Fast角点需要连续多个点都要亮或暗的要求。另外由于Fast角点不是专门为定位文本设计,因此也会有很多的false postives.基于这些观察,FASText作者在Fast角点的基础上定制了两种角点SEK(stroke endingkeypoint)和 SBK(stroke blending keypoint).
不过调试作者的代码之后,如果本人没有理解错,应该是有很严重的bug,相关问题已反应给作者,本文将会跟进,另外也有tricky的东西,本文也会尽量提到。
1 Stroke Ending KeyPoint(SEK)
SEK主要是想得到笔画的起点,终点等特征点,如下图
跟普通的Fast角点非常类似,只不过是它的条件稍微加强了,圆周上k个点,除了需要满足连续n个点都要大于或小于中心点一定阈值t外,其余的k-n个点需要满足跟中心点类似这个条件,代码里默认的是k = 12, n = 9, t=13。由于个人调试的问题,以下的t全部设为了12。
如下图,可以找到连续10个点(黄色)都要小于中心点一定阈值,而剩下的两个点跟中心点的差距在阈值范围内.它期望stroke从Ps(红色点)进入,中心点(绿色点)附近结束,或者是从中心点开始,从Ps的点出去
2 Stroke BlendingKeypoint(SBK)
主要是为了能检测到有一定曲率或拐角这样的stroke点。这些情况下,圆周的像素值会分成4块,如下图:
论文中对SBK的要求是圆周上有且只有四个连续点的集合,Ps(Point similar),Ps',Pd(point darker), Pd' 或者是 Ps,Ps',Pb(point brighter), Pb', 并且Ps和Ps'的点数在[1,3]之间,Pd的点数大于6(或者Pb的点数大于6),Pd'(Pb')的点数要大于0。如下图,假设阈值为12,那么上部连续7个黄点值小于中心点一定阈值以上,所以是Pd,下面是Pd',左右两边的红色点是Ps和Ps'(或者是Ps'和Ps,这个没有关系)。它期望stroke从Ps(Ps')进入,在中心点附近拐弯,然后从Ps'(Ps)出去
3 其他检查
我们先从论文中提到的检查说起,然后再说代码里trick的东西
3.1内部点的检查
第一个检查是内部点的检查。它的出发点是不管是SEK还是SBK,圆周上Ps,Ps'和中心点应该是stroke经过的点,而为了连续性,串联Ps,Ps'和中心点的像素应该也应该是stroke经过的点,那么它们的像素值跟中心点应该也符合相似的条件。
如上面的SEK的图中会检查下面紫色的两个点。
下图中的SBK会检查如下的几个点
3.2外围16个点检查
代码还做了一步论文中没有提到的事情,就是去检查外围的16点。如果外围的16个点符合SEK的Pb(或pd)和SBK的Pb或(Pd)的条件,那么说明这个stroke被困死在了这16个里面,没有延伸出去,基本不符合一个文本笔画的规律,除了一个字只包含内部的这么多个Ps和Ps'点,基本不太现实,因此把这种点过滤掉
通过外围点检查的情况
没通过外围检查的情况
3.3 corner和corner out点检查
代码中这种检查只针对SEK。如下图,青色的为corner点,蓝色的corner out点。这里再次提下SEK的初衷,SEK是想捕获从Ps进入,中心点附近结束,或者是从中心点开始,从Ps的点出去的文本笔画,因此代码中对Ps的点“反方向”的corner和corner out的点进行检查,下图中就是右上和右下的蓝青色点,希望他们也符合黄色点的条件。(个人觉得的其实也可以针对SBK做,不过情况可能要多些)
3.4 NMS
NMS部分跟作者已经确认,论文中是写错的,max应该换成min。它跟Fast中的策略是一样的,找Pb(Pd)与中心点相差最小的作为这个角点的分数,并进行3*3的抑制,不再赘述。
4 Scale问题
原始的Fast的角点是不具有scale不变形的。如果我们的stroke比较粗,那么现在的FASText是检测不出来的,因此需要在很多尺度上处理。论文中是按照一定比例比如1.6下采样,直到缩放图像的最长边不大于30,比如原图像的大小是640*480,,那么包括原图像将有8个scale.另外也可以指定在一个sclae上是否erode,如果用erode,将会有与当前图像同样大小,但是经过erode和dilate处理过的两幅图像(代码默认没做)
5 Grid问题
论文中说的是要把原图切分成一块一块做的,个人不是特别理解,可能是为了并行化处理然后提高速度。另外代码中如果尺度很小,如当前尺度的图片长宽都小于128的时,不会切分。
6代码Bug
如果本人理解没错,论文还是有一些bug的,但是其中最大的当属得到的SEK和SBK的圆周点有可能包含Ps,Pd,Pb三种类型。从论文的理念看,个人觉得这个bug是改变本质的,非常严重,不过暂时作者还没有回复,不太确定。如果个人理解没有错,可以简单插入下面几行代码到FASTex.cpp 408行来解决这个bug
int tmpD = 0;
for (int i = 0; i < 12; ++i)
{
tmpD |= tab[ptr[pixel[i]]];
}
if (3 == tmpD)
{
continue;
}
//作者后面的代码
int d = tab[ptr[pixel[0]]] | tab[ptr[pixel[6]]];
if( d == 0 )
continue;
8 其他部分
由于抽取segment,提取特征和classify等模块没有非常特别的,不再赘述。
9参考文献
参考文献
[1]Buta M. FASText:Efficient unconstrained scene text detector[C]//2015 IEEE InternationalConference on Computer Vision (ICCV). IEEE, 2015: 1206-1214.
[2]Rosten E,Drummond T. Machine learning for high-speed corner detection[C]//Europeanconference on computer vision. Springer Berlin Heidelberg, 2006: 430-443.