人脸检测与人脸识别

基本概念

  • 人脸是个人重要的生物特征,业界很早就对人脸图像处理技术进行了研究。人脸图像处理包括人脸检测、人脸识别、人脸检索等。人脸检测是在输入图像中检测人脸的位置、大小;人脸识别是对人脸图像身份进行确认,人脸识别通常会先对人脸进行检测定位,再进行识别;人脸检索是根据输入的人脸图像,从图像库或视频库中检索包含该人脸的其它图像或视频

人脸检测与识别的应用

  • 实名认证
  • 人脸考勤
  • 刷脸支付、刷脸检票
  • 公共安全:罪犯抓捕、失踪人员寻找

传统人脸检测与人脸识别方法

人脸检测

  • 基于知识的人脸检测法。它将典型的人脸形成规则库对人脸进行编码。通常, 通过面部特征之间的关系进行人脸定位。
  • 基于模板匹配的人脸检测法。存储几种标准的人脸模式, 用来分别描述整个人脸和面部特征;计算输入图像和存储的模式间的相互关系并用于检测。
  • 基于特征的人脸检测法。是在姿态、视角或光照条件改变的情况下找到存在的结构特征, 然后使用这些特征确定人脸。
  • 基于外观的人脸检测法。与模板匹配方法相反, 从训练图像集中进行学习从而获得模型(或模板) ,并将这些模型用于检测。

人脸识别

  • 几何特征分析法。首先,提取目标的特征,并将所有得到的特征值组合形成一个向量;然后利用某种距离公式进行比较匹配。
  • 主成分分析法。提取出图像数据主成分,得到特征向量(特征脸)在进行比对和识别。主成分分析法原理简单,容易编程实现,并且识别效果较好;但该方法易受光照、尺度、旋转等因素影响。
  • 弹性匹配法。属于动态模板匹配法的一种,模板可有多种表示方法,该方法受图像的形变影响小,且受光照、面部表情、图像尺寸等因素的干扰较小,不足之处在于识别速度慢。
  • 传统人脸检测、识别在特征提取、精确度、可扩展性方面均有诸多不足,进入深度学习时代后,逐渐被深度学习技术所取代。

人脸数据集介绍

SFC数据集

  • Social Face Classification(社交人脸分类,简称SFC)数据集是从一个流行的社交网络中收集的人脸数据集,包括440万张经过标记的人脸,来自4030人,每个人有800到1200张人脸图像,其中每个身份的最新5%的脸图像被排除在外进行测试。这是根据图像的时间戳来完成的,以模拟通过老化进行的连续识别。

LFW数据集

  • Labeled Faces in the Wild(经标注的自然条件人脸,简称LFW)包含5749位名人的13323张网络照片,这些照片分为6000对人脸,分为10组。常用作无约束环境中进行人脸验证的基准数据集。

YTF数据集

  • YouTube Faces(YTF)收集了1595个主题的3425个YouTube视频(LFW中名人的子集)。这些视频被分成5000个视频对和10个分割,用于评估视频级别的人脸验证在SFC中,人脸识别是由人来标记的,通常包含大约3%的错误。SFC数据集照片在图像质量、光线和表情方面的变化甚至比LFW和YTF中名人的网络图像更大,后者通常是由专业摄影师而不是智能手机拍摄的。

CelebA数据集

  • Large-scale CelebFaces Attributes (CelebA)数据集是由香港中文大学汤晓鸥教授实验室公布的大型人脸识别数据集。该数据集包含有200K张人脸图片,人脸属性有40多种,主要用于人脸属性的识别。

WIDER Face数据集

  • 2015年由香港中文大学发布,包含32203张图像、393703张人脸,在面部的尺寸、姿势、遮挡、表情、妆容和光照上都有很大的变化,自发布后广泛应用于评估性能比传统方法更强大的卷积神经网络。

人脸检测

MTCNN模型

  • Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks(基于多任务级联卷积网络的联合人脸检测与对准,MTCNN),是一个优秀的人脸检测模型,该模型通过三个阶段精心设计的深度卷积网络,以粗略到精细的方式检测面部位置。

步骤

  • 第一阶段:通过浅层CNN快速生成候选窗口。
  • 第二阶段:通过更复杂的CNN拒绝大量非面部窗口来细化窗口。
  • 第三阶段:使用更强大的CNN再次细化结果并输出五个面部标志位置。

MTCNN_图1.png

网络结构

MTCNN_图2.png

  • Proposal Network(P-Net):提议网络,该完全卷积网络来获得候选面部窗口及其边界框回归向量。 然后基于估计的边界框回归向量校准候选者。 之后,我们采用非最大抑制(NMS)来合并高度重叠的候选者。
  • Refine Network(R-Net):精炼网络(R-Net),它进一步拒绝大量错误候选者,使用边界框回归执行校准,并进行NMS。
  • Output Network(O-Net):输出网络,这个阶段类似于第二阶段,但在这个阶段,我们的目标是识别更多监督的面部区域。 特别是,该网络将输出五个面部坐标点。

训练

MTCNN利用三项任务来训练CNN探测器:

  • 面部/非面部分类
  • 边界框回归
  • 面部标记定位
  1. 面部分类。学习目标被制定为二类分类问题。 对于每个样本,使用交叉熵损失函数:

MTCNN_公式1.png

  • 其中\(p_i\)是网络产生的概率,表明样本是网络产生的概率,表明样本\(x_i\)是一个人脸。 符号 \(y^{det}_i∈{0,1}\)表示真实标签。
  1. 边界框回归。对于每个候选窗口,我们预测它与最近的真实值之间的偏移(即边界框的左边,顶部,高度和宽度)。 学习目标被指定为回归问题,我们对每个样本使用欧几里德损失\(x_i\):

MTCNN_公式2.png

  • 其中\(\hat{y}_i^{box}\) 是真实坐标。 有四个坐标,包括左上角,高度和宽度,因此\(y^{box}_i∈ \mathbb{R}^4\).
  1. 面部标记定位。类似于边界框回归任务,面部标记检测被公式化为回归问题,我们最小化欧几里德损失:

