예제 #1
0
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
예제 #2
0
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