本文为稀土技能社区首发签约文章,14天内制止转载,14天后未获授权制止转载,侵权必究!

作者简介:秃头小苏,致力于用最浅显的语言描述问题

往期回顾:方针检测系列——开山之作RCNN原理详解    方针检测系列——Fast R-CNN原理详解    方针检测系列——Faster R-CNN原理详解

近期方针:写好专栏的每一篇文章

支持小苏:点赞、收藏⭐、留言

深度学习语义切割篇——FCN原理详解篇

写在前面

​  在过往的博客中,我现已介绍了几种经典神经网络(VGG、GoogleNet、Resnet等等)在图画分类上的运用,这些都是十分基础却重要的内容,咱们务必要掌握,不了解的能够进入个人主页查找了解概况。在方针检测方面,我有解说过yolo系列的原理,点击☞☞☞了解概况。可是yolo代码部分还没有出过相关教程,看看后边是否有时间吧!!!此外,方针检测方面我也具体的介绍了Rcnn的一系列原理及Faster rcnn的源码解析,链接如下:

  • 方针检测系列——开山之作RCNN原理详解
  • 方针检测系列——Fast R-CNN原理详解
  • 方针检测系列——Faster R-CNN原理详解
  • 还不懂方针检测嘛?一同来看看Faster R-CNN源码解读

​  关于语义切割自己也一向没有具体了解过,最近也是学习了一下语义切割的开山之作——FCN网络,全称为Fully Convolutional Networks for Semantic Segmentation 。我先来说说我曾经对语义切割网络的片面知道,那便是一个字难,正常的学习道路是先图画分类,接着是方针检测,终究才是语义切割。假如你看过上文提到的Faster Rcnn源码的话,你会发现其了解起来仍是很难的,并且代码量也十分的大。这样一来,我自然会以为语义切割的代码是恐怖级别的,可是经过我这几天的学习,我发现不管是FCN的原理仍是代码都是相对简略的【只针对FCN,其它语义切割网络还没学习,因而也不清楚它们的难度如何】。说这个便是想告知咱们不要害怕语义切割,它远没有想象中的那么难!!!

​  各位准备好了嘛,咱们将一同搭上语义切割号列车,启航!!!

语义切割概念

​  我想来看这部分内容的读者应该现已对语义切割的概念有所了解了,咱们也别嫌我烦琐,我仍是计划给咱们来剖析剖析什么物体分类,什么是方针检测,什么是语义切割以及什么是实例切割。物体分类很好了解啦,便是给出一张狗的图片,计算机把这张图片的类别辨别为狗,给出一张猫的图片,计算机把这张图片的类别辨别成猫。下面首要来看看方针检测、语义切割和实例切割的区别,如下图所示:

深度学习语义分割篇——FCN原理详解篇

​  从上图能够看出,方针检测只会把物体用方框框出来,也会识别出类别(图中未画)。语义切割则会顺着物体的边缘把物体标出来,同样会识别出类别,语义切割能够当作是更加精密的方针检测。实例切割中的实例指的是个别,咱们从图中能够发现,实例切割中的不同三人用不同色彩表明,即识别出每一个个别,实例切割能够当作更加精密的语义切割。

​  信任咱们经过上图和相关解说现已了解了物体分类、方针检测、语义切割和实例切割的区别。那么接下来我将为咱们具体的讲讲语义切割的开山之作——FCN。

FCN网络全体结构✨✨✨

​  咱们先来看看FCN的全体结构,如下图所示:

深度学习语义分割篇——FCN原理详解篇

​  咱们看到上图的榜首反应是什么呢?反正我看到是有点惊讶的,惊讶于语义切割的网络竟然如此简略,不知道咱们有没有和我相同的感触呢!

​  虽然简略,但咱们仍是要来解说一下,特别要留意了解语义切割的思维。首要,输入是一张RGB三通道的图片,然后会输入特征提取网络提取特征,上图的特征提取网络为AlexNet。(对AlexNet不熟悉的能够点击☞☞☞了解概况)需求留意的是传统AlexNet的后三层为全衔接层,而FCN中采用的是卷积层,这样将全衔接层换成卷积层能够适应不同标准的图片。现在看来,这种转化你或许觉得不足为奇,可是咱们请留意,这篇文章是2015宣布的,那时候有这种思维仍是十分可贵的。咱们留意到,在特征提取网络的终究一个特征图的通道数是21,这个21是很有讲究的喔,它对应着咱们要分类的类别总数,包含布景。论文中运用的是VOC数据集,一个有20个前景类别和一个布景共21个类别数。接着咱们会将刚刚得到的chanel=21的特征图进行上采样,将其标准变为原始输入图画巨细【注:通道数仍是21】。终究咱们会和语义切割的标示图画(GT)计算丢失,终究,这个21通道的原图巨细的特征图的每个像素都有21个通道,即有21个值,咱们取最大的一个值,其索引对应的类别便是该像素的所属类别!!!

