Spaces:
Runtime error
Runtime error
| # Neural net based entropy coding | |
| This is a [TensorFlow](http://www.tensorflow.org/) model for additional | |
| lossless compression of bitstreams generated by neural net based image | |
| encoders as described in | |
| [https://arxiv.org/abs/1703.10114](https://arxiv.org/abs/1703.10114). | |
| To be more specific, the entropy coder aims at compressing further binary | |
| codes which have a 3D tensor structure with: | |
| * the first two dimensions of the tensors corresponding to the height and | |
| the width of the binary codes, | |
| * the last dimension being the depth of the codes. The last dimension can be | |
| sliced into N groups of K, where each additional group is used by the image | |
| decoder to add more details to the reconstructed image. | |
| The code in this directory only contains the underlying code probability model | |
| but does not perform the actual compression using arithmetic coding. | |
| The code probability model is enough to compute the theoretical compression | |
| ratio. | |
| ## Prerequisites | |
| The only software requirements for running the encoder and decoder is having | |
| Tensorflow installed. | |
| You will also need to add the top level source directory of the entropy coder | |
| to your `PYTHONPATH`, for example: | |
| `export PYTHONPATH=${PYTHONPATH}:/tmp/models/compression` | |
| ## Training the entropy coder | |
| ### Synthetic dataset | |
| If you do not have a training dataset, there is a simple code generative model | |
| that you can use to generate a dataset and play with the entropy coder. | |
| The generative model is located under dataset/gen\_synthetic\_dataset.py. Note | |
| that this simple generative model is not going to give good results on real | |
| images as it is not supposed to be close to the statistics of the binary | |
| representation of encoded images. Consider it as a toy dataset, no more, no | |
| less. | |
| To generate a synthetic dataset with 20000 samples: | |
| `mkdir -p /tmp/dataset` | |
| `python ./dataset/gen_synthetic_dataset.py --dataset_dir=/tmp/dataset/ | |
| --count=20000` | |
| Note that the generator has not been optimized at all, generating the synthetic | |
| dataset is currently pretty slow. | |
| ### Training | |
| If you just want to play with the entropy coder trainer, here is the command | |
| line that can be used to train the entropy coder on the synthetic dataset: | |
| `mkdir -p /tmp/entropy_coder_train` | |
| `python ./core/entropy_coder_train.py --task=0 | |
| --train_dir=/tmp/entropy_coder_train/ | |
| --model=progressive | |
| --model_config=./configs/synthetic/model_config.json | |
| --train_config=./configs/synthetic/train_config.json | |
| --input_config=./configs/synthetic/input_config.json | |
| ` | |
| Training is configured using 3 files formatted using JSON: | |
| * One file is used to configure the underlying entropy coder model. | |
| Currently, only the *progressive* model is supported. | |
| This model takes 2 mandatory parameters and an optional one: | |
| * `layer_depth`: the number of bits per layer (a.k.a. iteration). | |
| Background: the image decoder takes each layer to add more detail | |
| to the image. | |
| * `layer_count`: the maximum number of layers that should be supported | |
| by the model. This should be equal or greater than the maximum number | |
| of layers in the input binary codes. | |
| * `coded_layer_count`: This can be used to consider only partial codes, | |
| keeping only the first `coded_layer_count` layers and ignoring the | |
| remaining layers. If left empty, the binary codes are left unchanged. | |
| * One file to configure the training, including the learning rate, ... | |
| The meaning of the parameters are pretty straightforward. Note that this | |
| file is only used during training and is not needed during inference. | |
| * One file to specify the input dataset to use during training. | |
| The dataset is formatted using tf.RecordIO. | |
| ## Inference: file size after entropy coding. | |
| ### Using a synthetic sample | |
| Here is the command line to generate a single synthetic sample formatted | |
| in the same way as what is provided by the image encoder: | |
| `python ./dataset/gen_synthetic_single.py | |
| --sample_filename=/tmp/dataset/sample_0000.npz` | |
| To actually compute the additional compression ratio using the entropy coder | |
| trained in the previous step: | |
| `python ./core/entropy_coder_single.py | |
| --model=progressive | |
| --model_config=./configs/synthetic/model_config.json | |
| --input_codes=/tmp/dataset/sample_0000.npz | |
| --checkpoint=/tmp/entropy_coder_train/model.ckpt-209078` | |
| where the checkpoint number should be adjusted accordingly. | |