MTCNN_公式3.png

  • 其中 \(\hat{y}_i^{landmark}\)是从网络获得的面部标记坐标,\(y_i^{landmark}\)是第i个样本的真实坐标。 有五个面部标志,包括左眼,右眼,鼻子,左嘴角和右嘴角,因此\(y_i^{landmark} \in \mathbb{R}^1 0\).
  1. 多源训练。由于在每个CNN中使用不同的任务,因此在学习过程中存在不同类型的训练图像,例如面部,非面部和部分对齐的面部。 在这种情况下,不使用一些损失函数(即,等式(1) - (3))。 例如,对于背景区域的样本,仅计算$L_i{det}$,而另外两个损失设置为0.这可以直接使用样本类型指示符来实现。 然后整体学习目标可以表述为:

MTCNN_公式4.png

  • 其中N是训练样本的数量,\(a_j\)表示任务重要性。 在P-Net和R-Net中使用\((a_{det}=1,a_{box}=0.5,a_{landmark}=0.5)\),而在O-Net中使用\((a_{det}=1,a_{box}=0.5,a_{landmark}=1)\)以获得更准确的面部标记本地化. \(\beta_i^j \in{0,1}\) 是样本类型指示器。

结论

  • 查准率:95.04%
  • 召回率:85.1%
  • 速度:99 FPS

单样本学习模型

孪生网络

概述

  • 孪生网络(Siamese network)又称“连体网络”,有两个结构相同(两个网络可以是CNN,也可以是LSTM等),且共享权值的子网络。分别接受两个输入\(x_1, x_2\),将其转换为某种向量\(G_w(x_1), G_w(x_2)\),再通过某种距离度量的方式计算两个输出向量的距离\(E_w\).如下图所示:

siamese_0.png

"孪生网络"一词的由来:

  • 十九世纪泰国出生了一对连体婴儿,当时的医学技术无法使两人分离出来,于是两人顽强地生活了一生,1829年被英国商人发现,进入马戏团,在全世界各地表演,1839年他们访问美国北卡罗莱那州后来成为“玲玲马戏团” 的台柱,最后成为美国公民。1843年4月13日跟英国一对姐妹结婚,恩生了10个小孩,昌生了12个,姐妹吵架时,兄弟就要轮流到每个老婆家住三天。1874年恩因肺病去世,另一位不久也去世,两人均于63岁离开人间。两人的肝至今仍保存在费城的马特博物馆内。从此之后“暹罗双胞胎”(Siamese twins)就成了连体人的代名词,也因为这对双胞胎让全世界都重视到这项特殊疾病。

孪生网络的用途

  • 孪生网络主要用于单样本或样本较少的模型训练,用于衡量两个输入数据的相似程度。孪生网络有两个输入(\(x_1和x_2\)),将两个输入到两个相同且权重共享的网络中,这两个网络分别将输入映射到新的空间,形成输入在新的空间中的表示。通过Loss的计算,评价两个输入的相似度。例如:
  • 词汇或文本的语义相似度分析;
  • QA中question和answer的匹配;
  • 签名或人脸的比对、验证。
  • 例如,在人脸比对中,如果输入的两幅人脸图像\(X_1和X_2\)为同一个人,那么映射到新的空间的两个向量距离足够小;反之,如果\(X_1和X_2\)不为同一个人,两个向量距离足够大。

损失函数

  • 孪生网络采用对比损失函数(contrastive loss),其表达式如下:

siamese_loss_1.png

  • 其中,\(D_W\)被定义为姐妹孪生网络的输出之间的欧氏距离。\(D_W\)欧式距离公式如下:

siamese_loss_2.png

  • \(G_W\)是其中一个姐妹网络的输出。\(X_1\)和\(X_2\)是输入数据对;
  • Y值为1或0。如果模型预测输入是相似的,那么Y的值为0,否则Y为1。当Y=0时(输入是相似的),函数的值为前半部分;当Y=1时(输入不相似),函数的值为后半部分;
  • max()是表示0和\(m-D_w\)之间较大值的函数;
  • m是大于0的间隔值(margin value)。有一个边际价值表示超出该边际价值的不同对不会造成损失。这是有道理的,因为你只希望基于实际不相似对来优化网络,但网络认为是相当相似的。

2. 三元网络(Triplet Network)

概述

  • Triplet Network是Siamese Network的一种延伸,要解决的问题与Siamese Network的基本一致,主要用于单样本或样本较少的模型训练。与孪生网络不同的是,Triplet Network采用三个样本为一组:一个参考样本(也称为锚点样本),一个同类样本(正样本),一个异类样本(负样本)。Triplet Network网络将输入映射到某个特征空间中,使得参考样本与正样本距离足够小、与负样本足够大。

网络结构

  • Triplet Network结构图如下所示:

triplet_network_1.png

  • Triplet Network由3个相同的前馈神经网络(彼此共享参数)组成;
  • 输入x为参考样本,\(x^-\)为负面样本,\(x^+\)为正面样本;
  • 网络会输出两个值:参考样本与负面样本、正面样本的特征向量的距离。

triplet_network_2.png

损失函数

  • Triplet Network的损失函数称为Triplet Loss(三元损失),包含参照样本、正面样本、负面样本之间的距离。\(||f(A)-f(P)||^2\)表示参照样本与正向样本的距离,\(||f(A)-f(N)||^2\)表示参照样本与负面样本的距离。我们希望参照样本与正向样本的距离足够小,与负面样本的距离足够大,即:

$$||f(A)-f(P)||^2 <= ||f(A)-f(N)||^2$$

  • 为了避免两个表达式为0的情况(同时为0也满足该表达式),需要作出一些调整,参照样本与正向样本的距离值比起与负面样本的距离需大于某个常数值,所以表达式变为:

