# 算法原理

DeepLabV3+主要有两个创新点。

## 更改主干网络

• 更深的Xception结构，不同的地方在于不修改entry flow network的结构，为了快速计算和有效的使用内存
• 所有的max pooling结构被stride=2的深度可分离卷积代替
• 每个3x3的depthwise convolution都跟BN和Relu

# 代码实现

from __future__ import absolute_import, print_function

from collections import OrderedDict

import torch
import torch.nn as nn
import torch.nn.functional as F

from .deeplabv3 import _ASPP
from .resnet import _ConvBnReLU, _ResLayer, _Stem

class DeepLabV3Plus(nn.Module):
"""
DeepLab v3+: Dilated ResNet with multi-grid + improved ASPP + decoder
"""

def __init__(self, n_classes, n_blocks, atrous_rates, multi_grids, output_stride):
super(DeepLabV3Plus, self).__init__()

# Stride and dilation
if output_stride == 8:
s = [1, 2, 1, 1]
d = [1, 1, 2, 4]
elif output_stride == 16:
s = [1, 2, 2, 1]
d = [1, 1, 1, 2]

# Encoder
ch = [64 * 2 ** p for p in range(6)]
self.layer1 = _Stem(ch[0])
self.layer2 = _ResLayer(n_blocks[0], ch[0], ch[2], s[0], d[0])
self.layer3 = _ResLayer(n_blocks[1], ch[2], ch[3], s[1], d[1])
self.layer4 = _ResLayer(n_blocks[2], ch[3], ch[4], s[2], d[2])
self.layer5 = _ResLayer(n_blocks[3], ch[4], ch[5], s[3], d[3], multi_grids)
self.aspp = _ASPP(ch[5], 256, atrous_rates)
concat_ch = 256 * (len(atrous_rates) + 2)
self.add_module("fc1", _ConvBnReLU(concat_ch, 256, 1, 1, 0, 1))

# Decoder
self.reduce = _ConvBnReLU(256, 48, 1, 1, 0, 1)
self.fc2 = nn.Sequential(
OrderedDict(
[
("conv1", _ConvBnReLU(304, 256, 3, 1, 1, 1)),
("conv2", _ConvBnReLU(256, 256, 3, 1, 1, 1)),
("conv3", nn.Conv2d(256, n_classes, kernel_size=1)),
]
)
)

def forward(self, x):
h = self.layer1(x)
h = self.layer2(h)
h_ = self.reduce(h)
h = self.layer3(h)
h = self.layer4(h)
h = self.layer5(h)
h = self.aspp(h)
h = self.fc1(h)
h = F.interpolate(h, size=h_.shape[2:], mode="bilinear", align_corners=False)
h = torch.cat((h, h_), dim=1)
h = self.fc2(h)
h = F.interpolate(h, size=x.shape[2:], mode="bilinear", align_corners=False)
return h

if __name__ == "__main__":
model = DeepLabV3Plus(
n_classes=21,
n_blocks=[3, 4, 23, 3],
atrous_rates=[6, 12, 18],
multi_grids=[1, 2, 4],
output_stride=16,
)
model.eval()
image = torch.randn(1, 3, 513, 513)

print(model)
print("input:", image.shape)
print("output:", model(image).shape)


# 参考文章

https://blog.csdn.net/u011974639/article/details/79518175

0 条评论

• ### EffNet: 继MobileNet和ShuffleNet之后的高效网络结构

与MobileNet、ShuffleNet等网络的目的类似，EffNet目标也是让模型能够在嵌入式或者移动端硬件设备上高效地运行。

• ### Pytorch实现卷积神经网络训练量化（QAT）

深度学习在移动端的应用越来越广泛，而移动端相对于GPU服务来讲算力较低并且存储空间也相对较小。基于这一点我们需要为移动端定制一些深度学习网络来满足我们的日常续需...

• ### 使用关键点进行小目标检测

【GiantPandaCV导语】本文是笔者出于兴趣搞了一个小的库，主要是用于定位红外小目标。由于其具有尺度很小的特点，所以可以尝试用点的方式代表其位置。本文主要...

• ### 老司机带你走进Core Animation 之图层的透视、渐变及复制

老司机的想法就是要把CoreAnimation头文件中的类大概都说一遍，毕竟一开始把系列名定成了《老司机带你走进CoreAnimation》（深切的觉得自己给自...

• ### 黑白卡片

牛牛有n张卡片排成一个序列.每张卡片一面是黑色的,另一面是白色的。初始状态的时候有些卡片是黑色朝上,有些卡片是白色朝上。牛牛现在想要把一些卡片翻过来,得到一种交...

• ### 如何使用@vue/cli 3.0在npm上创建，发布和使用你自己的Vue.js组件库

译者按： 你可能 npm 人家的包过成千上万次，但你是否有创建，发布和使用过自己的 npm 包？

• ### 【HDU 5858】Hard problem（圆部分面积）

交点是(\frac{\sqrt{7} L}{4\sqrt{2}},\frac{L}{4\sqrt{2}})。

• ### 如何使用@vue/cli 3.0在npm上创建，发布和使用你自己的Vue.js组件库

译者按： 你可能npm人家的包过成千上万次，但你是否有创建，发布和使用过自己的npm包？

• ### Nginx居然还能实现Restful接口的版本控制，涨知识了！

软件迭代是开发者必须面临的问题，现在有一个容易被大家忽略的问题就是 API 的版本控制。不是所有的用户都热衷于最新的版本的软件，而业务又是多变的。因此当新版本发...

• ### 宿主机访问centos7虚拟机中nginx服务IP地址失败的解决方法

今天忙完手头工作后，开始来在centos上安装nginx了。根据技术胖(www.jspang.com)博客的nginx教程，我先后在阿里云ESC的centos服...