mask R-CNN如果只想选择左边的狗该如何 Tensorflow?

利用深度学习实现猫狗动物识别,采用Kaggle提供的公开数据集,训练深度学习模型,对测试集猫狗中的图片准确分类。通过该实验掌握深度学习中基本的CV处理过程。

(1)采用用卷积神经网络训练
卷积神经网络由一个或多个卷积层和顶端的全连通层(对应经典的神经网络)组成,同时也包括关联权重和池化层(pooling layer)。这一结构使得卷积神经网络能够利用输入数据的二维结构。与其他深度学习结构相比,卷积神经网络在图像和语音识别方面能够给出更好的结果。这一模型也可以使用反向传播算法进行训练。相比较其他深度、前馈神经网络,卷积神经网络需要考量的参数更少,使之成为一种颇具吸引力的深度学习结构。
设 f(x),g(x) 是 R 上的两个可积函数,则卷积定义为:

下图展示了一步计算的具体过程

非线性层并不是 CNN 特有的网络层,一般情况下会使用 ReLU 作为模型的激活函数。
池化层 是一个利用 池化函数 (pooling function) 对网络输出进行进一步调整的网络层。池化函数使用某一位置的相邻输出的总体统计特征来代替网络在该位置的输出。常用的池化函数包括最大池化 (max pooling) 函数 (即给出邻域内的最大值) 和平均池化 (average pooling) 函数 (即给出邻域内的平均值) 等。但无论选择何种池化函数,当对输入做出少量平移时,池化对输入的表示都近似 不变 (invariant)。局部平移不变性 是一个很重要的性质,尤其是当我们关心某个特征是否出现而不关心它出现的位置时。
池化层同卷积层类似,具有三个比较重要的参数:pool_size,strides 和 padding,分别表示池化窗口的大小,步长以及是否对图像的外侧进行补零操作。池化层同时也能够提高网络的计算效率
全链接层 (Fully-connected or Dense Layer) 的目的就是将我们最后一个池化层的输出连接到最终的输出节点上。例如,最后一个池化层的输出大小为 [5×5×16],也就是有 5×5×16=400 个节点,对于手写数字识别的问题,我们的输出为 0 至 9 共 10 个数字,采用 one-hot 编码的话,输出层共 10 个节点。例如在 LeNet 中有 2 个全连接层,每层的节点数分别为 120 和 84,在实际应用中,通常全连接层的节点数会逐层递减。需要注意的是,在进行编码的时候,第一个全连接层并不是直接与最后一个池化层相连,而是先对池化层进行 flatten 操作,使其变成一个一维向量后再与全连接层相连。
输出层根据具体问题的不同会略有不同,例如对于手写数字识别问题,采用 one-hot 编码的话,输出层则包含 10 个节点。对于回归或二分类问题,输出层则仅包含 1 个节点。当然对于二分类问题,我们也可以像多分类问题一样将其利用 one-hot 进行编码,例如 [1,0] 表示类型 0,[0,1] 表示类型 1。

}

