python实现语义分割_语义分割算法之FCN论文阅读及源码实现

论文原文

创新点

提出了一种端到端的做语义分割的方法,

wAAACwAAAAAAQABAEACAkQBADs=

在这里插入图片描述

如图,直接拿分割的ground truth作为监督信息,训练一个端到端的网络,让网络做p像素级别的预测。

如何设计网络结构

如何做像素级别的预测

wAAACwAAAAAAQABAEACAkQBADs=

在这里插入图片描述

在VGG16中的第一个全连接层的维度是25088×4096的,将之解释为512x7x7x4096的卷积核,这样最后就会得到一个featuremap。这样做的好处在于可以实现迁移学习的fine-tune。最后我们对得到的feature map进行bilinear上采样,就是反卷积层。就可以得到和原图一样大小的语义分割后的图了。

如何保证精度

我们在做upsampling时,步长是32,输入为3x500x500的时候,输出是544×544,边缘很不好。所以我们采用skip layer的方法,在浅层处减小upsampling的步长,得到的fine layer 和 高层得到的coarse layer做融合,然后再upsampling得到输出。这种做法兼顾local和global信息,即文中说的combining what and where,取得了不错的效果提升。FCN-32s为59.4,FCN-16s提升到了62.4,FCN-8s提升到62.7。可以看出效果还是很明显的。

wAAACwAAAAAAQABAEACAkQBADs=

在这里插入图片描述

论文结果

wAAACwAAAAAAQABAEACAkQBADs=

在这里插入图片描述

wAAACwAAAAAAQABAEACAkQBADs=

在这里插入图片描述

代码实现

FCN8#coding=utf-8

from keras.models import *

from keras.layers import *

import os

def crop(o1, o2, i):

o_shape2 = Model(i, o2).output_shape

outputHeight2 = o_shape2[1]

outputWidth2 = o_shape2[2]

o_shape1 = Model(i, o1).output_shape

outputHeight1 = o_shape1[1]

outputWidth1 = o_shape1[2]

cx = abs(outputWidth1 - outputWidth2)

cy = abs(outputHeight2 - outputHeight1)

if outputWidth1 > outputWidth2:

o1 = Cropping2D(cropping=((0,0), (0, cx)))(o1)

else:

o2 = Cropping2D( cropping=((0,0) , ( 0 , cx )))(o2)

if outputHeight1 > outputHeight2 :

o1 = Cropping2D( cropping=((0,cy) , ( 0 , 0 )))(o1)

else:

o2 = Cropping2D( cropping=((0, cy ) , ( 0 , 0 )))(o2)

return o1, o2

def FCN8(nClasses, input_height=416, input_width=608, vgg_level=3):

img_input = Input(shape=(input_height, input_width, 3))

x = Conv2D(64, (3, 3), activation='relu', padding='same', name='block1_conv1')(img_input)

x = Conv2D(64, (3, 3), activation='relu', padding='same', name='block1_conv2')(x)

x = MaxPooling2D((2, 2), strides=(2, 2), name='block1_pool')(x)

f1 = x

# Block 2

x = Conv2D(128, (3, 3), activation='relu', padding='same', name='block2_conv1')(x)

x = Conv2D(128, (3, 3), activation='relu', padding='same', name='block2_conv2')(x)

x = MaxPooling2D((2, 2), strides=(2, 2), name='block2_pool')(x)

f2 = x

# Block 3

x = Conv2D(256, (3, 3), activation='relu', padding='same', name='block3_conv1')(x)

x = Conv2D(256, (3, 3), activation='relu', padding='same', name='block3_conv2')(x)

x = Conv2D(256, (3, 3), activation='relu', padding='same', name='block3_conv3')(x)

x = MaxPooling2D((2, 2), strides=(2, 2), name='block3_pool')(x)

f3 = x

# Block 4

x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block4_conv1')(x)

x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block4_conv2')(x)

x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block4_conv3')(x)

x = MaxPooling2D((2, 2), strides=(2, 2), name='block4_pool')(x)

f4 = x

# Block 5

x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block5_conv1')(x)

x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block5_conv2')(x)

x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block5_conv3')(x)

x = MaxPooling2D((2, 2), strides=(2, 2), name='block5_pool')(x)

f5 = x

x = Flatten(name='flatten')(x)

x = Dense(4096, activation='relu', name='fc1')(x)

