前文已经谈到了有关图像特征与视频特征的特点,以及对图像分类,图像检测等算法应用是如何在网络中计算的,做了解释,下面将延展开对其他的算法应用做大白话解释。
特别是图像分类算法,图像分类算法有很多算法模型比如:vgg,resnet,xception,googlenet,这些算法的核心目的就是提取出图像的特征,而有图像的特征就可以应用到不同的算法应用上,所以很多算法比如目标检测、语义分割等的算法模型,很多都是以及图像分类的算法模型,在其基础上做修改,增加网络结构来实现的。
每一层网络结构都会得到相应大小尺寸的纹理,颜色,形状特征。
3.图像类算法
3.1 图像生成
提及图像生成,先讲解一个与图像生成类似的算佛应用“风格迁移”:
从图像特征的角度来看,不难看出下面这二张图片(一张船车和一个人坐在小溪)的变化,在不改变其图片内容本身的轮廓前提下,把毕加索星空的纹理、颜色特点填充到图片中。就像绘画一样,我们用2B先勾画出一个事物的轮廓,剩下的上色部分就是风格迁移的算法内容了。
以图像分类VGG网络为例: 星空和船车图片分别进入VGG模型,星空图片保留其纹理和颜色特征,,船车图片保留其形状特征,最后将这二个图片特征通过网络结合起来,通过降低loss,使其画看起来更自然。
回到图像生成这部分。
图像生成算法,有二个部分:
- 生成器
- 判别器
生成器:大量图像(以生成人脸为例)加入到网络中,通过网络卷积得到,不同人的人脸特征(皮肤纹理,五官形状,皮肤颜色),再通过网络组合,将不同人的五官(这里的五官可能更微观点,比如说一个鼻子的一小小部分,鼻尖一点点),用这个人的鼻子一点点,那个人的鼻子一点点拼一个鼻子出来,拼起来的人脸肯定很怪异了,所以就有了loss,来平滑这些怪异的地方。以皮肤颜色为例,如果二个块皮肤颜色不对,就可以用loss消除这部分问题。
判别器:判别器更相似将生成器生成的图片与真实的图片,从每个像素的维度来判断二张图片的相似度,但是从网络角度其实判别器就是一个图像分类的算法,我们先将真实的数据加入到判别器,判别器得到了一个能认出这些真实人脸的模型,现在我们将生成器生成的人脸,拿给判别器预测,预测的结果(认出来,没认出来),没认出来,就证明生成器成功了。
3.2 姿态识别
姿态识别其实就是加强版的目标检测和目标识别。 姿态识别,首先把人体的姿态检测出来,然后对检测出来的姿态,做识别处理(类别预测)。
3.2.1 姿态估计
姿态估计可以分为两种思路:
- “top-down”,它指先检测人体区域,再检测区域内的人体关键点。
- “bottom-up”,它指先检测图片中所有的人体关键点,然后将这些关键点对应到不同的人物个体。这里需要提及一下,第一种方案因为需要对检测出的每个人体区域,分别做前向关键点检测,所以速度较慢,而OpenPose采用的则为第二种方案
而关键点检测方法总体上可以分成两个类型,一个种是用坐标回归的方式来解决,另一种是将关键点建模成热力图,通过像素分类任务,回归热力图分布得到关键点位置。
以openpose算法为例: 咋一看,很复杂,我们拆解一下:
- 首先是通过图像分类基础的网络vgg获得图像的特征F
- 特征F,分别到Branch1网络结构和Branch2网络结构输出
S
1
S^1
S1,
L
1
L^1
L1,这一过程叫做stage 1
- 将特征F,和
S
1
S^1
S1,
L
1
L^1
L1分别到Branch1网络结构和Branch2网络结构输出
S
2
S^2
S2,
L
2
L^2
L2,这一过程叫做stage 2
- 一直迭代,将特征F,和
S
t
?
1
S^{t-1}
St?1,
L
t
?
1
L^{t-1}
Lt?1分别到Branch1网络结构和Branch2网络结构输出
S
t
S^t
St,
L
t
L^t
Lt,这一过程叫做stage t,t=17。
- S表示17个关节点集合,L表示两两关节点组合的集合。
Branch1网络和Branch2网络输出的S和L,就是下图的b和c,分别对应单个关节点的热力图,和两两关节点之间的骨骼区域
获取单个关节点热力图(heatmap):因为我们的训练集是已经标注好姿态各节点和骨骼区域的图片,因此,在网络中,同样我们可以做目标检测去检测各个节点的位置情况,同时单个节点检测的图像转化为热力图,一共有19个关节点,所以有一共有19个热力图。这里的热力图大小的值其实就是对应检测的置信度
两两关节点之间的骨骼区域(vectormap):对于骨骼区域内的每一个像素,使用2D向量同时表征位置和方向信息,这里的方向指代当前骨骼对应的关节点对的连接方向,vectormap是heatmap的两倍为38个(19*2),因为有19条的关键点连接线,每一条线使用向量表示,分别有x轴的map,以及y轴的map 关节拼接:由上面步骤得到不同关节点相连接的骨骼区域,因为我们的训练集是已经标注好姿态各节点和骨骼区域的图片,这里相当于对38个骨骼区域做图像相似度计算。将相似度高的,留下,剩下的就是我们的姿态了。
3.2.2 动作分类
动作分类就很简单了,就是最简单if语句判断了,当我们知道各个关节点的时候,就可以通过各关节之间的夹角结合实际场景下,来判断这个图片里的动作是什么动作。
比如下面张图片,角度1大概100度,角度3大概180,可以判断这个是站立的姿态。
3.3 深度估计
3.3.1 监督学习
上图就是深度估计算法输出的结果,能发现深度估计,跟图像分割很相似,图像分割是基于不同类别的事物,深度估计是基于事物的远近做分割。
所以深度估计算法就是利用一张或者唯一视角下的RGB图像,估计图像中每个像素相对拍摄源的距离。
深度估计其实是利用RGB图像与事物实际距离(一张图片的形成拍摄它的摄像机到照片内容的距离)之间存在着的某种映射关系。
再将深度估计算法前,先介绍二个在网络中经常使用的卷积方式:
-
上采样:主要目的是放大原图像,从而可以显示在更高分辨率的显示设备上 -
下采样:1、使得图像符合显示区域的大小;2、生成对应图像的缩略图 多个下采样卷积,一层叠层的组合也被叫做Encoder
多个上采样卷机,一层叠层的组合也被叫做Decoder
Encoder与Decoder是在做图像分割必须的要有的结构,至于图像分割与深度估计在结构上的二者区别,下图应该能够很好的说明了:
我们的任务就是,确定一个衡量拍摄源远近的值,类似于下图红圈的部分 这个值,可以通过图像的特征信息,纹理来判断,知道摄影的,就明白景深的作用
比如下图的1号点与2号点,纹理一个宽一个窄,或者3号点与4号点,颜色,4号点绿色明显比3号点颜色深。
加上我们会加入许多标注好的训练数据,模型更能更好学习在同样类似场景下,拍摄源的远近。
3.3.2 无监督学习
无监督这块,主要用的数据集是视频,利用视频中运动的物体,前后的图像特征变化,来判断拍摄源场景下的远近。
为什么会有很多彩色的图像 因为最后网络处理后的结果是一张灰度图,我们都知道,颜色映射到像素上,如下图所示,我们得到一张灰度的深度估计图,在对应与一个彩色的图像,融合,就有了实际我们看到的深度估计图像。
3.4 文字识别
文字识别,从算法应用上,实际中一般首先需要通过文字检测定位文字在图像中的区域,然后提取区域的序列特征,在此基础上进行专门的字符识别。
因此文字识别分为:
3.4.1 文本检测
文本检测与目标检测领域的常用检测方法相当,分为one-stage和two-stage方法,one-stage是直接回归物体的类别概率和位置坐标值,准确度很低。two-stage就是上文提到的先做候选框,在做图像分类。
做过文本检测,可以发现,我们一般用的训练数据,跟做目标检测用的数据集类似,与之不同的部分是,候选框的类型不同(以CTPN算法为例):
数据集: 候选框:
3.4.2 序列特征
再介绍不规则字符处理前,补充一个图像中的特征信息,序列特征
为什么图像中要有序列特征呢?
其实跟我们做文本分类,文本分词一样,连续的语句要划分出来。比如以下面这个图为例。 如果不考虑序列特征,可能检测出来是这样的: 但是考虑了时序特征,检测出来就是这样的: 由于文字信息是由 “字符、字符的一部分、多字符” 组成的一个序列,所以文字这个检测目标并不是独立、封闭的,而是有前后关联的,因此在 CTPN 中采用了 RNN(Recurrent Neural Networks,循环神经网络)来利用前后文的信息进行文本位置的预测
直接来说,在做处理图像特征时,要考虑这个特征周边的特征情况,才能更精确的捕捉到所有有效的特征。
因此CTPN网络算法中,步骤如下:
- 跟图像分类一样,提取图像每个部分的图像特征
- 将每个图像特征块周围的8个图像特征,组合成一个,形成一个3x3的图像特征(这个就是序列特征啦),最后将所有组合成3x3的序列特征,按照图片从上到下,从左到右,以全连接的方式,组合到一起,成为整个图像的序列特征。
- 最后一步就是对这些特征做图像分类的任务啦。第一个 2k vertical coordinate 和第三个 k side-refinement是用来确定字符位置的小的矩形框,上面示意图中的红色小长框,宽度固定,默认为 16),第二个 2k scores 表示的是 k 个 anchor 的类别信息(是字符或不是字符)
3.4.3 字符识别
字符识别与目标检测部分的目标识别,方法类似,但是通常我们的训练集数据,是单个字符,单个数字的数据,比如下面这样的。 但是我们检测出的字符,大多是一个词语,由几个字符共同组成,比如说我们识别出的是一串身份证号,我们的训练数据集不可能是各种各样的身份证号图片吧🤣 所以我们在识别时,需要一个重要的步骤,准确的分割字符,
|