图像分割整理之FCN

本文深入探讨了FCN(全卷积网络)的结构改造,从VGG为例,讲解了特征提取、网络输出如何与数据标注对应,并剖析了多分类交叉熵在图像分割中的应用。特别关注了网络输出的one-hot编码和损失函数的设计策略。
摘要由CSDN通过智能技术生成


FCN是第一篇将深度学习算法引入图像分割中的论文,这篇论文将那些经典的网络结构(如VGG、AlexNet)改造成端到端的图像分割网络。下面以VGG为例,说一说FCN的思想。
解读顺序为网络结构、网络输出/数据标注与损失函数。
这里面有些图片是之前在别的地方看到,觉得不错就截图保存下来,但具体忘了是在哪里看到的了,在此感谢一下原作者的辛苦付出

网络结构

举个栗子来说明:
提取特征:假设输入为224x224x3,经过VGG16Net最后一个池化层之后输出就转化为7x7x512,去掉VGG16Net原先的全连接层,换成卷积层1x1x512x4096 (其中每个卷积核有512个通道,共有4096个卷积核) 得到7x7x4096,再接上1x1x4096x类别数,最后得到输出为7x7x类别数。
重建回原尺寸:由于每次经过池化层图像缩小为1/2,所以在第五个池化层 (网络输出)时,图像尺寸为原来的1/32。作者使用了上采样逐步恢复。继续上面的栗子,网络最终输出尺寸为7x7,使用第一次反卷积扩大两倍为14x14,然后与pool4的输出(尺寸为14x14)经1x1卷积调整通道数之后进行相加,所得到的特征图继续上采样扩大两倍为28x28,然后与pool3的输出(尺寸为28x28)经1x1卷积调整通道数之后相加得到新的28x28的特征图,最后将该特征图直接8倍上采样得到与原图像一样大小,以此作为网络最终输出。
这里有个疑问,为什么作者后面不每一步都逐渐上采样回去呢?而是直接就8倍上采样。
根据作者前面做的32倍上采样、16倍上采样与8倍上采样结果来看,其实后面再继续4倍上采样也是有效果的,但我觉得这可能是作者想均衡好计算量与效果,而且也是为了与其他网络对比,因为AlexNet中只有3个pool层。

图像分割标注由于是像素级的分类与定位,标注起来会很麻烦,所以是不是也可以跟YOLOV9000一样,搞一个联合训练呢?
在这里插入图片描述

网络输出与数据标注

网络输出
分割网络的输出通常是原图像尺寸x分割类别数 (也有例外,比如UNet的输出尺寸就与原图像不同)。其形式为one-hot编码,现在重点说一下通道维度,如下图所示:**每个通道代表一个类别,其特征图的值 在(0,1)之间,代表该位置属于该类别的概率。**还有就是,在训练网络时,不需要事先指明网络输出的哪个通道就指哪种类别,数据标注会指定给我们,后面通过学习自然就可以学到了该特征。
在这里插入图片描述
数据标注
图像标注并不需要像网络输出那样分成多个通道,图像标注只需要单通道,其数值表示该位置所属类别在网络输出的第几个通道上:如下图所示:下图为上图的数据标注,例如图中的person标注为1,意思就是说在网络输出的第一个通道是判断是否为person的通道。
在这里插入图片描述
接下来就有一个疑问:网络输出与数据标注不一样啊,这怎么做损失嘞???且听我细细道来:
你没看错,确实是不一样。但别忘了,网络输出与数据标注还要经过损失函数函数处理才能得到损失吧?所以玄机就在下面的损失函数中。

损失函数

图像分割的损失函数有多种损失函数,在这里以Pytorch为背景,拿最普通的多分类交叉熵来说:
在pytorch中的交叉熵函数为nn.CrossEntropy。该函数直接接受第二部分的网络输出与数据标注这两个为输入,然后直接返回结果—loss。
首先我们看多分类交叉熵的公式:x是网络经softmax函数之后的输出 (也就是刚才上面网络输出那个形式还要经过softmax层才能计算损失函数),y是该位置对应与x输出的标签值。
在这里插入图片描述
Pytorch中的nn.CrossEntropy可拆分为先计算nn.LogSoftmax,在计算nn.NLLLoss
其中,nn.LogSoftmax就是上面公式中的logx,先对网络全部输出 (如:7x7x分割类别数 ) 计算softmax然后取log。
nn.NLLLoss则负责上面红方框内。具体做法就是取出网络输出中对应数据标注位置的值并取负号。例如上面的person在第一个通道,那么就是在数据标注为1的位置拿出网络输出第一个通道对应位置的数值并取负号。其实这个过程就相当于只取出标注为1的数值来训练,标注为0的则不取,就相当于完成了蓝色方框中的事情,然后取负号就对应公式中的负号。最后就是将取出来的数值相加或取平均
总结来说,数据标注的是索引,nn.LogSoftmax先不区分地将网络全部输出统一softmax+log,然后nn.NLLLoss就根据数据标注的索引去拿出部分数值并取负号相加或平均,从而得到loss
其实最后就可以发现对于每个通道,nn.CrossEntropy只训练正样本,让正样本取得更大值,负样本通通丢弃,这是为什么?
我们看softmax的公式:
在这里插入图片描述
显然softmax计算网络一个点的输出是根据其他点来计算的,说得直接一些,Softmax就是一种归一化,当使正样本取得更大值时,负样本自然就变得更小了,也就间接被训练到了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值