$$||f(A)-f(P)||^2 + \alpha <= ||f(A)-f(N)||^2$$

  • 其中,\(\alpha\)为一个超参数,称为间隔(margin)。将等式右边移项到左边:

$$||f(A)-f(P)||^2 - ||f(A)-f(N)||^2 + \alpha <= 0$$

  • 所以为了定义这个损失函数,我们取这个和0的最大值:

$$L(A, P, N) = max(||f(A)-f(P)||^2 - ||f(A)-f(N)||^2 + \alpha, 0)$$

  • 在训练中,为了使得效果更好,通常选择更难训练的三元组\((A, P, N)\)进行训练。所谓难训练的三元组就是选择的三元组\(d(A, P)\)很接近\(d(A, N)\),即\(d(A, P) \approx d(A, N)\),在训练时竭力使式子右边部分变大,左边部分变小,使得左右至少有一个\(\alpha\)的距离。并且,比起随机选择的三元组,这样的三元组还可以增加模型的学习算法的计算效率。

人脸识别

DeepFace(2014)

概述

  • DeepFace是Facebook研究人员推出的人脸验证模型,是深度学习技术应用于人脸识别的先驱。模型深度9层,超过1.2亿个参数。在LFW数据集上识别率达到97.25%,接近人类识别能力。

人脸对齐处理

  • 和大多数模型一样,DeepFace采用基准点检测器指导对齐过程。在该模型中,使用了一个相对简单的基准点检测器,经过多次迭代来优化输出。在每一次迭代中,通过训练支持向量回归器(SVR)从图像描述中预测点的结构来提取基准点。

DeepFace_图1.png

  • 检测人脸6个基准点(眼睛2个、鼻尖1个、嘴巴3个)
  • 裁剪人脸部分
  • 在裁剪出的人脸中,使用67个基准点进行三角剖分
  • 将二维对齐裁剪图像转换为三维参考形状
  • 对三维形状进行旋转,生成正面二维图像

网络结构

  • DeepFace网络结构如下图所示:

DeepFace2.png

  • 输入:152*152经过预处理3D对齐的3通道面部图像
  • 第一层:卷积层(论文中称为C1),采用32个11*11卷积核进行卷积,输出32个142*142的特征图
  • 第二层:池化层(M2),以步幅为2执行最大池化操作,输出32个71*71的特征图
  • 第三层:卷积层(C3),采用16个9*9卷积核进行卷积,输出16个63*63的特征图
  • 以上三层主要提取底层特征,例如简单边沿、纹理。
  • 第四/五/六层:局部连接层(L4/L5/L6),滤波器组,像卷积层一样,应用滤波器组,但是特征映射中的每个位置都学习不同的滤波器组。局部层的使用不会影响特征提取的计算负担,但会影响训练参数的数量。
  • 第七/八层:全连接层(F7/F8),用来捕获在面部图像的远处部分捕捉到的特征之间的相关性,例如眼睛的位置和形状以及嘴的位置和形状。最后一个全连接层在Softmax函数作用下产生K路输出。

效果

  • LFW数据集实验效果
  • DeepFace在LFW数据集上实验准确率与效果图ROC(Receiver Operating Characteristic)曲线如下所示:

DeepFace_表3.png

DeepFace_图3.png

  • YTF数据集实验效果
  • DeepFace还在视频级人脸验证数据集上进行了进一步验证。YouTube视频帧的图像质量通常比网络照片差,主要是由于运动模糊或观看距离。为每对训练视频创建50对帧,每个视频一对,并根据视频训练对标记这些帧是否相同。DeepFace取得了91.4%的准确度,将先前的最佳方法的误差减少了50%以上。如下图所示:

DeepFace_表4.png

DeepFace_图4.png

计算效率

  • 单核Intel 2.2GHz CPU,DeepFace每幅图像运行0.33秒,包括图像解码、人脸检测和对齐、前馈网络和最终分类输出。

FaceNet(2015)

概述

  • FaceNet是Google研究人员2015年推出的人脸识比对模型。其思想是将人脸照片转换为128-D的向量,判断向量之间的距离(差异),如果距离大于某个值,则认为不是同一个人的人脸图像;如果距离小于某个值,则认为是同一个人的人脸图像。

FaceNet_图1.png

模型结构

  • FaceNet模型结构如下图所示:

FaceNet_图2.png

  • 批量输入层:输入一个批次的样本;
  • 深度CNN:用来提取数据特征,然后进行L2标准化,输出向量特征(嵌入)。该部分可以采用不同的CNN模型;作者原论文中给出了两种CNN结构,并对性能进行了对比;
  • 三元损失函数:接收特征向量,构建三元损失函数,使得Anchor-Positive之间的距离足够小,Anchor-Negtive之间的距离足够大。

FaceNet_图3.png

损失函数

  • FaceNet采用三元损失函数,表达式如下:

$$||f(x_i^a)-f(x_i^p)||^2_2 + \alpha <= ||f(x_i^a)-f(x_i^n)||^2_2$$

$$\forall f(x_i^a), f(x_i^p), f(x_i^n) \in T$$

  • 其中,\(x^a_i\)表示锚定样本(参考样本),\(x^p_i\)表示正样本,\(x^n_i\)表示负样本。\(||f(x_i^a)-f(x_i^p)||_2\)表示参考样本与正样本间距离的L2范数(欧式距离)。\(T\)是训练集中所有可能的三元组的集合,具有基数N。训练优化的目标损失函数为:

$$\sum_i^N[\ \ ||f(x_i^a)-f(x_i^p)||^2_2 - ||f(x_i^a)-f(x_i^n)||^2_2 + \alpha\ \ ]$$

  • 在训练过程中,为了让模型快速收敛,通常选择难训练的三元组样本进行训练,即\(argmax \ x_i^p(||f(x_i^a)-f(x_i^p)||^2_2)\)或\(argmin \ x_i^n(||f(x_i^a)-f(x_i^n)||^2_2)\). 实际训练中,采用从小批量中选择argmin和argmax,而不是所有样本。