x = Dense(4096, activation='relu', name='fc2')(x)

#x = Dense(1000, activation='softmax', name='predictions')(x)

#vgg = Model(img_input, x)

#vgg.load_weights(VGG_Weights_path)

o = f5

o = (Conv2D(4096, (7, 7), activation='relu', padding='same'))(o)

o = Dropout(0.5)(o)

o = (Conv2D(4096, (1, 1), activation='relu', padding='same'))(o)

o = Dropout(0.5)(o)

o = (Conv2D(nClasses, (1, 1), kernel_initializer='he_normal'))(o)

o = Conv2DTranspose(nClasses, kernel_size=(4, 4), strides=(2, 2), use_bias=False)(o)

o2 = f4

o2 = (Conv2D(nClasses, (1, 1), kernel_initializer='he_normal'))(o2)

o, o2 = crop(o, o2, img_input)

o = Add()([o, o2])

o = Conv2DTranspose(nClasses, kernel_size=(4, 4), strides=(2, 2), use_bias=False)(o)

o2 = f3

o2 = (Conv2D(nClasses, (1, 1), kernel_initializer='he_normal'))(o2)

o2, o = crop(o2, o, img_input)

o = Add()([o2, o])

o = Conv2DTranspose(nClasses , kernel_size=(16,16), strides=(8,8), use_bias=False)(o)

o_shape = Model(img_input, o).output_shape

outputHeight = o_shape[1]

outputWidth = o_shape[2]

o = (Reshape((-1, outputHeight*outputWidth)))(o)

o = (Permute((2, 1)))(o)

o = (Activation('softmax'))(o)

model = Model(img_input, o)

model.outputWidth = outputWidth

model.outputHeight = outputHeight

return model

FCN32#coding=utf-8

from keras.models import *

from keras.layers import *

import os

def FCN32(n_classes, input_height=416, input_width=608, vgg_level=3):

img_input = Input(shape=(3, input_height, input_width))

x = Conv2D(64, (3, 3), activation='relu', padding='same', name='block1_conv1')(img_input)

x = Conv2D(64, (3, 3), activation='relu', padding='same', name='block1_conv2')(x)

x = MaxPooling2D((2, 2), strides=(2, 2), name='block1_pool')(x)

f1 = x

# Block 2

x = Conv2D(128, (3, 3), activation='relu', padding='same', name='block2_conv1')(x)

x = Conv2D(128, (3, 3), activation='relu', padding='same', name='block2_conv2')(x)

x = MaxPooling2D((2, 2), strides=(2, 2), name='block2_pool')(x)

f2 = x

# Block 3

x = Conv2D(256, (3, 3), activation='relu', padding='same', name='block3_conv1')(x)

x = Conv2D(256, (3, 3), activation='relu', padding='same', name='block3_conv2')(x)

x = Conv2D(256, (3, 3), activation='relu', padding='same', name='block3_conv3')(x)

x = MaxPooling2D((2, 2), strides=(2, 2), name='block3_pool')(x)

f3 = x

# Block 4

x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block4_conv1')(x)

x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block4_conv2')(x)

x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block4_conv3')(x)

x = MaxPooling2D((2, 2), strides=(2, 2), name='block4_pool')(x)

f4 = x

# Block 5

x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block5_conv1')(x)

x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block5_conv2')(x)

x = Conv2D(512, (3, 3), activation='relu', padding='same', name='block5_conv3')(x)

x = MaxPooling2D((2, 2), strides=(2, 2), name='block5_pool')(x)

f5 = x

x = Flatten(name='flatten')(x)

x = Dense(4096, activation='relu', name='fc1')(x)

x = Dense(4096, activation='relu', name='fc2')(x)

x = Dense(1000, activation='softmax', name='predictions')(x)

#vgg = Model(img_input, x)

#vgg.load_weights(VGG_Weights_path)

o = f5

o = (Conv2D(4096, (7, 7), activation='relu', padding='same'))(o)

o = Dropout(0.5)(o)

o = (Conv2D(4096, (1, 1), activation='relu', padding='same'))(o)

o = Dropout(0.5)(o)

o = (Conv2D(n_classes, (1, 1), kernel_initializer='he_normal'))(o)

o = Conv2DTranspose(n_classes, kernel_size=(64, 64), strides=(32, 32), use_bias=False)(o)

