Synthetic Data for Text Localisation in Natural Images(论文解读)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Enjoy_endless/article/details/88052594
	最近在做相关任务需要用到一些场景文本图像,于是找到了这篇论文;关于文本图像生成方法的思路还是很清晰的,
	
	不过对于其具体执行、原理等了解掌握还是难度的;下面来稍微梳理一下思路、过程。

这篇论文所做的主要贡献有两点

1.将文本嵌入到自然图片中,生成带有文本的图片。
2.提出一种FRCN的网络来检测文本。

人工文本嵌入图像是有其优点的:可以精确的知道文本的位置及其内容,可以更好地对网络进行训练。

一.文本图像生成

1.输入自然图像
通过Google Image Search获得,不同的 objects/scenes、不同的 indoor/outdoor、不同的 natural/artificial。
在这里插入图片描述
2.输出(带有文本的图片,并且知道其文本的具体位置)
文本从 Newsgroup 20 dataset 中得到,
words,以 空格字符 分隔;
lines,以 换行字符 定义;
在这里插入图片描述

二、语义(seg)与深度(depth)信息的获取

在真实的自然场景图像中,文字是几乎不会跨越两种不同的区域的。因此,本文先对刚刚搜索到的自然背景图像,根据 local colour and texture 进行分割,分割成连续的区域,再将文字嵌入其中某一块区域。

首先需要对原始图片进行特征提取,提取其语义和深度信息

1.语义信息
在这里插入图片描述
采用的是 Contour detection and hierarchical image segmentation 中的 gPb-UCM 算法(阈值: 0.11),采用 Multiscale combinatorial grouping 的实现。

2.深度信息
在这里插入图片描述
自然场景中的文字一般都是在背景图像的表面上的。为了得到相同的效果,文字要根据 local surface normal 去“放置”文本,具体为:本文先通过 Deep convolutional neural fields for depth estimation from a single image 提出的 CNN 模型,获取像素级别的深度图像。再用 RANSAC 去拟合出垂直于法向量的平面。然后就可以将文本安置在平面上,这样文本就较为自然的融入背景图像中了。

三.候选region的选取

获得seg和depth后,需要根据seg和depth对seg中的每个区域进行过滤,选取合适的区域作为放word的候选区域

1.根据seg进行筛选

1)对图片的每个seg进行遍历,利用opencv的minAreaRect求得包住当前seg所有像素点的最小矩形
2)根据矩形的宽和高,过滤掉宽高过小,面积过小,宽高比过小的矩形区域。

2.根据depth进行筛选

  1. 对seg筛选后的区域,进行depth筛选,首先将depth的灰度图(1个channel)转化成xyz(3个channel)形式
    2)遍历seg筛选后的所有seg,希望对每个seg拟合出一个较好的平面,具体来讲每次遍历进行3)、4)、5)、6)
    3)对每个seg随机选取k个点和其附近的p个点(这p个也需要在当前seg中)(代码中选取100个点,并且每个点选4个附近点,则总共(4+1)*100=500个点)
    4)遍历3)中随机选取的k个点,每次得到(p+1)(当前点和附近点),利用ransac算法对(p+1)个点拟合一个3-d平面,计算当前seg中所有点到此平面的距离,并统计算得的距离在一个阈值下的点个数,点数越多,说明当前的平面越能代表此seg。
    5)选取在4)中,统计的点数最多top10个平面,对每个平面中所有在距离阈值之下的点进行ransac,拟合得到最后的10个平面,最后选seg中点到这10个平面最多的一个平面作为当前seg的平面。并获得平面的4个参数(a,b,c,d):表示(x,y,z)轴和偏移量
    6)删除c过小,即投射角度过小的seg
四.对候选region进行图像变换

我们知道,原图中每个seg,都是以一定角度和方向在图片中成像的。因此为了之后方便将word填到图片的seg中去,需要将每个seg进行旋转变换,具体来说:

1)利用opencv的findContours 来获取每个seg的轮廓
2)将轮廓坐标转成3-d形式。并将坐标旋转,使得当前区域在视线的正前方。
3)将选旋转后的区域平铺到平面上,即只保留x,y维信息。
4)将平铺到平面的区域进行旋转,使得用minAreaRect包围的矩形的角度为0。
5)利用opencv的findHomography 对seg平面变换前后的矩阵,计算变换矩阵——单应矩阵(用来在平面上填写word之后的图片,复原的原图)

五.对变换后的region进行填word

