入门小菜鸟,希望像做笔记记录自己学的东西,也希望能帮助到同样入门的人,更希望大佬们帮忙纠错啦~侵权立删。
目录
一、图像分割简介与分类
二、图像分割基本结构
1、编码器
2、解码器
三、图像分割 Vs 图像分类
四、基础网络框架——FCN
五、U-Net
六、SegNet
七、金字塔场景分析网络——PSPNet
八、deeplab-v3系列
图像分割:把图像分成若干个特定的、具有独特性质的区域并提出感兴趣目标。简单来说就是把图像中的对象分割出来
常用方法:基于阈值的分割方法;基于区域的分割方法;基于边缘的分割方法;基于特定理论的分割方法等(本篇只说明利用神经网络实现的图像分割方法)
图像分割的类型:语义分割和实例分割
具体例子如下:(图片源于网络,如有侵权立删)
左图是语义分割(人都是红色),右图是实例分割(不同的人不同的颜色)
通过滤波器从图像中提取特征(这里可以替换成各种熟悉的特征提取网络)
生成最终的输出,通常是包含对象轮廓的分割掩码
图像分类是图像级别的,而图像分割是像素级别的
图像分类只需要对那些抽象特征进行分类,而图像分割需要判断图像每个像素点的类别,进行精确分割
图像分类一般使用CNN为基础框架进行分类,图像分割一般使用FCN作为分割的基础框架
原因:
(1)CNN在进行卷积和池化过程中丢失了图像细节,即feature map size渐渐减小,因此不能很好指出物体的具体轮廓,指出每个像素具体属于哪个物体,从而无法做到精确的分割。
(2)一般CNN分类网络都会在最后加入一些全连接层,经过softmax后就可以获得类别概率。但是这个概率是一维的,就是说只能标识整个图片(或整个网格内对象)的类别,不能标识每个像素点的类别,所以全连接方法并不适用于图像分割
详见往期博文全卷积网络FCN详解_tt丫的博客-CSDN博客
U-Net和FCN都是很小的分割网络,既没有使用空洞卷积,也没有后接CRF,结构比较简单。
U-Net最初是为分割生物医学图像而开发的。当它被可视化的时候,它的架构看起来像字母U,所以被命名为U-Net。
详见往期博文U-Net详解_tt丫的博客-CSDN博客
SegNet是为了解决自动驾驶或者智能机器人问题而提出的图像语义分割深度网络。SegNet基于FCN,也属于Encoder-Decoder 结构。
Encoder network使用的是经过修改的VGG16中的前13层卷积网络结构
Decoder network还是和之前两个网络一样:将原图像经由Encoder network计算出的feature maps映射到和原图尺寸一致的分辨率以便于做逐像素的分类处理。
创新点:Pooling Indices方式来保存池化点的来源信息,供Decoder network使用
Pooling Indices:在Encoder的池化层处理中,会记录每一个池化后的1x1特征点来源于之前的2x2的哪个区域
因为SegNet是一个对称网络,那么在Decoder中需要对特征图进行上采样的时候,我们就可以利用它对应的池化层的Pooling Indices来确定某个1x1特征点应该放到上采样后的2x2区域中的哪个位置,这也让它的计算量变大了些。
提出原因
为了解决场景解析错误的问题,比如说把在水面上的船预测成车,但是一般来说车是不会在水上漂的,所以说明在识别时没有很好地考虑到目标所处场景的信息,而只过分关注目标本身的外观信息。
PSPNet最主要的特点是提出了金字塔池化模块(pyramid pooling module)——PSP模块
PSP模块的原理与SPP相似
有关SPP的介绍可以看往期文章YOLOv5中的SPP/SPPF结构详解_tt丫的博客-CSDN博客_yolov5中的spp
PSP结构的作用是将得到的特征层划分成不同大小的网格,每个网格内部各自进行平均池化。这样可以实现聚合不同区域的上下文信息,从而提高获取全局信息的能力(加强特征提取)。
在PSPNet中,PSP结构典型情况下,会将输入进来的特征层划分成6x6,3x3,2x2,1x1的网格,对应了下图中的绿色、蓝色、橙色、红色的输出
其中的操作说明:
红色:将输入进来的特征层整个进行平均池化。
橙色:将输入进来的特征层划分为2×2个子区域,然后对每个子区域进行平均池化。
蓝色:将输入进来的特征层划分为3×3个子区域,然后对每个子区域进行平均池化。
绿色:将输入进来的特征层划分为6×6个子区域,然后对每个子区域进行平均池化。
这里只介绍deeplab-v3+网络
它采用空间金字塔池模块或编解码结构二合一的方式,并且通过添加一个简单有效的Decoder来细化分割结果,尤其是沿着目标对象边界的分割结果。
详情可以看看博主往期文章deeplab-v3+原理详解_tt丫的博客-CSDN博客
欢迎大家在评论区批评指正,谢谢啦~