o_shape = Model(img_input, o).output_shape

outputHeight = o_shape[1]

outputWidth = o_shape[2]

o = (Reshape((-1, outputHeight*outputWidth)))(o)

o = (Permute((2, 1)))(o)

o = (Activation('softmax'))(o)

model = Model(img_input, o )

model.outputWidth = outputWidth

model.outputHeight = outputHeight

return model

欢迎关注我的微信公众号GiantPadaCV,期待和你一起交流机器学习,深度学习,图像算法,优化技术,比赛及日常生活等。

wAAACwAAAAAAQABAEACAkQBADs=

图片.png

https://www.jianshu.com/p/70c4354a1035

Python量化投资网携手4326手游为资深游戏玩家推荐:《《梦幻西游》:42届武神坛之战消极比赛处理决定》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/555919.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

右上角的引用文献格式_论文要引用的小符号右上角怎么打?

上标是【现在】论【文的】书写【都会】【用到】引用【的小】符号,上标【一般】用【来对】所标的【文字】【或者】段落【进行】进【一步】【的解】释,【所以】常【用来】【解释】含义,【或者】出处,【而其】【解释】【一般】在书【…

mysql服务器程序_MySQL服务器

1、安装通常系统在成功安装之后就已经自带MySQL服务器以及客户端了。查询MySQL及其相关文件是否安装:rpm -qa | grep perlrpm -qa | grep mysql如果没有安装,则可以使用yum进行安装:yum -y install perl-DBIyum -y install perl-DBD-MySQLyum…

Java中List的contains方法,你用对了吗?

Java语言中的List是我们处理集合时经常会用到的。而List定义了一个contains方法,用以判断一个集合中是否包含指定的一个对象。 大家应该有用到过吧,可是你真的会用,用对了吗? 看看下面的代码。 上图代码中,创建了两个…

mysql初体验学习笔记_【MySQL】mycli初体验

早就听说mycli很好用,今天打算在本地测试机上装一下体验一把。安装方法很是简单:一、安装依赖:yum install python-pip python-devel二、安装myclipip install mycli这样就安装完了。三、使用方法[rootlocalhost .pip]# mycli --helpUsage: m…

ArrayList类contains方法实现原理

以ArrayList集合示例 思考&#xff1a;contains方法如何执行&#xff1f; public static void main(String [] args){List<String> listnew ArrayList<String>(); list.add("张三"); System.out.println(list.contains("张三"); }分析contai…

Mybatis源码分析之(一)搭建一个mybatis框架(写一个mybatis的Demo)

数据库工作&#xff1a; 首先准备工作&#xff0c;安装mysql&#xff0c;并且新建一张t_demo表 CREATE TABLE t_demo (name varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,id int(11) NOT NULL AUTO_INCREMENT,PRIMARY KEY (id) ) ENGINEInnoDB AUTO_INCREMENT4 DEFAUL…

后端开发 java_Java后端开发三年,你不得不了解的JVM

JAVA程序员&#xff0c;三年是个坎&#xff0c;如果过了三年你还没有去研究JVM的话&#xff0c;那么你这个程序员只能是板砖的工具了。下面来个JVM的解析可好&#xff1f;JVM是Java Virtual Machine(Java虚拟机)的缩写&#xff0c;也就是指的JVM虚拟机&#xff0c;属于是一种虚…

Mybatis源码分析之(二)根据配置文件创建SqlSessionFactory(Configuration的创建过程)

SqlSessionFactoryBuilder.build创建SqlSessionFactory&#xff08;粗略走一步流程&#xff09; 看完上篇文章后&#xff0c;你对mybatis应该有个大概的了解了&#xff0c;那么我们知道new SqlSessionFactoryBuilder().build是框架的入口&#xff0c;我们到SqlSessionFactoryB…

Mybatis源码分析之(三)mapper接口底层原理(为什么不用写方法体就能访问到数据库)

mybatis是怎么拿sqlSession 在 上一篇的时候&#xff0c;我们的SqlSessionFactoryBuilder已经从xml文件中解析出了Configuration并且返回了sessionFactory。 然后我们要从session;中拿到sqlSession public class DefaultSqlSessionFactory implements SqlSessionFactory {pr…

mysql count distinct case when_统计符合条件的去重过的数量 - - count distinct if case

