lesson6-图像分割-小象c
显著性检测:1)显著性物体检测-最能引起视觉注意的物体区域2)注视点预测:人类视觉注意机制
视觉注意机制的两种机制:1)自底而上基于数据驱动的注意机制,如颜色、边缘 2)自上而下基于任务驱动的目标的注意机制,如认知因素钟的只是、预期、兴趣
物体分割:Gragh Cuts分割~最小割最大流算法优化
GrabCut分割:前景/背景的颜色分割 ~ 高斯混合模型,Kneans获得(高斯混合包括Kmeans和EM算法)、
美图秀秀用到
需要给初始标记
语义分割:
目标:从像素水平上,理解、识别图片的内容;根据语义信息分割
输入图片,输出同尺寸的分割标记(像素水平),每个像素会被识别为一个类别category ;
不需要标记,自己生成的
算法研究:
2015前:手工特征+图模型(马尔科夫/条件随机场CRF)
之后:深度神经网模型
传统cnn的问题:后半段网络无空间信息;输入图片尺寸固定
全卷机网络FCN:所有层都是卷积层(Googlenet等还是有全局的卷积层,因为需要把二维的空间信息变为一维的概率信息节点);解决降采样后的低分辨率问题~稀疏输出
语义分割是像素级别、更为精确的,比rcnn系列网络改进的要更深入和充分,且输出就是要原图尺寸的,所以可以使用完全意义上的全卷机网络
语义分割要求2-D输出尺寸,逐个像素的 ~ 一般都为FCN系列
检测网络 ~ rcnn系列
分类网络 ~ cnn系列
FCN:全卷机网络 2015年
卷积化:所有全连接层转换为卷积层;适应任何尺寸输入,输出低分辨率分割图片~因为几个像素会变为一个像素,所以分辨率降低
VGG\AlexNet之所以要固定图片尺寸,是因为最后一层卷积层,但是全改为卷积层后就不需要控制输入尺寸
但是
卷积化后的核尺寸:gc6-8~1*1,4096 -1*1,4096-1*1,N个类别 ~前两个1*1卷积是特征变换的作用,最后一个是特征推断的作用
分辨率下降32倍~五层卷积层,2的5次方
-->
反卷积:将低分辨率图片进行上采样,输出同分辨率/同尺寸的分割图片 ~反卷积上采样32倍 ~会有信息损失
卷积:3*3,步长2 反卷积:3*3,步长1/2 ;反卷积核是卷积核的转至,学习率为0~因为反卷积的前向和后巷传播分别对应卷积操作的后巷和前向传播,优化上做颠倒就行,故学习率为0
也叫转至卷积
FCN-卷积/转至卷积的参数关系:
s=1时:
核尺寸: k k
步长 : s s
padding:p k-p-1
输入:i o
输出:o i + (k-1)-2p
s>1 and a=i+2p-k整除s时:
k k
s 1(因为1/s小数步长,是通过补零输入实现的)
p k-p-1,不整除时在上方和右方再补0~p’=amods --- 不对称补0
i i‘=i+(s-1)(i-1)
o s(i'-1)+a+k-2p,a=0 当不整除s时,a!=0
DeepLab网络
DeepLab-DCNN:
--》
因为反卷积不能完全恢复信息,所以Deeplab提出了更好的方案
~因为vgg前面五个卷积层都有pooling,所以在第五个卷积层的地方加上了反卷积上采样,导致信息丢失
基本结构:优化后的DCNN(分辨率下降)+双线性插值上采样+传统的CRF图模型
新的上采样卷积方案:带孔hole结构的膨胀卷积Atrous dilated convolution
多尺度图片表达:atrous空间金字塔池化
边界分割的优化:使用全连接条件随机场CRF进行迭代优化
孔算法
--》
解决原始fcn网络的输出低分率问题
无上采样,恢复感受野,可以finetue,保证了网络最终的高分辨率输出(仅8倍降采样)
参数数量不变、计算量不变
卷积核结构:尺寸不变3*3,步长不变1,但是元素间距变大(1-》2)
采用层:conv5即第五卷机组~孔尺寸2 conv6~孔尺寸4 (第四池化层步长2变为1,导致第五卷积层感受野变小,所以孔尺寸为1,即中间补0 ; 普通池化,卷积核3,步长为2,padding=1--》输出4个节点-》 密集池化,步长为1,padding=1,输出7个,其中四个对应的就是普通池化的输出--》 孔算法,padding=2,卷积核间隔补0 ,不是输入神经元补0 !)
膨胀卷积atrous/dilated convolution
--》
孔算法的正式名称
与降低池化曾步长配对使用,取代上采样反卷积
孔尺寸-rate,越大,感受也越大,插rate-1个0
孔算法带来的增加的输出其实对应的就是stride从2变为1后,对应的特征图多出的神经元的位置,也就是孔的位置
atrous金字塔池化:
不同感受也也就是不同rate捕捉不同尺寸上的特征
在conv6层引入4个并行膨胀卷积,kernel=3,rate=6,12,18,24
4个膨胀卷积后各自增加两个1*1卷积:是为了做在像素级别上的特征推断
fc6-》fc7-》fc8 深度 4096-》2014-》类别数量 ~ 三个分支
融合:三个分支概率融合
全连接CRF:
通过迭代精化分割结果
输入:第一次输入 dcnn输入结果,后面输入crf迭代结果
跳层结构skip layer:精化分割图片
可以拟合出双线性插值,双。。可以作为全卷机的特例
分为偶数/奇数输入输出
但是
直接使用32倍反卷积得到的分割结果粗糙
-->
skip layers:
使用前两个卷积层的输出做融合~跳层:pool4和pool3后会增加一个1*1卷积层做预测,生成预测图,再融合,再做上采样;
较浅网络更加精确,较深网络的结果鲁棒,所以现在可以棒两个深浅信息都用起来
最后的反卷积层分两类1)固定为双线性插值,不学习2)初始化为双线性插值,需要学习
基础cnn网络:Alexnet、vgg。。
反池化操作:记录池化时选的是哪一个位置~开关变量,这样反池化时可以恢复
使用Alexnet构建FCN:
1、使用alexnet作为初始网络,保留参数;舍弃最后一个全连接层
2、替换两个同深度的卷积层(4096,1,1);追加一个预测卷积层(21,1,1);追加一个步长为32的双线性插值反卷积层
3、conv7进行2倍上采样;提取pool4输出,追加预测卷积层;相加融合;追加步长为1的双线性插值反卷积层
4、对上次融合结果2倍上采样;提取pool3输出,追加预测卷积层;相加融合;追加步长为8的双线性插值反卷积层
训练:
初始化:卷积层~前5个卷积层使用初始cnn网络的参数;剩余第六第七卷积层初始化为0
反卷积层~最后一层反卷积固定为双线性插值,不做学习;其他的需融合的需要学习
FCN网络缺点:
边缘检测性比较差,故第一个卷积层大量补0,之后做剪裁
代码:
https://blog.csdn.net/weixin_38437404/article/details/78089035?locationNum=10&fps=1
https://blog.csdn.net/dawei_01/article/details/79569466
TypeError: Can't convert 'bytes' object to str implicitly
解决方法:使用字节码的decode()方法。
示例:
str = 'I am string'
byte = b' I am bytes'
s = str + byte
print(s)
这时会报错:TypeError: Can't convert 'bytes' object to str implicitly
解决方法:
s = str + byte.decode()
evaluate:批量评估 reference:单个评估
utils:辅助类
@layer~装饰器:
Python装饰器的用法,具体教程看这个链接:http://wiki.jikexueyuan.com/project/explore-python/Functional/decorator.html
装饰器的作用是:封装成可以组装的基本网络层(卷积、膨胀卷积、池化等),方便组装复杂网络
装饰器用于装饰(包裹、封装)原有函数的输出,返回的是包装后的函数layer_decorated
需要装饰的函数,在其函数名上方追加装饰器@layer
对函数做封装,不改变函数本身的实现,但在其上再封装别的调用功能,如调用conv函数时,先调用装饰器,即def layer函数,并且传入要包装的函数,在layer decorated中解析要包装的函数的参数。
network.py:
return self-返回类对象,才能执行类相关操作
setup(self, is_training)网络构建函数,需要子类做实现
model.py:
DeepLab-ResNet-101网络定义,基于ResNet-101.
必须要继承network中的layer,否则其中的setup函数会报异常
(self.feed('data')
.conv(7, 7, 64, 2, 2, biased=False, relu=False, name='conv1')
.batch_normalization(is_training=is_training_bn, activation_fn=tf.nn.relu, name='bn_conv1')
.max_pool(3, 3, 2, 2, name='pool1')
# 残差直连的通道升维,因为此处特征的2D尺寸有降维
.conv(1, 1, 256, 1, 1, biased=False, relu=False, name='res2a_branch1')
.batch_normalization(is_training=is_training_bn, activation_fn=None, name='bn2a_branch1'))
返回值self之后追加各层,因为maxpool的步长为2,所以2d尺寸有降维,即长宽都减小了一半。所以在残差直连时需要通道升维,即从64升到256
# 第四卷积组,第22残差单元
# atrous膨胀卷积,Rate = 2
.atrous_conv(3, 3, 256, 2, padding='SAME', biased=False, relu=False, name='res4b21_branch2b')
第四卷机组共有23个残差单元,其中3*3的卷积使用膨胀卷积
Conv4第四卷机组用的rate=2
conv5第五卷机组用的rate=4
# 第六卷积组,atrous空间金字塔池化(4个并行膨胀卷积)
BATCH_SIZE = 4 --现存不够时,减少batchsize,最少为1
batchsize小是因为输出时密集输出,高分辨率的
# 获取不同类型的网络权重参数名
不同分组 -如可训练的、全连接的、w的--因为学习率时不同的
# 定义优化器
opt_conv = tf.train.MomentumOptimizer(learning_rate, args.momentum)
opt_fc_w = tf.train.MomentumOptimizer(learning_rate * 10.0, args.momentum)
opt_fc_b = tf.train.MomentumOptimizer(learning_rate * 20.0, args.momentum)
# 加载已有的checkpoint文件
if args.restore_from is not None:
loader = tf.train.Saver(var_list=restore_var)
手动、断电停止后,也可继续训练
load(loader, sess, args.restore_from)
Python装饰器的用法,具体教程看这个链接:
http://wiki.jikexueyuan.com/project/explore-python/Functional/decorator.html
装饰器的作用是:封装成可以组装的基本网络层(卷积、膨胀卷积、池化等),方便组装复杂网络 --》
可以看到,类 Bold
有两个方法:
__init__()
:它接收一个函数作为参数,也就是被装饰的函数__call__()
:让类对象可调用,就像函数调用一样,在调用被装饰函数时被调用
还可以让类装饰器带参数:
class Tag(object):
def __init__(self, tag):
self.tag = tag
def __call__(self, func):
def wrapped(*args, **kwargs):
return "<{tag}>{res}</{tag}>".format(
res=func(*args, **kwargs), tag=self.tag
)
return wrapped
@Tag('b')
def hello(name):
return 'hello %s' % name
需要注意的是,如果类装饰器有参数,则 __init__
接收参数,而 __call__
接收 func
。
lesson6-图像分割-小象c的更多相关文章
- CNCC2017中的深度学习与跨媒体智能
CNCC2017中的深度学习与跨媒体智能 转载请注明作者:梦里茶 目录 机器学习与跨媒体智能 传统方法与深度学习 图像分割 小数据集下的深度学习 语音前沿技术 生成模型 基于贝叶斯的视觉信息编解码 珠 ...
- React.js 小书 Lesson6 - 使用 JSX 描述 UI 信息
作者:胡子大哈 原文链接:http://huziketang.com/books/react/lesson6 转载请注明出处,保留原文链接和作者信息. 这一节我们通过一个简单的例子讲解 React.j ...
- Android | 教你如何用华为HMS MLKit 图像分割 SDK开发一个证件照DIY小程序
Android | 教你如何用华为HMS MLKit 图像分割 SDK开发一个证件照DIY小程序 引子 上期给大家介绍了如何使用如何用华为HMS MLKit SDK 三十分钟在安卓上开发一个微笑抓 ...
- 图像分割之(三)从Graph Cut到Grab Cut
zouxy09@qq.com http://blog.csdn.net/zouxy09 上一文对GraphCut做了一个了解,而现在我们聊到的GrabCut是对其的改进版,是迭代的Graph Cut. ...
- 图像分割之(二)Graph Cut(图割)
zouxy09@qq.com http://blog.csdn.net/zouxy09 上一文对主要的分割方法做了一个概述.那下面我们对其中几个比较感兴趣的算法做个学习.下面主要是Graph Cut, ...
- 以图像分割为例浅谈支持向量机(SVM)
1. 什么是支持向量机? 在机器学习中,分类问题是一种非常常见也非常重要的问题.常见的分类方法有决策树.聚类方法.贝叶斯分类等等.举一个常见的分类的例子.如下图1所示,在平面直角坐标系中,有一些点 ...
- 图像分割之(四)OpenCV的GrabCut函数使用和源码解读
图像分割之(四)OpenCV的GrabCut函数使用和源码解读 分类: 图像处理 计算机视觉 2013-01-23 ...
- mean shift 图像分割(一、二、三)
https://blog.csdn.net/u011511601/article/details/72843247 MeanShift图像分割算法:大概是将复杂的背景,通过粗化提取整体信息,进而将图像 ...
- 基于图的图像分割(Graph-Based Image Segmentation)
一.介绍 基于图的图像分割(Graph-Based Image Segmentation),论文<Efficient Graph-Based Image Segmentation>,P. ...
- 深度学习图像分割——U-net网络
写在前面: 一直没有整理的习惯,导致很多东西会有所遗忘,遗漏.借着这个机会,养成一个习惯. 对现有东西做一个整理.记录,对新事物去探索.分享. 因此博客主要内容为我做过的,所学的整理记录以及新的算法. ...
随机推荐
- Mac上搭建nginx教程
1.安装Homebrew ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/in ...
- Python自然语言处理---TF-IDF模型
一. 信息检索技术简述 信息检索技术是当前比较热门的一项技术,我们通常意义上的论文检索,搜索引擎都属于信息检索的范畴.信息检索的问题可以抽象为:在文档集合D上,对于关键词w[1]…w[k]组成的查询串 ...
- 深度学习caffe测试代码c++
#include <caffe/caffe.hpp> #include <opencv2/core/core.hpp> #include <opencv2/highgui ...
- 关于学习Vue的前置工作/技术储备
关于学习Vue的前置工作/技术储备 1.GitBatch 2.Sublime Text 3.Node-----npm 命令 本人用的idea GitBatch: GitBatch是一个可以编写shel ...
- awk使用教程
gawk - pattern scanning and processing language 基本用法:gawk [options] 'program' FILE ... program:PATTE ...
- core1.1 升级到 2.0
1.直接修改项目 1.1 改成 2.0 Startup 的修改 去除构造函数中下面的代码 var builder = new ConfigurationBuilder() .SetBasePath(e ...
- Interlocked单向链式栈
线程同步一大部分与原子访问(atomic access)有关, 所谓原子访问, 指的是一个线程在访问某个资源的同时能够保证没有其他线程会在同一时刻访问同一资源. Interlocked单向链式栈的操作 ...
- centos7配置hadoop集群
一:测试环境搭建规划: 主机名称 IP 用户 HDFS YARN hadoop11 192.168.1.101 hadoop NameNode,DataNode NodeManager hadoop1 ...
- springboot学习章节代码-Spring MVC基础
1.项目搭建. <?xml version="1.0" encoding="UTF-8"?> <project xmlns="htt ...
- Linux下Ganglia集群监控安装、配置笔记
http://www.blogjava.net/henry14/archive/2011/12/17/ganglia.html 枪声依旧 Linux下Ganglia集群监控安装.配置笔记 Gangli ...