EAST文本检测详解(paper+code)

 EAST: An Efficient and Accurate Scene Text Detector

作用:做文本检测,适用于旋转Box和四边形

归类:基于分割的文本检测,使用U-net做特征提取,预测score map和geometry map和angle

1.Backbone:

EAST文本检测详解(paper+code)_第1张图片

上图黄色代表特征提取网络,可以是VGG,ResNet,PVANET(作者提到的一个模型),特征提取模型的视野域会影响最终的结果,

EAST文本检测详解(paper+code)_第2张图片

根据不同的任务可以调整视野域,来检测不同长度的文本

上图绿色的部分就是个很经典的特征金字塔结构

EAST文本检测详解(paper+code)_第3张图片

这个地方实现也很简单,以ResNet18为例,在做forward的时候,将当前层的feature保存在一个list里面(上图的f),之后做特征混合的时候按照相反顺序来取就好了,具体如下

EAST文本检测详解(paper+code)_第4张图片

h为resnet18提取的保存在list f[3]中的特征,上采样再卷积后和f[2]cat一下。

好了,后面到了网络的输出了

输出有三部分,第一部分是一个score map,这个用来做文字检测,但是作者对文字区域做了收缩(shrunk),我觉得这个对于连在一起的文本分隔开效果好,类似下下图,当不同行的文本靠的比较近,就容易检测成一团,后续的文本识别就G了

EAST文本检测详解(paper+code)_第5张图片

 

第二部分是距离图,表示某个像素距离其上下左右框的距离,

EAST文本检测详解(paper+code)_第6张图片

EAST文本检测详解(paper+code)_第7张图片

第三部分是一个角度,这个很好生成,就是给一个固定值就好了,可视化的结果就是上图(c)中的结果

生成label代码推荐这个:

https://github.com/SakuraRiven/EAST/blob/master/dataset.py

我在GitHub看的最易读的代码,后续补一下这块解读

inference的代码:

https://github.com/SakuraRiven/EAST/blob/master/detect.py

EAST文本检测详解(paper+code)_第8张图片

首先解析score map,对于score map中大于阈值的像素,取出其坐标,得到一个(N,2)的坐标集合,

xy_text = np.argwhere(score > score_thresh) # n x 2, format is [r, c]

然后,按照x轴顺序对上述N个点排序

xy_text = xy_text[np.argsort(xy_text[:, 0])]

得到按照x排序好的数组,但是y不保证有序

反正知道这个地方得到N个点就好了,然后从geometry map中取出这N个点的上下左右距离图,得到(N,4)的距离

再从geometry map取出这N个点的angle图,得到(N,1)的角度

然后我们来具体看某个点,我们有它的坐标(x,y),它距离上下左右四个框的距离d1,d2,d3,d4,还有框的角度信息angle,

我们利用这些信息预测box的位置

EAST文本检测详解(paper+code)_第9张图片

上述的y_min,y_max,x_min,x_max都是利用当前点预测到的框的信息,然后将这个框做一个旋转(dataset的时候做的一个逆操作),

这个地方的旋转如果不理解的话可以看一下OpenCV中间的getRotationMatrix2D和warpAffine来理解一下,

https://blog.csdn.net/fengbingchun/article/details/51923769

这个博客讲的挺好的

到次我们就可以生产label并从预测的label中得到框的信息了。

后续就是NMS了,因为一个score map中的像素都会做出一个框的预测(这块我不确定。。。。)

反正很多框啦,然后作者这个地方用了一个Locality-Aware NMS

就是先对框做一个加权合并,减少框的数量以后再NMS滤一下

https://zhuanlan.zhihu.com/p/50126479

EAST文本检测详解(paper+code)_第10张图片

你可能感兴趣的:(EAST文本检测详解(paper+code))