效果与性能

  1. 不同网络结构及参数
  • 网络结构一:22层,140M(1.4亿)个参数,1.6B(16亿)次左右浮点运算

FaceNet表1.png

  • 网络结构二:基于GoogLeNet的初始模型。参数量减少了约20倍(约为6.6M~7.5M),每个图像需要220M次浮点运算。
  1. 不同图像质量的正确率
  • 下表是不同压缩率的JPEG图像和不同分辨率图像的正确率:

FaceNet表4

  1. 不同嵌入维度的正确率

FaceNet表5.png

  1. 不同数据集上准确率
  • LFW数据集:使用额外的人脸对齐平均准确率达99.63%
  • YFB数据集:平均准确率95.18%

图像分割

什么是图像分割

  • 图像分割(Segmentation)是图像处理和机器视觉一个重要分支,其目标是精确理解图像场景与内容。图像分割是在像素级别上的分类,属于同一类的像素都要被归为一类,因此图像分割是从像素级别来理解图像的。如下如所示的照片,属于人的像素部分划分成一类,属于摩托车的像素划分成一类,背景像素划分为一类。

语义分割-原图-分割1.jpg

图像分割

  • 图像分割级别可以分为语义级分割、实例级分割和全景分割。
  • 语义分割(Semantic Segmentation):对图像中的每个像素划分到不同的类别;
  • 实例分割(Instance Segmentation):对图像中每个像素划分到不同的个体(可以理解为目标检测和语义分割的结合);
  • 全景分割(Panoptic Segmentation):语义分割和实例分割的结合,即要对所有目标都检测出来,又要区分出同个类别中的不同实例。
  • 左上:原图;右上:语义级分割;左下:实例级分割;右下:全景分割

segmentation_level.png

应用

  • 无人驾驶

街道场景分割.png

  • 医学、生物图像分割(如病灶识别)

眼底视网膜分割.png

  • 自动抠图

matting.png

  • 遥感图像分割

遥感图像分割.png

  • 工业质检

seg_application.png

图像分割的难点

  • 数据问题:分割不像检测等任务,只需要标注边框就可以使用,分割需要精确到像素级标注,包括每一个目标的轮廓等信息;
  • 计算资源问题:要想得到较高的精度就需要使用更深的网络、进行更精确的计算,对计算资源要求较高。目前业界有一些轻量级网络,但总体精度较低;
  • 精细分割:目前很多算法对于道路、建筑物等类别分割精度很高,能达到98%,而对于细小的类别,由于其轮廓太小,而无法精确的定位轮廓;
  • 上下文信息:分割中上下文信息很重要,否则会造成一个目标被分成多个部分,或者不同类别目标分类成相同类别;

图像分割基本原理

整体实现思路

图像分割一般思路如下:

  1. 输入图像,利用深度卷积神经网络提取特征
  2. 对特征图进行上采样,输出每个像素的类别
  3. 利用损失函数,对模型进行优化,将每个像素的分类结果优化到最接近真实值

seg_flow.png

评价指标

  1. 像素精度(pixel accuracy ):每一类像素正确分类的个数/ 每一类像素的实际个数;
  2. 平均像素精度(mean pixel accuracy ):每一类像素的精度的平均值;
  3. 平均交并比(Mean Intersection over Union):求出每一类的IOU取平均值。

常用模型

FCN(2014)

  • FCN(全称Fully Convolutional Networks)是图像分割的开山之作,2014年由加州大学伯克利分校Jonathan Long等人提出(论文名称《Fully Convolutional Networks for Semantic Segmentation》,该论文存在多个版本)。在该网络模型中,使用卷积层代替普通CNN中的全连接层,使用不同尺度信息融合,可以生成任意大小的图像分割图,从而实现对图像进行像素级的分类。

什么是FCN

  • 一个典型的卷积神经网络在处理图像分类问题时,通常会使用若干个卷积层,之后接若干个全连接层, 将卷积层产生的特征图(feature map)映射成一个固定长度的特征向量,由输出层在softmax激活函数的作用下,产生N个分类概率,取其中概率最大的类别作为分类结果。如下图所示:

CTPN_图0.png

  • 图像分割需要对图像进行像素级分类,所以在输出层使用全连接模型并不合适。FCN与CNN的区别在把于CNN最后的全连接层换成卷积层(所以称为“全卷积网络”)。该网络可以分为两部分,第一部分,通过卷积运算提取图像中的特征,形成特征图;第二部分,对特征图进行上采样,将特征图数据恢复为原来的大小,并对每个像素产生一个分类标签,完成像素级分类。结构如下图所示:

FCN图1.png

  • 上采样示意图:

up_sample.gif

网络结构

FCN结构_1.jpg

  • 输入:H*W的图像。由于没有全连接层,网络可以接收任意维度的输入(而不是固定大小图像);
  • 第1~5卷积层:执行卷积、池化操作。第一层pooling后变为原图大小的1/4,第二层变为原图大小的1/8,第五层变为原图大小的1/16,第八层变为原图大小的1/32(勘误:其实真正代码当中第一层是1/2,以此类推)。经过多次卷积和pooling以后,得到的图像越来越小,分辨率越来越低。其中图像到 \(\frac{H}{32} * \frac{W}{32}\) 的时候图片是最小的一层时,所产生图叫做heatmap热图,热图就是我们最重要的高维特征图,得到高维特征的heatmap之后就是最重要的一步也是最后的一步对原图像进行upsampling,把图像进行放大、放大、放大,到原图像的大小;
  • 输出:由于将全连接模型换成了卷积层,原本CNN中输出的1000*1*1维的特征变成了1000*W*H维,1000张热点图(heatmap)。在上述结构的基础上,将1000维变成21维(20种PASCAL类别+背景),再接一个反卷积层,以双线性上采样粗输出到像素密集输出,得到21张大小和原图一致的Mask,然后和真实标签逐像素比较分类结果,进行梯度下降优化。如下图右侧有狗狗和猫猫的图:

