Initial commit

This commit is contained in:
HuguesTHOMAS 2020-04-02 17:31:35 -04:00
parent e128d483ca
commit 755317d83a
8 changed files with 59 additions and 27 deletions

View file

@ -1191,17 +1191,32 @@ def S3DISCollate(batch_data):
# \*********************/ # \*********************/
def debug_sampling(dataset, sampler, loader): def debug_upsampling(dataset, loader):
"""Shows which labels are sampled according to strategy chosen""" """Shows which labels are sampled according to strategy chosen"""
label_sum = np.zeros((dataset.num_classes), dtype=np.int32)
for epoch in range(10): for epoch in range(10):
for batch_i, (points, normals, labels, indices, in_sizes) in enumerate(loader): for batch_i, batch in enumerate(loader):
# print(batch_i, tuple(points.shape), tuple(normals.shape), labels, indices, in_sizes)
label_sum += np.bincount(labels.numpy(), minlength=dataset.num_classes) pc1 = batch.points[1].numpy()
print(label_sum) pc2 = batch.points[2].numpy()
#print(sampler.potentials[:6]) up1 = batch.upsamples[1].numpy()
print(pc1.shape, '=>', pc2.shape)
print(up1.shape, np.max(up1))
pc2 = np.vstack((pc2, np.zeros_like(pc2[:1, :])))
# Get neighbors distance
p0 = pc1[10, :]
neighbs0 = up1[10, :]
neighbs0 = pc2[neighbs0, :] - p0
d2 = np.sum(neighbs0 ** 2, axis=1)
print(neighbs0.shape)
print(neighbs0[:5])
print(d2[:5])
print('******************') print('******************')
print('*******************************************') print('*******************************************')
@ -1210,7 +1225,7 @@ def debug_sampling(dataset, sampler, loader):
print(counts) print(counts)
def debug_timing(dataset, sampler, loader): def debug_timing(dataset, loader):
"""Timing of generator function""" """Timing of generator function"""
t = [time.time()] t = [time.time()]
@ -1252,7 +1267,7 @@ def debug_timing(dataset, sampler, loader):
print(counts) print(counts)
def debug_show_clouds(dataset, sampler, loader): def debug_show_clouds(dataset, loader):
for epoch in range(10): for epoch in range(10):
@ -1307,7 +1322,7 @@ def debug_show_clouds(dataset, sampler, loader):
print(counts) print(counts)
def debug_batch_and_neighbors_calib(dataset, sampler, loader): def debug_batch_and_neighbors_calib(dataset, loader):
"""Timing of generator function""" """Timing of generator function"""
t = [time.time()] t = [time.time()]

View file

@ -469,7 +469,8 @@ class PointCloudDataset(Dataset):
# Reduce size of neighbors matrices by eliminating furthest point # Reduce size of neighbors matrices by eliminating furthest point
conv_i = self.big_neighborhood_filter(conv_i, len(input_points)) conv_i = self.big_neighborhood_filter(conv_i, len(input_points))
pool_i = self.big_neighborhood_filter(pool_i, len(input_points)) pool_i = self.big_neighborhood_filter(pool_i, len(input_points))
up_i = self.big_neighborhood_filter(up_i, len(input_points)) if up_i.shape[0] > 0:
up_i = self.big_neighborhood_filter(up_i, len(input_points)+1)
# Updating input lists # Updating input lists
input_points += [stacked_points] input_points += [stacked_points]

View file

@ -53,6 +53,7 @@ class KPCNN(nn.Module):
break break
# Apply the good block function defining tf ops # Apply the good block function defining tf ops
print(block, r)
self.block_ops.append(block_decider(block, self.block_ops.append(block_decider(block,
r, r,
in_dim, in_dim,
@ -60,6 +61,7 @@ class KPCNN(nn.Module):
layer, layer,
config)) config))
# Index of block in this layer # Index of block in this layer
block_in_layer += 1 block_in_layer += 1
@ -329,6 +331,7 @@ class KPFCNN(nn.Module):
if block_i in self.encoder_skips: if block_i in self.encoder_skips:
skip_x.append(x) skip_x.append(x)
x = block_op(x, batch) x = block_op(x, batch)
print(block_op)
for block_i, block_op in enumerate(self.decoder_blocs): for block_i, block_op in enumerate(self.decoder_blocs):
if block_i in self.decoder_concats: if block_i in self.decoder_concats:

