2.Fully Convolutional Networks for Semantic Segmentation论文记录
欢迎访问个人网络日志🌹🌹知行空间🌹🌹
文章目录
- 1.基础介绍
- 2.分类网络转换成全卷积分割网络
- 3.转置卷积进行上采样
- 4.特征融合
- 5.一个pytorch源码实现
- 参考资料
1.基础介绍
论文:Fully Convolutional Networks for Semantic Segmentation
Fully Convolutional Networks, FCN是2014年11月UC Berkeley的Jonathan Long等提交的论文中提出的。论文的主要工作是设计了用于语义分割的全卷积网络结构,能够实现端到端的训练,输出逐像素的稠密预测结果。因为使用了全卷积结构,可以不用限制输入的大小。全卷积网络借用了分类网络的预训练权重,在下采样特征提取部分可以使用分类网络模型的权重。
FCN网络中作者的主要工作有三部分:
- 1)将分类网络转换成用于分割任务的全卷积网络
- 2)使用转置卷积进行上采样得到分割输出,不再同以往的方法使用
shift-stitch方法 - 3)将低层的空间信息和高层的语义信息相融合,fuse what and where information
2.分类网络转换成全卷积分割网络
分类任务中,网络模型中多使用了全连接层,因此要求固定的网络输入,如alexnet/vgg/googlenet等,作者认为,全连接和卷积操作是类似的,都是加权求和,只不过全连接层应当被看成感受野是整个特征图的卷积层。将全连接层换成卷积层,可以给模型任意大小的输入,输出相应大小的分割图。

如上图,移除特征提取后的全连接层前的flatten操作,将全连接换成卷积层,在这里可以得到10x10的带空间位置信息的预测热力图。
通过对此添加上采样层,并对网络使用带空间信息的损失函数,可以得到用于语义分割的全连接网络模型:

如上图就是一个可以端到端训练的全卷积语义分割模型。
3.转置卷积进行上采样
使用分类网络进行特征提取的过程中,使用了池化层,对特征图进行了下采样,这会导致细节信息的丢失,导致得到的分割结果比较粗糙。在以往的分割算法中,对于这种情况使用的是shift-stitch方法。
假设降采样因子为s,那么output map(这里为了简单起见,仅考虑二维)的spatial size则是input的 1/s,向左或向上(向右向下情况一样平移input map,偏移量为(x,y), 其中,x,y∈{0,1,..,s−1}x,y\in\{0,1,..,s-1\}x,y∈{0,1,..,s−1}。这样就得到 s2s^2s2个 inputs,通过网络前向传播自然得到 s2s^2s2 个outputs,将outputs 交织成与origin input 大小相同的output map,就实现了pixel级别的dense prediction。
设网络只有一层 2x2 的maxpooling 层且 stride = 2,所以下采样因子 为2, 我们需要对input image 的 pixels 平移 (x,y)个单位,即将 image 向左平移 x 个pixels , 再向上平移y个单位,整幅图像表现向左上方向平移,空出来的右下角就以0 padding 。我们当然可以采取 FCN论文中的做法,将图像向右下角平移,空出来的左上角用 0 padding ,这两种做法产生的结果是一致的,没有本质区别。(x,y) 取(0,0), (0,1),(1,0),(1,1) 后,就产生了 s2=4s^2=4s2=4个input,不妨记为: shifted input (0,0)、shifted input (0,1),shifted input (1,0),shifted input (1,1)(图中的数字表示像素值,不是索引值 )。

4个input分别进行 2x2 的maxpooling操作后,共产生了4个output,
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OVbCsXXV-1678278382307)(/images/Segmentation/2FCN/3.jpeg)]
最后,stitch the 4 different output获得dense prediction,

以上就是
shift-and-stitch的过程,引用自1
以上可以看到,对于一个图像需要输入预测s2s^2s2次,比较耗时。
在FCN中作者使用转置卷积作为上采样层,通过可学习的参数对特征图进行插值上采样,能够得到更好的结果。

关于转置卷积的详细介绍可以参考3.转置卷积
4.特征融合
作者在论文中还提到的是combine what and where,具体是指在分类网络的特征提取下采样过程中,随着网络变深,卷积感受野变大,因此,高层卷积的特征图中包含更多的语义信息(更有全局视野,空间信息丰富,know where),而低层卷积的特征图包含更多的细节信息(know what),为了改善语义分割的结果,自然的想法就是将低层和高层特征图信息相融合。

