Beispiel #1
0
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))
Beispiel #2
0
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')