来写的,只要用户在训练时传入了 mask,则模型也会预测 mask,这可以从该专题下的文件

  • 这些年计算机视觉识别和搜索这个领域非常热闹,后期出现了很多的创业公司,大公司也在这方面也花了很多力气在做。做视觉搜...

  • 1.阅读。一起读了小鸡球球《谢谢啦》。外面玩的时候随口念手指谣。古诗音频。 2.数理。数楼梯。玩的时候,数数。 3...

  • 人教版八年级下第十九章《一次函数》介绍完函数图像,就是一次函数。自然是先讲练性质,然后待定系数法求函数解析式,再应...

  • }

    不断更新目标检测和语义分割的文章,感兴趣的请关注我。

    最近在做一个目标检测项目,用到了Mask RCNN。我仅仅用了50张训练照片,训练了1000步之后进行测试,发现效果好得令人称奇。就这个任务,很久之前用yolo v1训练则很难收敛。不过把它们拿来比当然不公平,但我更想说的是,mask RCNN效果真的很好。

    所以这篇文章来详细地总结一下Mask RCNN。

    Mask RCNN沿用了Faster RCNN的思想,特征提取采用ResNet-FPN的架构,另外多加了一个Mask预测分支。可见Mask RCNN综合了很多此前优秀的研究成果。为了更好地讲解Mask RCNN,我会先回顾一下几个部分:

    这里只是简单地介绍了Faster RCNN前向预测的过程,但Faster RCNN本身的细节非常多,比一阶段的算法复杂度高不少,并非三言两语能说得清。如果对Faster RCNN算法不熟悉,想了解更多的同学可以看这篇文章:,这是我看过的解释得最清晰的文章。

    多尺度检测在目标检测中变得越来越重要,对小目标的检测尤其如此。现在主流的目标检测方法很多都用到了多尺度的方法,包括最新的yolo v3。Feature Pyramid Network (FPN)则是一种精心设计的多尺度检测方法,下面就开始简要介绍FPN。

    FPN结构中包括自下而上,自上而下和横向连接三个部分,如下图所示。这种结构可以将各个层级的特征进行融合,使其同时具有强语义信息和强空间信息,在特征学习中算是一把利器了。

    FPN实际上是一种通用架构,可以结合各种骨架网络使用,比如VGG,ResNet等。Mask RCNN文章中使用了ResNNet-FPN网络结构。如下图:

    ResNet-FPN包括3个部分,自下而上连接,自上而下连接和横向连接。下面分别介绍。

    从下到上路径。可以明显看出,其实就是简单的特征提取过程,和传统的没有区别。具体就是将ResNet作为骨架网络,根据feature map的大小分为5个stage。stage2,stage3,stage4和stage5各自最后一层输出conv2,conv3,conv4和conv5分别定义为 ,他们相对于原始图片的stride是{4,8,16,32}。需要注意的是,考虑到内存原因,stage1的conv1并没有使用。

    自上而下是从最高层开始进行上采样,这里的上采样直接使用的是最近邻上采样,而不是使用反卷积操作,一方面简单,另外一方面可以减少训练参数。横向连接则是将上采样的结果和自底向上生成的相同大小的feature map进行融合。具体就是对 中的每一层经过一个conv 1x1操作(1x1卷积用于降低通道数),无激活函数操作,输出通道全部设置为相同的256通道,然后和上采样的feature map进行加和操作。在融合之后还会再采用3*3的卷积核对已经融合的特征进行处理,目的是消除上采样的混叠效应(aliasing effect)。

    实际上,上图少绘制了一个分支:M5经过步长为2的max pooling下采样得到 P6,作者指出使用P6是想得到更大的anchor尺度512×512。但P6是只用在 RPN中用来得到region proposal的,并不会作为后续Fast RCNN的输入。

    proposal切出ROI进行后续的分类和回归预测。问题来了,我们要选择哪个feature map来切出这些ROI区域呢?实际上,我们会选择最合适的尺度的feature map来切ROI。具体来说,我们通过一个公式来决定宽w和高h的ROI到底要从哪个 来切:

    这里224表示用于预训练的ImageNet图片的大小。 表示面积为 的ROI所应该在的层级。作者将 设置为4,也就是说 的ROI应该从 中切出来。假设ROI的scale小于224(比如说是112 * 112), ,就意味着要从更高分辨率的 中产生。另外, 值会做取整处理,防止结果不是整数。

    这种做法很合理,大尺度的ROI要从低分辨率的feature map上切,有利于检测大目标,小尺度的ROI要从高分辨率的feature map上切,有利于检测小目标。

    Mask RCNN的构建很简单,只是在ROI pooling(实际上用到的是ROIAlign,后面会讲到)之后添加卷积层,进行mask预测的任务。

    下面总结一下Mask RCNN的网络:

    1. 头部网络,包括边界框识别(分类和回归)+mask预测。头部结构见下图:

    为了讲清楚ROI Align,这里先插入两个知识,双线性插值和ROI pooling。

    在讲双线性插值之前,还得看最简单的线性插值。

    已知数据 与 ,要计算 区间内某一位置 在直线上的 值,如下图所示。

    计算方法很简单,通过斜率相等就可以构建y和x之间的关系,如下:
    仔细看就是用 和 , 的距离作为一个权重(除以 是归一化的作用),用于 和 的加权。这个思想很重要,因为知道了这个思想,理解双线性插值就非常简单了。

    双线性插值本质上就是在两个方向上做线性插值。

    如图,假设我们想得到P点的插值,我们可以先在x方向上,对 和 之间做线性插值得到 , 同理可得。然后在y方向上对 和 进行线性插值就可以得到最终的P。其实知道这个就已经理解了双线性插值的意思了,如果用公式表达则如下(注意 前面的系数看成权重就很好理解了)。

    首先在 x 方向进行线性插值,得到

    然后在 y 方向进行线性插值,得到

    ROI pooling就不多解释了,直接通过一个例子来形象理解。假设现在我们有一个8x8大小的feature map,我们要在这个feature map上得到ROI,并且进行ROI pooling到2x2大小的输出。

    将它划分为2x2的网格,因为ROI的长宽除以2是不能整除的,所以会出现每个格子大小不一样的情况。

    最后以一张动图形象概括之:

    在Faster RCNN中,有两次整数化的过程:

    1. region proposal的xywh通常是小数,但是为了方便操作会把它整数化。
    2. 将整数化后的边界区域平均分割成 k x k 个单元,对每一个单元的边界进行整数化。

    两次整数化的过程如下图所示:

    事实上,经过上述两次整数化,此时的候选框已经和最开始回归出来的位置有一定的偏差,这个偏差会影响检测或者分割的准确度。在论文里,作者把它总结为“不匹配问题”(misalignment)。

    为了解决这个问题,ROI Align方法取消整数化操作,保留了小数,使用以上介绍的双线性插值的方法获得坐标为浮点数的像素点上的图像数值。但在实际操作中,ROI Align并不是简单地补充出候选区域边界上的坐标点,然后进行池化,而是重新进行设计。

    下面通过一个例子来讲解ROI Align操作。如下图所示,虚线部分表示feature map,实线表示ROI,这里将ROI切分成2x2的单元格。如果采样点数是4,那我们首先将每个单元格子均分成四个小方格(如红色线所示),每个小方格中心就是采样点。这些采样点的坐标通常是浮点数,所以需要对采样点像素进行双线性插值(如四个箭头所示),就可以得到该像素点的值了。然后对每个单元格内的四个采样点进行maxpooling,就可以得到最终的ROIAlign的结果。

    需要说明的是,在相关实验中,作者发现将采样点设为4会获得最佳性能,甚至直接设为1在性能上也相差无几。事实上,ROI Align 在遍历取样点的数量上没有ROIPooling那么多,但却可以获得更好的性能,这主要归功于解决了misalignment的问题。

    和 与faster rcnn的定义没有区别。需要具体说明的是 ,假设一共有K个类别,则mask分割分支的输出维度是 , 对于 中的每个点,都会输出K个二值Mask(每个类别使用sigmoid输出)。需要注意的是,计算loss的时候,并不是每个类别的sigmoid输出都计算二值交叉熵损失,而是该像素属于哪个类,哪个类的sigmoid输出才要计算损失(如图红色方形所示)。并且在测试的时候,我们是通过分类分支预测的类别来选择相应的mask预测。这样,mask预测和分类预测就彻底解耦了。

    这与FCN方法是不同,FCN是对每个像素进行多类别softmax分类,然后计算交叉熵损失,很明显,这种做法是会造成类间竞争的,而每个类别使用sigmoid输出并计算二值损失,可以避免类间竞争。实验表明,通过这种方法,可以较好地提升性能。

    由于篇幅所限,不会在本文中讲解代码。但会由我的一个同事( )视频讲解,视频即将录制,录好之后我会把视频链接发在这里,感兴趣的可以关注。如果对视频内容有什么需求,欢迎留言。

    文章中有些图片来自medium博主:

    如果这篇文章对你有帮助,就给点个赞呗。

    }

    我要回帖

    更多关于 python and or not优先级 的文章

    更多推荐

    版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

    点击添加站长微信