View file

@ -355,6 +355,8 @@ class KPConv(nn.Module):
# Convolution sum [n_points, out_fdim] # Convolution sum [n_points, out_fdim]
return torch.sum(kernel_outputs, dim=0) return torch.sum(kernel_outputs, dim=0)
def __repr__(self):
return "KPConv(radius: %.2f, in_feat: %i, out_feat: %i)"% (self.radius, self.in_channels, self.out_channels)
# ---------------------------------------------------------------------------------------------------------------------- # ----------------------------------------------------------------------------------------------------------------------
# #

View file

@ -1374,7 +1374,9 @@ def ModelNet40_deform(old_result_limit):
def S3DIS_first(old_result_limit): def S3DIS_first(old_result_limit):
""" """
Test first S3DIS Test first S3DIS. First two test have all symetries (even vertical), which is not good). We corecct for
the following.
Then we try some experiments with different input scalea and the results are not as high as expected. WHY?
""" """
# Using the dates of the logs, you can easily gather consecutive ones. All logs should be of the same dataset. # Using the dates of the logs, you can easily gather consecutive ones. All logs should be of the same dataset.
@ -1395,6 +1397,8 @@ def S3DIS_first(old_result_limit):
'Fin=5_R=1.2_r=0.02', 'Fin=5_R=1.2_r=0.02',
'Fin=5_R=1.8_r=0.03', 'Fin=5_R=1.8_r=0.03',
'Fin=5_R=2.5_r=0.04', 'Fin=5_R=2.5_r=0.04',
'original_normal',
'original_deform',
'test'] 'test']
logs_names = np.array(logs_names[:len(logs)]) logs_names = np.array(logs_names[:len(logs)])

View file

