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

news2024/12/23 6:10:39

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

🍊往期回顾:目标检测系列——开山之作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.coloradmin.cn/o/422527.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity --- 3d数学 --- 坐标系统

1.世界坐标系是固定不动的 2.每一个游戏物体在世界坐标系中都有对应的坐标和方向 1.轴心点的位置不是固定的,是可以人为设定的 1.Screen Space --- 屏幕坐标 2.我们看到的屏幕其实就是相机所在的平面的位置 --- 而屏幕坐标系的Z其实就是游戏中的物体到相机平面的…

GDOUCTF

WEB hate eat snake 这是一个JS的题目,但是这个题目好像有点奇怪,不是很理解,当时我找到了我寝室JS的大哥,跟大哥说了一下我的思路,就是他根据这个time然后/1000转化为秒,就当作是我们玩游戏的一个分数&a…

速卖通韩国下载量再次登顶,7500万投资换来回报

韩国市场,还是一片蓝海。 速卖通终于等到了回报。 近日,数据平台 Data ai 显示,3 月 9 日以来,速卖通再次成为韩国购物 App 下载量第一名,超过当地电商平台 Coupang。 这或许和速卖通近日在韩国的布局有关。 前些天…

使用File System Access API 让浏览器可以操作文件

使用File System Access API 让浏览器可以操作文件 在早期我们开始学习前端三件套时,经常会听到这样的说法:浏览器是一个沙盒,它不允许我们操作本地文件,但是现在这个说法已经不再适用了,因为我们可以使用 File Syste…

2023接口自动化测试,完整入门篇

1. 什么是接口测试 顾名思义,接口测试是对系统或组件之间的接口进行测试,主要是校验数据的交换,传递和控制管理过程,以及相互逻辑依赖关系。其中接口协议分为HTTP,WebService,Dubbo,Thrift,Socket等类型,测试类型又主…

BBR算法

BBR算法 简述 bbr算法为google在2016年提出,用于改善tcp的性能,提升稳定性,降低延迟,更好地应对网络损伤。在整个算法调节周期中,bbr算法都在尽力维持最大bw和最小rtt。 对比传统的tcp算法 传统算法不能区分是拥塞导…

【RabbitMQ】Java操作RabbitMQ之入门Demo

目录 一、项目创建 二、生产者 三、消费者 一、项目创建 我们先在idea里创建两个Maven项目一个项目作为生产者&#xff0c;另一个作为消费者。创建完成后&#xff0c;在各自的pom.xml文件里引入Java使用RabbitMQ的依赖 <dependency><groupId>com.rabbitmq</g…

Android 单位和尺寸 以及ViewPager的使用

一 px 和 pt 1 px pixels 像素点 2 pt point 一个标准的长度单位&#xff0c;1pt 1/72英寸&#xff0c;用于印刷业&#xff0c;非常简单易用。 二 dp 和 sp 1 dp 就是 dip device independent pixels(设备独立像素) 不同设备有不同的显示效果。这个和设备硬件有关系&…

【数学推导找规律】全排列的价值【蓝桥杯13届】

欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#xff1a;重难点★✔ 蓝色文字表示&#…

ChatGPT资讯—2023.4.14

一、 最新资讯 1. 国内大模型&#xff1a; 4月8日&#xff0c;华为云人工智能领域首席科学家田奇首次介绍了华为“盘古大模型”的进展及其应用。 紧接着4月10日&#xff0c;一天内三个大模型争相“官宣”&#xff0c;包括搜狗创始人王小川宣布即将投入创业的大模型产品名为“…

机器学习 day04(梯度下降算法,学习率,偏导数)

梯度下降 我们可以用一种更系统的方法&#xff0c;来找到一组w&#xff0c;b&#xff0c;使成本函数的值最小。这个方法叫梯度下降算法&#xff0c;它可用于最小化任何函数&#xff0c;不仅仅包括线性回归的成本函数&#xff0c;也包括两个以上参数的其他成本函数在线性回归中…

