深度学习之图像分割网络FCN、MaskRCNN总结

FCN

深度学习之图像分割网络FCN、MaskRCNN总结_第1张图片
深度学习之图像分割网络FCN、MaskRCNN总结_第2张图片
总结:
第一步:最终得到的conv7,也就是161621(注意不一定要是1121,全卷积114096这个只是将全连接层转为全卷积层,是114096,如果我压根就没有全连接层,我全是卷积层,那么最终得到161621也是很正常),它经过上采样后得到343421的feature map,与前面第四个卷积层池化后的feature map拼接,拼接之后再次经过上采样得到707021的feature map,然后再与前面第三个卷积层池化后的feature map拼接,然后再次经过上采样后得到56856821的feature map,这里说的是FCN-8,是两次拼接,如果是FCN-16的话,就是一次拼接,FCN-32的话就没有拼接,直接就是对最后一个feature map进行上采样了
这个和yolov3 简直一摸一样,先上采样将feature map变大,然后与前面的feature map进行拼接,yolov3也是,不同的是yolov3的上采样是采样双线性插值法,而这里的上采样是反卷积(说白了就是加了很多padding ,以至卷积后的feature map比原来的还要大)
那它是怎么对每个像素进行分类的呢?
注意,它的每次上采样(反卷积)都是采样21个卷积核去卷的,为什么要用21个卷积核去卷呢,就比如我就是FCN-32的,我是怎么对它分类的?
FCN-32最终的feature map 是161621的,我将它反卷积为原图大小假如就是56856821的,那么我怎么知道这个568568的heat map上每个像素属于那个类别呢?
注意,类别总个数是21,所以我用了21个卷积核去卷,得到的568
568的heat map上每个像素都有对应的21个通道,因为每个通道是由不同的卷积核得到的,所以1个像素对应的21个通道的像素值肯定不一样的,那么我直接对这个21个通道取最大值或者softmax,看那个通道的值最大,那么这个像素的类别不就是这个通道对应的编号吗,比如这个像素对应的第五个通道的值或softmax值最大,那么这个像素的类别不就是5吗,同理其它像素也都是这么分类的

MaskRCNN


Mask RCNN能做的事情
目标检测、以及对检测的目标进行实例分割
还可以扩展到人体姿态预估任务上

看下它的网络结构:
深度学习之图像分割网络FCN、MaskRCNN总结_第3张图片
深度学习之图像分割网络FCN、MaskRCNN总结_第4张图片
主要在Faster-RCNN基础之上做了两点改进:
1)将 Roi Pooling 层替换成了 RoiAlign;

2)添加并列的 FCN 层(mask 层);

1)首先来看第一点为什么要把 Roi Pooling 层替换成了 RoiAlign,原因是因为faster rcnn的ROI从原图映射到feature map是对步长取整,这样就会导致像素丢失,而Mask RCNN需要对像素级别的目标进行分割,所以不能用这种取整方式,如下:
深度学习之图像分割网络FCN、MaskRCNN总结_第5张图片

看到没,如果是roi pooling的话,映射到feature map上是665/32 = 20
而如果是roi align的话映射到feature map上是665/32 = 20.78,它并没有取整,那么第二步,它又是怎么做的呢?详细看这篇博客https://blog.csdn.net/xiamentingtao/article/details/78598511
深度学习之图像分割网络FCN、MaskRCNN总结_第6张图片

其实就是对每个格子再次划分四个格子,进行四次采样,每次采样的位置都是四个格子的中心点,由于我知道了它的位置,但是不知道这个中心点位置的具体像素值是多少,所以采用双线性插值法求这个中心点位置的具体像素(利用它周围位置的像素点求),然后对着四个位置的像素值取最大值,得到这个大格子的输出

2)添加并列的 FCN 层(mask 层),这个目的很明显是为了给框里的目标进行分割,那么它具体是怎么进行分割的呢?比如下面这张图:

这个人我框到了以后,我是怎么把这个人给分割出来的呢,也就是我框的这个框中,我怎么只给这个人上了色,假如这个框中还有其它的我需要识别的目标,我并没有给其他的目标上色,也就是它是怎么做到,我框的是那个类别,那么上色的就是那个类别呢?下面来看下:
深度学习之图像分割网络FCN、MaskRCNN总结_第7张图片
mask网络分支采用FCN对每个ROI的分割输出维数为Km^2,即K个类别的mm的二值mask,采用像素级sigmod,对每个类别的mm进行sigmod

经过rpn网络生成的预测框经过ROI Align后,再经过FCN网络输出K * mm的feature map,K表示一共要检测的目标的类别总数,它是怎么做的呢?
有K个m
m的面,每个mm的面就代表一个类别的预测,比如总共有人,狗,猫三个类别,那么K=3,其中一个mm面预测狗这个类别,想下一个面只预测一个类别,那么我只需要用sigmod就可以了,注意,这里的一个面预测一个类别指的是对这个面上的每个像素点进行类别预测,因为是分割,所以我只需要对每个像素点进行sigmod,假如对狗这个面的每个像素进行sigmod的话,设置阀值为0.5,大于0.5为狗,小于0.5就不是狗,,所以对所有像素进行sigmod后,就能把是狗的像素和不是狗的像素进行分开了,然后把是狗的像素给打上颜色,狗就画出来了,同样,其它的面也是这样,,那么我具体选择那个面进行画呢,这就看这个框的分类任务,如果对这个框的分类是狗的话,那么我只会拿狗的面进行画或者上色,计算损失,我只会拿狗的面计算损失,预测我也是拿狗的面进行预测然后resize到原图

你可能感兴趣的:(深度学习之图像分割网络FCN、MaskRCNN总结)