写在前面,本文的代码是基于Pytorch框架resnet101基础网络的DeepLabv3网络复现


先贴一张代码效果图:


预备知识

本文提到的output_stride来源于deeplabv3论文,指的是(输入图像的分辨率/特征图的分辨率),可以看出,output_stride越大,说明特征图越小,每个特征图网格包含的原图像素越多,越高层。【论文中resnet50对应 8, resnet101对应16】

ResNet101

ResNet101包括一个Init Block和四个stage,以及最后的Avgpool和fc。下采样了32倍。(一般的分类网络都是下采样32倍)

1.Init Block

由1个7×7的卷积层+一个maxpooling层组成,其中卷积层的stride为2,max pooling的stride=2,因此经过Init block后的输出尺寸降了4倍。 Init Block输出为64通道。

2.stage1-4

stage1-4的残差块个数依次为[3,4,23,3]

  • stage1
    stage1由三个unit(残差单元)构成,都是1×1或3×3的小卷积,且stride都为1,因此经过stage1后的输出尺寸相对于原图还是降了4倍(与Init block的输出尺寸相同),stage1输出为256通道。
    stage2
  • stage2由四个unit组成,其中unit1的3×3卷积核stride为2,因此,经过stage2后的输出尺寸相对于原图降了8倍,stage2输出为512通道。
  • stage3
    stage3由23个unit组成,其中unit1的3×3卷积核stride为2,因此,经过stage3后的输出尺寸相对于原图降了16倍,stage3输出为1024通道。
  • stage4
    stage4由三个unit组成,所有unit的3×3卷积核stride为1,因此,经过stage4后的输出尺寸相对于原图降了16倍 ,stage4输出为2048通道。

3. Avgpooling

平均池化层,ResNet50的Avgpooling为:

AvgPool2d(kernel_size=7, stride=1, padding=0)

因为stage4输出的特征图尺寸是7x7,此时再经过一个kernel size为7的平均池化层,输出变成了2048个1x1的特征图。

4. FC

Linear(in_features=2048, out_features=1000, bias=True)

输出向量长度为num_class(分类的数量,这里为1000),后面可以接softmax等用于分类。

Deeplabv3原理分析

backbone为ResNet101的Deeplabv3结构图【其中的backbone用到了上文提到的Resnet101中的1、2两部分】

1.Init Block


输入Image【图片大小513*513】,输出tensor维度【64, 129, 129】
经过Init Block,这里的Init Block类似于ResNet101的Init Block,但是有细微差别,这里的Init Block为三个3×3卷积和一个max pooling(ResNet的Init Block是一个7×7和一个max pooling)。经过Init block后的输出尺寸降了4倍。经过Init block后的输出尺寸降了4倍。(用output_stride=4来描述) 。

2. 四个stage

4个stage分别对应的输出shape

  • 经过stage1阶段,stage1由三个unit(残差单元)构成,且stride都为1,因此经过stage1后的输出尺寸相对于原图还是降了4倍(与Init block的输出尺寸相同)(output_stride=4) stage1输出为256通道。

  • 经过stage2,stage2由4个unit组成,其中unit1的3×3卷积核stride为2,因此经过stage2后的输出尺寸相对于原图降了8倍(output_stride=8) stage2输出为512通道。

  • 经过stage3,stage3由23个unit组成,其中unit1的3×3卷积核stride为2,因此经过stage3后的输出尺寸相对于原图降了16倍(output_stride=16), stage3输出为1024通道。

  • 经过stage4,stage4由三个unit组成,其中所有unit的rate均为2(感受野变化:3x3->7x7->15x15),因此,经过stage4后的输出尺寸相对于原图降了16倍(output_stride=16),但是感受野与原图一样大。 stage4输出为2048通道。

3. ASPP(核心模块)

ASPP的输入:stage4的输出;
ASPP的输出:output_stride=16的特征图(尺寸相当于原图降了16倍),但是感受野相当于原图。
ASPP的结构包括5个branch,第一个branch为1×1卷积,中间三个branch为空洞卷积,第五个branch为全局平局池化层+1×1卷积层。五个branch做融合得到ASPP的输出。

ASPP的具体结构包括(结合模型图一起看):

  • 第一个branch是普通的1×1卷积层
  • 前二、三、四个branch为3×3的空洞卷积层,rate分别为12,24,36(output_size=8的时候,rate依次为12,24,36,如果output_size=16,rate应该依次变成6,12,18)
  • 第五个branch论文中称为Image Pooling,是一个Avgpooling(获得全局信息)外加一个1×1卷积(改变通道数)(因为pooling无法改变通道数,而为了保证五个branch的输出通道数相等,后面必须再接一个卷积)。
  • 五个branch的输出都是256维(一共1280维),使用1×1卷积将这五个branch输出的结果进行融合(concat),最后输出256维的新特征。

4. Final_block

Final_block的输入为:ASPP的输出;
Final_block的输出为:num_class张分割掩码结果图;
Final block包含两个卷积层和一个unsampling:

  • 一个3×3卷积做的是concat操作(过渡作用)
  • 一个1×1卷积,改变输出通道数为num_class。
  • 再将num_class张特征图使用bilinear的方式插值到输入图片的尺寸(相当于直接上采样了16倍),至此,得到了deeplabv3的输出。

    插值法相关介绍

