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

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

🍊往期回顾:目标检测系列——开山之作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,其它语义分割网络还没学习,因此也不清楚它们的难度如何】。说这个就是想告诉大家不要害怕语义分割,它远没有想象中的那么难!!!🍦🍦🍦

​  各位准备好了嘛,我们将一起搭上语义分割号列车,启航!!!🚆🚆🚆

 

语义分割概念

​  我想来看这部分内容的读者应该已经对语义分割的概念有所了解了,大家也别嫌我啰嗦,我还是打算给大家来辨析辨析什么物体分类,什么是目标检测,什么是语义分割以及什么是实例分割。物体分类很好理解啦,就是给出一张狗的图片,计算机把这张图片的类别辨别为狗,给出一张猫的图片,计算机把这张图片的类别辨别成猫。下面主要来看看目标检测、语义分割和实例分割的区别,如下图所示:

image-20220909215002090

​  从上图可以看出,目标检测只会把物体用方框框出来,也会识别出类别(图中未画)。语义分割则会顺着物体的边缘把物体标出来,同样会识别出类别,语义分割可以看成是更加精细的目标检测。实例分割中的实例指的是个体,我们从图中可以发现,实例分割中的不同三人用不同颜色表示,即识别出每一个个体,实例分割可以看成更加精细的语义分割。

​  相信大家通过上图和相关解释已经明白了物体分类、目标检测、语义分割和实例分割的区别。那么接下来我将为大家详细的讲讲语义分割的开山之作——FCN。

 

FCN网络整体结构✨✨✨

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

image-20220909225914379

​  大家看到上图的第一反应是什么呢?反正我看到是有点惊讶的,惊讶于语义分割的网络竟然如此简单,不知道大家有没有和我一样的感受呢!🥕🥕🥕

​  虽然简单,但我们还是要来解释一下,特别要注意理解语义分割的思想。首先,输入是一张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,如下图所示:

image-20220911160322001

​  上图的几种网络的backbone都是基于VGG16网络的。【注:FCN-32s-fixed不是end-to-end,这里就不讨论了 】

​  大家是不是对上图的32s、16s和8s不是很理解呢,这个表示的是最后上采样的倍数。我也会在下文详细为大家介绍FCN的这三种结构,届时大家就会理解了。


FCN-32s结构

​  上文说过,这几个结构的backbone都是基于VGG16的,因此大家需要对VGG16有一点的认识,不清楚的点击☞☞☞了解详情。【注:在FCN整体结构时使用的是AlexNet,这里为VGG16,大家注意一下就好】

​  为方便大家阅读,这里贴出VGG16网络结构图,如下图所示:

image-20220911163608958

​  有了VGG16网络的基础,看FCN-32就非常简单了,如下图所示:

image-20220911164052856

              图片来自B站霹雳吧啦Wz

​  现对上图做相关解释。首先一张任意大小的图片经过VGG16下采样了32倍,此时特征图尺寸为 h 32 × w 32 × 512 \frac{h}{32}×\frac{w}{32}×512 32h×32w×512,这部分对应着VGG16网络中的卷积层。 接着我们来看上图黄色虚线框住的三个卷积层,其对应着VGG16网络中最后三个全连接层,这样做的原因上文已经说过了,是为了使网络可以适应不同尺寸的输入,这部分结束后特征图的尺寸变为 h 32 × w 32 × n u m _ c l s \frac{h}{32}×\frac{w}{32}×num\_{cls} 32h×32w×num_cls ,其中 n u m _ c l s num\_cls num_cls为语义分割的总类别数,对于VOC数据集来说, n u m _ c l s = 21 num\_cls=21 num_cls=21。🌵🌵🌵

​  最后我们会经过一个上采样,如使用转置卷积或双线性插值算法进行上采样,将刚刚得到的特征图还原为 h × w × n u m _ c l s h×w×num\_cls h×w×num_cls尺寸。【对转置卷积不了解的可以看此篇文章转置卷积部分了解详情。】

​  到这里,其实整个FCN网络就介绍完了,现在来说说FCN的损失是如何计算的。先来看看我们的真实值(GT)是什么,其是一张张P模式的图片,有关图片的P模式,可以点击本文中附录–>VOC语义分割标注了解详情。相信你看了附录中的解释,你已经知道了GT是一张张单通道的图片,其尺寸为 h × w × 1 h×w×1 h×w×1。刚刚由VGG网络得到的输出尺寸为 h × w × n u m _ c l s h×w×num\_cls h×w×num_cls,我们会根据GT和得到的输出计算出损失LOSS,大致过程如下:

image-20220911231402039

​  上文我没有给出cross_entropy的具体是怎么做的,大家这里先不用着急,在下一篇FCN代码实战中我会通过代码详细的为大家讲解这个cross_entropy函数。这里我还想强调一点——损失函数的构造是我们实现程序功能的重要一环,它决定了输出的走向,即输出不断的拟合GT,当我们的网络训练的足够好时,网络的输出就和GT足够的接近!!!🌸🌸🌸


FCN-16s结构

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

              图片来自B站霹雳吧啦Wz

