EAST: An Efficient and Accurate Scene Text Detector
作用:做文本检测,适用于旋转Box和四边形
归类:基于分割的文本检测,使用U-net做特征提取,预测score map和geometry map和angle
1.Backbone:
上图黄色代表特征提取网络,可以是VGG,ResNet,PVANET(作者提到的一个模型),特征提取模型的视野域会影响最终的结果,
根据不同的任务可以调整视野域,来检测不同长度的文本
上图绿色的部分就是个很经典的特征金字塔结构
这个地方实现也很简单,以ResNet18为例,在做forward的时候,将当前层的feature保存在一个list里面(上图的f),之后做特征混合的时候按照相反顺序来取就好了,具体如下
h为resnet18提取的保存在list f[3]中的特征,上采样再卷积后和f[2]cat一下。
好了,后面到了网络的输出了
输出有三部分,第一部分是一个score map,这个用来做文字检测,但是作者对文字区域做了收缩(shrunk),我觉得这个对于连在一起的文本分隔开效果好,类似下下图,当不同行的文本靠的比较近,就容易检测成一团,后续的文本识别就G了
第二部分是距离图,表示某个像素距离其上下左右框的距离,
第三部分是一个角度,这个很好生成,就是给一个固定值就好了,可视化的结果就是上图(c)中的结果
生成label代码推荐这个:
https://github.com/SakuraRiven/EAST/blob/master/dataset.py
我在GitHub看的最易读的代码,后续补一下这块解读
inference的代码:
https://github.com/SakuraRiven/EAST/blob/master/detect.py
首先解析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的位置
上述的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
完