From ed3a6f178596af47486d82db9782e6d0564f82d7 Mon Sep 17 00:00:00 2001 From: fracape Date: Wed, 28 Feb 2024 08:44:21 +0000 Subject: [PATCH] deploy: 89218253d7c10f875571223c5ece5a2bfd9b27f5 --- _modules/compressai.html | 1 + _modules/compressai/datasets/image.html | 1 + .../datasets/pointcloud/modelnet.html | 540 ++++++++++++ .../compressai/datasets/pointcloud/s3dis.html | 562 ++++++++++++ .../datasets/pointcloud/semantic_kitti.html | 626 ++++++++++++++ .../datasets/pointcloud/shapenet.html | 636 ++++++++++++++ .../compressai/datasets/pregenerated.html | 465 ++++++++++ _modules/compressai/datasets/video.html | 1 + _modules/compressai/datasets/vimeo90k.html | 461 ++++++++++ .../entropy_models/entropy_models.html | 25 +- .../latent_codecs/channel_groups.html | 1 + .../latent_codecs/checkerboard.html | 1 + .../latent_codecs/entropy_bottleneck.html | 1 + .../compressai/latent_codecs/gain/hyper.html | 1 + .../latent_codecs/gain/hyperprior.html | 1 + .../latent_codecs/gaussian_conditional.html | 1 + _modules/compressai/latent_codecs/hyper.html | 1 + .../compressai/latent_codecs/hyperprior.html | 1 + .../compressai/latent_codecs/rasterscan.html | 1 + _modules/compressai/layers/gdn.html | 1 + _modules/compressai/layers/layers.html | 64 +- .../compressai/losses/pointcloud/chamfer.html | 469 ++++++++++ .../losses/pointcloud/hrtzxf2022.html | 561 ++++++++++++ .../compressai/losses/rate_distortion.html | 440 ++++++++++ _modules/compressai/models/base.html | 6 +- _modules/compressai/models/google.html | 1 + .../models/pointcloud/hrtzxf2022.html | 815 ++++++++++++++++++ .../models/pointcloud/sfu_pointnet.html | 495 +++++++++++ .../models/pointcloud/sfu_pointnet2.html | 695 +++++++++++++++ _modules/compressai/models/sensetime.html | 1 + _modules/compressai/models/video/google.html | 1 + _modules/compressai/models/waseda.html | 1 + _modules/compressai/ops/bound_ops.html | 1 + _modules/compressai/ops/ops.html | 1 + _modules/compressai/ops/parametrizers.html | 1 + .../compressai/transforms/functional.html | 1 + .../point/generate_position_normals.html | 445 ++++++++++ .../transforms/point/normalize_scale_v2.html | 422 +++++++++ .../transforms/point/random_permutation.html | 413 +++++++++ .../transforms/point/random_rotate_full.html | 423 +++++++++ .../transforms/point/random_sample.html | 446 ++++++++++ .../transforms/point/sample_points_v2.html | 480 +++++++++++ .../compressai/transforms/point/to_dict.html | 423 +++++++++ .../compressai/transforms/transforms.html | 1 + _modules/compressai/zoo/image.html | 1 + _modules/compressai/zoo/video.html | 1 + _modules/index.html | 20 + _sources/datasets.rst | 49 +- _sources/index.rst | 1 + _sources/losses.rst | 33 + _sources/models.rst | 19 +- _sources/transforms.rst | 7 + _static/locales/ar/LC_MESSAGES/booktheme.po | 80 +- _static/locales/bg/LC_MESSAGES/booktheme.po | 80 +- _static/locales/bn/LC_MESSAGES/booktheme.po | 64 +- _static/locales/ca/LC_MESSAGES/booktheme.po | 68 +- _static/locales/cs/LC_MESSAGES/booktheme.po | 80 +- _static/locales/da/LC_MESSAGES/booktheme.po | 80 +- _static/locales/de/LC_MESSAGES/booktheme.po | 80 +- _static/locales/el/LC_MESSAGES/booktheme.po | 80 +- _static/locales/eo/LC_MESSAGES/booktheme.po | 80 +- _static/locales/es/LC_MESSAGES/booktheme.po | 80 +- _static/locales/et/LC_MESSAGES/booktheme.po | 80 +- _static/locales/fi/LC_MESSAGES/booktheme.po | 80 +- _static/locales/fr/LC_MESSAGES/booktheme.po | 80 +- _static/locales/hr/LC_MESSAGES/booktheme.po | 80 +- _static/locales/id/LC_MESSAGES/booktheme.po | 80 +- _static/locales/it/LC_MESSAGES/booktheme.po | 80 +- _static/locales/iw/LC_MESSAGES/booktheme.po | 80 +- _static/locales/ja/LC_MESSAGES/booktheme.po | 80 +- _static/locales/ko/LC_MESSAGES/booktheme.po | 80 +- _static/locales/lt/LC_MESSAGES/booktheme.po | 80 +- _static/locales/lv/LC_MESSAGES/booktheme.po | 80 +- _static/locales/ml/LC_MESSAGES/booktheme.po | 68 +- _static/locales/mr/LC_MESSAGES/booktheme.po | 68 +- _static/locales/ms/LC_MESSAGES/booktheme.po | 68 +- _static/locales/nl/LC_MESSAGES/booktheme.po | 80 +- _static/locales/no/LC_MESSAGES/booktheme.po | 80 +- _static/locales/pl/LC_MESSAGES/booktheme.po | 80 +- _static/locales/pt/LC_MESSAGES/booktheme.po | 80 +- _static/locales/ro/LC_MESSAGES/booktheme.po | 80 +- _static/locales/ru/LC_MESSAGES/booktheme.po | 80 +- _static/locales/sk/LC_MESSAGES/booktheme.po | 80 +- _static/locales/sl/LC_MESSAGES/booktheme.po | 80 +- _static/locales/sr/LC_MESSAGES/booktheme.po | 80 +- _static/locales/sv/LC_MESSAGES/booktheme.po | 80 +- _static/locales/ta/LC_MESSAGES/booktheme.po | 68 +- _static/locales/te/LC_MESSAGES/booktheme.po | 68 +- _static/locales/tg/LC_MESSAGES/booktheme.po | 80 +- _static/locales/th/LC_MESSAGES/booktheme.po | 80 +- _static/locales/tl/LC_MESSAGES/booktheme.po | 68 +- _static/locales/tr/LC_MESSAGES/booktheme.po | 80 +- _static/locales/uk/LC_MESSAGES/booktheme.po | 80 +- _static/locales/ur/LC_MESSAGES/booktheme.po | 68 +- _static/locales/vi/LC_MESSAGES/booktheme.po | 80 +- .../locales/zh_CN/LC_MESSAGES/booktheme.po | 80 +- .../locales/zh_TW/LC_MESSAGES/booktheme.po | 80 +- ans.html | 1 + cli_usage.html | 11 +- compressai.html | 1 + datasets.html | 326 ++++++- entropy_models.html | 1 + genindex.html | 97 ++- index.html | 2 + installation.html | 1 + intro.html | 1 + latent_codecs.html | 1 + layers.html | 7 +- losses.html | 588 +++++++++++++ models.html | 113 ++- objects.inv | Bin 1644 -> 2405 bytes ops.html | 1 + py-modindex.html | 6 + search.html | 1 + searchindex.js | 2 +- transforms.html | 88 ++ tutorials/tutorial_custom.html | 1 + tutorials/tutorial_train.html | 1 + zoo.html | 1 + 119 files changed, 13022 insertions(+), 1782 deletions(-) create mode 100644 _modules/compressai/datasets/pointcloud/modelnet.html create mode 100644 _modules/compressai/datasets/pointcloud/s3dis.html create mode 100644 _modules/compressai/datasets/pointcloud/semantic_kitti.html create mode 100644 _modules/compressai/datasets/pointcloud/shapenet.html create mode 100644 _modules/compressai/datasets/pregenerated.html create mode 100644 _modules/compressai/datasets/vimeo90k.html create mode 100644 _modules/compressai/losses/pointcloud/chamfer.html create mode 100644 _modules/compressai/losses/pointcloud/hrtzxf2022.html create mode 100644 _modules/compressai/losses/rate_distortion.html create mode 100644 _modules/compressai/models/pointcloud/hrtzxf2022.html create mode 100644 _modules/compressai/models/pointcloud/sfu_pointnet.html create mode 100644 _modules/compressai/models/pointcloud/sfu_pointnet2.html create mode 100644 _modules/compressai/transforms/point/generate_position_normals.html create mode 100644 _modules/compressai/transforms/point/normalize_scale_v2.html create mode 100644 _modules/compressai/transforms/point/random_permutation.html create mode 100644 _modules/compressai/transforms/point/random_rotate_full.html create mode 100644 _modules/compressai/transforms/point/random_sample.html create mode 100644 _modules/compressai/transforms/point/sample_points_v2.html create mode 100644 _modules/compressai/transforms/point/to_dict.html create mode 100644 _sources/losses.rst create mode 100644 losses.html diff --git a/_modules/compressai.html b/_modules/compressai.html index cd148378..25f8dfee 100644 --- a/_modules/compressai.html +++ b/_modules/compressai.html @@ -167,6 +167,7 @@
  • compressai.entropy_models
  • compressai.latent_codecs
  • compressai.layers
  • +
  • compressai.losses
  • compressai.models
  • compressai.ops
  • compressai.transforms
  • diff --git a/_modules/compressai/datasets/image.html b/_modules/compressai/datasets/image.html index ebae2a88..2fca8a11 100644 --- a/_modules/compressai/datasets/image.html +++ b/_modules/compressai/datasets/image.html @@ -167,6 +167,7 @@
  • compressai.entropy_models
  • compressai.latent_codecs
  • compressai.layers
  • +
  • compressai.losses
  • compressai.models
  • compressai.ops
  • compressai.transforms
  • diff --git a/_modules/compressai/datasets/pointcloud/modelnet.html b/_modules/compressai/datasets/pointcloud/modelnet.html new file mode 100644 index 00000000..7383454b --- /dev/null +++ b/_modules/compressai/datasets/pointcloud/modelnet.html @@ -0,0 +1,540 @@ + + + + + + + + + + compressai.datasets.pointcloud.modelnet — CompressAI + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + +
    +
    +
    +
    +
    + + + + +
    +
    + + + + + +
    + + + + + + + + + + + + + +
    + +
    + + + +
    + +
    +
    + +
    +
    + +
    + +
    + +
    + + +
    + +
    + +
    + + + + + + + + + + + + + + + + + + +
    + +
    + +
    +
    + + + +
    +

    + +
    +
    + +
    +
    +
    + + + + +
    + +

    Source code for compressai.datasets.pointcloud.modelnet

    +# Copyright (c) 2021-2022, InterDigital Communications, Inc
    +# All rights reserved.
    +
    +# Redistribution and use in source and binary forms, with or without
    +# modification, are permitted (subject to the limitations in the disclaimer
    +# below) provided that the following conditions are met:
    +
    +# * Redistributions of source code must retain the above copyright notice,
    +#   this list of conditions and the following disclaimer.
    +# * Redistributions in binary form must reproduce the above copyright notice,
    +#   this list of conditions and the following disclaimer in the documentation
    +#   and/or other materials provided with the distribution.
    +# * Neither the name of InterDigital Communications, Inc nor the names of its
    +#   contributors may be used to endorse or promote products derived from this
    +#   software without specific prior written permission.
    +
    +# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY
    +# THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
    +# CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
    +# NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
    +# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
    +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
    +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
    +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
    +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
    +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
    +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
    +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    +
    +import os
    +import os.path
    +import re
    +import shutil
    +
    +from pathlib import Path
    +
    +import numpy as np
    +
    +try:
    +    from pyntcloud import PyntCloud
    +except ImportError:
    +    pass  # NOTE: Optional dependency.
    +
    +from compressai.datasets.cache import CacheDataset
    +from compressai.datasets.utils import download_url, hash_file
    +from compressai.registry import register_dataset
    +
    +
    +
    +[docs] +@register_dataset("ModelNetDataset") +class ModelNetDataset(CacheDataset): + """ModelNet dataset. + + This dataset of 3D CAD models of objects was introduced by + [Wu2015]_, consisting of 10 or 40 classes, with 4899 and 12311 + aligned items, respectively. + Each 3D model is represented in the OFF file format by a triangle + mesh (i.e. faces) and has a single label (e.g. airplane). + To convert the triangle meshes to point clouds, one may use a mesh + sampling method (e.g. ``SamplePoints``). + + See also: [PapersWithCode_ModelNet]_. + + References: + + .. [Wu2015] `"3D ShapeNets: A deep representation for volumetric + shapes," <https://arxiv.org/abs/1406.5670>`_, by Zhirong Wu, + Shuran Song, Aditya Khosla, Fisher Yu, Linguang Zhang, + Xiaoou Tang, and Jianxiong Xiao, CVPR 2015. + + .. [PapersWithCode_ModelNet] `PapersWithCode: ModelNet + <https://paperswithcode.com/dataset/modelnet>`_ + """ + + # fmt: off + LABEL_LIST = { + "10": [ + "bathtub", "bed", "chair", "desk", "dresser", + "monitor", "night_stand", "sofa", "table", "toilet", + ], + "40": [ + "airplane", "bathtub", "bed", "bench", "bookshelf", + "bottle", "bowl", "car", "chair", "cone", "cup", + "curtain", "desk", "door", "dresser", "flower_pot", + "glass_box", "guitar", "keyboard", "lamp", "laptop", + "mantel", "monitor", "night_stand", "person", "piano", + "plant", "radio", "range_hood", "sink", "sofa", + "stairs", "stool", "table", "tent", "toilet", + "tv_stand", "vase", "wardrobe", "xbox", + ], + } + # fmt: on + + LABEL_STR_TO_LABEL_INDEX = { + "10": {label: idx for idx, label in enumerate(LABEL_LIST["10"])}, + "40": {label: idx for idx, label in enumerate(LABEL_LIST["40"])}, + } + + URLS = { + "10": "http://3dvision.princeton.edu/projects/2014/3DShapeNets/ModelNet10.zip", + "40": "http://modelnet.cs.princeton.edu/ModelNet40.zip", + } + + HASHES = { + "10": "9d8679435fc07d1d26f13009878db164a7aa8ea5e7ea3c8880e42794b7307d51", + "40": "42dc3e656932e387f554e25a4eb2cc0e1a1bd3ab54606e2a9eae444c60e536ac", + } + + def __init__( + self, + root=None, + cache_root=None, + split="train", + split_name=None, + name="40", + pre_transform=None, + transform=None, + download=True, + ): + if cache_root is None: + assert root is not None + cache_root = f"{str(root).rstrip('/')}_cache" + + self.root = Path(root) if root else None + self.cache_root = Path(cache_root) + self.split = split + self.split_name = split if split_name is None else split_name + self.name = name + + if download and self.root: + self.download() + + super().__init__( + cache_root=self.cache_root / self.split_name, + pre_transform=pre_transform, + transform=transform, + ) + + self._ensure_cache() + + def download(self, force=False): + if not force and self.root.exists(): + return + tmpdir = self.root.parent / "tmp" + os.makedirs(tmpdir, exist_ok=True) + filepath = download_url(self.URLS[self.name], tmpdir, overwrite=force) + assert self.HASHES[self.name] == hash_file(filepath, method="sha256") + shutil.unpack_archive(filepath, tmpdir) + shutil.move(tmpdir / f"ModelNet{self.name}", self.root) + + def _get_items(self): + return sorted(self.root.glob(f"**/{self.split}/*.off")) + + def _load_item(self, path): + label_index, file_index = self._parse_path(path) + cloud = PyntCloud.from_file(str(path)) + return { + "file_index": np.array([file_index], dtype=np.int32), + "label": np.array([label_index], dtype=np.uint8), + "pos": cloud.points.values, + "face": cloud.mesh.values.T, + } + + def _parse_path(self, path): + pattern = ( + r"^.*?/?" + r"(?P<label_str>[a-zA-Z_]+)/" + r"(?P<split>[a-zA-Z_]+)/" + r"(?P<label_str_again>[a-zA-Z_]+)_(?P<file_index>\d+)\.off$" + ) + match = re.match(pattern, str(path)) + if match is None: + raise ValueError(f"Could not parse path: {path}") + assert match.group("split") == self.split + assert match.group("label_str") == match.group("label_str_again") + label_str = match.group("label_str") + label_index = self.LABEL_STR_TO_LABEL_INDEX[self.name][label_str] + file_index = int(match.group("file_index")) + return label_index, file_index
    + +
    + +
    + + + + + + +
    + +
    +
    +
    + +
    + + + +
    + + +
    +
    + + +
    + + +
    +
    +
    + + + + + + + + \ No newline at end of file diff --git a/_modules/compressai/datasets/pointcloud/s3dis.html b/_modules/compressai/datasets/pointcloud/s3dis.html new file mode 100644 index 00000000..15a7ad47 --- /dev/null +++ b/_modules/compressai/datasets/pointcloud/s3dis.html @@ -0,0 +1,562 @@ + + + + + + + + + + compressai.datasets.pointcloud.s3dis — CompressAI + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + +
    +
    +
    +
    +
    + + + + +
    +
    + + + + + +
    + + + + + + + + + + + + + +
    + +
    + + + +
    + +
    +
    + +
    +
    + +
    + +
    + +
    + + +
    + +
    + +
    + + + + + + + + + + + + + + + + + + +
    + +
    + +
    +
    + + + +
    +

    + +
    +
    + +
    +
    +
    + + + + +
    + +

    Source code for compressai.datasets.pointcloud.s3dis

    +# Copyright (c) 2021-2022, InterDigital Communications, Inc
    +# All rights reserved.
    +
    +# Redistribution and use in source and binary forms, with or without
    +# modification, are permitted (subject to the limitations in the disclaimer
    +# below) provided that the following conditions are met:
    +
    +# * Redistributions of source code must retain the above copyright notice,
    +#   this list of conditions and the following disclaimer.
    +# * Redistributions in binary form must reproduce the above copyright notice,
    +#   this list of conditions and the following disclaimer in the documentation
    +#   and/or other materials provided with the distribution.
    +# * Neither the name of InterDigital Communications, Inc nor the names of its
    +#   contributors may be used to endorse or promote products derived from this
    +#   software without specific prior written permission.
    +
    +# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY
    +# THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
    +# CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
    +# NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
    +# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
    +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
    +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
    +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
    +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
    +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
    +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
    +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    +
    +import os
    +import shutil
    +
    +from pathlib import Path
    +
    +from torch.utils.data import ConcatDataset
    +
    +from compressai.datasets.cache import CacheDataset
    +from compressai.datasets.ndarray import NdArrayDataset
    +from compressai.datasets.stack import StackDataset
    +from compressai.datasets.utils import download_url, hash_file
    +from compressai.registry import register_dataset
    +
    +
    +
    +[docs] +@register_dataset("S3disDataset") +class S3disDataset(CacheDataset): + """S3DIS dataset. + + The Stanford 3D Indoor Scene Dataset (S3DIS) dataset, introduced by + [Armeni2012]_, contains 3D point clouds of 6 large-scale indoor areas. + There are multiple rooms (e.g. office, lounge, hallway, etc) per area. + See the [ProjectPage_S3DIS]_ for a visualization. + + The ``semantic_index`` is a number between 0 and 12 (inclusive), + which can be used as the semantic label for each point. + + See also: [PapersWithCode_S3DIS]_. + + References: + + .. [Armeni2012] `"3D Semantic Parsing of Large-Scale Indoor Spaces," + <https://openaccess.thecvf.com/content_cvpr_2016/html/Armeni_3D_Semantic_Parsing_CVPR_2016_paper.html>`_, + by Iro Armeni, Ozan Sener, Amir R. Zamir, Helen Jiang, + Ioannis Brilakis, Martin Fischer, and Silvio Savarese, + CVPR 2012. + + .. [ProjectPage_S3DIS] `Project page + <http://buildingparser.stanford.edu/dataset.html>`_ + + .. [PapersWithCode_S3DIS] `PapersWithCode: S3DIS + <https://paperswithcode.com/dataset/s3dis>`_ + """ + + URLS = [ + "https://shapenet.cs.stanford.edu/media/indoor3d_sem_seg_hdf5_data.zip", + ] + + HASHES = [ + "587bb63b296d542c24910c384c41028f2caa1d749042ae891d0d64968c773185", # indoor3d_sem_seg_hdf5_data.zip + ] + + # Suggested splits: + AREAS = { + "train": (1, 2, 3, 4, 6), + "valid": (5,), + "test": (5,), + } + + NUM_SAMPLES_PER_AREA = [0, 3687, 4440, 1650, 3662, 6852, 3294] + + LABELS = [ + "ceiling", + "floor", + "wall", + "beam", + "column", + "window", + "door", + "table", + "chair", + "sofa", + "bookcase", + "board", + "clutter", + ] + + ROOMS = [ + "auditorium", + "conferenceRoom", + "copyRoom", + "hallway", + "lobby", + "lounge", + "office", + "openspace", + "pantry", + "storage", + "WC", + ] + + def __init__( + self, + root=None, + cache_root=None, + split="train", + split_name=None, + areas=AREAS["train"], + pre_transform=None, + transform=None, + download=True, + ): + if cache_root is None: + assert root is not None + cache_root = f"{str(root).rstrip('/')}_cache" + + self.root = Path(root) if root else None + self.cache_root = Path(cache_root) + self.split = split + self.split_name = split if split_name is None else split_name + self.areas = areas + + if download and self.root: + self.download() + + self._root_dataset = self._get_root_dataset() + + super().__init__( + cache_root=self.cache_root / self.split_name, + pre_transform=pre_transform, + transform=transform, + ) + + self._ensure_cache() + + def download(self, force=False): + if not force and self.root.exists(): + return + tmpdir = self.root.parent / "tmp" + os.makedirs(tmpdir, exist_ok=True) + for expected_hash, url in zip(self.HASHES, self.URLS): + filepath = download_url( + url, tmpdir, check_certificate=False, overwrite=force + ) + shutil.unpack_archive(filepath, tmpdir) + assert expected_hash == hash_file(filepath, method="sha256") + shutil.move(tmpdir / "indoor3d_sem_seg_hdf5_data", self.root) + + def _get_root_dataset(self): + import h5py + + h5_files = [h5py.File(path, "r") for path in sorted(self.root.glob("**/*.h5"))] + keys = ["data", "label"] + + return ConcatDataset( + StackDataset(**{k: NdArrayDataset(h5_file[k], single=True) for k in keys}) + for h5_file in h5_files + ) + + def _get_items(self): + with open(self.root / "room_filelist.txt") as f: + lines = f.read().splitlines() + return [ + (i, line) + for i, line in enumerate(lines) + if int(line.split("_")[1]) in self.areas + ] + + def _load_item(self, item): + index, name = item + _, area_index_str, room_str, *_ = name.split("_") + data = self._root_dataset[index] + + return { + "file_index": index, + "area_index": int(area_index_str), + "room_index": self.ROOMS.index(room_str), + "semantic_index": data["label"], + "pos": data["data"][:, 0:3], # xyz + "color": data["data"][:, 3:6], # rgb + "pos_normalized": data["data"][:, 6:9], # Normalized xyz + }
    + +
    + +
    + + + + + + +
    + +
    +
    +
    + +
    + + + +
    + + +
    +
    + + +
    + + +
    +
    +
    + + + + + + + + \ No newline at end of file diff --git a/_modules/compressai/datasets/pointcloud/semantic_kitti.html b/_modules/compressai/datasets/pointcloud/semantic_kitti.html new file mode 100644 index 00000000..71fbed29 --- /dev/null +++ b/_modules/compressai/datasets/pointcloud/semantic_kitti.html @@ -0,0 +1,626 @@ + + + + + + + + + + compressai.datasets.pointcloud.semantic_kitti — CompressAI + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + +
    +
    +
    +
    +
    + + + + +
    +
    + + + + + +
    + + + + + + + + + + + + + +
    + +
    + + + +
    + +
    +
    + +
    +
    + +
    + +
    + +
    + + +
    + +
    + +
    + + + + + + + + + + + + + + + + + + +
    + +
    + +
    +
    + + + +
    +

    + +
    +
    + +
    +
    +
    + + + + +
    + +

    Source code for compressai.datasets.pointcloud.semantic_kitti

    +# Copyright (c) 2021-2022, InterDigital Communications, Inc
    +# All rights reserved.
    +
    +# Redistribution and use in source and binary forms, with or without
    +# modification, are permitted (subject to the limitations in the disclaimer
    +# below) provided that the following conditions are met:
    +
    +# * Redistributions of source code must retain the above copyright notice,
    +#   this list of conditions and the following disclaimer.
    +# * Redistributions in binary form must reproduce the above copyright notice,
    +#   this list of conditions and the following disclaimer in the documentation
    +#   and/or other materials provided with the distribution.
    +# * Neither the name of InterDigital Communications, Inc nor the names of its
    +#   contributors may be used to endorse or promote products derived from this
    +#   software without specific prior written permission.
    +
    +# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY
    +# THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
    +# CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
    +# NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
    +# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
    +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
    +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
    +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
    +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
    +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
    +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
    +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    +
    +import os
    +import re
    +import shutil
    +
    +from pathlib import Path
    +
    +import numpy as np
    +
    +from compressai.datasets.cache import CacheDataset
    +from compressai.datasets.utils import download_url, hash_file
    +from compressai.registry import register_dataset
    +
    +
    +
    +[docs] +@register_dataset("SemanticKittiDataset") +class SemanticKittiDataset(CacheDataset): + """SemanticKITTI dataset. + + The KITTI dataset, introduced by [Geiger2012]_, contains 3D point + clouds sequences (i.e. video) of LiDAR sensor data from the + perspective of a driving vehicle. + The SemanticKITTI dataset, introduced by [Behley2019]_ and + [Behley2021]_, provides semantic annotation of all 22 sequences from + the odometry task [Odometry_KITTI]_ of KITTI. + See the [ProjectPage_SemanticKITTI]_ for a visualization. + Note that the test set is unlabelled, and must be evaluated on the + server, as mentioned at [ProjectPageTasks_SemanticKITTI]_. + + The ``semantic_index`` is a number between 0 and 33 (inclusive), + which can be used as the semantic label for each point. + + See also: [PapersWithCode_SemanticKITTI]_. + + References: + + .. [Geiger2012] `"Are we ready for Autonomous Driving? The KITTI + Vision Benchmark Suite," + <https://www.cvlibs.net/publications/Geiger2012CVPR.pdf>`_, + by Andreas Geiger, Philip Lenz, and Raquel Urtasun, + CVPR 2012. + + .. [Behley2019] `"SemanticKITTI: A Dataset for Semantic Scene + Understanding of LiDAR Sequences," + <https://arxiv.org/abs/1904.01416>`_, + by Jens Behley, Martin Garbade, Andres Milioto, Jan Quenzel, + Sven Behnke, Cyrill Stachniss, and Juergen Gall, ICCV 2019. + + .. [Behley2021] `"Towards 3D LiDAR-based semantic scene + understanding of 3D point cloud sequences: The SemanticKITTI + Dataset," + <https://journals.sagepub.com/doi/10.1177/02783649211006735>`_, + by Jens Behley, Martin Garbade, Andres Milioto, Jan Quenzel, + Sven Behnke, Jürgen Gall, and Cyrill Stachniss, IJRR 2021. + + .. [ProjectPage_SemanticKITTI] `Project page (SemanticKITTI) + <http://www.semantic-kitti.org/>`_ + + .. [ProjectPageTasks_SemanticKITTI] `Project page: Tasks + (SemanticKITTI) + <http://www.semantic-kitti.org/tasks.html>`_ + + .. [Odometry_KITTI] `"Visual Odometry / SLAM Evaluation 2012" + <https://www.cvlibs.net/datasets/kitti/eval_odometry.php>`_ + + .. [PapersWithCode_SemanticKITTI] `PapersWithCode: SemanticKITTI + <https://paperswithcode.com/dataset/semantickitti>`_ + """ + + URLS = [ + "https://s3.eu-central-1.amazonaws.com/avg-kitti/data_odometry_calib.zip", + "https://s3.eu-central-1.amazonaws.com/avg-kitti/data_odometry_velodyne.zip", + "http://www.semantic-kitti.org/assets/data_odometry_labels.zip", + "http://www.semantic-kitti.org/assets/data_odometry_voxels_all.zip", + "http://www.semantic-kitti.org/assets/data_odometry_voxels.zip", + ] + + HASHES = [ + "fa45d2bbff828776e6df689b161415fb7cd719345454b6d3567c2ff81fa4d075", # data_odometry_calib.zip + "062a45667bec6874ac27f733bd6809919f077265e7ac0bb25ac885798fa85ab5", # data_odometry_velodyne.zip + "408ec524636a393bae0288a0b2f48bf5418a1af988e82dee8496f89ddb7e6dda", # data_odometry_labels.zip + "10f333faa63426a519a573fbf0b4e3b56513511af30583473fa6a5782e037f3a", # data_odometry_voxels_all.zip + "d92c253e88e5e30c0a0b88f028510760e1db83b7e262d75c5931bf9b8d6dd51b", # data_odometry_voxels.zip + ] + + # Suggested splits: + SEQUENCES = { + "train": (0, 1, 2, 3, 4, 5, 6, 7, 9, 10), + "valid": (8,), + "infer": (8,), + "test": (11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21), # Unlabelled. + } + + # fmt: off + NUM_SAMPLES_PER_SEQUENCE = [ + 4541, 1101, 4661, 801, 271, 2761, 1101, 1101, 4071, 1591, 1201, + 921, 1061, 3281, 631, 1901, 1731, 491, 1801, 4981, 831, 2721 + ] + # fmt: on + + RAW_SEMANTIC_INDEX_TO_LABEL = { + 0: "unlabeled", + 1: "outlier", + 10: "car", + 11: "bicycle", + 13: "bus", + 15: "motorcycle", + 16: "on-rails", + 18: "truck", + 20: "other-vehicle", + 30: "person", + 31: "bicyclist", + 32: "motorcyclist", + 40: "road", + 44: "parking", + 48: "sidewalk", + 49: "other-ground", + 50: "building", + 51: "fence", + 52: "other-structure", + 60: "lane-marking", + 70: "vegetation", + 71: "trunk", + 72: "terrain", + 80: "pole", + 81: "traffic-sign", + 99: "other-object", + 252: "moving-car", + 253: "moving-bicyclist", + 254: "moving-person", + 255: "moving-motorcyclist", + 256: "moving-on-rails", + 257: "moving-bus", + 258: "moving-truck", + 259: "moving-other-vehicle", + } + + RAW_SEMANTIC_INDEX_TO_SEMANTIC_INDEX = { + idx: i for i, idx in enumerate(RAW_SEMANTIC_INDEX_TO_LABEL) + } + + def __init__( + self, + root=None, + cache_root=None, + split="train", + split_name=None, + sequences=SEQUENCES["train"], + pre_transform=None, + transform=None, + download=True, + ): + if cache_root is None: + assert root is not None + cache_root = f"{str(root).rstrip('/')}_cache" + + self.root = Path(root) if root else None + self.cache_root = Path(cache_root) + self.split = split + self.split_name = split if split_name is None else split_name + self.sequences = sequences + + if download and self.root: + self.download() + + super().__init__( + cache_root=self.cache_root / self.split_name, + pre_transform=pre_transform, + transform=transform, + ) + + self._ensure_cache() + + def download(self, force=False): + if not force and self.root.exists(): + return + tmpdir = self.root.parent / "tmp" + os.makedirs(tmpdir, exist_ok=True) + for expected_hash, url in zip(self.HASHES, self.URLS): + filepath = download_url( + url, tmpdir, check_certificate=False, overwrite=force + ) + shutil.unpack_archive(filepath, tmpdir) + assert expected_hash == hash_file(filepath, method="sha256") + shutil.move(tmpdir / "dataset", self.root) + + def _get_items(self): + return sorted( + x + for i in self.sequences + for x in self.root.glob(f"**/{i:02}/velodyne/*.bin") + ) + + def _load_item(self, path): + path_prefix, sequence_index, file_index = self._parse_path(path) + assert str(path) == f"{path_prefix}{sequence_index}/velodyne/{file_index}.bin" + point_data = np.fromfile(path, dtype=np.float32).reshape(-1, 4) + label_data = ( + np.fromfile( + f"{path_prefix}{sequence_index}/labels/{file_index}.label", dtype="<u2" + ) + .reshape(-1, 2) + .astype(np.int16) + ) + + return { + "file_index": np.array([file_index], dtype=np.int32), + "sequence_index": np.array([sequence_index], dtype=np.int32), + "raw_semantic_index": label_data[:, 0], + "semantic_index": np_remap( + label_data[:, 0], self.RAW_SEMANTIC_INDEX_TO_SEMANTIC_INDEX + ), + "instance_index": label_data[:, 1], + "pos": point_data[:, :3], + "remission": point_data[:, 3, None], + } + + def _parse_path(self, path): + pattern = ( + r"^(?P<path_prefix>.*?/?)" + r"(?P<sequence_index>\d+)/" + r"velodyne/" + r"(?P<file_index>\d{6})\.\w+$" + ) + match = re.match(pattern, str(path)) + if match is None: + raise ValueError(f"Could not parse path: {path}") + path_prefix = match.group("path_prefix") + sequence_index = match.group("sequence_index") + file_index = match.group("file_index") + return path_prefix, sequence_index, file_index
    + + + +def np_remap(arr, d): + values, inverse = np.unique(arr, return_inverse=True) + values = np.array([d[x] for x in values], dtype=arr.dtype) + return values[inverse].reshape(arr.shape) +
    + +
    + + + + + + +
    + +
    +
    +
    + +
    + + + +
    + + +
    +
    + + +
    + + +
    +
    +
    + + + + + + + + \ No newline at end of file diff --git a/_modules/compressai/datasets/pointcloud/shapenet.html b/_modules/compressai/datasets/pointcloud/shapenet.html new file mode 100644 index 00000000..c1884ccb --- /dev/null +++ b/_modules/compressai/datasets/pointcloud/shapenet.html @@ -0,0 +1,636 @@ + + + + + + + + + + compressai.datasets.pointcloud.shapenet — CompressAI + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + +
    +
    +
    +
    +
    + + + + +
    +
    + + + + + +
    + + + + + + + + + + + + + +
    + +
    + + + +
    + +
    +
    + +
    +
    + +
    + +
    + +
    + + +
    + +
    + +
    + + + + + + + + + + + + + + + + + + +
    + +
    + +
    +
    + + + +
    +

    + +
    +
    + +
    +
    +
    + + + + +
    + +

    Source code for compressai.datasets.pointcloud.shapenet

    +# Copyright (c) 2021-2022, InterDigital Communications, Inc
    +# All rights reserved.
    +
    +# Redistribution and use in source and binary forms, with or without
    +# modification, are permitted (subject to the limitations in the disclaimer
    +# below) provided that the following conditions are met:
    +
    +# * Redistributions of source code must retain the above copyright notice,
    +#   this list of conditions and the following disclaimer.
    +# * Redistributions in binary form must reproduce the above copyright notice,
    +#   this list of conditions and the following disclaimer in the documentation
    +#   and/or other materials provided with the distribution.
    +# * Neither the name of InterDigital Communications, Inc nor the names of its
    +#   contributors may be used to endorse or promote products derived from this
    +#   software without specific prior written permission.
    +
    +# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY
    +# THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
    +# CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
    +# NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
    +# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
    +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
    +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
    +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
    +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
    +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
    +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
    +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    +
    +from __future__ import annotations
    +
    +import json
    +import os
    +import re
    +import shutil
    +
    +from pathlib import Path
    +
    +import numpy as np
    +import pandas as pd
    +
    +from compressai.datasets.cache import CacheDataset
    +from compressai.datasets.utils import download_url, hash_file
    +from compressai.registry import register_dataset
    +
    +
    +
    +[docs] +@register_dataset("ShapeNetCorePartDataset") +class ShapeNetCorePartDataset(CacheDataset): + """ShapeNet-Part dataset. + + The ShapeNet dataset of 3D CAD models of objects was introduced by + [Yi2016]_, consisting of over 3000000 models. + The ShapeNetCore (v2) dataset is a "clean" subset of ShapeNet, + consisting of 51127 aligned items from 55 object categories. + The ShapeNet-Part dataset is a further subset of this dataset, + consisting of 16881 items from 16 object categories. + See page 2 of [Yi2017]_ for additional description. + + Object categories are labeled with two to six segmentation parts + each, as shown in the image below. + (Purple represents a "miscellaneous" part.) + + .. image:: https://cs.stanford.edu/~ericyi/project_page/part_annotation/figures/categoriesNumbers.png + + [ProjectPage_ShapeNetPart]_ also releases a processed version of + ShapeNet-Part containing point cloud and normals with + expert-verified segmentations, which we use here. + + The ``semantic_index`` is a number between 0 and 49 (inclusive), + which can be used as the semantic label for each point. + + See also: [PapersWithCode_ShapeNetPart]_ (benchmarks). + + References: + + .. [Yi2016] `"A scalable active framework for region annotation + in 3D shape collections," + <https://dl.acm.org/doi/10.1145/2980179.2980238>`_, + by Li Yi, Vladimir G. Kim, Duygu Ceylan, I-Chao Shen, + Mengyan Yan, Hao Su, Cewu Lu, Qixing Huang, Alla Sheffer, + and Leonidas Guibas, ACM Transactions on Graphics, 2016. + + .. [Yi2017] `"Large-scale 3D shape reconstruction and + segmentation from ShapeNet Core55," + <https://arxiv.org/pdf/1710.06104.pdf>`_, + by Li Yi et al. (total 50 authors), ICCV 2017. + + .. [ProjectPage_ShapeNetPart] `Project page (ShapeNet-Part) + <https://cs.stanford.edu/~ericyi/project_page/part_annotation/>`_ + + .. [PapersWithCode_ShapeNetPart] `PapersWithCode: ShapeNet-Part Benchmark + (3D Part Segmentation) + <https://paperswithcode.com/sota/3d-part-segmentation-on-shapenet-part>`_ + """ + + URLS = { + "shapenetcore_partanno_segmentation_benchmark_v0": "https://shapenet.cs.stanford.edu/media/shapenetcore_partanno_segmentation_benchmark_v0.zip", + "shapenetcore_partanno_segmentation_benchmark_v0_normal": "https://shapenet.cs.stanford.edu/media/shapenetcore_partanno_segmentation_benchmark_v0_normal.zip", + } + # Related: https://shapenet.cs.stanford.edu/media/shapenet_part_seg_hdf5_data.zip + + HASHES = { + "shapenetcore_partanno_segmentation_benchmark_v0": "f1dc7bad73237060946f13e1fa767b40d9adba52a79d42d64de31552b8c0b65e", + "shapenetcore_partanno_segmentation_benchmark_v0_normal": "0e26411700bae2da38ee8ecc719ba4db2e6e0133486e258665952ad5dfced0fe", + } + + CATEGORY_ID_TO_CATEGORY_STR = { + "02691156": "Airplane", + "02773838": "Bag", + "02954340": "Cap", + "02958343": "Car", + "03001627": "Chair", + "03261776": "Earphone", + "03467517": "Guitar", + "03624134": "Knife", + "03636649": "Lamp", + "03642806": "Laptop", + "03790512": "Motorbike", + "03797390": "Mug", + "03948459": "Pistol", + "04099429": "Rocket", + "04225987": "Skateboard", + "04379243": "Table", + } + + NUM_PARTS = { + "02691156": 4, # Airplane + "02773838": 2, # Bag + "02954340": 2, # Cap + "02958343": 4, # Car + "03001627": 4, # Chair + "03261776": 3, # Earphone + "03467517": 3, # Guitar + "03624134": 2, # Knife + "03636649": 4, # Lamp + "03642806": 2, # Laptop + "03790512": 6, # Motorbike + "03797390": 2, # Mug + "03948459": 3, # Pistol + "04099429": 3, # Rocket + "04225987": 3, # Skateboard + "04379243": 3, # Table + } + + def __init__( + self, + root=None, + cache_root=None, + split="train", + split_name=None, + pre_transform=None, + transform=None, + name="shapenetcore_partanno_segmentation_benchmark_v0_normal", + download=True, + ): + if cache_root is None: + assert root is not None + cache_root = f"{str(root).rstrip('/')}_cache" + + self.root = Path(root) if root else None + self.cache_root = Path(cache_root) + self.split = split + self.split_name = split if split_name is None else split_name + self.name = name + + if download and self.root: + self.download() + + self._verify_category_ids() + + self.category_id_info = { + category_id: { + "category_str": category_str, + "category_index": category_index, + } + for category_index, (category_id, category_str) in enumerate( + self.CATEGORY_ID_TO_CATEGORY_STR.items() + ) + } + + self.category_offsets = np.cumsum([0] + list(self.NUM_PARTS.values())) + + super().__init__( + cache_root=self.cache_root / self.split_name, + pre_transform=pre_transform, + transform=transform, + ) + + self._ensure_cache() + + def download(self, force=False): + if not force and self.root.exists(): + return + tmpdir = self.root.parent / "tmp" + os.makedirs(tmpdir, exist_ok=True) + filepath = download_url( + self.URLS[self.name], tmpdir, check_certificate=False, overwrite=force + ) + assert self.HASHES[self.name] == hash_file(filepath, method="sha256") + shutil.unpack_archive(filepath, tmpdir) + shutil.move(tmpdir / f"{self.name}", self.root) + + def _verify_category_ids(self): + with open(self.root / "synsetoffset2category.txt") as f: + pairs = [line.split() for line in f.readlines()] + category_id_to_category_str = { + category_id: category_str for category_str, category_id in pairs + } + assert category_id_to_category_str == self.CATEGORY_ID_TO_CATEGORY_STR + + def _get_items(self): + file_list = f"shuffled_{self.split}_file_list.json" + with open(self.root / "train_test_split" / file_list) as f: + paths = json.load(f) + return paths + + def _load_item(self, path): + category_id, file_hash = self._parse_path(path) + category_index = self.category_id_info[category_id]["category_index"] + category_offset = self.category_offsets[category_index] + read_csv_kwargs = {"sep": " ", "header": None, "index_col": False} + + if self.name == "shapenetcore_partanno_segmentation_benchmark_v0_normal": + names = ["x", "y", "z", "nx", "ny", "nz", "semantic_index"] + df = pd.read_csv( + f"{self.root}/{category_id}/{file_hash}.txt", + names=names, + dtype={k: np.float32 for k in names}, + **read_csv_kwargs, + ) + df["semantic_index"] = df["semantic_index"].astype(np.uint8) + df["part_index"] = df["semantic_index"] - category_offset + + elif self.name == "shapenetcore_partanno_segmentation_benchmark_v0": + df_points = pd.read_csv( + f"{self.root}/{category_id}/points/{file_hash}.pts", + names=["x", "y", "z"], + dtype={k: np.float32 for k in ["x", "y", "z"]}, + **read_csv_kwargs, + ) + df_points_label = pd.read_csv( + f"{self.root}/{category_id}/points_label/{file_hash}.seg", + names=["part_index"], + dtype={"part_index": np.uint8}, + **read_csv_kwargs, + ) + df = pd.concat([df_points, df_points_label], axis="columns") + assert df["part_index"].min() >= 1 + df["part_index"] -= 1 + df["semantic_index"] = category_offset + df["part_index"] + + else: + raise ValueError(f"Unknown name: {self.name}") + + data = { + "category_index": np.array([category_index], dtype=np.uint8), + "part_index": df["part_index"].values, + "semantic_index": df["semantic_index"].values, + "pos": df[["x", "y", "z"]].values, + } + + if self.name == "shapenetcore_partanno_segmentation_benchmark_v0_normal": + data["normal"] = df[["nx", "ny", "nz"]].values + + return data + + def _parse_path(self, path): + pattern = r"^.*?/?(?P<category_id>\d+)/(?P<file_hash>[-a-fu\d]+)$" + match = re.match(pattern, str(path)) + if match is None: + raise ValueError(f"Could not parse path: {path}") + category_id = match.group("category_id") + file_hash = match.group("file_hash") + return category_id, file_hash
    + +
    + +
    + + + + + + +
    + +
    +
    +
    + +
    + + + +
    + + +
    +
    + + +
    + + +
    +
    +
    + + + + + + + + \ No newline at end of file diff --git a/_modules/compressai/datasets/pregenerated.html b/_modules/compressai/datasets/pregenerated.html new file mode 100644 index 00000000..2c5d5738 --- /dev/null +++ b/_modules/compressai/datasets/pregenerated.html @@ -0,0 +1,465 @@ + + + + + + + + + + compressai.datasets.pregenerated — CompressAI + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + +
    +
    +
    +
    +
    + + + + +
    +
    + + + + + +
    + + + + + + + + + + + + + +
    + +
    + + + +
    + +
    +
    + +
    +
    + +
    + +
    + +
    + + +
    + +
    + +
    + + + + + + + + + + + + + + + + + + +
    + +
    + +
    +
    + + + +
    +

    + +
    +
    + +
    +
    +
    + + + + +
    + +

    Source code for compressai.datasets.pregenerated

    +# Copyright (c) 2021-2022, InterDigital Communications, Inc
    +# All rights reserved.
    +
    +# Redistribution and use in source and binary forms, with or without
    +# modification, are permitted (subject to the limitations in the disclaimer
    +# below) provided that the following conditions are met:
    +
    +# * Redistributions of source code must retain the above copyright notice,
    +#   this list of conditions and the following disclaimer.
    +# * Redistributions in binary form must reproduce the above copyright notice,
    +#   this list of conditions and the following disclaimer in the documentation
    +#   and/or other materials provided with the distribution.
    +# * Neither the name of InterDigital Communications, Inc nor the names of its
    +#   contributors may be used to endorse or promote products derived from this
    +#   software without specific prior written permission.
    +
    +# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY
    +# THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
    +# CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
    +# NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
    +# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
    +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
    +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
    +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
    +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
    +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
    +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
    +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    +
    +from pathlib import Path
    +from typing import Tuple, Union
    +
    +import numpy as np
    +
    +from PIL import Image
    +from torch.utils.data import Dataset
    +
    +from compressai.registry import register_dataset
    +
    +_size_2_t = Union[int, Tuple[int, int]]
    +
    +
    +
    +[docs] +@register_dataset("PreGeneratedMemmapDataset") +class PreGeneratedMemmapDataset(Dataset): + """A data loader for memory-mapped numpy arrays. + + This allows for fast training where the images patches have already been + extracted and shuffled. The numpy array in expected to have the following + size: `NxHxWx3`, with `N` the number of samples, `H` and `W` the images + dimensions. + + Args: + root (string): root directory where the numpy arrays are located. + image_size (int, int): size of the images in the array. + patch_size (int): size of the patches to be randomly cropped for training. + split (string): split mode ('train' or 'val'). + batch_size (int): batch size. + num_workers (int): number of CPU thread workers. + pin_memory (bool): pin memory. + """ + + def __init__( + self, + root: str, + transform=None, + split: str = "train", + image_size: _size_2_t = (256, 256), + ): + if not Path(root).is_dir(): + raise RuntimeError(f"Invalid path {root}") + + self.split = split + self.transform = transform + + self.shuffle = False + + if split == "train": + filename = "training.npy" + elif split == "valid": + filename = "validation.npy" + else: + raise ValueError() + path = Path(root) / filename + data: np.ndarray = np.memmap(path, mode="r", dtype="uint8") + assert data.size > 0 + image_size = _coerce_size_2_t(image_size) + self.data = data.reshape((-1, image_size[0], image_size[1], 3)) + + def __getitem__(self, index): + sample = self.data[index] + sample = Image.fromarray(sample) + if self.transform: + return self.transform(sample) + return sample + + def __len__(self): + return self.data.shape[0]
    + + + +def _coerce_size_2_t(x: _size_2_t) -> Tuple[int, int]: + if isinstance(x, int): + return x, x + return x +
    + +
    + + + + + + +
    + +
    +
    +
    + +
    + + + +
    + + +
    +
    + + +
    + + +
    +
    +
    + + + + + + + + \ No newline at end of file diff --git a/_modules/compressai/datasets/video.html b/_modules/compressai/datasets/video.html index 995f51ca..d1e0bfa4 100644 --- a/_modules/compressai/datasets/video.html +++ b/_modules/compressai/datasets/video.html @@ -167,6 +167,7 @@
  • compressai.entropy_models
  • compressai.latent_codecs
  • compressai.layers
  • +
  • compressai.losses
  • compressai.models
  • compressai.ops
  • compressai.transforms
  • diff --git a/_modules/compressai/datasets/vimeo90k.html b/_modules/compressai/datasets/vimeo90k.html new file mode 100644 index 00000000..65946b9f --- /dev/null +++ b/_modules/compressai/datasets/vimeo90k.html @@ -0,0 +1,461 @@ + + + + + + + + + + compressai.datasets.vimeo90k — CompressAI + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + +
    +
    +
    +
    +
    + + + + +
    +
    + + + + + +
    + + + + + + + + + + + + + +
    + +
    + + + +
    + +
    +
    + +
    +
    + +
    + +
    + +
    + + +
    + +
    + +
    + + + + + + + + + + + + + + + + + + +
    + +
    + +
    +
    + + + +
    +

    + +
    +
    + +
    +
    +
    + + + + +
    + +

    Source code for compressai.datasets.vimeo90k

    +# Copyright (c) 2021-2022, InterDigital Communications, Inc
    +# All rights reserved.
    +
    +# Redistribution and use in source and binary forms, with or without
    +# modification, are permitted (subject to the limitations in the disclaimer
    +# below) provided that the following conditions are met:
    +
    +# * Redistributions of source code must retain the above copyright notice,
    +#   this list of conditions and the following disclaimer.
    +# * Redistributions in binary form must reproduce the above copyright notice,
    +#   this list of conditions and the following disclaimer in the documentation
    +#   and/or other materials provided with the distribution.
    +# * Neither the name of InterDigital Communications, Inc nor the names of its
    +#   contributors may be used to endorse or promote products derived from this
    +#   software without specific prior written permission.
    +
    +# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY
    +# THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
    +# CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
    +# NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
    +# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
    +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
    +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
    +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
    +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
    +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
    +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
    +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    +
    +from pathlib import Path
    +
    +from PIL import Image
    +from torch.utils.data import Dataset
    +
    +from compressai.registry import register_dataset
    +
    +
    +
    +[docs] +@register_dataset("Vimeo90kDataset") +class Vimeo90kDataset(Dataset): + """Load a Vimeo-90K structured dataset. + + Vimeo-90K dataset from + Tianfan Xue, Baian Chen, Jiajun Wu, Donglai Wei, William T. Freeman: + `"Video Enhancement with Task-Oriented Flow" + <https://arxiv.org/abs/1711.09078>`_, + International Journal of Computer Vision (IJCV), 2019. + + Training and testing image samples are respectively stored in + separate directories: + + .. code-block:: + + - rootdir/ + - sequence/ + - 00001/001/im1.png + - 00001/001/im2.png + - 00001/001/im3.png + + Args: + root (string): root directory of the dataset + transform (callable, optional): a function or transform that takes in a + PIL image and returns a transformed version + split (string): split mode ('train' or 'valid') + tuplet (int): order of dataset tuplet (e.g. 3 for "triplet" dataset) + """ + + def __init__(self, root, transform=None, split="train", tuplet=3): + list_path = Path(root) / self._list_filename(split, tuplet) + + with open(list_path) as f: + self.samples = [ + f"{root}/sequences/{line.rstrip()}/im{idx}.png" + for line in f + if line.strip() != "" + for idx in range(1, tuplet + 1) + ] + + self.transform = transform + + def __getitem__(self, index): + """ + Args: + index (int): Index + + Returns: + img: `PIL.Image.Image` or transformed `PIL.Image.Image`. + """ + img = Image.open(self.samples[index]).convert("RGB") + if self.transform: + return self.transform(img) + return img + + def __len__(self): + return len(self.samples) + + def _list_filename(self, split: str, tuplet: int) -> str: + tuplet_prefix = {3: "tri", 7: "sep"}[tuplet] + list_suffix = {"train": "trainlist", "valid": "testlist"}[split] + return f"{tuplet_prefix}_{list_suffix}.txt"
    + +
    + +
    + + + + + + +
    + +
    +
    +
    + +
    + + + +
    + + +
    +
    + + +
    + + +
    +
    +
    + + + + + + + + \ No newline at end of file diff --git a/_modules/compressai/entropy_models/entropy_models.html b/_modules/compressai/entropy_models/entropy_models.html index 25e03e96..e31ee734 100644 --- a/_modules/compressai/entropy_models/entropy_models.html +++ b/_modules/compressai/entropy_models/entropy_models.html @@ -167,6 +167,7 @@
  • compressai.entropy_models
  • compressai.latent_codecs
  • compressai.layers
  • +
  • compressai.losses
  • compressai.models
  • compressai.ops
  • compressai.transforms
  • @@ -675,7 +676,7 @@

    Source code for compressai.entropy_models.entropy_models

    medians = self.quantiles[:, :, 1:2] return medians - def update(self, force: bool = False, update_quantiles: bool = True) -> bool: + def update(self, force: bool = False, update_quantiles: bool = False) -> bool: # Check if we need to update the bottleneck parameters, the offsets are # only computed and stored when the conditonal model is update()'d. if self._offset.numel() > 0 and not force: @@ -815,6 +816,10 @@

    Source code for compressai.entropy_models.entropy_models

    @torch.no_grad() def _update_quantiles(self, search_radius=1e5, rtol=1e-4, atol=1e-3): + """Fast quantile update via bisection search. + + Often faster and much more precise than minimizing aux loss. + """ device = self.quantiles.device shape = (self.channels, 1, 1) low = torch.full(shape, -search_radius, device=device) @@ -1173,10 +1178,17 @@

    Source code for compressai.entropy_models.entropy_models

    num_latents = cdf.size(0) + # rv = self.entropy_coder._encoder.encode_with_indexes( + # symbols.reshape(-1).int().tolist(), + # torch.arange(num_latents).int().tolist(), + # cdf.cpu().to(torch.int32), + # torch.tensor(cdf.size(1)).repeat(num_latents).int().tolist(), + # torch.tensor(0).repeat(num_latents).int().tolist(), + # ) rv = self.entropy_coder._encoder.encode_with_indexes( symbols.reshape(-1).int().tolist(), torch.arange(num_latents).int().tolist(), - cdf.cpu().to(torch.int32), + cdf.cpu().tolist(), torch.tensor(cdf.size(1)).repeat(num_latents).int().tolist(), torch.tensor(0).repeat(num_latents).int().tolist(), ) @@ -1191,10 +1203,17 @@

    Source code for compressai.entropy_models.entropy_models

    num_latents = cdf.size(0) + # values = self.entropy_coder._decoder.decode_with_indexes( + # strings, + # torch.arange(num_latents).int().tolist(), + # cdf.cpu().to(torch.int32), + # torch.tensor(cdf.size(1)).repeat(num_latents).int().tolist(), + # torch.tensor(0).repeat(num_latents).int().tolist(), + # ) values = self.entropy_coder._decoder.decode_with_indexes( strings, torch.arange(num_latents).int().tolist(), - cdf.cpu().to(torch.int32), + cdf.cpu().tolist(), torch.tensor(cdf.size(1)).repeat(num_latents).int().tolist(), torch.tensor(0).repeat(num_latents).int().tolist(), ) diff --git a/_modules/compressai/latent_codecs/channel_groups.html b/_modules/compressai/latent_codecs/channel_groups.html index 4d939490..31deb695 100644 --- a/_modules/compressai/latent_codecs/channel_groups.html +++ b/_modules/compressai/latent_codecs/channel_groups.html @@ -167,6 +167,7 @@
  • compressai.entropy_models
  • compressai.latent_codecs
  • compressai.layers
  • +
  • compressai.losses
  • compressai.models
  • compressai.ops
  • compressai.transforms
  • diff --git a/_modules/compressai/latent_codecs/checkerboard.html b/_modules/compressai/latent_codecs/checkerboard.html index 2af5b8a1..58196350 100644 --- a/_modules/compressai/latent_codecs/checkerboard.html +++ b/_modules/compressai/latent_codecs/checkerboard.html @@ -167,6 +167,7 @@
  • compressai.entropy_models
  • compressai.latent_codecs
  • compressai.layers
  • +
  • compressai.losses
  • compressai.models
  • compressai.ops
  • compressai.transforms
  • diff --git a/_modules/compressai/latent_codecs/entropy_bottleneck.html b/_modules/compressai/latent_codecs/entropy_bottleneck.html index 3cbc578d..a50f0ee6 100644 --- a/_modules/compressai/latent_codecs/entropy_bottleneck.html +++ b/_modules/compressai/latent_codecs/entropy_bottleneck.html @@ -167,6 +167,7 @@
  • compressai.entropy_models
  • compressai.latent_codecs
  • compressai.layers
  • +
  • compressai.losses
  • compressai.models
  • compressai.ops
  • compressai.transforms
  • diff --git a/_modules/compressai/latent_codecs/gain/hyper.html b/_modules/compressai/latent_codecs/gain/hyper.html index 3a7b9a81..cd2f4571 100644 --- a/_modules/compressai/latent_codecs/gain/hyper.html +++ b/_modules/compressai/latent_codecs/gain/hyper.html @@ -167,6 +167,7 @@
  • compressai.entropy_models
  • compressai.latent_codecs
  • compressai.layers
  • +
  • compressai.losses
  • compressai.models
  • compressai.ops
  • compressai.transforms
  • diff --git a/_modules/compressai/latent_codecs/gain/hyperprior.html b/_modules/compressai/latent_codecs/gain/hyperprior.html index a947c910..6c38a5f3 100644 --- a/_modules/compressai/latent_codecs/gain/hyperprior.html +++ b/_modules/compressai/latent_codecs/gain/hyperprior.html @@ -167,6 +167,7 @@
  • compressai.entropy_models
  • compressai.latent_codecs
  • compressai.layers
  • +
  • compressai.losses
  • compressai.models
  • compressai.ops
  • compressai.transforms
  • diff --git a/_modules/compressai/latent_codecs/gaussian_conditional.html b/_modules/compressai/latent_codecs/gaussian_conditional.html index 6bf22aa8..cfc143d3 100644 --- a/_modules/compressai/latent_codecs/gaussian_conditional.html +++ b/_modules/compressai/latent_codecs/gaussian_conditional.html @@ -167,6 +167,7 @@
  • compressai.entropy_models
  • compressai.latent_codecs
  • compressai.layers
  • +
  • compressai.losses
  • compressai.models
  • compressai.ops
  • compressai.transforms
  • diff --git a/_modules/compressai/latent_codecs/hyper.html b/_modules/compressai/latent_codecs/hyper.html index bf09750e..b3b5aa1c 100644 --- a/_modules/compressai/latent_codecs/hyper.html +++ b/_modules/compressai/latent_codecs/hyper.html @@ -167,6 +167,7 @@
  • compressai.entropy_models
  • compressai.latent_codecs
  • compressai.layers
  • +
  • compressai.losses
  • compressai.models
  • compressai.ops
  • compressai.transforms
  • diff --git a/_modules/compressai/latent_codecs/hyperprior.html b/_modules/compressai/latent_codecs/hyperprior.html index ec5a5cfc..ca90da52 100644 --- a/_modules/compressai/latent_codecs/hyperprior.html +++ b/_modules/compressai/latent_codecs/hyperprior.html @@ -167,6 +167,7 @@
  • compressai.entropy_models
  • compressai.latent_codecs
  • compressai.layers
  • +
  • compressai.losses
  • compressai.models
  • compressai.ops
  • compressai.transforms
  • diff --git a/_modules/compressai/latent_codecs/rasterscan.html b/_modules/compressai/latent_codecs/rasterscan.html index c7a9c6a1..0f1428b9 100644 --- a/_modules/compressai/latent_codecs/rasterscan.html +++ b/_modules/compressai/latent_codecs/rasterscan.html @@ -167,6 +167,7 @@
  • compressai.entropy_models
  • compressai.latent_codecs
  • compressai.layers
  • +
  • compressai.losses
  • compressai.models
  • compressai.ops
  • compressai.transforms
  • diff --git a/_modules/compressai/layers/gdn.html b/_modules/compressai/layers/gdn.html index af3de40b..02015249 100644 --- a/_modules/compressai/layers/gdn.html +++ b/_modules/compressai/layers/gdn.html @@ -167,6 +167,7 @@
  • compressai.entropy_models
  • compressai.latent_codecs
  • compressai.layers
  • +
  • compressai.losses
  • compressai.models
  • compressai.ops
  • compressai.transforms
  • diff --git a/_modules/compressai/layers/layers.html b/_modules/compressai/layers/layers.html index 5790a5a3..d08a31b0 100644 --- a/_modules/compressai/layers/layers.html +++ b/_modules/compressai/layers/layers.html @@ -167,6 +167,7 @@
  • compressai.entropy_models
  • compressai.latent_codecs
  • compressai.layers
  • +
  • compressai.losses
  • compressai.models
  • compressai.ops
  • compressai.transforms
  • @@ -316,7 +317,7 @@

    Source code for compressai.layers.layers

     
     import math
     
    -from typing import Any
    +from typing import Any, Tuple
     
     import torch
     import torch.nn as nn
    @@ -334,6 +335,8 @@ 

    Source code for compressai.layers.layers

         "ResidualBlockUpsample",
         "ResidualBlockWithStride",
         "conv1x1",
    +    "SpectralConv2d",
    +    "SpectralConvTranspose2d",
         "conv3x3",
         "subpel_conv3x3",
         "QReLU",
    @@ -341,6 +344,65 @@ 

    Source code for compressai.layers.layers

     ]
     
     
    +class _SpectralConvNdMixin:
    +    def __init__(self, dim: Tuple[int, ...]):
    +        self.dim = dim
    +        self.weight_transformed = nn.Parameter(self._to_transform_domain(self.weight))
    +        del self._parameters["weight"]  # Unregister weight, and fallback to property.
    +
    +    @property
    +    def weight(self) -> Tensor:
    +        return self._from_transform_domain(self.weight_transformed)
    +
    +    def _to_transform_domain(self, x: Tensor) -> Tensor:
    +        return torch.fft.rfftn(x, s=self.kernel_size, dim=self.dim, norm="ortho")
    +
    +    def _from_transform_domain(self, x: Tensor) -> Tensor:
    +        return torch.fft.irfftn(x, s=self.kernel_size, dim=self.dim, norm="ortho")
    +
    +
    +class SpectralConv2d(nn.Conv2d, _SpectralConvNdMixin):
    +    r"""Spectral 2D convolution.
    +
    +    Introduced in [Balle2018efficient].
    +    Reparameterizes the weights to be derived from weights stored in the
    +    frequency domain.
    +    In the original paper, this is referred to as "spectral Adam" or
    +    "Sadam" due to its effect on the Adam optimizer update rule.
    +    The motivation behind representing the weights in the frequency
    +    domain is that optimizer updates/steps may now affect all
    +    frequencies to an equal amount.
    +    This improves the gradient conditioning, thus leading to faster
    +    convergence and increased stability at larger learning rates.
    +
    +    For comparison, see the TensorFlow Compression implementations of
    +    `SignalConv2D
    +    <https://github.com/tensorflow/compression/blob/v2.14.0/tensorflow_compression/python/layers/signal_conv.py#L61>`_
    +    and
    +    `RDFTParameter
    +    <https://github.com/tensorflow/compression/blob/v2.14.0/tensorflow_compression/python/layers/parameters.py#L71>`_.
    +
    +    [Balle2018efficient]: `"Efficient Nonlinear Transforms for Lossy
    +    Image Compression" <https://arxiv.org/abs/1802.00847>`_,
    +    by Johannes Ballé, PCS 2018.
    +    """
    +
    +    def __init__(self, *args: Any, **kwargs: Any):
    +        super().__init__(*args, **kwargs)
    +        _SpectralConvNdMixin.__init__(self, dim=(-2, -1))
    +
    +
    +class SpectralConvTranspose2d(nn.ConvTranspose2d, _SpectralConvNdMixin):
    +    r"""Spectral 2D transposed convolution.
    +
    +    Transposed version of :class:`SpectralConv2d`.
    +    """
    +
    +    def __init__(self, *args: Any, **kwargs: Any):
    +        super().__init__(*args, **kwargs)
    +        _SpectralConvNdMixin.__init__(self, dim=(-2, -1))
    +
    +
     
    [docs] class MaskedConv2d(nn.Conv2d): diff --git a/_modules/compressai/losses/pointcloud/chamfer.html b/_modules/compressai/losses/pointcloud/chamfer.html new file mode 100644 index 00000000..e61bc633 --- /dev/null +++ b/_modules/compressai/losses/pointcloud/chamfer.html @@ -0,0 +1,469 @@ + + + + + + + + + + compressai.losses.pointcloud.chamfer — CompressAI + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + +
    +
    +
    +
    +
    + + + + +
    +
    + + + + + +
    + + + + + + + + + + + + + +
    + +
    + + + +
    + +
    +
    + +
    +
    + +
    + +
    + +
    + + +
    + +
    + +
    + + + + + + + + + + + + + + + + + + +
    + +
    + +
    +
    + + + +
    +

    + +
    +
    + +
    +
    +
    + + + + +
    + +

    Source code for compressai.losses.pointcloud.chamfer

    +# Copyright (c) 2021-2022, InterDigital Communications, Inc
    +# All rights reserved.
    +
    +# Redistribution and use in source and binary forms, with or without
    +# modification, are permitted (subject to the limitations in the disclaimer
    +# below) provided that the following conditions are met:
    +
    +# * Redistributions of source code must retain the above copyright notice,
    +#   this list of conditions and the following disclaimer.
    +# * Redistributions in binary form must reproduce the above copyright notice,
    +#   this list of conditions and the following disclaimer in the documentation
    +#   and/or other materials provided with the distribution.
    +# * Neither the name of InterDigital Communications, Inc nor the names of its
    +#   contributors may be used to endorse or promote products derived from this
    +#   software without specific prior written permission.
    +
    +# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY
    +# THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
    +# CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
    +# NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
    +# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
    +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
    +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
    +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
    +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
    +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
    +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
    +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    +
    +from __future__ import annotations
    +
    +import torch
    +import torch.nn as nn
    +
    +from einops import rearrange
    +
    +try:
    +    from pointops.functions import pointops
    +except ImportError:
    +    pass  # NOTE: Optional dependency.
    +
    +from compressai.layers.pointcloud.hrtzxf2022 import index_points
    +from compressai.losses.utils import compute_rate_loss
    +from compressai.registry import register_criterion
    +
    +
    +
    +[docs] +@register_criterion("ChamferPccRateDistortionLoss") +class ChamferPccRateDistortionLoss(nn.Module): + """Simple loss for regular point cloud compression. + + For compression models that reconstruct the input point cloud. + """ + + LMBDA_DEFAULT = { + # "bpp": 1.0, + "rec": 1.0, + } + + def __init__(self, lmbda=None, rate_key="bpp"): + super().__init__() + self.lmbda = lmbda or dict(self.LMBDA_DEFAULT) + self.lmbda.setdefault(rate_key, 1.0) + +
    +[docs] + def forward(self, output, target): + out = { + **self.compute_rate_loss(output, target), + **self.compute_rec_loss(output, target), + } + + out["loss"] = sum( + self.lmbda[k] * out[f"{k}_loss"] + for k in self.lmbda.keys() + if f"{k}_loss" in out + ) + + return out
    + + + def compute_rate_loss(self, output, target): + if "likelihoods" not in output: + return {} + N, P, _ = target["pos"].shape + return compute_rate_loss(output["likelihoods"], N, P) + + def compute_rec_loss(self, output, target): + dist1, dist2, _, _ = chamfer_distance( + target["pos"], output["x_hat"], order="b n c" + ) + loss_chamfer = dist1.mean() + dist2.mean() + return {"rec_loss": loss_chamfer}
    + + + +def chamfer_distance(xyzs1, xyzs2, order="b n c"): + # idx1, dist1: (b, n1) + # idx2, dist2: (b, n2) + xyzs1_bcn = rearrange(xyzs1, f"{order} -> b c n").contiguous() + xyzs1_bnc = rearrange(xyzs1, f"{order} -> b n c").contiguous() + xyzs2_bcn = rearrange(xyzs2, f"{order} -> b c n").contiguous() + xyzs2_bnc = rearrange(xyzs2, f"{order} -> b n c").contiguous() + idx1 = pointops.knnquery_heap(1, xyzs2_bnc, xyzs1_bnc).long().squeeze(2) + idx2 = pointops.knnquery_heap(1, xyzs1_bnc, xyzs2_bnc).long().squeeze(2) + torch.cuda.empty_cache() + dist1 = ((xyzs1_bcn - index_points(xyzs2_bcn, idx1)) ** 2).sum(1) + dist2 = ((xyzs2_bcn - index_points(xyzs1_bcn, idx2)) ** 2).sum(1) + return dist1, dist2, idx1, idx2 +
    + +
    + + + + + + +
    + +
    +
    +
    + +
    + + + +
    + + +
    +
    + + +
    + + +
    +
    +
    + + + + + +
    +
    + + \ No newline at end of file diff --git a/_modules/compressai/losses/pointcloud/hrtzxf2022.html b/_modules/compressai/losses/pointcloud/hrtzxf2022.html new file mode 100644 index 00000000..15957271 --- /dev/null +++ b/_modules/compressai/losses/pointcloud/hrtzxf2022.html @@ -0,0 +1,561 @@ + + + + + + + + + + compressai.losses.pointcloud.hrtzxf2022 — CompressAI + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + +
    +
    +
    +
    +
    + + + + +
    +
    + + + + + +
    + + + + + + + + + + + + + +
    + +
    + + + +
    + +
    +
    + +
    +
    + +
    + +
    + +
    + + +
    + +
    + +
    + + + + + + + + + + + + + + + + + + +
    + +
    + +
    +
    + + + +
    +

    + +
    +
    + +
    +
    +
    + + + + +
    + +

    Source code for compressai.losses.pointcloud.hrtzxf2022

    +# Copyright (c) 2021-2022, InterDigital Communications, Inc
    +# All rights reserved.
    +
    +# Redistribution and use in source and binary forms, with or without
    +# modification, are permitted (subject to the limitations in the disclaimer
    +# below) provided that the following conditions are met:
    +
    +# * Redistributions of source code must retain the above copyright notice,
    +#   this list of conditions and the following disclaimer.
    +# * Redistributions in binary form must reproduce the above copyright notice,
    +#   this list of conditions and the following disclaimer in the documentation
    +#   and/or other materials provided with the distribution.
    +# * Neither the name of InterDigital Communications, Inc nor the names of its
    +#   contributors may be used to endorse or promote products derived from this
    +#   software without specific prior written permission.
    +
    +# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY
    +# THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
    +# CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
    +# NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
    +# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
    +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
    +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
    +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
    +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
    +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
    +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
    +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    +
    +# Code adapted from https://github.com/yunhe20/D-PCC
    +
    +from __future__ import annotations
    +
    +import torch
    +import torch.nn as nn
    +import torch.nn.functional as F
    +
    +from compressai.layers.pointcloud.hrtzxf2022 import index_points
    +from compressai.losses.utils import compute_rate_loss
    +from compressai.registry import register_criterion
    +
    +from .chamfer import chamfer_distance
    +
    +
    +
    +[docs] +@register_criterion("RateDistortionLoss_hrtzxf2022") +class RateDistortionLoss_hrtzxf2022(nn.Module): + """Loss introduced in [He2022pcc]_ for "hrtzxf2022-pcc-rec" model. + + References: + + .. [He2022pcc] `"Density-preserving Deep Point Cloud Compression" + <https://arxiv.org/abs/2204.12684>`_, by Yun He, Xinlin Ren, + Danhang Tang, Yinda Zhang, Xiangyang Xue, and Yanwei Fu, + CVPR 2022. + """ + + LMBDA_DEFAULT = { + "bpp": 1.0, + "chamfer": 1e4, + "chamfer_layers": (1.0, 0.1, 0.1), + "latent_xyzs": 1e2, + "mean_distance": 5e1, + "normal": 1e2, + "pts_num": 5e-3, + "upsample_num": 1.0, + } + + def __init__( + self, + lmbda=None, + compress_normal=False, + latent_xyzs_codec_mode="learned", + ): + super().__init__() + self.lmbda = lmbda or dict(self.LMBDA_DEFAULT) + self.compress_normal = compress_normal + self.latent_xyzs_codec_mode = latent_xyzs_codec_mode + +
    +[docs] + def forward(self, output, target): + device = target["pos"].device + B, P, _ = target["pos"].shape + + out = {} + + chamfer_loss_, nearest_gt_idx_ = get_chamfer_loss( + output["gt_xyz_"], + output["xyz_hat_"], + ) + + out["chamfer_loss"] = sum( + self.lmbda["chamfer_layers"][i] * chamfer_loss_[i] + for i in range(len(chamfer_loss_)) + ) + + out["rec_loss"] = chamfer_loss_[0] # Name as rec_loss for compatibility. + + out["mean_distance_loss"], out["upsample_num_loss"] = get_density_loss( + output["gt_downsample_num_"], + output["gt_mean_distance_"], + output["upsample_num_hat_"], + output["mean_distance_hat_"], + nearest_gt_idx_, + ) + + out["pts_num_loss"] = get_pts_num_loss( + output["gt_xyz_"], + output["upsample_num_hat_"], + ) + + if self.latent_xyzs_codec_mode == "learned": + out["latent_xyzs_loss"] = get_latent_xyzs_loss( + output["gt_latent_xyz"], + output["latent_xyz_hat"], + ) + elif self.latent_xyzs_codec_mode == "float16": + out["latent_xyzs_loss"] = torch.tensor([0.0], device=device) + else: + raise ValueError( + f"Unknown latent_xyzs_codec_mode: {self.latent_xyzs_codec_mode}" + ) + + if self.compress_normal: + out["normal_loss"] = get_normal_loss( + output["gt_normal"], + output["feat_hat"].tanh(), + nearest_gt_idx_[0], + ) + else: + out["normal_loss"] = torch.tensor([0.0], device=device) + + if "likelihoods" in output: + out.update(compute_rate_loss(output["likelihoods"], B, P)) + + out["loss"] = sum( + self.lmbda[k] * out[f"{k}_loss"] + for k in self.lmbda.keys() + if f"{k}_loss" in out + ) + + return out
    +
    + + + +def get_chamfer_loss(gt_xyzs_, xyzs_hat_): + num_layers = len(gt_xyzs_) + chamfer_loss_ = [] + nearest_gt_idx_ = [] + + for i in range(num_layers): + xyzs1 = gt_xyzs_[i] + xyzs2 = xyzs_hat_[num_layers - i - 1] + dist1, dist2, _, idx2 = chamfer_distance(xyzs1, xyzs2, order="b c n") + chamfer_loss_.append(dist1.mean() + dist2.mean()) + nearest_gt_idx_.append(idx2.long()) + + return chamfer_loss_, nearest_gt_idx_ + + +def get_density_loss(gt_dnums_, gt_mdis_, unums_hat_, mdis_hat_, nearest_gt_idx_): + num_layers = len(gt_dnums_) + l1_loss = nn.L1Loss(reduction="mean") + mean_distance_loss_ = [] + upsample_num_loss_ = [] + + for i in range(num_layers): + if i == num_layers - 1: + # At the final downsample layer, gt_latent_xyzs ≈ latent_xyzs_hat. + mdis_i = gt_mdis_[i] + dnum_i = gt_dnums_[i] + else: + idx = nearest_gt_idx_[i + 1] + mdis_i = index_points(gt_mdis_[i].unsqueeze(1), idx).squeeze(1) + dnum_i = index_points(gt_dnums_[i].unsqueeze(1), idx).squeeze(1) + + mean_distance_loss_.append(l1_loss(mdis_hat_[num_layers - i - 1], mdis_i)) + upsample_num_loss_.append(l1_loss(unums_hat_[num_layers - i - 1], dnum_i)) + + return sum(mean_distance_loss_), sum(upsample_num_loss_) + + +def get_pts_num_loss(gt_xyzs_, unums_hat_): + num_layers = len(gt_xyzs_) + b, _, _ = gt_xyzs_[0].shape + gt_num_points_ = [x.shape[2] for x in gt_xyzs_] + return sum( + torch.abs(unums_hat_[num_layers - i - 1].sum() - gt_num_points_[i] * b) + for i in range(num_layers) + ) + + +def get_normal_loss(gt_normals, pred_normals, nearest_gt_idx): + nearest_normal = index_points(gt_normals, nearest_gt_idx) + return F.mse_loss(pred_normals, nearest_normal) + + +def get_latent_xyzs_loss(gt_latent_xyzs, latent_xyzs_hat): + return F.mse_loss(gt_latent_xyzs, latent_xyzs_hat) +
    + +
    + + + + + + +
    + +
    +
    +
    + +
    + + + +
    + + +
    +
    + + +
    + + +
    +
    +
    + + + + + +
    +
    + + \ No newline at end of file diff --git a/_modules/compressai/losses/rate_distortion.html b/_modules/compressai/losses/rate_distortion.html new file mode 100644 index 00000000..4fa6f197 --- /dev/null +++ b/_modules/compressai/losses/rate_distortion.html @@ -0,0 +1,440 @@ + + + + + + + + + + compressai.losses.rate_distortion — CompressAI + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + +
    +
    +
    +
    +
    + + + + +
    +
    + + + + + +
    + + + + + + + + + + + + + +
    + +
    + + + +
    + +
    +
    + +
    +
    + +
    + +
    + +
    + + +
    + +
    + +
    + + + + + + + + + + + + + + + + + + +
    + +
    + +
    +
    + + + +
    +

    + +
    +
    + +
    +
    +
    + + + + +
    + +

    Source code for compressai.losses.rate_distortion

    +# Copyright (c) 2021-2022, InterDigital Communications, Inc
    +# All rights reserved.
    +
    +# Redistribution and use in source and binary forms, with or without
    +# modification, are permitted (subject to the limitations in the disclaimer
    +# below) provided that the following conditions are met:
    +
    +# * Redistributions of source code must retain the above copyright notice,
    +#   this list of conditions and the following disclaimer.
    +# * Redistributions in binary form must reproduce the above copyright notice,
    +#   this list of conditions and the following disclaimer in the documentation
    +#   and/or other materials provided with the distribution.
    +# * Neither the name of InterDigital Communications, Inc nor the names of its
    +#   contributors may be used to endorse or promote products derived from this
    +#   software without specific prior written permission.
    +
    +# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY
    +# THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
    +# CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
    +# NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
    +# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
    +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
    +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
    +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
    +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
    +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
    +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
    +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    +
    +import math
    +
    +import torch
    +import torch.nn as nn
    +
    +from pytorch_msssim import ms_ssim
    +
    +from compressai.registry import register_criterion
    +
    +
    +
    +[docs] +@register_criterion("RateDistortionLoss") +class RateDistortionLoss(nn.Module): + """Custom rate distortion loss with a Lagrangian parameter.""" + + def __init__(self, lmbda=0.01, metric="mse", return_type="all"): + super().__init__() + if metric == "mse": + self.metric = nn.MSELoss() + elif metric == "ms-ssim": + self.metric = ms_ssim + else: + raise NotImplementedError(f"{metric} is not implemented!") + self.lmbda = lmbda + self.return_type = return_type + +
    +[docs] + def forward(self, output, target): + N, _, H, W = target.size() + out = {} + num_pixels = N * H * W + + out["bpp_loss"] = sum( + (torch.log(likelihoods).sum() / (-math.log(2) * num_pixels)) + for likelihoods in output["likelihoods"].values() + ) + if self.metric == ms_ssim: + out["ms_ssim_loss"] = self.metric(output["x_hat"], target, data_range=1) + distortion = 1 - out["ms_ssim_loss"] + else: + out["mse_loss"] = self.metric(output["x_hat"], target) + distortion = 255**2 * out["mse_loss"] + + out["loss"] = self.lmbda * distortion + out["bpp_loss"] + if self.return_type == "all": + return out + else: + return out[self.return_type]
    +
    + +
    + +
    + + + + + + +
    + +
    +
    +
    + +
    + + + +
    + + +
    +
    + + +
    + + +
    +
    +
    + + + + + +
    +
    + + \ No newline at end of file diff --git a/_modules/compressai/models/base.html b/_modules/compressai/models/base.html index b76e1556..4a6d662c 100644 --- a/_modules/compressai/models/base.html +++ b/_modules/compressai/models/base.html @@ -167,6 +167,7 @@
  • compressai.entropy_models
  • compressai.latent_codecs
  • compressai.layers
  • +
  • compressai.losses
  • compressai.models
  • compressai.ops
  • compressai.transforms
  • @@ -408,7 +409,7 @@

    Source code for compressai.models.base

     
     
    [docs] - def update(self, scale_table=None, force=False): + def update(self, scale_table=None, force=False, update_quantiles: bool = False): """Updates EntropyBottleneck and GaussianConditional CDFs. Needs to be called once after training to be able to later perform the @@ -419,6 +420,7 @@

    Source code for compressai.models.base

                     for initializing the Gaussian distributions
                     (default: 64 logarithmically spaced scales from 0.11 to 256)
                 force (bool): overwrite previous values (default: False)
    +            update_quantiles (bool): fast update quantiles (default: False)
     
             Returns:
                 updated (bool): True if at least one of the modules was updated.
    @@ -428,7 +430,7 @@ 

    Source code for compressai.models.base

             updated = False
             for _, module in self.named_modules():
                 if isinstance(module, EntropyBottleneck):
    -                updated |= module.update(force=force)
    +                updated |= module.update(force=force, update_quantiles=update_quantiles)
                 if isinstance(module, GaussianConditional):
                     updated |= module.update_scale_table(scale_table, force=force)
             return updated
    diff --git a/_modules/compressai/models/google.html b/_modules/compressai/models/google.html index 3882a2e8..6b7cca02 100644 --- a/_modules/compressai/models/google.html +++ b/_modules/compressai/models/google.html @@ -167,6 +167,7 @@
  • compressai.entropy_models
  • compressai.latent_codecs
  • compressai.layers
  • +
  • compressai.losses
  • compressai.models
  • compressai.ops
  • compressai.transforms
  • diff --git a/_modules/compressai/models/pointcloud/hrtzxf2022.html b/_modules/compressai/models/pointcloud/hrtzxf2022.html new file mode 100644 index 00000000..b02baa3b --- /dev/null +++ b/_modules/compressai/models/pointcloud/hrtzxf2022.html @@ -0,0 +1,815 @@ + + + + + + + + + + compressai.models.pointcloud.hrtzxf2022 — CompressAI + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + +
    +
    +
    +
    +
    + + + + +
    +
    + + + + + +
    + + + + + + + + + + + + + +
    + +
    + + + +
    + +
    +
    + +
    +
    + +
    + +
    + +
    + + +
    + +
    + +
    + + + + + + + + + + + + + + + + + + +
    + +
    + +
    +
    + + + +
    +

    + +
    +
    + +
    +
    +
    + + + + +
    + +

    Source code for compressai.models.pointcloud.hrtzxf2022

    +# Copyright (c) 2021-2022, InterDigital Communications, Inc
    +# All rights reserved.
    +
    +# Redistribution and use in source and binary forms, with or without
    +# modification, are permitted (subject to the limitations in the disclaimer
    +# below) provided that the following conditions are met:
    +
    +# * Redistributions of source code must retain the above copyright notice,
    +#   this list of conditions and the following disclaimer.
    +# * Redistributions in binary form must reproduce the above copyright notice,
    +#   this list of conditions and the following disclaimer in the documentation
    +#   and/or other materials provided with the distribution.
    +# * Neither the name of InterDigital Communications, Inc nor the names of its
    +#   contributors may be used to endorse or promote products derived from this
    +#   software without specific prior written permission.
    +
    +# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY
    +# THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
    +# CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
    +# NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
    +# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
    +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
    +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
    +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
    +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
    +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
    +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
    +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    +
    +# Code adapted from https://github.com/yunhe20/D-PCC
    +
    +from __future__ import annotations
    +
    +import numpy as np
    +import torch
    +import torch.nn as nn
    +
    +from compressai.entropy_models import EntropyBottleneck
    +from compressai.latent_codecs import EntropyBottleneckLatentCodec
    +from compressai.layers.pointcloud.hrtzxf2022 import (
    +    DownsampleLayer,
    +    EdgeConv,
    +    RefineLayer,
    +    UpsampleLayer,
    +    UpsampleNumLayer,
    +    nearby_distance_sum,
    +)
    +from compressai.layers.pointcloud.utils import select_xyzs_and_feats
    +from compressai.models import CompressionModel
    +from compressai.registry import register_model
    +
    +__all__ = [
    +    "DensityPreservingReconstructionPccModel",
    +]
    +
    +
    +
    +[docs] +@register_model("hrtzxf2022-pcc-rec") +class DensityPreservingReconstructionPccModel(CompressionModel): + """Density-preserving deep point cloud compression. + + Model introduced by [He2022pcc]_. + + References: + + .. [He2022pcc] `"Density-preserving Deep Point Cloud Compression" + <https://arxiv.org/abs/2204.12684>`_, by Yun He, Xinlin Ren, + Danhang Tang, Yinda Zhang, Xiangyang Xue, and Yanwei Fu, + CVPR 2022. + """ + + def __init__( + self, + downsample_rate=(1 / 3, 1 / 3, 1 / 3), + candidate_upsample_rate=(8, 8, 8), + in_dim=3, + feat_dim=8, + hidden_dim=64, + k=16, + ngroups=1, + sub_point_conv_mode="mlp", + compress_normal=False, + latent_xyzs_codec=None, + **kwargs, + ): + super().__init__() + + self.compress_normal = compress_normal + + self.pre_conv = nn.Sequential( + nn.Conv1d(in_dim, hidden_dim, 1), + nn.GroupNorm(ngroups, hidden_dim), + nn.ReLU(), + nn.Conv1d(hidden_dim, feat_dim, 1), + ) + + self.encoder = Encoder( + downsample_rate, + feat_dim, + hidden_dim, + k, + ngroups, + ) + + self.decoder = Decoder( + downsample_rate, + candidate_upsample_rate, + feat_dim, + hidden_dim, + k, + sub_point_conv_mode, + compress_normal, + ) + + self.latent_codec = nn.ModuleDict( + { + "feat": EntropyBottleneckLatentCodec(channels=feat_dim), + "xyz": XyzsLatentCodec( + feat_dim, hidden_dim, k, ngroups, **(latent_xyzs_codec or {}) + ), + } + ) + + def _prepare_input(self, input): + input_data = [input["pos"]] + if self.compress_normal: + input_data.append(input["normal"]) + input_data = torch.cat(input_data, dim=1).permute(0, 2, 1).contiguous() + + xyzs = input_data[:, :3].contiguous() + gt_normals = input_data[:, 3 : 3 + 3 * self.compress_normal].contiguous() + feats = input_data + + return xyzs, gt_normals, feats + + def forward(self, input): + # xyzs: (b, 3, n) + + xyzs, gt_normals, feats = self._prepare_input(input) + + feats = self.pre_conv(feats) + + gt_xyzs_, gt_dnums_, gt_mdis_, latent_xyzs, latent_feats = self.encoder( + xyzs, feats + ) + + gt_latent_xyzs = latent_xyzs + + # NOTE: Temporarily reshape to (b, c, m, 1) for compatibility. + latent_feats = latent_feats.unsqueeze(-1) + latent_feats_out = self.latent_codec["feat"](latent_feats) + latent_feats_hat = latent_feats_out["y_hat"].squeeze(-1) + + latent_xyzs_out = self.latent_codec["xyz"](latent_xyzs) + latent_xyzs_hat = latent_xyzs_out["y_hat"] + + xyzs_hat_, unums_hat_, mdis_hat_, feats_hat = self.decoder( + latent_xyzs_hat, latent_feats_hat + ) + + # Permute final xyzs_hat back to (b, n, c) + xyzs_hat = xyzs_hat_[-1].permute(0, 2, 1).contiguous() + + return { + "x_hat": xyzs_hat, + "xyz_hat_": xyzs_hat_, + "latent_xyz_hat": latent_xyzs_hat, + "feat_hat": feats_hat, + "upsample_num_hat_": unums_hat_, + "mean_distance_hat_": mdis_hat_, + "gt_xyz_": gt_xyzs_, + "gt_latent_xyz": gt_latent_xyzs, + "gt_normal": gt_normals, + "gt_downsample_num_": gt_dnums_, + "gt_mean_distance_": gt_mdis_, + "likelihoods": { + "latent_feat": latent_feats_out["likelihoods"]["y"], + "latent_xyz": latent_xyzs_out["likelihoods"]["y"], + }, + } + + def compress(self, input): + xyzs, _, feats = self._prepare_input(input) + + feats = self.pre_conv(feats) + + _, _, _, latent_xyzs, latent_feats = self.encoder(xyzs, feats) + + latent_feats = latent_feats.unsqueeze(-1) + latent_feats_out = self.latent_codec["feat"].compress(latent_feats) + + latent_xyzs = latent_xyzs + latent_xyzs_out = self.latent_codec["xyz"].compress(latent_xyzs) + + return { + "strings": [ + latent_feats_out["strings"], + latent_xyzs_out["strings"], + ], + "shape": [ + latent_feats_out["shape"], + latent_xyzs_out["shape"], + ], + } + + def decompress(self, strings, shape): + assert isinstance(strings, list) and len(strings) == 2 + + latent_feats_out = self.latent_codec["feat"].decompress(strings[0], shape[0]) + latent_feats_hat = latent_feats_out["y_hat"].squeeze(-1) + + latent_xyzs_out = self.latent_codec["xyz"].decompress(strings[1], shape[1]) + latent_xyzs_hat = latent_xyzs_out["y_hat"] + + xyzs_hat_, _, _, feats_hat = self.decoder(latent_xyzs_hat, latent_feats_hat) + + # Permute final xyzs_hat back to (b, n, c) + xyzs_hat = xyzs_hat_[-1].permute(0, 2, 1).contiguous() + + return { + "x_hat": xyzs_hat, + "feat_hat": feats_hat, + }
    + + + +class XyzsLatentCodec(nn.Module): + def __init__(self, dim, hidden_dim, k, ngroups, mode="learned", conv_mode="mlp"): + super().__init__() + self.mode = mode + if mode == "learned": + if conv_mode == "edge_conv": + self.analysis = EdgeConv(3, dim, hidden_dim, k) + self.synthesis = EdgeConv(dim, 3, hidden_dim, k) + elif conv_mode == "mlp": + self.analysis = nn.Sequential( + nn.Conv1d(3, hidden_dim, 1), + nn.GroupNorm(ngroups, hidden_dim), + nn.ReLU(inplace=True), + nn.Conv1d(hidden_dim, dim, 1), + ) + self.synthesis = nn.Sequential( + nn.Conv1d(dim, hidden_dim, 1), + nn.GroupNorm(ngroups, hidden_dim), + nn.ReLU(inplace=True), + nn.Conv1d(hidden_dim, 3, 1), + ) + else: + raise ValueError(f"Unknown conv_mode: {conv_mode}") + self.entropy_bottleneck = EntropyBottleneck(dim) + else: + self.placeholder = nn.Parameter(torch.empty(0)) + + def forward(self, latent_xyzs): + if self.mode == "learned": + z = self.analysis(latent_xyzs) + z_hat, z_likelihoods = self.entropy_bottleneck(z) + latent_xyzs_hat = self.synthesis(z_hat) + elif self.mode == "float16": + z_likelihoods = latent_xyzs.new_full(latent_xyzs.shape, 2**-16) + latent_xyzs_hat = latent_xyzs.to(torch.float16).float() + else: + raise ValueError(f"Unknown mode: {self.mode}") + return {"likelihoods": {"y": z_likelihoods}, "y_hat": latent_xyzs_hat} + + def compress(self, latent_xyzs): + if self.mode == "learned": + z = self.analysis(latent_xyzs) + shape = z.shape[2:] + z_strings = self.entropy_bottleneck.compress(z) + z_hat = self.entropy_bottleneck.decompress(z_strings, shape) + latent_xyzs_hat = self.synthesis(z_hat) + elif self.mode == "float16": + z = latent_xyzs + shape = z.shape[2:] + z_hat = latent_xyzs.to(torch.float16) + z_strings = [ + np.ascontiguousarray(x, dtype=">f2").tobytes() + for x in z_hat.cpu().numpy() + ] + latent_xyzs_hat = z_hat.float() + else: + raise ValueError(f"Unknown mode: {self.mode}") + return {"strings": [z_strings], "shape": shape, "y_hat": latent_xyzs_hat} + + def decompress(self, strings, shape): + [z_strings] = strings + if self.mode == "learned": + z_hat = self.entropy_bottleneck.decompress(z_strings, shape) + latent_xyzs_hat = self.synthesis(z_hat) + elif self.mode == "float16": + z_hat = [np.frombuffer(s, dtype=">f2").reshape(shape) for s in z_strings] + z_hat = torch.from_numpy(np.stack(z_hat)).to(self.placeholder.device) + latent_xyzs_hat = z_hat.float() + else: + raise ValueError(f"Unknown mode: {self.mode}") + return {"y_hat": latent_xyzs_hat} + + +class Encoder(nn.Module): + def __init__(self, downsample_rate, dim, hidden_dim, k, ngroups): + super().__init__() + downsample_layers = [ + DownsampleLayer(downsample_rate[i], dim, hidden_dim, k, ngroups) + for i in range(len(downsample_rate)) + ] + self.downsample_layers = nn.ModuleList(downsample_layers) + + def forward(self, xyzs, feats): + # xyzs: (b, 3, n) + # feats: (b, c, n) + + gt_xyzs_ = [] + gt_dnums_ = [] + gt_mdis_ = [] + + for downsample_layer in self.downsample_layers: + gt_xyzs_.append(xyzs) + xyzs, feats, downsample_num, mean_distance = downsample_layer(xyzs, feats) + gt_dnums_.append(downsample_num) + gt_mdis_.append(mean_distance) + + latent_xyzs = xyzs + latent_feats = feats + + return gt_xyzs_, gt_dnums_, gt_mdis_, latent_xyzs, latent_feats + + +class Decoder(nn.Module): + def __init__( + self, + downsample_rate, + candidate_upsample_rate, + dim, + hidden_dim, + k, + sub_point_conv_mode, + compress_normal, + ): + super().__init__() + + self.k = k + self.compress_normal = compress_normal + self.num_layers = len(downsample_rate) + self.downsample_rate = downsample_rate + + self.upsample_layers = nn.ModuleList( + [ + UpsampleLayer( + dim, + hidden_dim, + k, + sub_point_conv_mode, + candidate_upsample_rate[i], + ) + for i in range(self.num_layers) + ] + ) + + self.upsample_num_layers = nn.ModuleList( + [ + UpsampleNumLayer( + dim, + hidden_dim, + candidate_upsample_rate[i], + ) + for i in range(self.num_layers) + ] + ) + + self.refine_layers = nn.ModuleList( + [ + RefineLayer( + dim, + hidden_dim, + k, + sub_point_conv_mode, + compress_normal and i == self.num_layers - 1, + ) + for i in range(self.num_layers) + ] + ) + + def forward(self, xyzs, feats): + # xyzs: (b, 3, n) + # feats: (b, c, n) + + latent_xyzs = xyzs.clone() + + xyzs_hat_ = [] + unums_hat_ = [] + + for i, (upsample_nn, upsample_num_nn, refine_nn) in enumerate( + zip(self.upsample_layers, self.upsample_num_layers, self.refine_layers) + ): + # candidate_xyzs: (b, 3, n u) + # candidate_feats: (b, c, n u) + # upsample_num: (b, n) + # xyzs: (b, 3, m) [after upsample and select] + # feats: (b, c, m) [after upsample and select] + + # For each point within the current set of "n" points, + # upsample a fixed number "u" of candidate points. + # The resulting candidate points have the shape (n, u). + candidate_xyzs, candidate_feats = upsample_nn(xyzs, feats) + + # Determine local point cloud density near each upsampled group: + upsample_num = upsample_num_nn(feats) + + # Subsample each point group to match the desired local density. + # That is, from the i-th point group, select upsample_num[..., i] points. + # Then, collect all the points so the resulting point set has shape (m_i,). + # + # If the batch size is >1, then the "m_i"s may be different. + # In that case, resample each point set within the batch + # until they all have the same shape (m,). + # This can be done by either selecting a subset or + # duplicating points as necessary. + # + # Since one of the goals is to reduce local point cloud + # density in certain regions, we are happy with throwing + # away distinct points, and then duplicating the remaining + # points until they can fit within the desired tensor shape. + + # Select subset of points to match predicted local point cloud densities: + xyzs, feats = select_xyzs_and_feats( + candidate_xyzs, + candidate_feats, + upsample_num, + upsample_rate=1 / self.downsample_rate[self.num_layers - i - 1], + ) + + # Refine upsampled points. + xyzs, feats = refine_nn(xyzs, feats) + + xyzs_hat_.append(xyzs) + unums_hat_.append(upsample_num) + + # Compute mean distance between centroids and the upsampled points. + mdis_hat_ = self.get_pred_mdis([latent_xyzs, *xyzs_hat_], unums_hat_) + + return xyzs_hat_, unums_hat_, mdis_hat_, feats + + def get_pred_mdis(self, xyzs_hat_, unums_hat_): + mdis_hat_ = [] + + for prev_xyzs, curr_xyzs, curr_unums in zip( + xyzs_hat_[:-1], xyzs_hat_[1:], unums_hat_ + ): + # Compute mean distance for each point in "prev" to upsampled "curr". + distance, _, _, _ = nearby_distance_sum(prev_xyzs, curr_xyzs, self.k) + curr_mdis = distance / curr_unums + mdis_hat_.append(curr_mdis) + + return mdis_hat_ +
    + +
    + + + + + + +
    + +
    +
    +
    + +
    + + + +
    + + +
    +
    + + +
    + + +
    +
    +
    + + + + + +
    +
    + + \ No newline at end of file diff --git a/_modules/compressai/models/pointcloud/sfu_pointnet.html b/_modules/compressai/models/pointcloud/sfu_pointnet.html new file mode 100644 index 00000000..7dcdb9b1 --- /dev/null +++ b/_modules/compressai/models/pointcloud/sfu_pointnet.html @@ -0,0 +1,495 @@ + + + + + + + + + + compressai.models.pointcloud.sfu_pointnet — CompressAI + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + +
    +
    +
    +
    +
    + + + + +
    +
    + + + + + +
    + + + + + + + + + + + + + +
    + +
    + + + +
    + +
    +
    + +
    +
    + +
    + +
    + +
    + + +
    + +
    + +
    + + + + + + + + + + + + + + + + + + +
    + +
    + +
    +
    + + + +
    +

    + +
    +
    + +
    +
    +
    + + + + +
    + +

    Source code for compressai.models.pointcloud.sfu_pointnet

    +# Copyright (c) 2021-2022, InterDigital Communications, Inc
    +# All rights reserved.
    +
    +# Redistribution and use in source and binary forms, with or without
    +# modification, are permitted (subject to the limitations in the disclaimer
    +# below) provided that the following conditions are met:
    +
    +# * Redistributions of source code must retain the above copyright notice,
    +#   this list of conditions and the following disclaimer.
    +# * Redistributions in binary form must reproduce the above copyright notice,
    +#   this list of conditions and the following disclaimer in the documentation
    +#   and/or other materials provided with the distribution.
    +# * Neither the name of InterDigital Communications, Inc nor the names of its
    +#   contributors may be used to endorse or promote products derived from this
    +#   software without specific prior written permission.
    +
    +# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY
    +# THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
    +# CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
    +# NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
    +# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
    +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
    +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
    +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
    +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
    +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
    +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
    +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    +
    +from __future__ import annotations
    +
    +from compressai.latent_codecs import LatentCodec
    +from compressai.latent_codecs.entropy_bottleneck import EntropyBottleneckLatentCodec
    +from compressai.layers.pointcloud.pointnet import (
    +    pointnet_g_a_simple,
    +    pointnet_g_s_simple,
    +)
    +from compressai.models import CompressionModel
    +from compressai.registry import register_model
    +
    +__all__ = [
    +    "PointNetReconstructionPccModel",
    +]
    +
    +
    +
    +[docs] +@register_model("sfu2023-pcc-rec-pointnet") +class PointNetReconstructionPccModel(CompressionModel): + """PointNet-based PCC reconstruction model. + + Model based on PointNet [Qi2017PointNet]_, modified for compression + by [Yan2019]_, with layer configurations and other modifications as + used in [Ulhaq2023]_. + + References: + + .. [Qi2017PointNet] `"PointNet: Deep Learning on Point Sets for + 3D Classification and Segmentation" + <https://arxiv.org/abs/1612.00593>`_, by Charles R. Qi, + Hao Su, Kaichun Mo, and Leonidas J. Guibas, CVPR 2017. + + .. [Yan2019] `"Deep AutoEncoder-based Lossy Geometry Compression + for Point Clouds" <https://arxiv.org/abs/1905.03691>`_, + by Wei Yan, Yiting Shao, Shan Liu, Thomas H Li, Zhu Li, + and Ge Li, 2019. + + .. [Ulhaq2023] `"Learned Point Cloud Compression for + Classification" <https://arxiv.org/abs/2308.05959>`_, + by Mateen Ulhaq and Ivan V. Bajić, MMSP 2023. + """ + + latent_codec: LatentCodec + + def __init__( + self, + num_points=1024, + num_channels={ # noqa: B006 + "g_a": [3, 64, 64, 64, 128, 1024], + "g_s": [1024, 256, 512, 1024 * 3], + }, + groups={ # noqa: B006 + "g_a": [1, 1, 1, 1, 1], + }, + ): + super().__init__() + + assert num_channels["g_a"][-1] == num_channels["g_s"][0] + assert num_channels["g_s"][-1] == num_points * 3 + + self.g_a = pointnet_g_a_simple(num_channels["g_a"], groups["g_a"]) + + self.g_s = pointnet_g_s_simple(num_channels["g_s"]) + + self.latent_codec = EntropyBottleneckLatentCodec( + channels=num_channels["g_a"][-1], + tail_mass=1e-4, + ) + + def forward(self, input): + x = input["pos"] + x_t = x.transpose(-2, -1) + y = self.g_a(x_t) + y_out = self.latent_codec(y) + y_hat = y_out["y_hat"] + x_hat = self.g_s(y_hat) + assert x_hat.shape == x.shape + + return { + "x_hat": x_hat, + "likelihoods": { + "y": y_out["likelihoods"]["y"], + }, + # Additional outputs: + "y": y, + "y_hat": y_hat, + "debug_outputs": { + "y_hat": y_hat, + }, + } + + def compress(self, input): + x = input["pos"] + x_t = x.transpose(-2, -1) + y = self.g_a(x_t) + y_out = self.latent_codec.compress(y) + [y_strings] = y_out["strings"] + return {"strings": [y_strings], "shape": (1,)} + + def decompress(self, strings, shape): + assert isinstance(strings, list) and len(strings) == 1 + [y_strings] = strings + y_hat = self.latent_codec.decompress([y_strings], shape) + x_hat = self.g_s(y_hat) + return {"x_hat": x_hat}
    + +
    + +
    + + + + + + +
    + +
    +
    +
    + +
    + + + +
    + + +
    +
    + + +
    + + +
    +
    +
    + + + + + +
    +
    + + \ No newline at end of file diff --git a/_modules/compressai/models/pointcloud/sfu_pointnet2.html b/_modules/compressai/models/pointcloud/sfu_pointnet2.html new file mode 100644 index 00000000..1abb7670 --- /dev/null +++ b/_modules/compressai/models/pointcloud/sfu_pointnet2.html @@ -0,0 +1,695 @@ + + + + + + + + + + compressai.models.pointcloud.sfu_pointnet2 — CompressAI + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + +
    +
    +
    +
    +
    + + + + +
    +
    + + + + + +
    + + + + + + + + + + + + + +
    + +
    + + + +
    + +
    +
    + +
    +
    + +
    + +
    + +
    + + +
    + +
    + +
    + + + + + + + + + + + + + + + + + + +
    + +
    + +
    +
    + + + +
    +

    + +
    +
    + +
    +
    +
    + + + + +
    + +

    Source code for compressai.models.pointcloud.sfu_pointnet2

    +# Copyright (c) 2021-2022, InterDigital Communications, Inc
    +# All rights reserved.
    +
    +# Redistribution and use in source and binary forms, with or without
    +# modification, are permitted (subject to the limitations in the disclaimer
    +# below) provided that the following conditions are met:
    +
    +# * Redistributions of source code must retain the above copyright notice,
    +#   this list of conditions and the following disclaimer.
    +# * Redistributions in binary form must reproduce the above copyright notice,
    +#   this list of conditions and the following disclaimer in the documentation
    +#   and/or other materials provided with the distribution.
    +# * Neither the name of InterDigital Communications, Inc nor the names of its
    +#   contributors may be used to endorse or promote products derived from this
    +#   software without specific prior written permission.
    +
    +# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY
    +# THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
    +# CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
    +# NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
    +# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
    +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
    +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
    +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
    +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
    +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
    +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
    +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    +
    +from __future__ import annotations
    +
    +import torch
    +import torch.nn as nn
    +
    +from compressai.latent_codecs import EntropyBottleneckLatentCodec
    +from compressai.layers.basic import Gain, Interleave, Reshape, Transpose
    +from compressai.layers.pointcloud.pointnet import GAIN
    +from compressai.layers.pointcloud.pointnet2 import PointNetSetAbstraction
    +from compressai.layers.pointcloud.pointnet2_sfu import UpsampleBlock
    +from compressai.models import CompressionModel
    +from compressai.registry import register_model
    +
    +__all__ = [
    +    "PointNet2SsgReconstructionPccModel",
    +]
    +
    +
    +
    +[docs] +@register_model("sfu2024-pcc-rec-pointnet2-ssg") +class PointNet2SsgReconstructionPccModel(CompressionModel): + """PointNet++-based PCC reconstruction model. + + Model based on PointNet++ [Qi2017PointNetPlusPlus]_, and modified + for compression by [Ulhaq2024]_. + Uses single-scale grouping (SSG) for point set abstraction. + + References: + + .. [Qi2017PointNetPlusPlus] `"PointNet++: Deep Hierarchical + Feature Learning on Point Sets in a Metric Space" + <https://arxiv.org/abs/1706.02413>`_, by Charles R. Qi, + Li Yi, Hao Su, and Leonidas J. Guibas, NIPS 2017. + + .. [Ulhaq2024] `"Scalable Human-Machine Point Cloud Compression" + <TODO>`_, + by Mateen Ulhaq and Ivan V. Bajić, PCS 2024. + """ + + def __init__( + self, + num_points=1024, + num_classes=40, + D=(0, 128, 192, 256), + P=(1024, 256, 64, 1), + S=(None, 4, 4, 64), + R=(None, 0.2, 0.4, None), + E=(3, 64, 32, 16, 0), + M=(0, 0, 64, 64), + normal_channel=False, + ): + """ + Args: + num_points: Number of input points. [unused] + num_classes: Number of object classes. [unused] + D: Number of input feature channels. + P: Number of output points. + S: Number of samples per centroid. + R: Radius of the ball to query points within. + E: Number of output feature channels after each upsample. + M: Number of latent channels for the bottleneck. + normal_channel: Whether the input includes normals. + """ + super().__init__() + + self.num_points = num_points + self.num_classes = num_classes + self.D = D + self.P = P + self.S = S + self.R = R + self.E = E + self.M = M + self.normal_channel = bool(normal_channel) + + # Original PointNet++ architecture: + # D = [3 * self.normal_channel, 128, 256, 1024] + # P = [None, 512, 128, 1] + # S = [None, 32, 64, 128] + # R = [None, 0.2, 0.4, None] + + # NOTE: P[0] is only used to determine the number of output points. + # assert P[0] == num_points + + assert P[0] == P[1] * S[1] + assert P[1] == P[2] * S[2] + assert P[2] == P[3] * S[3] + + self.levels = 4 + + self.down = nn.ModuleDict( + { + "_1": PointNetSetAbstraction( + npoint=P[1], + radius=R[1], + nsample=S[1], + in_channel=D[0] + 3, + mlp=[D[1] // 2, D[1] // 2, D[1]], + group_all=False, + ), + "_2": PointNetSetAbstraction( + npoint=P[2], + radius=R[2], + nsample=S[2], + in_channel=D[1] + 3, + mlp=[D[1], D[1], D[2]], + group_all=False, + ), + "_3": PointNetSetAbstraction( + npoint=None, + radius=None, + nsample=None, + in_channel=D[2] + 3, + mlp=[D[2], D[3], D[3]], + group_all=True, + ), + } + ) + + i_final = self.levels - 1 + groups_h_final = 1 if D[i_final] * M[i_final] <= 2**16 else 4 + + self.h_a = nn.ModuleDict( + { + **{ + f"_{i}": nn.Sequential( + Reshape((D[i] + 3, P[i + 1] * S[i + 1])), + nn.Conv1d(D[i] + 3, M[i], 1), + Gain((M[i], 1), factor=GAIN), + ) + for i in range(self.levels - 1) + if M[i] > 0 + }, + f"_{i_final}": nn.Sequential( + Reshape((D[i_final], 1)), + nn.Conv1d(D[i_final], M[i_final], 1, groups=groups_h_final), + Interleave(groups=groups_h_final), + Gain((M[i_final], 1), factor=GAIN), + ), + } + ) + + self.h_s = nn.ModuleDict( + { + **{ + f"_{i}": nn.Sequential( + Gain((M[i], 1), factor=1 / GAIN), + nn.Conv1d(M[i], D[i] + 3, 1), + ) + for i in range(self.levels - 1) + if M[i] > 0 + }, + f"_{i_final}": nn.Sequential( + Gain((M[i_final], 1), factor=1 / GAIN), + nn.Conv1d(M[i_final], D[i_final], 1, groups=groups_h_final), + Interleave(groups=groups_h_final), + ), + } + ) + + self.up = nn.ModuleDict( + { + "_0": nn.Sequential( + nn.Conv1d(E[1] + D[0] + 3 * bool(M[0]), E[1], 1), + # nn.BatchNorm1d(E[1]), + nn.ReLU(inplace=True), + nn.Conv1d(E[1], E[0], 1), + Reshape((E[0], P[0])), + Transpose(-2, -1), + ), + "_1": UpsampleBlock(D, E, M, P, S, i=1, extra_in_ch=3, groups=(1, 4)), + "_2": UpsampleBlock(D, E, M, P, S, i=2, extra_in_ch=3, groups=(1, 4)), + "_3": UpsampleBlock(D, E, M, P, S, i=3, extra_in_ch=0, groups=(1, 4)), + } + ) + + self.latent_codec = nn.ModuleDict( + { + f"_{i}": EntropyBottleneckLatentCodec(channels=M[i], tail_mass=1e-4) + for i in range(self.levels) + if M[i] > 0 + } + ) + + def forward(self, input): + xyz, norm = self._get_inputs(input) + y_out_, u_, uu_ = self._compress(xyz, norm, mode="forward") + x_hat, y_hat_, v_ = self._decompress(y_out_, mode="forward") + + return { + "x_hat": x_hat, + "likelihoods": { + f"y_{i}": y_out_[i]["likelihoods"]["y"] + for i in range(self.levels) + if "likelihoods" in y_out_[i] + }, + # Additional outputs: + "debug_outputs": { + **{f"u_{i}": v for i, v in u_.items() if v is not None}, + **{f"uu_{i}": v for i, v in uu_.items()}, + **{f"y_hat_{i}": v for i, v in y_hat_.items()}, + **{f"v_{i}": v for i, v in v_.items() if v.numel() > 0}, + }, + } + + def compress(self, input): + xyz, norm = self._get_inputs(input) + y_out_, _, _ = self._compress(xyz, norm, mode="compress") + + return { + # "strings": {f"y_{i}": y_out_[i]["strings"] for i in range(self.levels)}, + # Flatten nested structure into list[list[str]]: + "strings": [ + ss for level in range(self.levels) for ss in y_out_[level]["strings"] + ], + "shape": {f"y_{i}": y_out_[i]["shape"] for i in range(self.levels)}, + } + + def decompress(self, strings, shape): + y_inputs_ = { + i: { + "strings": [strings[i]], + "shape": shape[f"y_{i}"], + } + for i in range(self.levels) + } + + x_hat, _, _ = self._decompress(y_inputs_, mode="decompress") + + return { + "x_hat": x_hat, + } + + def _get_inputs(self, input): + points = input["pos"].transpose(-2, -1) + if self.normal_channel: + xyz = points[:, :3, :] + norm = points[:, 3:, :] + else: + xyz = points + norm = None + return xyz, norm + + def _compress(self, xyz, norm, *, mode): + lc_func = {"forward": lambda lc: lc, "compress": lambda lc: lc.compress}[mode] + + B, _, _ = xyz.shape + + xyz_ = {0: xyz} + u_ = {0: norm} + uu_ = {} + y_ = {} + y_out_ = {} + + for i in range(1, self.levels): + down_out_i = self.down[f"_{i}"](xyz_[i - 1], u_[i - 1]) + xyz_[i] = down_out_i["new_xyz"] + u_[i] = down_out_i["new_features"] + uu_[i - 1] = down_out_i["grouped_features"] + + uu_[self.levels - 1] = u_[self.levels - 1][:, :, None, :] + + for i in reversed(range(0, self.levels)): + if self.M[i] == 0: + y_out_[i] = {"strings": [[b""] * B], "shape": ()} + continue + + y_[i] = self.h_a[f"_{i}"](uu_[i]) + # NOTE: Reshape 1D -> 2D since latent codecs expect 2D inputs. + y_out_[i] = lc_func(self.latent_codec[f"_{i}"])(y_[i][..., None]) + + return y_out_, u_, uu_ + + def _decompress(self, y_inputs_, *, mode): + y_hat_ = {} + y_out_ = {} + uu_hat_ = {} + v_ = {} + + for i in reversed(range(0, self.levels)): + if self.M[i] == 0: + continue + if mode == "forward": + y_out_[i] = y_inputs_[i] + elif mode == "decompress": + y_out_[i] = self.latent_codec[f"_{i}"].decompress( + y_inputs_[i]["strings"], shape=y_inputs_[i]["shape"] + ) + # NOTE: Reshape 2D -> 1D since latent codecs return 2D outputs. + y_hat_[i] = y_out_[i]["y_hat"].squeeze(-1) + uu_hat_[i] = self.h_s[f"_{i}"](y_hat_[i]) + + B, _, *tail = uu_hat_[self.levels - 1].shape + v_[self.levels] = uu_hat_[self.levels - 1].new_zeros((B, 0, *tail)) + + for i in reversed(range(0, self.levels)): + v_[i] = self.up[f"_{i}"]( + v_[i + 1] + if self.M[i] == 0 + else torch.cat([v_[i + 1], uu_hat_[i]], dim=1) + ) + + x_hat = v_[0] + + return x_hat, y_hat_, v_
    + +
    + +
    + + + + + + +
    + +
    +
    +
    + +
    + + + +
    + + +
    +
    + + +
    + + +
    +
    +
    + + + + + +
    +
    + + \ No newline at end of file diff --git a/_modules/compressai/models/sensetime.html b/_modules/compressai/models/sensetime.html index 552719a3..cc57d030 100644 --- a/_modules/compressai/models/sensetime.html +++ b/_modules/compressai/models/sensetime.html @@ -167,6 +167,7 @@
  • compressai.entropy_models
  • compressai.latent_codecs
  • compressai.layers
  • +
  • compressai.losses
  • compressai.models
  • compressai.ops
  • compressai.transforms
  • diff --git a/_modules/compressai/models/video/google.html b/_modules/compressai/models/video/google.html index fc142c62..a24dae1c 100644 --- a/_modules/compressai/models/video/google.html +++ b/_modules/compressai/models/video/google.html @@ -167,6 +167,7 @@
  • compressai.entropy_models
  • compressai.latent_codecs
  • compressai.layers
  • +
  • compressai.losses
  • compressai.models
  • compressai.ops
  • compressai.transforms
  • diff --git a/_modules/compressai/models/waseda.html b/_modules/compressai/models/waseda.html index 054c831e..380f5246 100644 --- a/_modules/compressai/models/waseda.html +++ b/_modules/compressai/models/waseda.html @@ -167,6 +167,7 @@
  • compressai.entropy_models
  • compressai.latent_codecs
  • compressai.layers
  • +
  • compressai.losses
  • compressai.models
  • compressai.ops
  • compressai.transforms
  • diff --git a/_modules/compressai/ops/bound_ops.html b/_modules/compressai/ops/bound_ops.html index 73d2db2e..f02b6fb0 100644 --- a/_modules/compressai/ops/bound_ops.html +++ b/_modules/compressai/ops/bound_ops.html @@ -167,6 +167,7 @@
  • compressai.entropy_models
  • compressai.latent_codecs
  • compressai.layers
  • +
  • compressai.losses
  • compressai.models
  • compressai.ops
  • compressai.transforms
  • diff --git a/_modules/compressai/ops/ops.html b/_modules/compressai/ops/ops.html index a8a4508a..ec34a43f 100644 --- a/_modules/compressai/ops/ops.html +++ b/_modules/compressai/ops/ops.html @@ -167,6 +167,7 @@
  • compressai.entropy_models
  • compressai.latent_codecs
  • compressai.layers
  • +
  • compressai.losses
  • compressai.models
  • compressai.ops
  • compressai.transforms
  • diff --git a/_modules/compressai/ops/parametrizers.html b/_modules/compressai/ops/parametrizers.html index 7fca8567..8c60d29e 100644 --- a/_modules/compressai/ops/parametrizers.html +++ b/_modules/compressai/ops/parametrizers.html @@ -167,6 +167,7 @@
  • compressai.entropy_models
  • compressai.latent_codecs
  • compressai.layers
  • +
  • compressai.losses
  • compressai.models
  • compressai.ops
  • compressai.transforms
  • diff --git a/_modules/compressai/transforms/functional.html b/_modules/compressai/transforms/functional.html index 6d0b03fc..566f67b8 100644 --- a/_modules/compressai/transforms/functional.html +++ b/_modules/compressai/transforms/functional.html @@ -167,6 +167,7 @@
  • compressai.entropy_models
  • compressai.latent_codecs
  • compressai.layers
  • +
  • compressai.losses
  • compressai.models
  • compressai.ops
  • compressai.transforms
  • diff --git a/_modules/compressai/transforms/point/generate_position_normals.html b/_modules/compressai/transforms/point/generate_position_normals.html new file mode 100644 index 00000000..4f849491 --- /dev/null +++ b/_modules/compressai/transforms/point/generate_position_normals.html @@ -0,0 +1,445 @@ + + + + + + + + + + compressai.transforms.point.generate_position_normals — CompressAI + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + +
    +
    +
    +
    +
    + + + + +
    +
    + + + + + +
    + + + + + + + + + + + + + +
    + +
    + + + +
    + +
    +
    + +
    +
    + +
    + +
    + +
    + + +
    + +
    + +
    + + + + + + + + + + + + + + + + + + +
    + +
    + +
    +
    + + + +
    +

    + +
    +
    + +
    +
    +
    + + + + +
    + +

    Source code for compressai.transforms.point.generate_position_normals

    +# Copyright (c) 2021-2022, InterDigital Communications, Inc
    +# All rights reserved.
    +
    +# Redistribution and use in source and binary forms, with or without
    +# modification, are permitted (subject to the limitations in the disclaimer
    +# below) provided that the following conditions are met:
    +
    +# * Redistributions of source code must retain the above copyright notice,
    +#   this list of conditions and the following disclaimer.
    +# * Redistributions in binary form must reproduce the above copyright notice,
    +#   this list of conditions and the following disclaimer in the documentation
    +#   and/or other materials provided with the distribution.
    +# * Neither the name of InterDigital Communications, Inc nor the names of its
    +#   contributors may be used to endorse or promote products derived from this
    +#   software without specific prior written permission.
    +
    +# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY
    +# THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
    +# CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
    +# NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
    +# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
    +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
    +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
    +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
    +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
    +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
    +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
    +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    +
    +from contextlib import suppress
    +
    +import torch
    +
    +from torch_geometric.data import Data
    +from torch_geometric.data.datapipes import functional_transform
    +from torch_geometric.transforms import BaseTransform
    +
    +from compressai.registry import register_transform
    +
    +
    +
    +[docs] +@functional_transform("generate_position_normals") +@register_transform("GeneratePositionNormals") +class GeneratePositionNormals(BaseTransform): + r"""Generates normals from node positions + (functional name: :obj:`generate_position_normals`). + """ + + def __init__(self, *, method="any", **kwargs): + self.method = method + self.kwargs = kwargs + + def __call__(self, data: Data) -> Data: + assert data.pos.ndim == 2 and data.pos.shape[1] == 3 + + if self.method == "open3d": + import open3d as o3d + + pcd = o3d.geometry.PointCloud() + pcd.points = o3d.utility.Vector3dVector(data.pos.cpu().numpy()) + pcd.estimate_normals(search_param=o3d.geometry.KDTreeSearchParamKNN()) + pcd.normalize_normals() + data.norm = torch.tensor( + pcd.normals, dtype=torch.float32, device=data.pos.device + ) + + return data + + if self.method == "pytorch3d": + import pytorch3d.ops + + data.norm = pytorch3d.ops.estimate_pointcloud_normals( + data.pos.unsqueeze(0), **self.kwargs + ).squeeze(0) + + return data + + if self.method == "any": + for self.method in ["open3d", "pytorch3d"]: + with suppress(ImportError): + return self(data) + raise RuntimeError("Please install open3d / pytorch3d to estimate normals.") + + raise ValueError(f"Unknown method: {self.method}")
    + +
    + +
    + + + + + + +
    + +
    +
    +
    + +
    + + + +
    + + +
    +
    + + +
    + + +
    +
    +
    + + + + + +
    +
    + + \ No newline at end of file diff --git a/_modules/compressai/transforms/point/normalize_scale_v2.html b/_modules/compressai/transforms/point/normalize_scale_v2.html new file mode 100644 index 00000000..d84c600b --- /dev/null +++ b/_modules/compressai/transforms/point/normalize_scale_v2.html @@ -0,0 +1,422 @@ + + + + + + + + + + compressai.transforms.point.normalize_scale_v2 — CompressAI + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + +
    +
    +
    +
    +
    + + + + +
    +
    + + + + + +
    + + + + + + + + + + + + + +
    + +
    + + + +
    + +
    +
    + +
    +
    + +
    + +
    + +
    + + +
    + +
    + +
    + + + + + + + + + + + + + + + + + + +
    + +
    + +
    +
    + + + +
    +

    + +
    +
    + +
    +
    +
    + + + + +
    + +

    Source code for compressai.transforms.point.normalize_scale_v2

    +# Copyright (c) 2021-2022, InterDigital Communications, Inc
    +# All rights reserved.
    +
    +# Redistribution and use in source and binary forms, with or without
    +# modification, are permitted (subject to the limitations in the disclaimer
    +# below) provided that the following conditions are met:
    +
    +# * Redistributions of source code must retain the above copyright notice,
    +#   this list of conditions and the following disclaimer.
    +# * Redistributions in binary form must reproduce the above copyright notice,
    +#   this list of conditions and the following disclaimer in the documentation
    +#   and/or other materials provided with the distribution.
    +# * Neither the name of InterDigital Communications, Inc nor the names of its
    +#   contributors may be used to endorse or promote products derived from this
    +#   software without specific prior written permission.
    +
    +# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY
    +# THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
    +# CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
    +# NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
    +# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
    +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
    +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
    +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
    +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
    +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
    +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
    +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    +
    +import torch
    +
    +from torch_geometric.data import Data
    +from torch_geometric.data.datapipes import functional_transform
    +from torch_geometric.transforms import BaseTransform, Center
    +
    +from compressai.registry import register_transform
    +
    +
    +
    +[docs] +@functional_transform("normalize_scale_v2") +@register_transform("NormalizeScaleV2") +class NormalizeScaleV2(BaseTransform): + r"""Centers and normalizes node positions + (functional name: :obj:`normalize_scale_v2`). + """ + + def __init__(self, *, center=True, scale_method="linf"): + self.scale_method = scale_method + self.center = Center() if center else lambda x: x + + def __call__(self, data: Data) -> Data: + data = self.center(data) + data.pos = data.pos / self._compute_scale(data) + return data + + def _compute_scale(self, data: Data) -> torch.Tensor: + if self.scale_method == "l2": + return (data.pos**2).sum(axis=-1).sqrt().max() + if self.scale_method == "linf": + return data.pos.abs().max() + raise ValueError(f"Unknown scale_method: {self.scale_method}")
    + +
    + +
    + + + + + + +
    + +
    +
    +
    + +
    + + + +
    + + +
    +
    + + +
    + + +
    +
    +
    + + + + + +
    +
    + + \ No newline at end of file diff --git a/_modules/compressai/transforms/point/random_permutation.html b/_modules/compressai/transforms/point/random_permutation.html new file mode 100644 index 00000000..ff85fcda --- /dev/null +++ b/_modules/compressai/transforms/point/random_permutation.html @@ -0,0 +1,413 @@ + + + + + + + + + + compressai.transforms.point.random_permutation — CompressAI + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + +
    +
    +
    +
    +
    + + + + +
    +
    + + + + + +
    + + + + + + + + + + + + + +
    + +
    + + + +
    + +
    +
    + +
    +
    + +
    + +
    + +
    + + +
    + +
    + +
    + + + + + + + + + + + + + + + + + + +
    + +
    + +
    +
    + + + +
    +

    + +
    +
    + +
    +
    +
    + + + + +
    + +

    Source code for compressai.transforms.point.random_permutation

    +# Copyright (c) 2021-2022, InterDigital Communications, Inc
    +# All rights reserved.
    +
    +# Redistribution and use in source and binary forms, with or without
    +# modification, are permitted (subject to the limitations in the disclaimer
    +# below) provided that the following conditions are met:
    +
    +# * Redistributions of source code must retain the above copyright notice,
    +#   this list of conditions and the following disclaimer.
    +# * Redistributions in binary form must reproduce the above copyright notice,
    +#   this list of conditions and the following disclaimer in the documentation
    +#   and/or other materials provided with the distribution.
    +# * Neither the name of InterDigital Communications, Inc nor the names of its
    +#   contributors may be used to endorse or promote products derived from this
    +#   software without specific prior written permission.
    +
    +# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY
    +# THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
    +# CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
    +# NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
    +# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
    +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
    +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
    +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
    +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
    +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
    +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
    +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    +
    +import torch
    +
    +from torch_geometric.data import Data
    +from torch_geometric.data.datapipes import functional_transform
    +from torch_geometric.transforms import BaseTransform
    +
    +from compressai.registry import register_transform
    +
    +
    +
    +[docs] +@functional_transform("random_permutation") +@register_transform("RandomPermutation") +class RandomPermutation(BaseTransform): + r"""Randomly permutes points and associated attributes + (functional name: :obj:`random_permutation`). + """ + + def __init__(self, *, attrs=("pos",)): + self.attrs = attrs + + def __call__(self, data: Data) -> Data: + perm = torch.randperm(data.pos.shape[0]) + return Data(**{k: v[perm] if k in self.attrs else v for k, v in data.items()})
    + +
    + +
    + + + + + + +
    + +
    +
    +
    + +
    + + + +
    + + +
    +
    + + +
    + + +
    +
    +
    + + + + + +
    +
    + + \ No newline at end of file diff --git a/_modules/compressai/transforms/point/random_rotate_full.html b/_modules/compressai/transforms/point/random_rotate_full.html new file mode 100644 index 00000000..3c32ba6b --- /dev/null +++ b/_modules/compressai/transforms/point/random_rotate_full.html @@ -0,0 +1,423 @@ + + + + + + + + + + compressai.transforms.point.random_rotate_full — CompressAI + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + +
    +
    +
    +
    +
    + + + + +
    +
    + + + + + +
    + + + + + + + + + + + + + +
    + +
    + + + +
    + +
    +
    + +
    +
    + +
    + +
    + +
    + + +
    + +
    + +
    + + + + + + + + + + + + + + + + + + +
    + +
    + +
    +
    + + + +
    +

    + +
    +
    + +
    +
    +
    + + + + +
    + +

    Source code for compressai.transforms.point.random_rotate_full

    +# Copyright (c) 2021-2022, InterDigital Communications, Inc
    +# All rights reserved.
    +
    +# Redistribution and use in source and binary forms, with or without
    +# modification, are permitted (subject to the limitations in the disclaimer
    +# below) provided that the following conditions are met:
    +
    +# * Redistributions of source code must retain the above copyright notice,
    +#   this list of conditions and the following disclaimer.
    +# * Redistributions in binary form must reproduce the above copyright notice,
    +#   this list of conditions and the following disclaimer in the documentation
    +#   and/or other materials provided with the distribution.
    +# * Neither the name of InterDigital Communications, Inc nor the names of its
    +#   contributors may be used to endorse or promote products derived from this
    +#   software without specific prior written permission.
    +
    +# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY
    +# THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
    +# CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
    +# NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
    +# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
    +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
    +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
    +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
    +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
    +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
    +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
    +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    +
    +import torch
    +
    +from torch_geometric.data import Data
    +from torch_geometric.data.datapipes import functional_transform
    +from torch_geometric.transforms import BaseTransform
    +
    +from compressai.registry import register_transform
    +
    +
    +
    +[docs] +@functional_transform("random_rotate_full") +@register_transform("RandomRotateFull") +class RandomRotateFull(BaseTransform): + r"""Randomly rotates node positions around the origin + (functional name: :obj:`random_rotate_full`). + """ + + def __call__(self, data: Data) -> Data: + _, ndim = data.pos.shape + rot = random_rotation_matrix(1, ndim).to(data.pos.device).squeeze(0) + data.pos = data.pos @ rot.T + return data
    + + + +# See https://math.stackexchange.com/questions/442418/random-generation-of-rotation-matrices/4832876#4832876 +def random_rotation_matrix(batch_size: int, ndim=3, generator=None) -> torch.Tensor: + z = torch.randn((batch_size, ndim, ndim), generator=generator) + q, r = torch.linalg.qr(z) + sign = 2 * (r.diagonal(dim1=-2, dim2=-1) >= 0) - 1 + rot = q + rot *= sign[..., None, :] + rot[:, 0, :] *= torch.linalg.det(rot)[..., None] + return rot +
    + +
    + + + + + + +
    + +
    +
    +
    + +
    + + + +
    + + +
    +
    + + +
    + + +
    +
    +
    + + + + + +
    +
    + + \ No newline at end of file diff --git a/_modules/compressai/transforms/point/random_sample.html b/_modules/compressai/transforms/point/random_sample.html new file mode 100644 index 00000000..0b65eb26 --- /dev/null +++ b/_modules/compressai/transforms/point/random_sample.html @@ -0,0 +1,446 @@ + + + + + + + + + + compressai.transforms.point.random_sample — CompressAI + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + +
    +
    +
    +
    +
    + + + + +
    +
    + + + + + +
    + + + + + + + + + + + + + +
    + +
    + + + +
    + +
    +
    + +
    +
    + +
    + +
    + +
    + + +
    + +
    + +
    + + + + + + + + + + + + + + + + + + +
    + +
    + +
    +
    + + + +
    +

    + +
    +
    + +
    +
    +
    + + + + +
    + +

    Source code for compressai.transforms.point.random_sample

    +# Copyright (c) 2021-2022, InterDigital Communications, Inc
    +# All rights reserved.
    +
    +# Redistribution and use in source and binary forms, with or without
    +# modification, are permitted (subject to the limitations in the disclaimer
    +# below) provided that the following conditions are met:
    +
    +# * Redistributions of source code must retain the above copyright notice,
    +#   this list of conditions and the following disclaimer.
    +# * Redistributions in binary form must reproduce the above copyright notice,
    +#   this list of conditions and the following disclaimer in the documentation
    +#   and/or other materials provided with the distribution.
    +# * Neither the name of InterDigital Communications, Inc nor the names of its
    +#   contributors may be used to endorse or promote products derived from this
    +#   software without specific prior written permission.
    +
    +# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY
    +# THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
    +# CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
    +# NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
    +# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
    +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
    +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
    +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
    +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
    +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
    +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
    +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    +
    +import torch
    +
    +from torch_geometric.data import Data
    +from torch_geometric.data.datapipes import functional_transform
    +from torch_geometric.transforms import BaseTransform
    +
    +from compressai.registry import register_transform
    +
    +
    +
    +[docs] +@functional_transform("random_sample") +@register_transform("RandomSample") +class RandomSample(BaseTransform): + r"""Randomly samples points and associated attributes + (functional name: :obj:`random_sample`). + """ + + def __init__( + self, + num=None, + *, + attrs=("pos",), + remove_duplicates_by=None, + preserve_order=False, + seed=None, + static_seed=None, + ): + self.num = num + self.attrs = attrs + self.remove_duplicates_by = remove_duplicates_by + self.preserve_order = preserve_order + self.generator = torch.Generator() + if seed is not None: + self.generator.manual_seed(seed) + self.static_seed = static_seed + + def __call__(self, data: Data) -> Data: + if self.static_seed is not None: + self.generator.manual_seed(self.static_seed) + + if self.remove_duplicates_by is not None: + _, perm = data[self.remove_duplicates_by].unique(return_inverse=True, dim=0) + for attr in self.attrs: + data[attr] = data[attr][perm] + + num_input = data[self.attrs[0]].shape[0] + assert all(data[k].shape[0] == num_input for k in self.attrs) + + p = torch.ones(max(num_input, self.num), dtype=torch.float32) + perm = torch.multinomial(p, self.num, generator=self.generator) + perm %= num_input + + if self.preserve_order: + perm = perm.sort()[0] + + return Data(**{k: v[perm] if k in self.attrs else v for k, v in data.items()})
    + +
    + +
    + + + + + + +
    + +
    +
    +
    + +
    + + + +
    + + +
    +
    + + +
    + + +
    +
    +
    + + + + + +
    +
    + + \ No newline at end of file diff --git a/_modules/compressai/transforms/point/sample_points_v2.html b/_modules/compressai/transforms/point/sample_points_v2.html new file mode 100644 index 00000000..6183b951 --- /dev/null +++ b/_modules/compressai/transforms/point/sample_points_v2.html @@ -0,0 +1,480 @@ + + + + + + + + + + compressai.transforms.point.sample_points_v2 — CompressAI + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + +
    +
    +
    +
    +
    + + + + +
    +
    + + + + + +
    + + + + + + + + + + + + + +
    + +
    + + + +
    + +
    +
    + +
    +
    + +
    + +
    + +
    + + +
    + +
    + +
    + + + + + + + + + + + + + + + + + + +
    + +
    + +
    +
    + + + +
    +

    + +
    +
    + +
    +
    +
    + + + + +
    + +

    Source code for compressai.transforms.point.sample_points_v2

    +# Copyright (c) 2021-2022, InterDigital Communications, Inc
    +# All rights reserved.
    +
    +# Redistribution and use in source and binary forms, with or without
    +# modification, are permitted (subject to the limitations in the disclaimer
    +# below) provided that the following conditions are met:
    +
    +# * Redistributions of source code must retain the above copyright notice,
    +#   this list of conditions and the following disclaimer.
    +# * Redistributions in binary form must reproduce the above copyright notice,
    +#   this list of conditions and the following disclaimer in the documentation
    +#   and/or other materials provided with the distribution.
    +# * Neither the name of InterDigital Communications, Inc nor the names of its
    +#   contributors may be used to endorse or promote products derived from this
    +#   software without specific prior written permission.
    +
    +# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY
    +# THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
    +# CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
    +# NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
    +# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
    +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
    +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
    +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
    +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
    +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
    +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
    +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    +
    +import torch
    +
    +from torch_geometric.data import Data
    +from torch_geometric.data.datapipes import functional_transform
    +from torch_geometric.transforms import BaseTransform
    +
    +from compressai.registry import register_transform
    +
    +
    +
    +[docs] +@functional_transform("sample_points_v2") +@register_transform("SamplePointsV2") +class SamplePointsV2(BaseTransform): + r"""Uniformly samples a fixed number of points on the mesh faces according + to their face area (functional name: :obj:`sample_points`). + + Adapted from PyTorch Geometric under MIT license at + https://github.com/pyg-team/pytorch_geometric/blob/master/LICENSE. + + Args: + num (int): The number of points to sample. + remove_faces (bool, optional): If set to :obj:`False`, the face tensor + will not be removed. (default: :obj:`True`) + include_normals (bool, optional): If set to :obj:`True`, then compute + normals for each sampled point. (default: :obj:`False`) + seed (int, optional): Initial random seed. + static_seed (int, optional): Reset random seed to this every call. + """ + + def __init__( + self, + num: int, + *, + remove_faces: bool = True, + include_normals: bool = False, + seed=None, + static_seed=None, + ): + self.num = num + self.remove_faces = remove_faces + self.include_normals = include_normals + self.generator = torch.Generator() + if seed is not None: + self.generator.manual_seed(seed) + self.static_seed = static_seed + + def __call__(self, data: Data) -> Data: + assert data.pos is not None + assert data.face is not None + + if self.static_seed is not None: + self.generator.manual_seed(self.static_seed) + + pos, face = data.pos, data.face + assert pos.size(1) == 3 and face.size(0) == 3 + + pos_max = pos.abs().max() + pos = pos / pos_max + + area = (pos[face[1]] - pos[face[0]]).cross(pos[face[2]] - pos[face[0]]) + area = area.norm(p=2, dim=1).abs() / 2 + + prob = area / area.sum() + sample = torch.multinomial(prob, self.num, replacement=True) + face = face[:, sample] + + frac = torch.rand(self.num, 2, device=pos.device, generator=self.generator) + mask = frac.sum(dim=-1) > 1 + frac[mask] = 1 - frac[mask] + + vec1 = pos[face[1]] - pos[face[0]] + vec2 = pos[face[2]] - pos[face[0]] + + if self.include_normals: + data.normal = torch.nn.functional.normalize(vec1.cross(vec2), p=2) + + pos_sampled = pos[face[0]] + pos_sampled += frac[:, :1] * vec1 + pos_sampled += frac[:, 1:] * vec2 + + pos_sampled = pos_sampled * pos_max + data.pos = pos_sampled + + if self.remove_faces: + data.face = None + + return data + + def __repr__(self) -> str: + return f"{self.__class__.__name__}({self.num})"
    + +
    + +
    + + + + + + +
    + +
    +
    +
    + +
    + + + +
    + + +
    +
    + + +
    + + +
    +
    +
    + + + + + +
    +
    + + \ No newline at end of file diff --git a/_modules/compressai/transforms/point/to_dict.html b/_modules/compressai/transforms/point/to_dict.html new file mode 100644 index 00000000..63ee2b6d --- /dev/null +++ b/_modules/compressai/transforms/point/to_dict.html @@ -0,0 +1,423 @@ + + + + + + + + + + compressai.transforms.point.to_dict — CompressAI + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + +
    +
    +
    +
    +
    + + + + +
    +
    + + + + + +
    + + + + + + + + + + + + + +
    + +
    + + + +
    + +
    +
    + +
    +
    + +
    + +
    + +
    + + +
    + +
    + +
    + + + + + + + + + + + + + + + + + + +
    + +
    + +
    +
    + + + +
    +

    + +
    +
    + +
    +
    +
    + + + + +
    + +

    Source code for compressai.transforms.point.to_dict

    +# Copyright (c) 2021-2022, InterDigital Communications, Inc
    +# All rights reserved.
    +
    +# Redistribution and use in source and binary forms, with or without
    +# modification, are permitted (subject to the limitations in the disclaimer
    +# below) provided that the following conditions are met:
    +
    +# * Redistributions of source code must retain the above copyright notice,
    +#   this list of conditions and the following disclaimer.
    +# * Redistributions in binary form must reproduce the above copyright notice,
    +#   this list of conditions and the following disclaimer in the documentation
    +#   and/or other materials provided with the distribution.
    +# * Neither the name of InterDigital Communications, Inc nor the names of its
    +#   contributors may be used to endorse or promote products derived from this
    +#   software without specific prior written permission.
    +
    +# NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY
    +# THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
    +# CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
    +# NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
    +# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
    +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
    +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
    +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
    +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
    +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
    +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
    +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    +
    +from typing import Any, Dict
    +
    +import torch
    +
    +from torch_geometric.data import Data
    +from torch_geometric.data.datapipes import functional_transform
    +from torch_geometric.transforms import BaseTransform
    +
    +from compressai.registry import register_transform
    +
    +
    +
    +[docs] +@functional_transform("to_dict") +@register_transform("ToDict") +class ToDict(BaseTransform): + r"""Convert :obj:`Mapping[str, Any]` + (functional name: :obj:`to_dict`). + """ + + def __init__(self, *, wrapper="dict"): + if wrapper == "dict": + self.wrap = dict + elif wrapper == "torch_geometric.data.Data": + self.wrap = Data + else: + raise ValueError(f"Unknown wrapper: {wrapper}") + + def __call__(self, data) -> Dict[str, Any]: + data = { + k: v if isinstance(v, torch.Tensor) else torch.tensor(v) + for k, v in data.items() + } + return self.wrap(**data)
    + +
    + +
    + + + + + + +
    + +
    +
    +
    + +
    + + + +
    + + +
    +
    + + +
    + + +
    +
    +
    + + + + + +
    +
    + + \ No newline at end of file diff --git a/_modules/compressai/transforms/transforms.html b/_modules/compressai/transforms/transforms.html index aba8ce5a..6d547e14 100644 --- a/_modules/compressai/transforms/transforms.html +++ b/_modules/compressai/transforms/transforms.html @@ -167,6 +167,7 @@
  • compressai.entropy_models
  • compressai.latent_codecs
  • compressai.layers
  • +
  • compressai.losses
  • compressai.models
  • compressai.ops
  • compressai.transforms
  • diff --git a/_modules/compressai/zoo/image.html b/_modules/compressai/zoo/image.html index 41f9879a..96ca724d 100644 --- a/_modules/compressai/zoo/image.html +++ b/_modules/compressai/zoo/image.html @@ -167,6 +167,7 @@
  • compressai.entropy_models
  • compressai.latent_codecs
  • compressai.layers
  • +
  • compressai.losses
  • compressai.models
  • compressai.ops
  • compressai.transforms
  • diff --git a/_modules/compressai/zoo/video.html b/_modules/compressai/zoo/video.html index 752d8192..d7486c02 100644 --- a/_modules/compressai/zoo/video.html +++ b/_modules/compressai/zoo/video.html @@ -167,6 +167,7 @@
  • compressai.entropy_models
  • compressai.latent_codecs
  • compressai.layers
  • +
  • compressai.losses
  • compressai.models
  • compressai.ops
  • compressai.transforms
  • diff --git a/_modules/index.html b/_modules/index.html index 0a3462dd..7da4e32a 100644 --- a/_modules/index.html +++ b/_modules/index.html @@ -167,6 +167,7 @@
  • compressai.entropy_models
  • compressai.latent_codecs
  • compressai.layers
  • +
  • compressai.losses
  • compressai.models
  • compressai.ops
  • compressai.transforms
  • @@ -288,7 +289,13 @@

    All modules for which code is available

    • compressai
      • compressai.ans
      • compressai.datasets.image
      • +
      • compressai.datasets.pointcloud.modelnet
      • +
      • compressai.datasets.pointcloud.s3dis
      • +
      • compressai.datasets.pointcloud.semantic_kitti
      • +
      • compressai.datasets.pointcloud.shapenet
      • +
      • compressai.datasets.pregenerated
      • compressai.datasets.video
      • +
      • compressai.datasets.vimeo90k
      • compressai.entropy_models.entropy_models
      • compressai.latent_codecs.channel_groups
      • compressai.latent_codecs.checkerboard
      • @@ -301,8 +308,14 @@

        All modules for which code is available

      • compressai.latent_codecs.rasterscan
      • compressai.layers.gdn
      • compressai.layers.layers
      • +
      • compressai.losses.pointcloud.chamfer
      • +
      • compressai.losses.pointcloud.hrtzxf2022
      • +
      • compressai.losses.rate_distortion
      • compressai.models.base
      • compressai.models.google
      • +
      • compressai.models.pointcloud.hrtzxf2022
      • +
      • compressai.models.pointcloud.sfu_pointnet
      • +
      • compressai.models.pointcloud.sfu_pointnet2
      • compressai.models.sensetime
      • compressai.models.video.google
      • compressai.models.waseda
      • @@ -310,6 +323,13 @@

        All modules for which code is available

      • compressai.ops.ops
      • compressai.ops.parametrizers
      • compressai.transforms.functional
      • +
      • compressai.transforms.point.generate_position_normals
      • +
      • compressai.transforms.point.normalize_scale_v2
      • +
      • compressai.transforms.point.random_permutation
      • +
      • compressai.transforms.point.random_rotate_full
      • +
      • compressai.transforms.point.random_sample
      • +
      • compressai.transforms.point.sample_points_v2
      • +
      • compressai.transforms.point.to_dict
      • compressai.transforms.transforms
      • compressai.zoo.image
      • compressai.zoo.video
      • diff --git a/_sources/datasets.rst b/_sources/datasets.rst index 45a23a1b..e0ef1124 100644 --- a/_sources/datasets.rst +++ b/_sources/datasets.rst @@ -4,13 +4,60 @@ compressai.datasets .. currentmodule:: compressai.datasets + +Image/video datasets +~~~~~~~~~~~~~~~~~~~~ + + ImageFolder ----------- .. autoclass:: ImageFolder :members: +PreGeneratedMemmapDataset +------------------------- +.. autoclass:: PreGeneratedMemmapDataset + :members: + + VideoFolder ----------- .. autoclass:: VideoFolder - :members: \ No newline at end of file + :members: + + +Vimeo90kDataset +--------------- +.. autoclass:: Vimeo90kDataset + :members: + + + +Point cloud datasets +~~~~~~~~~~~~~~~~~~~~ + + +ModelNetDataset +--------------- +.. autoclass:: ModelNetDataset + :members: + + +S3disDataset +------------ +.. autoclass:: S3disDataset + :members: + + +SemanticKittiDataset +-------------------- +.. autoclass:: SemanticKittiDataset + :members: + + +ShapeNetCorePartDataset +----------------------- +.. autoclass:: ShapeNetCorePartDataset + :members: + diff --git a/_sources/index.rst b/_sources/index.rst index fe6f240b..e283c511 100644 --- a/_sources/index.rst +++ b/_sources/index.rst @@ -29,6 +29,7 @@ end-to-end compression research. entropy_models latent_codecs layers + losses models ops transforms diff --git a/_sources/losses.rst b/_sources/losses.rst new file mode 100644 index 00000000..7dfbf0c3 --- /dev/null +++ b/_sources/losses.rst @@ -0,0 +1,33 @@ +compressai.losses +================= + +.. currentmodule:: compressai.losses + + + +Image/video losses +~~~~~~~~~~~~~~~~~~ + + +RateDistortionLoss +------------------ +.. autoclass:: RateDistortionLoss + :members: + + + +Point cloud losses +~~~~~~~~~~~~~~~~~~ + + +ChamferPccRateDistortionLoss +---------------------------- +.. autoclass:: ChamferPccRateDistortionLoss + :members: + + +RateDistortionLoss_hrtzxf2022 +----------------------------- +.. autoclass:: RateDistortionLoss_hrtzxf2022 + :members: + diff --git a/_sources/models.rst b/_sources/models.rst index cd64f1b4..7819b399 100644 --- a/_sources/models.rst +++ b/_sources/models.rst @@ -63,6 +63,23 @@ Elic2022Chandelier .. currentmodule:: compressai.models.video ScaleSpaceFlow ------------------- +-------------- .. autoclass:: ScaleSpaceFlow + +.. currentmodule:: compressai.models.pointcloud + +DensityPreservingReconstructionPccModel +--------------------------------------- +.. autoclass:: DensityPreservingReconstructionPccModel + + +PointNetReconstructionPccModel +------------------------------ +.. autoclass:: PointNetReconstructionPccModel + + +PointNet2SsgReconstructionPccModel +---------------------------------- +.. autoclass:: PointNet2SsgReconstructionPccModel + diff --git a/_sources/transforms.rst b/_sources/transforms.rst index 8866d8ea..cd4ced50 100644 --- a/_sources/transforms.rst +++ b/_sources/transforms.rst @@ -23,3 +23,10 @@ Functional transforms can be used to define custom transform classes. .. automodule:: compressai.transforms.functional :members: + + +Point Cloud Transforms +---------------------- + +.. automodule:: compressai.transforms.point + :members: diff --git a/_static/locales/ar/LC_MESSAGES/booktheme.po b/_static/locales/ar/LC_MESSAGES/booktheme.po index 1237f343..edae2ec4 100644 --- a/_static/locales/ar/LC_MESSAGES/booktheme.po +++ b/_static/locales/ar/LC_MESSAGES/booktheme.po @@ -8,68 +8,68 @@ msgstr "" "Language: ar\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -msgid "Download source file" -msgstr "تنزيل ملف المصدر" - -msgid "suggest edit" -msgstr "أقترح تحرير" +msgid "Theme by the" +msgstr "موضوع بواسطة" -msgid "Toggle navigation" -msgstr "تبديل التنقل" +msgid "Open an issue" +msgstr "افتح قضية" -msgid "open issue" -msgstr "قضية مفتوحة" +msgid "Contents" +msgstr "محتويات" msgid "Download notebook file" msgstr "تنزيل ملف دفتر الملاحظات" -msgid "repository" -msgstr "مخزن" +msgid "Sphinx Book Theme" +msgstr "موضوع كتاب أبو الهول" -msgid "Theme by the" -msgstr "موضوع بواسطة" +msgid "Fullscreen mode" +msgstr "وضع ملء الشاشة" -msgid "Print to PDF" -msgstr "طباعة إلى PDF" +msgid "Edit this page" +msgstr "قم بتحرير هذه الصفحة" -msgid "Download this page" -msgstr "قم بتنزيل هذه الصفحة" +msgid "By" +msgstr "بواسطة" msgid "Copyright" msgstr "حقوق النشر" -msgid "Last updated on" -msgstr "آخر تحديث في" - -msgid "Launch" -msgstr "إطلاق" +msgid "Source repository" +msgstr "مستودع المصدر" -msgid "Open an issue" -msgstr "افتح قضية" +msgid "previous page" +msgstr "الصفحة السابقة" -msgid "Fullscreen mode" -msgstr "وضع ملء الشاشة" +msgid "next page" +msgstr "الصفحة التالية" -msgid "Sphinx Book Theme" -msgstr "موضوع كتاب أبو الهول" +msgid "Toggle navigation" +msgstr "تبديل التنقل" -msgid "Contents" -msgstr "محتويات" +msgid "repository" +msgstr "مخزن" -msgid "Edit this page" -msgstr "قم بتحرير هذه الصفحة" +msgid "suggest edit" +msgstr "أقترح تحرير" -msgid "next page" -msgstr "الصفحة التالية" +msgid "open issue" +msgstr "قضية مفتوحة" -msgid "Source repository" -msgstr "مستودع المصدر" +msgid "Launch" +msgstr "إطلاق" -msgid "By" -msgstr "بواسطة" +msgid "Print to PDF" +msgstr "طباعة إلى PDF" msgid "By the" msgstr "بواسطة" -msgid "previous page" -msgstr "الصفحة السابقة" +msgid "Last updated on" +msgstr "آخر تحديث في" + +msgid "Download source file" +msgstr "تنزيل ملف المصدر" + +msgid "Download this page" +msgstr "قم بتنزيل هذه الصفحة" diff --git a/_static/locales/bg/LC_MESSAGES/booktheme.po b/_static/locales/bg/LC_MESSAGES/booktheme.po index 45a6ed0a..1f363b9d 100644 --- a/_static/locales/bg/LC_MESSAGES/booktheme.po +++ b/_static/locales/bg/LC_MESSAGES/booktheme.po @@ -8,68 +8,68 @@ msgstr "" "Language: bg\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -msgid "Download source file" -msgstr "Изтеглете изходния файл" - -msgid "suggest edit" -msgstr "предложи редактиране" +msgid "Theme by the" +msgstr "Тема от" -msgid "Toggle navigation" -msgstr "Превключване на навигацията" +msgid "Open an issue" +msgstr "Отворете проблем" -msgid "open issue" -msgstr "отворен брой" +msgid "Contents" +msgstr "Съдържание" msgid "Download notebook file" msgstr "Изтеглете файла на бележника" -msgid "repository" -msgstr "хранилище" +msgid "Sphinx Book Theme" +msgstr "Тема на книгата Sphinx" -msgid "Theme by the" -msgstr "Тема от" +msgid "Fullscreen mode" +msgstr "Режим на цял екран" -msgid "Print to PDF" -msgstr "Печат в PDF" +msgid "Edit this page" +msgstr "Редактирайте тази страница" -msgid "Download this page" -msgstr "Изтеглете тази страница" +msgid "By" +msgstr "От" msgid "Copyright" msgstr "Авторско право" -msgid "Last updated on" -msgstr "Последна актуализация на" - -msgid "Launch" -msgstr "Стартиране" +msgid "Source repository" +msgstr "Хранилище на източника" -msgid "Open an issue" -msgstr "Отворете проблем" +msgid "previous page" +msgstr "предишна страница" -msgid "Fullscreen mode" -msgstr "Режим на цял екран" +msgid "next page" +msgstr "Следваща страница" -msgid "Sphinx Book Theme" -msgstr "Тема на книгата Sphinx" +msgid "Toggle navigation" +msgstr "Превключване на навигацията" -msgid "Contents" -msgstr "Съдържание" +msgid "repository" +msgstr "хранилище" -msgid "Edit this page" -msgstr "Редактирайте тази страница" +msgid "suggest edit" +msgstr "предложи редактиране" -msgid "next page" -msgstr "Следваща страница" +msgid "open issue" +msgstr "отворен брой" -msgid "Source repository" -msgstr "Хранилище на източника" +msgid "Launch" +msgstr "Стартиране" -msgid "By" -msgstr "От" +msgid "Print to PDF" +msgstr "Печат в PDF" msgid "By the" msgstr "По" -msgid "previous page" -msgstr "предишна страница" +msgid "Last updated on" +msgstr "Последна актуализация на" + +msgid "Download source file" +msgstr "Изтеглете изходния файл" + +msgid "Download this page" +msgstr "Изтеглете тази страница" diff --git a/_static/locales/bn/LC_MESSAGES/booktheme.po b/_static/locales/bn/LC_MESSAGES/booktheme.po index 122a369e..fa543728 100644 --- a/_static/locales/bn/LC_MESSAGES/booktheme.po +++ b/_static/locales/bn/LC_MESSAGES/booktheme.po @@ -8,56 +8,56 @@ msgstr "" "Language: bn\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -msgid "Download source file" -msgstr "উত্স ফাইল ডাউনলোড করুন" - -msgid "Toggle navigation" -msgstr "নেভিগেশন টগল করুন" +msgid "Theme by the" +msgstr "থিম দ্বারা" -msgid "open issue" -msgstr "খোলা সমস্যা" +msgid "Open an issue" +msgstr "একটি সমস্যা খুলুন" msgid "Download notebook file" msgstr "নোটবুক ফাইল ডাউনলোড করুন" -msgid "Theme by the" -msgstr "থিম দ্বারা" +msgid "Sphinx Book Theme" +msgstr "স্পিনিক্স বুক থিম" -msgid "Print to PDF" -msgstr "পিডিএফ প্রিন্ট করুন" +msgid "Edit this page" +msgstr "এই পৃষ্ঠাটি সম্পাদনা করুন" -msgid "Download this page" -msgstr "এই পৃষ্ঠাটি ডাউনলোড করুন" +msgid "By" +msgstr "দ্বারা" msgid "Copyright" msgstr "কপিরাইট" -msgid "Last updated on" -msgstr "সর্বশেষ আপডেট" - -msgid "Launch" -msgstr "শুরু করা" - -msgid "Open an issue" -msgstr "একটি সমস্যা খুলুন" - -msgid "Sphinx Book Theme" -msgstr "স্পিনিক্স বুক থিম" +msgid "Source repository" +msgstr "উত্স সংগ্রহস্থল" -msgid "Edit this page" -msgstr "এই পৃষ্ঠাটি সম্পাদনা করুন" +msgid "previous page" +msgstr "আগের পৃষ্ঠা" msgid "next page" msgstr "পরবর্তী পৃষ্ঠা" -msgid "Source repository" -msgstr "উত্স সংগ্রহস্থল" +msgid "Toggle navigation" +msgstr "নেভিগেশন টগল করুন" -msgid "By" -msgstr "দ্বারা" +msgid "open issue" +msgstr "খোলা সমস্যা" + +msgid "Launch" +msgstr "শুরু করা" + +msgid "Print to PDF" +msgstr "পিডিএফ প্রিন্ট করুন" msgid "By the" msgstr "দ্বারা" -msgid "previous page" -msgstr "আগের পৃষ্ঠা" +msgid "Last updated on" +msgstr "সর্বশেষ আপডেট" + +msgid "Download source file" +msgstr "উত্স ফাইল ডাউনলোড করুন" + +msgid "Download this page" +msgstr "এই পৃষ্ঠাটি ডাউনলোড করুন" diff --git a/_static/locales/ca/LC_MESSAGES/booktheme.po b/_static/locales/ca/LC_MESSAGES/booktheme.po index c757deb8..22f1569a 100644 --- a/_static/locales/ca/LC_MESSAGES/booktheme.po +++ b/_static/locales/ca/LC_MESSAGES/booktheme.po @@ -8,59 +8,59 @@ msgstr "" "Language: ca\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -msgid "Download source file" -msgstr "Baixeu el fitxer font" - -msgid "suggest edit" -msgstr "suggerir edició" - -msgid "Toggle navigation" -msgstr "Commuta la navegació" +msgid "Theme by the" +msgstr "Tema del" -msgid "open issue" -msgstr "número obert" +msgid "Open an issue" +msgstr "Obriu un número" msgid "Download notebook file" msgstr "Descarregar fitxer de quadern" -msgid "Theme by the" -msgstr "Tema del" +msgid "Sphinx Book Theme" +msgstr "Tema del llibre Esfinx" -msgid "Print to PDF" -msgstr "Imprimeix a PDF" +msgid "Edit this page" +msgstr "Editeu aquesta pàgina" -msgid "Download this page" -msgstr "Descarregueu aquesta pàgina" +msgid "By" +msgstr "Per" msgid "Copyright" msgstr "Copyright" -msgid "Last updated on" -msgstr "Darrera actualització el" +msgid "Source repository" +msgstr "Dipòsit de fonts" -msgid "Launch" -msgstr "Llançament" +msgid "previous page" +msgstr "Pàgina anterior" -msgid "Open an issue" -msgstr "Obriu un número" +msgid "next page" +msgstr "pàgina següent" -msgid "Sphinx Book Theme" -msgstr "Tema del llibre Esfinx" +msgid "Toggle navigation" +msgstr "Commuta la navegació" -msgid "Edit this page" -msgstr "Editeu aquesta pàgina" +msgid "suggest edit" +msgstr "suggerir edició" -msgid "next page" -msgstr "pàgina següent" +msgid "open issue" +msgstr "número obert" -msgid "Source repository" -msgstr "Dipòsit de fonts" +msgid "Launch" +msgstr "Llançament" -msgid "By" -msgstr "Per" +msgid "Print to PDF" +msgstr "Imprimeix a PDF" msgid "By the" msgstr "Per la" -msgid "previous page" -msgstr "Pàgina anterior" +msgid "Last updated on" +msgstr "Darrera actualització el" + +msgid "Download source file" +msgstr "Baixeu el fitxer font" + +msgid "Download this page" +msgstr "Descarregueu aquesta pàgina" diff --git a/_static/locales/cs/LC_MESSAGES/booktheme.po b/_static/locales/cs/LC_MESSAGES/booktheme.po index 3571c23b..afecd9e7 100644 --- a/_static/locales/cs/LC_MESSAGES/booktheme.po +++ b/_static/locales/cs/LC_MESSAGES/booktheme.po @@ -8,68 +8,68 @@ msgstr "" "Language: cs\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -msgid "Download source file" -msgstr "Stáhněte si zdrojový soubor" - -msgid "suggest edit" -msgstr "navrhnout úpravy" +msgid "Theme by the" +msgstr "Téma od" -msgid "Toggle navigation" -msgstr "Přepnout navigaci" +msgid "Open an issue" +msgstr "Otevřete problém" -msgid "open issue" -msgstr "otevřené číslo" +msgid "Contents" +msgstr "Obsah" msgid "Download notebook file" msgstr "Stáhnout soubor poznámkového bloku" -msgid "repository" -msgstr "úložiště" +msgid "Sphinx Book Theme" +msgstr "Téma knihy Sfinga" -msgid "Theme by the" -msgstr "Téma od" +msgid "Fullscreen mode" +msgstr "Režim celé obrazovky" -msgid "Print to PDF" -msgstr "Tisk do PDF" +msgid "Edit this page" +msgstr "Upravit tuto stránku" -msgid "Download this page" -msgstr "Stáhněte si tuto stránku" +msgid "By" +msgstr "Podle" msgid "Copyright" msgstr "autorská práva" -msgid "Last updated on" -msgstr "Naposledy aktualizováno" - -msgid "Launch" -msgstr "Zahájení" +msgid "Source repository" +msgstr "Zdrojové úložiště" -msgid "Open an issue" -msgstr "Otevřete problém" +msgid "previous page" +msgstr "předchozí stránka" -msgid "Fullscreen mode" -msgstr "Režim celé obrazovky" +msgid "next page" +msgstr "další strana" -msgid "Sphinx Book Theme" -msgstr "Téma knihy Sfinga" +msgid "Toggle navigation" +msgstr "Přepnout navigaci" -msgid "Contents" -msgstr "Obsah" +msgid "repository" +msgstr "úložiště" -msgid "Edit this page" -msgstr "Upravit tuto stránku" +msgid "suggest edit" +msgstr "navrhnout úpravy" -msgid "next page" -msgstr "další strana" +msgid "open issue" +msgstr "otevřené číslo" -msgid "Source repository" -msgstr "Zdrojové úložiště" +msgid "Launch" +msgstr "Zahájení" -msgid "By" -msgstr "Podle" +msgid "Print to PDF" +msgstr "Tisk do PDF" msgid "By the" msgstr "Podle" -msgid "previous page" -msgstr "předchozí stránka" +msgid "Last updated on" +msgstr "Naposledy aktualizováno" + +msgid "Download source file" +msgstr "Stáhněte si zdrojový soubor" + +msgid "Download this page" +msgstr "Stáhněte si tuto stránku" diff --git a/_static/locales/da/LC_MESSAGES/booktheme.po b/_static/locales/da/LC_MESSAGES/booktheme.po index c39223fd..649c78a8 100644 --- a/_static/locales/da/LC_MESSAGES/booktheme.po +++ b/_static/locales/da/LC_MESSAGES/booktheme.po @@ -8,68 +8,68 @@ msgstr "" "Language: da\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -msgid "Download source file" -msgstr "Download kildefil" - -msgid "suggest edit" -msgstr "foreslå redigering" +msgid "Theme by the" +msgstr "Tema af" -msgid "Toggle navigation" -msgstr "Skift navigation" +msgid "Open an issue" +msgstr "Åbn et problem" -msgid "open issue" -msgstr "åbent nummer" +msgid "Contents" +msgstr "Indhold" msgid "Download notebook file" msgstr "Download notesbog-fil" -msgid "repository" -msgstr "lager" +msgid "Sphinx Book Theme" +msgstr "Sphinx bogtema" -msgid "Theme by the" -msgstr "Tema af" +msgid "Fullscreen mode" +msgstr "Fuldskærmstilstand" -msgid "Print to PDF" -msgstr "Udskriv til PDF" +msgid "Edit this page" +msgstr "Rediger denne side" -msgid "Download this page" -msgstr "Download denne side" +msgid "By" +msgstr "Ved" msgid "Copyright" msgstr "ophavsret" -msgid "Last updated on" -msgstr "Sidst opdateret den" - -msgid "Launch" -msgstr "Start" +msgid "Source repository" +msgstr "Kildelager" -msgid "Open an issue" -msgstr "Åbn et problem" +msgid "previous page" +msgstr "forrige side" -msgid "Fullscreen mode" -msgstr "Fuldskærmstilstand" +msgid "next page" +msgstr "Næste side" -msgid "Sphinx Book Theme" -msgstr "Sphinx bogtema" +msgid "Toggle navigation" +msgstr "Skift navigation" -msgid "Contents" -msgstr "Indhold" +msgid "repository" +msgstr "lager" -msgid "Edit this page" -msgstr "Rediger denne side" +msgid "suggest edit" +msgstr "foreslå redigering" -msgid "next page" -msgstr "Næste side" +msgid "open issue" +msgstr "åbent nummer" -msgid "Source repository" -msgstr "Kildelager" +msgid "Launch" +msgstr "Start" -msgid "By" -msgstr "Ved" +msgid "Print to PDF" +msgstr "Udskriv til PDF" msgid "By the" msgstr "Ved" -msgid "previous page" -msgstr "forrige side" +msgid "Last updated on" +msgstr "Sidst opdateret den" + +msgid "Download source file" +msgstr "Download kildefil" + +msgid "Download this page" +msgstr "Download denne side" diff --git a/_static/locales/de/LC_MESSAGES/booktheme.po b/_static/locales/de/LC_MESSAGES/booktheme.po index e22b505f..f51d2ecc 100644 --- a/_static/locales/de/LC_MESSAGES/booktheme.po +++ b/_static/locales/de/LC_MESSAGES/booktheme.po @@ -8,68 +8,68 @@ msgstr "" "Language: de\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -msgid "Download source file" -msgstr "Quelldatei herunterladen" - -msgid "suggest edit" -msgstr "vorschlagen zu bearbeiten" +msgid "Theme by the" +msgstr "Thema von der" -msgid "Toggle navigation" -msgstr "Navigation umschalten" +msgid "Open an issue" +msgstr "Öffnen Sie ein Problem" -msgid "open issue" -msgstr "offenes Thema" +msgid "Contents" +msgstr "Inhalt" msgid "Download notebook file" msgstr "Notebook-Datei herunterladen" -msgid "repository" -msgstr "Repository" +msgid "Sphinx Book Theme" +msgstr "Sphinx-Buch-Thema" -msgid "Theme by the" -msgstr "Thema von der" +msgid "Fullscreen mode" +msgstr "Vollbildmodus" -msgid "Print to PDF" -msgstr "In PDF drucken" +msgid "Edit this page" +msgstr "Bearbeite diese Seite" -msgid "Download this page" -msgstr "Laden Sie diese Seite herunter" +msgid "By" +msgstr "Durch" msgid "Copyright" msgstr "Urheberrechte ©" -msgid "Last updated on" -msgstr "Zuletzt aktualisiert am" - -msgid "Launch" -msgstr "Starten" +msgid "Source repository" +msgstr "Quell-Repository" -msgid "Open an issue" -msgstr "Öffnen Sie ein Problem" +msgid "previous page" +msgstr "vorherige Seite" -msgid "Fullscreen mode" -msgstr "Vollbildmodus" +msgid "next page" +msgstr "Nächste Seite" -msgid "Sphinx Book Theme" -msgstr "Sphinx-Buch-Thema" +msgid "Toggle navigation" +msgstr "Navigation umschalten" -msgid "Contents" -msgstr "Inhalt" +msgid "repository" +msgstr "Repository" -msgid "Edit this page" -msgstr "Bearbeite diese Seite" +msgid "suggest edit" +msgstr "vorschlagen zu bearbeiten" -msgid "next page" -msgstr "Nächste Seite" +msgid "open issue" +msgstr "offenes Thema" -msgid "Source repository" -msgstr "Quell-Repository" +msgid "Launch" +msgstr "Starten" -msgid "By" -msgstr "Durch" +msgid "Print to PDF" +msgstr "In PDF drucken" msgid "By the" msgstr "Bis zum" -msgid "previous page" -msgstr "vorherige Seite" +msgid "Last updated on" +msgstr "Zuletzt aktualisiert am" + +msgid "Download source file" +msgstr "Quelldatei herunterladen" + +msgid "Download this page" +msgstr "Laden Sie diese Seite herunter" diff --git a/_static/locales/el/LC_MESSAGES/booktheme.po b/_static/locales/el/LC_MESSAGES/booktheme.po index 588f2efd..8bec7905 100644 --- a/_static/locales/el/LC_MESSAGES/booktheme.po +++ b/_static/locales/el/LC_MESSAGES/booktheme.po @@ -8,68 +8,68 @@ msgstr "" "Language: el\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -msgid "Download source file" -msgstr "Λήψη αρχείου προέλευσης" - -msgid "suggest edit" -msgstr "προτείνω επεξεργασία" +msgid "Theme by the" +msgstr "Θέμα από το" -msgid "Toggle navigation" -msgstr "Εναλλαγή πλοήγησης" +msgid "Open an issue" +msgstr "Ανοίξτε ένα ζήτημα" -msgid "open issue" -msgstr "ανοιχτό ζήτημα" +msgid "Contents" +msgstr "Περιεχόμενα" msgid "Download notebook file" msgstr "Λήψη αρχείου σημειωματάριου" -msgid "repository" -msgstr "αποθήκη" +msgid "Sphinx Book Theme" +msgstr "Θέμα βιβλίου Sphinx" -msgid "Theme by the" -msgstr "Θέμα από το" +msgid "Fullscreen mode" +msgstr "ΛΕΙΤΟΥΡΓΙΑ ΠΛΗΡΟΥΣ ΟΘΟΝΗΣ" -msgid "Print to PDF" -msgstr "Εκτύπωση σε PDF" +msgid "Edit this page" +msgstr "Επεξεργαστείτε αυτήν τη σελίδα" -msgid "Download this page" -msgstr "Λήψη αυτής της σελίδας" +msgid "By" +msgstr "Με" msgid "Copyright" msgstr "Πνευματική ιδιοκτησία" -msgid "Last updated on" -msgstr "Τελευταία ενημέρωση στις" - -msgid "Launch" -msgstr "Εκτόξευση" +msgid "Source repository" +msgstr "Αποθήκη πηγής" -msgid "Open an issue" -msgstr "Ανοίξτε ένα ζήτημα" +msgid "previous page" +msgstr "προηγούμενη σελίδα" -msgid "Fullscreen mode" -msgstr "ΛΕΙΤΟΥΡΓΙΑ ΠΛΗΡΟΥΣ ΟΘΟΝΗΣ" +msgid "next page" +msgstr "επόμενη σελίδα" -msgid "Sphinx Book Theme" -msgstr "Θέμα βιβλίου Sphinx" +msgid "Toggle navigation" +msgstr "Εναλλαγή πλοήγησης" -msgid "Contents" -msgstr "Περιεχόμενα" +msgid "repository" +msgstr "αποθήκη" -msgid "Edit this page" -msgstr "Επεξεργαστείτε αυτήν τη σελίδα" +msgid "suggest edit" +msgstr "προτείνω επεξεργασία" -msgid "next page" -msgstr "επόμενη σελίδα" +msgid "open issue" +msgstr "ανοιχτό ζήτημα" -msgid "Source repository" -msgstr "Αποθήκη πηγής" +msgid "Launch" +msgstr "Εκτόξευση" -msgid "By" -msgstr "Με" +msgid "Print to PDF" +msgstr "Εκτύπωση σε PDF" msgid "By the" msgstr "Από το" -msgid "previous page" -msgstr "προηγούμενη σελίδα" +msgid "Last updated on" +msgstr "Τελευταία ενημέρωση στις" + +msgid "Download source file" +msgstr "Λήψη αρχείου προέλευσης" + +msgid "Download this page" +msgstr "Λήψη αυτής της σελίδας" diff --git a/_static/locales/eo/LC_MESSAGES/booktheme.po b/_static/locales/eo/LC_MESSAGES/booktheme.po index 4614fe0a..d72a0481 100644 --- a/_static/locales/eo/LC_MESSAGES/booktheme.po +++ b/_static/locales/eo/LC_MESSAGES/booktheme.po @@ -8,68 +8,68 @@ msgstr "" "Language: eo\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -msgid "Download source file" -msgstr "Elŝutu fontodosieron" - -msgid "suggest edit" -msgstr "sugesti redaktadon" +msgid "Theme by the" +msgstr "Temo de la" -msgid "Toggle navigation" -msgstr "Ŝalti navigadon" +msgid "Open an issue" +msgstr "Malfermu numeron" -msgid "open issue" -msgstr "malferma numero" +msgid "Contents" +msgstr "Enhavo" msgid "Download notebook file" msgstr "Elŝutu kajeran dosieron" -msgid "repository" -msgstr "deponejo" +msgid "Sphinx Book Theme" +msgstr "Sfinksa Libro-Temo" -msgid "Theme by the" -msgstr "Temo de la" +msgid "Fullscreen mode" +msgstr "Plenekrana reĝimo" -msgid "Print to PDF" -msgstr "Presi al PDF" +msgid "Edit this page" +msgstr "Redaktu ĉi tiun paĝon" -msgid "Download this page" -msgstr "Elŝutu ĉi tiun paĝon" +msgid "By" +msgstr "De" msgid "Copyright" msgstr "Kopirajto" -msgid "Last updated on" -msgstr "Laste ĝisdatigita la" - -msgid "Launch" -msgstr "Lanĉo" +msgid "Source repository" +msgstr "Fonto-deponejo" -msgid "Open an issue" -msgstr "Malfermu numeron" +msgid "previous page" +msgstr "antaŭa paĝo" -msgid "Fullscreen mode" -msgstr "Plenekrana reĝimo" +msgid "next page" +msgstr "sekva paĝo" -msgid "Sphinx Book Theme" -msgstr "Sfinksa Libro-Temo" +msgid "Toggle navigation" +msgstr "Ŝalti navigadon" -msgid "Contents" -msgstr "Enhavo" +msgid "repository" +msgstr "deponejo" -msgid "Edit this page" -msgstr "Redaktu ĉi tiun paĝon" +msgid "suggest edit" +msgstr "sugesti redaktadon" -msgid "next page" -msgstr "sekva paĝo" +msgid "open issue" +msgstr "malferma numero" -msgid "Source repository" -msgstr "Fonto-deponejo" +msgid "Launch" +msgstr "Lanĉo" -msgid "By" -msgstr "De" +msgid "Print to PDF" +msgstr "Presi al PDF" msgid "By the" msgstr "Per la" -msgid "previous page" -msgstr "antaŭa paĝo" +msgid "Last updated on" +msgstr "Laste ĝisdatigita la" + +msgid "Download source file" +msgstr "Elŝutu fontodosieron" + +msgid "Download this page" +msgstr "Elŝutu ĉi tiun paĝon" diff --git a/_static/locales/es/LC_MESSAGES/booktheme.po b/_static/locales/es/LC_MESSAGES/booktheme.po index b4fccf19..611834b2 100644 --- a/_static/locales/es/LC_MESSAGES/booktheme.po +++ b/_static/locales/es/LC_MESSAGES/booktheme.po @@ -8,68 +8,68 @@ msgstr "" "Language: es\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -msgid "Download source file" -msgstr "Descargar archivo fuente" - -msgid "suggest edit" -msgstr "sugerir editar" +msgid "Theme by the" +msgstr "Tema por el" -msgid "Toggle navigation" -msgstr "Navegación de palanca" +msgid "Open an issue" +msgstr "Abrir un problema" -msgid "open issue" -msgstr "Tema abierto" +msgid "Contents" +msgstr "Contenido" msgid "Download notebook file" msgstr "Descargar archivo de cuaderno" -msgid "repository" -msgstr "repositorio" +msgid "Sphinx Book Theme" +msgstr "Tema del libro de la esfinge" -msgid "Theme by the" -msgstr "Tema por el" +msgid "Fullscreen mode" +msgstr "Modo de pantalla completa" -msgid "Print to PDF" -msgstr "Imprimir en PDF" +msgid "Edit this page" +msgstr "Edita esta página" -msgid "Download this page" -msgstr "Descarga esta pagina" +msgid "By" +msgstr "Por" msgid "Copyright" msgstr "Derechos de autor" -msgid "Last updated on" -msgstr "Ultima actualización en" - -msgid "Launch" -msgstr "Lanzamiento" +msgid "Source repository" +msgstr "Repositorio de origen" -msgid "Open an issue" -msgstr "Abrir un problema" +msgid "previous page" +msgstr "pagina anterior" -msgid "Fullscreen mode" -msgstr "Modo de pantalla completa" +msgid "next page" +msgstr "siguiente página" -msgid "Sphinx Book Theme" -msgstr "Tema del libro de la esfinge" +msgid "Toggle navigation" +msgstr "Navegación de palanca" -msgid "Contents" -msgstr "Contenido" +msgid "repository" +msgstr "repositorio" -msgid "Edit this page" -msgstr "Edita esta página" +msgid "suggest edit" +msgstr "sugerir editar" -msgid "next page" -msgstr "siguiente página" +msgid "open issue" +msgstr "Tema abierto" -msgid "Source repository" -msgstr "Repositorio de origen" +msgid "Launch" +msgstr "Lanzamiento" -msgid "By" -msgstr "Por" +msgid "Print to PDF" +msgstr "Imprimir en PDF" msgid "By the" msgstr "Por el" -msgid "previous page" -msgstr "pagina anterior" +msgid "Last updated on" +msgstr "Ultima actualización en" + +msgid "Download source file" +msgstr "Descargar archivo fuente" + +msgid "Download this page" +msgstr "Descarga esta pagina" diff --git a/_static/locales/et/LC_MESSAGES/booktheme.po b/_static/locales/et/LC_MESSAGES/booktheme.po index b748b37f..345088f0 100644 --- a/_static/locales/et/LC_MESSAGES/booktheme.po +++ b/_static/locales/et/LC_MESSAGES/booktheme.po @@ -8,68 +8,68 @@ msgstr "" "Language: et\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -msgid "Download source file" -msgstr "Laadige alla lähtefail" - -msgid "suggest edit" -msgstr "soovita muuta" +msgid "Theme by the" +msgstr "Teema" -msgid "Toggle navigation" -msgstr "Lülita navigeerimine sisse" +msgid "Open an issue" +msgstr "Avage probleem" -msgid "open issue" -msgstr "avatud küsimus" +msgid "Contents" +msgstr "Sisu" msgid "Download notebook file" msgstr "Laadige sülearvuti fail alla" -msgid "repository" -msgstr "hoidla" +msgid "Sphinx Book Theme" +msgstr "Sfinksiraamatu teema" -msgid "Theme by the" -msgstr "Teema" +msgid "Fullscreen mode" +msgstr "Täisekraanirežiim" -msgid "Print to PDF" -msgstr "Prindi PDF-i" +msgid "Edit this page" +msgstr "Muutke seda lehte" -msgid "Download this page" -msgstr "Laadige see leht alla" +msgid "By" +msgstr "Kõrval" msgid "Copyright" msgstr "Autoriõigus" -msgid "Last updated on" -msgstr "Viimati uuendatud" - -msgid "Launch" -msgstr "Käivitage" +msgid "Source repository" +msgstr "Allikahoidla" -msgid "Open an issue" -msgstr "Avage probleem" +msgid "previous page" +msgstr "eelmine leht" -msgid "Fullscreen mode" -msgstr "Täisekraanirežiim" +msgid "next page" +msgstr "järgmine leht" -msgid "Sphinx Book Theme" -msgstr "Sfinksiraamatu teema" +msgid "Toggle navigation" +msgstr "Lülita navigeerimine sisse" -msgid "Contents" -msgstr "Sisu" +msgid "repository" +msgstr "hoidla" -msgid "Edit this page" -msgstr "Muutke seda lehte" +msgid "suggest edit" +msgstr "soovita muuta" -msgid "next page" -msgstr "järgmine leht" +msgid "open issue" +msgstr "avatud küsimus" -msgid "Source repository" -msgstr "Allikahoidla" +msgid "Launch" +msgstr "Käivitage" -msgid "By" -msgstr "Kõrval" +msgid "Print to PDF" +msgstr "Prindi PDF-i" msgid "By the" msgstr "Autor" -msgid "previous page" -msgstr "eelmine leht" +msgid "Last updated on" +msgstr "Viimati uuendatud" + +msgid "Download source file" +msgstr "Laadige alla lähtefail" + +msgid "Download this page" +msgstr "Laadige see leht alla" diff --git a/_static/locales/fi/LC_MESSAGES/booktheme.po b/_static/locales/fi/LC_MESSAGES/booktheme.po index f58cf58d..d97a08dc 100644 --- a/_static/locales/fi/LC_MESSAGES/booktheme.po +++ b/_static/locales/fi/LC_MESSAGES/booktheme.po @@ -8,68 +8,68 @@ msgstr "" "Language: fi\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -msgid "Download source file" -msgstr "Lataa lähdetiedosto" - -msgid "suggest edit" -msgstr "ehdottaa muokkausta" +msgid "Theme by the" +msgstr "Teeman tekijä" -msgid "Toggle navigation" -msgstr "Vaihda navigointia" +msgid "Open an issue" +msgstr "Avaa ongelma" -msgid "open issue" -msgstr "avoin ongelma" +msgid "Contents" +msgstr "Sisällys" msgid "Download notebook file" msgstr "Lataa muistikirjatiedosto" -msgid "repository" -msgstr "arkisto" +msgid "Sphinx Book Theme" +msgstr "Sphinx-kirjan teema" -msgid "Theme by the" -msgstr "Teeman tekijä" +msgid "Fullscreen mode" +msgstr "Koko näytön tila" -msgid "Print to PDF" -msgstr "Tulosta PDF-tiedostoon" +msgid "Edit this page" +msgstr "Muokkaa tätä sivua" -msgid "Download this page" -msgstr "Lataa tämä sivu" +msgid "By" +msgstr "Tekijä" msgid "Copyright" msgstr "Tekijänoikeus" -msgid "Last updated on" -msgstr "Viimeksi päivitetty" - -msgid "Launch" -msgstr "Tuoda markkinoille" +msgid "Source repository" +msgstr "Lähteen arkisto" -msgid "Open an issue" -msgstr "Avaa ongelma" +msgid "previous page" +msgstr "Edellinen sivu" -msgid "Fullscreen mode" -msgstr "Koko näytön tila" +msgid "next page" +msgstr "seuraava sivu" -msgid "Sphinx Book Theme" -msgstr "Sphinx-kirjan teema" +msgid "Toggle navigation" +msgstr "Vaihda navigointia" -msgid "Contents" -msgstr "Sisällys" +msgid "repository" +msgstr "arkisto" -msgid "Edit this page" -msgstr "Muokkaa tätä sivua" +msgid "suggest edit" +msgstr "ehdottaa muokkausta" -msgid "next page" -msgstr "seuraava sivu" +msgid "open issue" +msgstr "avoin ongelma" -msgid "Source repository" -msgstr "Lähteen arkisto" +msgid "Launch" +msgstr "Tuoda markkinoille" -msgid "By" -msgstr "Tekijä" +msgid "Print to PDF" +msgstr "Tulosta PDF-tiedostoon" msgid "By the" msgstr "Mukaan" -msgid "previous page" -msgstr "Edellinen sivu" +msgid "Last updated on" +msgstr "Viimeksi päivitetty" + +msgid "Download source file" +msgstr "Lataa lähdetiedosto" + +msgid "Download this page" +msgstr "Lataa tämä sivu" diff --git a/_static/locales/fr/LC_MESSAGES/booktheme.po b/_static/locales/fr/LC_MESSAGES/booktheme.po index 8a6c9461..88f35173 100644 --- a/_static/locales/fr/LC_MESSAGES/booktheme.po +++ b/_static/locales/fr/LC_MESSAGES/booktheme.po @@ -8,68 +8,68 @@ msgstr "" "Language: fr\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -msgid "Download source file" -msgstr "Télécharger le fichier source" - -msgid "suggest edit" -msgstr "suggestion de modification" +msgid "Theme by the" +msgstr "Thème par le" -msgid "Toggle navigation" -msgstr "Basculer la navigation" +msgid "Open an issue" +msgstr "Ouvrez un problème" -msgid "open issue" -msgstr "signaler un problème" +msgid "Contents" +msgstr "Contenu" msgid "Download notebook file" msgstr "Télécharger le fichier notebook" -msgid "repository" -msgstr "dépôt" +msgid "Sphinx Book Theme" +msgstr "Thème du livre Sphinx" -msgid "Theme by the" -msgstr "Thème par le" +msgid "Fullscreen mode" +msgstr "Mode plein écran" -msgid "Print to PDF" -msgstr "Imprimer au format PDF" +msgid "Edit this page" +msgstr "Modifier cette page" -msgid "Download this page" -msgstr "Téléchargez cette page" +msgid "By" +msgstr "Par" msgid "Copyright" msgstr "droits d'auteur" -msgid "Last updated on" -msgstr "Dernière mise à jour le" - -msgid "Launch" -msgstr "lancement" +msgid "Source repository" +msgstr "Dépôt source" -msgid "Open an issue" -msgstr "Ouvrez un problème" +msgid "previous page" +msgstr "page précédente" -msgid "Fullscreen mode" -msgstr "Mode plein écran" +msgid "next page" +msgstr "page suivante" -msgid "Sphinx Book Theme" -msgstr "Thème du livre Sphinx" +msgid "Toggle navigation" +msgstr "Basculer la navigation" -msgid "Contents" -msgstr "Contenu" +msgid "repository" +msgstr "dépôt" -msgid "Edit this page" -msgstr "Modifier cette page" +msgid "suggest edit" +msgstr "suggestion de modification" -msgid "next page" -msgstr "page suivante" +msgid "open issue" +msgstr "signaler un problème" -msgid "Source repository" -msgstr "Dépôt source" +msgid "Launch" +msgstr "lancement" -msgid "By" -msgstr "Par" +msgid "Print to PDF" +msgstr "Imprimer au format PDF" msgid "By the" msgstr "Par le" -msgid "previous page" -msgstr "page précédente" +msgid "Last updated on" +msgstr "Dernière mise à jour le" + +msgid "Download source file" +msgstr "Télécharger le fichier source" + +msgid "Download this page" +msgstr "Téléchargez cette page" diff --git a/_static/locales/hr/LC_MESSAGES/booktheme.po b/_static/locales/hr/LC_MESSAGES/booktheme.po index 4ceb3899..fb9440ac 100644 --- a/_static/locales/hr/LC_MESSAGES/booktheme.po +++ b/_static/locales/hr/LC_MESSAGES/booktheme.po @@ -8,68 +8,68 @@ msgstr "" "Language: hr\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -msgid "Download source file" -msgstr "Preuzmi izvornu datoteku" - -msgid "suggest edit" -msgstr "predloži uređivanje" +msgid "Theme by the" +msgstr "Tema autora" -msgid "Toggle navigation" -msgstr "Uključi / isključi navigaciju" +msgid "Open an issue" +msgstr "Otvorite izdanje" -msgid "open issue" -msgstr "otvoreno izdanje" +msgid "Contents" +msgstr "Sadržaj" msgid "Download notebook file" msgstr "Preuzmi datoteku bilježnice" -msgid "repository" -msgstr "spremište" +msgid "Sphinx Book Theme" +msgstr "Tema knjige Sphinx" -msgid "Theme by the" -msgstr "Tema autora" +msgid "Fullscreen mode" +msgstr "Način preko cijelog zaslona" -msgid "Print to PDF" -msgstr "Ispis u PDF" +msgid "Edit this page" +msgstr "Uredite ovu stranicu" -msgid "Download this page" -msgstr "Preuzmite ovu stranicu" +msgid "By" +msgstr "Po" msgid "Copyright" msgstr "Autorska prava" -msgid "Last updated on" -msgstr "Posljednje ažuriranje:" - -msgid "Launch" -msgstr "Pokrenite" +msgid "Source repository" +msgstr "Izvorno spremište" -msgid "Open an issue" -msgstr "Otvorite izdanje" +msgid "previous page" +msgstr "Prethodna stranica" -msgid "Fullscreen mode" -msgstr "Način preko cijelog zaslona" +msgid "next page" +msgstr "sljedeća stranica" -msgid "Sphinx Book Theme" -msgstr "Tema knjige Sphinx" +msgid "Toggle navigation" +msgstr "Uključi / isključi navigaciju" -msgid "Contents" -msgstr "Sadržaj" +msgid "repository" +msgstr "spremište" -msgid "Edit this page" -msgstr "Uredite ovu stranicu" +msgid "suggest edit" +msgstr "predloži uređivanje" -msgid "next page" -msgstr "sljedeća stranica" +msgid "open issue" +msgstr "otvoreno izdanje" -msgid "Source repository" -msgstr "Izvorno spremište" +msgid "Launch" +msgstr "Pokrenite" -msgid "By" -msgstr "Po" +msgid "Print to PDF" +msgstr "Ispis u PDF" msgid "By the" msgstr "Od strane" -msgid "previous page" -msgstr "Prethodna stranica" +msgid "Last updated on" +msgstr "Posljednje ažuriranje:" + +msgid "Download source file" +msgstr "Preuzmi izvornu datoteku" + +msgid "Download this page" +msgstr "Preuzmite ovu stranicu" diff --git a/_static/locales/id/LC_MESSAGES/booktheme.po b/_static/locales/id/LC_MESSAGES/booktheme.po index 1eca5994..9ffb56f7 100644 --- a/_static/locales/id/LC_MESSAGES/booktheme.po +++ b/_static/locales/id/LC_MESSAGES/booktheme.po @@ -8,68 +8,68 @@ msgstr "" "Language: id\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -msgid "Download source file" -msgstr "Unduh file sumber" - -msgid "suggest edit" -msgstr "menyarankan edit" +msgid "Theme by the" +msgstr "Tema oleh" -msgid "Toggle navigation" -msgstr "Alihkan navigasi" +msgid "Open an issue" +msgstr "Buka masalah" -msgid "open issue" -msgstr "masalah terbuka" +msgid "Contents" +msgstr "Isi" msgid "Download notebook file" msgstr "Unduh file notebook" -msgid "repository" -msgstr "gudang" +msgid "Sphinx Book Theme" +msgstr "Tema Buku Sphinx" -msgid "Theme by the" -msgstr "Tema oleh" +msgid "Fullscreen mode" +msgstr "Mode layar penuh" -msgid "Print to PDF" -msgstr "Cetak ke PDF" +msgid "Edit this page" +msgstr "Edit halaman ini" -msgid "Download this page" -msgstr "Unduh halaman ini" +msgid "By" +msgstr "Oleh" msgid "Copyright" msgstr "hak cipta" -msgid "Last updated on" -msgstr "Terakhir diperbarui saat" - -msgid "Launch" -msgstr "Meluncurkan" +msgid "Source repository" +msgstr "Repositori sumber" -msgid "Open an issue" -msgstr "Buka masalah" +msgid "previous page" +msgstr "halaman sebelumnya" -msgid "Fullscreen mode" -msgstr "Mode layar penuh" +msgid "next page" +msgstr "halaman selanjutnya" -msgid "Sphinx Book Theme" -msgstr "Tema Buku Sphinx" +msgid "Toggle navigation" +msgstr "Alihkan navigasi" -msgid "Contents" -msgstr "Isi" +msgid "repository" +msgstr "gudang" -msgid "Edit this page" -msgstr "Edit halaman ini" +msgid "suggest edit" +msgstr "menyarankan edit" -msgid "next page" -msgstr "halaman selanjutnya" +msgid "open issue" +msgstr "masalah terbuka" -msgid "Source repository" -msgstr "Repositori sumber" +msgid "Launch" +msgstr "Meluncurkan" -msgid "By" -msgstr "Oleh" +msgid "Print to PDF" +msgstr "Cetak ke PDF" msgid "By the" msgstr "Oleh" -msgid "previous page" -msgstr "halaman sebelumnya" +msgid "Last updated on" +msgstr "Terakhir diperbarui saat" + +msgid "Download source file" +msgstr "Unduh file sumber" + +msgid "Download this page" +msgstr "Unduh halaman ini" diff --git a/_static/locales/it/LC_MESSAGES/booktheme.po b/_static/locales/it/LC_MESSAGES/booktheme.po index f3169000..04308dd2 100644 --- a/_static/locales/it/LC_MESSAGES/booktheme.po +++ b/_static/locales/it/LC_MESSAGES/booktheme.po @@ -8,68 +8,68 @@ msgstr "" "Language: it\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -msgid "Download source file" -msgstr "Scarica il file sorgente" - -msgid "suggest edit" -msgstr "suggerisci modifica" +msgid "Theme by the" +msgstr "Tema di" -msgid "Toggle navigation" -msgstr "Attiva / disattiva la navigazione" +msgid "Open an issue" +msgstr "Apri un problema" -msgid "open issue" -msgstr "questione aperta" +msgid "Contents" +msgstr "Contenuti" msgid "Download notebook file" msgstr "Scarica il file del taccuino" -msgid "repository" -msgstr "repository" +msgid "Sphinx Book Theme" +msgstr "Tema del libro della Sfinge" -msgid "Theme by the" -msgstr "Tema di" +msgid "Fullscreen mode" +msgstr "Modalità schermo intero" -msgid "Print to PDF" -msgstr "Stampa in PDF" +msgid "Edit this page" +msgstr "Modifica questa pagina" -msgid "Download this page" -msgstr "Scarica questa pagina" +msgid "By" +msgstr "Di" msgid "Copyright" msgstr "Diritto d'autore" -msgid "Last updated on" -msgstr "Ultimo aggiornamento il" - -msgid "Launch" -msgstr "Lanciare" +msgid "Source repository" +msgstr "Repository di origine" -msgid "Open an issue" -msgstr "Apri un problema" +msgid "previous page" +msgstr "pagina precedente" -msgid "Fullscreen mode" -msgstr "Modalità schermo intero" +msgid "next page" +msgstr "pagina successiva" -msgid "Sphinx Book Theme" -msgstr "Tema del libro della Sfinge" +msgid "Toggle navigation" +msgstr "Attiva / disattiva la navigazione" -msgid "Contents" -msgstr "Contenuti" +msgid "repository" +msgstr "repository" -msgid "Edit this page" -msgstr "Modifica questa pagina" +msgid "suggest edit" +msgstr "suggerisci modifica" -msgid "next page" -msgstr "pagina successiva" +msgid "open issue" +msgstr "questione aperta" -msgid "Source repository" -msgstr "Repository di origine" +msgid "Launch" +msgstr "Lanciare" -msgid "By" -msgstr "Di" +msgid "Print to PDF" +msgstr "Stampa in PDF" msgid "By the" msgstr "Dal" -msgid "previous page" -msgstr "pagina precedente" +msgid "Last updated on" +msgstr "Ultimo aggiornamento il" + +msgid "Download source file" +msgstr "Scarica il file sorgente" + +msgid "Download this page" +msgstr "Scarica questa pagina" diff --git a/_static/locales/iw/LC_MESSAGES/booktheme.po b/_static/locales/iw/LC_MESSAGES/booktheme.po index 9e6d753e..4ea190d3 100644 --- a/_static/locales/iw/LC_MESSAGES/booktheme.po +++ b/_static/locales/iw/LC_MESSAGES/booktheme.po @@ -8,68 +8,68 @@ msgstr "" "Language: iw\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -msgid "Download source file" -msgstr "הורד את קובץ המקור" - -msgid "suggest edit" -msgstr "מציע לערוך" +msgid "Theme by the" +msgstr "נושא מאת" -msgid "Toggle navigation" -msgstr "החלף ניווט" +msgid "Open an issue" +msgstr "פתח גיליון" -msgid "open issue" -msgstr "בעיה פתוחה" +msgid "Contents" +msgstr "תוכן" msgid "Download notebook file" msgstr "הורד קובץ מחברת" -msgid "repository" -msgstr "מאגר" +msgid "Sphinx Book Theme" +msgstr "נושא ספר ספינקס" -msgid "Theme by the" -msgstr "נושא מאת" +msgid "Fullscreen mode" +msgstr "מצב מסך מלא" -msgid "Print to PDF" -msgstr "הדפס לקובץ PDF" +msgid "Edit this page" +msgstr "ערוך דף זה" -msgid "Download this page" -msgstr "הורד דף זה" +msgid "By" +msgstr "על ידי" msgid "Copyright" msgstr "זכויות יוצרים" -msgid "Last updated on" -msgstr "עודכן לאחרונה ב" - -msgid "Launch" -msgstr "לְהַשִׁיק" +msgid "Source repository" +msgstr "מאגר המקורות" -msgid "Open an issue" -msgstr "פתח גיליון" +msgid "previous page" +msgstr "עמוד קודם" -msgid "Fullscreen mode" -msgstr "מצב מסך מלא" +msgid "next page" +msgstr "עמוד הבא" -msgid "Sphinx Book Theme" -msgstr "נושא ספר ספינקס" +msgid "Toggle navigation" +msgstr "החלף ניווט" -msgid "Contents" -msgstr "תוכן" +msgid "repository" +msgstr "מאגר" -msgid "Edit this page" -msgstr "ערוך דף זה" +msgid "suggest edit" +msgstr "מציע לערוך" -msgid "next page" -msgstr "עמוד הבא" +msgid "open issue" +msgstr "בעיה פתוחה" -msgid "Source repository" -msgstr "מאגר המקורות" +msgid "Launch" +msgstr "לְהַשִׁיק" -msgid "By" -msgstr "על ידי" +msgid "Print to PDF" +msgstr "הדפס לקובץ PDF" msgid "By the" msgstr "דרך" -msgid "previous page" -msgstr "עמוד קודם" +msgid "Last updated on" +msgstr "עודכן לאחרונה ב" + +msgid "Download source file" +msgstr "הורד את קובץ המקור" + +msgid "Download this page" +msgstr "הורד דף זה" diff --git a/_static/locales/ja/LC_MESSAGES/booktheme.po b/_static/locales/ja/LC_MESSAGES/booktheme.po index c1a31489..77d5a097 100644 --- a/_static/locales/ja/LC_MESSAGES/booktheme.po +++ b/_static/locales/ja/LC_MESSAGES/booktheme.po @@ -8,68 +8,68 @@ msgstr "" "Language: ja\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -msgid "Download source file" -msgstr "ソースファイルをダウンロード" - -msgid "suggest edit" -msgstr "編集を提案する" +msgid "Theme by the" +msgstr "のテーマ" -msgid "Toggle navigation" -msgstr "ナビゲーションを切り替え" +msgid "Open an issue" +msgstr "問題を報告" -msgid "open issue" -msgstr "未解決の問題" +msgid "Contents" +msgstr "目次" msgid "Download notebook file" msgstr "ノートブックファイルをダウンロード" -msgid "repository" -msgstr "リポジトリ" +msgid "Sphinx Book Theme" +msgstr "スフィンクスの本のテーマ" -msgid "Theme by the" -msgstr "のテーマ" +msgid "Fullscreen mode" +msgstr "全画面モード" -msgid "Print to PDF" -msgstr "PDFに印刷" +msgid "Edit this page" +msgstr "このページを編集" -msgid "Download this page" -msgstr "このページをダウンロード" +msgid "By" +msgstr "著者" msgid "Copyright" msgstr "Copyright" -msgid "Last updated on" -msgstr "最終更新日" - -msgid "Launch" -msgstr "起動" +msgid "Source repository" +msgstr "ソースリポジトリ" -msgid "Open an issue" -msgstr "問題を報告" +msgid "previous page" +msgstr "前のページ" -msgid "Fullscreen mode" -msgstr "全画面モード" +msgid "next page" +msgstr "次のページ" -msgid "Sphinx Book Theme" -msgstr "スフィンクスの本のテーマ" +msgid "Toggle navigation" +msgstr "ナビゲーションを切り替え" -msgid "Contents" -msgstr "目次" +msgid "repository" +msgstr "リポジトリ" -msgid "Edit this page" -msgstr "このページを編集" +msgid "suggest edit" +msgstr "編集を提案する" -msgid "next page" -msgstr "次のページ" +msgid "open issue" +msgstr "未解決の問題" -msgid "Source repository" -msgstr "ソースリポジトリ" +msgid "Launch" +msgstr "起動" -msgid "By" -msgstr "著者" +msgid "Print to PDF" +msgstr "PDFに印刷" msgid "By the" msgstr "によって" -msgid "previous page" -msgstr "前のページ" +msgid "Last updated on" +msgstr "最終更新日" + +msgid "Download source file" +msgstr "ソースファイルをダウンロード" + +msgid "Download this page" +msgstr "このページをダウンロード" diff --git a/_static/locales/ko/LC_MESSAGES/booktheme.po b/_static/locales/ko/LC_MESSAGES/booktheme.po index 80142313..6ee3d781 100644 --- a/_static/locales/ko/LC_MESSAGES/booktheme.po +++ b/_static/locales/ko/LC_MESSAGES/booktheme.po @@ -8,68 +8,68 @@ msgstr "" "Language: ko\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -msgid "Download source file" -msgstr "소스 파일 다운로드" - -msgid "suggest edit" -msgstr "편집 제안" +msgid "Theme by the" +msgstr "테마별" -msgid "Toggle navigation" -msgstr "탐색 전환" +msgid "Open an issue" +msgstr "이슈 열기" -msgid "open issue" -msgstr "열린 문제" +msgid "Contents" +msgstr "내용" msgid "Download notebook file" msgstr "노트북 파일 다운로드" -msgid "repository" -msgstr "저장소" +msgid "Sphinx Book Theme" +msgstr "스핑크스 도서 테마" -msgid "Theme by the" -msgstr "테마별" +msgid "Fullscreen mode" +msgstr "전체 화면으로보기" -msgid "Print to PDF" -msgstr "PDF로 인쇄" +msgid "Edit this page" +msgstr "이 페이지 편집" -msgid "Download this page" -msgstr "이 페이지 다운로드" +msgid "By" +msgstr "으로" msgid "Copyright" msgstr "저작권" -msgid "Last updated on" -msgstr "마지막 업데이트" - -msgid "Launch" -msgstr "시작하다" +msgid "Source repository" +msgstr "소스 저장소" -msgid "Open an issue" -msgstr "이슈 열기" +msgid "previous page" +msgstr "이전 페이지" -msgid "Fullscreen mode" -msgstr "전체 화면으로보기" +msgid "next page" +msgstr "다음 페이지" -msgid "Sphinx Book Theme" -msgstr "스핑크스 도서 테마" +msgid "Toggle navigation" +msgstr "탐색 전환" -msgid "Contents" -msgstr "내용" +msgid "repository" +msgstr "저장소" -msgid "Edit this page" -msgstr "이 페이지 편집" +msgid "suggest edit" +msgstr "편집 제안" -msgid "next page" -msgstr "다음 페이지" +msgid "open issue" +msgstr "열린 문제" -msgid "Source repository" -msgstr "소스 저장소" +msgid "Launch" +msgstr "시작하다" -msgid "By" -msgstr "으로" +msgid "Print to PDF" +msgstr "PDF로 인쇄" msgid "By the" msgstr "에 의해" -msgid "previous page" -msgstr "이전 페이지" +msgid "Last updated on" +msgstr "마지막 업데이트" + +msgid "Download source file" +msgstr "소스 파일 다운로드" + +msgid "Download this page" +msgstr "이 페이지 다운로드" diff --git a/_static/locales/lt/LC_MESSAGES/booktheme.po b/_static/locales/lt/LC_MESSAGES/booktheme.po index 2e6915a9..01be2679 100644 --- a/_static/locales/lt/LC_MESSAGES/booktheme.po +++ b/_static/locales/lt/LC_MESSAGES/booktheme.po @@ -8,68 +8,68 @@ msgstr "" "Language: lt\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -msgid "Download source file" -msgstr "Atsisiųsti šaltinio failą" - -msgid "suggest edit" -msgstr "pasiūlyti redaguoti" +msgid "Theme by the" +msgstr "Tema" -msgid "Toggle navigation" -msgstr "Perjungti naršymą" +msgid "Open an issue" +msgstr "Atidarykite problemą" -msgid "open issue" -msgstr "atviras klausimas" +msgid "Contents" +msgstr "Turinys" msgid "Download notebook file" msgstr "Atsisiųsti nešiojamojo kompiuterio failą" -msgid "repository" -msgstr "saugykla" +msgid "Sphinx Book Theme" +msgstr "Sfinkso knygos tema" -msgid "Theme by the" -msgstr "Tema" +msgid "Fullscreen mode" +msgstr "Pilno ekrano režimas" -msgid "Print to PDF" -msgstr "Spausdinti į PDF" +msgid "Edit this page" +msgstr "Redaguoti šį puslapį" -msgid "Download this page" -msgstr "Atsisiųskite šį puslapį" +msgid "By" +msgstr "Iki" msgid "Copyright" msgstr "Autorių teisės" -msgid "Last updated on" -msgstr "Paskutinį kartą atnaujinta" - -msgid "Launch" -msgstr "Paleiskite" +msgid "Source repository" +msgstr "Šaltinio saugykla" -msgid "Open an issue" -msgstr "Atidarykite problemą" +msgid "previous page" +msgstr "Ankstesnis puslapis" -msgid "Fullscreen mode" -msgstr "Pilno ekrano režimas" +msgid "next page" +msgstr "Kitas puslapis" -msgid "Sphinx Book Theme" -msgstr "Sfinkso knygos tema" +msgid "Toggle navigation" +msgstr "Perjungti naršymą" -msgid "Contents" -msgstr "Turinys" +msgid "repository" +msgstr "saugykla" -msgid "Edit this page" -msgstr "Redaguoti šį puslapį" +msgid "suggest edit" +msgstr "pasiūlyti redaguoti" -msgid "next page" -msgstr "Kitas puslapis" +msgid "open issue" +msgstr "atviras klausimas" -msgid "Source repository" -msgstr "Šaltinio saugykla" +msgid "Launch" +msgstr "Paleiskite" -msgid "By" -msgstr "Iki" +msgid "Print to PDF" +msgstr "Spausdinti į PDF" msgid "By the" msgstr "Prie" -msgid "previous page" -msgstr "Ankstesnis puslapis" +msgid "Last updated on" +msgstr "Paskutinį kartą atnaujinta" + +msgid "Download source file" +msgstr "Atsisiųsti šaltinio failą" + +msgid "Download this page" +msgstr "Atsisiųskite šį puslapį" diff --git a/_static/locales/lv/LC_MESSAGES/booktheme.po b/_static/locales/lv/LC_MESSAGES/booktheme.po index d4f4b150..993a1e41 100644 --- a/_static/locales/lv/LC_MESSAGES/booktheme.po +++ b/_static/locales/lv/LC_MESSAGES/booktheme.po @@ -8,68 +8,68 @@ msgstr "" "Language: lv\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -msgid "Download source file" -msgstr "Lejupielādēt avota failu" - -msgid "suggest edit" -msgstr "ieteikt rediģēt" +msgid "Theme by the" +msgstr "Autora tēma" -msgid "Toggle navigation" -msgstr "Pārslēgt navigāciju" +msgid "Open an issue" +msgstr "Atveriet problēmu" -msgid "open issue" -msgstr "atklāts jautājums" +msgid "Contents" +msgstr "Saturs" msgid "Download notebook file" msgstr "Lejupielādēt piezīmju grāmatiņu" -msgid "repository" -msgstr "krātuve" +msgid "Sphinx Book Theme" +msgstr "Sfinksa grāmatas tēma" -msgid "Theme by the" -msgstr "Autora tēma" +msgid "Fullscreen mode" +msgstr "Pilnekrāna režīms" -msgid "Print to PDF" -msgstr "Drukāt PDF formātā" +msgid "Edit this page" +msgstr "Rediģēt šo lapu" -msgid "Download this page" -msgstr "Lejupielādējiet šo lapu" +msgid "By" +msgstr "Autors" msgid "Copyright" msgstr "Autortiesības" -msgid "Last updated on" -msgstr "Pēdējoreiz atjaunināts" - -msgid "Launch" -msgstr "Uzsākt" +msgid "Source repository" +msgstr "Avota krātuve" -msgid "Open an issue" -msgstr "Atveriet problēmu" +msgid "previous page" +msgstr "iepriekšējā lapa" -msgid "Fullscreen mode" -msgstr "Pilnekrāna režīms" +msgid "next page" +msgstr "nākamā lapaspuse" -msgid "Sphinx Book Theme" -msgstr "Sfinksa grāmatas tēma" +msgid "Toggle navigation" +msgstr "Pārslēgt navigāciju" -msgid "Contents" -msgstr "Saturs" +msgid "repository" +msgstr "krātuve" -msgid "Edit this page" -msgstr "Rediģēt šo lapu" +msgid "suggest edit" +msgstr "ieteikt rediģēt" -msgid "next page" -msgstr "nākamā lapaspuse" +msgid "open issue" +msgstr "atklāts jautājums" -msgid "Source repository" -msgstr "Avota krātuve" +msgid "Launch" +msgstr "Uzsākt" -msgid "By" -msgstr "Autors" +msgid "Print to PDF" +msgstr "Drukāt PDF formātā" msgid "By the" msgstr "Ar" -msgid "previous page" -msgstr "iepriekšējā lapa" +msgid "Last updated on" +msgstr "Pēdējoreiz atjaunināts" + +msgid "Download source file" +msgstr "Lejupielādēt avota failu" + +msgid "Download this page" +msgstr "Lejupielādējiet šo lapu" diff --git a/_static/locales/ml/LC_MESSAGES/booktheme.po b/_static/locales/ml/LC_MESSAGES/booktheme.po index 5d8ed33b..81daf7c8 100644 --- a/_static/locales/ml/LC_MESSAGES/booktheme.po +++ b/_static/locales/ml/LC_MESSAGES/booktheme.po @@ -8,59 +8,59 @@ msgstr "" "Language: ml\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -msgid "Download source file" -msgstr "ഉറവിട ഫയൽ ഡൗൺലോഡുചെയ്യുക" - -msgid "suggest edit" -msgstr "എഡിറ്റുചെയ്യാൻ നിർദ്ദേശിക്കുക" - -msgid "Toggle navigation" -msgstr "നാവിഗേഷൻ ടോഗിൾ ചെയ്യുക" +msgid "Theme by the" +msgstr "പ്രമേയം" -msgid "open issue" -msgstr "തുറന്ന പ്രശ്നം" +msgid "Open an issue" +msgstr "ഒരു പ്രശ്നം തുറക്കുക" msgid "Download notebook file" msgstr "നോട്ട്ബുക്ക് ഫയൽ ഡൺലോഡ് ചെയ്യുക" -msgid "Theme by the" -msgstr "പ്രമേയം" +msgid "Sphinx Book Theme" +msgstr "സ്ഫിങ്ക്സ് പുസ്തക തീം" -msgid "Print to PDF" -msgstr "PDF- ലേക്ക് പ്രിന്റുചെയ്യുക" +msgid "Edit this page" +msgstr "ഈ പേജ് എഡിറ്റുചെയ്യുക" -msgid "Download this page" -msgstr "ഈ പേജ് ഡൗൺലോഡുചെയ്യുക" +msgid "By" +msgstr "എഴുതിയത്" msgid "Copyright" msgstr "പകർപ്പവകാശം" -msgid "Last updated on" -msgstr "അവസാനം അപ്‌ഡേറ്റുചെയ്‌തത്" +msgid "Source repository" +msgstr "ഉറവിട ശേഖരം" -msgid "Launch" -msgstr "സമാരംഭിക്കുക" +msgid "previous page" +msgstr "മുൻപത്തെ താൾ" -msgid "Open an issue" -msgstr "ഒരു പ്രശ്നം തുറക്കുക" +msgid "next page" +msgstr "അടുത്ത പേജ്" -msgid "Sphinx Book Theme" -msgstr "സ്ഫിങ്ക്സ് പുസ്തക തീം" +msgid "Toggle navigation" +msgstr "നാവിഗേഷൻ ടോഗിൾ ചെയ്യുക" -msgid "Edit this page" -msgstr "ഈ പേജ് എഡിറ്റുചെയ്യുക" +msgid "suggest edit" +msgstr "എഡിറ്റുചെയ്യാൻ നിർദ്ദേശിക്കുക" -msgid "next page" -msgstr "അടുത്ത പേജ്" +msgid "open issue" +msgstr "തുറന്ന പ്രശ്നം" -msgid "Source repository" -msgstr "ഉറവിട ശേഖരം" +msgid "Launch" +msgstr "സമാരംഭിക്കുക" -msgid "By" -msgstr "എഴുതിയത്" +msgid "Print to PDF" +msgstr "PDF- ലേക്ക് പ്രിന്റുചെയ്യുക" msgid "By the" msgstr "എഴുതിയത്" -msgid "previous page" -msgstr "മുൻപത്തെ താൾ" +msgid "Last updated on" +msgstr "അവസാനം അപ്‌ഡേറ്റുചെയ്‌തത്" + +msgid "Download source file" +msgstr "ഉറവിട ഫയൽ ഡൗൺലോഡുചെയ്യുക" + +msgid "Download this page" +msgstr "ഈ പേജ് ഡൗൺലോഡുചെയ്യുക" diff --git a/_static/locales/mr/LC_MESSAGES/booktheme.po b/_static/locales/mr/LC_MESSAGES/booktheme.po index 64389fac..fd857bff 100644 --- a/_static/locales/mr/LC_MESSAGES/booktheme.po +++ b/_static/locales/mr/LC_MESSAGES/booktheme.po @@ -8,59 +8,59 @@ msgstr "" "Language: mr\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -msgid "Download source file" -msgstr "स्त्रोत फाइल डाउनलोड करा" - -msgid "suggest edit" -msgstr "संपादन सुचवा" - -msgid "Toggle navigation" -msgstr "नेव्हिगेशन टॉगल करा" +msgid "Theme by the" +msgstr "द्वारा थीम" -msgid "open issue" -msgstr "खुला मुद्दा" +msgid "Open an issue" +msgstr "एक मुद्दा उघडा" msgid "Download notebook file" msgstr "नोटबुक फाईल डाउनलोड करा" -msgid "Theme by the" -msgstr "द्वारा थीम" +msgid "Sphinx Book Theme" +msgstr "स्फिंक्स बुक थीम" -msgid "Print to PDF" -msgstr "पीडीएफवर मुद्रित करा" +msgid "Edit this page" +msgstr "हे पृष्ठ संपादित करा" -msgid "Download this page" -msgstr "हे पृष्ठ डाउनलोड करा" +msgid "By" +msgstr "द्वारा" msgid "Copyright" msgstr "कॉपीराइट" -msgid "Last updated on" -msgstr "अखेरचे अद्यतनित" +msgid "Source repository" +msgstr "स्त्रोत भांडार" -msgid "Launch" -msgstr "लाँच करा" +msgid "previous page" +msgstr "मागील पान" -msgid "Open an issue" -msgstr "एक मुद्दा उघडा" +msgid "next page" +msgstr "पुढील पृष्ठ" -msgid "Sphinx Book Theme" -msgstr "स्फिंक्स बुक थीम" +msgid "Toggle navigation" +msgstr "नेव्हिगेशन टॉगल करा" -msgid "Edit this page" -msgstr "हे पृष्ठ संपादित करा" +msgid "suggest edit" +msgstr "संपादन सुचवा" -msgid "next page" -msgstr "पुढील पृष्ठ" +msgid "open issue" +msgstr "खुला मुद्दा" -msgid "Source repository" -msgstr "स्त्रोत भांडार" +msgid "Launch" +msgstr "लाँच करा" -msgid "By" -msgstr "द्वारा" +msgid "Print to PDF" +msgstr "पीडीएफवर मुद्रित करा" msgid "By the" msgstr "द्वारा" -msgid "previous page" -msgstr "मागील पान" +msgid "Last updated on" +msgstr "अखेरचे अद्यतनित" + +msgid "Download source file" +msgstr "स्त्रोत फाइल डाउनलोड करा" + +msgid "Download this page" +msgstr "हे पृष्ठ डाउनलोड करा" diff --git a/_static/locales/ms/LC_MESSAGES/booktheme.po b/_static/locales/ms/LC_MESSAGES/booktheme.po index 4365ff54..b616d70f 100644 --- a/_static/locales/ms/LC_MESSAGES/booktheme.po +++ b/_static/locales/ms/LC_MESSAGES/booktheme.po @@ -8,59 +8,59 @@ msgstr "" "Language: ms\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -msgid "Download source file" -msgstr "Muat turun fail sumber" - -msgid "suggest edit" -msgstr "cadangkan edit" - -msgid "Toggle navigation" -msgstr "Togol navigasi" +msgid "Theme by the" +msgstr "Tema oleh" -msgid "open issue" -msgstr "isu terbuka" +msgid "Open an issue" +msgstr "Buka masalah" msgid "Download notebook file" msgstr "Muat turun fail buku nota" -msgid "Theme by the" -msgstr "Tema oleh" +msgid "Sphinx Book Theme" +msgstr "Tema Buku Sphinx" -msgid "Print to PDF" -msgstr "Cetak ke PDF" +msgid "Edit this page" +msgstr "Edit halaman ini" -msgid "Download this page" -msgstr "Muat turun halaman ini" +msgid "By" +msgstr "Oleh" msgid "Copyright" msgstr "hak cipta" -msgid "Last updated on" -msgstr "Terakhir dikemas kini pada" +msgid "Source repository" +msgstr "Repositori sumber" -msgid "Launch" -msgstr "Lancarkan" +msgid "previous page" +msgstr "halaman sebelumnya" -msgid "Open an issue" -msgstr "Buka masalah" +msgid "next page" +msgstr "muka surat seterusnya" -msgid "Sphinx Book Theme" -msgstr "Tema Buku Sphinx" +msgid "Toggle navigation" +msgstr "Togol navigasi" -msgid "Edit this page" -msgstr "Edit halaman ini" +msgid "suggest edit" +msgstr "cadangkan edit" -msgid "next page" -msgstr "muka surat seterusnya" +msgid "open issue" +msgstr "isu terbuka" -msgid "Source repository" -msgstr "Repositori sumber" +msgid "Launch" +msgstr "Lancarkan" -msgid "By" -msgstr "Oleh" +msgid "Print to PDF" +msgstr "Cetak ke PDF" msgid "By the" msgstr "Oleh" -msgid "previous page" -msgstr "halaman sebelumnya" +msgid "Last updated on" +msgstr "Terakhir dikemas kini pada" + +msgid "Download source file" +msgstr "Muat turun fail sumber" + +msgid "Download this page" +msgstr "Muat turun halaman ini" diff --git a/_static/locales/nl/LC_MESSAGES/booktheme.po b/_static/locales/nl/LC_MESSAGES/booktheme.po index f7b18e5d..f16f4bcc 100644 --- a/_static/locales/nl/LC_MESSAGES/booktheme.po +++ b/_static/locales/nl/LC_MESSAGES/booktheme.po @@ -8,68 +8,68 @@ msgstr "" "Language: nl\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -msgid "Download source file" -msgstr "Download het bronbestand" - -msgid "suggest edit" -msgstr "suggereren bewerken" +msgid "Theme by the" +msgstr "Thema door de" -msgid "Toggle navigation" -msgstr "Schakel navigatie" +msgid "Open an issue" +msgstr "Open een probleem" -msgid "open issue" -msgstr "open probleem" +msgid "Contents" +msgstr "Inhoud" msgid "Download notebook file" msgstr "Download notebookbestand" -msgid "repository" -msgstr "repository" +msgid "Sphinx Book Theme" +msgstr "Sphinx-boekthema" -msgid "Theme by the" -msgstr "Thema door de" +msgid "Fullscreen mode" +msgstr "Volledig scherm" -msgid "Print to PDF" -msgstr "Afdrukken naar pdf" +msgid "Edit this page" +msgstr "bewerk deze pagina" -msgid "Download this page" -msgstr "Download deze pagina" +msgid "By" +msgstr "Door" msgid "Copyright" msgstr "auteursrechten" -msgid "Last updated on" -msgstr "Laatst geupdate op" - -msgid "Launch" -msgstr "Lancering" +msgid "Source repository" +msgstr "Bronopslagplaats" -msgid "Open an issue" -msgstr "Open een probleem" +msgid "previous page" +msgstr "vorige pagina" -msgid "Fullscreen mode" -msgstr "Volledig scherm" +msgid "next page" +msgstr "volgende bladzijde" -msgid "Sphinx Book Theme" -msgstr "Sphinx-boekthema" +msgid "Toggle navigation" +msgstr "Schakel navigatie" -msgid "Contents" -msgstr "Inhoud" +msgid "repository" +msgstr "repository" -msgid "Edit this page" -msgstr "bewerk deze pagina" +msgid "suggest edit" +msgstr "suggereren bewerken" -msgid "next page" -msgstr "volgende bladzijde" +msgid "open issue" +msgstr "open probleem" -msgid "Source repository" -msgstr "Bronopslagplaats" +msgid "Launch" +msgstr "Lancering" -msgid "By" -msgstr "Door" +msgid "Print to PDF" +msgstr "Afdrukken naar pdf" msgid "By the" msgstr "Door de" -msgid "previous page" -msgstr "vorige pagina" +msgid "Last updated on" +msgstr "Laatst geupdate op" + +msgid "Download source file" +msgstr "Download het bronbestand" + +msgid "Download this page" +msgstr "Download deze pagina" diff --git a/_static/locales/no/LC_MESSAGES/booktheme.po b/_static/locales/no/LC_MESSAGES/booktheme.po index 274823a8..b1d304ee 100644 --- a/_static/locales/no/LC_MESSAGES/booktheme.po +++ b/_static/locales/no/LC_MESSAGES/booktheme.po @@ -8,68 +8,68 @@ msgstr "" "Language: no\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -msgid "Download source file" -msgstr "Last ned kildefilen" - -msgid "suggest edit" -msgstr "foreslå redigering" +msgid "Theme by the" +msgstr "Tema av" -msgid "Toggle navigation" -msgstr "Bytt navigasjon" +msgid "Open an issue" +msgstr "Åpne et problem" -msgid "open issue" -msgstr "åpent nummer" +msgid "Contents" +msgstr "Innhold" msgid "Download notebook file" msgstr "Last ned notatbokfilen" -msgid "repository" -msgstr "oppbevaringssted" +msgid "Sphinx Book Theme" +msgstr "Sphinx boktema" -msgid "Theme by the" -msgstr "Tema av" +msgid "Fullscreen mode" +msgstr "Fullskjerm-modus" -msgid "Print to PDF" -msgstr "Skriv ut til PDF" +msgid "Edit this page" +msgstr "Rediger denne siden" -msgid "Download this page" -msgstr "Last ned denne siden" +msgid "By" +msgstr "Av" msgid "Copyright" msgstr "opphavsrett" -msgid "Last updated on" -msgstr "Sist oppdatert den" - -msgid "Launch" -msgstr "Start" +msgid "Source repository" +msgstr "Kildedepot" -msgid "Open an issue" -msgstr "Åpne et problem" +msgid "previous page" +msgstr "forrige side" -msgid "Fullscreen mode" -msgstr "Fullskjerm-modus" +msgid "next page" +msgstr "neste side" -msgid "Sphinx Book Theme" -msgstr "Sphinx boktema" +msgid "Toggle navigation" +msgstr "Bytt navigasjon" -msgid "Contents" -msgstr "Innhold" +msgid "repository" +msgstr "oppbevaringssted" -msgid "Edit this page" -msgstr "Rediger denne siden" +msgid "suggest edit" +msgstr "foreslå redigering" -msgid "next page" -msgstr "neste side" +msgid "open issue" +msgstr "åpent nummer" -msgid "Source repository" -msgstr "Kildedepot" +msgid "Launch" +msgstr "Start" -msgid "By" -msgstr "Av" +msgid "Print to PDF" +msgstr "Skriv ut til PDF" msgid "By the" msgstr "Ved" -msgid "previous page" -msgstr "forrige side" +msgid "Last updated on" +msgstr "Sist oppdatert den" + +msgid "Download source file" +msgstr "Last ned kildefilen" + +msgid "Download this page" +msgstr "Last ned denne siden" diff --git a/_static/locales/pl/LC_MESSAGES/booktheme.po b/_static/locales/pl/LC_MESSAGES/booktheme.po index dfba3f69..80d2c896 100644 --- a/_static/locales/pl/LC_MESSAGES/booktheme.po +++ b/_static/locales/pl/LC_MESSAGES/booktheme.po @@ -8,68 +8,68 @@ msgstr "" "Language: pl\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -msgid "Download source file" -msgstr "Pobierz plik źródłowy" - -msgid "suggest edit" -msgstr "zaproponuj edycję" +msgid "Theme by the" +msgstr "Motyw autorstwa" -msgid "Toggle navigation" -msgstr "Przełącz nawigację" +msgid "Open an issue" +msgstr "Otwórz problem" -msgid "open issue" -msgstr "otwarty problem" +msgid "Contents" +msgstr "Zawartość" msgid "Download notebook file" msgstr "Pobierz plik notatnika" -msgid "repository" -msgstr "magazyn" +msgid "Sphinx Book Theme" +msgstr "Motyw książki Sphinx" -msgid "Theme by the" -msgstr "Motyw autorstwa" +msgid "Fullscreen mode" +msgstr "Pełny ekran" -msgid "Print to PDF" -msgstr "Drukuj do PDF" +msgid "Edit this page" +msgstr "Edytuj tę strone" -msgid "Download this page" -msgstr "Pobierz tę stronę" +msgid "By" +msgstr "Przez" msgid "Copyright" msgstr "prawa autorskie" -msgid "Last updated on" -msgstr "Ostatnia aktualizacja" - -msgid "Launch" -msgstr "Uruchomić" +msgid "Source repository" +msgstr "Repozytorium źródłowe" -msgid "Open an issue" -msgstr "Otwórz problem" +msgid "previous page" +msgstr "Poprzednia strona" -msgid "Fullscreen mode" -msgstr "Pełny ekran" +msgid "next page" +msgstr "Następna strona" -msgid "Sphinx Book Theme" -msgstr "Motyw książki Sphinx" +msgid "Toggle navigation" +msgstr "Przełącz nawigację" -msgid "Contents" -msgstr "Zawartość" +msgid "repository" +msgstr "magazyn" -msgid "Edit this page" -msgstr "Edytuj tę strone" +msgid "suggest edit" +msgstr "zaproponuj edycję" -msgid "next page" -msgstr "Następna strona" +msgid "open issue" +msgstr "otwarty problem" -msgid "Source repository" -msgstr "Repozytorium źródłowe" +msgid "Launch" +msgstr "Uruchomić" -msgid "By" -msgstr "Przez" +msgid "Print to PDF" +msgstr "Drukuj do PDF" msgid "By the" msgstr "Przez" -msgid "previous page" -msgstr "Poprzednia strona" +msgid "Last updated on" +msgstr "Ostatnia aktualizacja" + +msgid "Download source file" +msgstr "Pobierz plik źródłowy" + +msgid "Download this page" +msgstr "Pobierz tę stronę" diff --git a/_static/locales/pt/LC_MESSAGES/booktheme.po b/_static/locales/pt/LC_MESSAGES/booktheme.po index 4c24eb9e..45ac847f 100644 --- a/_static/locales/pt/LC_MESSAGES/booktheme.po +++ b/_static/locales/pt/LC_MESSAGES/booktheme.po @@ -8,68 +8,68 @@ msgstr "" "Language: pt\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -msgid "Download source file" -msgstr "Baixar arquivo fonte" - -msgid "suggest edit" -msgstr "sugerir edição" +msgid "Theme by the" +msgstr "Tema por" -msgid "Toggle navigation" -msgstr "Alternar de navegação" +msgid "Open an issue" +msgstr "Abra um problema" -msgid "open issue" -msgstr "questão aberta" +msgid "Contents" +msgstr "Conteúdo" msgid "Download notebook file" msgstr "Baixar arquivo de notebook" -msgid "repository" -msgstr "repositório" +msgid "Sphinx Book Theme" +msgstr "Tema do livro Sphinx" -msgid "Theme by the" -msgstr "Tema por" +msgid "Fullscreen mode" +msgstr "Modo tela cheia" -msgid "Print to PDF" -msgstr "Imprimir em PDF" +msgid "Edit this page" +msgstr "Edite essa página" -msgid "Download this page" -msgstr "Baixe esta página" +msgid "By" +msgstr "De" msgid "Copyright" msgstr "direito autoral" -msgid "Last updated on" -msgstr "Última atualização em" - -msgid "Launch" -msgstr "Lançamento" +msgid "Source repository" +msgstr "Repositório fonte" -msgid "Open an issue" -msgstr "Abra um problema" +msgid "previous page" +msgstr "página anterior" -msgid "Fullscreen mode" -msgstr "Modo tela cheia" +msgid "next page" +msgstr "próxima página" -msgid "Sphinx Book Theme" -msgstr "Tema do livro Sphinx" +msgid "Toggle navigation" +msgstr "Alternar de navegação" -msgid "Contents" -msgstr "Conteúdo" +msgid "repository" +msgstr "repositório" -msgid "Edit this page" -msgstr "Edite essa página" +msgid "suggest edit" +msgstr "sugerir edição" -msgid "next page" -msgstr "próxima página" +msgid "open issue" +msgstr "questão aberta" -msgid "Source repository" -msgstr "Repositório fonte" +msgid "Launch" +msgstr "Lançamento" -msgid "By" -msgstr "De" +msgid "Print to PDF" +msgstr "Imprimir em PDF" msgid "By the" msgstr "Pelo" -msgid "previous page" -msgstr "página anterior" +msgid "Last updated on" +msgstr "Última atualização em" + +msgid "Download source file" +msgstr "Baixar arquivo fonte" + +msgid "Download this page" +msgstr "Baixe esta página" diff --git a/_static/locales/ro/LC_MESSAGES/booktheme.po b/_static/locales/ro/LC_MESSAGES/booktheme.po index 5f03d9cd..532b3b84 100644 --- a/_static/locales/ro/LC_MESSAGES/booktheme.po +++ b/_static/locales/ro/LC_MESSAGES/booktheme.po @@ -8,68 +8,68 @@ msgstr "" "Language: ro\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -msgid "Download source file" -msgstr "Descărcați fișierul sursă" - -msgid "suggest edit" -msgstr "sugerează editare" +msgid "Theme by the" +msgstr "Tema de" -msgid "Toggle navigation" -msgstr "Comutare navigare" +msgid "Open an issue" +msgstr "Deschideți o problemă" -msgid "open issue" -msgstr "problema deschisă" +msgid "Contents" +msgstr "Cuprins" msgid "Download notebook file" msgstr "Descărcați fișierul notebook" -msgid "repository" -msgstr "repertoriu" +msgid "Sphinx Book Theme" +msgstr "Tema Sphinx Book" -msgid "Theme by the" -msgstr "Tema de" +msgid "Fullscreen mode" +msgstr "Modul ecran întreg" -msgid "Print to PDF" -msgstr "Imprimați în PDF" +msgid "Edit this page" +msgstr "Editați această pagină" -msgid "Download this page" -msgstr "Descarcă această pagină" +msgid "By" +msgstr "De" msgid "Copyright" msgstr "Drepturi de autor" -msgid "Last updated on" -msgstr "Ultima actualizare la" - -msgid "Launch" -msgstr "Lansa" +msgid "Source repository" +msgstr "Depozit sursă" -msgid "Open an issue" -msgstr "Deschideți o problemă" +msgid "previous page" +msgstr "pagina anterioară" -msgid "Fullscreen mode" -msgstr "Modul ecran întreg" +msgid "next page" +msgstr "pagina următoare" -msgid "Sphinx Book Theme" -msgstr "Tema Sphinx Book" +msgid "Toggle navigation" +msgstr "Comutare navigare" -msgid "Contents" -msgstr "Cuprins" +msgid "repository" +msgstr "repertoriu" -msgid "Edit this page" -msgstr "Editați această pagină" +msgid "suggest edit" +msgstr "sugerează editare" -msgid "next page" -msgstr "pagina următoare" +msgid "open issue" +msgstr "problema deschisă" -msgid "Source repository" -msgstr "Depozit sursă" +msgid "Launch" +msgstr "Lansa" -msgid "By" -msgstr "De" +msgid "Print to PDF" +msgstr "Imprimați în PDF" msgid "By the" msgstr "Langa" -msgid "previous page" -msgstr "pagina anterioară" +msgid "Last updated on" +msgstr "Ultima actualizare la" + +msgid "Download source file" +msgstr "Descărcați fișierul sursă" + +msgid "Download this page" +msgstr "Descarcă această pagină" diff --git a/_static/locales/ru/LC_MESSAGES/booktheme.po b/_static/locales/ru/LC_MESSAGES/booktheme.po index 2886570d..b718b482 100644 --- a/_static/locales/ru/LC_MESSAGES/booktheme.po +++ b/_static/locales/ru/LC_MESSAGES/booktheme.po @@ -8,68 +8,68 @@ msgstr "" "Language: ru\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -msgid "Download source file" -msgstr "Скачать исходный файл" - -msgid "suggest edit" -msgstr "предложить редактировать" +msgid "Theme by the" +msgstr "Тема от" -msgid "Toggle navigation" -msgstr "Переключить навигацию" +msgid "Open an issue" +msgstr "Открыть вопрос" -msgid "open issue" -msgstr "открытый вопрос" +msgid "Contents" +msgstr "Содержание" msgid "Download notebook file" msgstr "Скачать файл записной книжки" -msgid "repository" -msgstr "хранилище" +msgid "Sphinx Book Theme" +msgstr "Тема книги Сфинкс" -msgid "Theme by the" -msgstr "Тема от" +msgid "Fullscreen mode" +msgstr "Полноэкранный режим" -msgid "Print to PDF" -msgstr "Распечатать в PDF" +msgid "Edit this page" +msgstr "Редактировать эту страницу" -msgid "Download this page" -msgstr "Загрузите эту страницу" +msgid "By" +msgstr "По" msgid "Copyright" msgstr "авторское право" -msgid "Last updated on" -msgstr "Последнее обновление" - -msgid "Launch" -msgstr "Запуск" +msgid "Source repository" +msgstr "Исходный репозиторий" -msgid "Open an issue" -msgstr "Открыть вопрос" +msgid "previous page" +msgstr "Предыдущая страница" -msgid "Fullscreen mode" -msgstr "Полноэкранный режим" +msgid "next page" +msgstr "Следующая страница" -msgid "Sphinx Book Theme" -msgstr "Тема книги Сфинкс" +msgid "Toggle navigation" +msgstr "Переключить навигацию" -msgid "Contents" -msgstr "Содержание" +msgid "repository" +msgstr "хранилище" -msgid "Edit this page" -msgstr "Редактировать эту страницу" +msgid "suggest edit" +msgstr "предложить редактировать" -msgid "next page" -msgstr "Следующая страница" +msgid "open issue" +msgstr "открытый вопрос" -msgid "Source repository" -msgstr "Исходный репозиторий" +msgid "Launch" +msgstr "Запуск" -msgid "By" -msgstr "По" +msgid "Print to PDF" +msgstr "Распечатать в PDF" msgid "By the" msgstr "Посредством" -msgid "previous page" -msgstr "Предыдущая страница" +msgid "Last updated on" +msgstr "Последнее обновление" + +msgid "Download source file" +msgstr "Скачать исходный файл" + +msgid "Download this page" +msgstr "Загрузите эту страницу" diff --git a/_static/locales/sk/LC_MESSAGES/booktheme.po b/_static/locales/sk/LC_MESSAGES/booktheme.po index 25517aa5..f6c423b6 100644 --- a/_static/locales/sk/LC_MESSAGES/booktheme.po +++ b/_static/locales/sk/LC_MESSAGES/booktheme.po @@ -8,68 +8,68 @@ msgstr "" "Language: sk\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -msgid "Download source file" -msgstr "Stiahnite si zdrojový súbor" - -msgid "suggest edit" -msgstr "navrhnúť úpravu" +msgid "Theme by the" +msgstr "Téma od" -msgid "Toggle navigation" -msgstr "Prepnúť navigáciu" +msgid "Open an issue" +msgstr "Otvorte problém" -msgid "open issue" -msgstr "otvorené vydanie" +msgid "Contents" +msgstr "Obsah" msgid "Download notebook file" msgstr "Stiahnite si zošit" -msgid "repository" -msgstr "Úložisko" +msgid "Sphinx Book Theme" +msgstr "Téma knihy Sfinga" -msgid "Theme by the" -msgstr "Téma od" +msgid "Fullscreen mode" +msgstr "Režim celej obrazovky" -msgid "Print to PDF" -msgstr "Tlač do PDF" +msgid "Edit this page" +msgstr "Upraviť túto stránku" -msgid "Download this page" -msgstr "Stiahnite si túto stránku" +msgid "By" +msgstr "Autor:" msgid "Copyright" msgstr "Autorské práva" -msgid "Last updated on" -msgstr "Posledná aktualizácia dňa" - -msgid "Launch" -msgstr "Spustiť" +msgid "Source repository" +msgstr "Zdrojové úložisko" -msgid "Open an issue" -msgstr "Otvorte problém" +msgid "previous page" +msgstr "predchádzajúca strana" -msgid "Fullscreen mode" -msgstr "Režim celej obrazovky" +msgid "next page" +msgstr "ďalšia strana" -msgid "Sphinx Book Theme" -msgstr "Téma knihy Sfinga" +msgid "Toggle navigation" +msgstr "Prepnúť navigáciu" -msgid "Contents" -msgstr "Obsah" +msgid "repository" +msgstr "Úložisko" -msgid "Edit this page" -msgstr "Upraviť túto stránku" +msgid "suggest edit" +msgstr "navrhnúť úpravu" -msgid "next page" -msgstr "ďalšia strana" +msgid "open issue" +msgstr "otvorené vydanie" -msgid "Source repository" -msgstr "Zdrojové úložisko" +msgid "Launch" +msgstr "Spustiť" -msgid "By" -msgstr "Autor:" +msgid "Print to PDF" +msgstr "Tlač do PDF" msgid "By the" msgstr "Podľa" -msgid "previous page" -msgstr "predchádzajúca strana" +msgid "Last updated on" +msgstr "Posledná aktualizácia dňa" + +msgid "Download source file" +msgstr "Stiahnite si zdrojový súbor" + +msgid "Download this page" +msgstr "Stiahnite si túto stránku" diff --git a/_static/locales/sl/LC_MESSAGES/booktheme.po b/_static/locales/sl/LC_MESSAGES/booktheme.po index 346c3648..9822dc58 100644 --- a/_static/locales/sl/LC_MESSAGES/booktheme.po +++ b/_static/locales/sl/LC_MESSAGES/booktheme.po @@ -8,68 +8,68 @@ msgstr "" "Language: sl\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -msgid "Download source file" -msgstr "Prenesite izvorno datoteko" - -msgid "suggest edit" -msgstr "predlagajte urejanje" +msgid "Theme by the" +msgstr "Tema avtorja" -msgid "Toggle navigation" -msgstr "Preklopi navigacijo" +msgid "Open an issue" +msgstr "Odprite številko" -msgid "open issue" -msgstr "odprto vprašanje" +msgid "Contents" +msgstr "Vsebina" msgid "Download notebook file" msgstr "Prenesite datoteko zvezka" -msgid "repository" -msgstr "odlagališče" +msgid "Sphinx Book Theme" +msgstr "Tema knjige Sphinx" -msgid "Theme by the" -msgstr "Tema avtorja" +msgid "Fullscreen mode" +msgstr "Celozaslonski način" -msgid "Print to PDF" -msgstr "Natisni v PDF" +msgid "Edit this page" +msgstr "Uredite to stran" -msgid "Download this page" -msgstr "Prenesite to stran" +msgid "By" +msgstr "Avtor" msgid "Copyright" msgstr "avtorske pravice" -msgid "Last updated on" -msgstr "Nazadnje posodobljeno dne" - -msgid "Launch" -msgstr "Kosilo" +msgid "Source repository" +msgstr "Izvorno skladišče" -msgid "Open an issue" -msgstr "Odprite številko" +msgid "previous page" +msgstr "Prejšnja stran" -msgid "Fullscreen mode" -msgstr "Celozaslonski način" +msgid "next page" +msgstr "Naslednja stran" -msgid "Sphinx Book Theme" -msgstr "Tema knjige Sphinx" +msgid "Toggle navigation" +msgstr "Preklopi navigacijo" -msgid "Contents" -msgstr "Vsebina" +msgid "repository" +msgstr "odlagališče" -msgid "Edit this page" -msgstr "Uredite to stran" +msgid "suggest edit" +msgstr "predlagajte urejanje" -msgid "next page" -msgstr "Naslednja stran" +msgid "open issue" +msgstr "odprto vprašanje" -msgid "Source repository" -msgstr "Izvorno skladišče" +msgid "Launch" +msgstr "Kosilo" -msgid "By" -msgstr "Avtor" +msgid "Print to PDF" +msgstr "Natisni v PDF" msgid "By the" msgstr "Avtor" -msgid "previous page" -msgstr "Prejšnja stran" +msgid "Last updated on" +msgstr "Nazadnje posodobljeno dne" + +msgid "Download source file" +msgstr "Prenesite izvorno datoteko" + +msgid "Download this page" +msgstr "Prenesite to stran" diff --git a/_static/locales/sr/LC_MESSAGES/booktheme.po b/_static/locales/sr/LC_MESSAGES/booktheme.po index b1a97ada..e809230c 100644 --- a/_static/locales/sr/LC_MESSAGES/booktheme.po +++ b/_static/locales/sr/LC_MESSAGES/booktheme.po @@ -8,68 +8,68 @@ msgstr "" "Language: sr\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -msgid "Download source file" -msgstr "Преузми изворну датотеку" - -msgid "suggest edit" -msgstr "предложи уређивање" +msgid "Theme by the" +msgstr "Тхеме би" -msgid "Toggle navigation" -msgstr "Укључи / искључи навигацију" +msgid "Open an issue" +msgstr "Отворите издање" -msgid "open issue" -msgstr "отворено издање" +msgid "Contents" +msgstr "Садржај" msgid "Download notebook file" msgstr "Преузмите датотеку бележнице" -msgid "repository" -msgstr "спремиште" +msgid "Sphinx Book Theme" +msgstr "Тема књиге Спхинк" -msgid "Theme by the" -msgstr "Тхеме би" +msgid "Fullscreen mode" +msgstr "Режим целог екрана" -msgid "Print to PDF" -msgstr "Испис у ПДФ" +msgid "Edit this page" +msgstr "Уредите ову страницу" -msgid "Download this page" -msgstr "Преузмите ову страницу" +msgid "By" +msgstr "Од стране" msgid "Copyright" msgstr "Ауторско право" -msgid "Last updated on" -msgstr "Последње ажурирање" - -msgid "Launch" -msgstr "Лансирање" +msgid "Source repository" +msgstr "Изворно спремиште" -msgid "Open an issue" -msgstr "Отворите издање" +msgid "previous page" +msgstr "Претходна страница" -msgid "Fullscreen mode" -msgstr "Режим целог екрана" +msgid "next page" +msgstr "Следећа страна" -msgid "Sphinx Book Theme" -msgstr "Тема књиге Спхинк" +msgid "Toggle navigation" +msgstr "Укључи / искључи навигацију" -msgid "Contents" -msgstr "Садржај" +msgid "repository" +msgstr "спремиште" -msgid "Edit this page" -msgstr "Уредите ову страницу" +msgid "suggest edit" +msgstr "предложи уређивање" -msgid "next page" -msgstr "Следећа страна" +msgid "open issue" +msgstr "отворено издање" -msgid "Source repository" -msgstr "Изворно спремиште" +msgid "Launch" +msgstr "Лансирање" -msgid "By" -msgstr "Од стране" +msgid "Print to PDF" +msgstr "Испис у ПДФ" msgid "By the" msgstr "Од" -msgid "previous page" -msgstr "Претходна страница" +msgid "Last updated on" +msgstr "Последње ажурирање" + +msgid "Download source file" +msgstr "Преузми изворну датотеку" + +msgid "Download this page" +msgstr "Преузмите ову страницу" diff --git a/_static/locales/sv/LC_MESSAGES/booktheme.po b/_static/locales/sv/LC_MESSAGES/booktheme.po index 8fc0146e..2421b001 100644 --- a/_static/locales/sv/LC_MESSAGES/booktheme.po +++ b/_static/locales/sv/LC_MESSAGES/booktheme.po @@ -8,68 +8,68 @@ msgstr "" "Language: sv\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -msgid "Download source file" -msgstr "Ladda ner källfil" - -msgid "suggest edit" -msgstr "föreslå ändring" +msgid "Theme by the" +msgstr "Tema av" -msgid "Toggle navigation" -msgstr "Växla navigering" +msgid "Open an issue" +msgstr "Öppna en problemrapport" -msgid "open issue" -msgstr "öppna problemrapport" +msgid "Contents" +msgstr "Innehåll" msgid "Download notebook file" msgstr "Ladda ner notebook-fil" -msgid "repository" -msgstr "repositorium" +msgid "Sphinx Book Theme" +msgstr "Sphinx Boktema" -msgid "Theme by the" -msgstr "Tema av" +msgid "Fullscreen mode" +msgstr "Fullskärmsläge" -msgid "Print to PDF" -msgstr "Skriv ut till PDF" +msgid "Edit this page" +msgstr "Redigera den här sidan" -msgid "Download this page" -msgstr "Ladda ner den här sidan" +msgid "By" +msgstr "Av" msgid "Copyright" msgstr "Upphovsrätt" -msgid "Last updated on" -msgstr "Senast uppdaterad den" - -msgid "Launch" -msgstr "Öppna" +msgid "Source repository" +msgstr "Källkodsrepositorium" -msgid "Open an issue" -msgstr "Öppna en problemrapport" +msgid "previous page" +msgstr "föregående sida" -msgid "Fullscreen mode" -msgstr "Fullskärmsläge" +msgid "next page" +msgstr "nästa sida" -msgid "Sphinx Book Theme" -msgstr "Sphinx Boktema" +msgid "Toggle navigation" +msgstr "Växla navigering" -msgid "Contents" -msgstr "Innehåll" +msgid "repository" +msgstr "repositorium" -msgid "Edit this page" -msgstr "Redigera den här sidan" +msgid "suggest edit" +msgstr "föreslå ändring" -msgid "next page" -msgstr "nästa sida" +msgid "open issue" +msgstr "öppna problemrapport" -msgid "Source repository" -msgstr "Källkodsrepositorium" +msgid "Launch" +msgstr "Öppna" -msgid "By" -msgstr "Av" +msgid "Print to PDF" +msgstr "Skriv ut till PDF" msgid "By the" msgstr "Av den" -msgid "previous page" -msgstr "föregående sida" +msgid "Last updated on" +msgstr "Senast uppdaterad den" + +msgid "Download source file" +msgstr "Ladda ner källfil" + +msgid "Download this page" +msgstr "Ladda ner den här sidan" diff --git a/_static/locales/ta/LC_MESSAGES/booktheme.po b/_static/locales/ta/LC_MESSAGES/booktheme.po index 116d7433..500042f4 100644 --- a/_static/locales/ta/LC_MESSAGES/booktheme.po +++ b/_static/locales/ta/LC_MESSAGES/booktheme.po @@ -8,59 +8,59 @@ msgstr "" "Language: ta\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -msgid "Download source file" -msgstr "மூல கோப்பைப் பதிவிறக்குக" - -msgid "suggest edit" -msgstr "திருத்த பரிந்துரைக்கவும்" - -msgid "Toggle navigation" -msgstr "வழிசெலுத்தலை நிலைமாற்று" +msgid "Theme by the" +msgstr "வழங்கிய தீம்" -msgid "open issue" -msgstr "திறந்த பிரச்சினை" +msgid "Open an issue" +msgstr "சிக்கலைத் திறக்கவும்" msgid "Download notebook file" msgstr "நோட்புக் கோப்பைப் பதிவிறக்கவும்" -msgid "Theme by the" -msgstr "வழங்கிய தீம்" +msgid "Sphinx Book Theme" +msgstr "ஸ்பிங்க்ஸ் புத்தக தீம்" -msgid "Print to PDF" -msgstr "PDF இல் அச்சிடுக" +msgid "Edit this page" +msgstr "இந்தப் பக்கத்தைத் திருத்தவும்" -msgid "Download this page" -msgstr "இந்தப் பக்கத்தைப் பதிவிறக்கவும்" +msgid "By" +msgstr "வழங்கியவர்" msgid "Copyright" msgstr "பதிப்புரிமை" -msgid "Last updated on" -msgstr "கடைசியாக புதுப்பிக்கப்பட்டது" +msgid "Source repository" +msgstr "மூல களஞ்சியம்" -msgid "Launch" -msgstr "தொடங்க" +msgid "previous page" +msgstr "முந்தைய பக்கம்" -msgid "Open an issue" -msgstr "சிக்கலைத் திறக்கவும்" +msgid "next page" +msgstr "அடுத்த பக்கம்" -msgid "Sphinx Book Theme" -msgstr "ஸ்பிங்க்ஸ் புத்தக தீம்" +msgid "Toggle navigation" +msgstr "வழிசெலுத்தலை நிலைமாற்று" -msgid "Edit this page" -msgstr "இந்தப் பக்கத்தைத் திருத்தவும்" +msgid "suggest edit" +msgstr "திருத்த பரிந்துரைக்கவும்" -msgid "next page" -msgstr "அடுத்த பக்கம்" +msgid "open issue" +msgstr "திறந்த பிரச்சினை" -msgid "Source repository" -msgstr "மூல களஞ்சியம்" +msgid "Launch" +msgstr "தொடங்க" -msgid "By" -msgstr "வழங்கியவர்" +msgid "Print to PDF" +msgstr "PDF இல் அச்சிடுக" msgid "By the" msgstr "மூலம்" -msgid "previous page" -msgstr "முந்தைய பக்கம்" +msgid "Last updated on" +msgstr "கடைசியாக புதுப்பிக்கப்பட்டது" + +msgid "Download source file" +msgstr "மூல கோப்பைப் பதிவிறக்குக" + +msgid "Download this page" +msgstr "இந்தப் பக்கத்தைப் பதிவிறக்கவும்" diff --git a/_static/locales/te/LC_MESSAGES/booktheme.po b/_static/locales/te/LC_MESSAGES/booktheme.po index 635bdf96..b1afebba 100644 --- a/_static/locales/te/LC_MESSAGES/booktheme.po +++ b/_static/locales/te/LC_MESSAGES/booktheme.po @@ -8,59 +8,59 @@ msgstr "" "Language: te\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -msgid "Download source file" -msgstr "మూల ఫైల్‌ను డౌన్‌లోడ్ చేయండి" - -msgid "suggest edit" -msgstr "సవరించమని సూచించండి" - -msgid "Toggle navigation" -msgstr "నావిగేషన్‌ను టోగుల్ చేయండి" +msgid "Theme by the" +msgstr "ద్వారా థీమ్" -msgid "open issue" -msgstr "ఓపెన్ ఇష్యూ" +msgid "Open an issue" +msgstr "సమస్యను తెరవండి" msgid "Download notebook file" msgstr "నోట్బుక్ ఫైల్ను డౌన్లోడ్ చేయండి" -msgid "Theme by the" -msgstr "ద్వారా థీమ్" +msgid "Sphinx Book Theme" +msgstr "సింహిక పుస్తక థీమ్" -msgid "Print to PDF" -msgstr "PDF కి ముద్రించండి" +msgid "Edit this page" +msgstr "ఈ పేజీని సవరించండి" -msgid "Download this page" -msgstr "ఈ పేజీని డౌన్‌లోడ్ చేయండి" +msgid "By" +msgstr "ద్వారా" msgid "Copyright" msgstr "కాపీరైట్" -msgid "Last updated on" -msgstr "చివరిగా నవీకరించబడింది" +msgid "Source repository" +msgstr "మూల రిపోజిటరీ" -msgid "Launch" -msgstr "ప్రారంభించండి" +msgid "previous page" +msgstr "ముందు పేజి" -msgid "Open an issue" -msgstr "సమస్యను తెరవండి" +msgid "next page" +msgstr "తరువాతి పేజీ" -msgid "Sphinx Book Theme" -msgstr "సింహిక పుస్తక థీమ్" +msgid "Toggle navigation" +msgstr "నావిగేషన్‌ను టోగుల్ చేయండి" -msgid "Edit this page" -msgstr "ఈ పేజీని సవరించండి" +msgid "suggest edit" +msgstr "సవరించమని సూచించండి" -msgid "next page" -msgstr "తరువాతి పేజీ" +msgid "open issue" +msgstr "ఓపెన్ ఇష్యూ" -msgid "Source repository" -msgstr "మూల రిపోజిటరీ" +msgid "Launch" +msgstr "ప్రారంభించండి" -msgid "By" -msgstr "ద్వారా" +msgid "Print to PDF" +msgstr "PDF కి ముద్రించండి" msgid "By the" msgstr "ద్వారా" -msgid "previous page" -msgstr "ముందు పేజి" +msgid "Last updated on" +msgstr "చివరిగా నవీకరించబడింది" + +msgid "Download source file" +msgstr "మూల ఫైల్‌ను డౌన్‌లోడ్ చేయండి" + +msgid "Download this page" +msgstr "ఈ పేజీని డౌన్‌లోడ్ చేయండి" diff --git a/_static/locales/tg/LC_MESSAGES/booktheme.po b/_static/locales/tg/LC_MESSAGES/booktheme.po index a92c069a..29b8237b 100644 --- a/_static/locales/tg/LC_MESSAGES/booktheme.po +++ b/_static/locales/tg/LC_MESSAGES/booktheme.po @@ -8,68 +8,68 @@ msgstr "" "Language: tg\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -msgid "Download source file" -msgstr "Файли манбаъро зеркашӣ кунед" - -msgid "suggest edit" -msgstr "пешниҳод вироиш" +msgid "Theme by the" +msgstr "Мавзӯъи аз" -msgid "Toggle navigation" -msgstr "Гузаришро иваз кунед" +msgid "Open an issue" +msgstr "Масъаларо кушоед" -msgid "open issue" -msgstr "барориши кушод" +msgid "Contents" +msgstr "Мундариҷа" msgid "Download notebook file" msgstr "Файли дафтарро зеркашӣ кунед" -msgid "repository" -msgstr "анбор" +msgid "Sphinx Book Theme" +msgstr "Сфинкс Мавзӯи китоб" -msgid "Theme by the" -msgstr "Мавзӯъи аз" +msgid "Fullscreen mode" +msgstr "Ҳолати экрани пурра" -msgid "Print to PDF" -msgstr "Чоп ба PDF" +msgid "Edit this page" +msgstr "Ин саҳифаро таҳрир кунед" -msgid "Download this page" -msgstr "Ин саҳифаро зеркашӣ кунед" +msgid "By" +msgstr "Бо" msgid "Copyright" msgstr "Ҳуқуқи муаллиф" -msgid "Last updated on" -msgstr "Last навсозӣ дар" - -msgid "Launch" -msgstr "Оғоз" +msgid "Source repository" +msgstr "Анбори манбаъ" -msgid "Open an issue" -msgstr "Масъаларо кушоед" +msgid "previous page" +msgstr "саҳифаи қаблӣ" -msgid "Fullscreen mode" -msgstr "Ҳолати экрани пурра" +msgid "next page" +msgstr "саҳифаи оянда" -msgid "Sphinx Book Theme" -msgstr "Сфинкс Мавзӯи китоб" +msgid "Toggle navigation" +msgstr "Гузаришро иваз кунед" -msgid "Contents" -msgstr "Мундариҷа" +msgid "repository" +msgstr "анбор" -msgid "Edit this page" -msgstr "Ин саҳифаро таҳрир кунед" +msgid "suggest edit" +msgstr "пешниҳод вироиш" -msgid "next page" -msgstr "саҳифаи оянда" +msgid "open issue" +msgstr "барориши кушод" -msgid "Source repository" -msgstr "Анбори манбаъ" +msgid "Launch" +msgstr "Оғоз" -msgid "By" -msgstr "Бо" +msgid "Print to PDF" +msgstr "Чоп ба PDF" msgid "By the" msgstr "Бо" -msgid "previous page" -msgstr "саҳифаи қаблӣ" +msgid "Last updated on" +msgstr "Last навсозӣ дар" + +msgid "Download source file" +msgstr "Файли манбаъро зеркашӣ кунед" + +msgid "Download this page" +msgstr "Ин саҳифаро зеркашӣ кунед" diff --git a/_static/locales/th/LC_MESSAGES/booktheme.po b/_static/locales/th/LC_MESSAGES/booktheme.po index 25d9837f..ac65ee05 100644 --- a/_static/locales/th/LC_MESSAGES/booktheme.po +++ b/_static/locales/th/LC_MESSAGES/booktheme.po @@ -8,68 +8,68 @@ msgstr "" "Language: th\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -msgid "Download source file" -msgstr "ดาวน์โหลดไฟล์ต้นฉบับ" - -msgid "suggest edit" -msgstr "แนะนำแก้ไข" - -msgid "Toggle navigation" -msgstr "ไม่ต้องสลับช่องทาง" +msgid "Theme by the" +msgstr "ธีมโดย" -msgid "open issue" +msgid "Open an issue" msgstr "เปิดปัญหา" +msgid "Contents" +msgstr "สารบัญ" + msgid "Download notebook file" msgstr "ดาวน์โหลดไฟล์สมุดบันทึก" -msgid "repository" -msgstr "ที่เก็บ" +msgid "Sphinx Book Theme" +msgstr "ธีมหนังสือสฟิงซ์" -msgid "Theme by the" -msgstr "ธีมโดย" +msgid "Fullscreen mode" +msgstr "โหมดเต็มหน้าจอ" -msgid "Print to PDF" -msgstr "พิมพ์เป็น PDF" +msgid "Edit this page" +msgstr "แก้ไขหน้านี้" -msgid "Download this page" -msgstr "ดาวน์โหลดหน้านี้" +msgid "By" +msgstr "โดย" msgid "Copyright" msgstr "ลิขสิทธิ์" -msgid "Last updated on" -msgstr "ปรับปรุงล่าสุดเมื่อ" - -msgid "Launch" -msgstr "เปิด" +msgid "Source repository" +msgstr "ที่เก็บซอร์ส" -msgid "Open an issue" -msgstr "เปิดปัญหา" +msgid "previous page" +msgstr "หน้าที่แล้ว" -msgid "Fullscreen mode" -msgstr "โหมดเต็มหน้าจอ" +msgid "next page" +msgstr "หน้าต่อไป" -msgid "Sphinx Book Theme" -msgstr "ธีมหนังสือสฟิงซ์" +msgid "Toggle navigation" +msgstr "ไม่ต้องสลับช่องทาง" -msgid "Contents" -msgstr "สารบัญ" +msgid "repository" +msgstr "ที่เก็บ" -msgid "Edit this page" -msgstr "แก้ไขหน้านี้" +msgid "suggest edit" +msgstr "แนะนำแก้ไข" -msgid "next page" -msgstr "หน้าต่อไป" +msgid "open issue" +msgstr "เปิดปัญหา" -msgid "Source repository" -msgstr "ที่เก็บซอร์ส" +msgid "Launch" +msgstr "เปิด" -msgid "By" -msgstr "โดย" +msgid "Print to PDF" +msgstr "พิมพ์เป็น PDF" msgid "By the" msgstr "โดย" -msgid "previous page" -msgstr "หน้าที่แล้ว" +msgid "Last updated on" +msgstr "ปรับปรุงล่าสุดเมื่อ" + +msgid "Download source file" +msgstr "ดาวน์โหลดไฟล์ต้นฉบับ" + +msgid "Download this page" +msgstr "ดาวน์โหลดหน้านี้" diff --git a/_static/locales/tl/LC_MESSAGES/booktheme.po b/_static/locales/tl/LC_MESSAGES/booktheme.po index 7e28b05f..662d66ca 100644 --- a/_static/locales/tl/LC_MESSAGES/booktheme.po +++ b/_static/locales/tl/LC_MESSAGES/booktheme.po @@ -8,59 +8,59 @@ msgstr "" "Language: tl\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -msgid "Download source file" -msgstr "Mag-download ng file ng pinagmulan" - -msgid "suggest edit" -msgstr "iminumungkahi i-edit" - -msgid "Toggle navigation" -msgstr "I-toggle ang pag-navigate" +msgid "Theme by the" +msgstr "Tema ng" -msgid "open issue" -msgstr "bukas na isyu" +msgid "Open an issue" +msgstr "Magbukas ng isyu" msgid "Download notebook file" msgstr "Mag-download ng file ng notebook" -msgid "Theme by the" -msgstr "Tema ng" +msgid "Sphinx Book Theme" +msgstr "Tema ng Sphinx Book" -msgid "Print to PDF" -msgstr "I-print sa PDF" +msgid "Edit this page" +msgstr "I-edit ang pahinang ito" -msgid "Download this page" -msgstr "I-download ang pahinang ito" +msgid "By" +msgstr "Ni" msgid "Copyright" msgstr "Copyright" -msgid "Last updated on" -msgstr "Huling na-update noong" +msgid "Source repository" +msgstr "Pinagmulan ng imbakan" -msgid "Launch" -msgstr "Ilunsad" +msgid "previous page" +msgstr "Nakaraang pahina" -msgid "Open an issue" -msgstr "Magbukas ng isyu" +msgid "next page" +msgstr "Susunod na pahina" -msgid "Sphinx Book Theme" -msgstr "Tema ng Sphinx Book" +msgid "Toggle navigation" +msgstr "I-toggle ang pag-navigate" -msgid "Edit this page" -msgstr "I-edit ang pahinang ito" +msgid "suggest edit" +msgstr "iminumungkahi i-edit" -msgid "next page" -msgstr "Susunod na pahina" +msgid "open issue" +msgstr "bukas na isyu" -msgid "Source repository" -msgstr "Pinagmulan ng imbakan" +msgid "Launch" +msgstr "Ilunsad" -msgid "By" -msgstr "Ni" +msgid "Print to PDF" +msgstr "I-print sa PDF" msgid "By the" msgstr "Sa pamamagitan ng" -msgid "previous page" -msgstr "Nakaraang pahina" +msgid "Last updated on" +msgstr "Huling na-update noong" + +msgid "Download source file" +msgstr "Mag-download ng file ng pinagmulan" + +msgid "Download this page" +msgstr "I-download ang pahinang ito" diff --git a/_static/locales/tr/LC_MESSAGES/booktheme.po b/_static/locales/tr/LC_MESSAGES/booktheme.po index 54d6f583..d1ae7233 100644 --- a/_static/locales/tr/LC_MESSAGES/booktheme.po +++ b/_static/locales/tr/LC_MESSAGES/booktheme.po @@ -8,68 +8,68 @@ msgstr "" "Language: tr\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -msgid "Download source file" -msgstr "Kaynak dosyayı indirin" - -msgid "suggest edit" -msgstr "düzenleme öner" +msgid "Theme by the" +msgstr "Tarafından tema" -msgid "Toggle navigation" -msgstr "Gezinmeyi değiştir" +msgid "Open an issue" +msgstr "Bir sorunu açın" -msgid "open issue" -msgstr "Açık konu" +msgid "Contents" +msgstr "İçindekiler" msgid "Download notebook file" msgstr "Defter dosyasını indirin" -msgid "repository" -msgstr "depo" +msgid "Sphinx Book Theme" +msgstr "Sfenks Kitap Teması" -msgid "Theme by the" -msgstr "Tarafından tema" +msgid "Fullscreen mode" +msgstr "Tam ekran modu" -msgid "Print to PDF" -msgstr "PDF olarak yazdır" +msgid "Edit this page" +msgstr "Bu sayfayı düzenle" -msgid "Download this page" -msgstr "Bu sayfayı indirin" +msgid "By" +msgstr "Tarafından" msgid "Copyright" msgstr "Telif hakkı" -msgid "Last updated on" -msgstr "Son güncelleme tarihi" - -msgid "Launch" -msgstr "Başlatmak" +msgid "Source repository" +msgstr "Kaynak kod deposu" -msgid "Open an issue" -msgstr "Bir sorunu açın" +msgid "previous page" +msgstr "önceki sayfa" -msgid "Fullscreen mode" -msgstr "Tam ekran modu" +msgid "next page" +msgstr "sonraki Sayfa" -msgid "Sphinx Book Theme" -msgstr "Sfenks Kitap Teması" +msgid "Toggle navigation" +msgstr "Gezinmeyi değiştir" -msgid "Contents" -msgstr "İçindekiler" +msgid "repository" +msgstr "depo" -msgid "Edit this page" -msgstr "Bu sayfayı düzenle" +msgid "suggest edit" +msgstr "düzenleme öner" -msgid "next page" -msgstr "sonraki Sayfa" +msgid "open issue" +msgstr "Açık konu" -msgid "Source repository" -msgstr "Kaynak kod deposu" +msgid "Launch" +msgstr "Başlatmak" -msgid "By" -msgstr "Tarafından" +msgid "Print to PDF" +msgstr "PDF olarak yazdır" msgid "By the" msgstr "Tarafından" -msgid "previous page" -msgstr "önceki sayfa" +msgid "Last updated on" +msgstr "Son güncelleme tarihi" + +msgid "Download source file" +msgstr "Kaynak dosyayı indirin" + +msgid "Download this page" +msgstr "Bu sayfayı indirin" diff --git a/_static/locales/uk/LC_MESSAGES/booktheme.po b/_static/locales/uk/LC_MESSAGES/booktheme.po index 6ecaec67..be49ab85 100644 --- a/_static/locales/uk/LC_MESSAGES/booktheme.po +++ b/_static/locales/uk/LC_MESSAGES/booktheme.po @@ -8,68 +8,68 @@ msgstr "" "Language: uk\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -msgid "Download source file" -msgstr "Завантажити вихідний файл" - -msgid "suggest edit" -msgstr "запропонувати редагувати" +msgid "Theme by the" +msgstr "Тема від" -msgid "Toggle navigation" -msgstr "Переключити навігацію" +msgid "Open an issue" +msgstr "Відкрийте випуск" -msgid "open issue" -msgstr "відкритий випуск" +msgid "Contents" +msgstr "Зміст" msgid "Download notebook file" msgstr "Завантажте файл блокнота" -msgid "repository" -msgstr "сховище" +msgid "Sphinx Book Theme" +msgstr "Тема книги \"Сфінкс\"" -msgid "Theme by the" -msgstr "Тема від" +msgid "Fullscreen mode" +msgstr "Повноекранний режим" -msgid "Print to PDF" -msgstr "Друк у форматі PDF" +msgid "Edit this page" +msgstr "Редагувати цю сторінку" -msgid "Download this page" -msgstr "Завантажте цю сторінку" +msgid "By" +msgstr "Автор" msgid "Copyright" msgstr "Авторське право" -msgid "Last updated on" -msgstr "Останнє оновлення:" - -msgid "Launch" -msgstr "Запуск" +msgid "Source repository" +msgstr "Джерело сховища" -msgid "Open an issue" -msgstr "Відкрийте випуск" +msgid "previous page" +msgstr "Попередня сторінка" -msgid "Fullscreen mode" -msgstr "Повноекранний режим" +msgid "next page" +msgstr "Наступна сторінка" -msgid "Sphinx Book Theme" -msgstr "Тема книги \"Сфінкс\"" +msgid "Toggle navigation" +msgstr "Переключити навігацію" -msgid "Contents" -msgstr "Зміст" +msgid "repository" +msgstr "сховище" -msgid "Edit this page" -msgstr "Редагувати цю сторінку" +msgid "suggest edit" +msgstr "запропонувати редагувати" -msgid "next page" -msgstr "Наступна сторінка" +msgid "open issue" +msgstr "відкритий випуск" -msgid "Source repository" -msgstr "Джерело сховища" +msgid "Launch" +msgstr "Запуск" -msgid "By" -msgstr "Автор" +msgid "Print to PDF" +msgstr "Друк у форматі PDF" msgid "By the" msgstr "По" -msgid "previous page" -msgstr "Попередня сторінка" +msgid "Last updated on" +msgstr "Останнє оновлення:" + +msgid "Download source file" +msgstr "Завантажити вихідний файл" + +msgid "Download this page" +msgstr "Завантажте цю сторінку" diff --git a/_static/locales/ur/LC_MESSAGES/booktheme.po b/_static/locales/ur/LC_MESSAGES/booktheme.po index 818e03de..94bcab33 100644 --- a/_static/locales/ur/LC_MESSAGES/booktheme.po +++ b/_static/locales/ur/LC_MESSAGES/booktheme.po @@ -8,59 +8,59 @@ msgstr "" "Language: ur\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -msgid "Download source file" -msgstr "سورس فائل ڈاؤن لوڈ کریں" - -msgid "suggest edit" -msgstr "ترمیم کی تجویز کریں" - -msgid "Toggle navigation" -msgstr "نیویگیشن ٹوگل کریں" +msgid "Theme by the" +msgstr "کے ذریعہ تھیم" -msgid "open issue" -msgstr "کھلا مسئلہ" +msgid "Open an issue" +msgstr "ایک مسئلہ کھولیں" msgid "Download notebook file" msgstr "نوٹ بک فائل ڈاؤن لوڈ کریں" -msgid "Theme by the" -msgstr "کے ذریعہ تھیم" +msgid "Sphinx Book Theme" +msgstr "سپنکس بک تھیم" -msgid "Print to PDF" -msgstr "پی ڈی ایف پرنٹ کریں" +msgid "Edit this page" +msgstr "اس صفحے میں ترمیم کریں" -msgid "Download this page" -msgstr "اس صفحے کو ڈاؤن لوڈ کریں" +msgid "By" +msgstr "بذریعہ" msgid "Copyright" msgstr "کاپی رائٹ" -msgid "Last updated on" -msgstr "آخری بار تازہ کاری ہوئی" +msgid "Source repository" +msgstr "ماخذ ذخیرہ" -msgid "Launch" -msgstr "لانچ کریں" +msgid "previous page" +msgstr "سابقہ ​​صفحہ" -msgid "Open an issue" -msgstr "ایک مسئلہ کھولیں" +msgid "next page" +msgstr "اگلا صفحہ" -msgid "Sphinx Book Theme" -msgstr "سپنکس بک تھیم" +msgid "Toggle navigation" +msgstr "نیویگیشن ٹوگل کریں" -msgid "Edit this page" -msgstr "اس صفحے میں ترمیم کریں" +msgid "suggest edit" +msgstr "ترمیم کی تجویز کریں" -msgid "next page" -msgstr "اگلا صفحہ" +msgid "open issue" +msgstr "کھلا مسئلہ" -msgid "Source repository" -msgstr "ماخذ ذخیرہ" +msgid "Launch" +msgstr "لانچ کریں" -msgid "By" -msgstr "بذریعہ" +msgid "Print to PDF" +msgstr "پی ڈی ایف پرنٹ کریں" msgid "By the" msgstr "کی طرف" -msgid "previous page" -msgstr "سابقہ ​​صفحہ" +msgid "Last updated on" +msgstr "آخری بار تازہ کاری ہوئی" + +msgid "Download source file" +msgstr "سورس فائل ڈاؤن لوڈ کریں" + +msgid "Download this page" +msgstr "اس صفحے کو ڈاؤن لوڈ کریں" diff --git a/_static/locales/vi/LC_MESSAGES/booktheme.po b/_static/locales/vi/LC_MESSAGES/booktheme.po index 59db2669..116236dc 100644 --- a/_static/locales/vi/LC_MESSAGES/booktheme.po +++ b/_static/locales/vi/LC_MESSAGES/booktheme.po @@ -8,68 +8,68 @@ msgstr "" "Language: vi\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -msgid "Download source file" -msgstr "Tải xuống tệp nguồn" - -msgid "suggest edit" -msgstr "đề nghị chỉnh sửa" +msgid "Theme by the" +msgstr "Chủ đề của" -msgid "Toggle navigation" -msgstr "Chuyển đổi điều hướng thành" +msgid "Open an issue" +msgstr "Mở một vấn đề" -msgid "open issue" -msgstr "vấn đề mở" +msgid "Contents" +msgstr "Nội dung" msgid "Download notebook file" msgstr "Tải xuống tệp sổ tay" -msgid "repository" -msgstr "kho" +msgid "Sphinx Book Theme" +msgstr "Chủ đề sách nhân sư" -msgid "Theme by the" -msgstr "Chủ đề của" +msgid "Fullscreen mode" +msgstr "Chế độ toàn màn hình" -msgid "Print to PDF" -msgstr "In sang PDF" +msgid "Edit this page" +msgstr "chỉnh sửa trang này" -msgid "Download this page" -msgstr "Tải xuống trang này" +msgid "By" +msgstr "Bởi" msgid "Copyright" msgstr "Bản quyền" -msgid "Last updated on" -msgstr "Cập nhật lần cuối vào" - -msgid "Launch" -msgstr "Phóng" +msgid "Source repository" +msgstr "Kho nguồn" -msgid "Open an issue" -msgstr "Mở một vấn đề" +msgid "previous page" +msgstr "trang trước" -msgid "Fullscreen mode" -msgstr "Chế độ toàn màn hình" +msgid "next page" +msgstr "Trang tiếp theo" -msgid "Sphinx Book Theme" -msgstr "Chủ đề sách nhân sư" +msgid "Toggle navigation" +msgstr "Chuyển đổi điều hướng thành" -msgid "Contents" -msgstr "Nội dung" +msgid "repository" +msgstr "kho" -msgid "Edit this page" -msgstr "chỉnh sửa trang này" +msgid "suggest edit" +msgstr "đề nghị chỉnh sửa" -msgid "next page" -msgstr "Trang tiếp theo" +msgid "open issue" +msgstr "vấn đề mở" -msgid "Source repository" -msgstr "Kho nguồn" +msgid "Launch" +msgstr "Phóng" -msgid "By" -msgstr "Bởi" +msgid "Print to PDF" +msgstr "In sang PDF" msgid "By the" msgstr "Bằng" -msgid "previous page" -msgstr "trang trước" +msgid "Last updated on" +msgstr "Cập nhật lần cuối vào" + +msgid "Download source file" +msgstr "Tải xuống tệp nguồn" + +msgid "Download this page" +msgstr "Tải xuống trang này" diff --git a/_static/locales/zh_CN/LC_MESSAGES/booktheme.po b/_static/locales/zh_CN/LC_MESSAGES/booktheme.po index e8d12dd7..4f4ab579 100644 --- a/_static/locales/zh_CN/LC_MESSAGES/booktheme.po +++ b/_static/locales/zh_CN/LC_MESSAGES/booktheme.po @@ -8,68 +8,68 @@ msgstr "" "Language: zh_CN\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -msgid "Download source file" -msgstr "下载源文件" - -msgid "suggest edit" -msgstr "提出修改建议" - -msgid "Toggle navigation" -msgstr "显示或隐藏导航栏" +msgid "Theme by the" +msgstr "主题作者:" -msgid "open issue" +msgid "Open an issue" msgstr "创建议题" +msgid "Contents" +msgstr "目录" + msgid "Download notebook file" msgstr "下载笔记本文件" -msgid "repository" -msgstr "仓库" +msgid "Sphinx Book Theme" +msgstr "Sphinx Book 主题" -msgid "Theme by the" -msgstr "主题作者:" +msgid "Fullscreen mode" +msgstr "全屏模式" -msgid "Print to PDF" -msgstr "列印成 PDF" +msgid "Edit this page" +msgstr "编辑此页面" -msgid "Download this page" -msgstr "下载此页面" +msgid "By" +msgstr "作者:" msgid "Copyright" msgstr "版权" -msgid "Last updated on" -msgstr "上次更新时间:" - -msgid "Launch" -msgstr "启动" +msgid "Source repository" +msgstr "源码库" -msgid "Open an issue" -msgstr "创建议题" +msgid "previous page" +msgstr "上一页" -msgid "Fullscreen mode" -msgstr "全屏模式" +msgid "next page" +msgstr "下一页" -msgid "Sphinx Book Theme" -msgstr "Sphinx Book 主题" +msgid "Toggle navigation" +msgstr "显示或隐藏导航栏" -msgid "Contents" -msgstr "目录" +msgid "repository" +msgstr "仓库" -msgid "Edit this page" -msgstr "编辑此页面" +msgid "suggest edit" +msgstr "提出修改建议" -msgid "next page" -msgstr "下一页" +msgid "open issue" +msgstr "创建议题" -msgid "Source repository" -msgstr "源码库" +msgid "Launch" +msgstr "启动" -msgid "By" -msgstr "作者:" +msgid "Print to PDF" +msgstr "列印成 PDF" msgid "By the" msgstr "作者:" -msgid "previous page" -msgstr "上一页" +msgid "Last updated on" +msgstr "上次更新时间:" + +msgid "Download source file" +msgstr "下载源文件" + +msgid "Download this page" +msgstr "下载此页面" diff --git a/_static/locales/zh_TW/LC_MESSAGES/booktheme.po b/_static/locales/zh_TW/LC_MESSAGES/booktheme.po index 0ed32f74..42b43b86 100644 --- a/_static/locales/zh_TW/LC_MESSAGES/booktheme.po +++ b/_static/locales/zh_TW/LC_MESSAGES/booktheme.po @@ -8,68 +8,68 @@ msgstr "" "Language: zh_TW\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -msgid "Download source file" -msgstr "下載原始檔" - -msgid "suggest edit" -msgstr "提出修改建議" +msgid "Theme by the" +msgstr "佈景主題作者:" -msgid "Toggle navigation" -msgstr "顯示或隱藏導覽列" +msgid "Open an issue" +msgstr "開啟議題" -msgid "open issue" -msgstr "公開的問題" +msgid "Contents" +msgstr "目錄" msgid "Download notebook file" msgstr "下載 Notebook 檔案" -msgid "repository" -msgstr "儲存庫" +msgid "Sphinx Book Theme" +msgstr "Sphinx Book 佈景主題" -msgid "Theme by the" -msgstr "佈景主題作者:" +msgid "Fullscreen mode" +msgstr "全螢幕模式" -msgid "Print to PDF" -msgstr "列印成 PDF" +msgid "Edit this page" +msgstr "編輯此頁面" -msgid "Download this page" -msgstr "下載此頁面" +msgid "By" +msgstr "作者:" msgid "Copyright" msgstr "Copyright" -msgid "Last updated on" -msgstr "最後更新時間:" - -msgid "Launch" -msgstr "啟動" +msgid "Source repository" +msgstr "來源儲存庫" -msgid "Open an issue" -msgstr "開啟議題" +msgid "previous page" +msgstr "上一頁" -msgid "Fullscreen mode" -msgstr "全螢幕模式" +msgid "next page" +msgstr "下一頁" -msgid "Sphinx Book Theme" -msgstr "Sphinx Book 佈景主題" +msgid "Toggle navigation" +msgstr "顯示或隱藏導覽列" -msgid "Contents" -msgstr "目錄" +msgid "repository" +msgstr "儲存庫" -msgid "Edit this page" -msgstr "編輯此頁面" +msgid "suggest edit" +msgstr "提出修改建議" -msgid "next page" -msgstr "下一頁" +msgid "open issue" +msgstr "公開的問題" -msgid "Source repository" -msgstr "來源儲存庫" +msgid "Launch" +msgstr "啟動" -msgid "By" -msgstr "作者:" +msgid "Print to PDF" +msgstr "列印成 PDF" msgid "By the" msgstr "作者:" -msgid "previous page" -msgstr "上一頁" +msgid "Last updated on" +msgstr "最後更新時間:" + +msgid "Download source file" +msgstr "下載原始檔" + +msgid "Download this page" +msgstr "下載此頁面" diff --git a/ans.html b/ans.html index 88e9c7a5..6cf7159d 100644 --- a/ans.html +++ b/ans.html @@ -168,6 +168,7 @@
      • compressai.entropy_models
      • compressai.latent_codecs
      • compressai.layers
      • +
      • compressai.losses
      • compressai.models
      • compressai.ops
      • compressai.transforms
      • diff --git a/cli_usage.html b/cli_usage.html index b762e371..4c69d639 100644 --- a/cli_usage.html +++ b/cli_usage.html @@ -167,6 +167,7 @@
      • compressai.entropy_models
      • compressai.latent_codecs
      • compressai.layers
      • +
      • compressai.losses
      • compressai.models
      • compressai.ops
      • compressai.transforms
      • @@ -359,7 +360,7 @@

        bench#< positional arguments: {} Select codec -optional arguments: +options: -h, --help show this help message and exit

    @@ -375,7 +376,7 @@

    eval_model#update_modelcompressai.entropy_models
  • compressai.latent_codecs
  • compressai.layers
  • +
  • compressai.losses
  • compressai.models
  • compressai.ops
  • compressai.transforms
  • diff --git a/datasets.html b/datasets.html index 2ae810d8..58ea4ebc 100644 --- a/datasets.html +++ b/datasets.html @@ -168,6 +168,7 @@
  • compressai.entropy_models
  • compressai.latent_codecs
  • compressai.layers
  • +
  • compressai.losses
  • compressai.models
  • compressai.ops
  • compressai.transforms
  • @@ -331,12 +332,42 @@

    Contents