在这里FCN-32s直接将pooling5层的输出进行32倍上采样得到的分割结果,FCN-16s是将pooling4的结果和pool5的结果2x上采样后element-wise求和得到的,同样的方式可以得到FCN-8s。作者在实验部分也指出了,融合what and where特征后输出的分割结果更好,如下图所示。

在这里特征融合使用的方式是size相同的特征图,元素间相加求和,如此将低层卷积的结果传递给高层特征图,这种方式和ResNet的恒等映射思想有些相似,不过ResNet是2015年12月提交的论文。除了element-wise求和外,还有不少论文使用的是concatenation on channel,像2015年05月份的U-Net,2021年04月份的STDCNet等。
5.一个pytorch源码实现
参考自3
class FCN16s(nn.Module):def __init__(self, pretrained_net, n_class):super().__init__()self.n_class = n_classself.pretrained_net = pretrained_netself.relu = nn.ReLU(inplace=True)self.deconv1 = nn.ConvTranspose2d(512, 512, kernel_size=3, stride=2, padding=1, dilation=1, output_padding=1)self.bn1 = nn.BatchNorm2d(512)self.deconv2 = nn.ConvTranspose2d(512, 256, kernel_size=3, stride=2, padding=1, dilation=1, output_padding=1)self.bn2 = nn.BatchNorm2d(256)self.deconv3 = nn.ConvTranspose2d(256, 128, kernel_size=3, stride=2, padding=1, dilation=1, output_padding=1)self.bn3 = nn.BatchNorm2d(128)self.deconv4 = nn.ConvTranspose2d(128, 64, kernel_size=3, stride=2, padding=1, dilation=1, output_padding=1)self.bn4 = nn.BatchNorm2d(64)self.deconv5 = nn.ConvTranspose2d(64, 32, kernel_size=3, stride=2, padding=1, dilation=1, output_padding=1)self.bn5 = nn.BatchNorm2d(32)self.classifier = nn.Conv2d(32, n_class, kernel_size=1)def forward(self, x):output = self.pretrained_net(x)x5 = output['x5'] x4 = output['x4'] score = self.relu(self.deconv1(x5)) score = self.bn1(score + x4) score = self.bn2(self.relu(self.deconv2(score))) score = self.bn3(self.relu(self.deconv3(score))) score = self.bn4(self.relu(self.deconv4(score))) score = self.bn5(self.relu(self.deconv5(score))) score = self.classifier(score) return score
欢迎访问个人网络日志🌹🌹知行空间🌹🌹
参考资料
- 1.https://zhuanlan.zhihu.com/p/56035377
- 2.https://medium.com/image-processing-and-ml-note/fcn-fully-convolutional-network-semantic-segmentation-b81fdcc3c845
- 3.https://github.com/bat67/pytorch-FCN-easiest-demo/blob/master/FCN.py
相关文章:
2.Fully Convolutional Networks for Semantic Segmentation论文记录
欢迎访问个人网络日志🌹🌹知行空间🌹🌹 文章目录1.基础介绍2.分类网络转换成全卷积分割网络3.转置卷积进行上采样4.特征融合5.一个pytorch源码实现参考资料1.基础介绍 论文:Fully Convolutional Networks for Semantic Segmentati…...
深度解析Spring Boot自动装配原理
废话不多说了,直接来看源码。源码解析SpringBootApplication我们在使用idea创建好Spring Boot项目时,会发现在启动类上添加了SpringBootApplication注解,这个注解就是Spring Boot的核心所在。点击注解可以查看到到它的实现ementType.TYPE) Re…...
Linux:环境变量
目录一、环境变量的理解(1)什么是环境变量?(2)Linux中的环境变量二、环境变量的使用(1)PATH环境变量(2)和变量相关的指令三、环境变量与普通变量的区别在平时使用电脑的时…...
Codeforces Round 703 (Div. 2)(A~D)
A. Shifting Stacks给出一个数组,每次可以将一个位置-1,右侧相邻位置1,判断是否可以经过若干次操作后使得数列严格递增。思路:对于每个位置,前缀和必须都大于该位置应该有的最少数字,即第一个位置最少是0&a…...
Django项目5——基于tensorflow serving部署深度模型——windows版本
1:安装docker for windows 可能需要安装WLS2,用于支持Linux系统,参照上面的教程安装 2:在Powershell下使用docker docker pull tensorflow/serving3:在Powershell下启动tensorflow serving docker run -p 8500:8500 …...
MySQL基础篇3
第一章 多表关系实战 1.1 实战1:省和市 方案1:多张表,一对多 方案2:一张表,自关联一对多 id1 name‘北京’ p_id null; id2 name‘昌平’ p_id1 id3 name‘大兴’ p_id1 id3 name‘上海’ p_idnull id4 name‘浦东’…...
携程 x TiDB丨应对全球业务海量数据增长,一栈式 HTAP 实现架构革新
随着新冠病毒疫情的缓解和控制,全球旅游业逐渐开始重新复苏。尤其在一些度假胜地,游客数量已经恢复到疫情前的水平。 携程作为全球领先的一站式旅行平台,旗下拥有携程旅行网、去哪儿网、Skyscanner 等品牌。携程旅行网向超过 9000 万会员提供…...
记一次Kafka warning排查过程
1、前因 在配合测试某个需求的时候,正好看到控制台打印了个报错,如下: 2023-03-06 17:05:58,565[325651ms][pool-28-thread-1][org.apache.kafka.common.utils.AppInfoParser][WARN] - Error registering AppInfo mbean javax.management.I…...
MySQL学习笔记(6.视图)
1. 视图作用 (1). 简化业务,将多个复杂条件,改为视图 (2). mysql对用户授权,只能控制表权限,通过视图可以控制用户字段权限。 (3). 可以避免基本表变更,影响业务。只需更改视图即可。 2. 视图(创建&…...
java多线程与线程池-01多线程知识复习
多线程知识复习 文章目录 多线程知识复习第1章 多线程基础1.1.2 线程与进程的关系1.2 多线程启动1.2.1 线程标识1.2.2 Thread与Runnable1.2.3 run()与start()1.2.4 Thread源码分析1.3 线程状态1.3.1 NEW状态1.3.2 RUNNABLE状态1.3.3 BLOCKED状态1.3.4 WAITING状态1…...
Typescript - 将命名空间A导入另一个命名空间B作为B的子命名空间,并全局暴露命名空间B
前言 最近相统一管理 ts 中的类型声明,这就需要将各模块下的命名空间整合到全局的命名空间下,牵涉到从别的文件中引入命名空间并作为子命名空间在全局命名空间中统一暴露。 将命名空间A导入另一个命名空间B作为B的子命名空间 文件说明 assets.ts 文件中…...
Windows下实现Linux内核的Python开发(WSL2+Conda+Pycharm)
许多软件可以通过Python交互,但没有开发Windows版本,这个时候装双系统或虚拟机都很不方便,可以采取WSL2CondaPycharm的策略来进行基于Linux内核的Python开发。启动WSL2,安装Linux内核教程:旧版 WSL 的手动安装步骤 | M…...
新闻发布网站分析及适用场景
在当今数字时代,发布新闻的渠道已经不再局限于传统媒体,越来越多的企业、组织和个人开始使用互联网平台发布新闻稿,以提升品牌知名度和影响力。本文将介绍一些可以发布新闻的网站,并分析其特点和适用场景。一、新闻稿发布平台1.新…...
云原生时代顶流消息中间件Apache Pulsar部署实操之Pulsar IO与Pulsar SQL
文章目录Pulsar IO (Connector连接器)基础定义安装Pulsar和内置连接器连接Pulsar到Cassandra安装cassandra集群配置Cassandra接收器创建Cassandra Sink验证Cassandra Sink结果删除Cassandra Sink连接Pulsar到PostgreSQL安装PostgreSQL集群配置JDBC接收器创建JDBC Sink验证JDBC …...
Input子系统(一)启动篇
代码路径 基于AndroidS(12.0)代码 system/core/libutils/Threads.cppframeworks/base/services- java/com/android/server/SystemServer.java- core- java/com/android/server/input/InputManagerService.java- jni/com_android_server_input_InputMan…...
WuThreat身份安全云-TVD每日漏洞情报-2023-03-08
漏洞名称:Agilebio Lab Collector 远程命令执行 漏洞级别:高危 漏洞编号:CVE-2023-24217,CNNVD-202303-375 相关涉及:Agilebio Lab Collector 4.234 漏洞状态:EXP 参考链接:https://tvd.wuthreat.com/#/listDetail?TVD_IDTVD-2023-05536 漏洞名称:PrestaShop “Xen Forum”模…...
ABP IStringLocalizer部分场景不生效的问题
问题描述: 本地项目依赖注入本地化服务时候生效,第三方项目调用本地接口时候出现本地化失效的问题。 解决方案: 第三方服务封装的 GetHttp 请求的请求头中添加 语言相关信息 request.Headers.Add("accept-language", "zh-C…...
数组(四)-- LC[167] 两数之和-有序数组
1 两数之和 1.1 题目描述 题目链接:https://leetcode.cn/problems/two-sum/description/ 1.2 求解思路 1. 暴力枚举 最容易想到的方法是枚举数组中的每一个数 x,寻找数组中是否存在 target - x 参考代码 class Solution(object):def twoSum(self, n…...
Mac电脑,python+appium+安卓模拟器使用步骤
1、第一步,环境搭建,参考这位博主的文章,很齐全 https://blog.csdn.net/qq_44757414/article/details/128142859 我在最后一步安装appium-doctor的时候,提示权限不足,换成sudo appium-doctor即可 2、第二步࿰…...
LaTeX投稿Elsevier期刊必备:elsarticle.cls从安装到实战避坑指南
LaTeX投稿Elsevier期刊必备:elsarticle.cls从安装到实战避坑指南 科研工作者向Elsevier投稿时,elsarticle.cls文档类是最常用的工具之一。不同于基础教程,本文将聚焦实际投稿过程中的高频痛点,从环境配置到排版细节,提…...
Python实现中国象棋AI对战【完整代码+算法解析】
1. 中国象棋AI对战系统设计思路 中国象棋AI对战系统的核心在于将传统规则转化为计算机可执行的逻辑,同时赋予AI"思考"能力。我最初尝试开发这个项目时,发现最大的挑战不是代码实现,而是如何让AI理解象棋的策略本质。经过多次迭代&a…...
为什么AI提示工程可持续发展需要“数据驱动”?提示工程架构师的决策逻辑
《数据驱动:AI提示工程可持续发展的底层逻辑——提示工程架构师的决策密码》 一、引言:从“碰运气”到“做科学”,提示工程的必经之路 你有没有过这样的经历? 为了让大语言模型(LLM)生成符合需求的内容&…...
STEP3-VL-10B真实案例分享:数学题图解、文档OCR、GUI定位全演示
STEP3-VL-10B真实案例分享:数学题图解、文档OCR、GUI定位全演示 1. 模型简介与核心能力 STEP3-VL-10B是阶跃星辰(StepFun)开源的轻量级多模态基础模型,拥有10B参数量,在视觉感知、复杂推理和人类对齐能力方面表现出色…...
威联通NAS结合阿里云实现安全远程访问:域名与SSL证书全流程配置
1. 为什么需要为威联通NAS配置域名和SSL证书? 很多朋友买了威联通NAS后都会遇到一个头疼的问题:怎么在外面也能安全地访问家里的NAS?直接暴露IP地址不仅难记,还存在安全隐患。我刚开始用NAS时也踩过不少坑,后来发现用阿…...
构建高性能本地服务穿透通道:Rust异步网络隧道实践
构建高性能本地服务穿透通道:Rust异步网络隧道实践 【免费下载链接】tunnelto Expose your local web server to the internet with a public URL. 项目地址: https://gitcode.com/GitHub_Trending/tu/tunnelto 在分布式开发和远程协作日益普及的今天&#x…...
WebREPL完全指南:突破嵌入式开发环境限制 开发者的无线调试解决方案
WebREPL完全指南:突破嵌入式开发环境限制 开发者的无线调试解决方案 【免费下载链接】webrepl WebREPL client and related tools for MicroPython 项目地址: https://gitcode.com/gh_mirrors/we/webrepl 价值定位:如何突破传统开发环境限制&…...
K8s配置管理实战:如何优雅地通过ConfigMap挂载应用配置文件
1. ConfigMap基础:为什么它是Kubernetes配置管理的瑞士军刀 第一次接触Kubernetes时,我习惯性地把配置文件打包进Docker镜像,结果每次改配置都要重新构建镜像,CI/CD流水线跑得我怀疑人生。直到发现了ConfigMap这个神器,…...
v-md-editor进阶技巧:如何在Vue2中实现markdown与HTML的双向转换
Vue2项目中v-md-editor深度应用:Markdown与HTML双向转换实战指南 在内容管理系统、技术文档平台或博客应用中,Markdown与HTML格式的相互转换是开发者常遇到的核心需求。v-md-editor作为Vue生态中功能强大的Markdown编辑器,其双向转换能力往往…...
中国科协发布声明:停止受理学者参加NeurIPS 2026会议资助申请
点击下方卡片,关注“CVer”公众号AI/CV重磅干货,第一时间送达点击进入—>【顶会/顶刊】投稿交流群添加微信号:CVer2233,小助手拉你进群!扫描下方二维码,加入CVer学术星球!可以获得最新顶会/顶…...