2023最新面试题-Java-4

Date相关 1. java8的Date相关API&#xff1a; 常用 api 1、 获取当前日期 LocalDate.now() 2、创建日期 LocalDate date LocalDate.of(2020, 9, 21) 3、获取年份 date.getYear()//通过 TemporalField 接口的实现枚举类 ChronoField.YEAR 获取年份 date.get(ChronoFie…

车载通信——J1939 DM1

诊断故障代码&#xff08;DTC&#xff09;由4 个独立域构成&#xff1a; a. 可疑参数的编号(SPN) 19位 b. 故障模式标志(FMI) 5位 c. 发生次数(OC) 7位 d. 可疑参数编号的转化方式(CM) 1 位 Byte1 – Lamp Status Bits1 – 2 Protection Lamp 保护灯状态 …

基于 NIOSII 软核的流水灯实验

文章目录一、硬件部分设计1、进行 Qsys 系统设计二、逻辑连接三、软件设计四、总结一、硬件部分设计 1、进行 Qsys 系统设计 新建kernel.qsys文件&#xff1a; 设置clk时钟&#xff1a; 添加 Nios II 其余选项保持默认 添加 jtag uart 接口 添加片上存储器 On-Chip Memory(R…

【C++高级】手写线程池项目-经典死锁问题分析-简历项目输出指导

作为五大池之一&#xff0c; 线程池的应用非常广 泛&#xff0c;不管是客户端程序&#xff0c;还是后台服务程序&#xff0c;掌握线程池&#xff0c;是提高业务处理能力的必备模块 本课程将带你从零开始&#xff0c;设计一个支持fixed和cached模式的线程池&#xff0c;玩转C11、…

使用FRP(快速反向代理)实现内网穿透——以腾讯云服务器为例

一、FRP简介 FRP&#xff0c;即快速反向代理技术&#xff08;fast reverse proxy&#xff09;。本文的FRP程序是基于github开源项目GitHub - fatedier/frp。当前&#xff0c;该程序可实现&#xff1a;“将位于 NAT 或防火墙后面的本地服务器暴露给互联网”。它目前支持 TCP 和…

金山衍生新软件,wps,excel用户已在用,Access用户:以后就它了

我们常会用到微软的办公软件Word、Excel、PPT、Outlook&#xff0c;但在数据处理方面还是得看Access。Access用简短的表述来说就是微软开发的一个关系数据库管理系统。★好用&#xff0c;可门槛高&#xff0c;够不着 为啥说数据处理得看Access呢&#xff1f;举个例子&#xff0…

如何实现视觉识别形状

1. 功能说明 通过摄像头识别圆形及矩形两种形状。 2. 电子硬件 本实验中采用了以下硬件&#xff1a; 主控板 Basra主控板&#xff08;兼容Arduino Uno&#xff09; 扩展板 Bigfish2.1 电池7.4V锂电池通信2510通信转接板WiFi路由器 其它 摄像头 配置OpenCV的Visual Studio 2015.…

深入了解网络通信原理

同一个 vlan 同一个网段的 ip 地址能够直接互通&#xff0c;那么同一个 vlan 不同的网段能不能互通呢&#xff1f;海翎光电的小编整理了一篇文章&#xff0c;可以解决大家在网络中遇到的一些奇怪的问题&#xff0c;也是可以加深对网络的理解。 一、同 VLAN 不同网段能否 Ping 通…

Linux基本背景介绍与应用场景,Linux两条版本线,创建删除用户与修改密码的指令

TIPS Linux是一款叫做操作系统的软件&#xff0c;比如说你买了一个笔记本&#xff0c;你以为你只买了一个笔记本&#xff0c;实际上笔记本里面还搭建了一个非常重要的软件&#xff1a;操作系统。正是因为有了操作系统的存在&#xff0c;所以说有一个行为&#xff1a;开机就诞生…