​  大家看到这个结构不知道是不是有点熟悉,我感觉有点像特征金字塔(FPN)结构,利用了不同尺度的信息,熟悉FPN的我觉得就非常好理解上图了。

​  我也来简要的解释一下,首先我们通过VGG后会分成①和②两条路,①路径和FCN-32s大致相同,只是在上采样时只将原图尺寸扩大了两倍,由 h 32 × w 32 × n u m _ c l s \frac{h}{32}×\frac{w}{32}×num\_{cls} 32h×32w×num_cls 变成 h 16 × w 16 × n u m _ c l s \frac{h}{16}×\frac{w}{16}×num\_{cls} 16h×16w×num_cls 。②路径的输入是VGG网络下采样16倍时的输出,尺寸为 h 16 × w 16 × 512 \frac{h}{16}×\frac{w}{16}×512 16h×16w×512,然后经过一个1×1的卷积核将通道数变成与①相同的通道数,即 n u m _ c l a s s num\_class num_class。①和②完成后,会将两步的结果相加然后再进行上采样,此时上采样的倍数为16,这样我们就得到了我们FCN-16s的输出了!!!🌸🌸🌸


FCN-8s结构

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

image-20220911234415625

              图片来自B站霹雳吧啦Wz

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

 

小结

​  FCN的理论部分就为大家介绍到这里了,这部分我觉得大家理解起来应该还是蛮简单的,唯一的难点可能就在损失函数那部分,关于这点,我会在下一篇代码实战中为大家详细解释,同时帮助大家理解FCN的更多细节。🌾🌾🌾

 

论文下载地址

FCN论文下载 🥝🥝🥝

 

参考链接

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

全连接卷积神经网络 FCN🍁🍁🍁

 

附录

VOC语义分割标注✨✨✨

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

image-20220910104241853

​  可以看到,这部分文件的格式是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模式图片(右),如下图:

image-20220910153545874

​  接着我们可以使用.mode方法打印看看图像的模式是否是我们所说的RGB和P,代码如下:

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

结果:

            

​  可以看到,确实和我们所说的一样,它们一个是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)

结果:

            image-20220910155037216

​  实验为证,现在我想大家是能够接受这样的一个事实了叭。【记住喔,这个对理解FCN还是很重要的】

​  这里只为大家证明我们使用的VOC标注信息是P模式的通道的图像,关于图像的P模式感兴趣的大家自行查阅资料。


​  我想大家肯定还是非常好奇,为什么单通道的图片可以是彩色的。这里我简单的说两句,它其实是有一个调色板的,单通道的图片有0-255个灰度值,每一个灰度值就是一个索引,会在调色板中找到对应的颜色,下图展示了调色板中0-4的颜色,一共有0-255个。

image-20220910160620711

​  看上图就非常好理解了,比如P模式某个像素灰度值为0,则它会在调色板中找0对应的颜色,即[0, 0, 0],为黑色,即P模式下所有灰度值为0像素颜色都是黑色。需要注意的是调色板中的不同索引对应的颜色是可以修改的,如我们将灰度值0的调色板由[0, 0, 0]修改成[255,255,255],则现在P模式下所有灰度值为0像素颜色都为白色。🍑🍑🍑



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

         一键三连 (1).gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/4241.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

说微软翻译比谷歌准,有人不信,就拿雾霾造了个句子

导读近年来,谷歌(微博)、微软、亚马逊和Facebook等硅谷巨头在人工智能(AI)领域进行着军备竞赛。在应用层面,有的开发智能管家、有的做机器人、有的训练AI治疗疾病。谷歌和微软则在翻译领域较上了劲。 长久以来,谷歌翻译…

Redis Stream消息并发和未ack消息处理

文章目录1. RedisStreamConfig2. 消费者MyMessageListener3. RedisStreamUtil4. RedisStreamConstant5. 测试6. 处理消费者已读取未ack的消息redis stream文档参考 https://zhuanlan.zhihu.com/p/60501638 1. RedisStreamConfig package com.tophant.eventdemo.common.config…

CSS3笔试题精讲1

防止父元素高度坍塌 4种方案 父元素的高度都是由内部未浮动子元素的高度撑起的。 如果子元素浮动起来,就不占用普通文档流的位置。父元素高度就会失去支撑,也称为高度坍塌。 即使有部分元素留在普通文档流布局中支撑着父元素,如果浮动 起来的元素高度高于留下的素。那么浮…

MySQL日志管理、备份与恢复

文章目录一.MySQL 日志管理1、错误日志2、通用查询日志3、二进制日志4、慢查询日志5、查看日志6、实例操作二、数据库备份的重要性与分类1、数据备份的重要性2、从物理与逻辑的角度,备份分为:3、从数据库的备份策略角度,备份可分为&#xff1…

Spring Cloud Sentinel实战(四)-流控规则-关联、预热、排队等待