​  FCN的全体结构就为咱们介绍到这儿,信任咱们心中仍是存有疑惑,特别是终究一部分,不必忧虑,下文我会具体的为咱们叙述FCN的细节。

FCN细节了解✨✨✨

​  在FCN的论文中,首要给出了三种FCN的结构,分别是FCN-32,FCN-16,FCN-8s,如下图所示:

深度学习语义分割篇——FCN原理详解篇

​  上图的几种网络的backbone都是根据VGG16网络的。【注:FCN-32s-fixed不是end-to-end,这儿就不评论了 】

​  咱们是不是对上图的32s、16s和8s不是很了解呢,这个表明的是终究上采样的倍数。我也会鄙人文具体为咱们介绍FCN的这三种结构,届时咱们就会了解了。


FCN-32s结构

​  上文说过,这几个结构的backbone都是根据VGG16的,因而咱们需求对VGG16有一点的知道,不清楚的点击☞☞☞了解概况。【注:在FCN全体结构时运用的是AlexNet,这儿为VGG16,咱们留意一下就好】

​  为便利咱们阅读,这儿贴出VGG16网络结构图,如下图所示:

深度学习语义分割篇——FCN原理详解篇

​  有了VGG16网络的基础,看FCN-32就十分简略了,如下图所示:

深度学习语义分割篇——FCN原理详解篇

              图片来自B站响雷吧啦Wz

​  现对上图做相关解说。首要一张恣意巨细的图片经过VGG16下采样了32倍,此刻特征图标准为h32w32512\frac{h}{32}\frac{w}{32}512,这部分对应着VGG16网络中的卷积层。 接着咱们来看上图黄色虚线框住的三个卷积层,其对应着VGG16网络中终究三个全衔接层,这样做的原因上文现已说过了,是为了使网络能够适应不同标准的输入,这部分结束后特征图的标准变为h32w32num_cls\frac{h}{32}\frac{w}{32}num\_{cls} ,其间num_clsnum\_cls为语义切割的总类别数,关于VOC数据集来说,num_cls=21num\_cls=21

​  终究咱们会经过一个上采样,如运用转置卷积或双线性插值算法进行上采样,将刚刚得到的特征图还原为hwnum_clshwnum\_cls标准。【对转置卷积不了解的能够看此篇文章转置卷积部分了解概况。】

​  到这儿,其实整个FCN网络就介绍完了,现在来说说FCN的丢失是如何计算的。先来看看咱们的实在值(GT)是什么,其是一张张P形式的图片,有关图片的P形式,能够点击本文中附录–>VOC语义切割标示了解概况。信任你看了附录中的解说,你现已知道了GT是一张张单通道的图片,其标准为hw1hw1。刚刚由VGG网络得到的输出标准为hwnum_clshwnum\_cls,咱们会根据GT和得到的输出计算出丢失LOSS,大致进程如下:

深度学习语义分割篇——FCN原理详解篇

​  上文我没有给出cross_entropy的具体是怎样做的,咱们这儿先不必着急,鄙人一篇FCN代码实战中我会经过代码具体的为咱们解说这个cross_entropy函数。这儿我还想强调一点——丢失函数的结构是咱们实现程序功用的重要一环,它决定了输出的走向,即输出不断的拟合GT,当咱们的网络练习的足够好时,网络的输出就和GT足够的挨近!!!


FCN-16s结构

​  上节介绍了FCN-32s的结构,这节将来解说FCN-16s的结构。32s和16s表明终究上采样的倍数分别为32倍和16倍。FCN-16s的结构如下图所示:

深度学习语义分割篇——FCN原理详解篇

              图片来自B站响雷吧啦Wz

​  咱们看到这个结构不知道是不是有点熟悉,我感觉有点像特征金字塔(FPN)结构,利用了不同标准的信息,熟悉FPN的我觉得就十分好了解上图了。