5. 关于aux_block分支

aux_block分支与Final_block分支很像,也是由两个卷积层+upsampling构成,输出的也是num_class张分割掩码图。aux分支与Final_block的区别是,aux的输入是stage3的输出(相当于从stage3后直接输出结果。)

aux分支往往只用来训练,不用于测试。

6.训练结果记录

resnet101, batchsize = 16, epoch = 50,block4,val score:

原图:

测试输出图:

另,有需要代码的小伙伴可以留下邮箱…

语义分割之Deeplabv3源码解读相关推荐

  1. 语义分割丨PSPNet源码解析「训练阶段」

    引言 之前一段时间在参与语义分割的项目,最近有时间了,正好把这段时间的所学总结一下. 在代码上,语义分割的框架会比目标检测简单很多,但其中也涉及了很多细节.在这篇文章中,我以PSPNet为例,解读一下 ...

  2. Mask RCNN源码解读

    Mask RCNN源码解读 前言 数据集 数据载入 模型搭建 模型输入 模型输出 resnet101 RPN网络 ProposalLayer DetectionTargetLayer fpn_clas ...

  3. 基于改进Deeplabv3plus的自动驾驶场景分割系统 (源码&教程)

    1.研究背景 随着人工智能技术的飞速发展,车辆的自动驾驶离人们的生活越来越近.自动驾驶整个运行流程中首先需要依赖各种车载传感器收集车辆周围的各种环境数据,进而利用各种分析算法分析得到计算机可感知的环境 ...

  4. Bert系列(三)——源码解读之Pre-train

    https://www.jianshu.com/p/22e462f01d8c pre-train是迁移学习的基础,虽然Google已经发布了各种预训练好的模型,而且因为资源消耗巨大,自己再预训练也不现 ...

  5. Feflow 源码解读

    Feflow 源码解读 Feflow(Front-end flow)是腾讯IVWEB团队的前端工程化解决方案,致力于改善多类型项目的开发流程中的规范和非业务相关的问题,可以让开发者将绝大部分精力集中在 ...

  6. Java Review - PriorityQueue源码解读

    文章目录 Pre PriorityQueue 概述 PriorityQueue 继承关系 PriorityQueue通过用数组表示的小顶堆实现 时间复杂度 构造函数 方法 add()和offer() ...

  7. 「源码解读」知名程序员 TJ 的 only 库

    大家好,我是前端西瓜哥.我最近尝试开启一个源码解读系列,不定期解读一些简单或复杂的源码. 今天要解读 npm 第三方库的源码:only,仓库地址为:https://github.com/tj/node ...

  8. dva处理_dva 源码解读

    声明 本文章用于个人学习研究,并不代表 dva 团队的任何观点. 原文以及包含一定注释的代码见这里,若有问题也可以在这里进行讨论 起步 为什么是dva? 笔者对 dva 的源代码进行解读,主要考虑到 ...

  9. Python基于改进Unet的新冠肺炎等级分割系统(源码&教程)

    1.研究背景 新冠肺炎给人类带来极大威胁,自动精确分割新冠肺炎CT图像感染区域可以辅助医生进行诊断治疗,但新冠肺炎的弥漫性感染.感染区域形状多变.与其他肺部组织极易混淆等给CT图像分割带来挑战.为此, ...

最新文章

  1. 转载:JavaScript 的55个经典技巧
  2. 推荐一款带暂停功能的轮播组件,不要谢我,我叫红领巾!
  3. l源码安装mysql升级_[Linux]javaEE篇:源码安装mysql
  4. (转) 一张图解AlphaGo原理及弱点
  5. IntelliJ IDEA 快捷键(一)(window版)
  6. 【渝粤教育】国家开放大学2018年秋季 2111T病理学与病理生理学 参考试题
  7. java servlet 获取mac地址_Java开发网 - 请教大家几个关于servlet取ip和mac地址的问题~~!...
  8. 方法超出 android,Android工程方法数超过64k,The number of method references in a .dex file cannot exceed 64K....
  9. Gitlab+Jenkins学习之路(四)之gitlab备份和恢复
  10. AXI总线(top)
  11. uni-app实现XCode苹果本地离线打包APP
  12. 【2018-2019】咖啡般的生活,我们互相羡慕着彼此
  13. 淘特 Flutter 流畅度优化实践
  14. 计算机职称证的用途,计算机软考高项过了有什么用处
  15. 我的理想计算机作文300字,我的理想作文300字(通用5篇)
  16. Mysql的关闭启动与常用操作
  17. A8 CPRS结构
  18. 【转载】CRC16大全
  19. Win11便签打不开怎么办?Win11便笺停止工作解决方法
  20. 【傅老师DarkSouls第一季】05

热门文章

  1. ActiveMQ测试工具
  2. Postman怎么用?
  3. Jquery技巧:使用ajax技术提交表单数据
  4. PHP中的Array类型其实是Hashtable
  5. 因漏洞Dropbox用户邮件地址被泄露给垃圾邮件发送者
  6. drupal ajax json异步调用
  7. HDU-2502 月之数 组合数
  8. 520晚上,我用python破解了前女友的加密文件,结果却发现。。。
  9. Exchange管理台 启动EMC报错及解决方法集合(持续更新中...)
  10. java string转sql date_Java中的util.Date,sql.Date,sql.Time,String类型转换