|
# 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. |
|
|