获得变换后的region之后,就需要对region进行填word了,这里可以对每张图片生成不同的合成文本图片,也可以对每张图片多个region生成word,主要借助的是pygame,来进行填word。

具体来讲:

1)确定每张图片生成多少张合成图片,以及每张合成图片有几个合成文本区域
2)对于每次文本合成,随机选取1个region作为填word的region
3)随机选择一种字体font,和字体的弯曲程度利用pygame。
4)根据region的平均宽高,设置font的大小
5) 随机从20Newsgroup中选择要合成的文本内容
6)利用pygame,创建一个surface,根据要填写的文本得到一个文本矩形,
7)利用render_to 方法,将本文放到surface平面上(先中间,后两边),最后对放上文本的surface平面,截取文本+pad。作为文本区域。
8)利用scipy.signal.fftconvolve,将文本区域和region进行快速傅里叶变换的碰撞检测。要是存在碰撞,则此region不合适,返回。
9)将碰撞检测后的文本区域通过第四节中第5)得到的单应矩阵变换成符合原图的角度
10)对文本区域,利用opencv的GaussianBlur进行高斯模糊处理。
11)为文本选择一种颜色(随机或者根据region对应的背景颜色选择)
12)将涂色好的文本区域放到原图片中,得到输出图片

二. fully-convolutional regression network ( FCRN )

用 x代表一张图像,最常见的基于 CNN 的检测方法,就是先提出一些图像 region,这些 region 可能包含有待检测的目标,用一个 CNN 模型 来评判 region 是不是待检测的目标。

这种方法,即是 R-CNN 所采用的策略。但因为每张图像都要评判数以千计的 region,R-CNN 的速度很慢,因为 R-CNN 中需要重复计算大量 region proposals 的 score,所以针对这些重复计算,作者提出了 Fast R-CNN 以及后续的 Faster R-CNN

Hough voting 中,独立个体的预测结果通过 image scheme、voting scheme 被汇总起来。YOLO 方法在 PASCAL 或者 ImageNet 上检测物体时,可以从获取背景信息。但是本文发现,对于文本这样又小、多变的情况,并不适用。本文在这里提出了一种介乎于 YOLO、Hough voting 之间的方法。

FCRN 的头几层 layer,计算 text-specific image features。之后上面的网络层,就是 dense regression network。本文的 CNN 结构受启发于 VGG-16,里面包含了又小、又多的 filters。但是,在本文的结构中,发现即使没那么多的 filters,结果也一样好,同时也更有效率。网络结构如下:
在这里插入图片描述
paper中首先是把img都resize成512x512大小的。从上面的结构可以看出,由于有 4个 Max Pooling 层,其最后的 feature map 中,每一个 feature 包含了 16×16pixels 范围内的特征。每 16×16像素范围 feature,有 512个 feature channel

Multi-scale detection

因为刚刚 CNN 的 receptive field 太小了,当图像中的文本区域太大时,就会失效。因此,本文对输入图像做多尺度的检测。缩放尺度为{1,1/2,1/4,1/8}

最后将多尺度下的检测的 bounding box 用 Non-maximal suppression(非极大值抑制)进行取舍融合。

即最后的检测结果为,去掉 overlap 大于一个阈值的 score 较小的那个,即所谓的 Non-Maximal Suppression(非极大值抑制)

Training loss

训练 CNN 网络的 loss 函数,本文如同 YOLO 中所使用的,采用每一个 HΔ×WΔ×7输出的 squared loss term

如果某一个栅格 predictor 中没有 ground-truth 文本,这个 loss会忽略掉除了 c(text/non-text) 以外的所有 params。

Comparison with YOLO

本文的 CNN 结构 FCRN 要比 YOLO 小 30倍有余,因为 YOLO 中 90%参数都在最后的两层全连接层。

同时,由于 YOLO 的全局性(global nature,前面讲过它要采集全局的信息),YOLO 对于不尺度下的 image,都要重新训练,更加加大了 YOLO 模型的大小。实际中,本文的模型只有 44M的大小,而 YOLO 2G的大小,使得 YOLO 也更加难以训练,训练也更加的慢(2×倍慢于本文的 FCRN)。

水平、知识、了解有限,仅供大体了解学习。

具体参考:https://blog.csdn.net/bvl10101111/article/details/76851281
https://blog.csdn.net/u010167269/article/details/52389676

猜你喜欢

转载自blog.csdn.net/Enjoy_endless/article/details/88052594