1、主要参考
(1)博主的地址,推荐
Pytorch官方实现的FCN网络结构_哔哩哔哩_bilibili
(2)博主的github
(3)另外参考
【深度学习】resnet-50网络结构_何顾长安的博客-优快云博客_resnet50网络
2、主要原理
2. 1 FCN基于resnet实现的网络结构

注意:layer3和layer4使用了膨胀卷积
2.2 对应Resnet50的结构
(1)网络结构图
(2)网络实现图

2.3 Resnet50和FCN两者的对应关系
(1)两者层次的对应关系

(2)回顾一下resnet50的layer1和layer2
1)resnet50的layer1
resnet-50的bottleneck如下,layer1共有3个bottleneck,第2个和第3个block的输入channel为256,注意下图残差结构的升维连接。
也就是resnet50的layer1中的bottleneck重复了下图3次,其中第一次的网络输入是56*56*64,后两次网络的输入是56*56*256。

2)resnet50的layer2
resnet-50的layer2第1个bottleneck:identity的卷积核大小应为3x3,为了保证residual前后的shape一致,能够相加,进行了下采样,如下图所示。注意下图残差连接过程中的升维和尺寸缩小,所以s=2(下图有误)

resnet-50的layer2第2,3,4个bottleneck都如下图所示,注意下图残差结构的直接连接,没有改变维度。

总结,resnet50的layer2的第一个bottleneck先下采样了一次,接下来用了3个一样的bottleneck。
(3)FCN的layer4和layer5中改变的bottleneck如下:
其中Bottleneck1的残差连接也是等深度的,不有扩充维度s=1

2.4 网络输出层
(1)基于resnet50的FCN网络有2个输出层,其中FCN1从layer4引出,如下所示

注意:最后还原原图大小采用了双线性插值的方法
(2)其中FCN2从layer3引出训练的时候用到,作用是:防止误差梯度没有办法传递到网络浅层;测试的时候不用;当然训练的时候也可以不用,如下图所示

3. python中__call__函数的使用
参考了
Python class中的__call__()方法_I天辉I的博客-优快云博客
具体定义:python中,如果在创建class的时候写了call()方法, 那么该class实例化出实例后, 实例名()就是调用call()方法。
class Animal(object):
__call__(self, words):
print "Hello: ", words
if __name__ == "__main__":
cat = Animal()
cat("I am cat!")
>>> Hello: I am cat!
本文详细介绍了如何使用PyTorch基于ResNet50构建FCN网络进行语义分割,重点讨论了网络结构、ResNet50与FCN的对应关系,并解释了网络输出层的设计,包括双线性插值还原原图大小的技巧。同时,文章提到了`__call__`函数在Python类中的应用。
1568

被折叠的 条评论
为什么被折叠?