FCN结构_2.jpg

特征融合

  • FCN采用了特征融合,将粗的、高层信息与精细的、低层信息融合用来提高预测精度。融合实现方式是,对特征图进行上采样,然后将特征图对应元素相加。经过多次卷积、池化后,特征图越来越小,分辨率越来越低,为了得到和原图大小的特征图,所以需要进行上采样。作者不仅对pool5之后的特征图进行了上采样还原,也对pool4和pool3之后的特征图进行了还原,结果表明,从这些特征图能很好的获得关于图片的语义信息,而且随着特征图越来越大,效果越来越好。

FCN图3.png

  • 以下是不同大小特征图进行上采样,预测结果对比:

FCN图4.png

评价指标

  • 作者在论文中提出了4种评价指标,即像素准确度、平均准确率、平均交并比、频率加权交并比。设\(n_{ij}\)为类别i预测为类别j的像素数量,有\(n_{cl}\)个不同的类别,类别i总共有\(t_i = \Sigma_j n_{ij}\)个像素,各指标具体表述如下:
  • 像素准确率(Pixel Accuracy)

$$PA = \frac{\Sigma_i n_{ii}}{\Sigma_i t_i}$$

  • 平均准确率(Mean Pixel Accuracy)

$$MPA = \frac{1}{n_{cl}} \Sigma_i \frac{ n_{ii}}{t_i}$$

  • 平均交并比(Mean Intersection over Union)

$$MIU = \frac{1}{n_{cl}} \Sigma_i \frac{n_{ii}}{t_i + \Sigma_j n_{ji} - n_{ii}}$$

  • 频率加权交并比(Frequency Weighted IU )

$$FWIU = \frac{1}{\Sigma_k t_k} \Sigma_i \frac{t_i n_{ii}}{t_i + \Sigma_j n_{ji} - n_{ii}}$$

结论

  • NYUDv2数据集。该数据集包含1449个RGB-D图像。论文给出的实验结果如下(其中,FCN-32s表示未修改的粗糙模型,FCN-16s为16 stride的模型,RGB-HHA是采用了RGB和HHA融合的模型):

FCN表4.png

  • SIFT Flow。该数据集包含2688幅图像,包含“桥”、“山”、“太阳”等33个语义类别以及“水平”、“垂直”和“天空”三个几何类别。论文给出的实验结果如下:

FCN表5.png

U-Net(2015)

  • 生物医学分割是图像分割重要的应用领域。U-Net是2015年发表的用于生物医学图像分割的模型,该模型简单、高效、容易理解、容易定制,能在相对较小的数据集上实现学习。该模型在透射光显微镜图像(相衬度和DIC)上获得了2015年ISBI细胞跟踪挑战赛的冠军。该图像分割速度较快,在512x512图像实现分割只需不到一秒钟的时间。
  • U-Net基本实现图像分割基本原理与FCN一致,先对原图进行若干层卷积、池化,得到特征图,再对特征图进行不断上采样,并产生每个像素的类别值。

网络结构

  • U-Net网络体系结构如下图所示,它由收缩路径(左侧)和扩展路径(右侧)组成,共包含23个卷积层。
  • 收缩路径遵循卷积网络的典型结构,它包括重复应用两个3x3卷积(未相加的卷积),每个卷积后面都有一个ReLU和一个2x2最大合并操作,步长为2,用于下采样。在每个下采样步骤中,特征通道的数量加倍。
  • 扩展路径中的每一步都包括对特征映射进行上采样,然后进行2x2向上卷积(up-convolution ),将特征通道数量减半,与收缩路径中相应裁剪的特征映射进行串联,以及两个3x3卷积,每个卷积后面都有一个ReLU。在最后一层,使用1x1卷积将每个64分量特征向量映射到所需数量的类。

UNet图1.png

训练细节

  • 损失函数:采用像素级交叉熵作为损失函数
  • 输入:单个大的图像,而不是大的批次图像
  • 输出:得到的输出图像比输入图像小,边界宽度不变
  • 优化方法:随机梯度下降
  • 激活函数:ReLU
  • 权重初始值:标准差为\(\sqrt{\frac{2}{N}}\)的高斯分布(N表示一个神经元的传入节点数)
  • 采用数据增强策略

效果

  • 任务一:电子显微镜记录中分割神经元结构
  • 数据集:一组来自果蝇一龄幼虫腹侧神经索(VNC)的连续切片透射电镜图像(512x512像素)。每幅图像都有相应的完全注释的细胞(白色)和细胞膜(黑色)的真实分割图。测试集是公开的,但是它的分割图是保密的。通过将预测的膜概率图发送给组织者,可以得到评估。评估是通过在10个不同级别上对地图进行阈值化,并计算“扭曲误差”、“随机误差”和“像素误差”。
  • 效果:u-net(在输入数据的7个旋转版本上的平均值)在没有任何进一步的预处理或后处理的情况下实现了0.0003529的翘曲误差(新的最佳分数,见下表)和0.0382的随机误差。

UNet表1.png

  • 任务二:u-net应用于光镜图像中的细胞分割任务
  • 数据集:这个分离任务是2014年和2015年ISBI细胞追踪挑战赛的一部分,包含两个数据集。第一个数据集“PhC-U373”2包含由相差显微镜记录的聚丙烯腈基片上的胶质母细胞瘤星形细胞瘤U373细胞(见下图a,b),它包含35个部分注释的训练图像,该数据集下实现了92%的平均IOU;第二个数据集“DIC HeLa”3是通过差分干涉对比显微镜(DIC)记录在平板玻璃上的HeLa细胞(见下图c、d和补充材料)。它包含20个部分注释的训练图像。该数据集下实现了77.5%的平均IOU。

UNet图4.png

  • 效果:见下表

unet表2.png