@ -62,7 +62,7 @@ class S3DISConfig(Config):
dataset_task = '' dataset_task = ''
# Number of CPU threads for the input pipeline # Number of CPU threads for the input pipeline
input_threads = 10 input_threads = 20
######################### #########################
# Architecture definition # Architecture definition
@ -70,14 +70,15 @@ class S3DISConfig(Config):
# Define layers # Define layers
architecture = ['simple', architecture = ['simple',
'resnetb_strided',
'resnetb', 'resnetb',
'resnetb_strided', 'resnetb_strided',
'resnetb', 'resnetb',
'resnetb_strided', 'resnetb_strided',
'resnetb', 'resnetb',
'resnetb_strided', 'resnetb_strided',
'resnetb', 'resnetb_deformable',
'resnetb_deformable_strided',
'resnetb_deformable',
'nearest_upsample', 'nearest_upsample',
'unary', 'unary',
'nearest_upsample', 'nearest_upsample',
@ -92,7 +93,7 @@ class S3DISConfig(Config):
################### ###################
# Radius of the input sphere # Radius of the input sphere
in_radius = 2.5 in_radius = 2.0
# Number of kernel points # Number of kernel points
num_kernel_points = 15 num_kernel_points = 15
@ -107,7 +108,7 @@ class S3DISConfig(Config):
deform_radius = 6.0 deform_radius = 6.0
# Radius of the area of influence of each kernel point in "number grid cell". (1.0 is the standard value) # Radius of the area of influence of each kernel point in "number grid cell". (1.0 is the standard value)
KP_extent = 1.5 KP_extent = 1.2
# Behavior of convolutions in ('constant', 'linear', 'gaussian') # Behavior of convolutions in ('constant', 'linear', 'gaussian')
KP_influence = 'linear' KP_influence = 'linear'
@ -119,11 +120,11 @@ class S3DISConfig(Config):
in_features_dim = 5 in_features_dim = 5
# Can the network learn modulations # Can the network learn modulations
modulated = True modulated = False
# Batch normalization parameters # Batch normalization parameters
use_batch_norm = True use_batch_norm = True
batch_norm_momentum = 0.05 batch_norm_momentum = 0.02
# Offset loss # Offset loss
# 'permissive' only constrains offsets inside the deform radius (NOT implemented yet) # 'permissive' only constrains offsets inside the deform radius (NOT implemented yet)
@ -145,7 +146,7 @@ class S3DISConfig(Config):
grad_clip_norm = 100.0 grad_clip_norm = 100.0
# Number of batch # Number of batch
batch_num = 8 batch_num = 10
# Number of steps per epochs # Number of steps per epochs
epoch_steps = 500 epoch_steps = 500
@ -163,7 +164,7 @@ class S3DISConfig(Config):
augment_scale_min = 0.9 augment_scale_min = 0.9
augment_scale_max = 1.1 augment_scale_max = 1.1
augment_noise = 0.001 augment_noise = 0.001
augment_color = 0.9 augment_color = 0.8
# The way we balance segmentation loss TODO: implement and test 'class' and 'batch' modes # The way we balance segmentation loss TODO: implement and test 'class' and 'batch' modes
# > 'none': Each point in the whole batch has the same contribution. # > 'none': Each point in the whole batch has the same contribution.
@ -188,6 +189,11 @@ if __name__ == '__main__':
# Initialize the environment # Initialize the environment
############################ ############################
# TODO: 9 millions de parametres au lieu de 14 millions... Pourquoi?
# TODO: radius des strided 2 fois trop grand
# TODO: implement un sampler plus simple
# TODO: test batch size a 16
# Set which gpu is going to be used # Set which gpu is going to be used
GPU_ID = '1' GPU_ID = '1'
@ -264,9 +270,9 @@ if __name__ == '__main__':
training_sampler.calibration(training_loader, verbose=True) training_sampler.calibration(training_loader, verbose=True)
test_sampler.calibration(test_loader, verbose=True) test_sampler.calibration(test_loader, verbose=True)
#debug_timing(training_dataset, training_sampler, training_loader) #debug_timing(training_dataset, training_loader)
#debug_timing(test_dataset, test_sampler, test_loader) #debug_timing(test_dataset, test_loader)
#debug_show_clouds(training_dataset, training_sampler, training_loader) #debug_upsampling(training_dataset, training_loader)
print('\nModel Preparation') print('\nModel Preparation')
print('*****************') print('*****************')
@ -274,6 +280,8 @@ if __name__ == '__main__':
# Define network model # Define network model
t1 = time.time() t1 = time.time()
net = KPFCNN(config) net = KPFCNN(config)
print(net)
print("Model size %i" % sum(param.numel() for param in net.parameters() if param.requires_grad))
# Define a trainer class # Define a trainer class
trainer = ModelTrainer(net, config, chkp_path=chosen_chkp) trainer = ModelTrainer(net, config, chkp_path=chosen_chkp)

View file

@ -144,7 +144,7 @@ class Config:
augment_color = 0.7 augment_color = 0.7
# Augment with occlusions (not implemented yet) # Augment with occlusions (not implemented yet)
augment_occlusion = 'planar' augment_occlusion = 'none'
augment_occlusion_ratio = 0.2 augment_occlusion_ratio = 0.2
augment_occlusion_num = 1 augment_occlusion_num = 1
@ -233,7 +233,7 @@ class Config:
# Class variable dictionary # Class variable dictionary
for line in lines: for line in lines:
line_info = line.split() line_info = line.split()
if len(line_info) > 1 and line_info[0] != '#': if len(line_info) > 2 and line_info[0] != '#':
if line_info[2] == 'None': if line_info[2] == 'None':
setattr(self, line_info[0], None) setattr(self, line_info[0], None)

View file

@ -262,7 +262,6 @@ class ModelTrainer:
checkpoint_path = join(checkpoint_directory, 'chkp_{:04d}.tar'.format(self.epoch)) checkpoint_path = join(checkpoint_directory, 'chkp_{:04d}.tar'.format(self.epoch))
torch.save(save_dict, checkpoint_path) torch.save(save_dict, checkpoint_path)
# Validation # Validation
net.eval() net.eval()
self.validation(net, val_loader, config) self.validation(net, val_loader, config)