现有表结构&#xff1a;CREATE TABLE example_dataset (id int(11) unsigned NOT NULL AUTO_INCREMENT,tel bigint(11) DEFAULT NULL,gender varchar(11) DEFAULT NULL,PRIMARY KEY (id)) ENGINEInnoDB AUTO_INCREMENT1 DEFAULT CHARSETutf8mb4;插入数据INSERT INTO example_da…

Mybatis源码分析之(六)mybatis拦截器(Interceptor)的实现原理

文章目录前言InterceptorChain保存所有的Interceptor创建四大对象都走ConfigurationInterceptorChain增强对象方法Plugin封装动态代理&#xff0c;让你使用Mybatis拦截器更简单Invocation&#xff0c;让我们能在拦截器中使用动态代理类中的invoke方法中的对象调用时序图小结前言…

oauth2 java 获取token_OAuth2 Token 一定要放在请求头中吗?

Token 一定要放在请求头中吗&#xff1f; 答案肯定是否定的&#xff0c;本文将从源码的角度来分享一下 spring security oauth2 的解析过程&#xff0c;及其扩展点的应用场景。Token 解析过程说明当我们使用 spring security oauth2 时, 一般情况下需要把认证中心申请的 token …

java开发原则_java开发中,大家处理异常的原则是什么,是如何处理的?

展开全部最熟悉的陌生人&#xff1a;异常异常的类e5a48de588b63231313335323631343130323136353331333361326365型Throwable— Exception—- RuntimeException— Error需要注意的是&#xff0c;RuntimeException及其子类不需要在方法签名中显示注明异常抛出。例如&#xff1a;v…

java 线程 spring_java中spring里实现多线程

Spring通过任务执行器(TaskExecutor)来实现多线程和并发编程的可使用ThreadPoolTaskExecutor来实现基于线程池的TaskExecutor在实际开发中由于多是异步&#xff0c;所以使用EnableAsync来支持异步任务&#xff0c;且要在Bean的方法中使用Async来声明其是一个异步任务?????…

出现503错误 怎么办

展开全部 出现503错误原因及解决办法 原因&#xff1a;web服务器不能处理HTTP请求&#xff0c;可能是临时超载或者是服务器进行维护。 解决办法&#xff1a;用户需要等待服务器的临时处理。在这种状态下&#xff0c;一些服务器可以简单的拒绝socket连接&#xff0c;否则会发…

java枚举类中字段有没有必要加final____枚举类字段 Field ‘xxx‘ may be ‘final‘

java枚举类中字段有没有必要加final 今天在写一个系统统一返回码的枚举类时候&#xff0c;突然想到一个问题&#xff0c;当不小心手抖给枚举类自动生成了set方法&#xff0c;而恰巧在用的地方不小心用了set方法&#xff0c;从而修改了code值&#xff0c;由于枚举类是天然单例&a…

MySQL数据库索引及失效场景

文章目录1. MySQL索引概述1.1 索引的概念1.2 索引的特点1.3 索引的分类1.4 索引的使用场景2. 索引失效场景2.1 索引失效9种场景2.2 索引失效场景总结3. 索引失效验证3.1 全值匹配3.2 最佳左前缀3.3 索引计算3.4 索引范围&#xff1a;索引列上不能有范围查询3.5 索引覆盖&#x…

getLong java_java.lang.Long.getLong()方法实例

全屏java.lang.Long.getLong(String nm) 方法确定具有指定名称的系统属性的long值。如果没有具有指定名称的属性&#xff0c;如果指定名称为空或null&#xff0c;或者该属性没有正确的数字格式&#xff0c;则返回null。声明以下是java.lang.Long.getLong()方法的声明public sta…

@JsonProperty注解解析

1. 概述 来源: JsonPrpperty是jackson包下的一个注解&#xff0c;详细路径(com.fasterxml.jackson.annotation.JsonProperty;)作用:JsonProperty用在属性上&#xff0c;将属性名称序列化为另一个名称。例子&#xff1a;public class Person{JsonProperty(value "name&qu…

java swing panel问题_关于 Java swing Box 的使用问题

代码import javax.swing.*;import java.awt.*;public class C5Ex1_2 {final static int WIDTH 400;final static int HEIGHT 400;public C5Ex1_2() {JFrame jf new JFrame("program 1");jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);jf.setSize(WIDTH, HEI…