Mask R-CNN(2017)

  • Mask R-CNN是一个小巧灵活的通用实例级分割框架,它不仅可对图像中的目标进行检测,还可以对每一个目标给出一个高质量的分割结果。它在Faster R-CNN基础之上进行扩展,并行地在bounding box recognition分支上添加一个用于预测目标掩模(object mask)的新分支。该网络具有良好的扩展性,很容易扩展到其它任务中,比如估计人的姿势。Mask R-CNN结构简单、准确度高、容易理解,是图像实例级分割的优秀模型。

主要思想

  1. 分割原理
  • Mask R-CNN是在Faster R-CNN基础之上进行了扩展。Faster R-CNN是一个优秀的目标检测模型,能较准确地检测图像中的目标物体(检测到实例),其输出数据主要包含两组:一组是图像分类预测,一组是图像边框回归。Mask R-CNN在此基础上增加了FCN来产生对应的像素分类信息(称为Mask),用来描述检测出的目标物体的范围,所以Mask R-CNN可以理解为Faster R-CNN + FCN。整体结构如下图所示。

MaskRCNN_图1.png

  1. 算法步骤
  • 输入待处理图片,进行预处理
  • 将图片送入经过预训练的卷积神经网络,进行卷积运算获取图像的特征图
  • 对特征图中的每个点产生ROI,从而获取多个候选区域
  • 将候选区域送入RPN网络进行而分类回归(前景或背景)、边框回归,过滤掉一部分候选区域
  • 对剩余的ROI进行ROIAlign操作(将原图中的像素和特征图中的点对应)
  • 对这些ROI进行分类(N个类别)、边框回归、Mask生成
  1. 数据表示方式
  • Mask R-CNN为每个RoI生成K个m×m的mask,其中K表示类别数量,每个mask均为二值化的矩阵,用来描述目标物体的像素范围。如下图所示:

MaskRCNN掩码示意图.png

网络结构

  • Mask R-CNN构建了多种不同结构的网络,以验证模型的适应性。论文中将网络结构分为两部分:提取特征的下层网络和产生预测结果的上层网络。如下图所示:

Mask RCNN网络结构图2.png

  • 对于下层网络,论文中评估了深度为50或101层的ResNet和ResNeXt网络。
  • 对于上层网络,主要增加了一个全卷积的掩码预测分支。如下图所示:

MaskRCNN_图4.png

  • 图中数字表示分辨率和通道数,箭头表示卷积、反卷积或全连接层(可以通过上下文推断,卷积减小维度,反卷积增加维度).所有的卷积都是3×3的,除了输出层,是1×1的。反卷积是2×2的,步长为2,隐藏层中使用ReLU。左图中,“res5”表示ResNet的第五阶段,为了简单起见,修改了第一个卷积操作,使用7×7,步长为1的RoI代替14×14,步长为2的RoI。右图中的“×4”表示堆叠的4个连续的卷积。

损失函数

  • Mask R-CNN损失函数由三部分构成,分类、边框回归及二值掩码。公式如下所示:

$$L=L_{cls}+L_{box}+L_{mask}$$

  • 分类损失\(L{cls}\)和检测框损失\(L{box}\)与Faster R-CNN中定义的相同。掩码分支对于每个RoI的输出维度为\(Km^2\),即K个分辨率为m×m的二值掩码,每个类别一个,K表示类别数量。每个像素应用Sigmoid,并将\(L{mask}\)定义为平均二值交叉熵损失。对于真实类别为k的RoI,仅在第k个掩码上计算\(L{mask}\)(其他掩码输出不计入损失)。

训练细节

  • 与Faster R-CNN中的设置一样,如果RoI与真值框的IoU不小于0.5,则为正样本,否则为负样本。掩码损失函数\(L_{mask}\)仅在RoI的正样本上定义;
  • 图像被缩放(较短边)到800像素,批量大小为每个GPU上2个图像,每个图像具有N个RoI采样,正负样本比例为1:3;
  • 使用8个GPU训练(如此有效的批量大小为16)160k次迭代,学习率为0.02,在120k次迭代时学习率除以10。使用0.0001的权重衰减和0.9的动量;
  • RPN锚点跨越5个尺度和3个纵横比。为方便剥离,RPN分开训练,不与Mask R-CNN共享特征。

结果

  • 检测速度:5FPS
  • COCO数据集实验结果

MaskRCNN_表1.png

  • AP:表示平均精度
  • \(AP_{50}\):IoU = 0.50(PASCAL VOC度量标准)
  • \(AP_{75}\):IoU = 0.75(严格度量标准)
  • \(AP_S\):小对象平均准确率(面积 < 322)
  • \(AP_M\):中等对象平均准确率(322 < 面积 < 962)
  • \(AP_L\):中等对象平均准确率(面积 > 962)

MaskRCNN_图5.png

  • 下图是Mask R-CNN分割效果对比。FCIS在重叠对象上有问题,Mask R-CNN则没有。

MaskRCNN_图6.png

人体姿态估计效果

  • Mask R-CNN框架可以很容易地扩展到人类姿态估计。将关键点的位置建模为one-hot掩码,并采用Mask R-CNN来预测K个掩码,每个对应K种关键点类型之一(例如左肩,右肘)。实验结果如下:

MaskRCNN_表4.png

  • 人体姿态估计效果图如下所示:

MaskRCNN_图7.png

DeepLab系列

DeepLab v1(2015)

概述

  • 图像分割和图像分类不一样,要对图像每个像素进行精确分类。在使用CNN对图像进行卷积、池化过程中,会导致特征图尺寸大幅度下降、分辨率降低,通过低分辨率特征图上采样生成原图的像素分类信息,容易导致信息丢失,分割边界不精确。DeepLab v1采用了空洞卷积、条件随机场等技术,有效提升了分割准确率。在 Pascal VOC 2012 的测试集 IOU 上达到了 71.6%,排名第一。速度方面,在GPU设备下推理可达每秒8帧。

空洞卷积

  • Dilated/Atrous Convolution(中文叫做空洞卷积或者膨胀卷积) ,是在标准的 convolution map 里注入空洞,以此来增加感受野。以下是一个空洞卷积示例图:

dilated_conv.gif

  • 在空洞卷积中,通过添加空洞,在不增加参数、不进行降采样的情况下,增加感受野。空洞卷积有两种理解,一是可以理解为将卷积核扩展,如图卷积核为 3*3 但是这里将卷积核变为 5*5 即在卷积核每行每列中间加0。二是理解为在特征图上每隔1行或一列取数与 3*3 卷积核进行卷积。当不填充空洞时,dilation rate为1,当填充1时,dilation rate为2,当填充2时,dilation rate为3。如下图所示:

dilate_rete.png

  • 空洞卷积最初的提出是为了解决图像分割的问题而提出的,常见的图像分割算法通常使用池化层和卷积层来增加感受野(Receptive Filed),同时也缩小了特征图尺寸(resolution),然后再利用上采样还原图像尺寸,特征图缩小再放大的过程造成了精度上的损失,因此需要一种操作可以在增加感受野的同时保持特征图的尺寸不变,从而代替下采样和上采样操作。

条件随机场

  • 条件随机场(Conditional random field,CRF)是给定一组输入随机变量条件下另一组输出随机变量的条件概率分布模型,其特点是假设输出随机变量构成马尔可夫随机场。
  • 马尔科夫随机场是具有马尔科夫特性的随机场。马尔科夫性质指的是一个随机变量序列按时间先后关系依次排开的时候,第N+1时刻的分布特性,与N时刻以前的随机变量的取值无关。拿天气来打个比方。如果我们假定天气是马尔可夫的,其意思就是我们假设今天的天气仅仅与昨天的天气存在概率上的关联,而与前天及前天以前的天气没有关系。其它如传染病和谣言的传播规律,就是具有马尔可夫性质的。

网络结构

  • DeepLab v1使用VGG-16作为基础模型,为了更适合图像分割任务,做出了以下修改:
  • 将最后三个全连接层(fc6, fc7, fc8)改成卷积层
  • 将最后两个池化层(pool4, pool5)步长由2改成1
  • 将最后三个卷积层(conv5_1, conv5_2, conv5_3)的dilate rate 设置为2
  • 输出层通道数改为21(20个类别,1个背景)

能量函数

DeepLab_v1_fig2.png

  • DeepLab v1使用了全连接条件随机场(Fully-connected Conditional Random Field)来保证分类准确和位置准确。其能量函数:

$$E(x)=\sum_i \theta_i(x_i) + \sum_{ij} \theta_{ij} (x_i, x_j)$$

  • 训练的目标要最小化能量函数,函数第一项:

$$\theta_i(x_i) = -logP(x_i)$$

  • 第一项用来保证分类的准确率,其中\(x_i\)表示像素的标签值,\(P(x_i)\)表示DCNN的计算结果,准确率越高P(x)越接近1,该项值越小。函数第二项:

$$\theta_{ij}(x_i, x_j) = \mu (x_i, x_j) \sum_{m=1}^{K} w_m.k^m(f_i, f_j) \mu (x_i, x_j) = 1 \ \ if \ \ x_i \ne x_j,otherwise \ 0$$

  • 其中,\(\mu(x_i, x_j)\)表示只考虑标签不相同的两个像素点,\(k^m (f_i, f_j)\)为一个高斯核函数,具体表示为:

$$w_1 \ \ exp(-\frac{||p_i - p_j||^2}{2 \sigma_{\alpha}^2}-\frac{||I_i - I_j||^2}{2 \sigma_{\beta}^2}) + w_2 \ \ exp(-\frac{||p_i - p_j||^2}{2 \sigma_{\gamma}^2})$$

  • 此函数主要由两个像素点的位置和颜色决定,位置为主、颜色为辅。该公式第一部分由位置(p表示)、颜色共同确定(I表示),第二项由位置确定,\(\sigma_\alpha, \sigma_\beta, \sigma_\gamma\)控制高斯核的比例。

DeepLab_v1_fig3.png

效果

  • 自对比试验,左表为采用不同策略下的IOU均值,其中,MSc表示多尺度融合,CRF表示条件随机场,LargFOV表大范围视野。右表为其它模型与该模型各种策略对比。

DeepLab_v1_tab1.png

  • 与FCN-8s和TTI-Zoomout-16的效果对比

DeepLab_v1_fig6.png

  • 从上到下依次为原图、真实标记、被对比的模型分割效果、DeepLab-CRF分割效果。

DeepLab v2(2017)

  • DeepLab v2在DeepLab v1的基础上,主要引入了ASPP(Atrous Spatial Pyramid Pooling,膨胀空间金字塔池化)策略,在给定的输入上以不同采样率的空洞卷积并行采样,相当于以多个比例捕捉图像的上下文,从而获得更好的分割性能。ASPP原理如下图所示:

DeepLab_v2_fig4.png

以下是PASCAL VOC 2012数据集上不同kernel size以及不同大小的膨胀率(atrous sampling rate)的实验对比:

DeepLab_v2_tab1.png

以下是PASCAL VOC 2012数据集上分割效果展示:

DeepLab_v2_fig6.png

以下是使用ResNet-101在PASCAL VOC 2012数据集上的实验对比:

DeepLab_v2_tab4.png

其中,MSC表示多尺度输入最大融合,COCO表示采用在MS-COCO上预训练的模型,Aug表示通过随机缩放增加数据。以下是跟其它模型的对比:

DeepLab_v2_tab6.png

以下是在Cityscapes数据集上的分割效果:

DeepLab_v2_fig13.png

以下是分割失败的示例:

DeepLab_v2_fig14.png

DeepLab v3(2017)

在DeepLab v3中,主要进行了以下改进:

  • 使用更深的网络结构,以及串联不同膨胀率的空洞卷积,来获取更多的上下文信息
  • 优化Atrous Spatial Pyramid Pooling
  • 去掉条件随机场

串联结构

