
过去,计算机视觉最紧迫的任务之一就是区分狗的照片和猫的照片的能力。 目前,神经网络能够执行更为复杂和有趣的图像处理任务。 特别是,具有Mask R-CNN架构的网络允许您选择照片中不同对象的轮廓(“遮罩”),即使存在多个这样的对象,它们的大小也不同并且部分重叠。 该网络还能够识别图像中人物的姿势。
今年年初,出于教育目的,我有机会参加了在Kaggle举行的Data Science Bowl 2018竞赛。 出于教育目的,我使用了其中一种模型,其中一些参与者慷慨地担任高级职务。 这是Facebook Research最近开发的Mask R-CNN神经网络。 (值得注意的是,获胜的团队仍然使用不同的架构-U-Net。显然,它更适合生物医学任务,其中包括2018年Data Science Bowl)。
由于目标是使自己熟悉深度学习的任务,而不是占据较高的位置,因此在比赛结束后,人们强烈希望了解“引擎盖下”使用的神经网络的工作原理。 本文是从arXiv.org的原始文档以及有关Medium的几篇文章中获得的信息的汇总。 该材料本质上纯粹是理论性的(尽管最后有关于实际应用的链接),并且所包含的内容不超过所指定的来源。 但是俄文中有关该主题的信息很少,因此这篇文章可能对某人有用。
所有插图均取材于他人,并属于其合法所有人。
计算机视觉任务的类型
通常,现代计算机视觉任务可以分为四种类型(即使是俄语,也不需要英语,因此也不必见其名称的翻译,以免造成混淆):
- 分类 -按图像所包含的对象类型对图像进行分类;
- 语义分割 -定义图像中某个类别或背景的对象的所有像素。 如果相同类别的多个对象重叠,则它们的像素无法彼此分开;
- 对象检测 -检测指定类别的所有对象,并确定每个对象的封闭框架;
- 实例分割 -分别定义属于每个类别的每个对象的像素的定义;
以带有
[9]中气球的图像为例
,可以如下所示:
Mask R-CNN的演进发展
Mask R-CNN的基本概念通过几个中间神经网络的体系结构进行了分阶段开发,这些中间神经网络解决了以上列表中的不同任务。 理解此网络功能原理的最简单方法可能是依次考虑所有这些阶段。
如果不停留在诸如反向传播,非线性激活的功能以及多层神经网络等基本知识上,那么对卷积神经网络各层的工作原理进行简要说明可能仍然值得(R-CNN)。
卷积和MaxPooling
卷积层使您可以合并相邻像素的值并突出显示图像的更多常规特征。 为此,图片会被称为内核(内核)的小尺寸(3x3、5x5、7x7像素等)的方形窗口顺序滑动。 每个核心元素都有自己的权重系数,乘以核心元素当前叠加在其上的图像像素值。 然后将在整个窗口中获得的数字相加,该加权和即为下一个符号的值。
为了获得整个图像的属性矩阵(“图”),将岩心水平和垂直顺序移动。 在接下来的层中,卷积运算已应用于从先前层获得的特性图。 图形化的过程可以如下所示:
一层内的图像或功能卡不能用一张,而是用几个独立的滤镜进行扫描,这样就不能得到一张卡,而是几张(它们也称为“通道”)。 使用相同的反向传播过程来调整每个过滤器的权重。
显然,如果在扫描过程中滤芯没有超出图像范围,则特征图的尺寸将小于原始图像的尺寸。 如果要保持相同的大小,请应用所谓的padding-补充边缘图像的值,然后由滤镜将其与图像的实际像素一起捕获。
除填充外,尺寸变化还受步幅的影响-窗口在图像/贴图周围移动的步长值。
卷积不是获得一组像素的广义特征的唯一方法。 最简单的方法是根据给定规则(例如最大值)选择一个像素。 这正是MaxPooling层所做的。
与卷积不同,maxpooling通常应用于不相交的像素组。
神经网络
R-CNN(带有CNN的区域)网络架构是由UC Berkley的团队开发的,旨在将卷积神经网络应用于对象检测任务。 解决当时存在的此类问题的方法已达到其最大能力,并且其性能并未得到明显改善。
CNN在图像分类中表现良好,在给定的网络中,它们实际上已被应用到同一图像中。 为此,不是将整个图像输入到CNN输入,而是以不同的方式预先分配了一些对象应该被分配到的区域。 当时有几种这样的方法,作者选择了“
选择性搜索” ,尽管它们表明没有特殊的偏好原因。
现成的架构也被用作CNN网络
-CaffeNet (AlexNet)。 此类神经网络与ImageNet图像集的其他神经网络一样,分为1000类。 R-CNN旨在检测较少类别的对象(N = 20或200),因此CaffeNet的最后一个分类层被具有N + 1输出的层替换(背景附加类别)。
选择性搜索返回了大约2,000个大小和纵横比不同的区域,但是CaffeNet接受固定尺寸为227x227像素的图像作为输入,因此在将区域提交给网络输入之前,您必须对其进行修改。 为此,将来自该区域的图像封装在最小的生成正方形中。 沿着形成场的(较小的)一面,添加了图像的几个“上下文”(围绕区域)像素,场的其余部分未填充任何东西。 将生成的正方形缩放为227x227的大小,并馈入CaffeNet的输入。
尽管CNN经过训练可以识别N + 1个类别,但最终仅将其用于提取固定的4096维特征向量。 N个线性SVM用于直接确定图像中的对象,每个对象都根据其对象类型进行了二进制分类,以确定在转印区域中是否存在这种对象。 在原始文档中,整个过程由以下方案说明:
作者认为,SVM中的分类过程非常高效,实际上只是矩阵运算。 从CNN获得的特征向量在所有区域上组合成2000x4096矩阵,然后与具有SVM权重的4096xN矩阵相乘。
应该注意的是,使用“选择性搜索”获得的区域只能包含一些对象,而不是它们整体上包含它们的事实。 是否考虑包含对象的区域由
联合交叉口(IoU)度量确定 。 该度量是矩形候选区域与实际上包含对象的矩形的相交面积与这些矩形的并集面积之比。 如果该比率超过预定阈值,则认为候选区域包含期望物体。
IoU还用于过滤掉包含特定对象的过多区域(非最大抑制)。 如果某个区域的IoU高于同一对象的最大结果,则该第一区域将被简单丢弃。
在误差分析过程中,作者还开发了一种方法,该方法可以减少选择对象封闭框的误差-包围盒回归。 在对候选区域的内容进行分类之后,基于来自CNN的属性(dx,dy,dw,dh),使用线性回归确定了四个参数。 他们描述了区域框中心应移动x和y多少,以及更改其宽度和高度以更准确地覆盖识别的对象的程度。
因此,R-CNN网络检测对象的过程可以分为以下步骤:
- 使用选择性搜索突出显示候选区域。
- 将区域转换为CNN CaffeNet接受的大小。
- 使用CNN 4096维特征向量获取。
- 使用N个线性SVM对每个特征向量进行N个二进制分类。
- 区域框架参数的线性回归可更精确地覆盖对象
作者指出,他们开发的体系结构在语义分割问题上也表现良好。
快速r-cnn
尽管取得了良好的结果,但R-CNN的性能仍然很低,特别是对于比CaffeNet网络更深的网络(例如VGG16)。 此外,对边界框回归器和SVM的培训需要将大量属性保存到磁盘,因此在存储大小方面非常昂贵。
由于进行了一些修改,Fast R-CNN的作者提议加快该过程:
- 要通过CNN,不是分别通过2000个候选区域中的每个区域,而是整个图像。 然后将建议的区域叠加在生成的公共特征图上;
- 无需对三种模型(CNN,SVM,bbox回归器)进行独立训练,而是将所有训练过程合并为一个。
使用
RoIPooling程序将落入不同区域的符号转换为固定大小。 将宽度为w且高度为h的区域窗口划分为一个网格,该网格具有大小为h / H×w / W的H×W个单元。 (该文档的作者使用W = H = 7)。 对于每个这样的像元,执行“最大池化”以仅选择一个值,从而得到所得的H×W特征矩阵。
不使用二进制SVM,而是将所选要素转移到一个完全连接的层,然后转移到两个并行层:具有K + 1个输出的softmax(每个类一个,背景个1)和边界框回归器。
一般的网络架构如下所示:
为了联合训练softmax分类器和bbox回归器,使用了组合损失函数:
L(p,u,tu,v)=Lcls(p,u)+ lambda[u ge1]Lloc(tu,v)
在这里:
u -在候选区域中实际描绘的对象的类别;
Lcls(p,u)=− log(pu) -u类的日志丢失;
v=(vx,vy,vw,vh) -区域框架的真正变化,以更准确地覆盖对象;
tu=(tux,tuy,tuw,tuh) -预测该区域框架的变化;
Lloc -预测帧变化与实际帧变化之间的损失函数;
[u ge1] -指标函数等于1
u ge1 ,反之则为0。 班级
u=0 指示背景(即该区域中没有对象)。
lambda -旨在平衡两个损失函数对整体结果的贡献的系数。 但是,在该文件作者的所有实验中,它等于1。
作者还提到,他们使用权重矩阵的截断SVD分解来加快完全连接层中的计算速度。
更快的r-cnn
经过Fast R-CNN的改进后,神经网络的瓶颈成为了生成候选区域的机制。 在2015年,Microsoft Research的团队能够大大加快这一步骤。 他们建议不要从原始图像计算区域,而是从CNN获得的特征图再次计算区域。 为此,添加了一个名为“区域提议网络”(RPN)的模块。 整个架构如下:
根据所提取的CNN,在RPN的框架内,它们滑入一个具有小(3x3)窗口的“微型神经网络”。 在其帮助下获得的值将传输到两个并行的全连接层:框回归层(reg)和框分类层(cls)。 这些层的输出基于所谓的锚点:滑动窗口的每个位置的k个帧,具有不同的大小和纵横比。 每个这样的锚的Reg层生成4个坐标,以校正封闭框架的位置; cls层每个产生两个数字-帧包含至少某个对象或不包含的对象的概率。 在文档中,这通过以下方案说明:
学习过程reg和cls层结合在一起; 它们具有共同的损失函数,这是每个函数的损失函数之和,具有一个平衡系数。
两个RPN层仅提供候选区域的报价。 那些极有可能包含对象的对象将传递到对象检测和优化模块,该模块仍实现为Fast R-CNN。
为了在RPN和检测模块之间共享CNN中获得的功能,整个网络的训练过程需要分几步进行迭代构建:
- RPN部分被初始化和训练以识别候选区域。
- 使用建议的RPN区域,对快速R-CNN部分进行了重新训练。
- 使用训练有素的检测网络来初始化RPN的权重。 但是,一般的卷积层是固定的,只有RPN特定的层会重新调整。
- 使用固定的卷积层,最终可以调整Fast R-CNN。
提出的方案不是唯一的方案,即使以目前的形式,也可以通过进一步的迭代步骤继续进行,但是原始研究的作者正是在这样的训练之后进行了实验。
面具r-cnn
Mask R-CNN通过添加另一个分支来预测Fast Covered R-CNN体系结构,该分支预测覆盖所找到对象的Mask的位置,从而解决了实例分割问题。 遮罩只是一个矩形矩阵,其中某个位置的1表示相应的像素属于给定类别的对象,0表示该像素不属于该对象。

