3.Unet的学习

摘要

众所周知,成功的深度神经网络训练需要成千的带注释的训练样本。在本文中,我们提出了一个网络和训练策略,它依赖数据增强的使用,更有效的使用带注释的样本。结构包括捕获文本信息的contract path和能够精确定位的对称扩展路径。我们表明,这样一个网络可以通过很少的图像进行端到端的训练,在电子显微镜堆栈中神经元分割的ISBI挑战方面,其性能优于先前的最佳方法(滑动窗口卷积网络)。使用相同的网络在transmitted light microscopy images上训练(phase contrast and DIC),我们通过这种策略以较大的优势赢得了ISBIcell tracking挑战2015。而且,网络很快速。在最近的GPU上,一张512×512图像的分割需要时间不到一秒钟。全部的运行(基于Caffe)和训练过的网络可在http://lmb.informatik.uni-freiburg.de/people/ronneber/u-net获得。

1.引言

卷积神经网络的发展。
全卷积网络的主要思想:通过连续的层补充通常的contract层,其中池化操作被上采样操作代替。这些层增加了输出的分辨率。为了实现局部化,将contract path的高分辨率特征与上采样输出结合。
Unet的重要改进是:上采样部分有大量的特征通道。
通过对可用训练图像应用elastic deformations,我们使用了过度的数据增强。
建议使用加权损失( weighted loss),其中触摸单元(touching cells)间的分离背景在损失函数中有较大的权重。

2.网络结构

包括左部的contracting path和右部的expansive path。
contracting path重复两个3×3的卷积(无pad),每个卷积后有一个ReLU。接着是两个用于下采样的2×2最大池化操作(2步长)。每次下采样都加倍特征通道。
expansive path每一步都包括一个上采样(对特征图的)、一个2×2卷积(“up-convolution”,特征通道减半)、一个连接(对应的contracting path的裁剪特征图)、两个3×3的卷积、一个ReLU(每个卷积后)。需要剪裁crop(卷积时会丢失边缘像素)。
最后一层包括一个1×1的卷积(将64-component特征向量映射到所需要分的类中)。
输出:output segmentation map
在这里插入图片描述

3.训练

  1. 输入图像+对应的分割图,使用Caffe堆积梯度下降
  2. 输出图像比输入图像大一个边界宽度
  3. 大的输入块
  4. 高动量0.99

soft-max:pk(x) = exp(ak(x))/(ΣKk’=1exp(ak’(x)))
ak(x)指的是像素位置为x∈Ω(Ω∈Z2),特征通道为k的activation
K是类别的数量
pk(x)是近似的maximum-function
交叉熵在每个位置上penalizepε(x)(x)与1的偏差
E = Σx∈Ωw(x)log(pε(x)(x))
ε:Ω → {1, . . . , K} 是每个像素的真实标签
w : Ω → R是引入的权重图
预先计算每个ground truth的权重图
权重图:w(x) = wc(x)+w0·exp(-(d1(x)+d2(x))2/2σ2)
wc(x):Ω → R指权重图(平衡类别频率)
d1:Ω → R指最接近cell的边界距离
d2:Ω → R指第二接近cell的边界距离
w0=0,σ≈5 pixels

Unet完全是一个卷积(输入可以是任意的)的结构。

代码

参考:
https://www.bilibili.com/video/BV1Vq4y127fB/?spm_id_from=333.999.0.0
https://www.bilibili.com/video/BV1rq4y1w7xM/?spm_id_from=333.999.0.0

实现方法:

  • 现在会在卷积层中加入padding、不改变特征层的高和宽,卷积和relu中会加入bn。
  • 这样连接时,不需要进行中心裁剪。

问题

1.argparse模块

编写用户友好的命令行接口,用户可以通过一些命令调用存在的程序,将运行结果显示出来。

步骤

  • 1.导入argparse,定义一个ArgumentParser对象实例;
  • 2.使用add_argument()方法,向实例中添加参数;
  • 3.使用parse_args()方法解析该实例对象中的参数。使得参数创建并生效。

argumentParser.add_argument(name or flags…[,action][,nargs][,const][,default][,type][,choices][,required][,help][,metavar][,dest])

name或flags:指定可选参数或位置参数。
	'--'前缀为可选,剩下为位置

action:应该如何处理命令行参数
	默认为action='store',仅保存参数值
	action='help',输出程序帮助信息
	
choice:参数限定的范围[]

dest:自定义ArgumentParser的参数属性名称
	例如dest="a",那么可以通过args.a访问该参数
def parse_args():
import argparse
parse = argparse.ArgumentParser()
parse.add_argument("--data path", default = "../", help = "DRIVE root path")
args=parse.parse_args()
return args

def main(args):
	print(args.data_path)

if __name__ == '__main__':
	args=parse.parse_args()
	main(args)

2.assert和raise

assert 表达式,返回数据
返回数据可为字符串或输出结果,若表达式为False,则输出返回数据

raise exceptionName(decription)

3.Image.open(ImgPath)、.convert(mode)、Image.fromarray(obj)

Image.open(ImgPath) 打开的图片是PIL类型的,它自带resize函数。

  由于pytorch的顺序是(batch,c,h,w),所以需要进行PIL类型到numpy类型转换,tensorflow,numpy的顺序是(batch,h,w,c)。

img=np.array(img)

convert()是图像实例对象的一个方法,接受一个 mode 参数,用以指定一种色彩模式

  • 1:(1位像素,黑白,每字节一个像素存储)

  • L:(8位像素,黑白)

  • RGB:(3x8位像素,真彩色)

     若图片类型不是RGB的,需要.convert('RGB')。
    
obj=Image.fromarray(obj),转为PIL格式

4.zip()函数、参数

zip
  将可迭代对象作为参数,将其打包成元组,返回对象。

  可将其转成元组组成的列表或元组组成的其他。

def cat(*b):
    a=zip(*b)
    return a
s=[(1,2),(3,4),(5,6)]
b=cat(*[i for i in s])
print(b)     #=> <zip object at 0x00000265DDB5FB40>
print(tuple(b))  #=> ((1, 3, 5), (2, 4, 6))

非关键参数:*,数量可变,元组形式。
关键参数:**,字典形式。

5.fill_()、copy_()

a.fill_(6):用6填充a
a.copy_(b):把b复制给a

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值