DeepLab_v3_fig3.png

  • 上图演示了ResNet结构中,不使用空洞卷积(上)和使用不同膨胀率的空洞卷积(下)的差异,通过在Block3后使用不同膨胀率的空洞卷积,保证在扩大视野的情况下,保证特征图的分辨率。

并行结构

作者通过实验发现,膨胀率越大,卷积核中的有效权重越少,当膨胀率足够大时,只有卷积核最中间的权重有效,即退化成了1x1卷积核,并不能获取到全局的context信息。为了解决这个问题,作者在最后一个特征上使用了全局平均池化(global everage pooling)(包含1x1卷积核,输出256个通道,正则化,通过bilinear上采样还原到对应尺度)。修改后的ASPP结构图如下:

DeepLab_v3_fig5.png

Mult-grid策略

  • 作者考虑了multi-grid方法,即每个block中的三个卷积有各自unit rate,例如Multi Grid = (1, 2, 4),block的dilate rate=2,则block中每个卷积的实际膨胀率=2* (1, 2, 4)=(2,4,8)。

训练策略

  • 采用变化的学习率,学习率衰减策略如下(其中,power设置为0.9):

$$(1 - \frac{iter}{max_iter})^{power}$$

  • 裁剪。在训练和测试期间,在PASCAL VOC 2012数据集上采用的裁剪尺寸为513,以保证更大的膨胀率有效。
  • Batch Normalization。先在增强数据集上output stride = 16(输入图像与输出特征大小的比例),batch size=16,BN参数衰减为0.9997,训练30k个iter。之后在官方PASCAL VOC 2012的trainval集上冻结BN参数, output stride = 8,batch size=8,训练30k个iter。
  • 采用上采样真值计算Loss。DeepLabv1/v2中都是下采样的真值来计算loss,这样会让细节标记产生损失,本模型使用上采样最后的输出结果计算。
  • 数据随机处理。在训练阶段,对输入的图像进行随机缩放(缩放率在0.5-2.0之间),并随机执行左右翻转。

效果

  • ResNet-50和ResNet-101结构比较,更多的级联采样能获得 更高的性能

DeepLab_v3_tab2.png

  • 各种优化测略效果实验
  • 其中,MG表示Multi-grid,ASPP 表示Atrous spatial pyramid pooling ,OS表示output stride ,MS表示Multiscale inputs during test ,Flip表示镜像增强,COCO表示MS-COCO 预训练模型。

DeepLab_v3_tab6.png

  • 其它模型对比(PASCAL VOC 2012 测试集)

DeepLab_v3_tab7.png

  • 分割效果展示

DeepLab_v3_fig6.png

DeepLab v3+

深度可分离卷积

  • 采用深度可分离卷积,大幅度降低参数数量。

common_conv.png

  • 普通卷积。对一个三通道图像,采用4个333的卷积核,获得4个特征图,总参数量为4 × 3 × 3 × 3 = 108

common_conv_1.png

  • 深度可分离卷积第一步

pointwise_conv.png

  • 深度可分离卷积第二步
  • 深度可分离卷积分为两步:第一步逐通道卷积(参数数量3 × 3 × 3 = 27),第二步逐点卷积(参数数量1 × 1 × 3 × 4 = 12),输出4个特征图,共39个参数。

网络结构

DeepLab_v3plus_1.png

  • Encoder:同DeepLabv3。
  • Decoder:先把encoder的结果上采样4倍,然后与resnet中下采样前的Conv2特征进行concat融合,再进行3*3卷积,最后上采样4倍得到输出结果。
  • 融合低层次信息前,先进行1*1卷积,目的是减少通道数,进行降维。
  • 主干网部分:采用更深的Xception网络,所有max pooling结构为stride=2的深度可卷积代替;每个3*3的depthwise卷积都跟BN和Relu。改进后的主干网结构如下:

DeepLab_v3plus_2.png

结果

  • 与其它模型的对比

DeepLab_v3_plus_4.png

  • 在Cityspaces数据集上实验结果如下:

DeepLab_v3plus_3.png

  • 分割效果展示(最后一行是失败的分割)

DeepLab_v3_plus_5.png

其它模型

语义分割优秀模型一览表.png

数据集

VOC2012

  • Pascal VOC 2012:有 20 类目标,这些目标包括人类、机动车类以及其他类,可用于目标类别或背景的分割。

MSCOCO

  • 是一个新的图像识别、分割和图像语义数据集,是一个大规模的图像识别、分割、标注数据集。它可以用于多种竞赛,与本领域最相关的是检测部分,因为其一部分是致力于解决分割问题的。该竞赛包含了超过80个物体类别。

Cityscapes

  • 50 个城市的城市场景语义理解数据集,适用于汽车自动驾驶的训练数据集,包括19种都市街道场景:road、side-walk、building、wal、fence、pole、traficlight、trafic sign、vegetation、terain、sky、person、rider、car、truck、bus、train、motorcycle 和 bicycle。该数据库中用于训练和校验的精细标注的图片数量为3475,同时也包含了 2 万张粗糙的标记图片。

Pascal Context

  • 有 400 多类的室内和室外场景。

Stanford Background Dataset

  • 至少有一个前景物体的一组户外场景。

图像分割标注工具

labelme

  • 安装
pip3 install labelme

pip3 install  --user labelme --index-url https://pypi.tuna.tsinghua.edu.cn/simple/  --trusted-host https://pypi.tuna.tsinghua.edu.cn
  • 运行
labelme

# 如果报找不到labelme命令,先使用如下命令搜索:
# sudo find . -name labelme
  • 运行界面

labelme_run_window.png

附录:术语表

英文简称 英文全称 中文名称
Semantic Segmentation 语义分割
Instance Segmentation 实例分割
Panoptic Segmentation 全景分割
ASPP Astrous Spatial Pyramid Pooling 空洞金字塔池化
FOV Field of View 视野
CRF Fully-connected Conditional Random Field 全连接条件随机场
DSC Depthwise Separable Convolution 深度可分离卷积