def write_binary_files(filename, strings, points_numbers, cube_positions, min_v, max_v, shape, rootdir='./'): """Write compressed binary files: 1) Compressed latent features. 2) Number of input points. 3) Positions of each cube. """ if not os.path.exists(rootdir): os.makedirs(rootdir) print('===== Write binary files =====') file_strings = os.path.join(rootdir, filename+'.strings') file_pointnums = os.path.join(rootdir, filename+'.pointnums') file_cubepos = os.path.join(rootdir, filename+'.cubepos') ply_cubepos = os.path.join(rootdir, filename+'_cubepos.ply') with open(file_strings, 'wb') as f: f.write(np.array(shape, dtype=np.int16).tobytes())# [batch size, length, width, height, channels] f.write(np.array((min_v, max_v), dtype=np.int8).tobytes()) f.write(strings) # TODO: Compress numbers of points. with open(file_pointnums, 'wb') as f: f.write(np.array(points_numbers, dtype=np.uint16).tobytes()) write_ply_data(ply_cubepos, cube_positions.astype('uint8')) gpcc_encode(ply_cubepos, file_cubepos) bytes_strings = os.path.getsize(file_strings) bytes_pointnums = os.path.getsize(file_pointnums) bytes_cubepos = os.path.getsize(file_cubepos) print('Total file size (Bytes): {}'.format(bytes_strings+bytes_pointnums+bytes_cubepos)) print('Strings (Bytes): {}'.format(bytes_strings)) print('Numbers of points (Bytes): {}'.format(bytes_pointnums)) print('Positions of cubes (Bytes): {}'.format(bytes_cubepos)) return bytes_strings, bytes_pointnums, bytes_cubepos
def write_binary_files_hyper(filename, y_strings, z_strings, points_numbers, cube_positions, y_min_vs, y_max_vs, y_shape, z_min_v, z_max_v, z_shape, rootdir='./'): """Write compressed binary files: 1) Compressed latent features. 2) Compressed hyperprior. 3) Number of input points. 4) Positions of each cube. """ if not os.path.exists(rootdir): os.makedirs(rootdir) print('===== Write binary files =====') file_strings = os.path.join(rootdir, filename + '.strings') file_strings_head = os.path.join(rootdir, filename + '.strings_head') file_strings_hyper = os.path.join(rootdir, filename + '.strings_hyper') file_pointnums = os.path.join(rootdir, filename + '.pointnums') file_cubepos = os.path.join(rootdir, filename + '.cubepos') ply_cubepos = os.path.join(rootdir, filename + '_cubepos.ply') with open(file_strings_head, 'wb') as f: f.write(np.array(len(y_strings), dtype=np.int16).tobytes()) y_max_min_vs = y_max_vs * 16 - y_min_vs f.write(np.array(y_max_min_vs, dtype=np.uint8).tobytes()) y_strings_lens = np.array( [len(y_string) for _, y_string in enumerate(y_strings)]) for i, l in enumerate(y_strings_lens): if l <= 255: f.write(np.array(l, dtype=np.uint8).tobytes()) else: f.write(np.array(0, dtype=np.uint8).tobytes()) f.write(np.array(l, dtype=np.int16).tobytes()) f.write(np.array(y_shape, dtype=np.int16).tobytes() ) # [batch size, length, width, height, channels] with open(file_strings, 'wb') as f: for i, y_string in enumerate(y_strings): f.write(y_string) with open(file_strings_hyper, 'wb') as f: f.write(np.array(z_shape, dtype=np.int16).tobytes() ) # [batch size, length, width, height, channels] f.write(np.array((z_min_v, z_max_v), dtype=np.int8).tobytes()) f.write(z_strings) # TODO: Compress numbers of points. with open(file_pointnums, 'wb') as f: f.write(np.array(points_numbers, dtype=np.uint16).tobytes()) write_ply_data(ply_cubepos, cube_positions.astype('uint8')) gpcc_encode(ply_cubepos, file_cubepos) # bytes_strings = sum([os.path.getsize(f) for f in glob.glob(file_strings_folder+'/*.strings')]) bytes_strings = os.path.getsize(file_strings) bytes_strings_head = os.path.getsize(file_strings_head) bytes_strings_hyper = os.path.getsize(file_strings_hyper) bytes_pointnums = os.path.getsize(file_pointnums) bytes_cubepos = os.path.getsize(file_cubepos) print( 'Total file size (Bytes): {}'.format(bytes_strings + bytes_strings_head + bytes_strings_hyper + bytes_pointnums + bytes_cubepos)) print('Strings (Bytes): {}'.format(bytes_strings)) print('Strings head (Bytes): {}'.format(bytes_strings_head)) print('Strings hyper (Bytes): {}'.format(bytes_strings_hyper)) print('Numbers of points (Bytes): {}'.format(bytes_pointnums)) print('Positions of cubes (Bytes): {}'.format(bytes_cubepos)) return bytes_strings, bytes_strings_head, bytes_strings_hyper, bytes_pointnums, bytes_cubepos