​  我也来扼要的解说一下,首要咱们经过VGG后会分成①和②两条路,①途径和FCN-32s大致相同,只是在上采样时只将原图标准扩大了两倍,由h32w32num_cls\frac{h}{32}\frac{w}{32}num\_{cls} 变成h16w16num_cls\frac{h}{16}\frac{w}{16}num\_{cls} 。②途径的输入是VGG网络下采样16倍时的输出,标准为h16w16512\frac{h}{16}\frac{w}{16}512,然后经过一个11的卷积核将通道数变成与①相同的通道数,即num_classnum\_class。①和②完成后,会将两步的成果相加然后再进行上采样,此刻上采样的倍数为16,这样咱们就得到了咱们FCN-16s的输出了!!!


FCN-8s结构

​  了解了FCN-32s和FCN-16s的结结构,再来看FCN-8s的结构就更简略了。此刻用到了VGG网络三个下采样倍数(32倍、16倍、8倍)的输出,其结构如下图所示:

深度学习语义分割篇——FCN原理详解篇

              图片来自B站响雷吧啦Wz

​  关于FCN-8s的结构我就不带咱们一点点分析了,信任你看懂了FCN-32s和FCN-16s再看FCN-8s会毫无压力!!!

小结

​  FCN的理论部分就为咱们介绍到这儿了,这部分我觉得咱们了解起来应该仍是蛮简略的,唯一的难点或许就在丢失函数那部分,关于这点,我会鄙人一篇代码实战中为咱们具体解说,一起协助咱们了解FCN的更多细节。

论文下载地址

FCN论文下载

参考链接

FCN网络结构详解(语义切割)

全衔接卷积神经网络 FCN

附录

VOC语义切割标示✨✨✨

​  这个部分我来为咱们讲讲VOC语义切割的标示,这部分文件存储在VOC2012/SegmentationClass文件夹下,部分内容如下:

深度学习语义分割篇——FCN原理详解篇

​  能够看到,这部分文件的格局是png格局。它们图画的形式是P形式,即调色板形式,是单通道的图画。单通道的图画??这明明是五颜六色的啊,怎样会是单通道的图画??我信任你一定有这样的疑问,咱们直接用试验来说话。

​  为便利做对照,咱们运用VOC2012/JPEGImages中的三通道图片2007_000032.jpgVOC2012/SegmentationClass中的2007_000032.png图片做对比,首要,咱们分别载入两种图片并显现一下,代码如下:

img2 = Image.open('D:/数据集/VOC/VOCtrainval_11-May-2012/VOCdevkit/VOC2012/JPEGImages/2007_000032.jpg')
img3 = Image.open('D:/数据集/VOC/VOCtrainval_11-May-2012/VOCdevkit/VOC2012/SegmentationClass/2007_000032.png')
plt.imshow(img2)
plt.imshow(img3)

​  img2为RGB形式图片(左),img3为P形式图片(右),如下图:

深度学习语义分割篇——FCN原理详解篇

​  接着咱们能够运用.mode方法打印看看图画的形式是否是咱们所说的RGB和P,代码如下:

print("image2:",img2.mode)
print("image3:",img3.mode)

成果:

            

深度学习语义分割篇——FCN原理详解篇

​  能够看到,的确和咱们所说的相同,它们一个是RGB形式,一个是P形式!!!终究咱们来看看最重要的一点,即RGB形式是三通道的图画,而P形式是单通道的图画,代码如下:

# 将PIL格局的图画转化为numpy格局
img2_np = np.array(img2)
# 打印img2的标准
print("image2_shape:",img2_np.shape)
img3_np = np.array(img3)
print("image3_shape:",img3_np.shape)

成果:

            

深度学习语义分割篇——FCN原理详解篇

​  试验为证,现在我想咱们是能够接受这样的一个现实了叭。【记住喔,这个对了解FCN仍是很重要的】

​  这儿只为咱们证明咱们运用的VOC标示信息是P形式的通道的图画,关于图画的P形式感兴趣的咱们自行查阅资料。


​  我想咱们肯定仍是十分猎奇,为什么单通道的图片能够是五颜六色的。这儿我简略的说两句,它其实是有一个调色板的,单通道的图片有0-255个灰度值,每一个灰度值便是一个索引,会在调色板中找到对应的色彩,下图展示了调色板中0-4的色彩,一共有0-255个。

深度学习语义分割篇——FCN原理详解篇

​  看上图就十分好了解了,比如P形式某个像素灰度值为0,则它会在调色板中找0对应的色彩,即[0, 0, 0],为黑色,即P形式下所有灰度值为0像素色彩都是黑色。需求留意的是调色板中的不同索引对应的色彩是能够修正的,如咱们将灰度值0的调色板由[0, 0, 0]修正成[255,255,255],则现在P形式下所有灰度值为0像素色彩都为白色。



如若文章对你有所协助,那就

        

深度学习语义分割篇——FCN原理详解篇