|
- # Copyright (c) Nanjing University, Vision Lab.
- # Last update: 2019.06.14
-
- from __future__ import absolute_import
- from __future__ import division
- from __future__ import print_function
-
- import numpy as np
- from tensorlayer.layers import Module
- import tensorlayer as tl
-
- def myabs(x):
- pos = tl.ops.Maximum()(x, 0)
- neg = tl.ops.Minimum()(x, 0)
- out = pos + neg*(-1)
- return out
-
- class _VoxceptionResNet(Module): #已改
- """Voxception Residual Network Block.
- Arguments:
- num_filters: number of filters passed to a convolutional layer.
- """
- def __init__(self, num_filters, name, activation=tl.ReLU):
- super().__init__()
- #path_1
- self.conv1_1 = tl.layers.Conv3d(n_filter=int(num_filters/4),
- filter_size=(3,3,3),
- act=activation,
- padding='SAME',
- W_init=tl.initializers.XavierUniform(),
- b_init=tl.initializers.zeros(),
- name=name+'_conv1_1')
-
- self.conv1_2 = tl.layers.Conv3d(n_filter=int(num_filters/2),
- filter_size=(3,3,3),
- act=activation,
- padding='SAME',
- W_init=tl.initializers.XavierUniform(),
- b_init=tl.initializers.zeros(),
- name=name+'_conv1_2')
- #path_2
- self.conv2_1 = tl.layers.Conv3d(n_filter=int(num_filters/4),
- filter_size=(1,1,1),
- act=activation,
- padding='SAME',
- W_init=tl.initializers.XavierUniform(),
- b_init=tl.initializers.zeros(),
- name=name+'_conv2_1')
-
- self.conv2_2 = tl.layers.Conv3d(n_filter=int(num_filters/4),
- filter_size=(3,3,3),
- act=activation,
- padding='SAME',
- W_init=tl.initializers.XavierUniform(),
- b_init=tl.initializers.zeros(),
- name=name+'_conv2_2')
-
- self.conv2_3 = tl.layers.Conv3d(n_filter=int(num_filters/2),
- filter_size=(1,1,1),
- act=activation,
- padding='SAME',
- W_init=tl.initializers.XavierUniform(),
- b_init=tl.initializers.zeros(),
- name=name+'_conv2_3')
-
- def forward(self, x):
- # path1
- tensor1_1 = self.conv1_1(x)
- tensor1_2 = self.conv1_2(tensor1_1)#tensor1_2.shape: (1, 32, 32, 32, 16)
- # path2
- tensor2_1 = self.conv2_1(x)
- tensor2_2 = self.conv2_2(tensor2_1)
- tensor2_3 = self.conv2_3(tensor2_2) #tensor2_3.shape: (1, 32, 32, 32, 16)
- # concat paths
- residual = tl.layers.Concat(concat_dim=-1)([tensor1_2, tensor2_3])
- #residual = tf.concat([tensor1_2, tensor2_3], axis=-1) #residual.shape: (1, 32, 32, 32, 32)
- # add & relu
- output = tl.layers.LeakyReLU(alpha=0.0)(x + residual)
- #output = tf.nn.relu(x + residual) #output.shape: (1, 32, 32, 32, 32)
- return output
-
- class AnalysisTransform(Module): #已改
- """Analysis transformation.
- Arguments:
- None.
- """
- def __init__(self):
- super(AnalysisTransform, self).__init__()
-
- def vrn_block(num_filters, name):
- return _VoxceptionResNet(num_filters, name)
- activation=tl.ReLU
- self.conv_in = tl.layers.Conv3d(n_filter=16,
- filter_size=(3,3,3),
- act=activation,
- padding='SAME',
- W_init=tl.initializers.XavierUniform(),
- b_init=tl.initializers.zeros(),
- name="conv_in")
-
- self.vrn1_1 = vrn_block(16, 'vrn1_1')
- self.vrn1_2 = vrn_block(16, 'vrn1_2')
- self.vrn1_3 = vrn_block(16, 'vrn1_3')
-
- self.down_1 = tl.layers.Conv3d(n_filter=32,
- filter_size=(3,3,3),
- strides=(2,2,2),
- act=activation,
- padding='SAME',
- W_init=tl.initializers.XavierUniform(),
- b_init=None,
- name="down_1")
-
- self.vrn2_1 = vrn_block(32, 'vrn2_1')
- self.vrn2_2 = vrn_block(32, 'vrn2_2')
- self.vrn2_3 = vrn_block(32, 'vrn2_3')
-
- self.down_2 = tl.layers.Conv3d(n_filter=64,
- filter_size=(3,3,3),
- strides=(2,2,2),
- act=activation,
- padding='SAME',
- W_init=tl.initializers.XavierUniform(),
- b_init=None,
- name="down_2")
-
- self.vrn3_1 = vrn_block(64, 'vrn3_1')
- self.vrn3_2 = vrn_block(64, 'vrn3_2')
- self.vrn3_3 = vrn_block(64, 'vrn3_3')
-
- self.conv_out = tl.layers.Conv3d(n_filter=16,
- filter_size=(3,3,3),
- padding='SAME',
- W_init=tl.initializers.XavierUniform(),
- b_init=tl.initializers.zeros(),
- name="conv_out")
-
- def forward(self, x):
-
- feature1 = self.conv_in(x)# [N,N,N,16]
- feature1_1 = self.vrn1_1(feature1)
- feature1_2 = self.vrn1_2(feature1_1)
- feature1_3 = self.vrn1_3(feature1_2)# [N,N,N,16]
-
- feature2 = self.down_1(feature1_3)# [N/2,N/2,N/2,32]
- feature2_1 = self.vrn2_1(feature2)
- feature2_2 = self.vrn2_2(feature2_1)
- feature2_3 = self.vrn2_3(feature2_2)# [N/2,N/2,N/2,32]
-
- feature3 = self.down_2(feature2_3)# [N/4,N/4,N/4,64]
- feature3_1 = self.vrn3_1(feature3)
- feature3_2 = self.vrn3_2(feature3_1)
- feature3_3 = self.vrn3_3(feature3_2)# [N/4,N/4,N/4,64]
-
- feature4 = self.conv_out(feature3_3)# [N/4,N/4,N/4,16]
-
- return feature4
-
-
- class SynthesisTransform(Module): #已改
- def __init__(self):
- super(SynthesisTransform, self).__init__()
- def vrn_block(num_filters, name):
- return _VoxceptionResNet(num_filters, name)
- activation=tl.ReLU
- self.deconv_in = tl.layers.Conv3d(n_filter=64, #the number of output filters in the convolution
- filter_size=(3,3,3),
- act=activation,
- padding='SAME',
- W_init=tl.initializers.XavierUniform(),
- b_init=tl.initializers.zeros(),
- name="deconv_in")
-
- self.vrn1_1 = vrn_block(64, 'dvrn1_1')
- self.vrn1_2 = vrn_block(64, 'dvrn1_2')
- self.vrn1_3 = vrn_block(64, 'dvrn1_3')
-
- self.up_1 = tl.layers.DeConv3d(n_filter=32,
- filter_size=(3,3,3),
- strides=(2,2,2),
- act=activation,
- padding='SAME',
- W_init=tl.initializers.XavierUniform(),
- b_init=tl.initializers.zeros(),
- name="up_1")
-
- self.vrn2_1 = vrn_block(32, 'dvrn2_1')
- self.vrn2_2 = vrn_block(32, 'dvrn2_2')
- self.vrn2_3 = vrn_block(32, 'dvrn2_3')
-
- self.up_2 = tl.layers.DeConv3d(n_filter=16,
- filter_size=(3,3,3),
- strides=(2,2,2),
- act=activation,
- padding='SAME',
- W_init=tl.initializers.XavierUniform(),
- b_init=tl.initializers.zeros(),
- name="up_2")
-
- self.vrn3_1 = vrn_block(16, 'dvrn3_1')
- self.vrn3_2 = vrn_block(16, 'dvrn3_2')
- self.vrn3_3 = vrn_block(16, 'dvrn3_3')
- #
- self.deconv_out = tl.layers.Conv3d(n_filter=1,
- filter_size=(3,3,3),
- padding='SAME',
- W_init=tl.initializers.XavierUniform(),
- b_init=tl.initializers.zeros(),
- name="deconv_out")
-
- def forward(self, x):
-
- feature1 = self.deconv_in(x)# [N/4,N/4,N/4,64]
- feature1_1 = self.vrn1_1(feature1)
- feature1_2 = self.vrn1_2(feature1_1)
- feature1_3 = self.vrn1_3(feature1_2)# [N/4,N/4,N/4,64]
-
- feature2 = self.up_1(feature1_3)# [N/2,N/2,N/2,32]
- feature2_1 = self.vrn2_1(feature2)
- feature2_2 = self.vrn2_2(feature2_1)
- feature2_3 = self.vrn2_3(feature2_2)# [N/2,N/2,N/2,32]
-
- feature3 = self.up_2(feature2_3)# [N,N,N,16]
- feature3_1 = self.vrn3_1(feature3)
- feature3_2 = self.vrn3_2(feature3_1)
- feature3_3 = self.vrn3_3(feature3_2)# [N,N,N,16]
-
- feature4 = self.deconv_out(feature3_3)# [N,N,N,1]
-
- return feature4
-
-
- class HyperEncoder(Module): #已改
- """Hyper encoder.
- """
-
- def __init__(self, activation=tl.ReLU):
- super(HyperEncoder, self).__init__()
-
- self.conv1 = tl.layers.Conv3d(n_filter=16,
- filter_size=(3,3,3),
- act=activation,
- padding='SAME',
- W_init=tl.initializers.XavierUniform(),
- b_init=tl.initializers.zeros(),
- name='conv1')
-
- self.conv2 = tl.layers.Conv3d(n_filter=16,
- filter_size=(3,3,3),
- strides=(2,2,2),
- act=activation,
- padding='SAME',
- W_init=tl.initializers.XavierUniform(),
- b_init=tl.initializers.zeros(),
- name='conv2')
-
- self.conv3 = tl.layers.Conv3d(n_filter=8,
- filter_size=(3,3,3),
- padding='SAME',
- W_init=tl.initializers.XavierUniform(),
- b_init=tl.initializers.zeros(),
- name='conv3')
-
- def forward(self, x):
-
- f1 = self.conv1(x)
- f2 = self.conv2(f1)
- f3 = self.conv3(f2)
-
- return f3
-
-
- class HyperDecoder(Module): #已改
- """Hyper decoder.
- Return: location, scale.
- """
-
- def __init__(self, activation=tl.ReLU):
- super(HyperDecoder, self).__init__()
-
- self.conv1 = tl.layers.Conv3d(n_filter=16,
- filter_size=(3,3,3),
- act=activation,
- padding='SAME',
- W_init=tl.initializers.XavierUniform(),
- b_init=tl.initializers.zeros(),
- name='deconv1')
-
- self.conv2 = tl.layers.DeConv3d(n_filter=16,
- filter_size=(3,3,3),
- strides=(2,2,2),
- act=activation,
- padding='SAME',
- W_init=tl.initializers.XavierUniform(),
- b_init=tl.initializers.zeros(),
- name='deconv2')
-
- self.conv3 = tl.layers.Conv3d(n_filter=32,
- filter_size=(3,3,3),
- act=activation,
- padding='SAME',
- W_init=tl.initializers.XavierUniform(),
- b_init=tl.initializers.zeros(),
- name='deconv3')
-
- self.conv4_1 = tl.layers.Conv3d(n_filter=16,
- filter_size=(3,3,3),
- padding='SAME',
- W_init=tl.initializers.XavierUniform(),
- b_init=tl.initializers.zeros(),
- name='deconv4_1')
-
- self.conv4_2 = tl.layers.Conv3d(n_filter=16,
- filter_size=(3,3,3),
- padding='SAME',
- W_init=tl.initializers.XavierUniform(),
- b_init=tl.initializers.zeros(),
- name='deconv4_2')
-
- def forward(self, x):
- f1 = self.conv1(x)
- f2 = self.conv2(f1)
- f3 = self.conv3(f2)
-
- loc = self.conv4_1(f3)
- scale = self.conv4_2(f3)
-
- return loc, myabs(scale)
|