在源图像上可视化多色蒙版可以提供彩色图片:

该文件的作者有条件地将开发的体系结构分为CNN网络,用于计算图像特征(称为主干)和头部-负责预测包围框架,对物体进行分类并确定其遮罩的部分的结合。 损失函数对它们很常见,包括三个部分:
L=Lcls+Lbox+Lmask
遮罩提取采用与类无关的样式进行:针对每个类分别预测遮罩,而无需事先了解该区域所描绘的内容,然后简单地选择赢得独立分类器的类的遮罩。 有人认为,这种方法比依靠班级先验知识更有效。
因需要预测遮罩而引起的主要修改之一是将
RoIPool程序(计算候选区域的特征矩阵)更改为所谓的
RoIAlign 。 事实是,从CNN获得的特征图的尺寸小于原始图像,并且无法覆盖具有整数个特征的图的比例区域中显示图像中整数像素的区域:
在RoIPool中,只需将小数取整为整数即可解决问题。 当选择封闭框架时,此方法效果很好,但是基于此类数据计算的蒙版太不准确。
相反,RoIAlign不使用舍入,所有数字均保持有效,并且使用四个最近整数点上的双线性插值来计算属性值。
在原始文档中,差异说明如下:
在此,阴影线图表示特征图,并且是连续的-来自原始照片的候选区域的特征图上的显示。 在该区域中应该有4个组用于最大池化,并在图中用点表示4个属性。 与RoIPool过程不同,由于舍入会简单地将区域与整数坐标对齐,因此RoIAlign将点留在其当前位置,但会根据四个最近的符号使用双线性插值来计算每个点的值。
双线性插值通过应用线性插值,首先在一个坐标的方向上,然后在另一个坐标的方向上,对两个变量的函数进行双线性插值。
让有必要对函数的值进行插值
f(x,y) 在点P处具有在周围点处函数的已知值
Q11=(x1,y1),Q12=(x1,y2),Q21=(x2,y1),Q22=(x2,y2) (请参见下图)。 为此,首先对辅助点R1和R2的值进行插值,然后根据它们对点P的值进行插值。
R1=(x,y1)
R2=(x,y2)
f(R1)≈ frac(x2−x)(x2−x1)f(Q11)+ frac(x−x1)(x2−x1)f(Q21)
f(R2)≈ frac(x2−x)(x2−x1)f(Q12)+ frac(x−x1)(x2−x1)f(Q22)
f(P)≈(y2−y)(y2−y1)f(R1)+(y−y1)(y2−y1)f(R2)
( — ,
)
除了在实例分割和对象检测任务中取得很高的成绩外,Mask R-CNN还被证明适合确定摄影中人物的姿势(人物姿势估计)。这里的关键点是选择关键点(关键点),例如左肩,右肘,右膝等,从而可以绘制一个人的位置的框架:
要确定参考点,对神经网络进行训练,使其发出面具,其中只有一个像素(相同点)的值为1,其余像素为0(一个热掩模)。同时,网络正在训练发行K个这样的单像素掩模,每种参考点类型一个。功能金字塔网络
在Mask R-CNN上的实验中,以常用的CNN ResNet-50 / 101为骨干,还对使用特征金字塔网络(FPN)的可行性进行了研究。他们表明,在骨干网中使用FPN使Mask R-CNN的准确性和性能均得到提高。尽管有单独的文档专门针对它进行了改进,但与正在考虑的系列文章关系不大,这使得以相同的方式描述改进是有用的。像图像金字塔一样,特征金字塔的目的是在考虑各种物体可能的尺寸的情况下提高其检测质量。在特征金字塔网络中,连续的CNN层以递减的尺寸提取的特征图被视为某种称为“自下而上”的途径的分层“金字塔”。而且,金字塔上下两层的符号图都有其优缺点:前者具有高分辨率,但语义,归纳能力低;第二个-相反:FPN体系结构允许您通过添加自上而下的路径和横向连接来组合上层和下层的优点。为此,将每个上层的地图放大到下一层的大小,并逐个元素添加其内容。在最终预测中,将使用所有级别的结果卡。可以用以下方式表示:通过最简单的方法-最接近的邻居,即近似这样,可以增加顶级地图的大小(上采样):有用的链接
关于arXiv.org的原始研究论文:1. R-CNN:https : //arxiv.org/abs/1311.25242. Fast R-CNN:https : //arxiv.org/abs/1504.080833. Faster R-CNN :https : //arxiv.org/abs/1506.014974.遮罩R-CNN:https : //arxiv.org/abs/1703.068705.金字塔功能网:https : //arxiv.org/abs/1612.03144在介质上。关于Mask R-CNN的com上有很多文章,它们很容易找到。作为参考,我只带入我阅读的内容:6. 对掩码RCNN的简单理解 -最终体系结构原理的简要概述。7. 图像分割中CNN的简要历史:从R-CNN到Mask R-CNN-网络发展的历史按与本文相同的时间顺序进行。8. 从R-CNN到Mask R-CNN是开发阶段的另一个考虑因素。9。 色彩飞溅:使用Mask R-CNN和TensorFlow进行实例分割-Matterport在开源库中实现神经网络。上一篇文章除了描述了Mask R-CNN的原理外,还提供了在实践中尝试该网络的机会:为黑白图像上的不同颜色的气球着色。此外,您可以在我在Data Science Bowl 2018 kaggle竞赛中使用的模型上使用神经网络进行练习(当然,不仅限于此模型;您可以在``内核和讨论''部分中找到很多有趣的东西):10. Mask R- Hen CherKeng在PyTorch中的CNN。实现涉及一系列部署步骤;作者提供了说明。该模型需要PyTorch 0.4.0,支持GPU计算,NVIDIA CUDA。如果我自己的系统不满足要求,我可以推荐适用于Amazon虚拟机的深度学习AMI映像(实例是按小时计费的付费实例,最小的合适大小显然是p2.xlarge)。我还在集线器上碰到过一篇关于使用Matterport的网络对带有盘子的图像进行处理(尽管没有来源)的文章。我希望作者只对额外的提及感到满意:11. ConvNets。使用Mask R-CNN对项目进行原型制作