def __init__(self, geometry): """ Parameters ---------- geometry : GeometryCone3D The geometry used for reconstruction """ self.geometry = geometry self.cosine_weight = tf.get_variable( name='cosine_weight', dtype=tf.float32, initializer=ct_weights.cosine_weights_3d(geometry), trainable=True) self.recon_filter = tf.get_variable( name='recon_filter', dtype=tf.float32, initializer=filters.ram_lak_3D(geometry), trainable=True) self.relu_alpha = tf.get_variable( name='relu_alpha', shape=(1), dtype=tf.float32, initializer=tf.constant_initializer(0), trainable=True)
def __init__(self, geometry): """ Parameters ---------- geometry : GeometryCone3D The geometry used for reconstruction """ self.geometry = geometry self.initializer = tf.contrib.layers.xavier_initializer() self.cosine_weight = tf.get_variable(name='cosine_weight', dtype=tf.float32, initializer=ct_weights.cosine_weights_3d(geometry), trainable=True) self.recon_filter = tf.get_variable(name='recon_filter', dtype=tf.float32, initializer=filters.ram_lak_3D(geometry), trainable=True) self.relu_alpha = tf.get_variable(name='relu_alpha', shape=(1), dtype=tf.float32, initializer=tf.constant_initializer(0), trainable=True) # for multi perceptron if needed self.mlp_all = tf.get_variable(name='mlp_all', dtype=tf.float32, initializer=tf.ones(1), trainable=False) self.mlp_one = tf.get_variable(name='mlp_one', dtype=tf.float32, initializer=tf.ones(1), trainable=False) self.mlp_two = tf.get_variable(name='mlp_two', dtype=tf.float32, initializer=tf.ones(1), trainable=False)
def example_cone_3d(): # ------------------ Declare Parameters ------------------ # Volume Parameters: volume_size = 256 volume_shape = [volume_size, volume_size, volume_size] volume_spacing = [0.5, 0.5, 0.5] # Detector Parameters: detector_shape = [2*volume_size, 2*volume_size] detector_spacing = [1, 1] # Trajectory Parameters: number_of_projections = 360 angular_range = 2 * np.pi source_detector_distance = 1200 source_isocenter_distance = 750 # create Geometry class geometry = GeometryCone3D(volume_shape, volume_spacing, detector_shape, detector_spacing, number_of_projections, angular_range, source_detector_distance, source_isocenter_distance) geometry.set_trajectory(circular_trajectory.circular_trajectory_3d(geometry)) # Get Phantom 3d phantom = shepp_logan.shepp_logan_3d(volume_shape) # Add required batch dimension phantom = np.expand_dims(phantom, axis=0) # ------------------ Call Layers ------------------ # The following code is the new TF2.0 experimental way to tell # Tensorflow only to allocate GPU memory needed rather then allocate every GPU memory available. # This is important for the use of the hardware interpolation projector, otherwise there might be not enough memory left # to allocate the texture memory on the GPU gpus = tf.config.experimental.list_physical_devices('GPU') if gpus: try: for gpu in gpus: tf.config.experimental.set_memory_growth(gpu, True) except RunetimeError as e: print(e) sinogram = cone_projection3d(phantom, geometry) reco_filter = ram_lak_3D(geometry) sino_freq = tf.signal.fft(tf.cast(sinogram,dtype=tf.complex64)) sino_filtered_freq = tf.multiply(sino_freq,tf.cast(reco_filter,dtype=tf.complex64)) sinogram_filtered = tf.math.real(tf.signal.ifft(sino_filtered_freq)) reco = cone_backprojection3d(sinogram_filtered, geometry) plt.figure() plt.imshow(np.squeeze(reco)[volume_shape[0]//2], cmap=plt.get_cmap('gist_gray')) plt.axis('off') plt.savefig('3d_cone_reco.png', dpi=150, transparent=False, bbox_inches='tight')
def example_cone_3d(): # ------------------ Declare Parameters ------------------ # Volume Parameters: volume_size = 256 volume_shape = [volume_size, volume_size, volume_size] volume_spacing = [0.5, 0.5, 0.5] # Detector Parameters: detector_shape = [2 * volume_size, 2 * volume_size] detector_spacing = [1, 1] # Trajectory Parameters: number_of_projections = 360 angular_range = 2 * np.pi source_detector_distance = 1200 source_isocenter_distance = 750 # create Geometry class geometry = GeometryCone3D(volume_shape, volume_spacing, detector_shape, detector_spacing, number_of_projections, angular_range, source_detector_distance, source_isocenter_distance) geometry.set_projection_matrices( circular_trajectory.circular_trajectory_3d(geometry)) # Get Phantom 3d phantom = shepp_logan.shepp_logan_3d(volume_shape) phantom = np.expand_dims(phantom, axis=0) config = tf.ConfigProto() config.gpu_options.per_process_gpu_memory_fraction = 0.5 config.gpu_options.allow_growth = True # ------------------ Call Layers ------------------ with tf.Session(config=config) as sess: result = cone_projection3d(phantom, geometry) sinogram = result.eval() filter = ram_lak_3D(geometry) sino_freq = np.fft.fft(sinogram, axis=-1) filtered_sino_freq = sino_freq * filter filtered_sino = np.fft.ifft(filtered_sino_freq, axis=-1) result_back_proj = cone_backprojection3d(filtered_sino, geometry) reco = result_back_proj.eval() plt.figure() plt.imshow(np.squeeze(reco)[volume_shape[0] // 2], cmap=plt.get_cmap('gist_gray')) plt.axis('off') plt.savefig('3d_cone_reco.png', dpi=150, transparent=False, bbox_inches='tight')
def example_parallel_3d(): # ------------------ Declare Parameters ------------------ # Volume Parameters: volume_size = 256 volume_shape = [volume_size, volume_size, volume_size] volume_spacing = [1, 1, 1] # Detector Parameters: detector_size = 350 detector_shape = [detector_size, detector_size] detector_spacing = [1, 1] # Trajectory Parameters: number_of_projections = 180 angular_range = 1 * np.pi # create Geometry class geometry = GeometryParallel3D(volume_shape, volume_spacing, detector_shape, detector_spacing, number_of_projections, angular_range) geometry.set_trajectory(circular_trajectory_3d(geometry)) # Get Phantom phantom = shepp_logan.shepp_logan_3d(volume_shape) # ------------------ Call Layers ------------------ with tf.Session() as sess: #result = parallel_projection3d(phantom, geometry) result = par_projection3d(phantom, geometry) sinogram = result.eval() sinogram = sinogram + np.random.normal(loc=np.mean(np.abs(sinogram)), scale=np.std(sinogram), size=sinogram.shape) * 0.02 reco_filter = filters.ram_lak_3D(geometry) sino_freq = np.fft.fft(sinogram, axis=2) sino_filtered_freq = np.multiply(sino_freq, reco_filter) sinogram_filtered = np.fft.ifft(sino_filtered_freq, axis=2) result_back_proj = par_backprojection3d(sinogram_filtered, geometry) reco = result_back_proj.eval() import pyconrad as pyc pyc.setup_pyconrad() pyc.imshow(phantom) pyc.imshow(sinogram) pyc.imshow(reco) a = 5
def __init__(self, geometry): self.geometry = geometry self.cosine_weight = tf.get_variable( name='cosine_weight', dtype=tf.float32, initializer=ct_weights.cosine_weights_3d(self.geometry), trainable=False) self.redundancy_weight = tf.get_variable( name='redundancy_weight', dtype=tf.float32, initializer=ct_weights.parker_weights_3d(self.geometry), trainable=False) self.filter = tf.get_variable(name='reco_filter', dtype=tf.float32, initializer=ram_lak_3D(self.geometry), trainable=False)
def __init__(self, geometry): """ Parameters ---------- geometry : GeometryCone3D The geometry used for reconstruction """ self.geometry = geometry self.cosine_weight = tf.get_variable( name='cosine_weight', dtype=tf.float32, initializer=ct_weights.cosine_weights_3d(self.geometry), trainable=False) self.filter = tf.get_variable(name='reco_filter', dtype=tf.float32, initializer=ram_lak_3D(self.geometry), trainable=False)