|
|
import numpy as np |
|
|
|
|
|
|
|
|
def random_point_dropout(batch_pc, max_dropout_ratio=0.875): |
|
|
''' batch_pc: BxNx3 ''' |
|
|
for b in range(batch_pc.shape[0]): |
|
|
dropout_ratio = np.random.random()*max_dropout_ratio |
|
|
drop_idx = np.where(np.random.random((batch_pc.shape[1]))<=dropout_ratio)[0] |
|
|
if len(drop_idx)>0: |
|
|
batch_pc[b,drop_idx,:] = batch_pc[b,0,:] |
|
|
return batch_pc |
|
|
|
|
|
def random_scale_point_cloud(batch_data, scale_low=0.8, scale_high=1.25): |
|
|
""" Randomly scale the point cloud. Scale is per point cloud. |
|
|
Input: |
|
|
BxNx3 array, original batch of point clouds |
|
|
Return: |
|
|
BxNx3 array, scaled batch of point clouds |
|
|
""" |
|
|
B, N, C = batch_data.shape |
|
|
scales = np.random.uniform(scale_low, scale_high, B) |
|
|
for batch_index in range(B): |
|
|
batch_data[batch_index,:,:] *= scales[batch_index] |
|
|
return batch_data |
|
|
|
|
|
def shift_point_cloud(batch_data, shift_range=0.1): |
|
|
""" Randomly shift point cloud. Shift is per point cloud. |
|
|
Input: |
|
|
BxNx3 array, original batch of point clouds |
|
|
Return: |
|
|
BxNx3 array, shifted batch of point clouds |
|
|
""" |
|
|
B, N, C = batch_data.shape |
|
|
shifts = np.random.uniform(-shift_range, shift_range, (B,3)) |
|
|
for batch_index in range(B): |
|
|
batch_data[batch_index,:,:] += shifts[batch_index,:] |
|
|
return batch_data |