本周学习的是U-net神经网络,据了解,U-net论文的作者是参加ISBI竞赛取得效果后发表的文章供大家学习,论文原文链接:
https://arxiv.org/abs/1505.04597
U-net最早用作生物图像识别,后来在目标检测、图像转换以及Tone Mapping,Reverse Tone Mapping很多地方都有应用,它区别于早期卷积神经网络的特点是早期的卷积层结果和最后基层的结果是采用级联的形式作为新的神经网络层。而U-net网络名称来源于这样一张图:
前面的下采样,提取出信息,后面进行具有“新特性”图像的重建,因为整个形状酷似U型所以被称为U-net
由图中可以看出,U-net主要由conv+relu,maxpooling,up-conv,conv1*1几个部分构成,使用TensorFlow函数化这几个部分结果如下:
1、conv+relu
1 def conv_relu_layer(net,numfilters,name): 2 network = tf.layers.conv2d(net, 3 activation=tf.nn.relu, 4 filters= numfilters, 5 kernel_size=(3,3), 6 padding='Valid', 7 name= "{}_conv_relu".format(name)) 8 return network
2、maxpooling
1 def maxpool(net,name): 2 network = tf.layers.max_pooling2d(net, 3 pool_size= (2,2), 4 strides = (2,2), 5 padding = 'valid', 6 name = "{}_maxpool".format(name)) 7 return network
3、up-conv
1 def up_conv(net,numfilters,name): 2 network = tf.layers.conv2d_transpose(net, 3 filters = numfilters, 4 kernel_size= (2,2), 5 strides= (2,2), 6 padding= 'valid', 7 activation= tf.nn.relu, 8 name = "{}_up_conv".format(name)) 9 return network
4、copy-prop
1 def copy_crop(skip_connect,net): 2 skip_connect_shape = skip_connect.get_shape() 3 net_shape = net.get_shape() 4 print(net_shape[1]) 5 size = [-1,net_shape[1].value,net_shape[2].value,-1] 6 skip_connect_crop = tf.slice(skip_connect,[0,0,0,0],size) 7 concat = tf.concat([skip_connect_crop,net],axis=3) 8 return concat
5、conv1*1
def conv1x1(net,numfilters,name): return tf.layers.conv2d(net,filters=numfilters,strides=(1,1),kernel_size=(1,1),name = "{}_conv1x1".format(name),padding='SAME')
1 #define input data 2 input = tf.placeholder(dtype=tf.float32,shape = (64,572,572,3)) 3 4 5 #define downsample path 6 network = conv_relu_layer(input,numfilters=64,name='lev1_layer1') 7 skip_con1 = conv_relu_layer(network,numfilters=64,name='lev1_layer2') 8 network = maxpool(skip_con1,'lev2_layer1') 9 network = conv_relu_layer(network,128,'lev2_layer2') 10 skip_con2 = conv_relu_layer(network,128,'lev2_layer3') 11 network = maxpool(skip_con2,'lev3_layer1') 12 network = conv_relu_layer(network,256,'lev3_layer1') 13 skip_con3 = conv_relu_layer(network,256,'lev3_layer2') 14 network = maxpool(skip_con3,'lev4_layer1') 15 network = conv_relu_layer(network,512,'lev4_layer2') 16 skip_con4 = conv_relu_layer(network,512,'lev4_layer3') 17 network = maxpool(skip_con4,'lev5_layer1') 18 network = conv_relu_layer(network,1024,'lev5_layer2') 19 network = conv_relu_layer(network,1024,'lev5_layer3') 20 21 #define upsample path 22 network = up_conv(network,512,'lev6_layer1') 23 network = copy_crop(skip_con4,network) 24 network = conv_relu_layer(network,numfilters=512,name='lev6_layer2') 25 network = conv_relu_layer(network,numfilters=512,name='lev6_layer3') 26 27 network = up_conv(network,256,name='lev7_layer1') 28 network = copy_crop(skip_con3,network) 29 network = conv_relu_layer(network,256,name='lev7_layer2') 30 network = conv_relu_layer(network,256,'lev7_layer3') 31 32 33 network = up_conv(network,128,name='lev8_layer1') 34 network = copy_crop(skip_con2,network) 35 network = conv_relu_layer(network,128,name='lev8_layer2') 36 network = conv_relu_layer(network,128,'lev8_layer3') 37 38 39 network = up_conv(network,64,name='lev9_layer1') 40 network = copy_crop(skip_con1,network) 41 network = conv_relu_layer(network,64,name='lev9_layer2') 42 network = conv_relu_layer(network,64,name='lev9_layer3') 43 network = conv1x1(network,2,name='lev9_layer4')
利用TensorFlow实现的U-net架构如下
(图片来源于百度)
学习过程中碰到一位GitHub大佬发表的项目,链接如下:
https://github.com/shuyucool/U-net-segmentation
并未实现自己的代码,本周只是对代码进行了解读
首先解压缩打开项目文件后运行data.py会在data文件夹下的
aug_label,aug_train,aug_merge,mergre,npydata文件夹生成数据增强后的图片
augimgs_mask_train.npy:所有增强后的"ground truth"数据,数据增强源是'data/train/label'路径下的图片
augimgs_train.npy : 所有增强后的"原图"数据,数据增强源是'data/train/image'路径下的图片
imgs_test.npy:'test'文件夹中的数据
unet.py文件用来训练模型,训练好的模型的最优参数会保存在unet.hdf5下
test_predict.py进行模型结果的可视化
imgs_mask_test.npy是对test文件夹下的测试图像进行预测得到的结果
运行test_predict.py即可将模型预测得到的结果进行可视化
最后data_version.py可以将测试集及其结果集保存为指定的图片格式以及指定的路径
注意程序最好在Ubuntu上跑,Windows中要进行很多改动
U-net的本质还是从cnn上改写过来的,之前对cnn了解并不是很深入,这次特别对cnn做了一些了解
与此同时通过查询资料了解到cnn的强大之处在于
1、较浅的卷积层感知域较小,容易学习到一些局部区域的特征
2、较深的卷积层感知域较大,能够学习到一些更加抽象的特征
这些抽象特征对物体的大小、位置和方向等敏感性更低,从而有助于分类性能的提高
而对u-net的根本认识还是要基于FCN啊,往后几天不打算往后进行什么,主要还是扎实基础
以上就是本周进度了,加油!