import os import pathlib import torch import torch.hub from torchvision.transforms.functional import convert_image_dtype, pil_to_tensor from torchvision.io.image import ImageReadMode, encode_png, decode_image from PIL import Image import PIL from mcquic import Config from mcquic.modules.compressor import BaseCompressor, Compressor from mcquic.datasets.transforms import AlignedCrop from mcquic.utils.specification import File from mcquic.utils.vision import DeTransform try: import streamlit as st except: raise ImportError("To run `mcquic service`, please install Streamlit by `pip install streamlit` firstly.") MODELS_URL = "https://github.com/xiaosu-zhu/McQuic/releases/download/generic/qp_3_msssim_fcc58b73.mcquic" HF_SPACE = "HF_SPACE" in os.environ @st.experimental_singleton def loadModel(qp: int, local: pathlib.Path, device, mse: bool): ckpt = torch.hub.load_state_dict_from_url(MODELS_URL, map_location=device, check_hash=True) config = Config.deserialize(ckpt["config"]) model = Compressor(**config.Model.Params).to(device) model.QuantizationParameter = str(local) if local is not None else str(qp) model.load_state_dict(ckpt["model"]) return model @st.cache def compressImage(image: torch.Tensor, model: BaseCompressor, crop: bool) -> File: image = convert_image_dtype(image) if crop: image = AlignedCrop()(image) # [c, h, w] image = (image - 0.5) * 2 with model._quantizer.readyForCoding() as cdfs: codes, binaries, headers = model.compress(image[None, ...], cdfs) return File(headers[0], binaries[0]) @st.cache def decompressImage(sourceFile: File, model: BaseCompressor) -> torch.ByteTensor: binaries = sourceFile.Content with model._quantizer.readyForCoding() as cdfs: # [1, c, h, w] restored = model.decompress([binaries], cdfs, [sourceFile.FileHeader]) # [c, h, w] return DeTransform()(restored[0]) def main(debug: bool, quiet: bool, qp: int, disable_gpu: bool): if disable_gpu or not torch.cuda.is_available(): device = torch.device("cpu") else: device = torch.device("cuda") model = loadModel(3, None, device, False).eval() st.sidebar.markdown("""
a.k.a. Multi-codebook Quantizers for neural image compression
Compressing images on-the-fly.
CVF Open Access | arXiv | BibTex | Demo
""", unsafe_allow_html=True) if __name__ == "__main__": with torch.inference_mode(): main(False, False, 3, False)