CV04-UNet笔记
目录
一、UNet模型
二、Encoder & Decoder
2.1 Encoder
2.2 Decoder
2.3 classifier
学习U-Net: Convolutional Networks for Biomedical Image Segmentation,记录一些自己认为重要的要点,以免日后遗忘。
代码:https://github.com/Ascetics/LaneSegmentation/blob/master/nets/unet.py
参考pytorch官方实现和文档做出自己的实现https://github.com/Ascetics/LaneSegmentation/blob/master/nets/unet.py
一、UNet模型
医学图像分类处理往往细化到像素级别。不仅仅是医学领域,语义分割都是像素级别的分类。于是U-Net诞生了,论文题目《U-Net:用于生物医学图像分割的卷积网络》,但是U-Net不仅仅是用于医学图像处理。
FCN的思想是特征提取阶段进行卷积、池化,图像分辨率减小,特征提取后面接上几层上采样(转置卷积)来提高分辨率。为提高分割精确度,将特征提取阶段的输出和上采样阶段输出做特征融合,这样网络就能学习到更精确的输出。
U-Net在FCN的基础上改造,需要的训练集更小,分割精确度更高。改造的部分是:上采样中仍保持特征的channel很大,特征融合直接使用特征提取阶段的输出,特征提取的输出直接concatenate到上采样输出的后面,保证更多的信息传递到分类阶段。于是形成了如论文图片中这样的U型结构。
U-Net左边是encoder阶段,由5个相似结构encode block构成。第一个encode block,2个不加padding的3×3卷积,每个卷积后面跟BN和ReLU激活函数;第二个到第五个encode block,先maxpool下采样,分辨率减小一倍通道增大一倍,再接2个不加padding的3×3卷积,每个卷积后面跟BN和ReLU激活函数。这5个encode block,除了最后一个之外,输出都要保留,再decoder里作为shortcut使用。
U-Net右边是decoder阶段,由相似结构decode block构成。每个结构里面先是转置卷积上采样2倍(kernel_size=2, stride=2),然后在后面拼接经过剪裁的对应encode block的输出(shortcut),然后是2个不加padding的3×3卷积,每个卷积后面跟BN和ReLU激活函数。每个decode block结构将通道减少一倍。
最后一个1×1卷积,将channel调整到n_class分类。
注意:图中对encoder阶段的剪裁是必要的,由于不加padding的卷积操作、池化等造成了边界像素的损失,必须经过剪裁才能让两个张量spatial大小一致,才能拼接。
二、Encoder & Decoder
Encoder & Decoder 实际上就是下采样、上采样的一种方式。U-Net提出的Encoder & Decoder并不是一定之规,encoder和decoder都可以根据需要用其他模型作为backbone进行替换,比如可以用ResNet作为backbone。记录一下Encoder & Decoder的细节,以及扩展应用方式。
2.1 Encoder
U-Net论文里面encoder的卷积操作不加padding,实际工程中可以改成加padding变成same卷积。
U-Net使用预训练的模型。U-Net更像一个框架,而不是一个模型。论文里面下采样每个结构都是两个卷积,也可以把这个结构替换成ResNet、ResNeXt、MobileNet等已经训练好的模型。Encoder中encode block的数量也不一定是5个,可以根据自己的需要加深。
以ResNet为例。
- 第1个encode block和input一致,所以直接用输入作为输出,pytorch中用空的nn.Sequencial作为encode block。输出shortcut0。
- 第2个encode block下采样2倍,所以用ResNet的Conv1、BN、ReLU作为encode block。输出shortcut1。
- 第3个encode block下采样2倍,所以用ResNet的maxpool、layer1(论文Conv2_x不做下采样)作为encode block。输出shortcut2。
- 第4个encode block下采样2倍,所以用ResNet的layer2(论文Conv3_x)作为encode block。输出shortcut3。
- 第5个encode block下采样2倍,所以用ResNet的layer3(论文Conv4_x)作为encode block。输出shortcut4。
- 第6个encode block下采样2倍,所以用ResNet的layer4(论文Conv5_x)作为encode block。输出不作为shortcut。
2.2 Decoder
U-Net的decoder是和encoder对称的逐层上采样,每个上采样后面跟了相似的结构,都是2个3×3卷积作为decode block,这就增加了decode的深度。
U-Net的上采样可以使用Transposed Convolution转置卷积,也可以使用Bilinear Interpolation双线性差值。对于不同的数据集可能要采取不同的上采样策略。
U-Net的特征融合,使用的是拼接concatenate,这与FCN的直接相加是不同的。
以ResNet为例。
- 第1个decode block。用第6个encode block输出上采样2倍,和shortcut4做cat,然后2个3x3卷积。最终输出的channels应该是第6个encode block输出channels的一半。
- 第2个decode block。用第1个decode block输出上采样2倍,和shortcut3做cat,然后2个3x3卷积。最终输出的channels应该是第1个decode block输出channels的一半。
- 第3个decode block。用第2个decode block输出上采样2倍,和shortcut2做cat,然后2个3x3卷积。最终输出的channels应该是第2个decode block输出channels的一半。
- 第4个decode block。用第3个decode block输出上采样2倍,和shortcut1做cat,然后2个3x3卷积。最终输出的channels应该是第3个decode block输出channels的一半。
- 第5个decode block。用第4个decode block输出上采样2倍,和shortcut0做cat,然后2个3x3卷积。最终输出的channels应该是第4个decode block输出channels的一半。
2.3 classifier
最后一个decode block还需要经过1个1x1卷积,将输出channels调整到n_class个分类。
相关文章:

