def generate_data(filename, version, block_size=16): input_path = os.path.join(PGM_ORIGINAL_PATH, filename + PGM_SUFFIX) if not os.path.exists(BITSTREAM_PATH): os.mkdir(BITSTREAM_PATH) bitstream_path = os.path.join(BITSTREAM_PATH, filename + BITSTREAM_SUFFIX) if not os.path.exists(PGM_RECONSTRUCTION_PATH): os.mkdir(PGM_RECONSTRUCTION_PATH) output_path = os.path.join(PGM_RECONSTRUCTION_PATH, filename + PGM_SUFFIX) df = pd.DataFrame(columns=['bpp', 'db']) for index, quality in enumerate([8, 12, 16, 20, 24]): enc = Encoder(input_path, bitstream_path, block_size, quality, False) enc.encode_image() dec = Decoder(bitstream_path, output_path, pgm=True) dec.decode_all_frames() process = subprocess.run( [PSNR_TOOL_PATH, input_path, output_path, bitstream_path], stdout=subprocess.PIPE, ) stdout = process.stdout.decode("utf-8") bpp, db = stdout.split(' bpp ') bpp, db = float(bpp), float(db.replace(' dB', '')) db = 0.0 if math.isinf(db) else db df.loc[index] = [bpp, db] version_path = os.path.join(DATA_ROOT_PATH, version) print(version) if not os.path.exists(version_path): os.mkdir(version_path) df.to_pickle(os.path.join(version_path, filename + DATA_SUFFIX))
def main(): parser = argparse.ArgumentParser(description='image/video encoder') parser.add_argument('-bs', '--blocksize', help='block size in samples (default: 16)', default=16, dest='blocksize', type=int) parser.add_argument('-qp', '--quantization-parameter', help='quantization parameter, range [0;31] (default: 12)', default=12, choices=(range(0, 32)), dest='qp', type=int) parser.add_argument('-i', '--input', help='input image in pgm format or input video', required=True, dest='input', ) parser.add_argument('-b', '--bitstream', help='bitstream file written by encoder', required=True, dest='bitstream') parser.add_argument('-r', '--reconstruct', help='path for reconstructed image/video at the encoder side', dest='reconstruction_path') parser.add_argument('-s', '--size', help='Specify the video dimensions (WxH) when encoding a video file', default=None, dest='video_size', type=str) parser.add_argument('-n', '--n-frames', help='Specify the number of frames to be encoded (video only)', default=30, dest='n_frames', type=int) parser.add_argument('-sr', '--search-range', help='Specify search range S', default=8, dest='search_range', type=int) parser.add_argument('-f', '--fast', help='Use logarithmic motion vector search', dest='use_fast', action='store_true') args = parser.parse_args() start_time = time.process_time() # benchmarking speed enc = Encoder(args.input, args.bitstream, args.blocksize, args.qp, args.use_fast, args.reconstruction_path) if args.video_size is None: enc.encode_image() else: width, height = list(map(int, args.video_size.split('x'))) # Parse width and height and cast to int enc.encode_video(width, height, args.n_frames, args.search_range) encoding_time = time.process_time() - start_time print(f'it took {encoding_time * 1000} ms to encode')