流控规则-关联 名词解释 资源名:唯一名称,默认请求路径针对来源:Sentinel可以针对调用者进行限流,填写微服务名,默认default(不区分来源)阈值类型/单机阈值: QPS(每秒钟…

常见问题自助服务,你做对了吗?

一遍又一遍地回答重复的问题可能会成为客户支持团队的一项令人恼火的任务。当您的业务不断增长时,这些问题的数量可能会让您的座席不知所措。但是,如果您为客户设置一个常见问题自助回复服务,会大大减少这一工作量,提高客户体验&a…

安装部署skywalking8.2

SkyWalking是一个开源的分布式系统跟踪解决方案,它提供了分布式系统的性能监控、调用链追踪、度量分析和服务网格等功能。SkyWalking能够帮助开发人员快速定位分布式系统的性能问题,提高系统的可靠性和可扩展性。 SkyWalking支持多种语言和框架&#xff…

【linux】常用指令大全

这篇文章涵盖了linux中常用的所有指令,欢迎大家阅读查询。(如有不正确的地方,各位大佬可以在评论区指出,我会及时进行更正)。 文章目录登录远程服务器ssh添加删除用户当前路径pwd列出文件目录ls进入cdtreewhoami创建文件touch创建目录mkdir删…

java 高考志愿填报系统Myeclipse开发mysql数据库web结构jsp编程计算机网页项目

一、源码特点 java 高考志愿填报系统是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql5.0…

发现一个白嫖GPT4.0的方法!真的是完胜3.5!

大家好,我是五竹。 先说个基本的科普,最近被问的人都嘛了。 1、ChatGPT账号只有两种:普通账号和plus账号。 2、普通账号升级到plus账号,需要绑定国外的支付方式,每个月大概130左右!plus账号更稳!更快&am…

rk3568 音频调节音量-rk809

rk3568 音频调节音量-rk809 daisy使用的是rk3568的主板,系统使用的是v2版本的,使用正常-6dB的音频的文件和耳机声道输出听不清楚,但是使用0dB的能听清楚,所以先从软件上下手修改音量配置,从默认的3改到了0,…

骨传导蓝牙耳机排行榜10强,盘点几款性能高的骨传导耳机

骨传导耳机是一种新型的耳机,它将声音转化为不同频率的机械振动,通过人的颅骨、骨迷路、内耳淋巴液、螺旋器、听觉中枢来传递声波。不需要通过耳道,是一种耳挂式的无线耳机。 骨传导耳机与普通耳机相比,最大的优势是不需要入耳&am…

【Linux系统编程】静态库和共享库

✍个人博客:https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 📚专栏地址:Linux系统编程 📣专栏定位:整理一下 C 相关的知识点,供大家学习参考~ ❤️如果有收获的话,欢迎点赞&#x1f…

CMD中dos命令

1 Ctrl R 2 有关某个命令的详细信息,请键入 HELP 命令名 ASSOC 显示或修改文件扩展名关联。 ATTRIB 显示或更改文件属性。 BREAK 设置或清除扩展式 CTRL C 检查。 BCDEDIT 设置启动数据库中的属性以控制启动加载。 CACLS 显示或修改文件的访问控制列表(ACL)。 CA…

第十一届“泰迪杯”数据挖掘挑战赛第四场赛前指导直播预告

为推广我国高校数据挖掘实践教学,培养学生数据挖掘的应用和创新能力,增加校企交流合作和信息共享,提升我国高校的教学质量和企业的竞争能力,第十一届“泰迪杯”数据挖掘挑战赛(以下简称挑战赛)已于2023年3月…

【MySQL】一文彻底搞懂 Redo-log 为什么要两阶段提交?

【MySQL】一文彻底搞懂 Redo-log 为什么要两阶段提交? 文章目录【MySQL】一文彻底搞懂 Redo-log 为什么要两阶段提交?两阶段提交的过程是怎样的?为什么需要两阶段提交?两阶段提交有什么问题?事务提交的方式——组提交两…

day1 计算机组成与结构考点汇总

一、重点知识点 计算机硬件组成、运算器、控制器奇偶校验码、循环冗余校验码、海明码指令系统:指令操作数寻址方式、CISC和RISC、指令流水线的计算存储系统:分级存储、局部性原理、cache、主存编址计算、磁盘输入输出技术:程序查询方式、中断…

解构同为科技(TOWE)工业连接器的配置和应用

如今,在各行各业作业生产中,都能看到工业连接器、插头插座的身影,它能够传输高速、高容量和高精度的信号和电力,具有防水、防尘、抗震动、抗干扰等特性,被广泛应用在工业控制、通讯、医疗、交通、航空、军事等领域&…

OTA(Over-the-air programming)是什么?

OTA(Over the air-programming)是什么? ‒ 是指将新软件,固件,设置,加密密钥更新无线发布到手机,机顶盒等设备的方式。 ‒ 对于固件而言,由于安装在诸如ROM,EPROM和flash memory等的…

初始 CSS 基础

专栏简介: 前端从入门到进阶 题目来源: leetcode,牛客,剑指offer. 创作目标: 记录学习JavaEE学习历程 希望在提升自己的同时,帮助他人,,与大家一起共同进步,互相成长. 学历代表过去,能力代表现在,学习能力代表未来! 目录 1. CSS 是什么 2. 基本语法规范 2. 引入方式 2.1 内部…
最新文章