Scrapy 学习笔记(-)
Scrapy Scrapy 是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中。其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以应用在获取API所返回的数据(例如 A…

Ubuntu18.04运行ORB_SLAM2
运行环境:Ubuntu18.04 预先安装的库 需要预先安装一些库,如Eign,Sophus,OpenCV等。笔者在阅读《SLAM十四讲》的时候已经安装,在此不再赘述。 ORB_SLAM2源码的下载与编译 git clone https://github.com/raulmur/ORB…

java中的各种流(老师的有道云笔记)
内存操作流-字节之前的文件操作流是以文件的输入输出为主的,当输出的位置变成了内存,那么就称为内存操作流。此时得使用内存流完成内存的输入和输出操作。如果程序运行过程中要产生一些临时文件,可采用虚拟文件方式实现;直接操作磁…

iOS SwiftUI篇-4 注解@State、@Binding、@ObservedObject、@EnvironmentObject、@Environment
iOS SwiftUI篇-4 注解@State、@Binding、@ObservedObject、@EnvironmentObject、@Environment @State 关联View的状态,当@State修饰的属性改变时,对应的View会跟着刷新,符合MVVM的设计理念 @State var count: Int = 0Section(header: Text("@States")) {Te
CV05-ResNet笔记
目录 一、为什么是ResNet 二、Residual Learning细节 2.1 shortcut计算 2.2 11卷积调整channel维度大小 2.3 ResNet层数 2.4 ResNet里的Basic Block 和 Bottleneck Block 2.5 Global Average Pooling 全局平均池化 2.6 Batch Normalization 学习ResNet,记录…

二叉树的前序,中序,后序的递归、迭代实现
二叉树的前序遍历 递归实现 递归实现没什么好说的。个人感觉将函数功能看成一个整体,不要去想栈中怎么实现的。毕竟自己的脑袋不是电脑,绕着绕着就蒙了。 void preordered_traversal_recursion(TreeNode* root) {if(root NULL) return;container.pus…

DataSet 动态添加列
public DataSet GetNewId(List<string> IdArr){DataSet ds new DataSet();DataTable newtb new DataTable();DataColumn column new DataColumn("cnt", typeof(string));//新增列newtb.Columns.Add(column);for (int i 0; i < IdArr.Count; i){StringBu…

iOS专题1-蓝牙扫描、连接、读写
iOS专题1-蓝牙扫描、连接、读写 概念 外围设备 可以被其他蓝牙设备连接的外部蓝牙设备,不断广播自身的蓝牙名及其数据,如小米手环、共享单车、蓝牙体重秤 中央设备 可以搜索并连接周边的外围设备,并与之进行数据读写通讯,如手机 日常生活中常见的场景是手机app通过蓝…

CV06-Xception笔记
目录 一、为啥是Xception 二、Xception结构 2.1 Xception结构基本描述 2.2 实现细节 2.3 DeepLabV3改进 三、记录pytorch采坑relu激活函数inplaceTrue Xception笔记,记录一些自己认为重要的要点,以免日后遗忘。 复现Xception论文、DeepLabV改进的…

C++排序算法实现(更新中)
比较排序法:如冒泡排序、简单选择排序、合并排序、快速排序。其最优的时间复杂度为O(nlogn)。 其他排序法:如桶排序、基数排序等。时间复杂度可以达到O(n)。但试用范围有要求。 桶排序:排序的数组元素跨距不能很大。因为跨距很大的话…

iOS SwiftUI篇-5 专题NavigationView、NavigationLink
iOS SwiftUI篇-5 专题NavigationView、NavigationLink NavigationView:标题、展示模式、隐藏导航栏、隐藏返回按钮、添加导航栏按钮 NavigationLink:Text文本跳转、Image图片跳转、Button按钮跳转、点击按钮根据业务跳转到不同页面 NavigationView 标题、展示模式 import S…

PHP artisan
Artisan 是 Laravel 提供的 CLI(命令行接口),它提供了非常多实用的命令来帮助我们开发 Laravel 应用。前面我们已使用过 Artisan 命令来生成应用的 App Key 和控制器。在本教程中,我们会用到以下 Artisan 命令,你也可以…

【转载】Pytorch在加载模型参数时指定设备
转载 https://sparkydogx.github.io/2018/09/26/pytorch-state-dict-gpu-to-cpu/ >>> torch.load(tensors.pt) # Load all tensors onto the CPU >>> torch.load(tensors.pt, map_locationtorch.device(cpu)) # Load all tensors onto the CPU, using a fun…

目标检测之Faster-RCNN的pytorch代码详解(数据预处理篇)
首先贴上代码原作者的github:https://github.com/chenyuntc/simple-faster-rcnn-pytorch(非代码作者,博文只解释代码) 今天看完了simple-faster-rcnn-pytorch-master代码的最后一个train.py文件,是时候认真的总结一下了࿰…

hp-ux 集群,内存 小记
hp-ux 集群,内存 小记 -----查看hp 集群状态信息 # cmviewcl -v CLUSTER STATUS dbsvr up NODE STATUS STATE db01 up running Cluster_Lock_LVM: VOLUM…

iOS SwiftUI篇-6 专题TabView
iOS SwiftUI篇-6 专题TabView TabView: 图片+文字组成tabItem,选中时改变图片和文字颜色 跳转到二级页面时隐藏tabbar,返回到首页时显示tabbar 首页、我的两个tab,效果图: 图片文字组成tabItem,选中时改变图片和文字颜色 代码: struct MainContentView: View {@State…

三维刚体变化中Rcw,tcw的含义
高翔博士的《视觉SLAM十四讲》中,介绍Tcw指从世界坐标w到c的变换矩阵。但研一学机器人学的时候,讲T12的含义是,坐标系2相对于坐标系1的变换。于是一脸懵逼。昨天想了一晚上,有了一点自己的想法,在这记录一下࿰…

CV07-DeepLab v3+笔记
目录 一、Dilated Convolution 膨胀卷积 二、ASPP与Encoder & Decoder 三、深度可分离卷积 3.1 深度可分离卷积原理 3.2 深度可分离卷积减小参数量和计算量 3.3 深度可分离卷积实现细节 四、Xception作为Backbone DeepLab v3笔记,记录一些自己认为重要的…

1116.加减乘除
题目描述:根据输入的运算符对输入的整数进行简单的整数运算。 运算符只会是加、减-、乘*、除/、求余%、阶乘!六个运算符之一。 输出运算的结果,如果出现除数为零,则输出“error”,如果求余运算的第二个运算数为0,也输出…

Flutter专题1-环境搭建
Flutter专题1-环境搭建和创建项目 这里以MaciOS为例,其他平台参考官网https://flutter.dev/docs/get-started/install 1. 系统要求 系统:macOS (64-bit) 硬盘空间:2.8G 工具:Git 2.获取Flutter SDK 2.1下载SDK,从https://flutter.dev/docs/development/tools/s…

ORB_SLAM2源码:ORBmatcher.cc
ORBmatcher.cc中的函数,主要实现(1)路标点和特征点的匹配(2D-3D点对)。(2)特征点和特征点的匹配(2D-2D点对)。SearchByProjection的函数重载看得我一脸懵逼。在这做一下笔…

iOS国际化技巧
参考链接:http://www.cocoachina.com/ios/20151120/14258.html http://www.jianshu.com/p/88c1b65e3ddb http://www.cnblogs.com/levilinxi/p/4296712.html http://www.cocoachina.com/appstore/20160310/15632.html http://www.cocoachina.com/ios/20170214/18681.html转载于:…

CV08-数据预处理与数据增强
复现车道线分割项目(Lane Segmentation赛事说明在这里),学习数据预处理和数据增强。学习分为Model、Data、Training、Inference、Deployment五个阶段,也就是建模、数据、训练、推断、部署这五个阶段。现在进入的是Data阶段。项目的…

ORB_SLAM2程序入口(System.cc)
程序入口 ORB_SLAM2的程序入口为src/System.cc。在CMakeList.txt中可知,ORB_SLAM2的可执行程序为: Examples/Stereo/stereo_kitti.cc等。 add_executable(stereo_kitti Examples/Stereo/stereo_kitti.cc) target_link_libraries(stereo_kitti ${PROJECT…

HDU 6229 Wandering Robots 找规律+离散化
题目链接:Wandering Robots 题解:先讲一下规律,对于每一个格子它可以从多少个地方来有一个值(可以从自己到自己),然后答案就是统计合法格子上的数与所有格子的数的比值 比如说样例的3 0格子上的值就是 3 4 …

app、H5、safari、appstore应用主页评分页之间拉起调用、打开手机某些系统功能、app打开文档
定义打开URL的方法 - (void)openURL:(NSString *)urlStr {NSURL *url [NSURL URLWithString:urlStr];UIApplication *app [UIApplication sharedApplication];if ([app canOpenURL:url]) { #ifdef __IPHONE_10_0[app openURL:url options:[NSDictionary dictionary] complet…
XML学习总结
1、XML结构 2、XmlNodeType值为一个枚举类型: 假设我们对一个XML文件进行遍历,不推断节点是否为Element类型。就会将文本节点遍历出来,出现#test。 3、XmlElement和XmlNode的差别:(摘自CSDN论坛) ÿ…

Linux01-基本操作与Shell
目录 一、环境 二、Linux目录结构及基本操作 2.1 Linux目录结构 2.2 基本操作 三、shell 3.1 shell的意义 3.2 su - 一、环境 2019年搞下RHCE的证书,但是一直没有整理Linux学习的笔记,为了不让到手的知识被遗忘,从今天起整理Linux学习…

ORB_SLAM2中Tracking线程的三种追踪方式
1、参考关键帧追踪模式 bool Tracking::TrackReferenceKeyFrame()对参考关键帧中的路标点进行跟踪。在Tracking线程中,每传入一帧,都会进行位姿优化。 以上一帧的位姿为当前位姿进行优化。 (1)计算当前帧的词袋 mCurrentFra…

nodejs 中间件 反向代理 接口转发
背景 随着后端业务系统的增加,纵向需求不断扩展,一个业务系统已经无法满足需求了,衍生出多个业务系统,对外暴露的ip、端口就可能有多个,此时不方便外部接口调用,有些特殊行业客户出于安全性考虑不发提供多…