diff --git a/CITATION.cff b/CITATION.cff new file mode 100644 index 0000000000000000000000000000000000000000..37db28b2badfdc4fd42ceaeb8aa301780d3b16f9 --- /dev/null +++ b/CITATION.cff @@ -0,0 +1,14 @@ +cff-version: 1.2.0 +title: "TorchVision: PyTorch's Computer Vision library" +message: >- + If you find TorchVision useful in your work, please + consider citing the following BibTeX entry. +type: software +authors: + - given-names: TorchVision maintainers and contributors +url: "https://github.com/pytorch/vision" +license: "BSD-3-Clause" +date-released: "2016-11-06" +journal: "GitHub repository" +publisher: "GitHub" +key: "torchvision2016" diff --git a/CMakeLists.txt b/CMakeLists.txt index 2dec2de88e7758231e95869ebf0dfd0edfaa70e3..2db9c1e274a85a9513bd58045f54133d88cb1e21 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,9 +1,12 @@ -cmake_minimum_required(VERSION 3.12) +cmake_minimum_required(VERSION 3.18) project(torchvision) -set(CMAKE_CXX_STANDARD 14) +set(CMAKE_CXX_STANDARD 17) file(STRINGS version.txt TORCHVISION_VERSION) option(WITH_CUDA "Enable CUDA support" OFF) +option(WITH_MPS "Enable MPS support" OFF) +option(WITH_PNG "Enable features requiring LibPNG." ON) +option(WITH_JPEG "Enable features requiring LibJPEG." ON) if(WITH_CUDA) enable_language(CUDA) @@ -12,11 +15,22 @@ if(WITH_CUDA) set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} --expt-relaxed-constexpr") endif() -find_package(Python3 COMPONENTS Development) +if(WITH_MPS) + enable_language(OBJC OBJCXX) + add_definitions(-DWITH_MPS) +endif() find_package(Torch REQUIRED) -find_package(PNG REQUIRED) -find_package(JPEG REQUIRED) + +if (WITH_PNG) + add_definitions(-DPNG_FOUND) + find_package(PNG REQUIRED) +endif() + +if (WITH_JPEG) + add_definitions(-DJPEG_FOUND) + find_package(JPEG REQUIRED) +endif() function(CUDA_CONVERT_FLAGS EXISTING_TARGET) get_property(old_flags TARGET ${EXISTING_TARGET} PROPERTY INTERFACE_COMPILE_OPTIONS) @@ -60,23 +74,49 @@ include(GNUInstallDirs) include(CMakePackageConfigHelpers) set(TVCPP torchvision/csrc) -list(APPEND ALLOW_LISTED ${TVCPP} ${TVCPP}/io/image ${TVCPP}/io/image/cpu ${TVCPP}/models ${TVCPP}/ops +list(APPEND ALLOW_LISTED ${TVCPP} ${TVCPP}/io/image ${TVCPP}/io/image/cpu ${TVCPP}/io/image/cpu/giflib ${TVCPP}/models ${TVCPP}/ops ${TVCPP}/ops/autograd ${TVCPP}/ops/cpu ${TVCPP}/io/image/cuda) if(WITH_CUDA) list(APPEND ALLOW_LISTED ${TVCPP}/ops/cuda ${TVCPP}/ops/autocast) endif() +if(WITH_MPS) + list(APPEND ALLOW_LISTED ${TVCPP}/ops/mps) +endif() FOREACH(DIR ${ALLOW_LISTED}) file(GLOB ALL_SOURCES ${ALL_SOURCES} ${DIR}/*.*) ENDFOREACH() add_library(${PROJECT_NAME} SHARED ${ALL_SOURCES}) -target_link_libraries(${PROJECT_NAME} PRIVATE ${TORCH_LIBRARIES} ${PNG_LIBRARY} ${JPEG_LIBRARIES} Python3::Python) +target_link_libraries(${PROJECT_NAME} PRIVATE ${TORCH_LIBRARIES}) + +if(WITH_MPS) + find_library(metal NAMES Metal) + find_library(foundation NAMES Foundation) + target_link_libraries(${PROJECT_NAME} PRIVATE ${metal} ${foundation}) +endif() + +if (WITH_PNG) + target_link_libraries(${PROJECT_NAME} PRIVATE ${PNG_LIBRARY}) +endif() + +if (WITH_JPEG) + target_link_libraries(${PROJECT_NAME} PRIVATE ${JPEG_LIBRARIES}) +endif() + set_target_properties(${PROJECT_NAME} PROPERTIES EXPORT_NAME TorchVision INSTALL_RPATH ${TORCH_INSTALL_PREFIX}/lib) -include_directories(torchvision/csrc ${JPEG_INCLUDE_DIRS} ${PNG_INCLUDE_DIRS}) +include_directories(torchvision/csrc) + +if (WITH_PNG) + include_directories(${PNG_INCLUDE_DIRS}) +endif() + +if (WITH_JPEG) + include_directories(${JPEG_INCLUDE_DIRS}) +endif() set(TORCHVISION_CMAKECONFIG_INSTALL_DIR "share/cmake/TorchVision" CACHE STRING "install path for TorchVisionConfig.cmake") diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 748dc50df9eee006cc7fe61e1e9f72737d6eb4a5..41ecd860055be2c98b50ab41655ca1a8bbd9100c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -4,22 +4,22 @@ We want to make contributing to this project as easy and transparent as possible ## TL;DR -We appreciate all contributions. If you are interested in contributing to Torchvision, there are many ways to help out. +We appreciate all contributions. If you are interested in contributing to Torchvision, there are many ways to help out. Your contributions may fall into the following categories: -- It helps the project if you could +- It helps the project if you could - Report issues you're facing - - Give a :+1: on issues that others reported and that are relevant to you + - Give a :+1: on issues that others reported and that are relevant to you - Answering queries on the issue tracker, investigating bugs are very valuable contributions to the project. -- You would like to improve the documentation. This is no less important than improving the library itself! +- You would like to improve the documentation. This is no less important than improving the library itself! If you find a typo in the documentation, do not hesitate to submit a GitHub pull request. - If you would like to fix a bug - please pick one from the [list of open issues labelled as "help wanted"](https://github.com/pytorch/vision/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22) - comment on the issue that you want to work on this issue - - send a PR with your fix, see below. + - send a PR with your fix, see below. - If you plan to contribute new features, utility functions or extensions, please first open an issue and discuss the feature with us. @@ -30,56 +30,116 @@ clear and has sufficient instructions to be able to reproduce the issue. ## Development installation -### Install PyTorch Nightly + +### Dependencies + +Start by installing the **nightly** build of PyTorch following the [official +instructions](https://pytorch.org/get-started/locally/). Note that the official +instructions may ask you to install torchvision itself. If you are doing development +on torchvision, you should not install prebuilt torchvision packages. + +**Optionally**, install `libpng` and `libjpeg-turbo` if you want to enable +support for +native encoding / decoding of PNG and JPEG formats in +[torchvision.io](https://pytorch.org/vision/stable/io.html#image): ```bash -conda install pytorch -c pytorch-nightly -c conda-forge -# or with pip (see https://pytorch.org/get-started/locally/) -# pip install numpy -# pip install --pre torch -f https://download.pytorch.org/whl/nightly/cu102/torch_nightly.html +conda install libpng libjpeg-turbo -c pytorch ``` -### Install Torchvision +Note: you can use the `TORCHVISION_INCLUDE` and `TORCHVISION_LIBRARY` +environment variables to tell the build system where to find those libraries if +they are in specific locations. Take a look at +[setup.py](https://github.com/pytorch/vision/blob/main/setup.py) for more +details. + +### Clone and install torchvision ```bash git clone https://github.com/pytorch/vision.git cd vision -python setup.py develop +python setup.py develop # use install instead of develop if you don't care about development. # or, for OSX # MACOSX_DEPLOYMENT_TARGET=10.9 CC=clang CXX=clang++ python setup.py develop -# for C++ debugging, please use DEBUG=1 +# for C++ debugging, use DEBUG=1 # DEBUG=1 python setup.py develop -pip install flake8 typing mypy pytest scipy ``` -You may also have to install `libpng-dev` and `libjpeg-turbo8-dev` libraries: -```bash -conda install libpng jpeg + +By default, GPU support is built if CUDA is found and `torch.cuda.is_available()` is true. It's possible to force +building GPU support by setting `FORCE_CUDA=1` environment variable, which is useful when building a docker image. + +We don't officially support building from source using `pip`, but _if_ you do, you'll need to use the +`--no-build-isolation` flag. + +#### Other development dependencies (some of these are needed to run tests): + +``` +pip install expecttest flake8 typing mypy pytest pytest-mock scipy requests ``` ## Development Process If you plan to modify the code or documentation, please follow the steps below: -1. Fork the repository and create your branch from `master`. +1. Fork the repository and create your branch from `main`. 2. If you have modified the code (new feature or bug-fix), please add unit tests. 3. If you have changed APIs, update the documentation. Make sure the documentation builds. 4. Ensure the test suite passes. -5. Make sure your code passes `flake8` formatting check. +5. Make sure your code passes the formatting checks (see below). -For more details about pull requests, -please read [GitHub's guides](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/creating-a-pull-request). +For more details about pull requests, +please read [GitHub's guides](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/creating-a-pull-request). -If you would like to contribute a new model, please see [here](#New-model). +If you would like to contribute a new model, please see [here](#New-architecture-or-improved-model-weights). -If you would like to contribute a new dataset, please see [here](#New-dataset). +If you would like to contribute a new dataset, please see [here](#New-dataset). ### Code formatting and typing -New code should be compatible with Python 3.X versions and be compliant with PEP8. To check the codebase, please run +#### Formatting + +The torchvision code is formatted by [black](https://black.readthedocs.io/en/stable/), +and checked against pep8 compliance with [flake8](https://flake8.pycqa.org/en/latest/). +Instead of relying directly on `black` however, we rely on +[ufmt](https://github.com/omnilib/ufmt), for compatibility reasons with Facebook +internal infrastructure. + +To format your code, install `ufmt` with `pip install ufmt==1.3.3 black==22.3.0 usort==1.0.2` and use e.g.: + ```bash -flake8 --config=setup.cfg . +ufmt format torchvision ``` +For the vast majority of cases, this is all you should need to run. For the +formatting to be a bit faster, you can also choose to only apply `ufmt` to the +files that were edited in your PR with e.g.: + +```bash +ufmt format `git diff main --name-only` +``` + +Similarly, you can check for `flake8` errors with `flake8 torchvision`, although +they should be fairly rare considering that most of the errors are automatically +taken care of by `ufmt` already. + +##### Pre-commit hooks + +For convenience and **purely optionally**, you can rely on [pre-commit +hooks](https://pre-commit.com/) which will run both `ufmt` and `flake8` prior to +every commit. + +First install the `pre-commit` package with `pip install pre-commit`, and then +run `pre-commit install` at the root of the repo for the hooks to be set up - +that's it. + +Feel free to read the [pre-commit docs](https://pre-commit.com/#usage) to learn +more and improve your workflow. You'll see for example that `pre-commit run +--all-files` will run both `ufmt` and `flake8` without the need for you to +commit anything, and that the `--no-verify` flag can be added to `git commit` to +temporarily deactivate the hooks. + +#### Type annotations + The codebase has type annotations, please make sure to add type hints if required. We use `mypy` tool for type checking: ```bash mypy --config-file mypy.ini @@ -87,8 +147,10 @@ mypy --config-file mypy.ini ### Unit tests -If you have modified the code by adding a new feature or a bug-fix, please add unit tests for that. To run a specific -test: +Before running tests make sure to install [test dependencies](#other-development-dependencies-some-of-these-are-needed-to-run-tests). + +If you have modified the code by adding a new feature or a bug-fix, please add unit tests for that. To run a specific +test: ```bash pytest test/ -vvv -k # e.g. pytest test/test_transforms.py -vvv -k test_center_crop @@ -97,7 +159,7 @@ pytest test/ -vvv -k If you would like to run all tests: ```bash pytest test -vvv -``` +``` Tests that require internet access should be in `test/test_internet.py`. @@ -120,7 +182,7 @@ pip install -r requirements.txt ```bash cd docs -make html +make html-noplot ``` Then open `docs/build/html/index.html` in your favorite browser. @@ -134,38 +196,39 @@ clean``. #### Building the example gallery - or not -When you run ``make html`` for the first time, all the examples in the gallery -will be built. Subsequent builds should be faster, and will only build the -examples that have been modified. +In most cases, running `make html-noplot` is enough to build the docs for your +specific use-case. The `noplot` part tells sphinx **not** to build the examples +in the [gallery](https://pytorch.org/vision/stable/auto_examples/index.html), +which saves a lot of building time. -You can run ``make html-noplot`` to not build the examples at all. This is -useful after a ``make clean`` to do some quick checks that are not related to -the examples. +If you need to build all the examples in the gallery, then you can use `make +html`. You can also choose to only build a subset of the examples by using the ``EXAMPLES_PATTERN`` env variable, which accepts a regular expression. For example ``EXAMPLES_PATTERN="transforms" make html`` will only build the examples with "transforms" in their name. -### New model +### New architecture or improved model weights + +Please refer to the guidelines in [Contributing to Torchvision - Models](https://github.com/pytorch/vision/blob/main/CONTRIBUTING_MODELS.md). -More details on how to add a new model will be provided later. Please, do not send any PR with a new model without discussing -it in an issue as, most likely, it will not be accepted. - ### New dataset -More details on how to add a new dataset will be provided later. Please, do not send any PR with a new dataset without discussing +Please, do not send any PR with a new dataset without discussing it in an issue as, most likely, it will not be accepted. ### Pull Request -If all previous checks (flake8, mypy, unit tests) are passing, please send a PR. Submitted PR will pass other tests on -different operation systems, python versions and hardwares. +If all previous checks (flake8, mypy, unit tests) are passing, please send a PR. Submitted PR will pass other tests on +different operating systems, python versions and hardware. -For more details about pull requests workflow, +For more details about pull requests workflow, please read [GitHub's guides](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/creating-a-pull-request). ## License By contributing to Torchvision, you agree that your contributions will be licensed under the LICENSE file in the root directory of this source tree. + +Contributors are also required to [sign our Contributor License Agreement](https://code.facebook.com/cla). diff --git a/CONTRIBUTING_MODELS.md b/CONTRIBUTING_MODELS.md new file mode 100644 index 0000000000000000000000000000000000000000..390a25a0f8985767e8a9e39c43f6ad372befd1ca --- /dev/null +++ b/CONTRIBUTING_MODELS.md @@ -0,0 +1,65 @@ +# Contributing to Torchvision - Models + +- [New Model Architectures - Overview](#new-model-architectures---overview) + +- [New Weights for Existing Model Architectures](#new-weights-for-existing-model-architectures) + +## New Model Architectures - Overview + +For someone who would be interested in adding a model architecture, it is also expected to train the model, so here are a few important considerations: + +- Training big models requires lots of resources and the cost quickly adds up + +- Reproducing models is fun but also risky as you might not always get the results reported on the paper. It might require a huge amount of effort to close the gap + +- The contribution might not get merged if we significantly lack in terms of accuracy, speed etc + +- Including new models in TorchVision might not be the best approach, so other options such as releasing the model through to [Pytorch Hub](https://pytorch.org/hub/) should be considered + +So, before starting any work and submitting a PR there are a few critical things that need to be taken into account in order to make sure the planned contribution is within the context of TorchVision, and the requirements and expectations are discussed beforehand. If this step is skipped and a PR is submitted without prior discussion it will almost certainly be rejected. + +### 1. Preparation work + +- Start by looking into this [issue](https://github.com/pytorch/vision/issues/2707) in order to have an idea of the models that are being considered, express your willingness to add a new model and discuss with the community whether this model should be included in TorchVision. It is very important at this stage to make sure that there is an agreement on the value of having this model in TorchVision and there is no one else already working on it. + +- If the decision is to include the new model, then please create a new ticket which will be used for all design and implementation discussions prior to the PR. One of the TorchVision maintainers will reach out at this stage and this will be your POC from this point onwards in order to provide support, guidance and regular feedback. + +### 2. Implement the model + +Please take a look at existing models in TorchVision to get familiar with the idioms. Also, please look at recent contributions for new models. If in doubt about any design decisions you can ask for feedback on the issue created in step 1. Example of things to take into account: + +- The implementation should be as close as possible to the canonical implementation/paper +- The PR must include the code implementation, documentation and tests +- It should also extend the existing reference scripts used to train the model +- The weights need to reproduce closely the results of the paper in terms of accuracy, even though the final weights to be deployed will be those trained by the TorchVision maintainers +- The PR description should include commands/configuration used to train the model, so that the TorchVision maintainers can easily run them to verify the implementation and generate the final model to be released +- Make sure we re-use existing components as much as possible (inheritance) +- New primitives (transforms, losses, etc.) can be added if necessary, but the final location will be determined after discussion with the dedicated maintainer +- Please take a look at the detailed [implementation and documentation guidelines](https://github.com/pytorch/vision/issues/5319) for a fine grain list of things not to be missed + +### 3. Train the model with reference scripts + +To validate the new model against the common benchmark, as well as to generate pre-trained weights, you must use TorchVision’s reference scripts to train the model. + +Make sure all logs and a final (or best) checkpoint are saved, because it is expected that a submission shows that a model has been successfully trained and the results are in line with the original paper/repository. This will allow the reviewers to quickly check the validity of the submission, but please note that the final model to be released will be re-trained by the maintainers in order to verify reproducibility, ensure that the changes occurred during the PR review did not introduce any bugs, and to avoid moving around a large amount of data (including all checkpoints and logs). + +### 4. Submit a PR + +Submit a PR and tag the assigned maintainer. This PR should: + +- Link the original ticket +- Provide a link for the original paper and the original repository if available +- Highlight the important test metrics and how they compare to the original paper +- Highlight any design choices that deviate from the original paper/implementation and rationale for these choices + +## New Weights for Existing Model Architectures + +The process of improving existing models, for instance improving accuracy by retraining the model with a different set of hyperparameters or augmentations, is the following: + +1. Open a ticket and discuss with the community and maintainers whether this improvement should be added to TorchVision. Note that to add new weights the improvement should be significant. + +2. Train the model using TorchVision reference scripts. You can add new primitives (transforms, losses, etc) when necessary, but the final location will be determined after discussion with the dedicated maintainer. + +3. Open a PR with the new weights, together with the training logs and the checkpoint chosen so the reviewers can verify the submission. Details on how the model was trained, i.e., the training command using the reference scripts, should be included in the PR. + +4. The PR reviewers should replicate the results on their side to verify the submission and if all goes well the new weights should be ready to be released! diff --git a/MANIFEST.in b/MANIFEST.in index 75f238c0a2c97812ebe5fdf3e2b43667c7c7f6af..9e45188df355dac6e7e8e3657cd48959f8a2d968 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,4 +1,4 @@ -include README.rst +include README.md include LICENSE recursive-exclude * __pycache__ diff --git a/README.md b/README.md new file mode 100644 index 0000000000000000000000000000000000000000..461088499ab15e879e27c27562aae019e01de1e6 --- /dev/null +++ b/README.md @@ -0,0 +1,86 @@ +#
VISION
+## 简介 +torchvision 软件包由常用的数据集、模型架构和计算机视觉的常见图像转换组成。 + +## 安装 +组件支持组合 + + | PyTorch版本 | fastpt版本 |vision版本 | DTK版本 | Python版本 | 推荐编译方式 | + | ----------- | ----------- | ----------- | ------------------------ | -----------------| ------------ | + | 2.5.1 | 2.1.0 |v0.19.1 | >= 25.04 | 3.8、3.10、3.11 | fastpt不转码 | + | 2.4.1 | 2.0.1 |v0.19.1 | >= 25.04 | 3.8、3.10、3.11 | fastpt不转码 | + | 其他 | 其他 | 其他 | 其他 | 3.8、3.10、3.11 | hip转码 | + ++ pytorch版本大于2.4.1 && dtk版本大于25.04 推荐使用fastpt不转码编译。 + +### 1、使用pip方式安装 +vision whl包下载目录:[光和开发者社区](https://download.sourcefind.cn:65024/4/main/vision),选择对应的pytorch版本和python版本下载对应vision的whl包 +```shell +pip install torch* (下载torch的whl包) +pip install fastpt* --no-deps (下载fastpt的whl包) +source /usr/local/bin/fastpt -E +pip install torchvision* (下载的vision-fastpt的whl包) +``` +### 2、使用源码编译方式安装 + +#### 相关依赖问题 +可通过conda或源码编译安装libpng/libjpeg +```shell + conda install libpng + conda install jpeg +``` +libpng和libjpeg必须在编译时可用,确保它在标准库位置可用,否则,分别在环境变量TORCHVISION_INCLUDE和TORCHVISION_LIBRARY中添加头文件路径和库路径。 +```shell + pip3 install pybind11 + pip3 install 'numpy<=1.24.3' + pip3 install 'urllib3==1.26.14' + pip3 install requests + pip3 install wheel +``` + +#### 编译环境准备 +提供基于fastpt不转码编译: + +1. 基于光源pytorch基础镜像环境:镜像下载地址:[光合开发者社区](https://sourcefind.cn/#/image/dcu/pytorch),根据pytorch、python、dtk及系统下载对应的镜像版本。 + +2. 基于现有python环境:安装pytorch,fastpt whl包下载目录:[光合开发者社区](https://sourcefind.cn/#/image/dcu/pytorch),根据python、dtk版本,下载对应pytorch的whl包。安装命令如下: +```shell +pip install torch* (下载torch的whl包) +pip install fastpt* --no-deps (下载fastpt的whl包, 安装顺序,先安装torch,后安装fastpt) +``` + +#### 源码编译安装 +- 代码下载 +```shell +git clone http://developer.sourcefind.cn/codes/OpenDAS/vision.git # 根据编译需要切换分支 +``` + +- 提供源码编译方式(进入vision目录): +```shell +1. 设置不转码编译环境变量 +export FORCE_CUDA=1 +source /usr/local/bin/fastpt -C +``` +2. 编译whl包并安装 +```shell +python3 setup.py -v bdist_wheel +pip install dist/torchvision* +``` +3. 源码编译安装 +```shell +python3 setup.py install +``` +#### 注意事项 ++ 若使用pip install下载安装过慢,可添加pypi清华源:-i https://pypi.tuna.tsinghua.edu.cn/simple/ ++ ROCM_PATH为dtk的路径,默认为/opt/dtk + +## 验证 + +- python -c "import torchvision; torchvision.\_\_version__",版本号与官方版本同步,查询该软件的版本号,例如v0.19.1; + +## Known issue +- 无 + +## 参考资料 +- [README_ORIGIN.md][README_ORIGIN.md] +- [https://github.com/pytorch/vision.git][https://github.com/pytorch/vision.git] diff --git a/README.rst b/README.rst deleted file mode 100644 index 4c06a54871583d354172a8621841ae226f1591ac..0000000000000000000000000000000000000000 --- a/README.rst +++ /dev/null @@ -1,151 +0,0 @@ -torchvision -=========== -//copy v0.10.0 -.. image:: https://pepy.tech/badge/torchvision - :target: https://pepy.tech/project/torchvision - -.. image:: https://img.shields.io/badge/dynamic/json.svg?label=docs&url=https%3A%2F%2Fpypi.org%2Fpypi%2Ftorchvision%2Fjson&query=%24.info.version&colorB=brightgreen&prefix=v - :target: https://pytorch.org/vision/stable/index.html - - -The torchvision package consists of popular datasets, model architectures, and common image transformations for computer vision. - - -Installation -============ - -We recommend Anaconda as Python package management system. Please refer to `pytorch.org `_ -for the detail of PyTorch (``torch``) installation. The following is the corresponding ``torchvision`` versions and -supported Python versions. - -+--------------------------+--------------------------+---------------------------------+ -| ``torch`` | ``torchvision`` | ``python`` | -+==========================+==========================+=================================+ -| ``master`` / ``nightly`` | ``master`` / ``nightly`` | ``>=3.6`` | -+--------------------------+--------------------------+---------------------------------+ -| ``1.8.0`` | ``0.9.0`` | ``>=3.6`` | -+--------------------------+--------------------------+---------------------------------+ -| ``1.7.1`` | ``0.8.2`` | ``>=3.6`` | -+--------------------------+--------------------------+---------------------------------+ -| ``1.7.0`` | ``0.8.1`` | ``>=3.6`` | -+--------------------------+--------------------------+---------------------------------+ -| ``1.7.0`` | ``0.8.0`` | ``>=3.6`` | -+--------------------------+--------------------------+---------------------------------+ -| ``1.6.0`` | ``0.7.0`` | ``>=3.6`` | -+--------------------------+--------------------------+---------------------------------+ -| ``1.5.1`` | ``0.6.1`` | ``>=3.5`` | -+--------------------------+--------------------------+---------------------------------+ -| ``1.5.0`` | ``0.6.0`` | ``>=3.5`` | -+--------------------------+--------------------------+---------------------------------+ -| ``1.4.0`` | ``0.5.0`` | ``==2.7``, ``>=3.5``, ``<=3.8`` | -+--------------------------+--------------------------+---------------------------------+ -| ``1.3.1`` | ``0.4.2`` | ``==2.7``, ``>=3.5``, ``<=3.7`` | -+--------------------------+--------------------------+---------------------------------+ -| ``1.3.0`` | ``0.4.1`` | ``==2.7``, ``>=3.5``, ``<=3.7`` | -+--------------------------+--------------------------+---------------------------------+ -| ``1.2.0`` | ``0.4.0`` | ``==2.7``, ``>=3.5``, ``<=3.7`` | -+--------------------------+--------------------------+---------------------------------+ -| ``1.1.0`` | ``0.3.0`` | ``==2.7``, ``>=3.5``, ``<=3.7`` | -+--------------------------+--------------------------+---------------------------------+ -| ``<=1.0.1`` | ``0.2.2`` | ``==2.7``, ``>=3.5``, ``<=3.7`` | -+--------------------------+--------------------------+---------------------------------+ - -Anaconda: - -.. code:: bash - - conda install torchvision -c pytorch - -pip: - -.. code:: bash - - pip install torchvision - -From source: - -.. code:: bash - - python setup.py install - # or, for OSX - # MACOSX_DEPLOYMENT_TARGET=10.9 CC=clang CXX=clang++ python setup.py install - - -In case building TorchVision from source fails, install the nightly version of PyTorch following -the linked guide on the `contributing page `_ and retry the install. - -By default, GPU support is built if CUDA is found and ``torch.cuda.is_available()`` is true. -It's possible to force building GPU support by setting ``FORCE_CUDA=1`` environment variable, -which is useful when building a docker image. - -Image Backend -============= -Torchvision currently supports the following image backends: - -* `Pillow`_ (default) - -* `Pillow-SIMD`_ - a **much faster** drop-in replacement for Pillow with SIMD. If installed will be used as the default. - -* `accimage`_ - if installed can be activated by calling :code:`torchvision.set_image_backend('accimage')` - -* `libpng`_ - can be installed via conda :code:`conda install libpng` or any of the package managers for debian-based and RHEL-based Linux distributions. - -* `libjpeg`_ - can be installed via conda :code:`conda install jpeg` or any of the package managers for debian-based and RHEL-based Linux distributions. `libjpeg-turbo`_ can be used as well. - -**Notes:** ``libpng`` and ``libjpeg`` must be available at compilation time in order to be available. Make sure that it is available on the standard library locations, -otherwise, add the include and library paths in the environment variables ``TORCHVISION_INCLUDE`` and ``TORCHVISION_LIBRARY``, respectively. - -.. _libpng : http://www.libpng.org/pub/png/libpng.html -.. _Pillow : https://python-pillow.org/ -.. _Pillow-SIMD : https://github.com/uploadcare/pillow-simd -.. _accimage: https://github.com/pytorch/accimage -.. _libjpeg: http://ijg.org/ -.. _libjpeg-turbo: https://libjpeg-turbo.org/ - -C++ API -======= -TorchVision also offers a C++ API that contains C++ equivalent of python models. - -Installation From source: - -.. code:: bash - - mkdir build - cd build - # Add -DWITH_CUDA=on support for the CUDA if needed - cmake .. - make - make install - -Once installed, the library can be accessed in cmake (after properly configuring ``CMAKE_PREFIX_PATH``) via the :code:`TorchVision::TorchVision` target: - -.. code:: rest - - find_package(TorchVision REQUIRED) - target_link_libraries(my-target PUBLIC TorchVision::TorchVision) - -The ``TorchVision`` package will also automatically look for the ``Torch`` package and add it as a dependency to ``my-target``, -so make sure that it is also available to cmake via the ``CMAKE_PREFIX_PATH``. - -For an example setup, take a look at ``examples/cpp/hello_world``. - -TorchVision Operators ---------------------- -In order to get the torchvision operators registered with torch (eg. for the JIT), all you need to do is to ensure that you -:code:`#include ` in your project. - -Documentation -============= -You can find the API documentation on the pytorch website: https://pytorch.org/vision/stable/index.html - -Contributing -============ - -See the `CONTRIBUTING `_ file for how to help out. - -Disclaimer on Datasets -====================== - -This is a utility library that downloads and prepares public datasets. We do not host or distribute these datasets, vouch for their quality or fairness, or claim that you have license to use the dataset. It is your responsibility to determine whether you have permission to use the dataset under the dataset's license. - -If you're a dataset owner and wish to update any part of it (description, citation, etc.), or do not want your dataset to be included in this library, please get in touch through a GitHub issue. Thanks for your contribution to the ML community! diff --git a/README_ORIGIN.md b/README_ORIGIN.md new file mode 100644 index 0000000000000000000000000000000000000000..52298e79049559f0967e6148b7dda75c6a3f0a29 --- /dev/null +++ b/README_ORIGIN.md @@ -0,0 +1,126 @@ +# torchvision + +[![total torchvision downloads](https://pepy.tech/badge/torchvision)](https://pepy.tech/project/torchvision) +[![documentation](https://img.shields.io/badge/dynamic/json.svg?label=docs&url=https%3A%2F%2Fpypi.org%2Fpypi%2Ftorchvision%2Fjson&query=%24.info.version&colorB=brightgreen&prefix=v)](https://pytorch.org/vision/stable/index.html) + +The torchvision package consists of popular datasets, model architectures, and common image transformations for computer +vision. + +## Installation + +Please refer to the [official +instructions](https://pytorch.org/get-started/locally/) to install the stable +versions of `torch` and `torchvision` on your system. + +To build source, refer to our [contributing +page](https://github.com/pytorch/vision/blob/main/CONTRIBUTING.md#development-installation). + +The following is the corresponding `torchvision` versions and supported Python +versions. + +| `torch` | `torchvision` | Python | +| ------------------ | ------------------ | ------------------- | +| `main` / `nightly` | `main` / `nightly` | `>=3.8`, `<=3.12` | +| `2.3` | `0.18` | `>=3.8`, `<=3.12` | +| `2.2` | `0.17` | `>=3.8`, `<=3.11` | +| `2.1` | `0.16` | `>=3.8`, `<=3.11` | +| `2.0` | `0.15` | `>=3.8`, `<=3.11` | + +
+ older versions + +| `torch` | `torchvision` | Python | +|---------|-------------------|---------------------------| +| `1.13` | `0.14` | `>=3.7.2`, `<=3.10` | +| `1.12` | `0.13` | `>=3.7`, `<=3.10` | +| `1.11` | `0.12` | `>=3.7`, `<=3.10` | +| `1.10` | `0.11` | `>=3.6`, `<=3.9` | +| `1.9` | `0.10` | `>=3.6`, `<=3.9` | +| `1.8` | `0.9` | `>=3.6`, `<=3.9` | +| `1.7` | `0.8` | `>=3.6`, `<=3.9` | +| `1.6` | `0.7` | `>=3.6`, `<=3.8` | +| `1.5` | `0.6` | `>=3.5`, `<=3.8` | +| `1.4` | `0.5` | `==2.7`, `>=3.5`, `<=3.8` | +| `1.3` | `0.4.2` / `0.4.3` | `==2.7`, `>=3.5`, `<=3.7` | +| `1.2` | `0.4.1` | `==2.7`, `>=3.5`, `<=3.7` | +| `1.1` | `0.3` | `==2.7`, `>=3.5`, `<=3.7` | +| `<=1.0` | `0.2` | `==2.7`, `>=3.5`, `<=3.7` | + +
+ +## Image Backends + +Torchvision currently supports the following image backends: + +- torch tensors +- PIL images: + - [Pillow](https://python-pillow.org/) + - [Pillow-SIMD](https://github.com/uploadcare/pillow-simd) - a **much faster** drop-in replacement for Pillow with SIMD. + +Read more in in our [docs](https://pytorch.org/vision/stable/transforms.html). + +## [UNSTABLE] Video Backend + +Torchvision currently supports the following video backends: + +- [pyav](https://github.com/PyAV-Org/PyAV) (default) - Pythonic binding for ffmpeg libraries. +- video_reader - This needs ffmpeg to be installed and torchvision to be built from source. There shouldn't be any + conflicting version of ffmpeg installed. Currently, this is only supported on Linux. + +``` +conda install -c conda-forge 'ffmpeg<4.3' +python setup.py install +``` + +# Using the models on C++ + +Refer to [example/cpp](https://github.com/pytorch/vision/tree/main/examples/cpp). + +**DISCLAIMER**: the `libtorchvision` library includes the torchvision +custom ops as well as most of the C++ torchvision APIs. Those APIs do not come +with any backward-compatibility guarantees and may change from one version to +the next. Only the Python APIs are stable and with backward-compatibility +guarantees. So, if you need stability within a C++ environment, your best bet is +to export the Python APIs via torchscript. + +## Documentation + +You can find the API documentation on the pytorch website: + +## Contributing + +See the [CONTRIBUTING](CONTRIBUTING.md) file for how to help out. + +## Disclaimer on Datasets + +This is a utility library that downloads and prepares public datasets. We do not host or distribute these datasets, +vouch for their quality or fairness, or claim that you have license to use the dataset. It is your responsibility to +determine whether you have permission to use the dataset under the dataset's license. + +If you're a dataset owner and wish to update any part of it (description, citation, etc.), or do not want your dataset +to be included in this library, please get in touch through a GitHub issue. Thanks for your contribution to the ML +community! + +## Pre-trained Model License + +The pre-trained models provided in this library may have their own licenses or terms and conditions derived from the +dataset used for training. It is your responsibility to determine whether you have permission to use the models for your +use case. + +More specifically, SWAG models are released under the CC-BY-NC 4.0 license. See +[SWAG LICENSE](https://github.com/facebookresearch/SWAG/blob/main/LICENSE) for additional details. + +## Citing TorchVision + +If you find TorchVision useful in your work, please consider citing the following BibTeX entry: + +```bibtex +@software{torchvision2016, + title = {TorchVision: PyTorch's Computer Vision library}, + author = {TorchVision maintainers and contributors}, + year = 2016, + journal = {GitHub repository}, + publisher = {GitHub}, + howpublished = {\url{https://github.com/pytorch/vision}} +} +``` diff --git a/android/README.md b/android/README.md new file mode 100644 index 0000000000000000000000000000000000000000..788c83f26de72593717e97af749ccadb77daab5f --- /dev/null +++ b/android/README.md @@ -0,0 +1,3 @@ +## Status + +The Android demo of TorchVision is currently unmaintained, untested and likely out-of-date. diff --git a/android/build.gradle b/android/build.gradle index b905bdf3a17f3c21f17cc55714aad3fe4005daf8..f7995a07f5b619fd777ee5c52ce757115f2bf069 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -14,14 +14,13 @@ allprojects { androidSupportAppCompatV7Version = "28.0.0" fbjniJavaOnlyVersion = "0.0.3" - soLoaderNativeLoaderVersion = "0.8.0" - pytorchAndroidVersion = "1.9.0-SNAPSHOT" + soLoaderNativeLoaderVersion = "0.10.5" + pytorchAndroidVersion = "1.12" } repositories { google() mavenCentral() - jcenter() } dependencies { @@ -32,11 +31,10 @@ allprojects { repositories { google() - jcenter() + mavenCentral() } } ext.deps = [ jsr305: 'com.google.code.findbugs:jsr305:3.0.1', ] - diff --git a/android/gradle.properties b/android/gradle.properties index a8105544f30cbbb97869bd0ab6d4ab2bc4a0bf02..8204b73b05197d56e927a3bbdd7051e70db10fda 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -1,6 +1,6 @@ ABI_FILTERS=armeabi-v7a,arm64-v8a,x86,x86_64 -VERSION_NAME=0.10.0-SNAPSHOT +VERSION_NAME=0.15.0-SNAPSHOT GROUP=org.pytorch MAVEN_GROUP=org.pytorch SONATYPE_STAGING_PROFILE=orgpytorch @@ -9,7 +9,7 @@ POM_SCM_URL=https://github.com/pytorch/vision.git POM_SCM_CONNECTION=scm:git:https://github.com/pytorch/vision POM_SCM_DEV_CONNECTION=scm:git:git@github.com:pytorch/vision.git POM_LICENSE_NAME=BSD 3-Clause -POM_LICENSE_URL=https://github.com/pytorch/vision/blob/master/LICENSE +POM_LICENSE_URL=https://github.com/pytorch/vision/blob/main/LICENSE POM_ISSUES_URL=https://github.com/pytorch/vision/issues POM_LICENSE_DIST=repo POM_DEVELOPER_ID=pytorch diff --git a/android/gradlew.bat b/android/gradlew.bat index e95643d6a2ca62258464e83c72f5156dc941c609..f9553162f122c71b34635112e717c3e733b5b212 100644 --- a/android/gradlew.bat +++ b/android/gradlew.bat @@ -1,84 +1,84 @@ -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto init - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/android/ops/CMakeLists.txt b/android/ops/CMakeLists.txt index 6f5323c0d39f70f84592dda9760e507dd74ce46d..fb8d4348e8ea77948a8e8acc54ac5ede0ba53760 100644 --- a/android/ops/CMakeLists.txt +++ b/android/ops/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.4.1) set(TARGET torchvision_ops) project(${TARGET} CXX) -set(CMAKE_CXX_STANDARD 14) +set(CMAKE_CXX_STANDARD 17) string(APPEND CMAKE_CXX_FLAGS " -DMOBILE") @@ -14,13 +14,6 @@ file(GLOB VISION_SRCS ../../torchvision/csrc/ops/*.h ../../torchvision/csrc/ops/*.cpp) -# Remove interpolate_aa sources as they are temporary code -# see https://github.com/pytorch/vision/pull/3761 -# and IndexingUtils.h is unavailable on Android build -list(REMOVE_ITEM VISION_SRCS "${CMAKE_CURRENT_LIST_DIR}/../../torchvision/csrc/ops/cpu/interpolate_aa_kernels.cpp") -list(REMOVE_ITEM VISION_SRCS "${CMAKE_CURRENT_LIST_DIR}/../../torchvision/csrc/ops/interpolate_aa.cpp") -list(REMOVE_ITEM VISION_SRCS "${CMAKE_CURRENT_LIST_DIR}/../../torchvision/csrc/ops/interpolate_aa.h") - add_library(${TARGET} SHARED ${VISION_SRCS} ) @@ -35,7 +28,7 @@ target_compile_options(${TARGET} PRIVATE set(BUILD_SUBDIR ${ANDROID_ABI}) -find_library(PYTORCH_LIBRARY pytorch_jni_lite +find_library(PYTORCH_LIBRARY pytorch_jni PATHS ${PYTORCH_LINK_DIRS} NO_CMAKE_FIND_ROOT_PATH) diff --git a/android/ops/build.gradle b/android/ops/build.gradle index df20f6f030db40b9c48a7fe6fb5e77a749a5e2ff..bfa2c39383394d24aa26c2a1fd1b5e14afab6e2c 100644 --- a/android/ops/build.gradle +++ b/android/ops/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'com.android.library' apply plugin: 'maven' repositories { - jcenter() + mavenCentral() maven { url "https://oss.sonatype.org/content/repositories/snapshots" } diff --git a/android/test_app/app/build.gradle b/android/test_app/app/build.gradle index 76b2d7417934635c930e899a81f8ad464bc9f46e..84cf1d82e6b86171360078a2001df201b7bffa43 100644 --- a/android/test_app/app/build.gradle +++ b/android/test_app/app/build.gradle @@ -1,7 +1,7 @@ apply plugin: 'com.android.application' repositories { - jcenter() + mavenCentral() maven { url "https://oss.sonatype.org/content/repositories/snapshots" } diff --git a/android/test_app/app/src/main/res/layout/activity_main.xml b/android/test_app/app/src/main/res/layout/activity_main.xml index c0939ebc0ebcaddd1a09467b564ce5f944a0448c..556839a994c58ff46cf8af35af9dc4d48d833a5a 100644 --- a/android/test_app/app/src/main/res/layout/activity_main.xml +++ b/android/test_app/app/src/main/res/layout/activity_main.xml @@ -14,4 +14,4 @@ android:background="@android:color/black" android:textColor="@android:color/white" /> - \ No newline at end of file + diff --git a/android/test_app/make_assets.py b/android/test_app/make_assets.py index 7860c759a573602ba9b1bd5123b1d3ae0029b3f1..f99933e9a9ddf153c3085d5cd910f89f2919dea9 100644 --- a/android/test_app/make_assets.py +++ b/android/test_app/make_assets.py @@ -1,15 +1,19 @@ import torch -import torchvision from torch.utils.mobile_optimizer import optimize_for_mobile +from torchvision.models.detection import ( + fasterrcnn_mobilenet_v3_large_320_fpn, + FasterRCNN_MobileNet_V3_Large_320_FPN_Weights, +) print(torch.__version__) -model = torchvision.models.detection.fasterrcnn_mobilenet_v3_large_320_fpn( - pretrained=True, +model = fasterrcnn_mobilenet_v3_large_320_fpn( + weights=FasterRCNN_MobileNet_V3_Large_320_FPN_Weights.DEFAULT, box_score_thresh=0.7, rpn_post_nms_top_n_test=100, rpn_score_thresh=0.4, - rpn_pre_nms_top_n_test=150) + rpn_pre_nms_top_n_test=150, +) model.eval() script_model = torch.jit.script(model) diff --git a/benchmarks/encoding.py b/benchmarks/encoding.py new file mode 100644 index 0000000000000000000000000000000000000000..f994b03c783bf42681fc16d6f7710795474c7106 --- /dev/null +++ b/benchmarks/encoding.py @@ -0,0 +1,67 @@ +import os +import platform +import statistics + +import torch +import torch.utils.benchmark as benchmark +import torchvision + + +def print_machine_specs(): + print("Processor:", platform.processor()) + print("Platform:", platform.platform()) + print("Logical CPUs:", os.cpu_count()) + print(f"\nCUDA device: {torch.cuda.get_device_name()}") + print(f"Total Memory: {torch.cuda.get_device_properties(0).total_memory / 1e9:.2f} GB") + + +def get_data(): + transform = torchvision.transforms.Compose( + [ + torchvision.transforms.PILToTensor(), + ] + ) + path = os.path.join(os.getcwd(), "data") + testset = torchvision.datasets.Places365( + root="./data", download=not os.path.exists(path), transform=transform, split="val" + ) + testloader = torch.utils.data.DataLoader( + testset, batch_size=1000, shuffle=False, num_workers=1, collate_fn=lambda batch: [r[0] for r in batch] + ) + return next(iter(testloader)) + + +def run_benchmark(batch): + results = [] + for device in ["cpu", "cuda"]: + batch_device = [t.to(device=device) for t in batch] + for size in [1, 100, 1000]: + for num_threads in [1, 12, 24]: + for stmt, strat in zip( + [ + "[torchvision.io.encode_jpeg(img) for img in batch_input]", + "torchvision.io.encode_jpeg(batch_input)", + ], + ["unfused", "fused"], + ): + batch_input = batch_device[:size] + t = benchmark.Timer( + stmt=stmt, + setup="import torchvision", + globals={"batch_input": batch_input}, + label="Image Encoding", + sub_label=f"{device.upper()} ({strat}): {stmt}", + description=f"{size} images", + num_threads=num_threads, + ) + results.append(t.blocked_autorange()) + compare = benchmark.Compare(results) + compare.print() + + +if __name__ == "__main__": + print_machine_specs() + batch = get_data() + mean_h, mean_w = statistics.mean(t.shape[-2] for t in batch), statistics.mean(t.shape[-1] for t in batch) + print(f"\nMean image size: {int(mean_h)}x{int(mean_w)}") + run_benchmark(batch) diff --git a/cmake/TorchVisionConfig.cmake.in b/cmake/TorchVisionConfig.cmake.in index 42a3d566166849816b4983d66e4de1c198ac88ce..7f7e78817fa197262d89084601cc3515f6b7ba8c 100644 --- a/cmake/TorchVisionConfig.cmake.in +++ b/cmake/TorchVisionConfig.cmake.in @@ -22,21 +22,28 @@ if(NOT (CMAKE_VERSION VERSION_LESS 3.0)) # Don't include targets if this file is being picked up by another # project which has already built this as a subproject #----------------------------------------------------------------------------- -if(NOT TARGET ${PN}::TorchVision) +if(NOT TARGET ${PN}::${PN}) include("${CMAKE_CURRENT_LIST_DIR}/${PN}Targets.cmake") -if(NOT TARGET torch_library) -find_package(Torch REQUIRED) -endif() -if(NOT TARGET Python3::Python) -find_package(Python3 COMPONENTS Development) +target_include_directories(${PN}::${PN} INTERFACE "${${PN}_INCLUDE_DIR}") + +if(@WITH_CUDA@) + target_compile_definitions(${PN}::${PN} INTERFACE WITH_CUDA) endif() -set_target_properties(TorchVision::TorchVision PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${${PN}_INCLUDE_DIR}" INTERFACE_LINK_LIBRARIES "torch;Python3::Python" ) +find_package(Torch REQUIRED) +target_link_libraries(${PN}::${PN} INTERFACE torch) +if(@WITH_PNG@) + find_package(PNG REQUIRED) + target_link_libraries(${PN}::${PN} INTERFACE ${PNG_LIBRARY}) + target_compile_definitions(${PN}::${PN} INTERFACE PNG_FOUND) +endif() -if(@WITH_CUDA@) - target_compile_definitions(TorchVision::TorchVision INTERFACE WITH_CUDA) +if(@WITH_JPEG@) + find_package(JPEG REQUIRED) + target_link_libraries(${PN}::${PN} INTERFACE ${JPEG_LIBRARIES}) + target_compile_definitions(${PN}::${PN} INTERFACE JPEG_FOUND) endif() endif() diff --git a/cmake/iOS.cmake b/cmake/iOS.cmake index d42ea4c9232c171312fdff20d42733d9ef379de1..935c57f11b9268504f2769d56eeffdba02a44b5f 100644 --- a/cmake/iOS.cmake +++ b/cmake/iOS.cmake @@ -10,11 +10,11 @@ # SIMULATOR - used to build for the Simulator platforms, which have an x86 arch. # # CMAKE_IOS_DEVELOPER_ROOT = automatic(default) or /path/to/platform/Developer folder -# By default this location is automatcially chosen based on the IOS_PLATFORM value above. +# By default this location is automatically chosen based on the IOS_PLATFORM value above. # If set manually, it will override the default location and force the user of a particular Developer Platform # # CMAKE_IOS_SDK_ROOT = automatic(default) or /path/to/platform/Developer/SDKs/SDK folder -# By default this location is automatcially chosen based on the CMAKE_IOS_DEVELOPER_ROOT value. +# By default this location is automatically chosen based on the CMAKE_IOS_DEVELOPER_ROOT value. # In this case it will always be the most up-to-date SDK found in the CMAKE_IOS_DEVELOPER_ROOT path. # If set manually, this will force the use of a specific SDK version @@ -100,7 +100,7 @@ if(IOS_DEPLOYMENT_TARGET) set(XCODE_IOS_PLATFORM_VERSION_FLAGS "-m${XCODE_IOS_PLATFORM}-version-min=${IOS_DEPLOYMENT_TARGET}") endif() -# Hidden visibilty is required for cxx on iOS +# Hidden visibility is required for cxx on iOS set(CMAKE_C_FLAGS_INIT "${XCODE_IOS_PLATFORM_VERSION_FLAGS}") set(CMAKE_CXX_FLAGS_INIT "${XCODE_IOS_PLATFORM_VERSION_FLAGS} -fvisibility-inlines-hidden") diff --git a/docs/Makefile b/docs/Makefile index 0488c3db88f7ea88b7e79d9b06fb9394b358dfca..f462ff223032e8b44ff3f6a1429f164777596dd5 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -24,7 +24,7 @@ docset: html convert $(SPHINXPROJ).docset/icon@2x.png -resize 16x16 $(SPHINXPROJ).docset/icon.png html-noplot: # Avoids running the gallery examples, which may take time - $(SPHINXBUILD) -D plot_gallery=0 -b html $(ASPHINXOPTS) "${SOURCEDIR}" "$(BUILDDIR)"/html + $(SPHINXBUILD) -D plot_gallery=0 -b html "${SOURCEDIR}" "$(BUILDDIR)"/html @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." @@ -32,6 +32,8 @@ clean: rm -rf $(BUILDDIR)/* rm -rf $(SOURCEDIR)/auto_examples/ # sphinx-gallery rm -rf $(SOURCEDIR)/gen_modules/ # sphinx-gallery + rm -rf $(SOURCEDIR)/generated/ # autosummary + rm -rf $(SOURCEDIR)/models/generated # autosummary .PHONY: help Makefile docset diff --git a/docs/requirements.txt b/docs/requirements.txt index 68efe2cb639502fd257065b9dad634cfe75eda4c..2a50d9b8f45c672a59ebd81a430d8674682eb498 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,6 +1,8 @@ -sphinx==2.4.4 -sphinx-gallery>=0.9.0 -sphinx-copybutton>=0.3.1 matplotlib numpy --e git+git://github.com/pytorch/pytorch_sphinx_theme.git#egg=pytorch_sphinx_theme +sphinx-copybutton>=0.3.1 +sphinx-gallery>=0.11.1 +sphinx==5.0.0 +tabulate +-e git+https://github.com/pytorch/pytorch_sphinx_theme.git#egg=pytorch_sphinx_theme +pycocotools diff --git a/docs/source/_static/css/custom_torchvision.css b/docs/source/_static/css/custom_torchvision.css index fb039a47c0aab63c6f3f1ad93c64bab664221037..07346d7b03f6342465c8dac596aae7afd41ae626 100644 --- a/docs/source/_static/css/custom_torchvision.css +++ b/docs/source/_static/css/custom_torchvision.css @@ -1,4 +1,4 @@ -/* This rule (and possibly this entire file) should be removed once +/* This rule should be removed once https://github.com/pytorch/pytorch_sphinx_theme/issues/125 is fixed. We override the rule so that the links to the notebooks aren't hidden in the @@ -9,4 +9,27 @@ torchvision it just hides the links. So we have to put them back here */ article.pytorch-article .sphx-glr-download-link-note.admonition.note, article.pytorch-article .reference.download.internal, article.pytorch-article .sphx-glr-signature { display: block; -} \ No newline at end of file +} + +/* These 2 rules below are for the weight tables (generated in conf.py) to look + * better. In particular we make their row height shorter */ +.table-weights td, .table-weights th { + margin-bottom: 0.2rem; + padding: 0 !important; + line-height: 1 !important; +} +.table-weights p { + margin-bottom: 0.2rem !important; +} + +/* Fix for Sphinx gallery 0.11 +See https://github.com/sphinx-gallery/sphinx-gallery/issues/990 +*/ +article.pytorch-article .sphx-glr-thumbnails .sphx-glr-thumbcontainer { + width: unset; + margin-right: 0; + margin-left: 0; +} +article.pytorch-article div.section div.wy-table-responsive tbody td { + width: 50%; +} diff --git a/docs/source/_static/img/pytorch-logo-flame.svg b/docs/source/_static/img/pytorch-logo-flame.svg index 22d7228b4fa96331ce9d1bd7cd8abb28abfb8166..5f2fb76be77348f13d8d016a7514dd9b03e9cc8c 100644 --- a/docs/source/_static/img/pytorch-logo-flame.svg +++ b/docs/source/_static/img/pytorch-logo-flame.svg @@ -30,4 +30,4 @@ style="fill:#9e529f" id="path4698" d="m 24.075479,-7.6293945e-7 c -0.5,0 -1.8,2.49999996293945 -1.8,3.59999996293945 0,1.5 1,2 1.8,2 0.8,0 1.8,-0.5 1.8,-2 -0.1,-1.1 -1.4,-3.59999996293945 -1.8,-3.59999996293945 z" - class="st1" /> \ No newline at end of file + class="st1" /> diff --git a/docs/source/_templates/class.rst b/docs/source/_templates/class.rst new file mode 100644 index 0000000000000000000000000000000000000000..eeb823a961f16b798878f271bbddd895f9c7d287 --- /dev/null +++ b/docs/source/_templates/class.rst @@ -0,0 +1,9 @@ +.. role:: hidden + :class: hidden-section +.. currentmodule:: {{ module }} + + +{{ name | underline}} + +.. autoclass:: {{ name }} + :members: diff --git a/docs/source/_templates/class_dataset.rst b/docs/source/_templates/class_dataset.rst new file mode 100644 index 0000000000000000000000000000000000000000..c559c6dc9b07880aa70e291782e630e2f77bfe3d --- /dev/null +++ b/docs/source/_templates/class_dataset.rst @@ -0,0 +1,12 @@ +.. role:: hidden + :class: hidden-section +.. currentmodule:: {{ module }} + + +{{ name | underline}} + +.. autoclass:: {{ name }} + :members: + __getitem__, + {% if "category_name" in methods %} category_name {% endif %} + :special-members: diff --git a/docs/source/_templates/function.rst b/docs/source/_templates/function.rst new file mode 100644 index 0000000000000000000000000000000000000000..72abc4f50fe085be1b203bad6cd802eb9ca5b20a --- /dev/null +++ b/docs/source/_templates/function.rst @@ -0,0 +1,8 @@ +.. role:: hidden + :class: hidden-section +.. currentmodule:: {{ module }} + + +{{ name | underline}} + +.. autofunction:: {{ name }} diff --git a/docs/source/beta_status.py b/docs/source/beta_status.py new file mode 100644 index 0000000000000000000000000000000000000000..8871f6debbbe9352ae0b1cce6e36474cfe2500c2 --- /dev/null +++ b/docs/source/beta_status.py @@ -0,0 +1,21 @@ +from docutils import nodes +from docutils.parsers.rst import Directive + + +class BetaStatus(Directive): + has_content = True + text = "The {api_name} is in Beta stage, and backward compatibility is not guaranteed." + node = nodes.warning + + def run(self): + text = self.text.format(api_name=" ".join(self.content)) + return [self.node("", nodes.paragraph("", "", nodes.Text(text)))] + + +def setup(app): + app.add_directive("betastatus", BetaStatus) + return { + "version": "0.1", + "parallel_read_safe": True, + "parallel_write_safe": True, + } diff --git a/docs/source/conf.py b/docs/source/conf.py index aa5e60bff0c380b63abf2b34d2438b941151bc37..a3be2282a47281b18b30d3bd0713c7897668684c 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -# -*- coding: utf-8 -*- # # PyTorch documentation build configuration file, created by # sphinx-quickstart on Fri Dec 23 13:31:47 2016. @@ -21,79 +20,146 @@ # import sys # sys.path.insert(0, os.path.abspath('.')) -import torchvision +import os +import sys +import textwrap +from copy import copy +from pathlib import Path + import pytorch_sphinx_theme +import torchvision +import torchvision.models as M +from sphinx_gallery.sorting import ExplicitOrder +from tabulate import tabulate +sys.path.append(os.path.abspath(".")) # -- General configuration ------------------------------------------------ -# If your documentation needs a minimal Sphinx version, state it here. -# -# needs_sphinx = '1.0' +# Required version of sphinx is set from docs/requirements.txt # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ - 'sphinx.ext.autodoc', - 'sphinx.ext.autosummary', - 'sphinx.ext.doctest', - 'sphinx.ext.intersphinx', - 'sphinx.ext.todo', - 'sphinx.ext.coverage', - 'sphinx.ext.mathjax', - 'sphinx.ext.napoleon', - 'sphinx.ext.viewcode', - 'sphinx.ext.duration', - 'sphinx_gallery.gen_gallery', - "sphinx_copybutton" + "sphinx.ext.autodoc", + "sphinx.ext.autosummary", + "sphinx.ext.doctest", + "sphinx.ext.intersphinx", + "sphinx.ext.todo", + "sphinx.ext.mathjax", + "sphinx.ext.napoleon", + "sphinx.ext.viewcode", + "sphinx.ext.duration", + "sphinx_gallery.gen_gallery", + "sphinx_copybutton", + "beta_status", ] +# We override sphinx-gallery's example header to prevent sphinx-gallery from +# creating a note at the top of the renderred notebook. +# https://github.com/sphinx-gallery/sphinx-gallery/blob/451ccba1007cc523f39cbcc960ebc21ca39f7b75/sphinx_gallery/gen_rst.py#L1267-L1271 +# This is because we also want to add a link to google collab, so we write our own note in each example. +from sphinx_gallery import gen_rst + +gen_rst.EXAMPLE_HEADER = """ +.. DO NOT EDIT. +.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. +.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: +.. "{0}" +.. LINE NUMBERS ARE GIVEN BELOW. + +.. rst-class:: sphx-glr-example-title + +.. _sphx_glr_{1}: + +""" + + +class CustomGalleryExampleSortKey: + # See https://sphinx-gallery.github.io/stable/configuration.html#sorting-gallery-examples + # and https://github.com/sphinx-gallery/sphinx-gallery/blob/master/sphinx_gallery/sorting.py + def __init__(self, src_dir): + self.src_dir = src_dir + + transforms_subsection_order = [ + "plot_transforms_getting_started.py", + "plot_transforms_illustrations.py", + "plot_transforms_e2e.py", + "plot_cutmix_mixup.py", + "plot_custom_transforms.py", + "plot_tv_tensors.py", + "plot_custom_tv_tensors.py", + ] + + def __call__(self, filename): + if "gallery/transforms" in self.src_dir: + try: + return self.transforms_subsection_order.index(filename) + except ValueError as e: + raise ValueError( + "Looks like you added an example in gallery/transforms? " + "You need to specify its order in docs/source/conf.py. Look for CustomGalleryExampleSortKey." + ) from e + else: + # For other subsections we just sort alphabetically by filename + return filename + + sphinx_gallery_conf = { - 'examples_dirs': '../../gallery/', # path to your example scripts - 'gallery_dirs': 'auto_examples', # path to where to save gallery generated output - 'backreferences_dir': 'gen_modules/backreferences', - 'doc_module': ('torchvision',), + "examples_dirs": "../../gallery/", # path to your example scripts + "gallery_dirs": "auto_examples", # path to where to save gallery generated output + "subsection_order": ExplicitOrder(["../../gallery/transforms", "../../gallery/others"]), + "backreferences_dir": "gen_modules/backreferences", + "doc_module": ("torchvision",), + "remove_config_comments": True, + "ignore_pattern": "helpers.py", + "within_subsection_order": CustomGalleryExampleSortKey, } napoleon_use_ivar = True napoleon_numpy_docstring = False napoleon_google_docstring = True + # Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] +templates_path = ["_templates"] # The suffix(es) of source filenames. # You can specify multiple suffix as a list of string: # -# source_suffix = ['.rst', '.md'] -source_suffix = '.rst' +source_suffix = { + ".rst": "restructuredtext", +} # The master toctree document. -master_doc = 'index' +master_doc = "index" # General information about the project. -project = 'Torchvision' -copyright = '2017-present, Torch Contributors' -author = 'Torch Contributors' +project = "Torchvision" +copyright = "2017-present, Torch Contributors" +author = "Torch Contributors" # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. -# -# The short X.Y version. -# TODO: change to [:2] at v1.0 -version = '0.10.0' -# The full version, including alpha/beta/rc tags. -# TODO: verify this works as expected -release = torchvision.__version__ +# version: The short X.Y version. +# release: The full version, including alpha/beta/rc tags. +if os.environ.get("TORCHVISION_SANITIZE_VERSION_STR_IN_DOCS", None): + # Turn 1.11.0aHASH into 1.11 (major.minor only) + version = release = ".".join(torchvision.__version__.split(".")[:2]) + html_title = " ".join((project, version, "documentation")) +else: + version = f"main ({torchvision.__version__})" + release = "main" + # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. # # This is also used if you do content translation via gettext catalogs. # Usually you set "language" from the command line for these cases. -language = None +language = "en" # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. @@ -101,7 +167,7 @@ language = None exclude_patterns = [] # The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' +pygments_style = "sphinx" # If true, `todo` and `todoList` produce output, else they produce nothing. todo_include_todos = True @@ -112,7 +178,7 @@ todo_include_todos = True # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # -html_theme = 'pytorch_sphinx_theme' +html_theme = "pytorch_sphinx_theme" html_theme_path = [pytorch_sphinx_theme.get_html_theme_path()] # Theme options are theme-specific and customize the look and feel of a theme @@ -120,58 +186,57 @@ html_theme_path = [pytorch_sphinx_theme.get_html_theme_path()] # documentation. # html_theme_options = { - 'collapse_navigation': False, - 'display_version': True, - 'logo_only': True, - 'pytorch_project': 'docs', - 'navigation_with_keys': True, - 'analytics_id': 'UA-117752657-2', + "collapse_navigation": False, + "display_version": True, + "logo_only": True, + "pytorch_project": "docs", + "navigation_with_keys": True, + "analytics_id": "GTM-T8XT4PS", } -html_logo = '_static/img/pytorch-logo-dark.svg' +html_logo = "_static/img/pytorch-logo-dark.svg" # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] +html_static_path = ["_static"] # TODO: remove this once https://github.com/pytorch/pytorch_sphinx_theme/issues/125 is fixed html_css_files = [ - 'css/custom_torchvision.css', + "css/custom_torchvision.css", ] # -- Options for HTMLHelp output ------------------------------------------ # Output file base name for HTML help builder. -htmlhelp_basename = 'PyTorchdoc' +htmlhelp_basename = "PyTorchdoc" -# -- Options for LaTeX output --------------------------------------------- +autosummary_generate = True + +# -- Options for LaTeX output --------------------------------------------- latex_elements = { # The paper size ('letterpaper' or 'a4paper'). # # 'papersize': 'letterpaper', - # The font size ('10pt', '11pt' or '12pt'). # # 'pointsize': '10pt', - # Additional stuff for the LaTeX preamble. # # 'preamble': '', - # Latex figure (float) alignment # # 'figure_align': 'htbp', } + # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ - (master_doc, 'pytorch.tex', 'torchvision Documentation', - 'Torch Contributors', 'manual'), + (master_doc, "pytorch.tex", "torchvision Documentation", "Torch Contributors", "manual"), ] @@ -179,10 +244,7 @@ latex_documents = [ # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). -man_pages = [ - (master_doc, 'torchvision', 'torchvision Documentation', - [author], 1) -] +man_pages = [(master_doc, "torchvision", "torchvision Documentation", [author], 1)] # -- Options for Texinfo output ------------------------------------------- @@ -191,27 +253,33 @@ man_pages = [ # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ - (master_doc, 'torchvision', 'torchvision Documentation', - author, 'torchvision', 'One line description of project.', - 'Miscellaneous'), + ( + master_doc, + "torchvision", + "torchvision Documentation", + author, + "torchvision", + "One line description of project.", + "Miscellaneous", + ), ] # Example configuration for intersphinx: refer to the Python standard library. intersphinx_mapping = { - 'python': ('https://docs.python.org/', None), - 'torch': ('https://pytorch.org/docs/stable/', None), - 'numpy': ('http://docs.scipy.org/doc/numpy/', None), - 'PIL': ('https://pillow.readthedocs.io/en/stable/', None), - 'matplotlib': ('https://matplotlib.org/stable/', None), + "python": ("https://docs.python.org/3/", None), + "torch": ("https://pytorch.org/docs/stable/", None), + "numpy": ("https://numpy.org/doc/stable/", None), + "PIL": ("https://pillow.readthedocs.io/en/stable/", None), + "matplotlib": ("https://matplotlib.org/stable/", None), } # -- A patch that prevents Sphinx from cross-referencing ivar tags ------- # See http://stackoverflow.com/a/41184353/3343043 from docutils import nodes -from sphinx.util.docfields import TypedField from sphinx import addnodes +from sphinx.util.docfields import TypedField def patched_make_field(self, types, domain, items, **kw): @@ -221,40 +289,39 @@ def patched_make_field(self, types, domain, items, **kw): # type: (list, unicode, tuple) -> nodes.field # noqa: F821 def handle_item(fieldarg, content): par = nodes.paragraph() - par += addnodes.literal_strong('', fieldarg) # Patch: this line added + par += addnodes.literal_strong("", fieldarg) # Patch: this line added # par.extend(self.make_xrefs(self.rolename, domain, fieldarg, # addnodes.literal_strong)) if fieldarg in types: - par += nodes.Text(' (') + par += nodes.Text(" (") # NOTE: using .pop() here to prevent a single type node to be # inserted twice into the doctree, which leads to # inconsistencies later when references are resolved fieldtype = types.pop(fieldarg) if len(fieldtype) == 1 and isinstance(fieldtype[0], nodes.Text): - typename = u''.join(n.astext() for n in fieldtype) - typename = typename.replace('int', 'python:int') - typename = typename.replace('long', 'python:long') - typename = typename.replace('float', 'python:float') - typename = typename.replace('type', 'python:type') - par.extend(self.make_xrefs(self.typerolename, domain, typename, - addnodes.literal_emphasis, **kw)) + typename = "".join(n.astext() for n in fieldtype) + typename = typename.replace("int", "python:int") + typename = typename.replace("long", "python:long") + typename = typename.replace("float", "python:float") + typename = typename.replace("type", "python:type") + par.extend(self.make_xrefs(self.typerolename, domain, typename, addnodes.literal_emphasis, **kw)) else: par += fieldtype - par += nodes.Text(')') - par += nodes.Text(' -- ') + par += nodes.Text(")") + par += nodes.Text(" -- ") par += content return par - fieldname = nodes.field_name('', self.label) + fieldname = nodes.field_name("", self.label) if len(items) == 1 and self.can_collapse: fieldarg, content = items[0] bodynode = handle_item(fieldarg, content) else: bodynode = self.list_type() for fieldarg, content in items: - bodynode += nodes.list_item('', handle_item(fieldarg, content)) - fieldbody = nodes.field_body('', bodynode) - return nodes.field('', fieldname, fieldbody) + bodynode += nodes.list_item("", handle_item(fieldarg, content)) + fieldbody = nodes.field_body("", bodynode) + return nodes.field("", fieldname, fieldbody) TypedField.make_field = patched_make_field @@ -286,5 +353,172 @@ def inject_minigalleries(app, what, name, obj, options, lines): lines.append("\n") +def inject_weight_metadata(app, what, name, obj, options, lines): + """This hook is used to generate docs for the models weights. + + Objects like ResNet18_Weights are enums with fields, where each field is a Weight object. + Enums aren't easily documented in Python so the solution we're going for is to: + + - add an autoclass directive in the model's builder docstring, e.g. + + ``` + .. autoclass:: torchvision.models.ResNet34_Weights + :members: + ``` + + (see resnet.py for an example) + - then this hook is called automatically when building the docs, and it generates the text that gets + used within the autoclass directive. + """ + + if getattr(obj, "__name__", "").endswith(("_Weights", "_QuantizedWeights")): + + if len(obj) == 0: + lines[:] = ["There are no available pre-trained weights."] + return + + lines[:] = [ + "The model builder above accepts the following values as the ``weights`` parameter.", + f"``{obj.__name__}.DEFAULT`` is equivalent to ``{obj.DEFAULT}``. You can also use strings, e.g. " + f"``weights='DEFAULT'`` or ``weights='{str(list(obj)[0]).split('.')[1]}'``.", + ] + + if obj.__doc__ != "An enumeration.": + # We only show the custom enum doc if it was overridden. The default one from Python is "An enumeration" + lines.append("") + lines.append(obj.__doc__) + + lines.append("") + + for field in obj: + meta = copy(field.meta) + + lines += [f"**{str(field)}**:", ""] + lines += [meta.pop("_docs")] + + if field == obj.DEFAULT: + lines += [f"Also available as ``{obj.__name__}.DEFAULT``."] + lines += [""] + + table = [] + metrics = meta.pop("_metrics") + for dataset, dataset_metrics in metrics.items(): + for metric_name, metric_value in dataset_metrics.items(): + table.append((f"{metric_name} (on {dataset})", str(metric_value))) + + for k, v in meta.items(): + if k in {"recipe", "license"}: + v = f"`link <{v}>`__" + elif k == "min_size": + v = f"height={v[0]}, width={v[1]}" + elif k in {"categories", "keypoint_names"} and isinstance(v, list): + max_visible = 3 + v_sample = ", ".join(v[:max_visible]) + v = f"{v_sample}, ... ({len(v)-max_visible} omitted)" if len(v) > max_visible else v_sample + elif k == "_ops": + v = f"{v:.2f}" + k = "GIPS" if obj.__name__.endswith("_QuantizedWeights") else "GFLOPS" + elif k == "_file_size": + k = "File size" + v = f"{v:.1f} MB" + + table.append((str(k), str(v))) + table = tabulate(table, tablefmt="rst") + lines += [".. rst-class:: table-weights"] # Custom CSS class, see custom_torchvision.css + lines += [".. table::", ""] + lines += textwrap.indent(table, " " * 4).split("\n") + lines.append("") + lines.append( + f"The inference transforms are available at ``{str(field)}.transforms`` and " + f"perform the following preprocessing operations: {field.transforms().describe()}" + ) + lines.append("") + + +def generate_weights_table(module, table_name, metrics, dataset, include_patterns=None, exclude_patterns=None): + weights_endswith = "_QuantizedWeights" if module.__name__.split(".")[-1] == "quantization" else "_Weights" + weight_enums = [getattr(module, name) for name in dir(module) if name.endswith(weights_endswith)] + weights = [w for weight_enum in weight_enums for w in weight_enum] + + if include_patterns is not None: + weights = [w for w in weights if any(p in str(w) for p in include_patterns)] + if exclude_patterns is not None: + weights = [w for w in weights if all(p not in str(w) for p in exclude_patterns)] + + ops_name = "GIPS" if "QuantizedWeights" in weights_endswith else "GFLOPS" + + metrics_keys, metrics_names = zip(*metrics) + column_names = ["Weight"] + list(metrics_names) + ["Params"] + [ops_name, "Recipe"] # Final column order + column_names = [f"**{name}**" for name in column_names] # Add bold + + content = [] + for w in weights: + row = [ + f":class:`{w} <{type(w).__name__}>`", + *(w.meta["_metrics"][dataset][metric] for metric in metrics_keys), + f"{w.meta['num_params']/1e6:.1f}M", + f"{w.meta['_ops']:.2f}", + f"`link <{w.meta['recipe']}>`__", + ] + + content.append(row) + + column_widths = ["110"] + ["18"] * len(metrics_names) + ["18"] * 2 + ["10"] + widths_table = " ".join(column_widths) + + table = tabulate(content, headers=column_names, tablefmt="rst") + + generated_dir = Path("generated") + generated_dir.mkdir(exist_ok=True) + with open(generated_dir / f"{table_name}_table.rst", "w+") as table_file: + table_file.write(".. rst-class:: table-weights\n") # Custom CSS class, see custom_torchvision.css + table_file.write(".. table::\n") + table_file.write(f" :widths: {widths_table} \n\n") + table_file.write(f"{textwrap.indent(table, ' ' * 4)}\n\n") + + +generate_weights_table( + module=M, table_name="classification", metrics=[("acc@1", "Acc@1"), ("acc@5", "Acc@5")], dataset="ImageNet-1K" +) +generate_weights_table( + module=M.quantization, + table_name="classification_quant", + metrics=[("acc@1", "Acc@1"), ("acc@5", "Acc@5")], + dataset="ImageNet-1K", +) +generate_weights_table( + module=M.detection, + table_name="detection", + metrics=[("box_map", "Box MAP")], + exclude_patterns=["Mask", "Keypoint"], + dataset="COCO-val2017", +) +generate_weights_table( + module=M.detection, + table_name="instance_segmentation", + metrics=[("box_map", "Box MAP"), ("mask_map", "Mask MAP")], + dataset="COCO-val2017", + include_patterns=["Mask"], +) +generate_weights_table( + module=M.detection, + table_name="detection_keypoint", + metrics=[("box_map", "Box MAP"), ("kp_map", "Keypoint MAP")], + dataset="COCO-val2017", + include_patterns=["Keypoint"], +) +generate_weights_table( + module=M.segmentation, + table_name="segmentation", + metrics=[("miou", "Mean IoU"), ("pixel_acc", "pixelwise Acc")], + dataset="COCO-val2017-VOC-labels", +) +generate_weights_table( + module=M.video, table_name="video", metrics=[("acc@1", "Acc@1"), ("acc@5", "Acc@5")], dataset="Kinetics-400" +) + + def setup(app): - app.connect('autodoc-process-docstring', inject_minigalleries) + + app.connect("autodoc-process-docstring", inject_minigalleries) + app.connect("autodoc-process-docstring", inject_weight_metadata) diff --git a/docs/source/datasets.rst b/docs/source/datasets.rst index af1b95db4bbd8dc6b0857e6d113b1f935aeb4c59..614addd18f6f3cde606338503335d494ae96b916 100644 --- a/docs/source/datasets.rst +++ b/docs/source/datasets.rst @@ -1,5 +1,13 @@ -torchvision.datasets -==================== +.. _datasets: + +Datasets +======== + +Torchvision provides many built-in datasets in the ``torchvision.datasets`` +module, as well as utility classes for building your own datasets. + +Built-in datasets +----------------- All datasets are subclasses of :class:`torch.utils.data.Dataset` i.e, they have ``__getitem__`` and ``__len__`` methods implemented. @@ -19,242 +27,157 @@ All the datasets have almost similar API. They all have two common arguments: ``transform`` and ``target_transform`` to transform the input and target respectively. You can also create your own datasets using the provided :ref:`base classes `. -Caltech -~~~~~~~ - -.. autoclass:: Caltech101 - :members: __getitem__ - :special-members: - -.. autoclass:: Caltech256 - :members: __getitem__ - :special-members: - -CelebA -~~~~~~ - -.. autoclass:: CelebA - :members: __getitem__ - :special-members: - -CIFAR -~~~~~ - -.. autoclass:: CIFAR10 - :members: __getitem__ - :special-members: - -.. autoclass:: CIFAR100 - -Cityscapes -~~~~~~~~~~ - -.. note :: - Requires Cityscape to be downloaded. - -.. autoclass:: Cityscapes - :members: __getitem__ - :special-members: - -COCO -~~~~ - -.. note :: - These require the `COCO API to be installed`_ - -.. _COCO API to be installed: https://github.com/pdollar/coco/tree/master/PythonAPI - - -Captions -^^^^^^^^ - -.. autoclass:: CocoCaptions - :members: __getitem__ - :special-members: - - -Detection -^^^^^^^^^ - -.. autoclass:: CocoDetection - :members: __getitem__ - :special-members: - - -EMNIST -~~~~~~ - -.. autoclass:: EMNIST - -FakeData -~~~~~~~~ - -.. autoclass:: FakeData - -Fashion-MNIST -~~~~~~~~~~~~~ - -.. autoclass:: FashionMNIST - -Flickr -~~~~~~ - -.. autoclass:: Flickr8k - :members: __getitem__ - :special-members: - -.. autoclass:: Flickr30k - :members: __getitem__ - :special-members: - -HMDB51 -~~~~~~~ - -.. autoclass:: HMDB51 - :members: __getitem__ - :special-members: - -ImageNet -~~~~~~~~~~~ - -.. autoclass:: ImageNet - -.. note :: - This requires `scipy` to be installed - -Kinetics-400 +Image classification +~~~~~~~~~~~~~~~~~~~~ + +.. autosummary:: + :toctree: generated/ + :template: class_dataset.rst + + Caltech101 + Caltech256 + CelebA + CIFAR10 + CIFAR100 + Country211 + DTD + EMNIST + EuroSAT + FakeData + FashionMNIST + FER2013 + FGVCAircraft + Flickr8k + Flickr30k + Flowers102 + Food101 + GTSRB + INaturalist + ImageNet + Imagenette + KMNIST + LFWPeople + LSUN + MNIST + Omniglot + OxfordIIITPet + Places365 + PCAM + QMNIST + RenderedSST2 + SEMEION + SBU + StanfordCars + STL10 + SUN397 + SVHN + USPS + +Image detection or segmentation +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. autosummary:: + :toctree: generated/ + :template: class_dataset.rst + + CocoDetection + CelebA + Cityscapes + Kitti + OxfordIIITPet + SBDataset + VOCSegmentation + VOCDetection + WIDERFace + +Optical Flow ~~~~~~~~~~~~ -.. autoclass:: Kinetics400 - :members: __getitem__ - :special-members: - -KITTI -~~~~~~~~~ - -.. autoclass:: Kitti - :members: __getitem__ - :special-members: - -KMNIST -~~~~~~~~~~~~~ - -.. autoclass:: KMNIST - -LSUN -~~~~ - -.. autoclass:: LSUN - :members: __getitem__ - :special-members: - -MNIST -~~~~~ - -.. autoclass:: MNIST - -Omniglot -~~~~~~~~ - -.. autoclass:: Omniglot - -PhotoTour -~~~~~~~~~ - -.. autoclass:: PhotoTour - :members: __getitem__ - :special-members: - -Places365 -~~~~~~~~~ - -.. autoclass:: Places365 - :members: __getitem__ - :special-members: - -QMNIST -~~~~~~ - -.. autoclass:: QMNIST - -SBD -~~~~~~ - -.. autoclass:: SBDataset - :members: __getitem__ - :special-members: - -SBU -~~~ - -.. autoclass:: SBU - :members: __getitem__ - :special-members: - -SEMEION -~~~~~~~ - -.. autoclass:: SEMEION - :members: __getitem__ - :special-members: - -STL10 -~~~~~ - -.. autoclass:: STL10 - :members: __getitem__ - :special-members: - -SVHN -~~~~~ +.. autosummary:: + :toctree: generated/ + :template: class_dataset.rst + + FlyingChairs + FlyingThings3D + HD1K + KittiFlow + Sintel + +Stereo Matching +~~~~~~~~~~~~~~~ + +.. autosummary:: + :toctree: generated/ + :template: class_dataset.rst + + CarlaStereo + Kitti2012Stereo + Kitti2015Stereo + CREStereo + FallingThingsStereo + SceneFlowStereo + SintelStereo + InStereo2k + ETH3DStereo + Middlebury2014Stereo + +Image pairs +~~~~~~~~~~~ -.. autoclass:: SVHN - :members: __getitem__ - :special-members: +.. autosummary:: + :toctree: generated/ + :template: class_dataset.rst -UCF101 -~~~~~~~ + LFWPairs + PhotoTour -.. autoclass:: UCF101 - :members: __getitem__ - :special-members: +Image captioning +~~~~~~~~~~~~~~~~ -USPS -~~~~~ +.. autosummary:: + :toctree: generated/ + :template: class_dataset.rst -.. autoclass:: USPS - :members: __getitem__ - :special-members: + CocoCaptions -VOC -~~~~~~ +Video classification +~~~~~~~~~~~~~~~~~~~~ -.. autoclass:: VOCSegmentation - :members: __getitem__ - :special-members: +.. autosummary:: + :toctree: generated/ + :template: class_dataset.rst -.. autoclass:: VOCDetection - :members: __getitem__ - :special-members: + HMDB51 + Kinetics + UCF101 -WIDERFace -~~~~~~~~~ +Video prediction +~~~~~~~~~~~~~~~~~~~~ -.. autoclass:: WIDERFace - :members: __getitem__ - :special-members: +.. autosummary:: + :toctree: generated/ + :template: class_dataset.rst + MovingMNIST .. _base_classes_datasets: Base classes for custom datasets -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +-------------------------------- + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + DatasetFolder + ImageFolder + VisionDataset -.. autoclass:: DatasetFolder - :members: __getitem__, find_classes, make_dataset - :special-members: +Transforms v2 +------------- +.. autosummary:: + :toctree: generated/ + :template: function.rst -.. autoclass:: ImageFolder - :members: __getitem__ - :special-members: + wrap_dataset_for_transforms_v2 diff --git a/docs/source/docutils.conf b/docs/source/docutils.conf new file mode 100644 index 0000000000000000000000000000000000000000..e2bef654a4a6e09b8e37ea7e56ab23f9275affc0 --- /dev/null +++ b/docs/source/docutils.conf @@ -0,0 +1,3 @@ +# Necessary for the table generated by autosummary to look decent +[html writers] +table_style: colwidths-auto diff --git a/docs/source/feature_extraction.rst b/docs/source/feature_extraction.rst new file mode 100644 index 0000000000000000000000000000000000000000..e83bc2fe4bcb15c3602bbb5837b103796bbc9699 --- /dev/null +++ b/docs/source/feature_extraction.rst @@ -0,0 +1,166 @@ +Feature extraction for model inspection +======================================= + +.. currentmodule:: torchvision.models.feature_extraction + +The ``torchvision.models.feature_extraction`` package contains +feature extraction utilities that let us tap into our models to access intermediate +transformations of our inputs. This could be useful for a variety of +applications in computer vision. Just a few examples are: + +- Visualizing feature maps. +- Extracting features to compute image descriptors for tasks like facial + recognition, copy-detection, or image retrieval. +- Passing selected features to downstream sub-networks for end-to-end training + with a specific task in mind. For example, passing a hierarchy of features + to a Feature Pyramid Network with object detection heads. + +Torchvision provides :func:`create_feature_extractor` for this purpose. +It works by following roughly these steps: + +1. Symbolically tracing the model to get a graphical representation of + how it transforms the input, step by step. +2. Setting the user-selected graph nodes as outputs. +3. Removing all redundant nodes (anything downstream of the output nodes). +4. Generating python code from the resulting graph and bundling that into a + PyTorch module together with the graph itself. + +| + +The `torch.fx documentation `_ +provides a more general and detailed explanation of the above procedure and +the inner workings of the symbolic tracing. + +.. _about-node-names: + +**About Node Names** + +In order to specify which nodes should be output nodes for extracted +features, one should be familiar with the node naming convention used here +(which differs slightly from that used in ``torch.fx``). A node name is +specified as a ``.`` separated path walking the module hierarchy from top level +module down to leaf operation or leaf module. For instance ``"layer4.2.relu"`` +in ResNet-50 represents the output of the ReLU of the 2nd block of the 4th +layer of the ``ResNet`` module. Here are some finer points to keep in mind: + +- When specifying node names for :func:`create_feature_extractor`, you may + provide a truncated version of a node name as a shortcut. To see how this + works, try creating a ResNet-50 model and printing the node names with + ``train_nodes, _ = get_graph_node_names(model) print(train_nodes)`` and + observe that the last node pertaining to ``layer4`` is + ``"layer4.2.relu_2"``. One may specify ``"layer4.2.relu_2"`` as the return + node, or just ``"layer4"`` as this, by convention, refers to the last node + (in order of execution) of ``layer4``. +- If a certain module or operation is repeated more than once, node names get + an additional ``_{int}`` postfix to disambiguate. For instance, maybe the + addition (``+``) operation is used three times in the same ``forward`` + method. Then there would be ``"path.to.module.add"``, + ``"path.to.module.add_1"``, ``"path.to.module.add_2"``. The counter is + maintained within the scope of the direct parent. So in ResNet-50 there is + a ``"layer4.1.add"`` and a ``"layer4.2.add"``. Because the addition + operations reside in different blocks, there is no need for a postfix to + disambiguate. + + +**An Example** + +Here is an example of how we might extract features for MaskRCNN: + +.. code-block:: python + + import torch + from torchvision.models import resnet50 + from torchvision.models.feature_extraction import get_graph_node_names + from torchvision.models.feature_extraction import create_feature_extractor + from torchvision.models.detection.mask_rcnn import MaskRCNN + from torchvision.models.detection.backbone_utils import LastLevelMaxPool + from torchvision.ops.feature_pyramid_network import FeaturePyramidNetwork + + + # To assist you in designing the feature extractor you may want to print out + # the available nodes for resnet50. + m = resnet50() + train_nodes, eval_nodes = get_graph_node_names(resnet50()) + + # The lists returned, are the names of all the graph nodes (in order of + # execution) for the input model traced in train mode and in eval mode + # respectively. You'll find that `train_nodes` and `eval_nodes` are the same + # for this example. But if the model contains control flow that's dependent + # on the training mode, they may be different. + + # To specify the nodes you want to extract, you could select the final node + # that appears in each of the main layers: + return_nodes = { + # node_name: user-specified key for output dict + 'layer1.2.relu_2': 'layer1', + 'layer2.3.relu_2': 'layer2', + 'layer3.5.relu_2': 'layer3', + 'layer4.2.relu_2': 'layer4', + } + + # But `create_feature_extractor` can also accept truncated node specifications + # like "layer1", as it will just pick the last node that's a descendent of + # of the specification. (Tip: be careful with this, especially when a layer + # has multiple outputs. It's not always guaranteed that the last operation + # performed is the one that corresponds to the output you desire. You should + # consult the source code for the input model to confirm.) + return_nodes = { + 'layer1': 'layer1', + 'layer2': 'layer2', + 'layer3': 'layer3', + 'layer4': 'layer4', + } + + # Now you can build the feature extractor. This returns a module whose forward + # method returns a dictionary like: + # { + # 'layer1': output of layer 1, + # 'layer2': output of layer 2, + # 'layer3': output of layer 3, + # 'layer4': output of layer 4, + # } + create_feature_extractor(m, return_nodes=return_nodes) + + # Let's put all that together to wrap resnet50 with MaskRCNN + + # MaskRCNN requires a backbone with an attached FPN + class Resnet50WithFPN(torch.nn.Module): + def __init__(self): + super(Resnet50WithFPN, self).__init__() + # Get a resnet50 backbone + m = resnet50() + # Extract 4 main layers (note: MaskRCNN needs this particular name + # mapping for return nodes) + self.body = create_feature_extractor( + m, return_nodes={f'layer{k}': str(v) + for v, k in enumerate([1, 2, 3, 4])}) + # Dry run to get number of channels for FPN + inp = torch.randn(2, 3, 224, 224) + with torch.no_grad(): + out = self.body(inp) + in_channels_list = [o.shape[1] for o in out.values()] + # Build FPN + self.out_channels = 256 + self.fpn = FeaturePyramidNetwork( + in_channels_list, out_channels=self.out_channels, + extra_blocks=LastLevelMaxPool()) + + def forward(self, x): + x = self.body(x) + x = self.fpn(x) + return x + + + # Now we can build our model! + model = MaskRCNN(Resnet50WithFPN(), num_classes=91).eval() + + +API Reference +------------- + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + create_feature_extractor + get_graph_node_names diff --git a/docs/source/index.rst b/docs/source/index.rst index 61cb573c96f72c78486dd949cab9c600263d6870..dc5fdefaefb032ea7db7eb0e478d23bb7a7e37d8 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -31,18 +31,21 @@ architectures, and common image transformations for computer vision. :maxdepth: 2 :caption: Package Reference - datasets - io - models - ops transforms + tv_tensors + models + datasets utils + ops + io + feature_extraction .. toctree:: :maxdepth: 1 - :caption: Examples + :caption: Examples and training references auto_examples/index + training_references .. automodule:: torchvision :members: @@ -58,3 +61,9 @@ architectures, and common image transformations for computer vision. TorchElastic TorchServe PyTorch on XLA Devices + + +Indices +------- + +* :ref:`genindex` diff --git a/docs/source/io.rst b/docs/source/io.rst index 2e416469d1774dbc0a29ad960a1609e2b421d764..f82587131631e6d4a9b9dbf317cf69f2de550053 100644 --- a/docs/source/io.rst +++ b/docs/source/io.rst @@ -1,31 +1,65 @@ -torchvision.io -============== +Decoding / Encoding images and videos +===================================== .. currentmodule:: torchvision.io The :mod:`torchvision.io` package provides functions for performing IO -operations. They are currently specific to reading and writing video and -images. +operations. They are currently specific to reading and writing images and +videos. + +Images +------ + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + read_image + decode_image + encode_jpeg + decode_jpeg + write_jpeg + decode_gif + encode_png + decode_png + write_png + read_file + write_file + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + ImageReadMode + + Video ----- -.. autofunction:: read_video - -.. autofunction:: read_video_timestamps +.. autosummary:: + :toctree: generated/ + :template: function.rst -.. autofunction:: write_video + read_video + read_video_timestamps + write_video Fine-grained video API ----------------------- +^^^^^^^^^^^^^^^^^^^^^^ In addition to the :mod:`read_video` function, we provide a high-performance lower-level API for more fine-grained control compared to the :mod:`read_video` function. It does all this whilst fully supporting torchscript. -.. autoclass:: VideoReader - :members: __next__, get_metadata, set_current_stream, seek +.. betastatus:: fine-grained video API + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + VideoReader Example of inspecting a video: @@ -54,29 +88,3 @@ Example of inspecting a video: # the constructor we select a default video stream, but # in practice, we can set whichever stream we would like video.set_current_stream("video:0") - - -Image ------ - -.. autoclass:: ImageReadMode - -.. autofunction:: read_image - -.. autofunction:: decode_image - -.. autofunction:: encode_jpeg - -.. autofunction:: decode_jpeg - -.. autofunction:: write_jpeg - -.. autofunction:: encode_png - -.. autofunction:: decode_png - -.. autofunction:: write_png - -.. autofunction:: read_file - -.. autofunction:: write_file diff --git a/docs/source/models.rst b/docs/source/models.rst index b9bff7a36e86a399ce453e646d52f93cf38e45b1..155407786025401414e87c1f58e096e470c6807d 100644 --- a/docs/source/models.rst +++ b/docs/source/models.rst @@ -1,585 +1,573 @@ -torchvision.models -################## +.. _models: +Models and pre-trained weights +############################## -The models subpackage contains definitions of models for addressing +The ``torchvision.models`` subpackage contains definitions of models for addressing different tasks, including: image classification, pixelwise semantic segmentation, object detection, instance segmentation, person -keypoint detection and video classification. +keypoint detection, video classification, and optical flow. +General information on pre-trained weights +========================================== -Classification -============== +TorchVision offers pre-trained weights for every provided architecture, using +the PyTorch :mod:`torch.hub`. Instancing a pre-trained model will download its +weights to a cache directory. This directory can be set using the `TORCH_HOME` +environment variable. See :func:`torch.hub.load_state_dict_from_url` for details. + +.. note:: + + The pre-trained models provided in this library may have their own licenses or + terms and conditions derived from the dataset used for training. It is your + responsibility to determine whether you have permission to use the models for + your use case. + +.. note :: + Backward compatibility is guaranteed for loading a serialized + ``state_dict`` to the model created using old PyTorch version. + On the contrary, loading entire saved models or serialized + ``ScriptModules`` (serialized using older versions of PyTorch) + may not preserve the historic behaviour. Refer to the following + `documentation + `_ -The models subpackage contains definitions for the following model -architectures for image classification: - -- `AlexNet`_ -- `VGG`_ -- `ResNet`_ -- `SqueezeNet`_ -- `DenseNet`_ -- `Inception`_ v3 -- `GoogLeNet`_ -- `ShuffleNet`_ v2 -- `MobileNetV2`_ -- `MobileNetV3`_ -- `ResNeXt`_ -- `Wide ResNet`_ -- `MNASNet`_ - -You can construct a model with random weights by calling its constructor: + +Initializing pre-trained models +------------------------------- + +As of v0.13, TorchVision offers a new `Multi-weight support API +`_ +for loading different weights to the existing model builder methods: .. code:: python - import torchvision.models as models - resnet18 = models.resnet18() - alexnet = models.alexnet() - vgg16 = models.vgg16() - squeezenet = models.squeezenet1_0() - densenet = models.densenet161() - inception = models.inception_v3() - googlenet = models.googlenet() - shufflenet = models.shufflenet_v2_x1_0() - mobilenet_v2 = models.mobilenet_v2() - mobilenet_v3_large = models.mobilenet_v3_large() - mobilenet_v3_small = models.mobilenet_v3_small() - resnext50_32x4d = models.resnext50_32x4d() - wide_resnet50_2 = models.wide_resnet50_2() - mnasnet = models.mnasnet1_0() - -We provide pre-trained models, using the PyTorch :mod:`torch.utils.model_zoo`. -These can be constructed by passing ``pretrained=True``: + from torchvision.models import resnet50, ResNet50_Weights + + # Old weights with accuracy 76.130% + resnet50(weights=ResNet50_Weights.IMAGENET1K_V1) + + # New weights with accuracy 80.858% + resnet50(weights=ResNet50_Weights.IMAGENET1K_V2) + + # Best available weights (currently alias for IMAGENET1K_V2) + # Note that these weights may change across versions + resnet50(weights=ResNet50_Weights.DEFAULT) + + # Strings are also supported + resnet50(weights="IMAGENET1K_V2") + + # No weights - random initialization + resnet50(weights=None) + + +Migrating to the new API is very straightforward. The following method calls between the 2 APIs are all equivalent: .. code:: python - import torchvision.models as models - resnet18 = models.resnet18(pretrained=True) - alexnet = models.alexnet(pretrained=True) - squeezenet = models.squeezenet1_0(pretrained=True) - vgg16 = models.vgg16(pretrained=True) - densenet = models.densenet161(pretrained=True) - inception = models.inception_v3(pretrained=True) - googlenet = models.googlenet(pretrained=True) - shufflenet = models.shufflenet_v2_x1_0(pretrained=True) - mobilenet_v2 = models.mobilenet_v2(pretrained=True) - mobilenet_v3_large = models.mobilenet_v3_large(pretrained=True) - mobilenet_v3_small = models.mobilenet_v3_small(pretrained=True) - resnext50_32x4d = models.resnext50_32x4d(pretrained=True) - wide_resnet50_2 = models.wide_resnet50_2(pretrained=True) - mnasnet = models.mnasnet1_0(pretrained=True) - -Instancing a pre-trained model will download its weights to a cache directory. -This directory can be set using the `TORCH_MODEL_ZOO` environment variable. See -:func:`torch.utils.model_zoo.load_url` for details. + from torchvision.models import resnet50, ResNet50_Weights + + # Using pretrained weights: + resnet50(weights=ResNet50_Weights.IMAGENET1K_V1) + resnet50(weights="IMAGENET1K_V1") + resnet50(pretrained=True) # deprecated + resnet50(True) # deprecated + + # Using no weights: + resnet50(weights=None) + resnet50() + resnet50(pretrained=False) # deprecated + resnet50(False) # deprecated + +Note that the ``pretrained`` parameter is now deprecated, using it will emit warnings and will be removed on v0.15. + +Using the pre-trained models +---------------------------- + +Before using the pre-trained models, one must preprocess the image +(resize with right resolution/interpolation, apply inference transforms, +rescale the values etc). There is no standard way to do this as it depends on +how a given model was trained. It can vary across model families, variants or +even weight versions. Using the correct preprocessing method is critical and +failing to do so may lead to decreased accuracy or incorrect outputs. + +All the necessary information for the inference transforms of each pre-trained +model is provided on its weights documentation. To simplify inference, TorchVision +bundles the necessary preprocessing transforms into each model weight. These are +accessible via the ``weight.transforms`` attribute: + +.. code:: python + + # Initialize the Weight Transforms + weights = ResNet50_Weights.DEFAULT + preprocess = weights.transforms() + + # Apply it to the input image + img_transformed = preprocess(img) + Some models use modules which have different training and evaluation behavior, such as batch normalization. To switch between these modes, use ``model.train()`` or ``model.eval()`` as appropriate. See :meth:`~torch.nn.Module.train` or :meth:`~torch.nn.Module.eval` for details. -All pre-trained models expect input images normalized in the same way, -i.e. mini-batches of 3-channel RGB images of shape (3 x H x W), -where H and W are expected to be at least 224. -The images have to be loaded in to a range of [0, 1] and then normalized -using ``mean = [0.485, 0.456, 0.406]`` and ``std = [0.229, 0.224, 0.225]``. -You can use the following transform to normalize:: +.. code:: python - normalize = transforms.Normalize(mean=[0.485, 0.456, 0.406], - std=[0.229, 0.224, 0.225]) + # Initialize model + weights = ResNet50_Weights.DEFAULT + model = resnet50(weights=weights) -An example of such normalization can be found in the imagenet example -`here `_ + # Set model to eval mode + model.eval() -The process for obtaining the values of `mean` and `std` is roughly equivalent -to:: +Listing and retrieving available models +--------------------------------------- - import torch - from torchvision import datasets, transforms as T - - transform = T.Compose([T.Resize(256), T.CenterCrop(224), T.ToTensor()]) - dataset = datasets.ImageNet(".", split="train", transform=transform) - - means = [] - stds = [] - for img in subset(dataset): - means.append(torch.mean(img)) - stds.append(torch.std(img)) - - mean = torch.mean(torch.tensor(means)) - std = torch.mean(torch.tensor(stds)) - -Unfortunately, the concrete `subset` that was used is lost. For more -information see `this discussion `_ -or `these experiments `_. - -ImageNet 1-crop error rates (224x224) - -================================ ============= ============= -Model Acc@1 Acc@5 -================================ ============= ============= -AlexNet 56.522 79.066 -VGG-11 69.020 88.628 -VGG-13 69.928 89.246 -VGG-16 71.592 90.382 -VGG-19 72.376 90.876 -VGG-11 with batch normalization 70.370 89.810 -VGG-13 with batch normalization 71.586 90.374 -VGG-16 with batch normalization 73.360 91.516 -VGG-19 with batch normalization 74.218 91.842 -ResNet-18 69.758 89.078 -ResNet-34 73.314 91.420 -ResNet-50 76.130 92.862 -ResNet-101 77.374 93.546 -ResNet-152 78.312 94.046 -SqueezeNet 1.0 58.092 80.420 -SqueezeNet 1.1 58.178 80.624 -Densenet-121 74.434 91.972 -Densenet-169 75.600 92.806 -Densenet-201 76.896 93.370 -Densenet-161 77.138 93.560 -Inception v3 77.294 93.450 -GoogleNet 69.778 89.530 -ShuffleNet V2 x1.0 69.362 88.316 -ShuffleNet V2 x0.5 60.552 81.746 -MobileNet V2 71.878 90.286 -MobileNet V3 Large 74.042 91.340 -MobileNet V3 Small 67.668 87.402 -ResNeXt-50-32x4d 77.618 93.698 -ResNeXt-101-32x8d 79.312 94.526 -Wide ResNet-50-2 78.468 94.086 -Wide ResNet-101-2 78.848 94.284 -MNASNet 1.0 73.456 91.510 -MNASNet 0.5 67.734 87.490 -================================ ============= ============= - - -.. _AlexNet: https://arxiv.org/abs/1404.5997 -.. _VGG: https://arxiv.org/abs/1409.1556 -.. _ResNet: https://arxiv.org/abs/1512.03385 -.. _SqueezeNet: https://arxiv.org/abs/1602.07360 -.. _DenseNet: https://arxiv.org/abs/1608.06993 -.. _Inception: https://arxiv.org/abs/1512.00567 -.. _GoogLeNet: https://arxiv.org/abs/1409.4842 -.. _ShuffleNet: https://arxiv.org/abs/1807.11164 -.. _MobileNetV2: https://arxiv.org/abs/1801.04381 -.. _MobileNetV3: https://arxiv.org/abs/1905.02244 -.. _ResNeXt: https://arxiv.org/abs/1611.05431 -.. _MNASNet: https://arxiv.org/abs/1807.11626 +As of v0.14, TorchVision offers a new mechanism which allows listing and +retrieving models and weights by their names. Here are a few examples on how to +use them: -.. currentmodule:: torchvision.models +.. code:: python -Alexnet -------- + # List available models + all_models = list_models() + classification_models = list_models(module=torchvision.models) -.. autofunction:: alexnet + # Initialize models + m1 = get_model("mobilenet_v3_large", weights=None) + m2 = get_model("quantized_mobilenet_v3_large", weights="DEFAULT") -VGG ---- + # Fetch weights + weights = get_weight("MobileNet_V3_Large_QuantizedWeights.DEFAULT") + assert weights == MobileNet_V3_Large_QuantizedWeights.DEFAULT -.. autofunction:: vgg11 -.. autofunction:: vgg11_bn -.. autofunction:: vgg13 -.. autofunction:: vgg13_bn -.. autofunction:: vgg16 -.. autofunction:: vgg16_bn -.. autofunction:: vgg19 -.. autofunction:: vgg19_bn + weights_enum = get_model_weights("quantized_mobilenet_v3_large") + assert weights_enum == MobileNet_V3_Large_QuantizedWeights + weights_enum2 = get_model_weights(torchvision.models.quantization.mobilenet_v3_large) + assert weights_enum == weights_enum2 -ResNet ------- +Here are the available public functions to retrieve models and their corresponding weights: -.. autofunction:: resnet18 -.. autofunction:: resnet34 -.. autofunction:: resnet50 -.. autofunction:: resnet101 -.. autofunction:: resnet152 +.. currentmodule:: torchvision.models +.. autosummary:: + :toctree: generated/ + :template: function.rst -SqueezeNet ----------- + get_model + get_model_weights + get_weight + list_models -.. autofunction:: squeezenet1_0 -.. autofunction:: squeezenet1_1 +Using models from Hub +--------------------- -DenseNet ---------- +Most pre-trained models can be accessed directly via PyTorch Hub without having TorchVision installed: -.. autofunction:: densenet121 -.. autofunction:: densenet169 -.. autofunction:: densenet161 -.. autofunction:: densenet201 +.. code:: python -Inception v3 ------------- + import torch -.. autofunction:: inception_v3 + # Option 1: passing weights param as string + model = torch.hub.load("pytorch/vision", "resnet50", weights="IMAGENET1K_V2") -.. note :: - This requires `scipy` to be installed + # Option 2: passing weights param as enum + weights = torch.hub.load("pytorch/vision", "get_weight", weights="ResNet50_Weights.IMAGENET1K_V2") + model = torch.hub.load("pytorch/vision", "resnet50", weights=weights) +You can also retrieve all the available weights of a specific model via PyTorch Hub by doing: -GoogLeNet ------------- +.. code:: python -.. autofunction:: googlenet + import torch -.. note :: - This requires `scipy` to be installed + weight_enum = torch.hub.load("pytorch/vision", "get_model_weights", name="resnet50") + print([weight for weight in weight_enum]) + +The only exception to the above are the detection models included on +:mod:`torchvision.models.detection`. These models require TorchVision +to be installed because they depend on custom C++ operators. + +Classification +============== +.. currentmodule:: torchvision.models -ShuffleNet v2 -------------- +The following classification models are available, with or without pre-trained +weights: + +.. toctree:: + :maxdepth: 1 + + models/alexnet + models/convnext + models/densenet + models/efficientnet + models/efficientnetv2 + models/googlenet + models/inception + models/maxvit + models/mnasnet + models/mobilenetv2 + models/mobilenetv3 + models/regnet + models/resnet + models/resnext + models/shufflenetv2 + models/squeezenet + models/swin_transformer + models/vgg + models/vision_transformer + models/wide_resnet + +| + +Here is an example of how to use the pre-trained image classification models: -.. autofunction:: shufflenet_v2_x0_5 -.. autofunction:: shufflenet_v2_x1_0 -.. autofunction:: shufflenet_v2_x1_5 -.. autofunction:: shufflenet_v2_x2_0 +.. code:: python -MobileNet v2 -------------- + from torchvision.io import read_image + from torchvision.models import resnet50, ResNet50_Weights -.. autofunction:: mobilenet_v2 + img = read_image("test/assets/encode_jpeg/grace_hopper_517x606.jpg") -MobileNet v3 -------------- + # Step 1: Initialize model with the best available weights + weights = ResNet50_Weights.DEFAULT + model = resnet50(weights=weights) + model.eval() -.. autofunction:: mobilenet_v3_large -.. autofunction:: mobilenet_v3_small + # Step 2: Initialize the inference transforms + preprocess = weights.transforms() -ResNext -------- + # Step 3: Apply inference preprocessing transforms + batch = preprocess(img).unsqueeze(0) -.. autofunction:: resnext50_32x4d -.. autofunction:: resnext101_32x8d + # Step 4: Use the model and print the predicted category + prediction = model(batch).squeeze(0).softmax(0) + class_id = prediction.argmax().item() + score = prediction[class_id].item() + category_name = weights.meta["categories"][class_id] + print(f"{category_name}: {100 * score:.1f}%") -Wide ResNet ------------ +The classes of the pre-trained model outputs can be found at ``weights.meta["categories"]``. -.. autofunction:: wide_resnet50_2 -.. autofunction:: wide_resnet101_2 +Table of all available classification weights +--------------------------------------------- -MNASNet --------- +Accuracies are reported on ImageNet-1K using single crops: -.. autofunction:: mnasnet0_5 -.. autofunction:: mnasnet0_75 -.. autofunction:: mnasnet1_0 -.. autofunction:: mnasnet1_3 +.. include:: generated/classification_table.rst -Quantized Models +Quantized models ---------------- -The following architectures provide support for INT8 quantized models. You can get -a model with random weights by calling its constructor: +.. currentmodule:: torchvision.models.quantization -.. code:: python +The following architectures provide support for INT8 quantized models, with or without +pre-trained weights: + +.. toctree:: + :maxdepth: 1 - import torchvision.models as models - googlenet = models.quantization.googlenet() - inception_v3 = models.quantization.inception_v3() - mobilenet_v2 = models.quantization.mobilenet_v2() - mobilenet_v3_large = models.quantization.mobilenet_v3_large() - resnet18 = models.quantization.resnet18() - resnet50 = models.quantization.resnet50() - resnext101_32x8d = models.quantization.resnext101_32x8d() - shufflenet_v2_x0_5 = models.quantization.shufflenet_v2_x0_5() - shufflenet_v2_x1_0 = models.quantization.shufflenet_v2_x1_0() - shufflenet_v2_x1_5 = models.quantization.shufflenet_v2_x1_5() - shufflenet_v2_x2_0 = models.quantization.shufflenet_v2_x2_0() - -Obtaining a pre-trained quantized model can be done with a few lines of code: + models/googlenet_quant + models/inception_quant + models/mobilenetv2_quant + models/mobilenetv3_quant + models/resnet_quant + models/resnext_quant + models/shufflenetv2_quant + +| + +Here is an example of how to use the pre-trained quantized image classification models: .. code:: python - import torchvision.models as models - model = models.quantization.mobilenet_v2(pretrained=True, quantize=True) + from torchvision.io import read_image + from torchvision.models.quantization import resnet50, ResNet50_QuantizedWeights + + img = read_image("test/assets/encode_jpeg/grace_hopper_517x606.jpg") + + # Step 1: Initialize model with the best available weights + weights = ResNet50_QuantizedWeights.DEFAULT + model = resnet50(weights=weights, quantize=True) model.eval() - # run the model with quantized inputs and weights - out = model(torch.rand(1, 3, 224, 224)) -We provide pre-trained quantized weights for the following models: + # Step 2: Initialize the inference transforms + preprocess = weights.transforms() + + # Step 3: Apply inference preprocessing transforms + batch = preprocess(img).unsqueeze(0) + + # Step 4: Use the model and print the predicted category + prediction = model(batch).squeeze(0).softmax(0) + class_id = prediction.argmax().item() + score = prediction[class_id].item() + category_name = weights.meta["categories"][class_id] + print(f"{category_name}: {100 * score}%") -================================ ============= ============= -Model Acc@1 Acc@5 -================================ ============= ============= -MobileNet V2 71.658 90.150 -MobileNet V3 Large 73.004 90.858 -ShuffleNet V2 68.360 87.582 -ResNet 18 69.494 88.882 -ResNet 50 75.920 92.814 -ResNext 101 32x8d 78.986 94.480 -Inception V3 77.176 93.354 -GoogleNet 69.826 89.404 -================================ ============= ============= +The classes of the pre-trained model outputs can be found at ``weights.meta["categories"]``. +Table of all available quantized classification weights +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Accuracies are reported on ImageNet-1K using single crops: + +.. include:: generated/classification_quant_table.rst + Semantic Segmentation ===================== -The models subpackage contains definitions for the following model -architectures for semantic segmentation: +.. currentmodule:: torchvision.models.segmentation -- `FCN ResNet50, ResNet101 `_ -- `DeepLabV3 ResNet50, ResNet101, MobileNetV3-Large `_ -- `LR-ASPP MobileNetV3-Large `_ +.. betastatus:: segmentation module -As with image classification models, all pre-trained models expect input images normalized in the same way. -The images have to be loaded in to a range of ``[0, 1]`` and then normalized using -``mean = [0.485, 0.456, 0.406]`` and ``std = [0.229, 0.224, 0.225]``. -They have been trained on images resized such that their minimum size is 520. +The following semantic segmentation models are available, with or without +pre-trained weights: -For details on how to plot the masks of such models, you may refer to :ref:`semantic_seg_output`. +.. toctree:: + :maxdepth: 1 -The pre-trained models have been trained on a subset of COCO train2017, on the 20 categories that are -present in the Pascal VOC dataset. You can see more information on how the subset has been selected in -``references/segmentation/coco_utils.py``. The classes that the pre-trained model outputs are the following, -in order: + models/deeplabv3 + models/fcn + models/lraspp - .. code-block:: python +| - ['__background__', 'aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus', - 'car', 'cat', 'chair', 'cow', 'diningtable', 'dog', 'horse', 'motorbike', - 'person', 'pottedplant', 'sheep', 'sofa', 'train', 'tvmonitor'] +Here is an example of how to use the pre-trained semantic segmentation models: -The accuracies of the pre-trained models evaluated on COCO val2017 are as follows +.. code:: python -================================ ============= ==================== -Network mean IoU global pixelwise acc -================================ ============= ==================== -FCN ResNet50 60.5 91.4 -FCN ResNet101 63.7 91.9 -DeepLabV3 ResNet50 66.4 92.4 -DeepLabV3 ResNet101 67.4 92.4 -DeepLabV3 MobileNetV3-Large 60.3 91.2 -LR-ASPP MobileNetV3-Large 57.9 91.2 -================================ ============= ==================== + from torchvision.io.image import read_image + from torchvision.models.segmentation import fcn_resnet50, FCN_ResNet50_Weights + from torchvision.transforms.functional import to_pil_image + img = read_image("gallery/assets/dog1.jpg") -Fully Convolutional Networks ----------------------------- + # Step 1: Initialize model with the best available weights + weights = FCN_ResNet50_Weights.DEFAULT + model = fcn_resnet50(weights=weights) + model.eval() -.. autofunction:: torchvision.models.segmentation.fcn_resnet50 -.. autofunction:: torchvision.models.segmentation.fcn_resnet101 + # Step 2: Initialize the inference transforms + preprocess = weights.transforms() + # Step 3: Apply inference preprocessing transforms + batch = preprocess(img).unsqueeze(0) -DeepLabV3 ---------- + # Step 4: Use the model and visualize the prediction + prediction = model(batch)["out"] + normalized_masks = prediction.softmax(dim=1) + class_to_idx = {cls: idx for (idx, cls) in enumerate(weights.meta["categories"])} + mask = normalized_masks[0, class_to_idx["dog"]] + to_pil_image(mask).show() -.. autofunction:: torchvision.models.segmentation.deeplabv3_resnet50 -.. autofunction:: torchvision.models.segmentation.deeplabv3_resnet101 -.. autofunction:: torchvision.models.segmentation.deeplabv3_mobilenet_v3_large +The classes of the pre-trained model outputs can be found at ``weights.meta["categories"]``. +The output format of the models is illustrated in :ref:`semantic_seg_output`. -LR-ASPP -------- +Table of all available semantic segmentation weights +---------------------------------------------------- + +All models are evaluated a subset of COCO val2017, on the 20 categories that are present in the Pascal VOC dataset: + +.. include:: generated/segmentation_table.rst -.. autofunction:: torchvision.models.segmentation.lraspp_mobilenet_v3_large .. _object_det_inst_seg_pers_keypoint_det: Object Detection, Instance Segmentation and Person Keypoint Detection ===================================================================== -The models subpackage contains definitions for the following model -architectures for detection: - -- `Faster R-CNN `_ -- `Mask R-CNN `_ -- `RetinaNet `_ -- `SSD `_ -- `SSDlite `_ - The pre-trained models for detection, instance segmentation and keypoint detection are initialized with the classification models -in torchvision. - -The models expect a list of ``Tensor[C, H, W]``, in the range ``0-1``. -The models internally resize the images but the behaviour varies depending -on the model. Check the constructor of the models for more information. The -output format of such models is illustrated in :ref:`instance_seg_output`. - - -For object detection and instance segmentation, the pre-trained -models return the predictions of the following classes: - - .. code-block:: python - - COCO_INSTANCE_CATEGORY_NAMES = [ - '__background__', 'person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus', - 'train', 'truck', 'boat', 'traffic light', 'fire hydrant', 'N/A', 'stop sign', - 'parking meter', 'bench', 'bird', 'cat', 'dog', 'horse', 'sheep', 'cow', - 'elephant', 'bear', 'zebra', 'giraffe', 'N/A', 'backpack', 'umbrella', 'N/A', 'N/A', - 'handbag', 'tie', 'suitcase', 'frisbee', 'skis', 'snowboard', 'sports ball', - 'kite', 'baseball bat', 'baseball glove', 'skateboard', 'surfboard', 'tennis racket', - 'bottle', 'N/A', 'wine glass', 'cup', 'fork', 'knife', 'spoon', 'bowl', - 'banana', 'apple', 'sandwich', 'orange', 'broccoli', 'carrot', 'hot dog', 'pizza', - 'donut', 'cake', 'chair', 'couch', 'potted plant', 'bed', 'N/A', 'dining table', - 'N/A', 'N/A', 'toilet', 'N/A', 'tv', 'laptop', 'mouse', 'remote', 'keyboard', 'cell phone', - 'microwave', 'oven', 'toaster', 'sink', 'refrigerator', 'N/A', 'book', - 'clock', 'vase', 'scissors', 'teddy bear', 'hair drier', 'toothbrush' - ] - - -Here are the summary of the accuracies for the models trained on -the instances set of COCO train2017 and evaluated on COCO val2017. - -====================================== ======= ======== =========== -Network box AP mask AP keypoint AP -====================================== ======= ======== =========== -Faster R-CNN ResNet-50 FPN 37.0 - - -Faster R-CNN MobileNetV3-Large FPN 32.8 - - -Faster R-CNN MobileNetV3-Large 320 FPN 22.8 - - -RetinaNet ResNet-50 FPN 36.4 - - -SSD300 VGG16 25.1 - - -SSDlite320 MobileNetV3-Large 21.3 - - -Mask R-CNN ResNet-50 FPN 37.9 34.6 - -====================================== ======= ======== =========== +in torchvision. The models expect a list of ``Tensor[C, H, W]``. +Check the constructor of the models for more information. + +.. betastatus:: detection module + +Object Detection +---------------- + +.. currentmodule:: torchvision.models.detection + +The following object detection models are available, with or without pre-trained +weights: + +.. toctree:: + :maxdepth: 1 + + models/faster_rcnn + models/fcos + models/retinanet + models/ssd + models/ssdlite + +| -For person keypoint detection, the accuracies for the pre-trained -models are as follows +Here is an example of how to use the pre-trained object detection models: -================================ ======= ======== =========== -Network box AP mask AP keypoint AP -================================ ======= ======== =========== -Keypoint R-CNN ResNet-50 FPN 54.6 - 65.0 -================================ ======= ======== =========== +.. code:: python + + + from torchvision.io.image import read_image + from torchvision.models.detection import fasterrcnn_resnet50_fpn_v2, FasterRCNN_ResNet50_FPN_V2_Weights + from torchvision.utils import draw_bounding_boxes + from torchvision.transforms.functional import to_pil_image + + img = read_image("test/assets/encode_jpeg/grace_hopper_517x606.jpg") + + # Step 1: Initialize model with the best available weights + weights = FasterRCNN_ResNet50_FPN_V2_Weights.DEFAULT + model = fasterrcnn_resnet50_fpn_v2(weights=weights, box_score_thresh=0.9) + model.eval() -For person keypoint detection, the pre-trained model return the -keypoints in the following order: + # Step 2: Initialize the inference transforms + preprocess = weights.transforms() - .. code-block:: python + # Step 3: Apply inference preprocessing transforms + batch = [preprocess(img)] - COCO_PERSON_KEYPOINT_NAMES = [ - 'nose', - 'left_eye', - 'right_eye', - 'left_ear', - 'right_ear', - 'left_shoulder', - 'right_shoulder', - 'left_elbow', - 'right_elbow', - 'left_wrist', - 'right_wrist', - 'left_hip', - 'right_hip', - 'left_knee', - 'right_knee', - 'left_ankle', - 'right_ankle' - ] + # Step 4: Use the model and visualize the prediction + prediction = model(batch)[0] + labels = [weights.meta["categories"][i] for i in prediction["labels"]] + box = draw_bounding_boxes(img, boxes=prediction["boxes"], + labels=labels, + colors="red", + width=4, font_size=30) + im = to_pil_image(box.detach()) + im.show() -Runtime characteristics ------------------------ +The classes of the pre-trained model outputs can be found at ``weights.meta["categories"]``. +For details on how to plot the bounding boxes of the models, you may refer to :ref:`instance_seg_output`. -The implementations of the models for object detection, instance segmentation -and keypoint detection are efficient. +Table of all available Object detection weights +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -In the following table, we use 8 GPUs to report the results. During training, -we use a batch size of 2 per GPU for all models except SSD which uses 4 -and SSDlite which uses 24. During testing a batch size of 1 is used. +Box MAPs are reported on COCO val2017: -For test time, we report the time for the model evaluation and postprocessing -(including mask pasting in image), but not the time for computing the -precision-recall. +.. include:: generated/detection_table.rst -====================================== =================== ================== =========== -Network train time (s / it) test time (s / it) memory (GB) -====================================== =================== ================== =========== -Faster R-CNN ResNet-50 FPN 0.2288 0.0590 5.2 -Faster R-CNN MobileNetV3-Large FPN 0.1020 0.0415 1.0 -Faster R-CNN MobileNetV3-Large 320 FPN 0.0978 0.0376 0.6 -RetinaNet ResNet-50 FPN 0.2514 0.0939 4.1 -SSD300 VGG16 0.2093 0.0744 1.5 -SSDlite320 MobileNetV3-Large 0.1773 0.0906 1.5 -Mask R-CNN ResNet-50 FPN 0.2728 0.0903 5.4 -Keypoint R-CNN ResNet-50 FPN 0.3789 0.1242 6.8 -====================================== =================== ================== =========== +Instance Segmentation +--------------------- -Faster R-CNN ------------- +.. currentmodule:: torchvision.models.detection -.. autofunction:: torchvision.models.detection.fasterrcnn_resnet50_fpn -.. autofunction:: torchvision.models.detection.fasterrcnn_mobilenet_v3_large_fpn -.. autofunction:: torchvision.models.detection.fasterrcnn_mobilenet_v3_large_320_fpn +The following instance segmentation models are available, with or without pre-trained +weights: +.. toctree:: + :maxdepth: 1 -RetinaNet ---------- + models/mask_rcnn -.. autofunction:: torchvision.models.detection.retinanet_resnet50_fpn +| -SSD ---- +For details on how to plot the masks of the models, you may refer to :ref:`instance_seg_output`. -.. autofunction:: torchvision.models.detection.ssd300_vgg16 +Table of all available Instance segmentation weights +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Box and Mask MAPs are reported on COCO val2017: -SSDlite -------- +.. include:: generated/instance_segmentation_table.rst -.. autofunction:: torchvision.models.detection.ssdlite320_mobilenet_v3_large +Keypoint Detection +------------------ +.. currentmodule:: torchvision.models.detection -Mask R-CNN ----------- +The following person keypoint detection models are available, with or without +pre-trained weights: -.. autofunction:: torchvision.models.detection.maskrcnn_resnet50_fpn +.. toctree:: + :maxdepth: 1 + models/keypoint_rcnn -Keypoint R-CNN --------------- +| -.. autofunction:: torchvision.models.detection.keypointrcnn_resnet50_fpn +The classes of the pre-trained model outputs can be found at ``weights.meta["keypoint_names"]``. +For details on how to plot the bounding boxes of the models, you may refer to :ref:`keypoint_output`. +Table of all available Keypoint detection weights +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Video classification +Box and Keypoint MAPs are reported on COCO val2017: + +.. include:: generated/detection_keypoint_table.rst + + +Video Classification ==================== -We provide models for action recognition pre-trained on Kinetics-400. -They have all been trained with the scripts provided in ``references/video_classification``. +.. currentmodule:: torchvision.models.video -All pre-trained models expect input images normalized in the same way, -i.e. mini-batches of 3-channel RGB videos of shape (3 x T x H x W), -where H and W are expected to be 112, and T is a number of video frames in a clip. -The images have to be loaded in to a range of [0, 1] and then normalized -using ``mean = [0.43216, 0.394666, 0.37645]`` and ``std = [0.22803, 0.22145, 0.216989]``. +.. betastatus:: video module +The following video classification models are available, with or without +pre-trained weights: -.. note:: - The normalization parameters are different from the image classification ones, and correspond - to the mean and std from Kinetics-400. +.. toctree:: + :maxdepth: 1 -.. note:: - For now, normalization code can be found in ``references/video_classification/transforms.py``, - see the ``Normalize`` function there. Note that it differs from standard normalization for - images because it assumes the video is 4d. + models/video_mvit + models/video_resnet + models/video_s3d + models/video_swin_transformer + +| + +Here is an example of how to use the pre-trained video classification models: + +.. code:: python + + + from torchvision.io.video import read_video + from torchvision.models.video import r3d_18, R3D_18_Weights + + vid, _, _ = read_video("test/assets/videos/v_SoccerJuggling_g23_c01.avi", output_format="TCHW") + vid = vid[:32] # optionally shorten duration + + # Step 1: Initialize model with the best available weights + weights = R3D_18_Weights.DEFAULT + model = r3d_18(weights=weights) + model.eval() + + # Step 2: Initialize the inference transforms + preprocess = weights.transforms() + + # Step 3: Apply inference preprocessing transforms + batch = preprocess(vid).unsqueeze(0) + + # Step 4: Use the model and print the predicted category + prediction = model(batch).squeeze(0).softmax(0) + label = prediction.argmax().item() + score = prediction[label].item() + category_name = weights.meta["categories"][label] + print(f"{category_name}: {100 * score}%") + +The classes of the pre-trained model outputs can be found at ``weights.meta["categories"]``. -Kinetics 1-crop accuracies for clip length 16 (16x112x112) -================================ ============= ============= -Network Clip acc@1 Clip acc@5 -================================ ============= ============= -ResNet 3D 18 52.75 75.45 -ResNet MC 18 53.90 76.29 -ResNet (2+1)D 57.50 78.81 -================================ ============= ============= +Table of all available video classification weights +--------------------------------------------------- +Accuracies are reported on Kinetics-400 using single crops for clip length 16: -ResNet 3D ----------- +.. include:: generated/video_table.rst -.. autofunction:: torchvision.models.video.r3d_18 +Optical Flow +============ -ResNet Mixed Convolution ------------------------- +.. currentmodule:: torchvision.models.optical_flow -.. autofunction:: torchvision.models.video.mc3_18 +The following Optical Flow models are available, with or without pre-trained -ResNet (2+1)D -------------- +.. toctree:: + :maxdepth: 1 -.. autofunction:: torchvision.models.video.r2plus1d_18 + models/raft diff --git a/docs/source/models/alexnet.rst b/docs/source/models/alexnet.rst new file mode 100644 index 0000000000000000000000000000000000000000..8e94b4eeed905983648cdefe50b29b95b4a4c41b --- /dev/null +++ b/docs/source/models/alexnet.rst @@ -0,0 +1,28 @@ +AlexNet +======= + +.. currentmodule:: torchvision.models + +The AlexNet model was originally introduced in the +`ImageNet Classification with Deep Convolutional Neural Networks +`__ +paper. The implemented architecture is slightly different from the original one, +and is based on `One weird trick for parallelizing convolutional neural networks +`__. + + +Model builders +-------------- + +The following model builders can be used to instantiate an AlexNet model, with or +without pre-trained weights. All the model builders internally rely on the +``torchvision.models.alexnet.AlexNet`` base class. Please refer to the `source +code +`_ for +more details about this class. + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + alexnet diff --git a/docs/source/models/convnext.rst b/docs/source/models/convnext.rst new file mode 100644 index 0000000000000000000000000000000000000000..f484bf63d945fa387b4790defdeddd18ecb4e9a6 --- /dev/null +++ b/docs/source/models/convnext.rst @@ -0,0 +1,26 @@ +ConvNeXt +======== + +.. currentmodule:: torchvision.models + +The ConvNeXt model is based on the `A ConvNet for the 2020s +`_ paper. + + +Model builders +-------------- + +The following model builders can be used to instantiate a ConvNeXt model, with or +without pre-trained weights. All the model builders internally rely on the +``torchvision.models.convnext.ConvNeXt`` base class. Please refer to the `source code +`_ for +more details about this class. + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + convnext_tiny + convnext_small + convnext_base + convnext_large diff --git a/docs/source/models/deeplabv3.rst b/docs/source/models/deeplabv3.rst new file mode 100644 index 0000000000000000000000000000000000000000..e6f21686081429d23189376524ad6ff2ddfba371 --- /dev/null +++ b/docs/source/models/deeplabv3.rst @@ -0,0 +1,28 @@ +DeepLabV3 +========= + +.. currentmodule:: torchvision.models.segmentation + +The DeepLabV3 model is based on the `Rethinking Atrous Convolution for Semantic +Image Segmentation `__ paper. + +.. betastatus:: segmentation module + + +Model builders +-------------- + +The following model builders can be used to instantiate a DeepLabV3 model with +different backbones, with or without pre-trained weights. All the model builders +internally rely on the ``torchvision.models.segmentation.deeplabv3.DeepLabV3`` base class. Please +refer to the `source code +`_ +for more details about this class. + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + deeplabv3_mobilenet_v3_large + deeplabv3_resnet50 + deeplabv3_resnet101 diff --git a/docs/source/models/densenet.rst b/docs/source/models/densenet.rst new file mode 100644 index 0000000000000000000000000000000000000000..ee98488692502108e2c6d4a6fae2f1802cbf091d --- /dev/null +++ b/docs/source/models/densenet.rst @@ -0,0 +1,27 @@ +DenseNet +======== + +.. currentmodule:: torchvision.models + +The DenseNet model is based on the `Densely Connected Convolutional Networks +`_ paper. + + +Model builders +-------------- + +The following model builders can be used to instantiate a DenseNet model, with or +without pre-trained weights. All the model builders internally rely on the +``torchvision.models.densenet.DenseNet`` base class. Please refer to the `source +code +`_ for +more details about this class. + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + densenet121 + densenet161 + densenet169 + densenet201 diff --git a/docs/source/models/efficientnet.rst b/docs/source/models/efficientnet.rst new file mode 100644 index 0000000000000000000000000000000000000000..cbc9718959af40e414a1a00a3cb5454305a3e16d --- /dev/null +++ b/docs/source/models/efficientnet.rst @@ -0,0 +1,31 @@ +EfficientNet +============ + +.. currentmodule:: torchvision.models + +The EfficientNet model is based on the `EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks `__ +paper. + + +Model builders +-------------- + +The following model builders can be used to instantiate an EfficientNet model, with or +without pre-trained weights. All the model builders internally rely on the +``torchvision.models.efficientnet.EfficientNet`` base class. Please refer to the `source +code +`_ for +more details about this class. + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + efficientnet_b0 + efficientnet_b1 + efficientnet_b2 + efficientnet_b3 + efficientnet_b4 + efficientnet_b5 + efficientnet_b6 + efficientnet_b7 diff --git a/docs/source/models/efficientnetv2.rst b/docs/source/models/efficientnetv2.rst new file mode 100644 index 0000000000000000000000000000000000000000..3066c28ebd482a128f12656c966c246bfb8f0de9 --- /dev/null +++ b/docs/source/models/efficientnetv2.rst @@ -0,0 +1,26 @@ +EfficientNetV2 +============== + +.. currentmodule:: torchvision.models + +The EfficientNetV2 model is based on the `EfficientNetV2: Smaller Models and Faster Training `__ +paper. + + +Model builders +-------------- + +The following model builders can be used to instantiate an EfficientNetV2 model, with or +without pre-trained weights. All the model builders internally rely on the +``torchvision.models.efficientnet.EfficientNet`` base class. Please refer to the `source +code +`_ for +more details about this class. + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + efficientnet_v2_s + efficientnet_v2_m + efficientnet_v2_l diff --git a/docs/source/models/faster_rcnn.rst b/docs/source/models/faster_rcnn.rst new file mode 100644 index 0000000000000000000000000000000000000000..19ec92278866073773d6c2b766d4fe37a9925929 --- /dev/null +++ b/docs/source/models/faster_rcnn.rst @@ -0,0 +1,31 @@ +Faster R-CNN +============ + +.. currentmodule:: torchvision.models.detection + + +The Faster R-CNN model is based on the `Faster R-CNN: Towards Real-Time Object Detection +with Region Proposal Networks `__ +paper. + +.. betastatus:: detection module + +Model builders +-------------- + +The following model builders can be used to instantiate a Faster R-CNN model, with or +without pre-trained weights. All the model builders internally rely on the +``torchvision.models.detection.faster_rcnn.FasterRCNN`` base class. Please refer to the `source +code +`_ for +more details about this class. + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + fasterrcnn_resnet50_fpn + fasterrcnn_resnet50_fpn_v2 + fasterrcnn_mobilenet_v3_large_fpn + fasterrcnn_mobilenet_v3_large_320_fpn + diff --git a/docs/source/models/fcn.rst b/docs/source/models/fcn.rst new file mode 100644 index 0000000000000000000000000000000000000000..efcdb37c0d5475b1159a6170bf5983e46f93837e --- /dev/null +++ b/docs/source/models/fcn.rst @@ -0,0 +1,28 @@ +FCN +=== + +.. currentmodule:: torchvision.models.segmentation + +The FCN model is based on the `Fully Convolutional Networks for Semantic +Segmentation `__ +paper. + +.. betastatus:: segmentation module + + +Model builders +-------------- + +The following model builders can be used to instantiate a FCN model, with or +without pre-trained weights. All the model builders internally rely on the +``torchvision.models.segmentation.FCN`` base class. Please refer to the `source +code +`_ for +more details about this class. + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + fcn_resnet50 + fcn_resnet101 diff --git a/docs/source/models/fcos.rst b/docs/source/models/fcos.rst new file mode 100644 index 0000000000000000000000000000000000000000..085f26549b8dd40899fe2d08d55064406f676c13 --- /dev/null +++ b/docs/source/models/fcos.rst @@ -0,0 +1,24 @@ +FCOS +========= + +.. currentmodule:: torchvision.models.detection + +The FCOS model is based on the `FCOS: Fully Convolutional One-Stage Object Detection +`__ paper. + +.. betastatus:: detection module + +Model builders +-------------- + +The following model builders can be used to instantiate a FCOS model, with or +without pre-trained weights. All the model builders internally rely on the +``torchvision.models.detection.fcos.FCOS`` base class. Please refer to the `source code +`_ for +more details about this class. + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + fcos_resnet50_fpn diff --git a/docs/source/models/googlenet.rst b/docs/source/models/googlenet.rst new file mode 100644 index 0000000000000000000000000000000000000000..91ea03ddf3d48e1342f6a4be77e3344d8f635f0c --- /dev/null +++ b/docs/source/models/googlenet.rst @@ -0,0 +1,24 @@ +GoogLeNet +========= + +.. currentmodule:: torchvision.models + +The GoogleNet model is based on the `Going Deeper with Convolutions `__ +paper. + + +Model builders +-------------- + +The following model builders can be used to instantiate a GoogLeNet model, with or +without pre-trained weights. All the model builders internally rely on the +``torchvision.models.googlenet.GoogLeNet`` base class. Please refer to the `source +code +`_ for +more details about this class. + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + googlenet diff --git a/docs/source/models/googlenet_quant.rst b/docs/source/models/googlenet_quant.rst new file mode 100644 index 0000000000000000000000000000000000000000..4358389b3e50c2c7b025a3c097fecd80af5f6306 --- /dev/null +++ b/docs/source/models/googlenet_quant.rst @@ -0,0 +1,24 @@ +Quantized GoogLeNet +=================== + +.. currentmodule:: torchvision.models.quantization + +The Quantized GoogleNet model is based on the `Going Deeper with Convolutions `__ +paper. + + +Model builders +-------------- + +The following model builders can be used to instantiate a quantized GoogLeNet +model, with or without pre-trained weights. All the model builders internally +rely on the ``torchvision.models.quantization.googlenet.QuantizableGoogLeNet`` +base class. Please refer to the `source code +`_ +for more details about this class. + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + googlenet diff --git a/docs/source/models/inception.rst b/docs/source/models/inception.rst new file mode 100644 index 0000000000000000000000000000000000000000..e162eef5d30531bb357717186ca84a8b3cf8402b --- /dev/null +++ b/docs/source/models/inception.rst @@ -0,0 +1,23 @@ +Inception V3 +============ + +.. currentmodule:: torchvision.models + +The InceptionV3 model is based on the `Rethinking the Inception Architecture for +Computer Vision `__ paper. + + +Model builders +-------------- + +The following model builders can be used to instantiate an InceptionV3 model, with or +without pre-trained weights. All the model builders internally rely on the +``torchvision.models.inception.Inception3`` base class. Please refer to the `source +code `_ for +more details about this class. + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + inception_v3 diff --git a/docs/source/models/inception_quant.rst b/docs/source/models/inception_quant.rst new file mode 100644 index 0000000000000000000000000000000000000000..d26f1ab09da533b9c3496a5f835a540cf16f29df --- /dev/null +++ b/docs/source/models/inception_quant.rst @@ -0,0 +1,24 @@ +Quantized InceptionV3 +===================== + +.. currentmodule:: torchvision.models.quantization + +The Quantized Inception model is based on the `Rethinking the Inception Architecture for +Computer Vision `__ paper. + + +Model builders +-------------- + +The following model builders can be used to instantiate a quantized Inception +model, with or without pre-trained weights. All the model builders internally +rely on the ``torchvision.models.quantization.inception.QuantizableInception3`` +base class. Please refer to the `source code +`_ +for more details about this class. + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + inception_v3 diff --git a/docs/source/models/keypoint_rcnn.rst b/docs/source/models/keypoint_rcnn.rst new file mode 100644 index 0000000000000000000000000000000000000000..ba677c7f8f38f2ace06a1f466ca8b7624b75d5b4 --- /dev/null +++ b/docs/source/models/keypoint_rcnn.rst @@ -0,0 +1,26 @@ +Keypoint R-CNN +============== + +.. currentmodule:: torchvision.models.detection + +The Keypoint R-CNN model is based on the `Mask R-CNN +`__ paper. + +.. betastatus:: detection module + + +Model builders +-------------- + +The following model builders can be used to instantiate a Keypoint R-CNN model, +with or without pre-trained weights. All the model builders internally rely on +the ``torchvision.models.detection.KeypointRCNN`` base class. Please refer to the `source +code +`__ +for more details about this class. + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + keypointrcnn_resnet50_fpn diff --git a/docs/source/models/lraspp.rst b/docs/source/models/lraspp.rst new file mode 100644 index 0000000000000000000000000000000000000000..312249c53e1210f02ffb5254a577c90ebf334358 --- /dev/null +++ b/docs/source/models/lraspp.rst @@ -0,0 +1,24 @@ +LRASPP +====== + +.. currentmodule:: torchvision.models.segmentation + +The LRASPP model is based on the `Searching for MobileNetV3 `_ paper. + +.. betastatus:: segmentation module + +Model builders +-------------- + +The following model builders can be used to instantiate a FCN model, with or +without pre-trained weights. All the model builders internally rely on the +``torchvision.models.segmentation.LRASPP`` base class. Please refer to the `source +code +`_ for +more details about this class. + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + lraspp_mobilenet_v3_large diff --git a/docs/source/models/mask_rcnn.rst b/docs/source/models/mask_rcnn.rst new file mode 100644 index 0000000000000000000000000000000000000000..5887b6c71a6debd2876b29a0b3d896f2aba456c4 --- /dev/null +++ b/docs/source/models/mask_rcnn.rst @@ -0,0 +1,27 @@ +Mask R-CNN +========== + +.. currentmodule:: torchvision.models.detection + +The Mask R-CNN model is based on the `Mask R-CNN `__ +paper. + +.. betastatus:: detection module + + +Model builders +-------------- + +The following model builders can be used to instantiate a Mask R-CNN model, with or +without pre-trained weights. All the model builders internally rely on the +``torchvision.models.detection.mask_rcnn.MaskRCNN`` base class. Please refer to the `source +code +`_ for +more details about this class. + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + maskrcnn_resnet50_fpn + maskrcnn_resnet50_fpn_v2 diff --git a/docs/source/models/maxvit.rst b/docs/source/models/maxvit.rst new file mode 100644 index 0000000000000000000000000000000000000000..29aaaaab334f9c32a4d9297bc690fcfd02986639 --- /dev/null +++ b/docs/source/models/maxvit.rst @@ -0,0 +1,23 @@ +MaxVit +=============== + +.. currentmodule:: torchvision.models + +The MaxVit transformer models are based on the `MaxViT: Multi-Axis Vision Transformer `__ +paper. + + +Model builders +-------------- + +The following model builders can be used to instantiate an MaxVit model with and without pre-trained weights. +All the model builders internally rely on the ``torchvision.models.maxvit.MaxVit`` +base class. Please refer to the `source code +`_ for +more details about this class. + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + maxvit_t diff --git a/docs/source/models/mnasnet.rst b/docs/source/models/mnasnet.rst new file mode 100644 index 0000000000000000000000000000000000000000..fd9ea5115857b0c85a2b7b949a24a99015f9374a --- /dev/null +++ b/docs/source/models/mnasnet.rst @@ -0,0 +1,28 @@ +MNASNet +======= + +.. currentmodule:: torchvision.models + + +The MNASNet model is based on the `MnasNet: Platform-Aware Neural Architecture +Search for Mobile `__ paper. + + +Model builders +-------------- + +The following model builders can be used to instantiate an MNASNet model. +All the model builders internally rely on the +``torchvision.models.mnasnet.MNASNet`` base class. Please refer to the `source +code +`_ for +more details about this class. + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + mnasnet0_5 + mnasnet0_75 + mnasnet1_0 + mnasnet1_3 diff --git a/docs/source/models/mobilenetv2.rst b/docs/source/models/mobilenetv2.rst new file mode 100644 index 0000000000000000000000000000000000000000..666dcce57cec350e25a4af5c95ee1f0de3e14b97 --- /dev/null +++ b/docs/source/models/mobilenetv2.rst @@ -0,0 +1,24 @@ +MobileNet V2 +============ + +.. currentmodule:: torchvision.models + +The MobileNet V2 model is based on the `MobileNetV2: Inverted Residuals and Linear +Bottlenecks `__ paper. + + +Model builders +-------------- + +The following model builders can be used to instantiate a MobileNetV2 model, with or +without pre-trained weights. All the model builders internally rely on the +``torchvision.models.mobilenetv2.MobileNetV2`` base class. Please refer to the `source +code +`_ for +more details about this class. + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + mobilenet_v2 diff --git a/docs/source/models/mobilenetv2_quant.rst b/docs/source/models/mobilenetv2_quant.rst new file mode 100644 index 0000000000000000000000000000000000000000..e5397378fab3cb857552a0a55d10ee2d0f1796b0 --- /dev/null +++ b/docs/source/models/mobilenetv2_quant.rst @@ -0,0 +1,24 @@ +Quantized MobileNet V2 +====================== + +.. currentmodule:: torchvision.models.quantization + +The Quantized MobileNet V2 model is based on the `MobileNetV2: Inverted Residuals and Linear +Bottlenecks `__ paper. + + +Model builders +-------------- + +The following model builders can be used to instantiate a quantized MobileNetV2 +model, with or without pre-trained weights. All the model builders internally +rely on the ``torchvision.models.quantization.mobilenetv2.QuantizableMobileNetV2`` +base class. Please refer to the `source code +`_ +for more details about this class. + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + mobilenet_v2 diff --git a/docs/source/models/mobilenetv3.rst b/docs/source/models/mobilenetv3.rst new file mode 100644 index 0000000000000000000000000000000000000000..4322470286d9f7edd1e1219e9f16fa963028040d --- /dev/null +++ b/docs/source/models/mobilenetv3.rst @@ -0,0 +1,24 @@ +MobileNet V3 +============ + +.. currentmodule:: torchvision.models + +The MobileNet V3 model is based on the `Searching for MobileNetV3 `__ paper. + + +Model builders +-------------- + +The following model builders can be used to instantiate a MobileNetV3 model, with or +without pre-trained weights. All the model builders internally rely on the +``torchvision.models.mobilenetv3.MobileNetV3`` base class. Please refer to the `source +code +`_ for +more details about this class. + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + mobilenet_v3_large + mobilenet_v3_small diff --git a/docs/source/models/mobilenetv3_quant.rst b/docs/source/models/mobilenetv3_quant.rst new file mode 100644 index 0000000000000000000000000000000000000000..fe385b493e573438406ed3af097b3be5219ec98f --- /dev/null +++ b/docs/source/models/mobilenetv3_quant.rst @@ -0,0 +1,23 @@ +Quantized MobileNet V3 +====================== + +.. currentmodule:: torchvision.models.quantization + +The Quantized MobileNet V3 model is based on the `Searching for MobileNetV3 `__ paper. + + +Model builders +-------------- + +The following model builders can be used to instantiate a quantized MobileNetV3 +model, with or without pre-trained weights. All the model builders internally +rely on the ``torchvision.models.quantization.mobilenetv3.QuantizableMobileNetV3`` +base class. Please refer to the `source code +`_ +for more details about this class. + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + mobilenet_v3_large diff --git a/docs/source/models/raft.rst b/docs/source/models/raft.rst new file mode 100644 index 0000000000000000000000000000000000000000..7ea477698b43cf45e8b15721342925dd29855f95 --- /dev/null +++ b/docs/source/models/raft.rst @@ -0,0 +1,25 @@ +RAFT +==== + +.. currentmodule:: torchvision.models.optical_flow + +The RAFT model is based on the `RAFT: Recurrent All-Pairs Field Transforms for +Optical Flow `__ paper. + + +Model builders +-------------- + +The following model builders can be used to instantiate a RAFT model, with or +without pre-trained weights. All the model builders internally rely on the +``torchvision.models.optical_flow.RAFT`` base class. Please refer to the `source +code +`_ for +more details about this class. + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + raft_large + raft_small diff --git a/docs/source/models/regnet.rst b/docs/source/models/regnet.rst new file mode 100644 index 0000000000000000000000000000000000000000..aef4abd2544581b42b3d2c8a0de84a07d2771fe1 --- /dev/null +++ b/docs/source/models/regnet.rst @@ -0,0 +1,37 @@ +RegNet +====== + +.. currentmodule:: torchvision.models + +The RegNet model is based on the `Designing Network Design Spaces +`_ paper. + + +Model builders +-------------- + +The following model builders can be used to instantiate a RegNet model, with or +without pre-trained weights. All the model builders internally rely on the +``torchvision.models.regnet.RegNet`` base class. Please refer to the `source code +`_ for +more details about this class. + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + regnet_y_400mf + regnet_y_800mf + regnet_y_1_6gf + regnet_y_3_2gf + regnet_y_8gf + regnet_y_16gf + regnet_y_32gf + regnet_y_128gf + regnet_x_400mf + regnet_x_800mf + regnet_x_1_6gf + regnet_x_3_2gf + regnet_x_8gf + regnet_x_16gf + regnet_x_32gf diff --git a/docs/source/models/resnet.rst b/docs/source/models/resnet.rst new file mode 100644 index 0000000000000000000000000000000000000000..9d777f2f6b1244d816b564e5e9d64cadaac5d994 --- /dev/null +++ b/docs/source/models/resnet.rst @@ -0,0 +1,33 @@ +ResNet +====== + +.. currentmodule:: torchvision.models + +The ResNet model is based on the `Deep Residual Learning for Image Recognition +`_ paper. + +.. note:: + The bottleneck of TorchVision places the stride for downsampling to the second 3x3 + convolution while the original paper places it to the first 1x1 convolution. + This variant improves the accuracy and is known as `ResNet V1.5 + `_. + +Model builders +-------------- + +The following model builders can be used to instantiate a ResNet model, with or +without pre-trained weights. All the model builders internally rely on the +``torchvision.models.resnet.ResNet`` base class. Please refer to the `source +code +`_ for +more details about this class. + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + resnet18 + resnet34 + resnet50 + resnet101 + resnet152 diff --git a/docs/source/models/resnet_quant.rst b/docs/source/models/resnet_quant.rst new file mode 100644 index 0000000000000000000000000000000000000000..5609990646cdd969278ef59d5969caa9d6f56448 --- /dev/null +++ b/docs/source/models/resnet_quant.rst @@ -0,0 +1,25 @@ +Quantized ResNet +================ + +.. currentmodule:: torchvision.models.quantization + +The Quantized ResNet model is based on the `Deep Residual Learning for Image Recognition +`_ paper. + + +Model builders +-------------- + +The following model builders can be used to instantiate a quantized ResNet +model, with or without pre-trained weights. All the model builders internally +rely on the ``torchvision.models.quantization.resnet.QuantizableResNet`` +base class. Please refer to the `source code +`_ +for more details about this class. + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + resnet18 + resnet50 diff --git a/docs/source/models/resnext.rst b/docs/source/models/resnext.rst new file mode 100644 index 0000000000000000000000000000000000000000..5d8325d9b4b45fe34b6b24b9cb45c9a41e2498f3 --- /dev/null +++ b/docs/source/models/resnext.rst @@ -0,0 +1,26 @@ +ResNeXt +======= + +.. currentmodule:: torchvision.models + +The ResNext model is based on the `Aggregated Residual Transformations for Deep Neural Networks `__ +paper. + + +Model builders +-------------- + +The following model builders can be used to instantiate a ResNext model, with or +without pre-trained weights. All the model builders internally rely on the +``torchvision.models.resnet.ResNet`` base class. Please refer to the `source +code +`_ for +more details about this class. + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + resnext50_32x4d + resnext101_32x8d + resnext101_64x4d diff --git a/docs/source/models/resnext_quant.rst b/docs/source/models/resnext_quant.rst new file mode 100644 index 0000000000000000000000000000000000000000..916b9e4a39ad57e4572e70c1d1da8b7e345261ea --- /dev/null +++ b/docs/source/models/resnext_quant.rst @@ -0,0 +1,25 @@ +Quantized ResNeXt +================= + +.. currentmodule:: torchvision.models.quantization + +The quantized ResNext model is based on the `Aggregated Residual Transformations for Deep Neural Networks `__ +paper. + + +Model builders +-------------- + +The following model builders can be used to instantiate a quantized ResNeXt +model, with or without pre-trained weights. All the model builders internally +rely on the ``torchvision.models.quantization.resnet.QuantizableResNet`` +base class. Please refer to the `source code +`_ +for more details about this class. + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + resnext101_32x8d + resnext101_64x4d diff --git a/docs/source/models/retinanet.rst b/docs/source/models/retinanet.rst new file mode 100644 index 0000000000000000000000000000000000000000..910692ef3a5a91df23a4389af527c110f703bc88 --- /dev/null +++ b/docs/source/models/retinanet.rst @@ -0,0 +1,25 @@ +RetinaNet +========= + +.. currentmodule:: torchvision.models.detection + +The RetinaNet model is based on the `Focal Loss for Dense Object Detection +`__ paper. + +.. betastatus:: detection module + +Model builders +-------------- + +The following model builders can be used to instantiate a RetinaNet model, with or +without pre-trained weights. All the model builders internally rely on the +``torchvision.models.detection.retinanet.RetinaNet`` base class. Please refer to the `source code +`_ for +more details about this class. + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + retinanet_resnet50_fpn + retinanet_resnet50_fpn_v2 diff --git a/docs/source/models/shufflenetv2.rst b/docs/source/models/shufflenetv2.rst new file mode 100644 index 0000000000000000000000000000000000000000..2cbe328ca8bebd421c9f29a3c217ef946a786034 --- /dev/null +++ b/docs/source/models/shufflenetv2.rst @@ -0,0 +1,27 @@ +ShuffleNet V2 +============= + +.. currentmodule:: torchvision.models + +The ShuffleNet V2 model is based on the `ShuffleNet V2: Practical Guidelines for Efficient +CNN Architecture Design `__ paper. + + +Model builders +-------------- + +The following model builders can be used to instantiate a ShuffleNetV2 model, with or +without pre-trained weights. All the model builders internally rely on the +``torchvision.models.shufflenetv2.ShuffleNetV2`` base class. Please refer to the `source +code +`_ for +more details about this class. + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + shufflenet_v2_x0_5 + shufflenet_v2_x1_0 + shufflenet_v2_x1_5 + shufflenet_v2_x2_0 diff --git a/docs/source/models/shufflenetv2_quant.rst b/docs/source/models/shufflenetv2_quant.rst new file mode 100644 index 0000000000000000000000000000000000000000..4fa236d2565209c61e724a6d3539cd06d7dcaa6f --- /dev/null +++ b/docs/source/models/shufflenetv2_quant.rst @@ -0,0 +1,27 @@ +Quantized ShuffleNet V2 +======================= + +.. currentmodule:: torchvision.models.quantization + +The Quantized ShuffleNet V2 model is based on the `ShuffleNet V2: Practical Guidelines for Efficient +CNN Architecture Design `__ paper. + + +Model builders +-------------- + +The following model builders can be used to instantiate a quantized ShuffleNetV2 +model, with or without pre-trained weights. All the model builders internally rely +on the ``torchvision.models.quantization.shufflenetv2.QuantizableShuffleNetV2`` +base class. Please refer to the `source code +`_ +for more details about this class. + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + shufflenet_v2_x0_5 + shufflenet_v2_x1_0 + shufflenet_v2_x1_5 + shufflenet_v2_x2_0 diff --git a/docs/source/models/squeezenet.rst b/docs/source/models/squeezenet.rst new file mode 100644 index 0000000000000000000000000000000000000000..9771e5c623aaa2073cc3ab59ae409e45ab8fe618 --- /dev/null +++ b/docs/source/models/squeezenet.rst @@ -0,0 +1,26 @@ +SqueezeNet +========== + +.. currentmodule:: torchvision.models + +The SqueezeNet model is based on the `SqueezeNet: AlexNet-level accuracy with +50x fewer parameters and <0.5MB model size `__ +paper. + + +Model builders +-------------- + +The following model builders can be used to instantiate a SqueezeNet model, with or +without pre-trained weights. All the model builders internally rely on the +``torchvision.models.squeezenet.SqueezeNet`` base class. Please refer to the `source +code +`_ for +more details about this class. + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + squeezenet1_0 + squeezenet1_1 diff --git a/docs/source/models/ssd.rst b/docs/source/models/ssd.rst new file mode 100644 index 0000000000000000000000000000000000000000..68b0bb224df3a22466bd1cd42bbcd06183769950 --- /dev/null +++ b/docs/source/models/ssd.rst @@ -0,0 +1,26 @@ +SSD +=== + +.. currentmodule:: torchvision.models.detection + +The SSD model is based on the `SSD: Single Shot MultiBox Detector +`__ paper. + +.. betastatus:: detection module + + +Model builders +-------------- + +The following model builders can be used to instantiate a SSD model, with or +without pre-trained weights. All the model builders internally rely on the +``torchvision.models.detection.SSD`` base class. Please refer to the `source +code +`_ for +more details about this class. + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + ssd300_vgg16 diff --git a/docs/source/models/ssdlite.rst b/docs/source/models/ssdlite.rst new file mode 100644 index 0000000000000000000000000000000000000000..7701d1c9f9fe3b6922c45182dd28ff8e36c5c84a --- /dev/null +++ b/docs/source/models/ssdlite.rst @@ -0,0 +1,27 @@ +SSDlite +======= + +.. currentmodule:: torchvision.models.detection + +The SSDLite model is based on the `SSD: Single Shot MultiBox Detector +`__, `Searching for MobileNetV3 +`__ and `MobileNetV2: Inverted Residuals and Linear +Bottlenecks `__ papers. + +.. betastatus:: detection module + +Model builders +-------------- + +The following model builders can be used to instantiate a SSD Lite model, with or +without pre-trained weights. All the model builders internally rely on the +``torchvision.models.detection.ssd.SSD`` base class. Please refer to the `source +code +`_ for +more details about this class. + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + ssdlite320_mobilenet_v3_large diff --git a/docs/source/models/swin_transformer.rst b/docs/source/models/swin_transformer.rst new file mode 100644 index 0000000000000000000000000000000000000000..b302f5bd79d390e658d7614de8d15471f8d1bb6e --- /dev/null +++ b/docs/source/models/swin_transformer.rst @@ -0,0 +1,32 @@ +SwinTransformer +=============== + +.. currentmodule:: torchvision.models + +The SwinTransformer models are based on the `Swin Transformer: Hierarchical Vision +Transformer using Shifted Windows `__ +paper. +SwinTransformer V2 models are based on the `Swin Transformer V2: Scaling Up Capacity +and Resolution `__ +paper. + + +Model builders +-------------- + +The following model builders can be used to instantiate an SwinTransformer model (original and V2) with and without pre-trained weights. +All the model builders internally rely on the ``torchvision.models.swin_transformer.SwinTransformer`` +base class. Please refer to the `source code +`_ for +more details about this class. + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + swin_t + swin_s + swin_b + swin_v2_t + swin_v2_s + swin_v2_b diff --git a/docs/source/models/vgg.rst b/docs/source/models/vgg.rst new file mode 100644 index 0000000000000000000000000000000000000000..77b5686927c99c39075fab6d0a9f9c24de491134 --- /dev/null +++ b/docs/source/models/vgg.rst @@ -0,0 +1,30 @@ +VGG +=== + +.. currentmodule:: torchvision.models + +The VGG model is based on the `Very Deep Convolutional Networks for Large-Scale +Image Recognition `_ paper. + + +Model builders +-------------- + +The following model builders can be used to instantiate a VGG model, with or +without pre-trained weights. All the model builders internally rely on the +``torchvision.models.vgg.VGG`` base class. Please refer to the `source code +`_ for +more details about this class. + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + vgg11 + vgg11_bn + vgg13 + vgg13_bn + vgg16 + vgg16_bn + vgg19 + vgg19_bn diff --git a/docs/source/models/video_mvit.rst b/docs/source/models/video_mvit.rst new file mode 100644 index 0000000000000000000000000000000000000000..cd23754b7bb68a5f2a62ff47f002e46d4f715ba7 --- /dev/null +++ b/docs/source/models/video_mvit.rst @@ -0,0 +1,27 @@ +Video MViT +========== + +.. currentmodule:: torchvision.models.video + +The MViT model is based on the +`MViTv2: Improved Multiscale Vision Transformers for Classification and Detection +`__ and `Multiscale Vision Transformers +`__ papers. + + +Model builders +-------------- + +The following model builders can be used to instantiate a MViT v1 or v2 model, with or +without pre-trained weights. All the model builders internally rely on the +``torchvision.models.video.MViT`` base class. Please refer to the `source +code +`_ for +more details about this class. + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + mvit_v1_b + mvit_v2_s diff --git a/docs/source/models/video_resnet.rst b/docs/source/models/video_resnet.rst new file mode 100644 index 0000000000000000000000000000000000000000..ecb707b4eeb5195dd3eec827b7bdbe322da66da4 --- /dev/null +++ b/docs/source/models/video_resnet.rst @@ -0,0 +1,28 @@ +Video ResNet +============ + +.. currentmodule:: torchvision.models.video + +The VideoResNet model is based on the `A Closer Look at Spatiotemporal +Convolutions for Action Recognition `__ paper. + +.. betastatus:: video module + + +Model builders +-------------- + +The following model builders can be used to instantiate a VideoResNet model, with or +without pre-trained weights. All the model builders internally rely on the +``torchvision.models.video.resnet.VideoResNet`` base class. Please refer to the `source +code +`_ for +more details about this class. + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + r3d_18 + mc3_18 + r2plus1d_18 diff --git a/docs/source/models/video_s3d.rst b/docs/source/models/video_s3d.rst new file mode 100644 index 0000000000000000000000000000000000000000..0d66c55487cdb0f35fa86c4e10c33b0b9b0a5608 --- /dev/null +++ b/docs/source/models/video_s3d.rst @@ -0,0 +1,25 @@ +Video S3D +========= + +.. currentmodule:: torchvision.models.video + +The S3D model is based on the +`Rethinking Spatiotemporal Feature Learning: Speed-Accuracy Trade-offs in Video Classification +`__ paper. + + +Model builders +-------------- + +The following model builders can be used to instantiate an S3D model, with or +without pre-trained weights. All the model builders internally rely on the +``torchvision.models.video.S3D`` base class. Please refer to the `source +code +`_ for +more details about this class. + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + s3d diff --git a/docs/source/models/video_swin_transformer.rst b/docs/source/models/video_swin_transformer.rst new file mode 100644 index 0000000000000000000000000000000000000000..e31e69759b45681e5619ab1befe9a5bc4bc2cdf6 --- /dev/null +++ b/docs/source/models/video_swin_transformer.rst @@ -0,0 +1,27 @@ +Video SwinTransformer +===================== + +.. currentmodule:: torchvision.models.video + +The Video SwinTransformer model is based on the `Video Swin Transformer `__ paper. + +.. betastatus:: video module + + +Model builders +-------------- + +The following model builders can be used to instantiate a VideoResNet model, with or +without pre-trained weights. All the model builders internally rely on the +``torchvision.models.video.swin_transformer.SwinTransformer3d`` base class. Please refer to the `source +code +`_ for +more details about this class. + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + swin3d_t + swin3d_s + swin3d_b diff --git a/docs/source/models/vision_transformer.rst b/docs/source/models/vision_transformer.rst new file mode 100644 index 0000000000000000000000000000000000000000..914caa9311ed605622249ca01e9ca1e7b4b66571 --- /dev/null +++ b/docs/source/models/vision_transformer.rst @@ -0,0 +1,28 @@ +VisionTransformer +================= + +.. currentmodule:: torchvision.models + +The VisionTransformer model is based on the `An Image is Worth 16x16 Words: +Transformers for Image Recognition at Scale `_ paper. + + +Model builders +-------------- + +The following model builders can be used to instantiate a VisionTransformer model, with or +without pre-trained weights. All the model builders internally rely on the +``torchvision.models.vision_transformer.VisionTransformer`` base class. +Please refer to the `source code +`_ for +more details about this class. + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + vit_b_16 + vit_b_32 + vit_l_16 + vit_l_32 + vit_h_14 diff --git a/docs/source/models/wide_resnet.rst b/docs/source/models/wide_resnet.rst new file mode 100644 index 0000000000000000000000000000000000000000..9768355c77e554cc2f820c36f29c146153abc093 --- /dev/null +++ b/docs/source/models/wide_resnet.rst @@ -0,0 +1,25 @@ +Wide ResNet +=========== + +.. currentmodule:: torchvision.models + +The Wide ResNet model is based on the `Wide Residual Networks `__ +paper. + + +Model builders +-------------- + +The following model builders can be used to instantiate a Wide ResNet model, with or +without pre-trained weights. All the model builders internally rely on the +``torchvision.models.resnet.ResNet`` base class. Please refer to the `source +code +`_ for +more details about this class. + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + wide_resnet50_2 + wide_resnet101_2 diff --git a/docs/source/ops.rst b/docs/source/ops.rst index cdebe9721c3203c7b7d72ea8638ad38efe9f7a47..7124c85bb79f17225e407259b5af0afed98cb101 100644 --- a/docs/source/ops.rst +++ b/docs/source/ops.rst @@ -1,33 +1,103 @@ -torchvision.ops -=============== +.. _ops: + +Operators +========= .. currentmodule:: torchvision.ops -:mod:`torchvision.ops` implements operators that are specific for Computer Vision. +:mod:`torchvision.ops` implements operators, losses and layers that are specific for Computer Vision. .. note:: All operators have native support for TorchScript. -.. autofunction:: nms -.. autofunction:: batched_nms -.. autofunction:: remove_small_boxes -.. autofunction:: clip_boxes_to_image -.. autofunction:: box_convert -.. autofunction:: box_area -.. autofunction:: box_iou -.. autofunction:: generalized_box_iou -.. autofunction:: roi_align -.. autofunction:: ps_roi_align -.. autofunction:: roi_pool -.. autofunction:: ps_roi_pool -.. autofunction:: deform_conv2d -.. autofunction:: sigmoid_focal_loss - -.. autoclass:: RoIAlign -.. autoclass:: PSRoIAlign -.. autoclass:: RoIPool -.. autoclass:: PSRoIPool -.. autoclass:: DeformConv2d -.. autoclass:: MultiScaleRoIAlign -.. autoclass:: FeaturePyramidNetwork +Detection and Segmentation Operators +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The below operators perform pre-processing as well as post-processing required in object detection and segmentation models. + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + batched_nms + masks_to_boxes + nms + roi_align + roi_pool + ps_roi_align + ps_roi_pool + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + FeaturePyramidNetwork + MultiScaleRoIAlign + RoIAlign + RoIPool + PSRoIAlign + PSRoIPool + + +Box Operators +~~~~~~~~~~~~~ + +These utility functions perform various operations on bounding boxes. + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + box_area + box_convert + box_iou + clip_boxes_to_image + complete_box_iou + distance_box_iou + generalized_box_iou + remove_small_boxes + +Losses +~~~~~~ + +The following vision-specific loss functions are implemented: + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + complete_box_iou_loss + distance_box_iou_loss + generalized_box_iou_loss + sigmoid_focal_loss + + +Layers +~~~~~~ + +TorchVision provides commonly used building blocks as layers: + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + Conv2dNormActivation + Conv3dNormActivation + DeformConv2d + DropBlock2d + DropBlock3d + FrozenBatchNorm2d + MLP + Permute + SqueezeExcitation + StochasticDepth + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + deform_conv2d + drop_block2d + drop_block3d + stochastic_depth diff --git a/docs/source/training_references.rst b/docs/source/training_references.rst new file mode 100644 index 0000000000000000000000000000000000000000..fc22ac5eba6fb1f4531d58b14ca7c31c76938f6b --- /dev/null +++ b/docs/source/training_references.rst @@ -0,0 +1,29 @@ +Training references +=================== + +On top of the many models, datasets, and image transforms, Torchvision also +provides training reference scripts. These are the scripts that we use to train +the :ref:`models ` which are then available with pre-trained weights. + +These scripts are not part of the core package and are instead available `on +GitHub `_. We currently +provide references for +`classification `_, +`detection `_, +`segmentation `_, +`similarity learning `_, +and `video classification `_. + +While these scripts are largely stable, they do not offer backward compatibility +guarantees. + +In general, these scripts rely on the latest (not yet released) pytorch version +or the latest torchvision version. This means that to use them, **you might need +to install the latest pytorch and torchvision versions**, with e.g.:: + + conda install pytorch torchvision -c pytorch-nightly + +If you need to rely on an older stable version of pytorch or torchvision, e.g. +torchvision 0.10, then it's safer to use the scripts from that corresponding +release on GitHub, namely +https://github.com/pytorch/vision/tree/v0.10.0/references. diff --git a/docs/source/transforms.rst b/docs/source/transforms.rst index 59479f238997942d9461e9845bff0b29e9047528..4bb18cf6b4866bb5bc39e1be719be9888c23a8ee 100644 --- a/docs/source/transforms.rst +++ b/docs/source/transforms.rst @@ -1,221 +1,477 @@ .. _transforms: -torchvision.transforms -====================== +Transforming and augmenting images +================================== .. currentmodule:: torchvision.transforms -Transforms are common image transformations. They can be chained together using :class:`Compose`. -Most transform classes have a function equivalent: :ref:`functional -transforms ` give fine-grained control over the -transformations. -This is useful if you have to build a more complex transformation pipeline -(e.g. in the case of segmentation tasks). - -Most transformations accept both `PIL `_ -images and tensor images, although some transformations are :ref:`PIL-only -` and some are :ref:`tensor-only -`. The :ref:`conversion_transforms` may be used to -convert to and from PIL images. - -The transformations that accept tensor images also accept batches of tensor -images. A Tensor Image is a tensor with ``(C, H, W)`` shape, where ``C`` is a -number of channels, ``H`` and ``W`` are image height and width. A batch of -Tensor Images is a tensor of ``(B, C, H, W)`` shape, where ``B`` is a number -of images in the batch. - -The expected range of the values of a tensor image is implicitely defined by -the tensor dtype. Tensor images with a float dtype are expected to have -values in ``[0, 1)``. Tensor images with an integer dtype are expected to -have values in ``[0, MAX_DTYPE]`` where ``MAX_DTYPE`` is the largest value -that can be represented in that dtype. - -Randomized transformations will apply the same transformation to all the -images of a given batch, but they will produce different transformations -across calls. For reproducible transformations across calls, you may use -:ref:`functional transforms `. - -The following examples illustate the use of the available transforms: +Torchvision supports common computer vision transformations in the +``torchvision.transforms`` and ``torchvision.transforms.v2`` modules. Transforms +can be used to transform or augment data for training or inference of different +tasks (image classification, detection, segmentation, video classification). - * :ref:`sphx_glr_auto_examples_plot_transforms.py` - - .. figure:: ../source/auto_examples/images/sphx_glr_plot_transforms_001.png - :align: center - :scale: 65% +.. code:: python - * :ref:`sphx_glr_auto_examples_plot_scripted_tensor_transforms.py` + # Image Classification + import torch + from torchvision.transforms import v2 - .. figure:: ../source/auto_examples/images/sphx_glr_plot_scripted_tensor_transforms_001.png - :align: center - :scale: 30% + H, W = 32, 32 + img = torch.randint(0, 256, size=(3, H, W), dtype=torch.uint8) -.. warning:: + transforms = v2.Compose([ + v2.RandomResizedCrop(size=(224, 224), antialias=True), + v2.RandomHorizontalFlip(p=0.5), + v2.ToDtype(torch.float32, scale=True), + v2.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]), + ]) + img = transforms(img) - Since v0.8.0 all random transformations are using torch default random generator to sample random parameters. - It is a backward compatibility breaking change and user should set the random state as following: +.. code:: python - .. code:: python + # Detection (re-using imports and transforms from above) + from torchvision import tv_tensors - # Previous versions - # import random - # random.seed(12) + img = torch.randint(0, 256, size=(3, H, W), dtype=torch.uint8) + boxes = torch.randint(0, H // 2, size=(3, 4)) + boxes[:, 2:] += boxes[:, :2] + boxes = tv_tensors.BoundingBoxes(boxes, format="XYXY", canvas_size=(H, W)) - # Now - import torch - torch.manual_seed(17) + # The same transforms can be used! + img, boxes = transforms(img, boxes) + # And you can pass arbitrary input structures + output_dict = transforms({"image": img, "boxes": boxes}) - Please, keep in mind that the same seed for torch random generator and Python random generator will not - produce the same results. +Transforms are typically passed as the ``transform`` or ``transforms`` argument +to the :ref:`Datasets `. +Start here +---------- -Scriptable transforms ---------------------- +Whether you're new to Torchvision transforms, or you're already experienced with +them, we encourage you to start with +:ref:`sphx_glr_auto_examples_transforms_plot_transforms_getting_started.py` in +order to learn more about what can be done with the new v2 transforms. -In order to script the transformations, please use ``torch.nn.Sequential`` instead of :class:`Compose`. +Then, browse the sections in below this page for general information and +performance tips. The available transforms and functionals are listed in the +:ref:`API reference `. -.. code:: python +More information and tutorials can also be found in our :ref:`example gallery +`, e.g. :ref:`sphx_glr_auto_examples_transforms_plot_transforms_e2e.py` +or :ref:`sphx_glr_auto_examples_transforms_plot_custom_transforms.py`. - transforms = torch.nn.Sequential( - transforms.CenterCrop(10), - transforms.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225)), - ) - scripted_transforms = torch.jit.script(transforms) +.. _conventions: -Make sure to use only scriptable transformations, i.e. that work with ``torch.Tensor`` and does not require -`lambda` functions or ``PIL.Image``. +Supported input types and conventions +------------------------------------- -For any custom transformations to be used with ``torch.jit.script``, they should be derived from ``torch.nn.Module``. +Most transformations accept both `PIL `_ images +and tensor inputs. Both CPU and CUDA tensors are supported. +The result of both backends (PIL or Tensors) should be very +close. In general, we recommend relying on the tensor backend :ref:`for +performance `. The :ref:`conversion transforms +` may be used to convert to and from PIL images, or for +converting dtypes and ranges. +Tensor image are expected to be of shape ``(C, H, W)``, where ``C`` is the +number of channels, and ``H`` and ``W`` refer to height and width. Most +transforms support batched tensor input. A batch of Tensor images is a tensor of +shape ``(N, C, H, W)``, where ``N`` is a number of images in the batch. The +:ref:`v2 ` transforms generally accept an arbitrary number of leading +dimensions ``(..., C, H, W)`` and can handle batched images or batched videos. -Compositions of transforms --------------------------- +.. _range_and_dtype: -.. autoclass:: Compose +Dtype and expected value range +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +The expected range of the values of a tensor image is implicitly defined by +the tensor dtype. Tensor images with a float dtype are expected to have +values in ``[0, 1]``. Tensor images with an integer dtype are expected to +have values in ``[0, MAX_DTYPE]`` where ``MAX_DTYPE`` is the largest value +that can be represented in that dtype. Typically, images of dtype +``torch.uint8`` are expected to have values in ``[0, 255]``. -Transforms on PIL Image and torch.\*Tensor ------------------------------------------- +Use :class:`~torchvision.transforms.v2.ToDtype` to convert both the dtype and +range of the inputs. -.. autoclass:: CenterCrop - :members: +.. _v1_or_v2: -.. autoclass:: ColorJitter - :members: +V1 or V2? Which one should I use? +--------------------------------- -.. autoclass:: FiveCrop - :members: +**TL;DR** We recommending using the ``torchvision.transforms.v2`` transforms +instead of those in ``torchvision.transforms``. They're faster and they can do +more things. Just change the import and you should be good to go. Moving +forward, new features and improvements will only be considered for the v2 +transforms. + +In Torchvision 0.15 (March 2023), we released a new set of transforms available +in the ``torchvision.transforms.v2`` namespace. These transforms have a lot of +advantages compared to the v1 ones (in ``torchvision.transforms``): + +- They can transform images **but also** bounding boxes, masks, or videos. This + provides support for tasks beyond image classification: detection, segmentation, + video classification, etc. See + :ref:`sphx_glr_auto_examples_transforms_plot_transforms_getting_started.py` + and :ref:`sphx_glr_auto_examples_transforms_plot_transforms_e2e.py`. +- They support more transforms like :class:`~torchvision.transforms.v2.CutMix` + and :class:`~torchvision.transforms.v2.MixUp`. See + :ref:`sphx_glr_auto_examples_transforms_plot_cutmix_mixup.py`. +- They're :ref:`faster `. +- They support arbitrary input structures (dicts, lists, tuples, etc.). +- Future improvements and features will be added to the v2 transforms only. + +These transforms are **fully backward compatible** with the v1 ones, so if +you're already using tranforms from ``torchvision.transforms``, all you need to +do to is to update the import to ``torchvision.transforms.v2``. In terms of +output, there might be negligible differences due to implementation differences. + +.. _transforms_perf: + +Performance considerations +-------------------------- -.. autoclass:: Grayscale - :members: +We recommend the following guidelines to get the best performance out of the +transforms: -.. autoclass:: Pad - :members: +- Rely on the v2 transforms from ``torchvision.transforms.v2`` +- Use tensors instead of PIL images +- Use ``torch.uint8`` dtype, especially for resizing +- Resize with bilinear or bicubic mode -.. autoclass:: RandomAffine - :members: +This is what a typical transform pipeline could look like: -.. autoclass:: RandomApply +.. code:: python -.. autoclass:: RandomCrop - :members: + from torchvision.transforms import v2 + transforms = v2.Compose([ + v2.ToImage(), # Convert to tensor, only needed if you had a PIL image + v2.ToDtype(torch.uint8, scale=True), # optional, most input are already uint8 at this point + # ... + v2.RandomResizedCrop(size=(224, 224), antialias=True), # Or Resize(antialias=True) + # ... + v2.ToDtype(torch.float32, scale=True), # Normalize expects float input + v2.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]), + ]) + +The above should give you the best performance in a typical training environment +that relies on the :class:`torch.utils.data.DataLoader` with ``num_workers > +0``. + +Transforms tend to be sensitive to the input strides / memory format. Some +transforms will be faster with channels-first images while others prefer +channels-last. Like ``torch`` operators, most transforms will preserve the +memory format of the input, but this may not always be respected due to +implementation details. You may want to experiment a bit if you're chasing the +very best performance. Using :func:`torch.compile` on individual transforms may +also help factoring out the memory format variable (e.g. on +:class:`~torchvision.transforms.v2.Normalize`). Note that we're talking about +**memory format**, not :ref:`tensor shape `. + +Note that resize transforms like :class:`~torchvision.transforms.v2.Resize` +and :class:`~torchvision.transforms.v2.RandomResizedCrop` typically prefer +channels-last input and tend **not** to benefit from :func:`torch.compile` at +this time. -.. autoclass:: RandomGrayscale - :members: +.. _functional_transforms: -.. autoclass:: RandomHorizontalFlip - :members: +Transform classes, functionals, and kernels +------------------------------------------- -.. autoclass:: RandomPerspective - :members: +Transforms are available as classes like +:class:`~torchvision.transforms.v2.Resize`, but also as functionals like +:func:`~torchvision.transforms.v2.functional.resize` in the +``torchvision.transforms.v2.functional`` namespace. +This is very much like the :mod:`torch.nn` package which defines both classes +and functional equivalents in :mod:`torch.nn.functional`. -.. autoclass:: RandomResizedCrop - :members: +The functionals support PIL images, pure tensors, or :ref:`TVTensors +`, e.g. both ``resize(image_tensor)`` and ``resize(boxes)`` are +valid. -.. autoclass:: RandomRotation - :members: +.. note:: -.. autoclass:: RandomSizedCrop - :members: + Random transforms like :class:`~torchvision.transforms.v2.RandomCrop` will + randomly sample some parameter each time they're called. Their functional + counterpart (:func:`~torchvision.transforms.v2.functional.crop`) does not do + any kind of random sampling and thus have a slighlty different + parametrization. The ``get_params()`` class method of the transforms class + can be used to perform parameter sampling when using the functional APIs. -.. autoclass:: RandomVerticalFlip - :members: -.. autoclass:: Resize - :members: +The ``torchvision.transforms.v2.functional`` namespace also contains what we +call the "kernels". These are the low-level functions that implement the +core functionalities for specific types, e.g. ``resize_bounding_boxes`` or +```resized_crop_mask``. They are public, although not documented. Check the +`code +`_ +to see which ones are available (note that those starting with a leading +underscore are **not** public!). Kernels are only really useful if you want +:ref:`torchscript support ` for types like bounding +boxes or masks. -.. autoclass:: Scale - :members: +.. _transforms_torchscript: -.. autoclass:: TenCrop - :members: +Torchscript support +------------------- -.. autoclass:: GaussianBlur - :members: +Most transform classes and functionals support torchscript. For composing +transforms, use :class:`torch.nn.Sequential` instead of +:class:`~torchvision.transforms.v2.Compose`: -.. autoclass:: RandomInvert - :members: +.. code:: python -.. autoclass:: RandomPosterize - :members: + transforms = torch.nn.Sequential( + CenterCrop(10), + Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225)), + ) + scripted_transforms = torch.jit.script(transforms) -.. autoclass:: RandomSolarize - :members: +.. warning:: -.. autoclass:: RandomAdjustSharpness - :members: + v2 transforms support torchscript, but if you call ``torch.jit.script()`` on + a v2 **class** transform, you'll actually end up with its (scripted) v1 + equivalent. This may lead to slightly different results between the + scripted and eager executions due to implementation differences between v1 + and v2. -.. autoclass:: RandomAutocontrast - :members: + If you really need torchscript support for the v2 transforms, we recommend + scripting the **functionals** from the + ``torchvision.transforms.v2.functional`` namespace to avoid surprises. -.. autoclass:: RandomEqualize - :members: -.. _transforms_pil_only: +Also note that the functionals only support torchscript for pure tensors, which +are always treated as images. If you need torchscript support for other types +like bounding boxes or masks, you can rely on the :ref:`low-level kernels +`. -Transforms on PIL Image only ----------------------------- +For any custom transformations to be used with ``torch.jit.script``, they should +be derived from ``torch.nn.Module``. -.. autoclass:: RandomChoice +See also: :ref:`sphx_glr_auto_examples_others_plot_scripted_tensor_transforms.py`. -.. autoclass:: RandomOrder +.. _v2_api_ref: + +V2 API reference - Recommended +------------------------------ + +Geometry +^^^^^^^^ -.. _transforms_tensor_only: +Resizing +"""""""" + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + v2.Resize + v2.ScaleJitter + v2.RandomShortestSize + v2.RandomResize + +Functionals + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + v2.functional.resize + +Cropping +"""""""" + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + v2.RandomCrop + v2.RandomResizedCrop + v2.RandomIoUCrop + v2.CenterCrop + v2.FiveCrop + v2.TenCrop + +Functionals + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + v2.functional.crop + v2.functional.resized_crop + v2.functional.ten_crop + v2.functional.center_crop + v2.functional.five_crop + +Others +"""""" + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + v2.RandomHorizontalFlip + v2.RandomVerticalFlip + v2.Pad + v2.RandomZoomOut + v2.RandomRotation + v2.RandomAffine + v2.RandomPerspective + v2.ElasticTransform + +Functionals + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + v2.functional.horizontal_flip + v2.functional.vertical_flip + v2.functional.pad + v2.functional.rotate + v2.functional.affine + v2.functional.perspective + v2.functional.elastic + +Color +^^^^^ + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + v2.ColorJitter + v2.RandomChannelPermutation + v2.RandomPhotometricDistort + v2.Grayscale + v2.RGB + v2.RandomGrayscale + v2.GaussianBlur + v2.GaussianNoise + v2.RandomInvert + v2.RandomPosterize + v2.RandomSolarize + v2.RandomAdjustSharpness + v2.RandomAutocontrast + v2.RandomEqualize + +Functionals + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + v2.functional.permute_channels + v2.functional.rgb_to_grayscale + v2.functional.grayscale_to_rgb + v2.functional.to_grayscale + v2.functional.gaussian_blur + v2.functional.gaussian_noise + v2.functional.invert + v2.functional.posterize + v2.functional.solarize + v2.functional.adjust_sharpness + v2.functional.autocontrast + v2.functional.adjust_contrast + v2.functional.equalize + v2.functional.adjust_brightness + v2.functional.adjust_saturation + v2.functional.adjust_hue + v2.functional.adjust_gamma + + +Composition +^^^^^^^^^^^ + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + v2.Compose + v2.RandomApply + v2.RandomChoice + v2.RandomOrder + +Miscellaneous +^^^^^^^^^^^^^ + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + v2.LinearTransformation + v2.Normalize + v2.RandomErasing + v2.Lambda + v2.SanitizeBoundingBoxes + v2.ClampBoundingBoxes + v2.UniformTemporalSubsample + v2.JPEG + +Functionals + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + v2.functional.normalize + v2.functional.erase + v2.functional.sanitize_bounding_boxes + v2.functional.clamp_bounding_boxes + v2.functional.uniform_temporal_subsample + v2.functional.jpeg -Transforms on torch.\*Tensor only ---------------------------------- - -.. autoclass:: LinearTransformation - :members: +.. _conversion_transforms: -.. autoclass:: Normalize - :members: +Conversion +^^^^^^^^^^ -.. autoclass:: RandomErasing - :members: +.. note:: + Beware, some of these conversion transforms below will scale the values + while performing the conversion, while some may not do any scaling. By + scaling, we mean e.g. that a ``uint8`` -> ``float32`` would map the [0, + 255] range into [0, 1] (and vice-versa). See :ref:`range_and_dtype`. -.. autoclass:: ConvertImageDtype +.. autosummary:: + :toctree: generated/ + :template: class.rst -.. _conversion_transforms: + v2.ToImage + v2.ToPureTensor + v2.PILToTensor + v2.ToPILImage + v2.ToDtype + v2.ConvertBoundingBoxFormat -Conversion Transforms ---------------------- +functionals -.. autoclass:: ToPILImage - :members: +.. autosummary:: + :toctree: generated/ + :template: functional.rst -.. autoclass:: ToTensor - :members: + v2.functional.to_image + v2.functional.pil_to_tensor + v2.functional.to_pil_image + v2.functional.to_dtype + v2.functional.convert_bounding_box_format -Generic Transforms ------------------- +Deprecated -.. autoclass:: Lambda - :members: +.. autosummary:: + :toctree: generated/ + :template: class.rst + v2.ToTensor + v2.functional.to_tensor + v2.ConvertImageDtype + v2.functional.convert_image_dtype -AutoAugment Transforms ----------------------- +Auto-Augmentation +^^^^^^^^^^^^^^^^^ `AutoAugment `_ is a common Data Augmentation technique that can improve the accuracy of Image Classification models. Though the data augmentation policies are directly linked to their trained dataset, empirical studies show that @@ -223,61 +479,189 @@ ImageNet policies provide significant improvements when applied to other dataset In TorchVision we implemented 3 policies learned on the following datasets: ImageNet, CIFAR10 and SVHN. The new transform can be used standalone or mixed-and-matched with existing transforms: -.. autoclass:: AutoAugmentPolicy - :members: +.. autosummary:: + :toctree: generated/ + :template: class.rst -.. autoclass:: AutoAugment - :members: + v2.AutoAugment + v2.RandAugment + v2.TrivialAugmentWide + v2.AugMix -.. _functional_transforms: +CutMix - MixUp +^^^^^^^^^^^^^^ -Functional Transforms ---------------------- +CutMix and MixUp are special transforms that +are meant to be used on batches rather than on individual images, because they +are combining pairs of images together. These can be used after the dataloader +(once the samples are batched), or part of a collation function. See +:ref:`sphx_glr_auto_examples_transforms_plot_cutmix_mixup.py` for detailed usage examples. + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + v2.CutMix + v2.MixUp -Functional transforms give you fine-grained control of the transformation pipeline. -As opposed to the transformations above, functional transforms don't contain a random number -generator for their parameters. -That means you have to specify/generate all parameters, but the functional transform will give you -reproducible results across calls. +Developer tools +^^^^^^^^^^^^^^^ -Example: -you can apply a functional transform with the same parameters to multiple images like this: +.. autosummary:: + :toctree: generated/ + :template: function.rst -.. code:: python + v2.functional.register_kernel - import torchvision.transforms.functional as TF - import random - def my_segmentation_transforms(image, segmentation): - if random.random() > 0.5: - angle = random.randint(-30, 30) - image = TF.rotate(image, angle) - segmentation = TF.rotate(segmentation, angle) - # more transforms ... - return image, segmentation +V1 API Reference +---------------- +Geometry +^^^^^^^^ -Example: -you can use a functional transform to build transform classes with custom behavior: +.. autosummary:: + :toctree: generated/ + :template: class.rst -.. code:: python + Resize + RandomCrop + RandomResizedCrop + CenterCrop + FiveCrop + TenCrop + Pad + RandomRotation + RandomAffine + RandomPerspective + ElasticTransform + RandomHorizontalFlip + RandomVerticalFlip + + +Color +^^^^^ + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + ColorJitter + Grayscale + RandomGrayscale + GaussianBlur + RandomInvert + RandomPosterize + RandomSolarize + RandomAdjustSharpness + RandomAutocontrast + RandomEqualize + +Composition +^^^^^^^^^^^ - import torchvision.transforms.functional as TF - import random +.. autosummary:: + :toctree: generated/ + :template: class.rst - class MyRotationTransform: - """Rotate by one of the given angles.""" + Compose + RandomApply + RandomChoice + RandomOrder - def __init__(self, angles): - self.angles = angles +Miscellaneous +^^^^^^^^^^^^^ - def __call__(self, x): - angle = random.choice(self.angles) - return TF.rotate(x, angle) +.. autosummary:: + :toctree: generated/ + :template: class.rst - rotation_transform = MyRotationTransform(angles=[-30, -15, 0, 15, 30]) + LinearTransformation + Normalize + RandomErasing + Lambda +Conversion +^^^^^^^^^^ -.. automodule:: torchvision.transforms.functional - :members: +.. note:: + Beware, some of these conversion transforms below will scale the values + while performing the conversion, while some may not do any scaling. By + scaling, we mean e.g. that a ``uint8`` -> ``float32`` would map the [0, + 255] range into [0, 1] (and vice-versa). See :ref:`range_and_dtype`. + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + ToPILImage + ToTensor + PILToTensor + ConvertImageDtype + +Auto-Augmentation +^^^^^^^^^^^^^^^^^ + +`AutoAugment `_ is a common Data Augmentation technique that can improve the accuracy of Image Classification models. +Though the data augmentation policies are directly linked to their trained dataset, empirical studies show that +ImageNet policies provide significant improvements when applied to other datasets. +In TorchVision we implemented 3 policies learned on the following datasets: ImageNet, CIFAR10 and SVHN. +The new transform can be used standalone or mixed-and-matched with existing transforms: + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + AutoAugmentPolicy + AutoAugment + RandAugment + TrivialAugmentWide + AugMix + + + +Functional Transforms +^^^^^^^^^^^^^^^^^^^^^ + +.. currentmodule:: torchvision.transforms.functional + +.. autosummary:: + :toctree: generated/ + :template: function.rst + + adjust_brightness + adjust_contrast + adjust_gamma + adjust_hue + adjust_saturation + adjust_sharpness + affine + autocontrast + center_crop + convert_image_dtype + crop + equalize + erase + five_crop + gaussian_blur + get_dimensions + get_image_num_channels + get_image_size + hflip + invert + normalize + pad + perspective + pil_to_tensor + posterize + resize + resized_crop + rgb_to_grayscale + rotate + solarize + ten_crop + to_grayscale + to_pil_image + to_tensor + vflip diff --git a/docs/source/tv_tensors.rst b/docs/source/tv_tensors.rst new file mode 100644 index 0000000000000000000000000000000000000000..cb8a3c45fa9ca2c53754a110570a9bd0dab4d7ca --- /dev/null +++ b/docs/source/tv_tensors.rst @@ -0,0 +1,29 @@ +.. _tv_tensors: + +TVTensors +========== + +.. currentmodule:: torchvision.tv_tensors + +TVTensors are :class:`torch.Tensor` subclasses which the v2 :ref:`transforms +` use under the hood to dispatch their inputs to the appropriate +lower-level kernels. Most users do not need to manipulate TVTensors directly. + +Refer to +:ref:`sphx_glr_auto_examples_transforms_plot_transforms_getting_started.py` for +an introduction to TVTensors, or +:ref:`sphx_glr_auto_examples_transforms_plot_tv_tensors.py` for more advanced +info. + +.. autosummary:: + :toctree: generated/ + :template: class.rst + + Image + Video + BoundingBoxFormat + BoundingBoxes + Mask + TVTensor + set_return_type + wrap diff --git a/docs/source/utils.rst b/docs/source/utils.rst index acaf785d8176fce48160161d054bce902807bf2d..cda04de900ad8f43a9ac855631d3c67f0a149c69 100644 --- a/docs/source/utils.rst +++ b/docs/source/utils.rst @@ -1,12 +1,20 @@ -torchvision.utils -================= +.. _utils: -.. currentmodule:: torchvision.utils +Utils +===== -.. autofunction:: make_grid +The ``torchvision.utils`` module contains various utilities, mostly :ref:`for +visualization `. -.. autofunction:: save_image +.. currentmodule:: torchvision.utils -.. autofunction:: draw_bounding_boxes +.. autosummary:: + :toctree: generated/ + :template: function.rst -.. autofunction:: draw_segmentation_masks + draw_bounding_boxes + draw_segmentation_masks + draw_keypoints + flow_to_image + make_grid + save_image diff --git a/examples/cpp/CMakeLists.txt b/examples/cpp/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..a1329b0c9681edecb1a611075d6dd1d150e1e4ed --- /dev/null +++ b/examples/cpp/CMakeLists.txt @@ -0,0 +1,18 @@ +cmake_minimum_required(VERSION 3.10) +project(run_model) + +option(USE_TORCHVISION "Whether to link to torchvision" OFF) + +find_package(Torch REQUIRED) +if(USE_TORCHVISION) + find_package(TorchVision REQUIRED) +endif() + +add_executable(run_model run_model.cpp) + +target_link_libraries(run_model "${TORCH_LIBRARIES}") +if(USE_TORCHVISION) + target_link_libraries(run_model TorchVision::TorchVision) +endif() + +set_property(TARGET run_model PROPERTY CXX_STANDARD 17) diff --git a/examples/cpp/README.md b/examples/cpp/README.md new file mode 100644 index 0000000000000000000000000000000000000000..b2a9174c8bac3504b45da7fba93b8fa6cc487c75 --- /dev/null +++ b/examples/cpp/README.md @@ -0,0 +1,101 @@ +Using torchvision models in C++ +=============================== + +This is a minimal example of getting TorchVision models to work in C++ with +Torchscript. The model is first scripted in Python and exported to a file, and +then loaded in C++. For a similar tutorial, see [this +tutorial](https://pytorch.org/tutorials/advanced/cpp_export.html). + +In order to successfully compile this example, make sure you have ``LibTorch`` +installed. You can either: + +- Install PyTorch normally +- Or download the LibTorch C++ distribution. + +In both cases refer [here](https://pytorch.org/get-started/locally/) the +corresponding install or download instructions. + +Some torchvision models only depend on PyTorch operators, and can be used in C++ +without depending on the torchvision lib. Other models rely on torchvision's C++ +operators like NMS, RoiAlign (typically the detection models) and those need to +be linked against the torchvision lib. + +We'll first see the simpler case of running a model without the torchvision lib +dependency. + +Running a model that doesn't need torchvision lib +------------------------------------------------- + +Create a ``build`` directory inside the current one. + +```bash +mkdir build +cd build +``` + +Then run `python ../trace_model.py` which should create a `resnet18.pt` file in +the build directory. This is the scripted model that will be used in the C++ +code. + +We can now start building with CMake. We have to tell CMake where it can find +the necessary PyTorch resources. If you installed PyTorch normally, you can do: + +```bash +TORCH_PATH=$(python -c "import pathlib, torch; print(pathlib.Path(torch.__path__[0]))") +Torch_DIR="${TORCH_PATH}/share/cmake/Torch" # there should be .cmake files in there + +cmake .. -DTorch_DIR=$Torch_DIR +``` + +If instead you downloaded the LibTorch somewhere, you can do: + +```bash +cmake .. -DCMAKE_PREFIX_PATH=/path/to/libtorch +``` + +Then `cmake --build .` and you should now be able to run + +```bash +./run_model resnet18.pt +``` + +If you try to run the model with a model that depends on the torchvision lib, like +`./run_model fasterrcnn_resnet50_fpn.pt`, you should get a runtime error. This is +because the executable wasn't linked against the torchvision lib. + + +Running a model that needs torchvision lib +------------------------------------------ + +First, we need to build the torchvision lib. To build the torchvision lib go to +the root of the torchvision project and run: + +```bash +mkdir build +cd build +cmake .. -DCMAKE_PREFIX_PATH=/path/to/libtorch # or -DTorch_DIR= if you installed PyTorch normally, see above +cmake --build . +cmake --install . +``` + +You may want to pass `-DCMAKE_INSTALL_PREFIX=/path/to/libtorchvision` for +cmake to copy/install the files to a specific location (e.g. `$CONDA_PREFIX`). + +**DISCLAIMER**: the `libtorchvision` library includes the torchvision +custom ops as well as most of the C++ torchvision APIs. Those APIs do not come +with any backward-compatibility guarantees and may change from one version to +the next. Only the Python APIs are stable and with backward-compatibility +guarantees. So, if you need stability within a C++ environment, your best bet is +to export the Python APIs via torchscript. + +Now that libtorchvision is built and installed we can tell our project to use +and link to it via the `-DUSE_TORCHVISION` flag. We also need to tell CMake +where to find it, just like we did with LibTorch, e.g.: + +```bash +cmake .. -DTorch_DIR=$Torch_DIR -DTorchVision_DIR=path/to/libtorchvision -DUSE_TORCHVISION=ON +cmake --build . +``` + +Now the `run_model` executable should be able to run the +`fasterrcnn_resnet50_fpn.pt` file. diff --git a/examples/cpp/hello_world/CMakeLists.txt b/examples/cpp/hello_world/CMakeLists.txt deleted file mode 100644 index 3244efb392b6b7e4671f40b395b926945123bada..0000000000000000000000000000000000000000 --- a/examples/cpp/hello_world/CMakeLists.txt +++ /dev/null @@ -1,16 +0,0 @@ -cmake_minimum_required(VERSION 3.10) -project(hello-world) - -# The first thing do is to tell cmake to find the TorchVision library. -# The package pulls in all the necessary torch libraries, -# so there is no need to also add `find_package(Torch)` here. -find_package(TorchVision REQUIRED) - -add_executable(hello-world main.cpp) - -# We now need to link the TorchVision library to our executable. -# We can do that by using the TorchVision::TorchVision target, -# which also adds all the necessary torch dependencies. -target_compile_features(hello-world PUBLIC cxx_range_for) -target_link_libraries(hello-world TorchVision::TorchVision) -set_property(TARGET hello-world PROPERTY CXX_STANDARD 14) diff --git a/examples/cpp/hello_world/README.rst b/examples/cpp/hello_world/README.rst deleted file mode 100644 index aa5427a6f1c34275035280d58f4444e42fb63204..0000000000000000000000000000000000000000 --- a/examples/cpp/hello_world/README.rst +++ /dev/null @@ -1,19 +0,0 @@ -Hello World! -============ - -This is a minimal example of getting TorchVision to work in C++ with CMake. - - -In order to successfully compile this example, make sure you have both ``LibTorch`` and -``TorchVision`` installed. -Once both dependencies are sorted, we can start the CMake fun: - -1) Create a ``build`` directory inside the current one. -2) from within the ``build`` directory, run the following commands: - - | ``cmake -DCMAKE_PREFIX_PATH=";" ..`` - | where ```` and ```` are the paths to the libtorch and torchvision installations. - - ``cmake --build .`` - -| That's it! -| You should now have a ``hello-world`` executable in your ``build`` folder. - Running it will output a (fairly long) tensor of random values to your terminal. \ No newline at end of file diff --git a/examples/cpp/hello_world/main.cpp b/examples/cpp/hello_world/main.cpp deleted file mode 100644 index 3a75bdec6cb3f02de0b30a6e515d54e81141296f..0000000000000000000000000000000000000000 --- a/examples/cpp/hello_world/main.cpp +++ /dev/null @@ -1,25 +0,0 @@ -#include -#include -#include -#include - -int main() -{ - auto model = vision::models::ResNet18(); - model->eval(); - - // Create a random input tensor and run it through the model. - auto in = torch::rand({1, 3, 10, 10}); - auto out = model->forward(in); - - std::cout << out.sizes(); - - if (torch::cuda::is_available()) { - // Move model and inputs to GPU - model->to(torch::kCUDA); - auto gpu_in = in.to(torch::kCUDA); - auto gpu_out = model->forward(gpu_in); - - std::cout << gpu_out.sizes(); - } -} diff --git a/examples/cpp/run_model.cpp b/examples/cpp/run_model.cpp new file mode 100644 index 0000000000000000000000000000000000000000..36c9d93cfa472c282c813c953bdb6c1d1bb8e505 --- /dev/null +++ b/examples/cpp/run_model.cpp @@ -0,0 +1,67 @@ +#include +#include +#include +#include + +#ifdef _WIN32 +#include +#endif // _WIN32 + +int main(int argc, const char* argv[]) { + if (argc != 2) { + std::cout << "Usage: run_model \n"; + return -1; + } + torch::DeviceType device_type; + device_type = torch::kCPU; + + torch::jit::script::Module model; + try { + std::cout << "Loading model\n"; + // Deserialize the ScriptModule from a file using torch::jit::load(). + model = torch::jit::load(argv[1]); + std::cout << "Model loaded\n"; + } catch (const torch::Error& e) { + std::cout << "error loading the model.\n"; + return -1; + } catch (const std::exception& e) { + std::cout << "Other error: " << e.what() << "\n"; + return -1; + } + + // TorchScript models require a List[IValue] as input + std::vector inputs; + + if (std::strstr(argv[1], "fasterrcnn") != NULL) { + // Faster RCNN accepts a List[Tensor] as main input + std::vector images; + images.push_back(torch::rand({3, 256, 275})); + images.push_back(torch::rand({3, 256, 275})); + inputs.push_back(images); + } else { + inputs.push_back(torch::rand({1, 3, 10, 10})); + } + auto out = model.forward(inputs); + std::cout << out << "\n"; + + if (torch::cuda::is_available()) { + // Move model and inputs to GPU + model.to(torch::kCUDA); + + // Add GPU inputs + inputs.clear(); + torch::TensorOptions options = torch::TensorOptions{torch::kCUDA}; + if (std::strstr(argv[1], "fasterrcnn") != NULL) { + // Faster RCNN accepts a List[Tensor] as main input + std::vector images; + images.push_back(torch::rand({3, 256, 275}, options)); + images.push_back(torch::rand({3, 256, 275}, options)); + inputs.push_back(images); + } else { + inputs.push_back(torch::rand({1, 3, 10, 10}, options)); + } + + auto gpu_out = model.forward(inputs); + std::cout << gpu_out << "\n"; + } +} diff --git a/examples/cpp/script_model.py b/examples/cpp/script_model.py new file mode 100644 index 0000000000000000000000000000000000000000..e91e888e7be0f16f65c1c933b0600a7556997385 --- /dev/null +++ b/examples/cpp/script_model.py @@ -0,0 +1,10 @@ +import torch +from torchvision import models + +for model, name in ( + (models.resnet18(weights=None), "resnet18"), + (models.detection.fasterrcnn_resnet50_fpn(weights=None, weights_backbone=None), "fasterrcnn_resnet50_fpn"), +): + model.eval() + traced_model = torch.jit.script(model) + traced_model.save(f"{name}.pt") diff --git a/examples/python/README.md b/examples/python/README.md index 1e6c66b5219c5126b717b41d289449383ce4bc09..b6597959e378f316e348e052ef4da79d09799beb 100644 --- a/examples/python/README.md +++ b/examples/python/README.md @@ -1,22 +1,4 @@ # Python examples -- [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/pytorch/vision/blob/master/examples/python/tensor_transforms.ipynb) -[Examples of Tensor Images transformations](https://github.com/pytorch/vision/blob/master/examples/python/tensor_transforms.ipynb) -- [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/pytorch/vision/blob/master/examples/python/video_api.ipynb) -[Example of VideoAPI](https://github.com/pytorch/vision/blob/master/examples/python/video_api.ipynb) -- [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/pytorch/vision/blob/master/examples/python/visualization_utils.ipynb) -[Example of Visualization Utils](https://github.com/pytorch/vision/blob/master/examples/python/visualization_utils.ipynb) - - -Prior to v0.8.0, transforms in torchvision have traditionally been PIL-centric and presented multiple limitations due to -that. Now, since v0.8.0, transforms implementations are Tensor and PIL compatible and we can achieve the following new -features: -- transform multi-band torch tensor images (with more than 3-4 channels) -- torchscript transforms together with your model for deployment -- support for GPU acceleration -- batched transformation such as for videos -- read and decode data directly as torch tensor with torchscript support (for PNG and JPEG image formats) - -Furthermore, previously we used to provide a very high-level API for video decoding which left little control to the user. We're now expanding that API (and replacing it in the future) with a lower-level API that allows the user a frame-based access to a video. - -Torchvision also provides utilities to visualize results. You can make grid of images, plot bounding boxes as well as segmentation masks. Thse utilities work standalone as well as with torchvision models for detection and segmentation. +The examples in this directory have been moved online in our [gallery +page](https://pytorch.org/vision/stable/auto_examples/index.html). diff --git a/examples/python/tensor_transforms.ipynb b/examples/python/tensor_transforms.ipynb deleted file mode 100644 index 7bb5741947c159e20da8f49289ba802a7b227e0b..0000000000000000000000000000000000000000 --- a/examples/python/tensor_transforms.ipynb +++ /dev/null @@ -1,388 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "id": "vjAC2mZnb4nz" - }, - "source": [ - "# Image transformations\n", - "\n", - "This notebook shows new features of torchvision image transformations. \n", - "\n", - "Prior to v0.8.0, transforms in torchvision have traditionally been PIL-centric and presented multiple limitations due to that. Now, since v0.8.0, transforms implementations are Tensor and PIL compatible and we can achieve the following new \n", - "features:\n", - "- transform multi-band torch tensor images (with more than 3-4 channels) \n", - "- torchscript transforms together with your model for deployment\n", - "- support for GPU acceleration\n", - "- batched transformation such as for videos\n", - "- read and decode data directly as torch tensor with torchscript support (for PNG and JPEG image formats)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 35 - }, - "id": "btaDWPDbgIyW", - "outputId": "8a83d408-f643-42da-d247-faf3a1bd3ae0" - }, - "outputs": [], - "source": [ - "import torch, torchvision\n", - "torch.__version__, torchvision.__version__" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "9Vj9draNb4oA" - }, - "source": [ - "## Transforms on CPU/CUDA tensor images\n", - "\n", - "Let's show how to apply transformations on images opened directly as a torch tensors.\n", - "Now, torchvision provides image reading functions for PNG and JPG images with torchscript support. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "Epp3hCy0b4oD" - }, - "outputs": [], - "source": [ - "from torchvision.datasets.utils import download_url\n", - "\n", - "download_url(\"https://farm1.static.flickr.com/152/434505223_8d1890e1e2.jpg\", \".\", \"test-image.jpg\")\n", - "download_url(\"https://farm3.static.flickr.com/2142/1896267403_24939864ba.jpg\", \".\", \"test-image2.jpg\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "Y-m7lYDPb4oK" - }, - "outputs": [], - "source": [ - "import matplotlib.pylab as plt\n", - "%matplotlib inline" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 303 - }, - "id": "5bi8Q7L3b4oc", - "outputId": "e5de5c73-e16d-4992-ebee-94c7ddf0bf54" - }, - "outputs": [], - "source": [ - "from torchvision.io.image import read_image\n", - "\n", - "tensor_image = read_image(\"test-image.jpg\")\n", - "\n", - "print(\"tensor image info: \", tensor_image.shape, tensor_image.dtype)\n", - "\n", - "plt.imshow(tensor_image.numpy().transpose((1, 2, 0)))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def to_rgb_image(tensor):\n", - " \"\"\"Helper method to get RGB numpy array for plotting\"\"\"\n", - " np_img = tensor.cpu().numpy().transpose((1, 2, 0))\n", - " m1, m2 = np_img.min(axis=(0, 1)), np_img.max(axis=(0, 1))\n", - " return (255.0 * (np_img - m1) / (m2 - m1)).astype(\"uint8\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 322 - }, - "id": "PgWpjxQ3b4pF", - "outputId": "e9a138e8-b45c-4f75-d849-3b41de0e5472" - }, - "outputs": [], - "source": [ - "import torchvision.transforms as T\n", - "\n", - "# to fix random seed is now:\n", - "torch.manual_seed(12)\n", - "\n", - "transforms = T.Compose([\n", - " T.RandomCrop(224),\n", - " T.RandomHorizontalFlip(p=0.3),\n", - " T.ConvertImageDtype(torch.float),\n", - " T.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])\n", - "])\n", - "\n", - "out_image = transforms(tensor_image)\n", - "print(\"output tensor image info: \", out_image.shape, out_image.dtype)\n", - "\n", - "plt.imshow(to_rgb_image(out_image))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "LmYQB4cxb4pI" - }, - "source": [ - "Tensor images can be on GPU" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 322 - }, - "id": "S6syYJGEb4pN", - "outputId": "86bddb64-e648-45f2-c216-790d43cfc26d" - }, - "outputs": [], - "source": [ - "out_image = transforms(tensor_image.to(\"cuda\"))\n", - "print(\"output tensor image info: \", out_image.shape, out_image.dtype, out_image.device)\n", - "\n", - "plt.imshow(to_rgb_image(out_image))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "jg9TQd7ajfyn" - }, - "source": [ - "## Scriptable transforms for easier deployment via torchscript\n", - "\n", - "Next, we show how to combine input transformations and model's forward pass and use `torch.jit.script` to obtain a single scripted module.\n", - "\n", - "**Note:** we have to use only scriptable transformations that should be derived from `torch.nn.Module`. \n", - "Since v0.8.0, all transformations are scriptable except `Compose`, `RandomChoice`, `RandomOrder`, `Lambda` and those applied on PIL images.\n", - "The transformations like `Compose` are kept for backward compatibility and can be easily replaced by existing torch modules, like `nn.Sequential`.\n", - "\n", - "Let's define a module `Predictor` that transforms input tensor and applies ImageNet pretrained resnet18 model on it." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "NSDOJ3RajfvO" - }, - "outputs": [], - "source": [ - "import torch\n", - "import torch.nn as nn\n", - "import torchvision.transforms as T\n", - "from torchvision.io.image import read_image\n", - "from torchvision.models import resnet18\n", - "\n", - "\n", - "class Predictor(nn.Module):\n", - "\n", - " def __init__(self):\n", - " super().__init__()\n", - " self.resnet18 = resnet18(pretrained=True).eval()\n", - " self.transforms = nn.Sequential(\n", - " T.Resize([256, ]), # We use single int value inside a list due to torchscript type restrictions\n", - " T.CenterCrop(224),\n", - " T.ConvertImageDtype(torch.float),\n", - " T.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])\n", - " )\n", - "\n", - " def forward(self, x: torch.Tensor) -> torch.Tensor:\n", - " with torch.no_grad():\n", - " x = self.transforms(x)\n", - " y_pred = self.resnet18(x)\n", - " return y_pred.argmax(dim=1)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "ZZKDovqej5vA" - }, - "source": [ - "Now, let's define scripted and non-scripted instances of `Predictor` and apply on multiple tensor images of the same size" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "GBBMSo7vjfr0" - }, - "outputs": [], - "source": [ - "from torchvision.io.image import read_image\n", - "\n", - "predictor = Predictor().to(\"cuda\")\n", - "scripted_predictor = torch.jit.script(predictor).to(\"cuda\")\n", - "\n", - "\n", - "tensor_image1 = read_image(\"test-image.jpg\")\n", - "tensor_image2 = read_image(\"test-image2.jpg\")\n", - "batch = torch.stack([tensor_image1[:, -320:, :], tensor_image2[:, -320:, :]]).to(\"cuda\")\n", - "\n", - "res1 = scripted_predictor(batch)\n", - "res2 = predictor(batch)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 501 - }, - "id": "Dmi9r_p-oKsk", - "outputId": "b9c55e7d-5db1-4975-c485-fecc4075bf47" - }, - "outputs": [], - "source": [ - "import json\n", - "from torchvision.datasets.utils import download_url\n", - "\n", - "\n", - "download_url(\"https://s3.amazonaws.com/deep-learning-models/image-models/imagenet_class_index.json\", \".\", \"imagenet_class_index.json\")\n", - "\n", - "\n", - "with open(\"imagenet_class_index.json\", \"r\") as h:\n", - " labels = json.load(h)\n", - "\n", - "\n", - "plt.figure(figsize=(12, 7))\n", - "for i, p in enumerate(res1):\n", - " plt.subplot(1, 2, i + 1)\n", - " plt.title(\"Scripted predictor:\\n{label})\".format(label=labels[str(p.item())]))\n", - " plt.imshow(batch[i, ...].cpu().numpy().transpose((1, 2, 0)))\n", - "\n", - "\n", - "plt.figure(figsize=(12, 7))\n", - "for i, p in enumerate(res2):\n", - " plt.subplot(1, 2, i + 1)\n", - " plt.title(\"Original predictor:\\n{label})\".format(label=labels[str(p.item())]))\n", - " plt.imshow(batch[i, ...].cpu().numpy().transpose((1, 2, 0)))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "7IYsjzpFqcK8" - }, - "source": [ - "We save and reload scripted predictor in Python or C++ and use it for inference:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 52 - }, - "id": "0kk9LLw5jfol", - "outputId": "05ea6db7-7fcf-4b74-a763-5f117c14cc00" - }, - "outputs": [], - "source": [ - "scripted_predictor.save(\"scripted_predictor.pt\")\n", - "\n", - "scripted_predictor = torch.jit.load(\"scripted_predictor.pt\")\n", - "res1 = scripted_predictor(batch)\n", - "\n", - "for i, p in enumerate(res1):\n", - " print(\"Scripted predictor: {label})\".format(label=labels[str(p.item())]))\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Data reading and decoding functions also support torch script and therefore can be part of the model as well:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "class AnotherPredictor(Predictor):\n", - "\n", - " def forward(self, path: str) -> int:\n", - " with torch.no_grad():\n", - " x = read_image(path).unsqueeze(0)\n", - " x = self.transforms(x)\n", - " y_pred = self.resnet18(x)\n", - " return int(y_pred.argmax(dim=1).item())" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "-cMwTs3Yjffy" - }, - "outputs": [], - "source": [ - "scripted_predictor2 = torch.jit.script(AnotherPredictor())\n", - "\n", - "res = scripted_predictor2(\"test-image.jpg\")\n", - "\n", - "print(\"Scripted another predictor: {label})\".format(label=labels[str(res)]))" - ] - } - ], - "metadata": { - "accelerator": "GPU", - "colab": { - "collapsed_sections": [], - "name": "torchvision_scriptable_transforms.ipynb", - "provenance": [] - }, - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.4" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/examples/python/video_api.ipynb b/examples/python/video_api.ipynb deleted file mode 100644 index 724de2f0a12e7829111af5744f1d16f8f0f3c82e..0000000000000000000000000000000000000000 --- a/examples/python/video_api.ipynb +++ /dev/null @@ -1,772 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Welcome to torchvision's new video API\n", - "\n", - "Here, we're going to examine the capabilities of the new video API, together with the examples on how to build datasets and more. \n", - "\n", - "### Table of contents\n", - "1. Introduction: building a new video object and examining the properties\n", - "2. Building a sample `read_video` function\n", - "3. Building an example dataset (can be applied to e.g. kinetics400)" - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "('1.8.0a0+7580962', '0.8.0a0+4db3dc6')" - ] - }, - "execution_count": 47, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import torch, torchvision\n", - "torch.__version__, torchvision.__version__" - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Downloading https://github.com/pytorch/vision/blob/master/test/assets/videos/WUzgd7C1pWA.mp4?raw=true to ./WUzgd7C1pWA.mp4\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100.4%" - ] - } - ], - "source": [ - "# download the sample video\n", - "from torchvision.datasets.utils import download_url\n", - "download_url(\"https://github.com/pytorch/vision/blob/master/test/assets/videos/WUzgd7C1pWA.mp4?raw=true\", \".\", \"WUzgd7C1pWA.mp4\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 1. Introduction: building a new video object and examining the properties\n", - "\n", - "First we select a video to test the object out. For the sake of argument we're using one from Kinetics400 dataset. To create it, we need to define the path and the stream we want to use. See inline comments for description. " - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "metadata": {}, - "outputs": [], - "source": [ - "import torch, torchvision\n", - "\"\"\"\n", - "chosen video statistics:\n", - "WUzgd7C1pWA.mp4\n", - " - source: kinetics-400\n", - " - video: H-264 - MPEG-4 AVC (part 10) (avc1)\n", - " - fps: 29.97\n", - " - audio: MPEG AAC audio (mp4a)\n", - " - sample rate: 48K Hz\n", - "\"\"\"\n", - "video_path = \"./WUzgd7C1pWA.mp4\"\n", - "\n", - "\"\"\"\n", - "streams are defined in a similar fashion as torch devices. We encode them as strings in a form\n", - "of `stream_type:stream_id` where stream_type is a string and stream_id a long int. \n", - "\n", - "The constructor accepts passing a stream_type only, in which case the stream is auto-discovered.\n", - "\"\"\"\n", - "stream = \"video\"\n", - "\n", - "\n", - "\n", - "video = torchvision.io.VideoReader(video_path, stream)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "First, let's get the metadata for our particular video:" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'video': {'duration': [10.9109], 'fps': [29.97002997002997]},\n", - " 'audio': {'duration': [10.9], 'framerate': [48000.0]}}" - ] - }, - "execution_count": 50, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "video.get_metadata()" - ] - }, - { - "source": [ - "Here we can see that video has two streams - a video and an audio stream. \n", - "Currently available stream types include ``['video', 'audio']``.\n", - "Each descriptor consists of two parts: stream type (e.g. 'video') and\n", - "a unique stream id (which are determined by video encoding).\n", - "In this way, if the video contaner contains multiple\n", - "streams of the same type, users can acces the one they want.\n", - "If only stream type is passed, the decoder auto-detects first stream\n", - "of that type and returns it.\n", - "\n", - "Let's read all the frames from the video stream.\n", - "By default, the return value of `next(video_reader)` is a dict containing the following fields.\n", - "\n", - "The return fields are \n", - "- `data` containing a torch.tensor\n", - "- `pts` containing a float timestamp of this particular frame. " - ], - "cell_type": "markdown", - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 51, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "PTS for first five frames [0.0, 0.033367, 0.066733, 0.1001, 0.133467]\n", - "Total number of frames: 327\n", - "We can expect approx: 327.0\n", - "Tensor size: torch.Size([3, 256, 340])\n" - ] - } - ], - "source": [ - "# first we select the video stream \n", - "metadata = video.get_metadata()\n", - "video.set_current_stream(\"video:0\")\n", - "\n", - "frames = [] # we are going to save the frames here.\n", - "ptss = [] # pts is a presentation timestamp in seconds (float) of each frame\n", - "for frame in video:\n", - " frames.append(frame['data'])\n", - " ptss.append(frame['pts'])\n", - "\n", - "print(\"PTS for first five frames \", ptss[:5])\n", - "print(\"Total number of frames: \", len(frames))\n", - "approx_nf = metadata['video']['duration'][0] * metadata['video']['fps'][0]\n", - "print(\"We can expect approx: \", approx_nf)\n", - "print(\"Tensor size: \", frames[0].size())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note that selecting zero video stream is equivalent to selecting video stream automatically. I.e. `video:0` and `video` will end up with same results in this case. \n", - "\n", - "Let's try this for audio. Note that presentation timestamps are different so aligment has to be done carefully. " - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "PTS for first five frames [0.0, 0.021332999999999998, 0.042667, 0.064, 0.08533299999999999]\n", - "Total number of frames: 511\n", - "Approx total number of datapoints we can expect: 523200.0\n", - "Read data size: 523264\n" - ] - } - ], - "source": [ - "metadata = video.get_metadata()\n", - "video.set_current_stream(\"audio\")\n", - "\n", - "frames = [] # we are going to save the frames here.\n", - "ptss = [] # pts is a presentation timestamp in seconds (float) of each frame\n", - "for frame in video:\n", - " frames.append(frame['data'])\n", - " ptss.append(frame['pts'])\n", - "\n", - "print(\"PTS for first five frames \", ptss[:5])\n", - "print(\"Total number of frames: \", len(frames))\n", - "approx_nf = metadata['audio']['duration'][0] * metadata['audio']['framerate'][0]\n", - "print(\"Approx total number of datapoints we can expect: \", approx_nf)\n", - "print(\"Read data size: \", frames[0].size(0) * len(frames))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "But what if we only want to read certain time segment of the video?\n", - "\n", - "That can be done easily using the combination of our seek function, and the fact that each call to next returns the presentation timestamp of the returned frame in seconds. Given that our implementation relies on python iterators, we can leverage `itertools` to simplify the process and make it more pythonic. \n", - "\n", - "For example, if we wanted to read ten frames from second second:" - ] - }, - { - "cell_type": "code", - "execution_count": 53, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Total number of frames: 10\n" - ] - } - ], - "source": [ - "import itertools\n", - "video.set_current_stream(\"video\")\n", - "\n", - "frames = [] # we are going to save the frames here.\n", - "\n", - "# we seek into a second second of the video\n", - "# and use islice to get 10 frames since\n", - "for frame, pts in itertools.islice(video.seek(2), 10):\n", - " frames.append(frame)\n", - " \n", - "print(\"Total number of frames: \", len(frames))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Or if we wanted to read from 2nd to 5th second:" - ] - }, - { - "cell_type": "code", - "execution_count": 54, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Total number of frames: 90\n", - "We can expect approx: 89.91008991008991\n", - "Tensor size: torch.Size([3, 256, 340])\n" - ] - } - ], - "source": [ - "video.set_current_stream(\"video\")\n", - "\n", - "frames = [] # we are going to save the frames here.\n", - "\n", - "# we seek into a second second of the video\n", - "video = video.seek(2)\n", - "# then we utilize the itertools takewhile to get the \n", - "# correct number of frames\n", - "for frame in itertools.takewhile(lambda x: x['pts'] <= 5, video):\n", - " frames.append(frame['data'])\n", - "\n", - "print(\"Total number of frames: \", len(frames))\n", - "approx_nf = (5-2) * video.get_metadata()['video']['fps'][0]\n", - "print(\"We can expect approx: \", approx_nf)\n", - "print(\"Tensor size: \", frames[0].size())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 2. Building a sample `read_video` function\n", - "\n", - "We can utilize the methods above to build the read video function that follows the same API to the existing `read_video` function " - ] - }, - { - "cell_type": "code", - "execution_count": 55, - "metadata": {}, - "outputs": [], - "source": [ - "def example_read_video(video_object, start=0, end=None, read_video=True, read_audio=True):\n", - "\n", - " if end is None:\n", - " end = float(\"inf\")\n", - " if end < start:\n", - " raise ValueError(\n", - " \"end time should be larger than start time, got \"\n", - " \"start time={} and end time={}\".format(s, e)\n", - " )\n", - " \n", - " video_frames = torch.empty(0)\n", - " video_pts = []\n", - " if read_video:\n", - " video_object.set_current_stream(\"video\")\n", - " frames = []\n", - " for frame in itertools.takewhile(lambda x: x['pts'] <= end, video_object.seek(start)):\n", - " frames.append(frame['data'])\n", - " video_pts.append(frame['pts'])\n", - " if len(frames) > 0:\n", - " video_frames = torch.stack(frames, 0)\n", - "\n", - " audio_frames = torch.empty(0)\n", - " audio_pts = []\n", - " if read_audio:\n", - " video_object.set_current_stream(\"audio\")\n", - " frames = []\n", - " for frame in itertools.takewhile(lambda x: x['pts'] <= end, video_object.seek(start)):\n", - " frames.append(frame['data'])\n", - " video_pts.append(frame['pts'])\n", - " if len(frames) > 0:\n", - " audio_frames = torch.cat(frames, 0)\n", - "\n", - " return video_frames, audio_frames, (video_pts, audio_pts), video_object.get_metadata()" - ] - }, - { - "cell_type": "code", - "execution_count": 56, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "torch.Size([327, 3, 256, 340]) torch.Size([523264, 1])\n" - ] - } - ], - "source": [ - "vf, af, info, meta = example_read_video(video)\n", - "# total number of frames should be 327 for video and 523264 datapoints for audio\n", - "print(vf.size(), af.size())" - ] - }, - { - "cell_type": "code", - "execution_count": 57, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "torch.Size([523264, 1])" - ] - }, - "execution_count": 57, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# you can also get the sequence of audio frames as well\n", - "af.size()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 3. Building an example randomly sampled dataset (can be applied to training dataest of kinetics400)\n", - "\n", - "Cool, so now we can use the same principle to make the sample dataset. We suggest trying out iterable dataset for this purpose. \n", - "\n", - "Here, we are going to build\n", - "\n", - "a. an example dataset that reads randomly selected 10 frames of video" - ] - }, - { - "cell_type": "code", - "execution_count": 58, - "metadata": {}, - "outputs": [], - "source": [ - "# make sample dataest\n", - "import os\n", - "os.makedirs(\"./dataset\", exist_ok=True)\n", - "os.makedirs(\"./dataset/1\", exist_ok=True)\n", - "os.makedirs(\"./dataset/2\", exist_ok=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 59, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "18.4%" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Downloading https://github.com/pytorch/vision/blob/master/test/assets/videos/WUzgd7C1pWA.mp4?raw=true to ./dataset/1/WUzgd7C1pWA.mp4\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100.4%" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Downloading https://github.com/pytorch/vision/blob/master/test/assets/videos/RATRACE_wave_f_nm_np1_fr_goo_37.avi?raw=true to ./dataset/1/RATRACE_wave_f_nm_np1_fr_goo_37.avi\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "102.5%" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Downloading https://github.com/pytorch/vision/blob/master/test/assets/videos/SOX5yA1l24A.mp4?raw=true to ./dataset/2/SOX5yA1l24A.mp4\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "100.9%" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Downloading https://github.com/pytorch/vision/blob/master/test/assets/videos/v_SoccerJuggling_g23_c01.avi?raw=true to ./dataset/2/v_SoccerJuggling_g23_c01.avi\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "101.5%" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Downloading https://github.com/pytorch/vision/blob/master/test/assets/videos/v_SoccerJuggling_g24_c01.avi?raw=true to ./dataset/2/v_SoccerJuggling_g24_c01.avi\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "101.3%" - ] - } - ], - "source": [ - "# download the videos \n", - "from torchvision.datasets.utils import download_url\n", - "download_url(\"https://github.com/pytorch/vision/blob/master/test/assets/videos/WUzgd7C1pWA.mp4?raw=true\", \"./dataset/1\", \"WUzgd7C1pWA.mp4\")\n", - "download_url(\"https://github.com/pytorch/vision/blob/master/test/assets/videos/RATRACE_wave_f_nm_np1_fr_goo_37.avi?raw=true\", \"./dataset/1\", \"RATRACE_wave_f_nm_np1_fr_goo_37.avi\")\n", - "download_url(\"https://github.com/pytorch/vision/blob/master/test/assets/videos/SOX5yA1l24A.mp4?raw=true\", \"./dataset/2\", \"SOX5yA1l24A.mp4\")\n", - "download_url(\"https://github.com/pytorch/vision/blob/master/test/assets/videos/v_SoccerJuggling_g23_c01.avi?raw=true\", \"./dataset/2\", \"v_SoccerJuggling_g23_c01.avi\")\n", - "download_url(\"https://github.com/pytorch/vision/blob/master/test/assets/videos/v_SoccerJuggling_g24_c01.avi?raw=true\", \"./dataset/2\", \"v_SoccerJuggling_g24_c01.avi\")" - ] - }, - { - "cell_type": "code", - "execution_count": 60, - "metadata": {}, - "outputs": [], - "source": [ - "# housekeeping and utilities\n", - "import os\n", - "import random\n", - "\n", - "import torch\n", - "from torchvision.datasets.folder import make_dataset\n", - "from torchvision import transforms as t\n", - "\n", - "def _find_classes(dir):\n", - " classes = [d.name for d in os.scandir(dir) if d.is_dir()]\n", - " classes.sort()\n", - " class_to_idx = {cls_name: i for i, cls_name in enumerate(classes)}\n", - " return classes, class_to_idx\n", - "\n", - "def get_samples(root, extensions=(\".mp4\", \".avi\")):\n", - " _, class_to_idx = _find_classes(root)\n", - " return make_dataset(root, class_to_idx, extensions=extensions)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We are going to define the dataset and some basic arguments. We asume the structure of the FolderDataset, and add the following parameters:\n", - " \n", - "1. frame transform: with this API, we can chose to apply transforms on every frame of the video\n", - "2. videotransform: equally, we can also apply transform to a 4D tensor\n", - "3. length of the clip: do we want a single or multiple frames?\n", - "\n", - "Note that we actually add `epoch size` as using `IterableDataset` class allows us to naturally oversample clips or images from each video if needed. " - ] - }, - { - "cell_type": "code", - "execution_count": 61, - "metadata": {}, - "outputs": [], - "source": [ - "class RandomDataset(torch.utils.data.IterableDataset):\n", - " def __init__(self, root, epoch_size=None, frame_transform=None, video_transform=None, clip_len=16):\n", - " super(RandomDataset).__init__()\n", - " \n", - " self.samples = get_samples(root)\n", - " \n", - " # allow for temporal jittering\n", - " if epoch_size is None:\n", - " epoch_size = len(self.samples)\n", - " self.epoch_size = epoch_size\n", - " \n", - " self.clip_len = clip_len # length of a clip in frames\n", - " self.frame_transform = frame_transform # transform for every frame individually\n", - " self.video_transform = video_transform # transform on a video sequence\n", - "\n", - " def __iter__(self):\n", - " for i in range(self.epoch_size):\n", - " # get random sample\n", - " path, target = random.choice(self.samples)\n", - " # get video object\n", - " vid = torchvision.io.VideoReader(path, \"video\")\n", - " metadata = vid.get_metadata()\n", - " video_frames = [] # video frame buffer \n", - " # seek and return frames\n", - " \n", - " max_seek = metadata[\"video\"]['duration'][0] - (self.clip_len / metadata[\"video\"]['fps'][0])\n", - " start = random.uniform(0., max_seek)\n", - " for frame in itertools.islice(vid.seek(start), self.clip_len):\n", - " video_frames.append(self.frame_transform(frame['data']))\n", - " current_pts = frame['pts']\n", - " # stack it into a tensor\n", - " video = torch.stack(video_frames, 0)\n", - " if self.video_transform:\n", - " video = self.video_transform(video)\n", - " output = {\n", - " 'path': path,\n", - " 'video': video,\n", - " 'target': target,\n", - " 'start': start,\n", - " 'end': current_pts}\n", - " yield output" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Given a path of videos in a folder structure, i.e:\n", - "```\n", - "dataset:\n", - " -class 1:\n", - " file 0\n", - " file 1\n", - " ...\n", - " - class 2:\n", - " file 0\n", - " file 1\n", - " ...\n", - " - ...\n", - "```\n", - "We can generate a dataloader and test the dataset. \n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": 62, - "metadata": {}, - "outputs": [], - "source": [ - "from torchvision import transforms as t\n", - "transforms = [t.Resize((112, 112))]\n", - "frame_transform = t.Compose(transforms)\n", - "\n", - "ds = RandomDataset(\"./dataset\", epoch_size=None, frame_transform=frame_transform)" - ] - }, - { - "cell_type": "code", - "execution_count": 63, - "metadata": {}, - "outputs": [], - "source": [ - "from torch.utils.data import DataLoader\n", - "loader = DataLoader(ds, batch_size=12)\n", - "d = {\"video\":[], 'start':[], 'end':[], 'tensorsize':[]}\n", - "for b in loader:\n", - " for i in range(len(b['path'])):\n", - " d['video'].append(b['path'][i])\n", - " d['start'].append(b['start'][i].item())\n", - " d['end'].append(b['end'][i].item())\n", - " d['tensorsize'].append(b['video'][i].size())" - ] - }, - { - "cell_type": "code", - "execution_count": 64, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'video': ['./dataset/2/SOX5yA1l24A.mp4',\n", - " './dataset/1/RATRACE_wave_f_nm_np1_fr_goo_37.avi',\n", - " './dataset/2/v_SoccerJuggling_g23_c01.avi',\n", - " './dataset/2/SOX5yA1l24A.mp4',\n", - " './dataset/2/v_SoccerJuggling_g24_c01.avi'],\n", - " 'start': [2.9344678384893816,\n", - " 1.6827470772443045,\n", - " 3.9380918322335887,\n", - " 8.400625043794742,\n", - " 0.9696198736175933],\n", - " 'end': [3.4367669999999997,\n", - " 2.1999999999999997,\n", - " 4.471133,\n", - " 8.9089,\n", - " 1.5014999999999998],\n", - " 'tensorsize': [torch.Size([16, 3, 112, 112]),\n", - " torch.Size([16, 3, 112, 112]),\n", - " torch.Size([16, 3, 112, 112]),\n", - " torch.Size([16, 3, 112, 112]),\n", - " torch.Size([16, 3, 112, 112])]}" - ] - }, - "execution_count": 64, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "d" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Visualisation:\n", - " \n", - "example of visualsed video" - ] - }, - { - "cell_type": "code", - "execution_count": 69, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "import matplotlib.pylab as plt\n", - "%matplotlib inline\n", - "\n", - "plt.figure(figsize=(12, 12))\n", - "for i in range(16):\n", - " plt.subplot(4, 4, i + 1)\n", - " plt.imshow(b[\"video\"][0, i, ...].permute(1, 2, 0))\n", - " plt.axis(\"off\")" - ] - }, - { - "cell_type": "code", - "execution_count": 70, - "metadata": {}, - "outputs": [], - "source": [ - "## Cleanup\n", - "import os, shutil\n", - "os.remove(\"./WUzgd7C1pWA.mp4\")\n", - "shutil.rmtree(\"./dataset\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.5-final" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} \ No newline at end of file diff --git a/examples/python/visualization_utils.ipynb b/examples/python/visualization_utils.ipynb deleted file mode 100644 index 2f042cf02c8227ffe7d142338af02bb44aedafc7..0000000000000000000000000000000000000000 --- a/examples/python/visualization_utils.ipynb +++ /dev/null @@ -1,683 +0,0 @@ -{ - "metadata": { - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.6-final" - }, - "orig_nbformat": 2, - "kernelspec": { - "name": "python3", - "display_name": "Python 3.7.6 64-bit", - "metadata": { - "interpreter": { - "hash": "b59c5859fdaa326f162dbe4b890c245edf044b3a52376874fe660daf6e3b88fe" - } - } - } - }, - "nbformat": 4, - "nbformat_minor": 2, - "cells": [ - { - "source": [ - "# Torchvision Utilites for Visualization" - ], - "cell_type": "markdown", - "metadata": {} - }, - { - "source": [ - "`torchvision` provides utilites for visualizing images, bounding boxes and segmentation masks.\n", - "\n", - "All the utilities do not perform inplace modification of inputs.\n" - ], - "cell_type": "markdown", - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import torch\n", - "import torchvision.transforms as transforms\n", - "import torchvision.datasets as datasets\n", - "import numpy as np\n", - "import random\n", - "import scipy.misc" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "import matplotlib.pyplot as plt\n", - "\n", - "%matplotlib inline\n", - "def show(img):\n", - " npimg = img.numpy()\n", - " plt.imshow(np.transpose(npimg, (1,2,0)), interpolation='nearest')" - ] - }, - { - "source": [ - "## Visualize Grid of Images" - ], - "cell_type": "markdown", - "metadata": {} - }, - { - "source": [ - "Use `torchvision.utils.make_grid()` to create a grid of images.\n", - "\n", - "You can also pad, mormalize and scale the images on the fly.\n", - "\n", - "This utility can take 4D mini-batch Tensor of shape (B x C x H x W) or a list of images all of the same size." - ], - "cell_type": "markdown", - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "from torchvision.utils import make_grid" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "torch.Size([3, 768, 1024])\n", - "/home/oke/Aditya/PyTorch/vision/torchvision/transforms/functional.py:114: UserWarning: The given NumPy array is not writeable, and PyTorch does not support non-writeable tensors. This means you can write to the underlying (supposedly non-writeable) NumPy array using the tensor. You may want to copy the array to protect its data or make it writeable before converting it to a tensor. This type of warning will be suppressed for the rest of this program. (Triggered internally at /opt/conda/conda-bld/pytorch_1614931498178/work/torch/csrc/utils/tensor_numpy.cpp:179.)\n", - " img = torch.from_numpy(pic.transpose((2, 0, 1))).contiguous()\n" - ] - } - ], - "source": [ - "lena = scipy.misc.face()\n", - "img = transforms.ToTensor()(lena)\n", - "print(img.size())" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "imglist = [img, img, img, img.clone().fill_(-10)]" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "name": "stderr", - "text": [ - "Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).\n" - ] - }, - { - "output_type": "display_data", - "data": { - "text/plain": "
", - "image/svg+xml": "\n\n\n\n \n \n \n \n 2021-03-24T23:32:48.421838\n image/svg+xml\n \n \n Matplotlib v3.3.4, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", - "image/png": "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\n" - }, - "metadata": { - "needs_background": "light" - } - } - ], - "source": [ - "show(make_grid(imglist, padding=100))" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "output_type": "display_data", - "data": { - "text/plain": "
", - "image/svg+xml": "\n\n\n\n \n \n \n \n 2021-03-24T23:32:49.291422\n image/svg+xml\n \n \n Matplotlib v3.3.4, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", - "image/png": "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\n" - }, - "metadata": { - "needs_background": "light" - } - } - ], - "source": [ - "show(make_grid(imglist, padding=100, normalize=True))" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "output_type": "display_data", - "data": { - "text/plain": "
", - "image/svg+xml": "\n\n\n\n \n \n \n \n 2021-03-24T23:32:50.133283\n image/svg+xml\n \n \n Matplotlib v3.3.4, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", - "image/png": "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\n" - }, - "metadata": { - "needs_background": "light" - } - } - ], - "source": [ - "show(make_grid(imglist, padding=100, normalize=True, value_range=(0, 1)))" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "output_type": "display_data", - "data": { - "text/plain": "
", - "image/svg+xml": "\n\n\n\n \n \n \n \n 2021-03-24T23:32:51.060394\n image/svg+xml\n \n \n Matplotlib v3.3.4, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", - "image/png": "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\n" - }, - "metadata": { - "needs_background": "light" - } - } - ], - "source": [ - "show(make_grid(imglist, padding=100, normalize=True, value_range=(0, 0.5)))" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "output_type": "display_data", - "data": { - "text/plain": "
", - "image/svg+xml": "\n\n\n\n \n \n \n \n 2021-03-24T23:32:51.844460\n image/svg+xml\n \n \n Matplotlib v3.3.4, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", - "image/png": "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\n" - }, - "metadata": { - "needs_background": "light" - } - } - ], - "source": [ - "show(make_grid(imglist, padding=100, normalize=True, scale_each=True))" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "output_type": "display_data", - "data": { - "text/plain": "
", - "image/svg+xml": "\n\n\n\n \n \n \n \n 2021-03-24T23:32:52.624197\n image/svg+xml\n \n \n Matplotlib v3.3.4, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", - "image/png": "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\n" - }, - "metadata": { - "needs_background": "light" - } - } - ], - "source": [ - "show(make_grid(imglist, padding=100, normalize=True, value_range=(0, 0.5), scale_each=True))" - ] - }, - { - "source": [ - "## Visualize Bounding Boxes" - ], - "cell_type": "markdown", - "metadata": {} - }, - { - "source": [ - "You can use `torchvision.utils.draw_bounding_boxes` to draw boxes on image.\n", - "\n", - "You can set the colors, labels, width as well as font and font size !\n", - "\n", - "Note that this util requires a single image of dtype `uint8`.\n" - ], - "cell_type": "markdown", - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "from torchvision.utils import draw_bounding_boxes" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "torch.Size([3, 768, 1024])\n" - ] - }, - { - "output_type": "display_data", - "data": { - "text/plain": "
", - "image/svg+xml": "\n\n\n\n \n \n \n \n 2021-03-24T23:32:53.654506\n image/svg+xml\n \n \n Matplotlib v3.3.4, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", - "image/png": "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\n" - }, - "metadata": { - "needs_background": "light" - } - } - ], - "source": [ - "lena = scipy.misc.face()\n", - "img = transforms.ToTensor()(lena)\n", - "img = transforms.ConvertImageDtype(dtype=torch.uint8) (img)\n", - "\n", - "print(img.size())\n", - "\n", - "show(img)" - ] - }, - { - "source": [ - "We will draw a few boxes on lena!\n", - "\n", - "Note that the boxes are in `(xmin, ymin, xmax, ymax)` format\n" - ], - "cell_type": "markdown", - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "output_type": "display_data", - "data": { - "text/plain": "
", - "image/svg+xml": "\n\n\n\n \n \n \n \n 2021-03-24T23:32:54.157276\n image/svg+xml\n \n \n Matplotlib v3.3.4, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", - "image/png": "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\n" - }, - "metadata": { - "needs_background": "light" - } - } - ], - "source": [ - "boxes = torch.tensor([[100, 400, 500, 740], [500, 200, 800, 580]], dtype=torch.float)\n", - "labels = [\"grass\", \"lena\"]\n", - "colors = [\"blue\", \"yellow\"]\n", - "result = draw_bounding_boxes(img, boxes, labels=labels, colors=colors, width=10)\n", - "show(result)" - ] - }, - { - "source": [ - "You can also `fill` the box with the color.\n", - "\n", - "Note that after filling with color, one needs to save the resultant tensor in PNG i.e. 4 channel color format.\n" - ], - "cell_type": "markdown", - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "output_type": "display_data", - "data": { - "text/plain": "
", - "image/svg+xml": "\n\n\n\n \n \n \n \n 2021-03-24T23:32:54.542848\n image/svg+xml\n \n \n Matplotlib v3.3.4, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", - "image/png": "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\n" - }, - "metadata": { - "needs_background": "light" - } - } - ], - "source": [ - "result = draw_bounding_boxes(img, boxes, labels=labels, colors=colors, width=10, fill=True)\n", - "show(result)" - ] - }, - { - "source": [ - "You can also plot bounding boxes produced from torchvision detection models.\n", - "\n", - "Here is demo with torchvision's FasterRCNN. You can also try using RetinaNet" - ], - "cell_type": "markdown", - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "from torchvision.models.detection import fasterrcnn_resnet50_fpn\n", - "\n", - "model = fasterrcnn_resnet50_fpn(pretrained=True)\n", - "model = model.eval()" - ] - }, - { - "source": [ - "Let's load an image and get predictions from model." - ], - "cell_type": "markdown", - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "output_type": "display_data", - "data": { - "text/plain": "
", - "image/svg+xml": "\n\n\n\n \n \n \n \n 2021-03-26T09:33:29.242197\n image/svg+xml\n \n \n Matplotlib v3.3.4, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", - "image/png": "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\n" - }, - "metadata": { - "needs_background": "light" - } - } - ], - "source": [ - "lena = scipy.misc.face()\n", - "img = transforms.ToTensor()(lena)\n", - "show(img)" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "[{'boxes': tensor([[ 67.7731, 21.4386, 953.7158, 699.8793],\n [ 202.9559, 4.7902, 940.4207, 679.3505],\n [ 29.5735, 21.2866, 376.5114, 424.0385],\n [ 0.0000, 301.0412, 1024.0000, 768.0000],\n [ 52.2440, 281.1678, 784.5737, 733.5809],\n [ 57.0902, 18.2170, 954.9303, 709.1071],\n [ 27.6776, 359.6552, 814.2780, 753.4029],\n [ 78.1657, 32.2182, 938.7345, 703.4693],\n [ 50.6699, 31.5133, 918.5210, 722.1469],\n [ 0.0000, 260.4532, 729.0366, 768.0000],\n [ 480.9375, 512.6833, 784.6242, 616.1514],\n [ 0.0000, 268.2257, 953.8960, 768.0000],\n [ 100.8516, 354.4102, 766.3854, 718.2952]], grad_fn=), 'labels': tensor([17, 18, 20, 15, 16, 23, 51, 16, 20, 64, 16, 62, 20]), 'scores': tensor([0.3728, 0.3323, 0.3065, 0.2696, 0.2288, 0.2064, 0.1333, 0.1174, 0.1026,\n 0.0963, 0.0725, 0.0574, 0.0549], grad_fn=)}]\n" - ] - } - ], - "source": [ - "# Get predictions from model\n", - "outputs = model(img.unsqueeze(0))\n", - "print(outputs)" - ] - }, - { - "source": [ - "Let's plot top 5 boxes detected by our model" - ], - "cell_type": "markdown", - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "output_type": "display_data", - "data": { - "text/plain": "
", - "image/svg+xml": "\n\n\n\n \n \n \n \n 2021-03-26T09:34:59.912114\n image/svg+xml\n \n \n Matplotlib v3.3.4, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", - "image/png": "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\n" - }, - "metadata": { - "needs_background": "light" - } - } - ], - "source": [ - "boxes = outputs[0]['boxes']\n", - "colors = [\"blue\", \"red\", \"green\", \"yellow\", \"orange\"]\n", - "\n", - "# We need a uint8 image for plotting!\n", - "img = transforms.ConvertImageDtype(dtype=torch.uint8) (img)\n", - "\n", - "result = draw_bounding_boxes(img, boxes=boxes[:5], colors=colors, width=10, fill=False)\n", - "show(result)" - ] - }, - { - "source": [ - "## Visualize Segmenation Masks" - ], - "cell_type": "markdown", - "metadata": {} - }, - { - "source": [ - "You can use `torchvision.utils.draw_segmentation_masks` to draw masks on image.\n", - "\n", - "You can set the colors as well as transparency of masks drawn.\n", - "\n", - "Note that this util requires a single RGB image of dtype `uint8`.\n" - ], - "cell_type": "markdown", - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 45, - "metadata": {}, - "outputs": [], - "source": [ - "from torchvision.utils import draw_segmentation_masks\n", - "from PIL import Image\n", - "import requests" - ] - }, - { - "cell_type": "code", - "execution_count": 46, - "metadata": {}, - "outputs": [], - "source": [ - "url = \"http://images.cocodataset.org/val2017/000000281759.jpg\"\n", - "img = Image.open(requests.get(url, stream=True).raw)" - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "metadata": {}, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "torch.Size([3, 427, 640])\n" - ] - }, - { - "output_type": "display_data", - "data": { - "text/plain": "
", - "image/svg+xml": "\n\n\n\n \n \n \n \n 2021-03-26T10:46:04.209868\n image/svg+xml\n \n \n Matplotlib v3.3.4, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", - "image/png": "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\n" - }, - "metadata": { - "needs_background": "light" - } - } - ], - "source": [ - "# lena = scipy.misc.face()\n", - "img = transforms.ToTensor()(img)\n", - "\n", - "print(img.size())\n", - "show(img)" - ] - }, - { - "source": [ - "We will draw a few maks on lena!\n", - "\n", - "Note that the masks contain tensors denoting probabilites of each class.\n", - "\n", - "Here is demo with torchvision's FCN Resnet-50. You can also try using DeepLabv3 or lraspp mobilenet models." - ], - "cell_type": "markdown", - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 48, - "metadata": {}, - "outputs": [], - "source": [ - "from torchvision.models.segmentation import fcn_resnet50\n", - "\n", - "model = fcn_resnet50(pretrained=True)\n", - "model = model.eval()" - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "metadata": {}, - "outputs": [], - "source": [ - "output = model(img.unsqueeze(0))\n", - "masks = output['out'].squeeze(0)" - ] - }, - { - "source": [ - "Note that this utility too needs uint8 dtype image.\n", - "\n", - "You can vary alpha to get more transparent or filled masks." - ], - "cell_type": "markdown", - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 50, - "metadata": {}, - "outputs": [], - "source": [ - "img = transforms.ConvertImageDtype(dtype=torch.uint8) (img)" - ] - }, - { - "cell_type": "code", - "execution_count": 51, - "metadata": {}, - "outputs": [ - { - "output_type": "display_data", - "data": { - "text/plain": "
", - "image/svg+xml": "\n\n\n\n \n \n \n \n 2021-03-26T10:46:11.418103\n image/svg+xml\n \n \n Matplotlib v3.3.4, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", - "image/png": "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\n" - }, - "metadata": { - "needs_background": "light" - } - } - ], - "source": [ - "result = draw_segmentation_masks(img, masks, alpha=0.2)\n", - "show(result)" - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "metadata": {}, - "outputs": [ - { - "output_type": "display_data", - "data": { - "text/plain": "
", - "image/svg+xml": "\n\n\n\n \n \n \n \n 2021-03-26T10:46:11.879624\n image/svg+xml\n \n \n Matplotlib v3.3.4, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", - "image/png": "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\n" - }, - "metadata": { - "needs_background": "light" - } - } - ], - "source": [ - "result = draw_segmentation_masks(img, masks, alpha=0.4)\n", - "show(result)" - ] - }, - { - "cell_type": "code", - "execution_count": 53, - "metadata": {}, - "outputs": [ - { - "output_type": "display_data", - "data": { - "text/plain": "
", - "image/svg+xml": "\n\n\n\n \n \n \n \n 2021-03-26T10:46:12.511543\n image/svg+xml\n \n \n Matplotlib v3.3.4, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", - "image/png": "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\n" - }, - "metadata": { - "needs_background": "light" - } - } - ], - "source": [ - "result = draw_segmentation_masks(img, masks, alpha=0.6)\n", - "show(result)" - ] - } - ] -} \ No newline at end of file diff --git a/gallery/README.rst b/gallery/README.rst index 319052106b51ca2f637a56fdee89c54c2f428942..8dfea35527640aea39b4659d3bd2b3873d1ad708 100644 --- a/gallery/README.rst +++ b/gallery/README.rst @@ -1,4 +1,4 @@ -Example gallery -=============== +.. _gallery: -Below is a gallery of examples \ No newline at end of file +Examples and tutorials +====================== diff --git a/gallery/assets/FudanPed00054.png b/gallery/assets/FudanPed00054.png new file mode 100644 index 0000000000000000000000000000000000000000..951682abb93c6838d7d021fa098177d06c5ef23c Binary files /dev/null and b/gallery/assets/FudanPed00054.png differ diff --git a/gallery/assets/FudanPed00054_mask.png b/gallery/assets/FudanPed00054_mask.png new file mode 100644 index 0000000000000000000000000000000000000000..4d5aa4e40209e575a277be4f9338dc257f01ffde Binary files /dev/null and b/gallery/assets/FudanPed00054_mask.png differ diff --git a/gallery/assets/basketball.mp4 b/gallery/assets/basketball.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..16d62366068f3ac88e8bd61a7a9da2862547bcf8 Binary files /dev/null and b/gallery/assets/basketball.mp4 differ diff --git a/gallery/assets/coco/images/000000000001.jpg b/gallery/assets/coco/images/000000000001.jpg new file mode 120000 index 0000000000000000000000000000000000000000..9be80c7c27300ce0b8fe589a9e41b13fef33c2b8 --- /dev/null +++ b/gallery/assets/coco/images/000000000001.jpg @@ -0,0 +1 @@ +../../astronaut.jpg \ No newline at end of file diff --git a/gallery/assets/coco/images/000000000002.jpg b/gallery/assets/coco/images/000000000002.jpg new file mode 120000 index 0000000000000000000000000000000000000000..9f8efef9928aec7e07a66a3581f1d09c2184393e --- /dev/null +++ b/gallery/assets/coco/images/000000000002.jpg @@ -0,0 +1 @@ +../../dog2.jpg \ No newline at end of file diff --git a/gallery/assets/coco/instances.json b/gallery/assets/coco/instances.json new file mode 100644 index 0000000000000000000000000000000000000000..fe0e09270bfba4390db27fd796fbc943c2c76362 --- /dev/null +++ b/gallery/assets/coco/instances.json @@ -0,0 +1 @@ +{"images": [{"file_name": "000000000001.jpg", "height": 512, "width": 512, "id": 1}, {"file_name": "000000000002.jpg", "height": 500, "width": 500, "id": 2}], "annotations": [{"segmentation": [[40.0, 511.0, 26.0, 487.0, 28.0, 438.0, 17.0, 397.0, 24.0, 346.0, 38.0, 306.0, 61.0, 250.0, 111.0, 206.0, 111.0, 187.0, 120.0, 183.0, 136.0, 159.0, 159.0, 150.0, 181.0, 148.0, 182.0, 132.0, 175.0, 132.0, 168.0, 120.0, 154.0, 102.0, 153.0, 62.0, 188.0, 35.0, 191.0, 29.0, 208.0, 20.0, 210.0, 22.0, 227.0, 16.0, 240.0, 16.0, 276.0, 31.0, 285.0, 39.0, 301.0, 88.0, 297.0, 108.0, 281.0, 128.0, 273.0, 138.0, 266.0, 138.0, 264.0, 153.0, 257.0, 162.0, 256.0, 174.0, 284.0, 197.0, 300.0, 221.0, 303.0, 236.0, 337.0, 258.0, 357.0, 306.0, 361.0, 351.0, 358.0, 511.0]], "iscrowd": 0, "image_id": 1, "bbox": [17.0, 16.0, 344.0, 495.0], "category_id": 1, "id": 1}, {"segmentation": [[0.0, 411.0, 43.0, 401.0, 99.0, 395.0, 105.0, 351.0, 124.0, 326.0, 181.0, 294.0, 227.0, 280.0, 245.0, 262.0, 259.0, 234.0, 262.0, 207.0, 271.0, 140.0, 283.0, 139.0, 301.0, 162.0, 309.0, 181.0, 341.0, 175.0, 362.0, 139.0, 369.0, 139.0, 377.0, 163.0, 378.0, 203.0, 381.0, 212.0, 380.0, 220.0, 382.0, 242.0, 404.0, 264.0, 392.0, 293.0, 384.0, 295.0, 385.0, 316.0, 399.0, 343.0, 391.0, 448.0, 452.0, 475.0, 457.0, 494.0, 436.0, 498.0, 402.0, 491.0, 369.0, 488.0, 366.0, 496.0, 319.0, 496.0, 302.0, 485.0, 226.0, 469.0, 128.0, 456.0, 74.0, 458.0, 29.0, 439.0, 0.0, 445.0]], "iscrowd": 0, "image_id": 2, "bbox": [0.0, 139.0, 457.0, 359.0], "category_id": 18, "id": 2}]} diff --git a/gallery/assets/imagenet_class_index.json b/gallery/assets/imagenet_class_index.json index 5fe0dfefcd3dca3b1d169c7ab51b93de327e07e2..2ebd2961e1dee28468083356e3254670c170589f 100644 --- a/gallery/assets/imagenet_class_index.json +++ b/gallery/assets/imagenet_class_index.json @@ -1 +1 @@ -{"0": ["n01440764", "tench"], "1": ["n01443537", "goldfish"], "2": ["n01484850", "great_white_shark"], "3": ["n01491361", "tiger_shark"], "4": ["n01494475", "hammerhead"], "5": ["n01496331", "electric_ray"], "6": ["n01498041", "stingray"], "7": ["n01514668", "cock"], "8": ["n01514859", "hen"], "9": ["n01518878", "ostrich"], "10": ["n01530575", "brambling"], "11": ["n01531178", "goldfinch"], "12": ["n01532829", "house_finch"], "13": ["n01534433", "junco"], "14": ["n01537544", "indigo_bunting"], "15": ["n01558993", "robin"], "16": ["n01560419", "bulbul"], "17": ["n01580077", "jay"], "18": ["n01582220", "magpie"], "19": ["n01592084", "chickadee"], "20": ["n01601694", "water_ouzel"], "21": ["n01608432", "kite"], "22": ["n01614925", "bald_eagle"], "23": ["n01616318", "vulture"], "24": ["n01622779", "great_grey_owl"], "25": ["n01629819", "European_fire_salamander"], "26": ["n01630670", "common_newt"], "27": ["n01631663", "eft"], "28": ["n01632458", "spotted_salamander"], "29": ["n01632777", "axolotl"], "30": ["n01641577", "bullfrog"], "31": ["n01644373", "tree_frog"], "32": ["n01644900", "tailed_frog"], "33": ["n01664065", "loggerhead"], "34": ["n01665541", "leatherback_turtle"], "35": ["n01667114", "mud_turtle"], "36": ["n01667778", "terrapin"], "37": ["n01669191", "box_turtle"], "38": ["n01675722", "banded_gecko"], "39": ["n01677366", "common_iguana"], "40": ["n01682714", "American_chameleon"], "41": ["n01685808", "whiptail"], "42": ["n01687978", "agama"], "43": ["n01688243", "frilled_lizard"], "44": ["n01689811", "alligator_lizard"], "45": ["n01692333", "Gila_monster"], "46": ["n01693334", "green_lizard"], "47": ["n01694178", "African_chameleon"], "48": ["n01695060", "Komodo_dragon"], "49": ["n01697457", "African_crocodile"], "50": ["n01698640", "American_alligator"], "51": ["n01704323", "triceratops"], "52": ["n01728572", "thunder_snake"], "53": ["n01728920", "ringneck_snake"], "54": ["n01729322", "hognose_snake"], "55": ["n01729977", "green_snake"], "56": ["n01734418", "king_snake"], "57": ["n01735189", "garter_snake"], "58": ["n01737021", "water_snake"], "59": ["n01739381", "vine_snake"], "60": ["n01740131", "night_snake"], "61": ["n01742172", "boa_constrictor"], "62": ["n01744401", "rock_python"], "63": ["n01748264", "Indian_cobra"], "64": ["n01749939", "green_mamba"], "65": ["n01751748", "sea_snake"], "66": ["n01753488", "horned_viper"], "67": ["n01755581", "diamondback"], "68": ["n01756291", "sidewinder"], "69": ["n01768244", "trilobite"], "70": ["n01770081", "harvestman"], "71": ["n01770393", "scorpion"], "72": ["n01773157", "black_and_gold_garden_spider"], "73": ["n01773549", "barn_spider"], "74": ["n01773797", "garden_spider"], "75": ["n01774384", "black_widow"], "76": ["n01774750", "tarantula"], "77": ["n01775062", "wolf_spider"], "78": ["n01776313", "tick"], "79": ["n01784675", "centipede"], "80": ["n01795545", "black_grouse"], "81": ["n01796340", "ptarmigan"], "82": ["n01797886", "ruffed_grouse"], "83": ["n01798484", "prairie_chicken"], "84": ["n01806143", "peacock"], "85": ["n01806567", "quail"], "86": ["n01807496", "partridge"], "87": ["n01817953", "African_grey"], "88": ["n01818515", "macaw"], "89": ["n01819313", "sulphur-crested_cockatoo"], "90": ["n01820546", "lorikeet"], "91": ["n01824575", "coucal"], "92": ["n01828970", "bee_eater"], "93": ["n01829413", "hornbill"], "94": ["n01833805", "hummingbird"], "95": ["n01843065", "jacamar"], "96": ["n01843383", "toucan"], "97": ["n01847000", "drake"], "98": ["n01855032", "red-breasted_merganser"], "99": ["n01855672", "goose"], "100": ["n01860187", "black_swan"], "101": ["n01871265", "tusker"], "102": ["n01872401", "echidna"], "103": ["n01873310", "platypus"], "104": ["n01877812", "wallaby"], "105": ["n01882714", "koala"], "106": ["n01883070", "wombat"], "107": ["n01910747", "jellyfish"], "108": ["n01914609", "sea_anemone"], "109": ["n01917289", "brain_coral"], "110": ["n01924916", "flatworm"], "111": ["n01930112", "nematode"], "112": ["n01943899", "conch"], "113": ["n01944390", "snail"], "114": ["n01945685", "slug"], "115": ["n01950731", "sea_slug"], "116": ["n01955084", "chiton"], "117": ["n01968897", "chambered_nautilus"], "118": ["n01978287", "Dungeness_crab"], "119": ["n01978455", "rock_crab"], "120": ["n01980166", "fiddler_crab"], "121": ["n01981276", "king_crab"], "122": ["n01983481", "American_lobster"], "123": ["n01984695", "spiny_lobster"], "124": ["n01985128", "crayfish"], "125": ["n01986214", "hermit_crab"], "126": ["n01990800", "isopod"], "127": ["n02002556", "white_stork"], "128": ["n02002724", "black_stork"], "129": ["n02006656", "spoonbill"], "130": ["n02007558", "flamingo"], "131": ["n02009229", "little_blue_heron"], "132": ["n02009912", "American_egret"], "133": ["n02011460", "bittern"], "134": ["n02012849", "crane"], "135": ["n02013706", "limpkin"], "136": ["n02017213", "European_gallinule"], "137": ["n02018207", "American_coot"], "138": ["n02018795", "bustard"], "139": ["n02025239", "ruddy_turnstone"], "140": ["n02027492", "red-backed_sandpiper"], "141": ["n02028035", "redshank"], "142": ["n02033041", "dowitcher"], "143": ["n02037110", "oystercatcher"], "144": ["n02051845", "pelican"], "145": ["n02056570", "king_penguin"], "146": ["n02058221", "albatross"], "147": ["n02066245", "grey_whale"], "148": ["n02071294", "killer_whale"], "149": ["n02074367", "dugong"], "150": ["n02077923", "sea_lion"], "151": ["n02085620", "Chihuahua"], "152": ["n02085782", "Japanese_spaniel"], "153": ["n02085936", "Maltese_dog"], "154": ["n02086079", "Pekinese"], "155": ["n02086240", "Shih-Tzu"], "156": ["n02086646", "Blenheim_spaniel"], "157": ["n02086910", "papillon"], "158": ["n02087046", "toy_terrier"], "159": ["n02087394", "Rhodesian_ridgeback"], "160": ["n02088094", "Afghan_hound"], "161": ["n02088238", "basset"], "162": ["n02088364", "beagle"], "163": ["n02088466", "bloodhound"], "164": ["n02088632", "bluetick"], "165": ["n02089078", "black-and-tan_coonhound"], "166": ["n02089867", "Walker_hound"], "167": ["n02089973", "English_foxhound"], "168": ["n02090379", "redbone"], "169": ["n02090622", "borzoi"], "170": ["n02090721", "Irish_wolfhound"], "171": ["n02091032", "Italian_greyhound"], "172": ["n02091134", "whippet"], "173": ["n02091244", "Ibizan_hound"], "174": ["n02091467", "Norwegian_elkhound"], "175": ["n02091635", "otterhound"], "176": ["n02091831", "Saluki"], "177": ["n02092002", "Scottish_deerhound"], "178": ["n02092339", "Weimaraner"], "179": ["n02093256", "Staffordshire_bullterrier"], "180": ["n02093428", "American_Staffordshire_terrier"], "181": ["n02093647", "Bedlington_terrier"], "182": ["n02093754", "Border_terrier"], "183": ["n02093859", "Kerry_blue_terrier"], "184": ["n02093991", "Irish_terrier"], "185": ["n02094114", "Norfolk_terrier"], "186": ["n02094258", "Norwich_terrier"], "187": ["n02094433", "Yorkshire_terrier"], "188": ["n02095314", "wire-haired_fox_terrier"], "189": ["n02095570", "Lakeland_terrier"], "190": ["n02095889", "Sealyham_terrier"], "191": ["n02096051", "Airedale"], "192": ["n02096177", "cairn"], "193": ["n02096294", "Australian_terrier"], "194": ["n02096437", "Dandie_Dinmont"], "195": ["n02096585", "Boston_bull"], "196": ["n02097047", "miniature_schnauzer"], "197": ["n02097130", "giant_schnauzer"], "198": ["n02097209", "standard_schnauzer"], "199": ["n02097298", "Scotch_terrier"], "200": ["n02097474", "Tibetan_terrier"], "201": ["n02097658", "silky_terrier"], "202": ["n02098105", "soft-coated_wheaten_terrier"], "203": ["n02098286", "West_Highland_white_terrier"], "204": ["n02098413", "Lhasa"], "205": ["n02099267", "flat-coated_retriever"], "206": ["n02099429", "curly-coated_retriever"], "207": ["n02099601", "golden_retriever"], "208": ["n02099712", "Labrador_retriever"], "209": ["n02099849", "Chesapeake_Bay_retriever"], "210": ["n02100236", "German_short-haired_pointer"], "211": ["n02100583", "vizsla"], "212": ["n02100735", "English_setter"], "213": ["n02100877", "Irish_setter"], "214": ["n02101006", "Gordon_setter"], "215": ["n02101388", "Brittany_spaniel"], "216": ["n02101556", "clumber"], "217": ["n02102040", "English_springer"], "218": ["n02102177", "Welsh_springer_spaniel"], "219": ["n02102318", "cocker_spaniel"], "220": ["n02102480", "Sussex_spaniel"], "221": ["n02102973", "Irish_water_spaniel"], "222": ["n02104029", "kuvasz"], "223": ["n02104365", "schipperke"], "224": ["n02105056", "groenendael"], "225": ["n02105162", "malinois"], "226": ["n02105251", "briard"], "227": ["n02105412", "kelpie"], "228": ["n02105505", "komondor"], "229": ["n02105641", "Old_English_sheepdog"], "230": ["n02105855", "Shetland_sheepdog"], "231": ["n02106030", "collie"], "232": ["n02106166", "Border_collie"], "233": ["n02106382", "Bouvier_des_Flandres"], "234": ["n02106550", "Rottweiler"], "235": ["n02106662", "German_shepherd"], "236": ["n02107142", "Doberman"], "237": ["n02107312", "miniature_pinscher"], "238": ["n02107574", "Greater_Swiss_Mountain_dog"], "239": ["n02107683", "Bernese_mountain_dog"], "240": ["n02107908", "Appenzeller"], "241": ["n02108000", "EntleBucher"], "242": ["n02108089", "boxer"], "243": ["n02108422", "bull_mastiff"], "244": ["n02108551", "Tibetan_mastiff"], "245": ["n02108915", "French_bulldog"], "246": ["n02109047", "Great_Dane"], "247": ["n02109525", "Saint_Bernard"], "248": ["n02109961", "Eskimo_dog"], "249": ["n02110063", "malamute"], "250": ["n02110185", "Siberian_husky"], "251": ["n02110341", "dalmatian"], "252": ["n02110627", "affenpinscher"], "253": ["n02110806", "basenji"], "254": ["n02110958", "pug"], "255": ["n02111129", "Leonberg"], "256": ["n02111277", "Newfoundland"], "257": ["n02111500", "Great_Pyrenees"], "258": ["n02111889", "Samoyed"], "259": ["n02112018", "Pomeranian"], "260": ["n02112137", "chow"], "261": ["n02112350", "keeshond"], "262": ["n02112706", "Brabancon_griffon"], "263": ["n02113023", "Pembroke"], "264": ["n02113186", "Cardigan"], "265": ["n02113624", "toy_poodle"], "266": ["n02113712", "miniature_poodle"], "267": ["n02113799", "standard_poodle"], "268": ["n02113978", "Mexican_hairless"], "269": ["n02114367", "timber_wolf"], "270": ["n02114548", "white_wolf"], "271": ["n02114712", "red_wolf"], "272": ["n02114855", "coyote"], "273": ["n02115641", "dingo"], "274": ["n02115913", "dhole"], "275": ["n02116738", "African_hunting_dog"], "276": ["n02117135", "hyena"], "277": ["n02119022", "red_fox"], "278": ["n02119789", "kit_fox"], "279": ["n02120079", "Arctic_fox"], "280": ["n02120505", "grey_fox"], "281": ["n02123045", "tabby"], "282": ["n02123159", "tiger_cat"], "283": ["n02123394", "Persian_cat"], "284": ["n02123597", "Siamese_cat"], "285": ["n02124075", "Egyptian_cat"], "286": ["n02125311", "cougar"], "287": ["n02127052", "lynx"], "288": ["n02128385", "leopard"], "289": ["n02128757", "snow_leopard"], "290": ["n02128925", "jaguar"], "291": ["n02129165", "lion"], "292": ["n02129604", "tiger"], "293": ["n02130308", "cheetah"], "294": ["n02132136", "brown_bear"], "295": ["n02133161", "American_black_bear"], "296": ["n02134084", "ice_bear"], "297": ["n02134418", "sloth_bear"], "298": ["n02137549", "mongoose"], "299": ["n02138441", "meerkat"], "300": ["n02165105", "tiger_beetle"], "301": ["n02165456", "ladybug"], "302": ["n02167151", "ground_beetle"], "303": ["n02168699", "long-horned_beetle"], "304": ["n02169497", "leaf_beetle"], "305": ["n02172182", "dung_beetle"], "306": ["n02174001", "rhinoceros_beetle"], "307": ["n02177972", "weevil"], "308": ["n02190166", "fly"], "309": ["n02206856", "bee"], "310": ["n02219486", "ant"], "311": ["n02226429", "grasshopper"], "312": ["n02229544", "cricket"], "313": ["n02231487", "walking_stick"], "314": ["n02233338", "cockroach"], "315": ["n02236044", "mantis"], "316": ["n02256656", "cicada"], "317": ["n02259212", "leafhopper"], "318": ["n02264363", "lacewing"], "319": ["n02268443", "dragonfly"], "320": ["n02268853", "damselfly"], "321": ["n02276258", "admiral"], "322": ["n02277742", "ringlet"], "323": ["n02279972", "monarch"], "324": ["n02280649", "cabbage_butterfly"], "325": ["n02281406", "sulphur_butterfly"], "326": ["n02281787", "lycaenid"], "327": ["n02317335", "starfish"], "328": ["n02319095", "sea_urchin"], "329": ["n02321529", "sea_cucumber"], "330": ["n02325366", "wood_rabbit"], "331": ["n02326432", "hare"], "332": ["n02328150", "Angora"], "333": ["n02342885", "hamster"], "334": ["n02346627", "porcupine"], "335": ["n02356798", "fox_squirrel"], "336": ["n02361337", "marmot"], "337": ["n02363005", "beaver"], "338": ["n02364673", "guinea_pig"], "339": ["n02389026", "sorrel"], "340": ["n02391049", "zebra"], "341": ["n02395406", "hog"], "342": ["n02396427", "wild_boar"], "343": ["n02397096", "warthog"], "344": ["n02398521", "hippopotamus"], "345": ["n02403003", "ox"], "346": ["n02408429", "water_buffalo"], "347": ["n02410509", "bison"], "348": ["n02412080", "ram"], "349": ["n02415577", "bighorn"], "350": ["n02417914", "ibex"], "351": ["n02422106", "hartebeest"], "352": ["n02422699", "impala"], "353": ["n02423022", "gazelle"], "354": ["n02437312", "Arabian_camel"], "355": ["n02437616", "llama"], "356": ["n02441942", "weasel"], "357": ["n02442845", "mink"], "358": ["n02443114", "polecat"], "359": ["n02443484", "black-footed_ferret"], "360": ["n02444819", "otter"], "361": ["n02445715", "skunk"], "362": ["n02447366", "badger"], "363": ["n02454379", "armadillo"], "364": ["n02457408", "three-toed_sloth"], "365": ["n02480495", "orangutan"], "366": ["n02480855", "gorilla"], "367": ["n02481823", "chimpanzee"], "368": ["n02483362", "gibbon"], "369": ["n02483708", "siamang"], "370": ["n02484975", "guenon"], "371": ["n02486261", "patas"], "372": ["n02486410", "baboon"], "373": ["n02487347", "macaque"], "374": ["n02488291", "langur"], "375": ["n02488702", "colobus"], "376": ["n02489166", "proboscis_monkey"], "377": ["n02490219", "marmoset"], "378": ["n02492035", "capuchin"], "379": ["n02492660", "howler_monkey"], "380": ["n02493509", "titi"], "381": ["n02493793", "spider_monkey"], "382": ["n02494079", "squirrel_monkey"], "383": ["n02497673", "Madagascar_cat"], "384": ["n02500267", "indri"], "385": ["n02504013", "Indian_elephant"], "386": ["n02504458", "African_elephant"], "387": ["n02509815", "lesser_panda"], "388": ["n02510455", "giant_panda"], "389": ["n02514041", "barracouta"], "390": ["n02526121", "eel"], "391": ["n02536864", "coho"], "392": ["n02606052", "rock_beauty"], "393": ["n02607072", "anemone_fish"], "394": ["n02640242", "sturgeon"], "395": ["n02641379", "gar"], "396": ["n02643566", "lionfish"], "397": ["n02655020", "puffer"], "398": ["n02666196", "abacus"], "399": ["n02667093", "abaya"], "400": ["n02669723", "academic_gown"], "401": ["n02672831", "accordion"], "402": ["n02676566", "acoustic_guitar"], "403": ["n02687172", "aircraft_carrier"], "404": ["n02690373", "airliner"], "405": ["n02692877", "airship"], "406": ["n02699494", "altar"], "407": ["n02701002", "ambulance"], "408": ["n02704792", "amphibian"], "409": ["n02708093", "analog_clock"], "410": ["n02727426", "apiary"], "411": ["n02730930", "apron"], "412": ["n02747177", "ashcan"], "413": ["n02749479", "assault_rifle"], "414": ["n02769748", "backpack"], "415": ["n02776631", "bakery"], "416": ["n02777292", "balance_beam"], "417": ["n02782093", "balloon"], "418": ["n02783161", "ballpoint"], "419": ["n02786058", "Band_Aid"], "420": ["n02787622", "banjo"], "421": ["n02788148", "bannister"], "422": ["n02790996", "barbell"], "423": ["n02791124", "barber_chair"], "424": ["n02791270", "barbershop"], "425": ["n02793495", "barn"], "426": ["n02794156", "barometer"], "427": ["n02795169", "barrel"], "428": ["n02797295", "barrow"], "429": ["n02799071", "baseball"], "430": ["n02802426", "basketball"], "431": ["n02804414", "bassinet"], "432": ["n02804610", "bassoon"], "433": ["n02807133", "bathing_cap"], "434": ["n02808304", "bath_towel"], "435": ["n02808440", "bathtub"], "436": ["n02814533", "beach_wagon"], "437": ["n02814860", "beacon"], "438": ["n02815834", "beaker"], "439": ["n02817516", "bearskin"], "440": ["n02823428", "beer_bottle"], "441": ["n02823750", "beer_glass"], "442": ["n02825657", "bell_cote"], "443": ["n02834397", "bib"], "444": ["n02835271", "bicycle-built-for-two"], "445": ["n02837789", "bikini"], "446": ["n02840245", "binder"], "447": ["n02841315", "binoculars"], "448": ["n02843684", "birdhouse"], "449": ["n02859443", "boathouse"], "450": ["n02860847", "bobsled"], "451": ["n02865351", "bolo_tie"], "452": ["n02869837", "bonnet"], "453": ["n02870880", "bookcase"], "454": ["n02871525", "bookshop"], "455": ["n02877765", "bottlecap"], "456": ["n02879718", "bow"], "457": ["n02883205", "bow_tie"], "458": ["n02892201", "brass"], "459": ["n02892767", "brassiere"], "460": ["n02894605", "breakwater"], "461": ["n02895154", "breastplate"], "462": ["n02906734", "broom"], "463": ["n02909870", "bucket"], "464": ["n02910353", "buckle"], "465": ["n02916936", "bulletproof_vest"], "466": ["n02917067", "bullet_train"], "467": ["n02927161", "butcher_shop"], "468": ["n02930766", "cab"], "469": ["n02939185", "caldron"], "470": ["n02948072", "candle"], "471": ["n02950826", "cannon"], "472": ["n02951358", "canoe"], "473": ["n02951585", "can_opener"], "474": ["n02963159", "cardigan"], "475": ["n02965783", "car_mirror"], "476": ["n02966193", "carousel"], "477": ["n02966687", "carpenter's_kit"], "478": ["n02971356", "carton"], "479": ["n02974003", "car_wheel"], "480": ["n02977058", "cash_machine"], "481": ["n02978881", "cassette"], "482": ["n02979186", "cassette_player"], "483": ["n02980441", "castle"], "484": ["n02981792", "catamaran"], "485": ["n02988304", "CD_player"], "486": ["n02992211", "cello"], "487": ["n02992529", "cellular_telephone"], "488": ["n02999410", "chain"], "489": ["n03000134", "chainlink_fence"], "490": ["n03000247", "chain_mail"], "491": ["n03000684", "chain_saw"], "492": ["n03014705", "chest"], "493": ["n03016953", "chiffonier"], "494": ["n03017168", "chime"], "495": ["n03018349", "china_cabinet"], "496": ["n03026506", "Christmas_stocking"], "497": ["n03028079", "church"], "498": ["n03032252", "cinema"], "499": ["n03041632", "cleaver"], "500": ["n03042490", "cliff_dwelling"], "501": ["n03045698", "cloak"], "502": ["n03047690", "clog"], "503": ["n03062245", "cocktail_shaker"], "504": ["n03063599", "coffee_mug"], "505": ["n03063689", "coffeepot"], "506": ["n03065424", "coil"], "507": ["n03075370", "combination_lock"], "508": ["n03085013", "computer_keyboard"], "509": ["n03089624", "confectionery"], "510": ["n03095699", "container_ship"], "511": ["n03100240", "convertible"], "512": ["n03109150", "corkscrew"], "513": ["n03110669", "cornet"], "514": ["n03124043", "cowboy_boot"], "515": ["n03124170", "cowboy_hat"], "516": ["n03125729", "cradle"], "517": ["n03126707", "crane"], "518": ["n03127747", "crash_helmet"], "519": ["n03127925", "crate"], "520": ["n03131574", "crib"], "521": ["n03133878", "Crock_Pot"], "522": ["n03134739", "croquet_ball"], "523": ["n03141823", "crutch"], "524": ["n03146219", "cuirass"], "525": ["n03160309", "dam"], "526": ["n03179701", "desk"], "527": ["n03180011", "desktop_computer"], "528": ["n03187595", "dial_telephone"], "529": ["n03188531", "diaper"], "530": ["n03196217", "digital_clock"], "531": ["n03197337", "digital_watch"], "532": ["n03201208", "dining_table"], "533": ["n03207743", "dishrag"], "534": ["n03207941", "dishwasher"], "535": ["n03208938", "disk_brake"], "536": ["n03216828", "dock"], "537": ["n03218198", "dogsled"], "538": ["n03220513", "dome"], "539": ["n03223299", "doormat"], "540": ["n03240683", "drilling_platform"], "541": ["n03249569", "drum"], "542": ["n03250847", "drumstick"], "543": ["n03255030", "dumbbell"], "544": ["n03259280", "Dutch_oven"], "545": ["n03271574", "electric_fan"], "546": ["n03272010", "electric_guitar"], "547": ["n03272562", "electric_locomotive"], "548": ["n03290653", "entertainment_center"], "549": ["n03291819", "envelope"], "550": ["n03297495", "espresso_maker"], "551": ["n03314780", "face_powder"], "552": ["n03325584", "feather_boa"], "553": ["n03337140", "file"], "554": ["n03344393", "fireboat"], "555": ["n03345487", "fire_engine"], "556": ["n03347037", "fire_screen"], "557": ["n03355925", "flagpole"], "558": ["n03372029", "flute"], "559": ["n03376595", "folding_chair"], "560": ["n03379051", "football_helmet"], "561": ["n03384352", "forklift"], "562": ["n03388043", "fountain"], "563": ["n03388183", "fountain_pen"], "564": ["n03388549", "four-poster"], "565": ["n03393912", "freight_car"], "566": ["n03394916", "French_horn"], "567": ["n03400231", "frying_pan"], "568": ["n03404251", "fur_coat"], "569": ["n03417042", "garbage_truck"], "570": ["n03424325", "gasmask"], "571": ["n03425413", "gas_pump"], "572": ["n03443371", "goblet"], "573": ["n03444034", "go-kart"], "574": ["n03445777", "golf_ball"], "575": ["n03445924", "golfcart"], "576": ["n03447447", "gondola"], "577": ["n03447721", "gong"], "578": ["n03450230", "gown"], "579": ["n03452741", "grand_piano"], "580": ["n03457902", "greenhouse"], "581": ["n03459775", "grille"], "582": ["n03461385", "grocery_store"], "583": ["n03467068", "guillotine"], "584": ["n03476684", "hair_slide"], "585": ["n03476991", "hair_spray"], "586": ["n03478589", "half_track"], "587": ["n03481172", "hammer"], "588": ["n03482405", "hamper"], "589": ["n03483316", "hand_blower"], "590": ["n03485407", "hand-held_computer"], "591": ["n03485794", "handkerchief"], "592": ["n03492542", "hard_disc"], "593": ["n03494278", "harmonica"], "594": ["n03495258", "harp"], "595": ["n03496892", "harvester"], "596": ["n03498962", "hatchet"], "597": ["n03527444", "holster"], "598": ["n03529860", "home_theater"], "599": ["n03530642", "honeycomb"], "600": ["n03532672", "hook"], "601": ["n03534580", "hoopskirt"], "602": ["n03535780", "horizontal_bar"], "603": ["n03538406", "horse_cart"], "604": ["n03544143", "hourglass"], "605": ["n03584254", "iPod"], "606": ["n03584829", "iron"], "607": ["n03590841", "jack-o'-lantern"], "608": ["n03594734", "jean"], "609": ["n03594945", "jeep"], "610": ["n03595614", "jersey"], "611": ["n03598930", "jigsaw_puzzle"], "612": ["n03599486", "jinrikisha"], "613": ["n03602883", "joystick"], "614": ["n03617480", "kimono"], "615": ["n03623198", "knee_pad"], "616": ["n03627232", "knot"], "617": ["n03630383", "lab_coat"], "618": ["n03633091", "ladle"], "619": ["n03637318", "lampshade"], "620": ["n03642806", "laptop"], "621": ["n03649909", "lawn_mower"], "622": ["n03657121", "lens_cap"], "623": ["n03658185", "letter_opener"], "624": ["n03661043", "library"], "625": ["n03662601", "lifeboat"], "626": ["n03666591", "lighter"], "627": ["n03670208", "limousine"], "628": ["n03673027", "liner"], "629": ["n03676483", "lipstick"], "630": ["n03680355", "Loafer"], "631": ["n03690938", "lotion"], "632": ["n03691459", "loudspeaker"], "633": ["n03692522", "loupe"], "634": ["n03697007", "lumbermill"], "635": ["n03706229", "magnetic_compass"], "636": ["n03709823", "mailbag"], "637": ["n03710193", "mailbox"], "638": ["n03710637", "maillot"], "639": ["n03710721", "maillot"], "640": ["n03717622", "manhole_cover"], "641": ["n03720891", "maraca"], "642": ["n03721384", "marimba"], "643": ["n03724870", "mask"], "644": ["n03729826", "matchstick"], "645": ["n03733131", "maypole"], "646": ["n03733281", "maze"], "647": ["n03733805", "measuring_cup"], "648": ["n03742115", "medicine_chest"], "649": ["n03743016", "megalith"], "650": ["n03759954", "microphone"], "651": ["n03761084", "microwave"], "652": ["n03763968", "military_uniform"], "653": ["n03764736", "milk_can"], "654": ["n03769881", "minibus"], "655": ["n03770439", "miniskirt"], "656": ["n03770679", "minivan"], "657": ["n03773504", "missile"], "658": ["n03775071", "mitten"], "659": ["n03775546", "mixing_bowl"], "660": ["n03776460", "mobile_home"], "661": ["n03777568", "Model_T"], "662": ["n03777754", "modem"], "663": ["n03781244", "monastery"], "664": ["n03782006", "monitor"], "665": ["n03785016", "moped"], "666": ["n03786901", "mortar"], "667": ["n03787032", "mortarboard"], "668": ["n03788195", "mosque"], "669": ["n03788365", "mosquito_net"], "670": ["n03791053", "motor_scooter"], "671": ["n03792782", "mountain_bike"], "672": ["n03792972", "mountain_tent"], "673": ["n03793489", "mouse"], "674": ["n03794056", "mousetrap"], "675": ["n03796401", "moving_van"], "676": ["n03803284", "muzzle"], "677": ["n03804744", "nail"], "678": ["n03814639", "neck_brace"], "679": ["n03814906", "necklace"], "680": ["n03825788", "nipple"], "681": ["n03832673", "notebook"], "682": ["n03837869", "obelisk"], "683": ["n03838899", "oboe"], "684": ["n03840681", "ocarina"], "685": ["n03841143", "odometer"], "686": ["n03843555", "oil_filter"], "687": ["n03854065", "organ"], "688": ["n03857828", "oscilloscope"], "689": ["n03866082", "overskirt"], "690": ["n03868242", "oxcart"], "691": ["n03868863", "oxygen_mask"], "692": ["n03871628", "packet"], "693": ["n03873416", "paddle"], "694": ["n03874293", "paddlewheel"], "695": ["n03874599", "padlock"], "696": ["n03876231", "paintbrush"], "697": ["n03877472", "pajama"], "698": ["n03877845", "palace"], "699": ["n03884397", "panpipe"], "700": ["n03887697", "paper_towel"], "701": ["n03888257", "parachute"], "702": ["n03888605", "parallel_bars"], "703": ["n03891251", "park_bench"], "704": ["n03891332", "parking_meter"], "705": ["n03895866", "passenger_car"], "706": ["n03899768", "patio"], "707": ["n03902125", "pay-phone"], "708": ["n03903868", "pedestal"], "709": ["n03908618", "pencil_box"], "710": ["n03908714", "pencil_sharpener"], "711": ["n03916031", "perfume"], "712": ["n03920288", "Petri_dish"], "713": ["n03924679", "photocopier"], "714": ["n03929660", "pick"], "715": ["n03929855", "pickelhaube"], "716": ["n03930313", "picket_fence"], "717": ["n03930630", "pickup"], "718": ["n03933933", "pier"], "719": ["n03935335", "piggy_bank"], "720": ["n03937543", "pill_bottle"], "721": ["n03938244", "pillow"], "722": ["n03942813", "ping-pong_ball"], "723": ["n03944341", "pinwheel"], "724": ["n03947888", "pirate"], "725": ["n03950228", "pitcher"], "726": ["n03954731", "plane"], "727": ["n03956157", "planetarium"], "728": ["n03958227", "plastic_bag"], "729": ["n03961711", "plate_rack"], "730": ["n03967562", "plow"], "731": ["n03970156", "plunger"], "732": ["n03976467", "Polaroid_camera"], "733": ["n03976657", "pole"], "734": ["n03977966", "police_van"], "735": ["n03980874", "poncho"], "736": ["n03982430", "pool_table"], "737": ["n03983396", "pop_bottle"], "738": ["n03991062", "pot"], "739": ["n03992509", "potter's_wheel"], "740": ["n03995372", "power_drill"], "741": ["n03998194", "prayer_rug"], "742": ["n04004767", "printer"], "743": ["n04005630", "prison"], "744": ["n04008634", "projectile"], "745": ["n04009552", "projector"], "746": ["n04019541", "puck"], "747": ["n04023962", "punching_bag"], "748": ["n04026417", "purse"], "749": ["n04033901", "quill"], "750": ["n04033995", "quilt"], "751": ["n04037443", "racer"], "752": ["n04039381", "racket"], "753": ["n04040759", "radiator"], "754": ["n04041544", "radio"], "755": ["n04044716", "radio_telescope"], "756": ["n04049303", "rain_barrel"], "757": ["n04065272", "recreational_vehicle"], "758": ["n04067472", "reel"], "759": ["n04069434", "reflex_camera"], "760": ["n04070727", "refrigerator"], "761": ["n04074963", "remote_control"], "762": ["n04081281", "restaurant"], "763": ["n04086273", "revolver"], "764": ["n04090263", "rifle"], "765": ["n04099969", "rocking_chair"], "766": ["n04111531", "rotisserie"], "767": ["n04116512", "rubber_eraser"], "768": ["n04118538", "rugby_ball"], "769": ["n04118776", "rule"], "770": ["n04120489", "running_shoe"], "771": ["n04125021", "safe"], "772": ["n04127249", "safety_pin"], "773": ["n04131690", "saltshaker"], "774": ["n04133789", "sandal"], "775": ["n04136333", "sarong"], "776": ["n04141076", "sax"], "777": ["n04141327", "scabbard"], "778": ["n04141975", "scale"], "779": ["n04146614", "school_bus"], "780": ["n04147183", "schooner"], "781": ["n04149813", "scoreboard"], "782": ["n04152593", "screen"], "783": ["n04153751", "screw"], "784": ["n04154565", "screwdriver"], "785": ["n04162706", "seat_belt"], "786": ["n04179913", "sewing_machine"], "787": ["n04192698", "shield"], "788": ["n04200800", "shoe_shop"], "789": ["n04201297", "shoji"], "790": ["n04204238", "shopping_basket"], "791": ["n04204347", "shopping_cart"], "792": ["n04208210", "shovel"], "793": ["n04209133", "shower_cap"], "794": ["n04209239", "shower_curtain"], "795": ["n04228054", "ski"], "796": ["n04229816", "ski_mask"], "797": ["n04235860", "sleeping_bag"], "798": ["n04238763", "slide_rule"], "799": ["n04239074", "sliding_door"], "800": ["n04243546", "slot"], "801": ["n04251144", "snorkel"], "802": ["n04252077", "snowmobile"], "803": ["n04252225", "snowplow"], "804": ["n04254120", "soap_dispenser"], "805": ["n04254680", "soccer_ball"], "806": ["n04254777", "sock"], "807": ["n04258138", "solar_dish"], "808": ["n04259630", "sombrero"], "809": ["n04263257", "soup_bowl"], "810": ["n04264628", "space_bar"], "811": ["n04265275", "space_heater"], "812": ["n04266014", "space_shuttle"], "813": ["n04270147", "spatula"], "814": ["n04273569", "speedboat"], "815": ["n04275548", "spider_web"], "816": ["n04277352", "spindle"], "817": ["n04285008", "sports_car"], "818": ["n04286575", "spotlight"], "819": ["n04296562", "stage"], "820": ["n04310018", "steam_locomotive"], "821": ["n04311004", "steel_arch_bridge"], "822": ["n04311174", "steel_drum"], "823": ["n04317175", "stethoscope"], "824": ["n04325704", "stole"], "825": ["n04326547", "stone_wall"], "826": ["n04328186", "stopwatch"], "827": ["n04330267", "stove"], "828": ["n04332243", "strainer"], "829": ["n04335435", "streetcar"], "830": ["n04336792", "stretcher"], "831": ["n04344873", "studio_couch"], "832": ["n04346328", "stupa"], "833": ["n04347754", "submarine"], "834": ["n04350905", "suit"], "835": ["n04355338", "sundial"], "836": ["n04355933", "sunglass"], "837": ["n04356056", "sunglasses"], "838": ["n04357314", "sunscreen"], "839": ["n04366367", "suspension_bridge"], "840": ["n04367480", "swab"], "841": ["n04370456", "sweatshirt"], "842": ["n04371430", "swimming_trunks"], "843": ["n04371774", "swing"], "844": ["n04372370", "switch"], "845": ["n04376876", "syringe"], "846": ["n04380533", "table_lamp"], "847": ["n04389033", "tank"], "848": ["n04392985", "tape_player"], "849": ["n04398044", "teapot"], "850": ["n04399382", "teddy"], "851": ["n04404412", "television"], "852": ["n04409515", "tennis_ball"], "853": ["n04417672", "thatch"], "854": ["n04418357", "theater_curtain"], "855": ["n04423845", "thimble"], "856": ["n04428191", "thresher"], "857": ["n04429376", "throne"], "858": ["n04435653", "tile_roof"], "859": ["n04442312", "toaster"], "860": ["n04443257", "tobacco_shop"], "861": ["n04447861", "toilet_seat"], "862": ["n04456115", "torch"], "863": ["n04458633", "totem_pole"], "864": ["n04461696", "tow_truck"], "865": ["n04462240", "toyshop"], "866": ["n04465501", "tractor"], "867": ["n04467665", "trailer_truck"], "868": ["n04476259", "tray"], "869": ["n04479046", "trench_coat"], "870": ["n04482393", "tricycle"], "871": ["n04483307", "trimaran"], "872": ["n04485082", "tripod"], "873": ["n04486054", "triumphal_arch"], "874": ["n04487081", "trolleybus"], "875": ["n04487394", "trombone"], "876": ["n04493381", "tub"], "877": ["n04501370", "turnstile"], "878": ["n04505470", "typewriter_keyboard"], "879": ["n04507155", "umbrella"], "880": ["n04509417", "unicycle"], "881": ["n04515003", "upright"], "882": ["n04517823", "vacuum"], "883": ["n04522168", "vase"], "884": ["n04523525", "vault"], "885": ["n04525038", "velvet"], "886": ["n04525305", "vending_machine"], "887": ["n04532106", "vestment"], "888": ["n04532670", "viaduct"], "889": ["n04536866", "violin"], "890": ["n04540053", "volleyball"], "891": ["n04542943", "waffle_iron"], "892": ["n04548280", "wall_clock"], "893": ["n04548362", "wallet"], "894": ["n04550184", "wardrobe"], "895": ["n04552348", "warplane"], "896": ["n04553703", "washbasin"], "897": ["n04554684", "washer"], "898": ["n04557648", "water_bottle"], "899": ["n04560804", "water_jug"], "900": ["n04562935", "water_tower"], "901": ["n04579145", "whiskey_jug"], "902": ["n04579432", "whistle"], "903": ["n04584207", "wig"], "904": ["n04589890", "window_screen"], "905": ["n04590129", "window_shade"], "906": ["n04591157", "Windsor_tie"], "907": ["n04591713", "wine_bottle"], "908": ["n04592741", "wing"], "909": ["n04596742", "wok"], "910": ["n04597913", "wooden_spoon"], "911": ["n04599235", "wool"], "912": ["n04604644", "worm_fence"], "913": ["n04606251", "wreck"], "914": ["n04612504", "yawl"], "915": ["n04613696", "yurt"], "916": ["n06359193", "web_site"], "917": ["n06596364", "comic_book"], "918": ["n06785654", "crossword_puzzle"], "919": ["n06794110", "street_sign"], "920": ["n06874185", "traffic_light"], "921": ["n07248320", "book_jacket"], "922": ["n07565083", "menu"], "923": ["n07579787", "plate"], "924": ["n07583066", "guacamole"], "925": ["n07584110", "consomme"], "926": ["n07590611", "hot_pot"], "927": ["n07613480", "trifle"], "928": ["n07614500", "ice_cream"], "929": ["n07615774", "ice_lolly"], "930": ["n07684084", "French_loaf"], "931": ["n07693725", "bagel"], "932": ["n07695742", "pretzel"], "933": ["n07697313", "cheeseburger"], "934": ["n07697537", "hotdog"], "935": ["n07711569", "mashed_potato"], "936": ["n07714571", "head_cabbage"], "937": ["n07714990", "broccoli"], "938": ["n07715103", "cauliflower"], "939": ["n07716358", "zucchini"], "940": ["n07716906", "spaghetti_squash"], "941": ["n07717410", "acorn_squash"], "942": ["n07717556", "butternut_squash"], "943": ["n07718472", "cucumber"], "944": ["n07718747", "artichoke"], "945": ["n07720875", "bell_pepper"], "946": ["n07730033", "cardoon"], "947": ["n07734744", "mushroom"], "948": ["n07742313", "Granny_Smith"], "949": ["n07745940", "strawberry"], "950": ["n07747607", "orange"], "951": ["n07749582", "lemon"], "952": ["n07753113", "fig"], "953": ["n07753275", "pineapple"], "954": ["n07753592", "banana"], "955": ["n07754684", "jackfruit"], "956": ["n07760859", "custard_apple"], "957": ["n07768694", "pomegranate"], "958": ["n07802026", "hay"], "959": ["n07831146", "carbonara"], "960": ["n07836838", "chocolate_sauce"], "961": ["n07860988", "dough"], "962": ["n07871810", "meat_loaf"], "963": ["n07873807", "pizza"], "964": ["n07875152", "potpie"], "965": ["n07880968", "burrito"], "966": ["n07892512", "red_wine"], "967": ["n07920052", "espresso"], "968": ["n07930864", "cup"], "969": ["n07932039", "eggnog"], "970": ["n09193705", "alp"], "971": ["n09229709", "bubble"], "972": ["n09246464", "cliff"], "973": ["n09256479", "coral_reef"], "974": ["n09288635", "geyser"], "975": ["n09332890", "lakeside"], "976": ["n09399592", "promontory"], "977": ["n09421951", "sandbar"], "978": ["n09428293", "seashore"], "979": ["n09468604", "valley"], "980": ["n09472597", "volcano"], "981": ["n09835506", "ballplayer"], "982": ["n10148035", "groom"], "983": ["n10565667", "scuba_diver"], "984": ["n11879895", "rapeseed"], "985": ["n11939491", "daisy"], "986": ["n12057211", "yellow_lady's_slipper"], "987": ["n12144580", "corn"], "988": ["n12267677", "acorn"], "989": ["n12620546", "hip"], "990": ["n12768682", "buckeye"], "991": ["n12985857", "coral_fungus"], "992": ["n12998815", "agaric"], "993": ["n13037406", "gyromitra"], "994": ["n13040303", "stinkhorn"], "995": ["n13044778", "earthstar"], "996": ["n13052670", "hen-of-the-woods"], "997": ["n13054560", "bolete"], "998": ["n13133613", "ear"], "999": ["n15075141", "toilet_tissue"]} \ No newline at end of file +{"0": ["n01440764", "tench"], "1": ["n01443537", "goldfish"], "2": ["n01484850", "great_white_shark"], "3": ["n01491361", "tiger_shark"], "4": ["n01494475", "hammerhead"], "5": ["n01496331", "electric_ray"], "6": ["n01498041", "stingray"], "7": ["n01514668", "cock"], "8": ["n01514859", "hen"], "9": ["n01518878", "ostrich"], "10": ["n01530575", "brambling"], "11": ["n01531178", "goldfinch"], "12": ["n01532829", "house_finch"], "13": ["n01534433", "junco"], "14": ["n01537544", "indigo_bunting"], "15": ["n01558993", "robin"], "16": ["n01560419", "bulbul"], "17": ["n01580077", "jay"], "18": ["n01582220", "magpie"], "19": ["n01592084", "chickadee"], "20": ["n01601694", "water_ouzel"], "21": ["n01608432", "kite"], "22": ["n01614925", "bald_eagle"], "23": ["n01616318", "vulture"], "24": ["n01622779", "great_grey_owl"], "25": ["n01629819", "European_fire_salamander"], "26": ["n01630670", "common_newt"], "27": ["n01631663", "eft"], "28": ["n01632458", "spotted_salamander"], "29": ["n01632777", "axolotl"], "30": ["n01641577", "bullfrog"], "31": ["n01644373", "tree_frog"], "32": ["n01644900", "tailed_frog"], "33": ["n01664065", "loggerhead"], "34": ["n01665541", "leatherback_turtle"], "35": ["n01667114", "mud_turtle"], "36": ["n01667778", "terrapin"], "37": ["n01669191", "box_turtle"], "38": ["n01675722", "banded_gecko"], "39": ["n01677366", "common_iguana"], "40": ["n01682714", "American_chameleon"], "41": ["n01685808", "whiptail"], "42": ["n01687978", "agama"], "43": ["n01688243", "frilled_lizard"], "44": ["n01689811", "alligator_lizard"], "45": ["n01692333", "Gila_monster"], "46": ["n01693334", "green_lizard"], "47": ["n01694178", "African_chameleon"], "48": ["n01695060", "Komodo_dragon"], "49": ["n01697457", "African_crocodile"], "50": ["n01698640", "American_alligator"], "51": ["n01704323", "triceratops"], "52": ["n01728572", "thunder_snake"], "53": ["n01728920", "ringneck_snake"], "54": ["n01729322", "hognose_snake"], "55": ["n01729977", "green_snake"], "56": ["n01734418", "king_snake"], "57": ["n01735189", "garter_snake"], "58": ["n01737021", "water_snake"], "59": ["n01739381", "vine_snake"], "60": ["n01740131", "night_snake"], "61": ["n01742172", "boa_constrictor"], "62": ["n01744401", "rock_python"], "63": ["n01748264", "Indian_cobra"], "64": ["n01749939", "green_mamba"], "65": ["n01751748", "sea_snake"], "66": ["n01753488", "horned_viper"], "67": ["n01755581", "diamondback"], "68": ["n01756291", "sidewinder"], "69": ["n01768244", "trilobite"], "70": ["n01770081", "harvestman"], "71": ["n01770393", "scorpion"], "72": ["n01773157", "black_and_gold_garden_spider"], "73": ["n01773549", "barn_spider"], "74": ["n01773797", "garden_spider"], "75": ["n01774384", "black_widow"], "76": ["n01774750", "tarantula"], "77": ["n01775062", "wolf_spider"], "78": ["n01776313", "tick"], "79": ["n01784675", "centipede"], "80": ["n01795545", "black_grouse"], "81": ["n01796340", "ptarmigan"], "82": ["n01797886", "ruffed_grouse"], "83": ["n01798484", "prairie_chicken"], "84": ["n01806143", "peacock"], "85": ["n01806567", "quail"], "86": ["n01807496", "partridge"], "87": ["n01817953", "African_grey"], "88": ["n01818515", "macaw"], "89": ["n01819313", "sulphur-crested_cockatoo"], "90": ["n01820546", "lorikeet"], "91": ["n01824575", "coucal"], "92": ["n01828970", "bee_eater"], "93": ["n01829413", "hornbill"], "94": ["n01833805", "hummingbird"], "95": ["n01843065", "jacamar"], "96": ["n01843383", "toucan"], "97": ["n01847000", "drake"], "98": ["n01855032", "red-breasted_merganser"], "99": ["n01855672", "goose"], "100": ["n01860187", "black_swan"], "101": ["n01871265", "tusker"], "102": ["n01872401", "echidna"], "103": ["n01873310", "platypus"], "104": ["n01877812", "wallaby"], "105": ["n01882714", "koala"], "106": ["n01883070", "wombat"], "107": ["n01910747", "jellyfish"], "108": ["n01914609", "sea_anemone"], "109": ["n01917289", "brain_coral"], "110": ["n01924916", "flatworm"], "111": ["n01930112", "nematode"], "112": ["n01943899", "conch"], "113": ["n01944390", "snail"], "114": ["n01945685", "slug"], "115": ["n01950731", "sea_slug"], "116": ["n01955084", "chiton"], "117": ["n01968897", "chambered_nautilus"], "118": ["n01978287", "Dungeness_crab"], "119": ["n01978455", "rock_crab"], "120": ["n01980166", "fiddler_crab"], "121": ["n01981276", "king_crab"], "122": ["n01983481", "American_lobster"], "123": ["n01984695", "spiny_lobster"], "124": ["n01985128", "crayfish"], "125": ["n01986214", "hermit_crab"], "126": ["n01990800", "isopod"], "127": ["n02002556", "white_stork"], "128": ["n02002724", "black_stork"], "129": ["n02006656", "spoonbill"], "130": ["n02007558", "flamingo"], "131": ["n02009229", "little_blue_heron"], "132": ["n02009912", "American_egret"], "133": ["n02011460", "bittern"], "134": ["n02012849", "crane"], "135": ["n02013706", "limpkin"], "136": ["n02017213", "European_gallinule"], "137": ["n02018207", "American_coot"], "138": ["n02018795", "bustard"], "139": ["n02025239", "ruddy_turnstone"], "140": ["n02027492", "red-backed_sandpiper"], "141": ["n02028035", "redshank"], "142": ["n02033041", "dowitcher"], "143": ["n02037110", "oystercatcher"], "144": ["n02051845", "pelican"], "145": ["n02056570", "king_penguin"], "146": ["n02058221", "albatross"], "147": ["n02066245", "grey_whale"], "148": ["n02071294", "killer_whale"], "149": ["n02074367", "dugong"], "150": ["n02077923", "sea_lion"], "151": ["n02085620", "Chihuahua"], "152": ["n02085782", "Japanese_spaniel"], "153": ["n02085936", "Maltese_dog"], "154": ["n02086079", "Pekinese"], "155": ["n02086240", "Shih-Tzu"], "156": ["n02086646", "Blenheim_spaniel"], "157": ["n02086910", "papillon"], "158": ["n02087046", "toy_terrier"], "159": ["n02087394", "Rhodesian_ridgeback"], "160": ["n02088094", "Afghan_hound"], "161": ["n02088238", "basset"], "162": ["n02088364", "beagle"], "163": ["n02088466", "bloodhound"], "164": ["n02088632", "bluetick"], "165": ["n02089078", "black-and-tan_coonhound"], "166": ["n02089867", "Walker_hound"], "167": ["n02089973", "English_foxhound"], "168": ["n02090379", "redbone"], "169": ["n02090622", "borzoi"], "170": ["n02090721", "Irish_wolfhound"], "171": ["n02091032", "Italian_greyhound"], "172": ["n02091134", "whippet"], "173": ["n02091244", "Ibizan_hound"], "174": ["n02091467", "Norwegian_elkhound"], "175": ["n02091635", "otterhound"], "176": ["n02091831", "Saluki"], "177": ["n02092002", "Scottish_deerhound"], "178": ["n02092339", "Weimaraner"], "179": ["n02093256", "Staffordshire_bullterrier"], "180": ["n02093428", "American_Staffordshire_terrier"], "181": ["n02093647", "Bedlington_terrier"], "182": ["n02093754", "Border_terrier"], "183": ["n02093859", "Kerry_blue_terrier"], "184": ["n02093991", "Irish_terrier"], "185": ["n02094114", "Norfolk_terrier"], "186": ["n02094258", "Norwich_terrier"], "187": ["n02094433", "Yorkshire_terrier"], "188": ["n02095314", "wire-haired_fox_terrier"], "189": ["n02095570", "Lakeland_terrier"], "190": ["n02095889", "Sealyham_terrier"], "191": ["n02096051", "Airedale"], "192": ["n02096177", "cairn"], "193": ["n02096294", "Australian_terrier"], "194": ["n02096437", "Dandie_Dinmont"], "195": ["n02096585", "Boston_bull"], "196": ["n02097047", "miniature_schnauzer"], "197": ["n02097130", "giant_schnauzer"], "198": ["n02097209", "standard_schnauzer"], "199": ["n02097298", "Scotch_terrier"], "200": ["n02097474", "Tibetan_terrier"], "201": ["n02097658", "silky_terrier"], "202": ["n02098105", "soft-coated_wheaten_terrier"], "203": ["n02098286", "West_Highland_white_terrier"], "204": ["n02098413", "Lhasa"], "205": ["n02099267", "flat-coated_retriever"], "206": ["n02099429", "curly-coated_retriever"], "207": ["n02099601", "golden_retriever"], "208": ["n02099712", "Labrador_retriever"], "209": ["n02099849", "Chesapeake_Bay_retriever"], "210": ["n02100236", "German_short-haired_pointer"], "211": ["n02100583", "vizsla"], "212": ["n02100735", "English_setter"], "213": ["n02100877", "Irish_setter"], "214": ["n02101006", "Gordon_setter"], "215": ["n02101388", "Brittany_spaniel"], "216": ["n02101556", "clumber"], "217": ["n02102040", "English_springer"], "218": ["n02102177", "Welsh_springer_spaniel"], "219": ["n02102318", "cocker_spaniel"], "220": ["n02102480", "Sussex_spaniel"], "221": ["n02102973", "Irish_water_spaniel"], "222": ["n02104029", "kuvasz"], "223": ["n02104365", "schipperke"], "224": ["n02105056", "groenendael"], "225": ["n02105162", "malinois"], "226": ["n02105251", "briard"], "227": ["n02105412", "kelpie"], "228": ["n02105505", "komondor"], "229": ["n02105641", "Old_English_sheepdog"], "230": ["n02105855", "Shetland_sheepdog"], "231": ["n02106030", "collie"], "232": ["n02106166", "Border_collie"], "233": ["n02106382", "Bouvier_des_Flandres"], "234": ["n02106550", "Rottweiler"], "235": ["n02106662", "German_shepherd"], "236": ["n02107142", "Doberman"], "237": ["n02107312", "miniature_pinscher"], "238": ["n02107574", "Greater_Swiss_Mountain_dog"], "239": ["n02107683", "Bernese_mountain_dog"], "240": ["n02107908", "Appenzeller"], "241": ["n02108000", "EntleBucher"], "242": ["n02108089", "boxer"], "243": ["n02108422", "bull_mastiff"], "244": ["n02108551", "Tibetan_mastiff"], "245": ["n02108915", "French_bulldog"], "246": ["n02109047", "Great_Dane"], "247": ["n02109525", "Saint_Bernard"], "248": ["n02109961", "Eskimo_dog"], "249": ["n02110063", "malamute"], "250": ["n02110185", "Siberian_husky"], "251": ["n02110341", "dalmatian"], "252": ["n02110627", "affenpinscher"], "253": ["n02110806", "basenji"], "254": ["n02110958", "pug"], "255": ["n02111129", "Leonberg"], "256": ["n02111277", "Newfoundland"], "257": ["n02111500", "Great_Pyrenees"], "258": ["n02111889", "Samoyed"], "259": ["n02112018", "Pomeranian"], "260": ["n02112137", "chow"], "261": ["n02112350", "keeshond"], "262": ["n02112706", "Brabancon_griffon"], "263": ["n02113023", "Pembroke"], "264": ["n02113186", "Cardigan"], "265": ["n02113624", "toy_poodle"], "266": ["n02113712", "miniature_poodle"], "267": ["n02113799", "standard_poodle"], "268": ["n02113978", "Mexican_hairless"], "269": ["n02114367", "timber_wolf"], "270": ["n02114548", "white_wolf"], "271": ["n02114712", "red_wolf"], "272": ["n02114855", "coyote"], "273": ["n02115641", "dingo"], "274": ["n02115913", "dhole"], "275": ["n02116738", "African_hunting_dog"], "276": ["n02117135", "hyena"], "277": ["n02119022", "red_fox"], "278": ["n02119789", "kit_fox"], "279": ["n02120079", "Arctic_fox"], "280": ["n02120505", "grey_fox"], "281": ["n02123045", "tabby"], "282": ["n02123159", "tiger_cat"], "283": ["n02123394", "Persian_cat"], "284": ["n02123597", "Siamese_cat"], "285": ["n02124075", "Egyptian_cat"], "286": ["n02125311", "cougar"], "287": ["n02127052", "lynx"], "288": ["n02128385", "leopard"], "289": ["n02128757", "snow_leopard"], "290": ["n02128925", "jaguar"], "291": ["n02129165", "lion"], "292": ["n02129604", "tiger"], "293": ["n02130308", "cheetah"], "294": ["n02132136", "brown_bear"], "295": ["n02133161", "American_black_bear"], "296": ["n02134084", "ice_bear"], "297": ["n02134418", "sloth_bear"], "298": ["n02137549", "mongoose"], "299": ["n02138441", "meerkat"], "300": ["n02165105", "tiger_beetle"], "301": ["n02165456", "ladybug"], "302": ["n02167151", "ground_beetle"], "303": ["n02168699", "long-horned_beetle"], "304": ["n02169497", "leaf_beetle"], "305": ["n02172182", "dung_beetle"], "306": ["n02174001", "rhinoceros_beetle"], "307": ["n02177972", "weevil"], "308": ["n02190166", "fly"], "309": ["n02206856", "bee"], "310": ["n02219486", "ant"], "311": ["n02226429", "grasshopper"], "312": ["n02229544", "cricket"], "313": ["n02231487", "walking_stick"], "314": ["n02233338", "cockroach"], "315": ["n02236044", "mantis"], "316": ["n02256656", "cicada"], "317": ["n02259212", "leafhopper"], "318": ["n02264363", "lacewing"], "319": ["n02268443", "dragonfly"], "320": ["n02268853", "damselfly"], "321": ["n02276258", "admiral"], "322": ["n02277742", "ringlet"], "323": ["n02279972", "monarch"], "324": ["n02280649", "cabbage_butterfly"], "325": ["n02281406", "sulphur_butterfly"], "326": ["n02281787", "lycaenid"], "327": ["n02317335", "starfish"], "328": ["n02319095", "sea_urchin"], "329": ["n02321529", "sea_cucumber"], "330": ["n02325366", "wood_rabbit"], "331": ["n02326432", "hare"], "332": ["n02328150", "Angora"], "333": ["n02342885", "hamster"], "334": ["n02346627", "porcupine"], "335": ["n02356798", "fox_squirrel"], "336": ["n02361337", "marmot"], "337": ["n02363005", "beaver"], "338": ["n02364673", "guinea_pig"], "339": ["n02389026", "sorrel"], "340": ["n02391049", "zebra"], "341": ["n02395406", "hog"], "342": ["n02396427", "wild_boar"], "343": ["n02397096", "warthog"], "344": ["n02398521", "hippopotamus"], "345": ["n02403003", "ox"], "346": ["n02408429", "water_buffalo"], "347": ["n02410509", "bison"], "348": ["n02412080", "ram"], "349": ["n02415577", "bighorn"], "350": ["n02417914", "ibex"], "351": ["n02422106", "hartebeest"], "352": ["n02422699", "impala"], "353": ["n02423022", "gazelle"], "354": ["n02437312", "Arabian_camel"], "355": ["n02437616", "llama"], "356": ["n02441942", "weasel"], "357": ["n02442845", "mink"], "358": ["n02443114", "polecat"], "359": ["n02443484", "black-footed_ferret"], "360": ["n02444819", "otter"], "361": ["n02445715", "skunk"], "362": ["n02447366", "badger"], "363": ["n02454379", "armadillo"], "364": ["n02457408", "three-toed_sloth"], "365": ["n02480495", "orangutan"], "366": ["n02480855", "gorilla"], "367": ["n02481823", "chimpanzee"], "368": ["n02483362", "gibbon"], "369": ["n02483708", "siamang"], "370": ["n02484975", "guenon"], "371": ["n02486261", "patas"], "372": ["n02486410", "baboon"], "373": ["n02487347", "macaque"], "374": ["n02488291", "langur"], "375": ["n02488702", "colobus"], "376": ["n02489166", "proboscis_monkey"], "377": ["n02490219", "marmoset"], "378": ["n02492035", "capuchin"], "379": ["n02492660", "howler_monkey"], "380": ["n02493509", "titi"], "381": ["n02493793", "spider_monkey"], "382": ["n02494079", "squirrel_monkey"], "383": ["n02497673", "Madagascar_cat"], "384": ["n02500267", "indri"], "385": ["n02504013", "Indian_elephant"], "386": ["n02504458", "African_elephant"], "387": ["n02509815", "lesser_panda"], "388": ["n02510455", "giant_panda"], "389": ["n02514041", "barracouta"], "390": ["n02526121", "eel"], "391": ["n02536864", "coho"], "392": ["n02606052", "rock_beauty"], "393": ["n02607072", "anemone_fish"], "394": ["n02640242", "sturgeon"], "395": ["n02641379", "gar"], "396": ["n02643566", "lionfish"], "397": ["n02655020", "puffer"], "398": ["n02666196", "abacus"], "399": ["n02667093", "abaya"], "400": ["n02669723", "academic_gown"], "401": ["n02672831", "accordion"], "402": ["n02676566", "acoustic_guitar"], "403": ["n02687172", "aircraft_carrier"], "404": ["n02690373", "airliner"], "405": ["n02692877", "airship"], "406": ["n02699494", "altar"], "407": ["n02701002", "ambulance"], "408": ["n02704792", "amphibian"], "409": ["n02708093", "analog_clock"], "410": ["n02727426", "apiary"], "411": ["n02730930", "apron"], "412": ["n02747177", "ashcan"], "413": ["n02749479", "assault_rifle"], "414": ["n02769748", "backpack"], "415": ["n02776631", "bakery"], "416": ["n02777292", "balance_beam"], "417": ["n02782093", "balloon"], "418": ["n02783161", "ballpoint"], "419": ["n02786058", "Band_Aid"], "420": ["n02787622", "banjo"], "421": ["n02788148", "bannister"], "422": ["n02790996", "barbell"], "423": ["n02791124", "barber_chair"], "424": ["n02791270", "barbershop"], "425": ["n02793495", "barn"], "426": ["n02794156", "barometer"], "427": ["n02795169", "barrel"], "428": ["n02797295", "barrow"], "429": ["n02799071", "baseball"], "430": ["n02802426", "basketball"], "431": ["n02804414", "bassinet"], "432": ["n02804610", "bassoon"], "433": ["n02807133", "bathing_cap"], "434": ["n02808304", "bath_towel"], "435": ["n02808440", "bathtub"], "436": ["n02814533", "beach_wagon"], "437": ["n02814860", "beacon"], "438": ["n02815834", "beaker"], "439": ["n02817516", "bearskin"], "440": ["n02823428", "beer_bottle"], "441": ["n02823750", "beer_glass"], "442": ["n02825657", "bell_cote"], "443": ["n02834397", "bib"], "444": ["n02835271", "bicycle-built-for-two"], "445": ["n02837789", "bikini"], "446": ["n02840245", "binder"], "447": ["n02841315", "binoculars"], "448": ["n02843684", "birdhouse"], "449": ["n02859443", "boathouse"], "450": ["n02860847", "bobsled"], "451": ["n02865351", "bolo_tie"], "452": ["n02869837", "bonnet"], "453": ["n02870880", "bookcase"], "454": ["n02871525", "bookshop"], "455": ["n02877765", "bottlecap"], "456": ["n02879718", "bow"], "457": ["n02883205", "bow_tie"], "458": ["n02892201", "brass"], "459": ["n02892767", "brassiere"], "460": ["n02894605", "breakwater"], "461": ["n02895154", "breastplate"], "462": ["n02906734", "broom"], "463": ["n02909870", "bucket"], "464": ["n02910353", "buckle"], "465": ["n02916936", "bulletproof_vest"], "466": ["n02917067", "bullet_train"], "467": ["n02927161", "butcher_shop"], "468": ["n02930766", "cab"], "469": ["n02939185", "caldron"], "470": ["n02948072", "candle"], "471": ["n02950826", "cannon"], "472": ["n02951358", "canoe"], "473": ["n02951585", "can_opener"], "474": ["n02963159", "cardigan"], "475": ["n02965783", "car_mirror"], "476": ["n02966193", "carousel"], "477": ["n02966687", "carpenter's_kit"], "478": ["n02971356", "carton"], "479": ["n02974003", "car_wheel"], "480": ["n02977058", "cash_machine"], "481": ["n02978881", "cassette"], "482": ["n02979186", "cassette_player"], "483": ["n02980441", "castle"], "484": ["n02981792", "catamaran"], "485": ["n02988304", "CD_player"], "486": ["n02992211", "cello"], "487": ["n02992529", "cellular_telephone"], "488": ["n02999410", "chain"], "489": ["n03000134", "chainlink_fence"], "490": ["n03000247", "chain_mail"], "491": ["n03000684", "chain_saw"], "492": ["n03014705", "chest"], "493": ["n03016953", "chiffonier"], "494": ["n03017168", "chime"], "495": ["n03018349", "china_cabinet"], "496": ["n03026506", "Christmas_stocking"], "497": ["n03028079", "church"], "498": ["n03032252", "cinema"], "499": ["n03041632", "cleaver"], "500": ["n03042490", "cliff_dwelling"], "501": ["n03045698", "cloak"], "502": ["n03047690", "clog"], "503": ["n03062245", "cocktail_shaker"], "504": ["n03063599", "coffee_mug"], "505": ["n03063689", "coffeepot"], "506": ["n03065424", "coil"], "507": ["n03075370", "combination_lock"], "508": ["n03085013", "computer_keyboard"], "509": ["n03089624", "confectionery"], "510": ["n03095699", "container_ship"], "511": ["n03100240", "convertible"], "512": ["n03109150", "corkscrew"], "513": ["n03110669", "cornet"], "514": ["n03124043", "cowboy_boot"], "515": ["n03124170", "cowboy_hat"], "516": ["n03125729", "cradle"], "517": ["n03126707", "crane"], "518": ["n03127747", "crash_helmet"], "519": ["n03127925", "crate"], "520": ["n03131574", "crib"], "521": ["n03133878", "Crock_Pot"], "522": ["n03134739", "croquet_ball"], "523": ["n03141823", "crutch"], "524": ["n03146219", "cuirass"], "525": ["n03160309", "dam"], "526": ["n03179701", "desk"], "527": ["n03180011", "desktop_computer"], "528": ["n03187595", "dial_telephone"], "529": ["n03188531", "diaper"], "530": ["n03196217", "digital_clock"], "531": ["n03197337", "digital_watch"], "532": ["n03201208", "dining_table"], "533": ["n03207743", "dishrag"], "534": ["n03207941", "dishwasher"], "535": ["n03208938", "disk_brake"], "536": ["n03216828", "dock"], "537": ["n03218198", "dogsled"], "538": ["n03220513", "dome"], "539": ["n03223299", "doormat"], "540": ["n03240683", "drilling_platform"], "541": ["n03249569", "drum"], "542": ["n03250847", "drumstick"], "543": ["n03255030", "dumbbell"], "544": ["n03259280", "Dutch_oven"], "545": ["n03271574", "electric_fan"], "546": ["n03272010", "electric_guitar"], "547": ["n03272562", "electric_locomotive"], "548": ["n03290653", "entertainment_center"], "549": ["n03291819", "envelope"], "550": ["n03297495", "espresso_maker"], "551": ["n03314780", "face_powder"], "552": ["n03325584", "feather_boa"], "553": ["n03337140", "file"], "554": ["n03344393", "fireboat"], "555": ["n03345487", "fire_engine"], "556": ["n03347037", "fire_screen"], "557": ["n03355925", "flagpole"], "558": ["n03372029", "flute"], "559": ["n03376595", "folding_chair"], "560": ["n03379051", "football_helmet"], "561": ["n03384352", "forklift"], "562": ["n03388043", "fountain"], "563": ["n03388183", "fountain_pen"], "564": ["n03388549", "four-poster"], "565": ["n03393912", "freight_car"], "566": ["n03394916", "French_horn"], "567": ["n03400231", "frying_pan"], "568": ["n03404251", "fur_coat"], "569": ["n03417042", "garbage_truck"], "570": ["n03424325", "gasmask"], "571": ["n03425413", "gas_pump"], "572": ["n03443371", "goblet"], "573": ["n03444034", "go-kart"], "574": ["n03445777", "golf_ball"], "575": ["n03445924", "golfcart"], "576": ["n03447447", "gondola"], "577": ["n03447721", "gong"], "578": ["n03450230", "gown"], "579": ["n03452741", "grand_piano"], "580": ["n03457902", "greenhouse"], "581": ["n03459775", "grille"], "582": ["n03461385", "grocery_store"], "583": ["n03467068", "guillotine"], "584": ["n03476684", "hair_slide"], "585": ["n03476991", "hair_spray"], "586": ["n03478589", "half_track"], "587": ["n03481172", "hammer"], "588": ["n03482405", "hamper"], "589": ["n03483316", "hand_blower"], "590": ["n03485407", "hand-held_computer"], "591": ["n03485794", "handkerchief"], "592": ["n03492542", "hard_disc"], "593": ["n03494278", "harmonica"], "594": ["n03495258", "harp"], "595": ["n03496892", "harvester"], "596": ["n03498962", "hatchet"], "597": ["n03527444", "holster"], "598": ["n03529860", "home_theater"], "599": ["n03530642", "honeycomb"], "600": ["n03532672", "hook"], "601": ["n03534580", "hoopskirt"], "602": ["n03535780", "horizontal_bar"], "603": ["n03538406", "horse_cart"], "604": ["n03544143", "hourglass"], "605": ["n03584254", "iPod"], "606": ["n03584829", "iron"], "607": ["n03590841", "jack-o'-lantern"], "608": ["n03594734", "jean"], "609": ["n03594945", "jeep"], "610": ["n03595614", "jersey"], "611": ["n03598930", "jigsaw_puzzle"], "612": ["n03599486", "jinrikisha"], "613": ["n03602883", "joystick"], "614": ["n03617480", "kimono"], "615": ["n03623198", "knee_pad"], "616": ["n03627232", "knot"], "617": ["n03630383", "lab_coat"], "618": ["n03633091", "ladle"], "619": ["n03637318", "lampshade"], "620": ["n03642806", "laptop"], "621": ["n03649909", "lawn_mower"], "622": ["n03657121", "lens_cap"], "623": ["n03658185", "letter_opener"], "624": ["n03661043", "library"], "625": ["n03662601", "lifeboat"], "626": ["n03666591", "lighter"], "627": ["n03670208", "limousine"], "628": ["n03673027", "liner"], "629": ["n03676483", "lipstick"], "630": ["n03680355", "Loafer"], "631": ["n03690938", "lotion"], "632": ["n03691459", "loudspeaker"], "633": ["n03692522", "loupe"], "634": ["n03697007", "lumbermill"], "635": ["n03706229", "magnetic_compass"], "636": ["n03709823", "mailbag"], "637": ["n03710193", "mailbox"], "638": ["n03710637", "maillot"], "639": ["n03710721", "maillot"], "640": ["n03717622", "manhole_cover"], "641": ["n03720891", "maraca"], "642": ["n03721384", "marimba"], "643": ["n03724870", "mask"], "644": ["n03729826", "matchstick"], "645": ["n03733131", "maypole"], "646": ["n03733281", "maze"], "647": ["n03733805", "measuring_cup"], "648": ["n03742115", "medicine_chest"], "649": ["n03743016", "megalith"], "650": ["n03759954", "microphone"], "651": ["n03761084", "microwave"], "652": ["n03763968", "military_uniform"], "653": ["n03764736", "milk_can"], "654": ["n03769881", "minibus"], "655": ["n03770439", "miniskirt"], "656": ["n03770679", "minivan"], "657": ["n03773504", "missile"], "658": ["n03775071", "mitten"], "659": ["n03775546", "mixing_bowl"], "660": ["n03776460", "mobile_home"], "661": ["n03777568", "Model_T"], "662": ["n03777754", "modem"], "663": ["n03781244", "monastery"], "664": ["n03782006", "monitor"], "665": ["n03785016", "moped"], "666": ["n03786901", "mortar"], "667": ["n03787032", "mortarboard"], "668": ["n03788195", "mosque"], "669": ["n03788365", "mosquito_net"], "670": ["n03791053", "motor_scooter"], "671": ["n03792782", "mountain_bike"], "672": ["n03792972", "mountain_tent"], "673": ["n03793489", "mouse"], "674": ["n03794056", "mousetrap"], "675": ["n03796401", "moving_van"], "676": ["n03803284", "muzzle"], "677": ["n03804744", "nail"], "678": ["n03814639", "neck_brace"], "679": ["n03814906", "necklace"], "680": ["n03825788", "nipple"], "681": ["n03832673", "notebook"], "682": ["n03837869", "obelisk"], "683": ["n03838899", "oboe"], "684": ["n03840681", "ocarina"], "685": ["n03841143", "odometer"], "686": ["n03843555", "oil_filter"], "687": ["n03854065", "organ"], "688": ["n03857828", "oscilloscope"], "689": ["n03866082", "overskirt"], "690": ["n03868242", "oxcart"], "691": ["n03868863", "oxygen_mask"], "692": ["n03871628", "packet"], "693": ["n03873416", "paddle"], "694": ["n03874293", "paddlewheel"], "695": ["n03874599", "padlock"], "696": ["n03876231", "paintbrush"], "697": ["n03877472", "pajama"], "698": ["n03877845", "palace"], "699": ["n03884397", "panpipe"], "700": ["n03887697", "paper_towel"], "701": ["n03888257", "parachute"], "702": ["n03888605", "parallel_bars"], "703": ["n03891251", "park_bench"], "704": ["n03891332", "parking_meter"], "705": ["n03895866", "passenger_car"], "706": ["n03899768", "patio"], "707": ["n03902125", "pay-phone"], "708": ["n03903868", "pedestal"], "709": ["n03908618", "pencil_box"], "710": ["n03908714", "pencil_sharpener"], "711": ["n03916031", "perfume"], "712": ["n03920288", "Petri_dish"], "713": ["n03924679", "photocopier"], "714": ["n03929660", "pick"], "715": ["n03929855", "pickelhaube"], "716": ["n03930313", "picket_fence"], "717": ["n03930630", "pickup"], "718": ["n03933933", "pier"], "719": ["n03935335", "piggy_bank"], "720": ["n03937543", "pill_bottle"], "721": ["n03938244", "pillow"], "722": ["n03942813", "ping-pong_ball"], "723": ["n03944341", "pinwheel"], "724": ["n03947888", "pirate"], "725": ["n03950228", "pitcher"], "726": ["n03954731", "plane"], "727": ["n03956157", "planetarium"], "728": ["n03958227", "plastic_bag"], "729": ["n03961711", "plate_rack"], "730": ["n03967562", "plow"], "731": ["n03970156", "plunger"], "732": ["n03976467", "Polaroid_camera"], "733": ["n03976657", "pole"], "734": ["n03977966", "police_van"], "735": ["n03980874", "poncho"], "736": ["n03982430", "pool_table"], "737": ["n03983396", "pop_bottle"], "738": ["n03991062", "pot"], "739": ["n03992509", "potter's_wheel"], "740": ["n03995372", "power_drill"], "741": ["n03998194", "prayer_rug"], "742": ["n04004767", "printer"], "743": ["n04005630", "prison"], "744": ["n04008634", "projectile"], "745": ["n04009552", "projector"], "746": ["n04019541", "puck"], "747": ["n04023962", "punching_bag"], "748": ["n04026417", "purse"], "749": ["n04033901", "quill"], "750": ["n04033995", "quilt"], "751": ["n04037443", "racer"], "752": ["n04039381", "racket"], "753": ["n04040759", "radiator"], "754": ["n04041544", "radio"], "755": ["n04044716", "radio_telescope"], "756": ["n04049303", "rain_barrel"], "757": ["n04065272", "recreational_vehicle"], "758": ["n04067472", "reel"], "759": ["n04069434", "reflex_camera"], "760": ["n04070727", "refrigerator"], "761": ["n04074963", "remote_control"], "762": ["n04081281", "restaurant"], "763": ["n04086273", "revolver"], "764": ["n04090263", "rifle"], "765": ["n04099969", "rocking_chair"], "766": ["n04111531", "rotisserie"], "767": ["n04116512", "rubber_eraser"], "768": ["n04118538", "rugby_ball"], "769": ["n04118776", "rule"], "770": ["n04120489", "running_shoe"], "771": ["n04125021", "safe"], "772": ["n04127249", "safety_pin"], "773": ["n04131690", "saltshaker"], "774": ["n04133789", "sandal"], "775": ["n04136333", "sarong"], "776": ["n04141076", "sax"], "777": ["n04141327", "scabbard"], "778": ["n04141975", "scale"], "779": ["n04146614", "school_bus"], "780": ["n04147183", "schooner"], "781": ["n04149813", "scoreboard"], "782": ["n04152593", "screen"], "783": ["n04153751", "screw"], "784": ["n04154565", "screwdriver"], "785": ["n04162706", "seat_belt"], "786": ["n04179913", "sewing_machine"], "787": ["n04192698", "shield"], "788": ["n04200800", "shoe_shop"], "789": ["n04201297", "shoji"], "790": ["n04204238", "shopping_basket"], "791": ["n04204347", "shopping_cart"], "792": ["n04208210", "shovel"], "793": ["n04209133", "shower_cap"], "794": ["n04209239", "shower_curtain"], "795": ["n04228054", "ski"], "796": ["n04229816", "ski_mask"], "797": ["n04235860", "sleeping_bag"], "798": ["n04238763", "slide_rule"], "799": ["n04239074", "sliding_door"], "800": ["n04243546", "slot"], "801": ["n04251144", "snorkel"], "802": ["n04252077", "snowmobile"], "803": ["n04252225", "snowplow"], "804": ["n04254120", "soap_dispenser"], "805": ["n04254680", "soccer_ball"], "806": ["n04254777", "sock"], "807": ["n04258138", "solar_dish"], "808": ["n04259630", "sombrero"], "809": ["n04263257", "soup_bowl"], "810": ["n04264628", "space_bar"], "811": ["n04265275", "space_heater"], "812": ["n04266014", "space_shuttle"], "813": ["n04270147", "spatula"], "814": ["n04273569", "speedboat"], "815": ["n04275548", "spider_web"], "816": ["n04277352", "spindle"], "817": ["n04285008", "sports_car"], "818": ["n04286575", "spotlight"], "819": ["n04296562", "stage"], "820": ["n04310018", "steam_locomotive"], "821": ["n04311004", "steel_arch_bridge"], "822": ["n04311174", "steel_drum"], "823": ["n04317175", "stethoscope"], "824": ["n04325704", "stole"], "825": ["n04326547", "stone_wall"], "826": ["n04328186", "stopwatch"], "827": ["n04330267", "stove"], "828": ["n04332243", "strainer"], "829": ["n04335435", "streetcar"], "830": ["n04336792", "stretcher"], "831": ["n04344873", "studio_couch"], "832": ["n04346328", "stupa"], "833": ["n04347754", "submarine"], "834": ["n04350905", "suit"], "835": ["n04355338", "sundial"], "836": ["n04355933", "sunglass"], "837": ["n04356056", "sunglasses"], "838": ["n04357314", "sunscreen"], "839": ["n04366367", "suspension_bridge"], "840": ["n04367480", "swab"], "841": ["n04370456", "sweatshirt"], "842": ["n04371430", "swimming_trunks"], "843": ["n04371774", "swing"], "844": ["n04372370", "switch"], "845": ["n04376876", "syringe"], "846": ["n04380533", "table_lamp"], "847": ["n04389033", "tank"], "848": ["n04392985", "tape_player"], "849": ["n04398044", "teapot"], "850": ["n04399382", "teddy"], "851": ["n04404412", "television"], "852": ["n04409515", "tennis_ball"], "853": ["n04417672", "thatch"], "854": ["n04418357", "theater_curtain"], "855": ["n04423845", "thimble"], "856": ["n04428191", "thresher"], "857": ["n04429376", "throne"], "858": ["n04435653", "tile_roof"], "859": ["n04442312", "toaster"], "860": ["n04443257", "tobacco_shop"], "861": ["n04447861", "toilet_seat"], "862": ["n04456115", "torch"], "863": ["n04458633", "totem_pole"], "864": ["n04461696", "tow_truck"], "865": ["n04462240", "toyshop"], "866": ["n04465501", "tractor"], "867": ["n04467665", "trailer_truck"], "868": ["n04476259", "tray"], "869": ["n04479046", "trench_coat"], "870": ["n04482393", "tricycle"], "871": ["n04483307", "trimaran"], "872": ["n04485082", "tripod"], "873": ["n04486054", "triumphal_arch"], "874": ["n04487081", "trolleybus"], "875": ["n04487394", "trombone"], "876": ["n04493381", "tub"], "877": ["n04501370", "turnstile"], "878": ["n04505470", "typewriter_keyboard"], "879": ["n04507155", "umbrella"], "880": ["n04509417", "unicycle"], "881": ["n04515003", "upright"], "882": ["n04517823", "vacuum"], "883": ["n04522168", "vase"], "884": ["n04523525", "vault"], "885": ["n04525038", "velvet"], "886": ["n04525305", "vending_machine"], "887": ["n04532106", "vestment"], "888": ["n04532670", "viaduct"], "889": ["n04536866", "violin"], "890": ["n04540053", "volleyball"], "891": ["n04542943", "waffle_iron"], "892": ["n04548280", "wall_clock"], "893": ["n04548362", "wallet"], "894": ["n04550184", "wardrobe"], "895": ["n04552348", "warplane"], "896": ["n04553703", "washbasin"], "897": ["n04554684", "washer"], "898": ["n04557648", "water_bottle"], "899": ["n04560804", "water_jug"], "900": ["n04562935", "water_tower"], "901": ["n04579145", "whiskey_jug"], "902": ["n04579432", "whistle"], "903": ["n04584207", "wig"], "904": ["n04589890", "window_screen"], "905": ["n04590129", "window_shade"], "906": ["n04591157", "Windsor_tie"], "907": ["n04591713", "wine_bottle"], "908": ["n04592741", "wing"], "909": ["n04596742", "wok"], "910": ["n04597913", "wooden_spoon"], "911": ["n04599235", "wool"], "912": ["n04604644", "worm_fence"], "913": ["n04606251", "wreck"], "914": ["n04612504", "yawl"], "915": ["n04613696", "yurt"], "916": ["n06359193", "web_site"], "917": ["n06596364", "comic_book"], "918": ["n06785654", "crossword_puzzle"], "919": ["n06794110", "street_sign"], "920": ["n06874185", "traffic_light"], "921": ["n07248320", "book_jacket"], "922": ["n07565083", "menu"], "923": ["n07579787", "plate"], "924": ["n07583066", "guacamole"], "925": ["n07584110", "consomme"], "926": ["n07590611", "hot_pot"], "927": ["n07613480", "trifle"], "928": ["n07614500", "ice_cream"], "929": ["n07615774", "ice_lolly"], "930": ["n07684084", "French_loaf"], "931": ["n07693725", "bagel"], "932": ["n07695742", "pretzel"], "933": ["n07697313", "cheeseburger"], "934": ["n07697537", "hotdog"], "935": ["n07711569", "mashed_potato"], "936": ["n07714571", "head_cabbage"], "937": ["n07714990", "broccoli"], "938": ["n07715103", "cauliflower"], "939": ["n07716358", "zucchini"], "940": ["n07716906", "spaghetti_squash"], "941": ["n07717410", "acorn_squash"], "942": ["n07717556", "butternut_squash"], "943": ["n07718472", "cucumber"], "944": ["n07718747", "artichoke"], "945": ["n07720875", "bell_pepper"], "946": ["n07730033", "cardoon"], "947": ["n07734744", "mushroom"], "948": ["n07742313", "Granny_Smith"], "949": ["n07745940", "strawberry"], "950": ["n07747607", "orange"], "951": ["n07749582", "lemon"], "952": ["n07753113", "fig"], "953": ["n07753275", "pineapple"], "954": ["n07753592", "banana"], "955": ["n07754684", "jackfruit"], "956": ["n07760859", "custard_apple"], "957": ["n07768694", "pomegranate"], "958": ["n07802026", "hay"], "959": ["n07831146", "carbonara"], "960": ["n07836838", "chocolate_sauce"], "961": ["n07860988", "dough"], "962": ["n07871810", "meat_loaf"], "963": ["n07873807", "pizza"], "964": ["n07875152", "potpie"], "965": ["n07880968", "burrito"], "966": ["n07892512", "red_wine"], "967": ["n07920052", "espresso"], "968": ["n07930864", "cup"], "969": ["n07932039", "eggnog"], "970": ["n09193705", "alp"], "971": ["n09229709", "bubble"], "972": ["n09246464", "cliff"], "973": ["n09256479", "coral_reef"], "974": ["n09288635", "geyser"], "975": ["n09332890", "lakeside"], "976": ["n09399592", "promontory"], "977": ["n09421951", "sandbar"], "978": ["n09428293", "seashore"], "979": ["n09468604", "valley"], "980": ["n09472597", "volcano"], "981": ["n09835506", "ballplayer"], "982": ["n10148035", "groom"], "983": ["n10565667", "scuba_diver"], "984": ["n11879895", "rapeseed"], "985": ["n11939491", "daisy"], "986": ["n12057211", "yellow_lady's_slipper"], "987": ["n12144580", "corn"], "988": ["n12267677", "acorn"], "989": ["n12620546", "hip"], "990": ["n12768682", "buckeye"], "991": ["n12985857", "coral_fungus"], "992": ["n12998815", "agaric"], "993": ["n13037406", "gyromitra"], "994": ["n13040303", "stinkhorn"], "995": ["n13044778", "earthstar"], "996": ["n13052670", "hen-of-the-woods"], "997": ["n13054560", "bolete"], "998": ["n13133613", "ear"], "999": ["n15075141", "toilet_tissue"]} diff --git a/gallery/assets/person1.jpg b/gallery/assets/person1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..83251c84a7978f1da3fa4f60b7d1beb2c7663445 Binary files /dev/null and b/gallery/assets/person1.jpg differ diff --git a/gallery/assets/repurposing_annotations_thumbnail.png b/gallery/assets/repurposing_annotations_thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..367eb4ec128c6325794846385dd6763dca62b9a6 Binary files /dev/null and b/gallery/assets/repurposing_annotations_thumbnail.png differ diff --git a/gallery/assets/transforms_thumbnail.png b/gallery/assets/transforms_thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..f9df96c906683e7bb813b73423d669d88cac370a Binary files /dev/null and b/gallery/assets/transforms_thumbnail.png differ diff --git a/gallery/assets/visualization_utils_thumbnail2.png b/gallery/assets/visualization_utils_thumbnail2.png new file mode 100644 index 0000000000000000000000000000000000000000..cf057e04207eeb61f9fedef8c2573994a61e4419 Binary files /dev/null and b/gallery/assets/visualization_utils_thumbnail2.png differ diff --git a/gallery/others/README.rst b/gallery/others/README.rst new file mode 100644 index 0000000000000000000000000000000000000000..fafb007d98522d5888a26868d0ecc420df434ca7 --- /dev/null +++ b/gallery/others/README.rst @@ -0,0 +1,2 @@ +Others +------ diff --git a/gallery/others/plot_optical_flow.py b/gallery/others/plot_optical_flow.py new file mode 100644 index 0000000000000000000000000000000000000000..3ab1449341729cced1c571c9eefefcadc586c08d --- /dev/null +++ b/gallery/others/plot_optical_flow.py @@ -0,0 +1,198 @@ +""" +===================================================== +Optical Flow: Predicting movement with the RAFT model +===================================================== + +.. note:: + Try on `collab `_ + or :ref:`go to the end ` to download the full example code. + +Optical flow is the task of predicting movement between two images, usually two +consecutive frames of a video. Optical flow models take two images as input, and +predict a flow: the flow indicates the displacement of every single pixel in the +first image, and maps it to its corresponding pixel in the second image. Flows +are (2, H, W)-dimensional tensors, where the first axis corresponds to the +predicted horizontal and vertical displacements. + +The following example illustrates how torchvision can be used to predict flows +using our implementation of the RAFT model. We will also see how to convert the +predicted flows to RGB images for visualization. +""" + +import numpy as np +import torch +import matplotlib.pyplot as plt +import torchvision.transforms.functional as F + + +plt.rcParams["savefig.bbox"] = "tight" +# sphinx_gallery_thumbnail_number = 2 + + +def plot(imgs, **imshow_kwargs): + if not isinstance(imgs[0], list): + # Make a 2d grid even if there's just 1 row + imgs = [imgs] + + num_rows = len(imgs) + num_cols = len(imgs[0]) + _, axs = plt.subplots(nrows=num_rows, ncols=num_cols, squeeze=False) + for row_idx, row in enumerate(imgs): + for col_idx, img in enumerate(row): + ax = axs[row_idx, col_idx] + img = F.to_pil_image(img.to("cpu")) + ax.imshow(np.asarray(img), **imshow_kwargs) + ax.set(xticklabels=[], yticklabels=[], xticks=[], yticks=[]) + + plt.tight_layout() + +# %% +# Reading Videos Using Torchvision +# -------------------------------- +# We will first read a video using :func:`~torchvision.io.read_video`. +# Alternatively one can use the new :class:`~torchvision.io.VideoReader` API (if +# torchvision is built from source). +# The video we will use here is free of use from `pexels.com +# `_, +# credits go to `Pavel Danilyuk `_. + + +import tempfile +from pathlib import Path +from urllib.request import urlretrieve + + +video_url = "https://download.pytorch.org/tutorial/pexelscom_pavel_danilyuk_basketball_hd.mp4" +video_path = Path(tempfile.mkdtemp()) / "basketball.mp4" +_ = urlretrieve(video_url, video_path) + +# %% +# :func:`~torchvision.io.read_video` returns the video frames, audio frames and +# the metadata associated with the video. In our case, we only need the video +# frames. +# +# Here we will just make 2 predictions between 2 pre-selected pairs of frames, +# namely frames (100, 101) and (150, 151). Each of these pairs corresponds to a +# single model input. + +from torchvision.io import read_video +frames, _, _ = read_video(str(video_path), output_format="TCHW") + +img1_batch = torch.stack([frames[100], frames[150]]) +img2_batch = torch.stack([frames[101], frames[151]]) + +plot(img1_batch) + +# %% +# The RAFT model accepts RGB images. We first get the frames from +# :func:`~torchvision.io.read_video` and resize them to ensure their dimensions +# are divisible by 8. Note that we explicitly use ``antialias=False``, because +# this is how those models were trained. Then we use the transforms bundled into +# the weights in order to preprocess the input and rescale its values to the +# required ``[-1, 1]`` interval. + +from torchvision.models.optical_flow import Raft_Large_Weights + +weights = Raft_Large_Weights.DEFAULT +transforms = weights.transforms() + + +def preprocess(img1_batch, img2_batch): + img1_batch = F.resize(img1_batch, size=[520, 960], antialias=False) + img2_batch = F.resize(img2_batch, size=[520, 960], antialias=False) + return transforms(img1_batch, img2_batch) + + +img1_batch, img2_batch = preprocess(img1_batch, img2_batch) + +print(f"shape = {img1_batch.shape}, dtype = {img1_batch.dtype}") + + +# %% +# Estimating Optical flow using RAFT +# ---------------------------------- +# We will use our RAFT implementation from +# :func:`~torchvision.models.optical_flow.raft_large`, which follows the same +# architecture as the one described in the `original paper `_. +# We also provide the :func:`~torchvision.models.optical_flow.raft_small` model +# builder, which is smaller and faster to run, sacrificing a bit of accuracy. + +from torchvision.models.optical_flow import raft_large + +# If you can, run this example on a GPU, it will be a lot faster. +device = "cuda" if torch.cuda.is_available() else "cpu" + +model = raft_large(weights=Raft_Large_Weights.DEFAULT, progress=False).to(device) +model = model.eval() + +list_of_flows = model(img1_batch.to(device), img2_batch.to(device)) +print(f"type = {type(list_of_flows)}") +print(f"length = {len(list_of_flows)} = number of iterations of the model") + +# %% +# The RAFT model outputs lists of predicted flows where each entry is a +# (N, 2, H, W) batch of predicted flows that corresponds to a given "iteration" +# in the model. For more details on the iterative nature of the model, please +# refer to the `original paper `_. Here, we +# are only interested in the final predicted flows (they are the most accurate +# ones), so we will just retrieve the last item in the list. +# +# As described above, a flow is a tensor with dimensions (2, H, W) (or (N, 2, H, +# W) for batches of flows) where each entry corresponds to the horizontal and +# vertical displacement of each pixel from the first image to the second image. +# Note that the predicted flows are in "pixel" unit, they are not normalized +# w.r.t. the dimensions of the images. +predicted_flows = list_of_flows[-1] +print(f"dtype = {predicted_flows.dtype}") +print(f"shape = {predicted_flows.shape} = (N, 2, H, W)") +print(f"min = {predicted_flows.min()}, max = {predicted_flows.max()}") + + +# %% +# Visualizing predicted flows +# --------------------------- +# Torchvision provides the :func:`~torchvision.utils.flow_to_image` utility to +# convert a flow into an RGB image. It also supports batches of flows. +# each "direction" in the flow will be mapped to a given RGB color. In the +# images below, pixels with similar colors are assumed by the model to be moving +# in similar directions. The model is properly able to predict the movement of +# the ball and the player. Note in particular the different predicted direction +# of the ball in the first image (going to the left) and in the second image +# (going up). + +from torchvision.utils import flow_to_image + +flow_imgs = flow_to_image(predicted_flows) + +# The images have been mapped into [-1, 1] but for plotting we want them in [0, 1] +img1_batch = [(img1 + 1) / 2 for img1 in img1_batch] + +grid = [[img1, flow_img] for (img1, flow_img) in zip(img1_batch, flow_imgs)] +plot(grid) + +# %% +# Bonus: Creating GIFs of predicted flows +# --------------------------------------- +# In the example above we have only shown the predicted flows of 2 pairs of +# frames. A fun way to apply the Optical Flow models is to run the model on an +# entire video, and create a new video from all the predicted flows. Below is a +# snippet that can get you started with this. We comment out the code, because +# this example is being rendered on a machine without a GPU, and it would take +# too long to run it. + +# from torchvision.io import write_jpeg +# for i, (img1, img2) in enumerate(zip(frames, frames[1:])): +# # Note: it would be faster to predict batches of flows instead of individual flows +# img1, img2 = preprocess(img1, img2) + +# list_of_flows = model(img1.to(device), img2.to(device)) +# predicted_flow = list_of_flows[-1][0] +# flow_img = flow_to_image(predicted_flow).to("cpu") +# output_folder = "/tmp/" # Update this to the folder of your choice +# write_jpeg(flow_img, output_folder + f"predicted_flow_{i}.jpg") + +# %% +# Once the .jpg flow images are saved, you can convert them into a video or a +# GIF using ffmpeg with e.g.: +# +# ffmpeg -f image2 -framerate 30 -i predicted_flow_%d.jpg -loop -1 flow.gif diff --git a/gallery/others/plot_repurposing_annotations.py b/gallery/others/plot_repurposing_annotations.py new file mode 100644 index 0000000000000000000000000000000000000000..b1617cacd99170497ebda357b4bc975b580354ff --- /dev/null +++ b/gallery/others/plot_repurposing_annotations.py @@ -0,0 +1,211 @@ +""" +===================================== +Repurposing masks into bounding boxes +===================================== + +.. note:: + Try on `collab `_ + or :ref:`go to the end ` to download the full example code. + +The following example illustrates the operations available +the :ref:`torchvision.ops ` module for repurposing +segmentation masks into object localization annotations for different tasks +(e.g. transforming masks used by instance and panoptic segmentation +methods into bounding boxes used by object detection methods). +""" + +# sphinx_gallery_thumbnail_path = "../../gallery/assets/repurposing_annotations_thumbnail.png" + +import os +import numpy as np +import torch +import matplotlib.pyplot as plt + +import torchvision.transforms.functional as F + + +ASSETS_DIRECTORY = "../assets" + +plt.rcParams["savefig.bbox"] = "tight" + + +def show(imgs): + if not isinstance(imgs, list): + imgs = [imgs] + fix, axs = plt.subplots(ncols=len(imgs), squeeze=False) + for i, img in enumerate(imgs): + img = img.detach() + img = F.to_pil_image(img) + axs[0, i].imshow(np.asarray(img)) + axs[0, i].set(xticklabels=[], yticklabels=[], xticks=[], yticks=[]) + + +# %% +# Masks +# ----- +# In tasks like instance and panoptic segmentation, masks are commonly defined, and are defined by this package, +# as a multi-dimensional array (e.g. a NumPy array or a PyTorch tensor) with the following shape: +# +# (num_objects, height, width) +# +# Where num_objects is the number of annotated objects in the image. Each (height, width) object corresponds to exactly +# one object. For example, if your input image has the dimensions 224 x 224 and has four annotated objects the shape +# of your masks annotation has the following shape: +# +# (4, 224, 224). +# +# A nice property of masks is that they can be easily repurposed to be used in methods to solve a variety of object +# localization tasks. + +# %% +# Converting Masks to Bounding Boxes +# ----------------------------------------------- +# For example, the :func:`~torchvision.ops.masks_to_boxes` operation can be used to +# transform masks into bounding boxes that can be +# used as input to detection models such as FasterRCNN and RetinaNet. +# We will take images and masks from the `PenFudan Dataset `_. + + +from torchvision.io import read_image + +img_path = os.path.join(ASSETS_DIRECTORY, "FudanPed00054.png") +mask_path = os.path.join(ASSETS_DIRECTORY, "FudanPed00054_mask.png") +img = read_image(img_path) +mask = read_image(mask_path) + + +# %% +# Here the masks are represented as a PNG Image, with floating point values. +# Each pixel is encoded as different colors, with 0 being background. +# Notice that the spatial dimensions of image and mask match. + +print(mask.size()) +print(img.size()) +print(mask) + +# %% + +# We get the unique colors, as these would be the object ids. +obj_ids = torch.unique(mask) + +# first id is the background, so remove it. +obj_ids = obj_ids[1:] + +# split the color-encoded mask into a set of boolean masks. +# Note that this snippet would work as well if the masks were float values instead of ints. +masks = mask == obj_ids[:, None, None] + +# %% +# Now the masks are a boolean tensor. +# The first dimension in this case 3 and denotes the number of instances: there are 3 people in the image. +# The other two dimensions are height and width, which are equal to the dimensions of the image. +# For each instance, the boolean tensors represent if the particular pixel +# belongs to the segmentation mask of the image. + +print(masks.size()) +print(masks) + +# %% +# Let us visualize an image and plot its corresponding segmentation masks. +# We will use the :func:`~torchvision.utils.draw_segmentation_masks` to draw the segmentation masks. + +from torchvision.utils import draw_segmentation_masks + +drawn_masks = [] +for mask in masks: + drawn_masks.append(draw_segmentation_masks(img, mask, alpha=0.8, colors="blue")) + +show(drawn_masks) + +# %% +# To convert the boolean masks into bounding boxes. +# We will use the :func:`~torchvision.ops.masks_to_boxes` from the torchvision.ops module +# It returns the boxes in ``(xmin, ymin, xmax, ymax)`` format. + +from torchvision.ops import masks_to_boxes + +boxes = masks_to_boxes(masks) +print(boxes.size()) +print(boxes) + +# %% +# As the shape denotes, there are 3 boxes and in ``(xmin, ymin, xmax, ymax)`` format. +# These can be visualized very easily with :func:`~torchvision.utils.draw_bounding_boxes` utility +# provided in :ref:`torchvision.utils `. + +from torchvision.utils import draw_bounding_boxes + +drawn_boxes = draw_bounding_boxes(img, boxes, colors="red") +show(drawn_boxes) + +# %% +# These boxes can now directly be used by detection models in torchvision. +# Here is demo with a Faster R-CNN model loaded from +# :func:`~torchvision.models.detection.fasterrcnn_resnet50_fpn` + +from torchvision.models.detection import fasterrcnn_resnet50_fpn, FasterRCNN_ResNet50_FPN_Weights + +weights = FasterRCNN_ResNet50_FPN_Weights.DEFAULT +model = fasterrcnn_resnet50_fpn(weights=weights, progress=False) +print(img.size()) + +tranforms = weights.transforms() +img = tranforms(img) +target = {} +target["boxes"] = boxes +target["labels"] = labels = torch.ones((masks.size(0),), dtype=torch.int64) +detection_outputs = model(img.unsqueeze(0), [target]) + + +# %% +# Converting Segmentation Dataset to Detection Dataset +# ---------------------------------------------------- +# +# With this utility it becomes very simple to convert a segmentation dataset to a detection dataset. +# With this we can now use a segmentation dataset to train a detection model. +# One can similarly convert panoptic dataset to detection dataset. +# Here is an example where we re-purpose the dataset from the +# `PenFudan Detection Tutorial `_. + +class SegmentationToDetectionDataset(torch.utils.data.Dataset): + def __init__(self, root, transforms): + self.root = root + self.transforms = transforms + # load all image files, sorting them to + # ensure that they are aligned + self.imgs = list(sorted(os.listdir(os.path.join(root, "PNGImages")))) + self.masks = list(sorted(os.listdir(os.path.join(root, "PedMasks")))) + + def __getitem__(self, idx): + # load images and masks + img_path = os.path.join(self.root, "PNGImages", self.imgs[idx]) + mask_path = os.path.join(self.root, "PedMasks", self.masks[idx]) + + img = read_image(img_path) + mask = read_image(mask_path) + + img = F.convert_image_dtype(img, dtype=torch.float) + mask = F.convert_image_dtype(mask, dtype=torch.float) + + # We get the unique colors, as these would be the object ids. + obj_ids = torch.unique(mask) + + # first id is the background, so remove it. + obj_ids = obj_ids[1:] + + # split the color-encoded mask into a set of boolean masks. + masks = mask == obj_ids[:, None, None] + + boxes = masks_to_boxes(masks) + + # there is only one class + labels = torch.ones((masks.shape[0],), dtype=torch.int64) + + target = {} + target["boxes"] = boxes + target["labels"] = labels + + if self.transforms is not None: + img, target = self.transforms(img, target) + + return img, target diff --git a/gallery/others/plot_scripted_tensor_transforms.py b/gallery/others/plot_scripted_tensor_transforms.py new file mode 100644 index 0000000000000000000000000000000000000000..128ce7778f3c19811fd124566ade6e99049159db --- /dev/null +++ b/gallery/others/plot_scripted_tensor_transforms.py @@ -0,0 +1,136 @@ +""" +=================== +Torchscript support +=================== + +.. note:: + Try on `collab `_ + or :ref:`go to the end ` to download the full example code. + +This example illustrates `torchscript +`_ support of the torchvision +:ref:`transforms ` on Tensor images. +""" + +# %% +from pathlib import Path + +import matplotlib.pyplot as plt + +import torch +import torch.nn as nn + +import torchvision.transforms as v1 +from torchvision.io import read_image + +plt.rcParams["savefig.bbox"] = 'tight' +torch.manual_seed(1) + +# If you're trying to run that on collab, you can download the assets and the +# helpers from https://github.com/pytorch/vision/tree/main/gallery/ +import sys +sys.path += ["../transforms"] +from helpers import plot +ASSETS_PATH = Path('../assets') + + +# %% +# Most transforms support torchscript. For composing transforms, we use +# :class:`torch.nn.Sequential` instead of +# :class:`~torchvision.transforms.v2.Compose`: + +dog1 = read_image(str(ASSETS_PATH / 'dog1.jpg')) +dog2 = read_image(str(ASSETS_PATH / 'dog2.jpg')) + +transforms = torch.nn.Sequential( + v1.RandomCrop(224), + v1.RandomHorizontalFlip(p=0.3), +) + +scripted_transforms = torch.jit.script(transforms) + +plot([dog1, scripted_transforms(dog1), dog2, scripted_transforms(dog2)]) + + +# %% +# .. warning:: +# +# Above we have used transforms from the ``torchvision.transforms`` +# namespace, i.e. the "v1" transforms. The v2 transforms from the +# ``torchvision.transforms.v2`` namespace are the :ref:`recommended +# ` way to use transforms in your code. +# +# The v2 transforms also support torchscript, but if you call +# ``torch.jit.script()`` on a v2 **class** transform, you'll actually end up +# with its (scripted) v1 equivalent. This may lead to slightly different +# results between the scripted and eager executions due to implementation +# differences between v1 and v2. +# +# If you really need torchscript support for the v2 transforms, **we +# recommend scripting the functionals** from the +# ``torchvision.transforms.v2.functional`` namespace to avoid surprises. +# +# Below we now show how to combine image transformations and a model forward +# pass, while using ``torch.jit.script`` to obtain a single scripted module. +# +# Let's define a ``Predictor`` module that transforms the input tensor and then +# applies an ImageNet model on it. + +from torchvision.models import resnet18, ResNet18_Weights + + +class Predictor(nn.Module): + + def __init__(self): + super().__init__() + weights = ResNet18_Weights.DEFAULT + self.resnet18 = resnet18(weights=weights, progress=False).eval() + self.transforms = weights.transforms(antialias=True) + + def forward(self, x: torch.Tensor) -> torch.Tensor: + with torch.no_grad(): + x = self.transforms(x) + y_pred = self.resnet18(x) + return y_pred.argmax(dim=1) + + +# %% +# Now, let's define scripted and non-scripted instances of ``Predictor`` and +# apply it on multiple tensor images of the same size + +device = "cuda" if torch.cuda.is_available() else "cpu" + +predictor = Predictor().to(device) +scripted_predictor = torch.jit.script(predictor).to(device) + +batch = torch.stack([dog1, dog2]).to(device) + +res = predictor(batch) +res_scripted = scripted_predictor(batch) + +# %% +# We can verify that the prediction of the scripted and non-scripted models are +# the same: + +import json + +with open(Path('../assets') / 'imagenet_class_index.json') as labels_file: + labels = json.load(labels_file) + +for i, (pred, pred_scripted) in enumerate(zip(res, res_scripted)): + assert pred == pred_scripted + print(f"Prediction for Dog {i + 1}: {labels[str(pred.item())]}") + +# %% +# Since the model is scripted, it can be easily dumped on disk and re-used + +import tempfile + +with tempfile.NamedTemporaryFile() as f: + scripted_predictor.save(f.name) + + dumped_scripted_predictor = torch.jit.load(f.name) + res_scripted_dumped = dumped_scripted_predictor(batch) +assert (res_scripted_dumped == res_scripted).all() + +# %% diff --git a/gallery/others/plot_video_api.py b/gallery/others/plot_video_api.py new file mode 100644 index 0000000000000000000000000000000000000000..ac9eb0ba27d8948719e6beeac9545af6f725f362 --- /dev/null +++ b/gallery/others/plot_video_api.py @@ -0,0 +1,346 @@ +""" +========= +Video API +========= + +.. note:: + Try on `collab `_ + or :ref:`go to the end ` to download the full example code. + +This example illustrates some of the APIs that torchvision offers for +videos, together with the examples on how to build datasets and more. +""" + +# %% +# 1. Introduction: building a new video object and examining the properties +# ------------------------------------------------------------------------- +# First we select a video to test the object out. For the sake of argument +# we're using one from kinetics400 dataset. +# To create it, we need to define the path and the stream we want to use. + +# %% +# Chosen video statistics: +# +# - WUzgd7C1pWA.mp4 +# - source: +# - kinetics-400 +# - video: +# - H-264 +# - MPEG-4 AVC (part 10) (avc1) +# - fps: 29.97 +# - audio: +# - MPEG AAC audio (mp4a) +# - sample rate: 48K Hz +# + +import torch +import torchvision +from torchvision.datasets.utils import download_url +torchvision.set_video_backend("video_reader") + +# Download the sample video +download_url( + "https://github.com/pytorch/vision/blob/main/test/assets/videos/WUzgd7C1pWA.mp4?raw=true", + ".", + "WUzgd7C1pWA.mp4" +) +video_path = "./WUzgd7C1pWA.mp4" + +# %% +# Streams are defined in a similar fashion as torch devices. We encode them as strings in a form +# of ``stream_type:stream_id`` where ``stream_type`` is a string and ``stream_id`` a long int. +# The constructor accepts passing a ``stream_type`` only, in which case the stream is auto-discovered. +# Firstly, let's get the metadata for our particular video: + +stream = "video" +video = torchvision.io.VideoReader(video_path, stream) +video.get_metadata() + +# %% +# Here we can see that video has two streams - a video and an audio stream. +# Currently available stream types include ['video', 'audio']. +# Each descriptor consists of two parts: stream type (e.g. 'video') and a unique stream id +# (which are determined by video encoding). +# In this way, if the video container contains multiple streams of the same type, +# users can access the one they want. +# If only stream type is passed, the decoder auto-detects first stream of that type and returns it. + +# %% +# Let's read all the frames from the video stream. By default, the return value of +# ``next(video_reader)`` is a dict containing the following fields. +# +# The return fields are: +# +# - ``data``: containing a torch.tensor +# - ``pts``: containing a float timestamp of this particular frame + +metadata = video.get_metadata() +video.set_current_stream("audio") + +frames = [] # we are going to save the frames here. +ptss = [] # pts is a presentation timestamp in seconds (float) of each frame +for frame in video: + frames.append(frame['data']) + ptss.append(frame['pts']) + +print("PTS for first five frames ", ptss[:5]) +print("Total number of frames: ", len(frames)) +approx_nf = metadata['audio']['duration'][0] * metadata['audio']['framerate'][0] +print("Approx total number of datapoints we can expect: ", approx_nf) +print("Read data size: ", frames[0].size(0) * len(frames)) + +# %% +# But what if we only want to read certain time segment of the video? +# That can be done easily using the combination of our ``seek`` function, and the fact that each call +# to next returns the presentation timestamp of the returned frame in seconds. +# +# Given that our implementation relies on python iterators, +# we can leverage itertools to simplify the process and make it more pythonic. +# +# For example, if we wanted to read ten frames from second second: + + +import itertools +video.set_current_stream("video") + +frames = [] # we are going to save the frames here. + +# We seek into a second second of the video and use islice to get 10 frames since +for frame, pts in itertools.islice(video.seek(2), 10): + frames.append(frame) + +print("Total number of frames: ", len(frames)) + +# %% +# Or if we wanted to read from 2nd to 5th second, +# We seek into a second second of the video, +# then we utilize the itertools takewhile to get the +# correct number of frames: + +video.set_current_stream("video") +frames = [] # we are going to save the frames here. +video = video.seek(2) + +for frame in itertools.takewhile(lambda x: x['pts'] <= 5, video): + frames.append(frame['data']) + +print("Total number of frames: ", len(frames)) +approx_nf = (5 - 2) * video.get_metadata()['video']['fps'][0] +print("We can expect approx: ", approx_nf) +print("Tensor size: ", frames[0].size()) + +# %% +# 2. Building a sample read_video function +# ---------------------------------------------------------------------------------------- +# We can utilize the methods above to build the read video function that follows +# the same API to the existing ``read_video`` function. + + +def example_read_video(video_object, start=0, end=None, read_video=True, read_audio=True): + if end is None: + end = float("inf") + if end < start: + raise ValueError( + "end time should be larger than start time, got " + f"start time={start} and end time={end}" + ) + + video_frames = torch.empty(0) + video_pts = [] + if read_video: + video_object.set_current_stream("video") + frames = [] + for frame in itertools.takewhile(lambda x: x['pts'] <= end, video_object.seek(start)): + frames.append(frame['data']) + video_pts.append(frame['pts']) + if len(frames) > 0: + video_frames = torch.stack(frames, 0) + + audio_frames = torch.empty(0) + audio_pts = [] + if read_audio: + video_object.set_current_stream("audio") + frames = [] + for frame in itertools.takewhile(lambda x: x['pts'] <= end, video_object.seek(start)): + frames.append(frame['data']) + audio_pts.append(frame['pts']) + if len(frames) > 0: + audio_frames = torch.cat(frames, 0) + + return video_frames, audio_frames, (video_pts, audio_pts), video_object.get_metadata() + + +# Total number of frames should be 327 for video and 523264 datapoints for audio +vf, af, info, meta = example_read_video(video) +print(vf.size(), af.size()) + +# %% +# 3. Building an example randomly sampled dataset (can be applied to training dataset of kinetics400) +# ------------------------------------------------------------------------------------------------------- +# Cool, so now we can use the same principle to make the sample dataset. +# We suggest trying out iterable dataset for this purpose. +# Here, we are going to build an example dataset that reads randomly selected 10 frames of video. + +# %% +# Make sample dataset +import os +os.makedirs("./dataset", exist_ok=True) +os.makedirs("./dataset/1", exist_ok=True) +os.makedirs("./dataset/2", exist_ok=True) + +# %% +# Download the videos +from torchvision.datasets.utils import download_url +download_url( + "https://github.com/pytorch/vision/blob/main/test/assets/videos/WUzgd7C1pWA.mp4?raw=true", + "./dataset/1", "WUzgd7C1pWA.mp4" +) +download_url( + "https://github.com/pytorch/vision/blob/main/test/assets/videos/RATRACE_wave_f_nm_np1_fr_goo_37.avi?raw=true", + "./dataset/1", + "RATRACE_wave_f_nm_np1_fr_goo_37.avi" +) +download_url( + "https://github.com/pytorch/vision/blob/main/test/assets/videos/SOX5yA1l24A.mp4?raw=true", + "./dataset/2", + "SOX5yA1l24A.mp4" +) +download_url( + "https://github.com/pytorch/vision/blob/main/test/assets/videos/v_SoccerJuggling_g23_c01.avi?raw=true", + "./dataset/2", + "v_SoccerJuggling_g23_c01.avi" +) +download_url( + "https://github.com/pytorch/vision/blob/main/test/assets/videos/v_SoccerJuggling_g24_c01.avi?raw=true", + "./dataset/2", + "v_SoccerJuggling_g24_c01.avi" +) + +# %% +# Housekeeping and utilities +import os +import random + +from torchvision.datasets.folder import make_dataset +from torchvision import transforms as t + + +def _find_classes(dir): + classes = [d.name for d in os.scandir(dir) if d.is_dir()] + classes.sort() + class_to_idx = {cls_name: i for i, cls_name in enumerate(classes)} + return classes, class_to_idx + + +def get_samples(root, extensions=(".mp4", ".avi")): + _, class_to_idx = _find_classes(root) + return make_dataset(root, class_to_idx, extensions=extensions) + +# %% +# We are going to define the dataset and some basic arguments. +# We assume the structure of the FolderDataset, and add the following parameters: +# +# - ``clip_len``: length of a clip in frames +# - ``frame_transform``: transform for every frame individually +# - ``video_transform``: transform on a video sequence +# +# .. note:: +# We actually add epoch size as using :func:`~torch.utils.data.IterableDataset` +# class allows us to naturally oversample clips or images from each video if needed. + + +class RandomDataset(torch.utils.data.IterableDataset): + def __init__(self, root, epoch_size=None, frame_transform=None, video_transform=None, clip_len=16): + super(RandomDataset).__init__() + + self.samples = get_samples(root) + + # Allow for temporal jittering + if epoch_size is None: + epoch_size = len(self.samples) + self.epoch_size = epoch_size + + self.clip_len = clip_len + self.frame_transform = frame_transform + self.video_transform = video_transform + + def __iter__(self): + for i in range(self.epoch_size): + # Get random sample + path, target = random.choice(self.samples) + # Get video object + vid = torchvision.io.VideoReader(path, "video") + metadata = vid.get_metadata() + video_frames = [] # video frame buffer + + # Seek and return frames + max_seek = metadata["video"]['duration'][0] - (self.clip_len / metadata["video"]['fps'][0]) + start = random.uniform(0., max_seek) + for frame in itertools.islice(vid.seek(start), self.clip_len): + video_frames.append(self.frame_transform(frame['data'])) + current_pts = frame['pts'] + # Stack it into a tensor + video = torch.stack(video_frames, 0) + if self.video_transform: + video = self.video_transform(video) + output = { + 'path': path, + 'video': video, + 'target': target, + 'start': start, + 'end': current_pts} + yield output + +# %% +# Given a path of videos in a folder structure, i.e: +# +# - dataset +# - class 1 +# - file 0 +# - file 1 +# - ... +# - class 2 +# - file 0 +# - file 1 +# - ... +# - ... +# +# We can generate a dataloader and test the dataset. + + +transforms = [t.Resize((112, 112))] +frame_transform = t.Compose(transforms) + +dataset = RandomDataset("./dataset", epoch_size=None, frame_transform=frame_transform) + +# %% +from torch.utils.data import DataLoader +loader = DataLoader(dataset, batch_size=12) +data = {"video": [], 'start': [], 'end': [], 'tensorsize': []} +for batch in loader: + for i in range(len(batch['path'])): + data['video'].append(batch['path'][i]) + data['start'].append(batch['start'][i].item()) + data['end'].append(batch['end'][i].item()) + data['tensorsize'].append(batch['video'][i].size()) +print(data) + +# %% +# 4. Data Visualization +# ---------------------------------- +# Example of visualized video + +import matplotlib.pyplot as plt + +plt.figure(figsize=(12, 12)) +for i in range(16): + plt.subplot(4, 4, i + 1) + plt.imshow(batch["video"][0, i, ...].permute(1, 2, 0)) + plt.axis("off") + +# %% +# Cleanup the video and dataset: +import os +import shutil +os.remove("./WUzgd7C1pWA.mp4") +shutil.rmtree("./dataset") diff --git a/gallery/plot_visualization_utils.py b/gallery/others/plot_visualization_utils.py similarity index 53% rename from gallery/plot_visualization_utils.py rename to gallery/others/plot_visualization_utils.py index feedee4e3cfe7ca3e37440fdb5397c3534132c46..9804fbad648c0ea11abd4b5f39b07b1bb1a80c69 100644 --- a/gallery/plot_visualization_utils.py +++ b/gallery/others/plot_visualization_utils.py @@ -3,10 +3,15 @@ Visualization utilities ======================= +.. note:: + Try on `collab `_ + or :ref:`go to the end ` to download the full example code. + This example illustrates some of the utilities that torchvision offers for -visualizing images, bounding boxes, and segmentation masks. +visualizing images, bounding boxes, segmentation masks and keypoints. """ +# sphinx_gallery_thumbnail_path = "../../gallery/assets/visualization_utils_thumbnail2.png" import torch import numpy as np @@ -21,7 +26,7 @@ plt.rcParams["savefig.bbox"] = 'tight' def show(imgs): if not isinstance(imgs, list): imgs = [imgs] - fix, axs = plt.subplots(ncols=len(imgs), squeeze=False) + fig, axs = plt.subplots(ncols=len(imgs), squeeze=False) for i, img in enumerate(imgs): img = img.detach() img = F.to_pil_image(img) @@ -29,7 +34,7 @@ def show(imgs): axs[0, i].set(xticklabels=[], yticklabels=[], xticks=[], yticks=[]) -#################################### +# %% # Visualizing a grid of images # ---------------------------- # The :func:`~torchvision.utils.make_grid` function can be used to create a @@ -40,13 +45,14 @@ from torchvision.utils import make_grid from torchvision.io import read_image from pathlib import Path -dog1_int = read_image(str(Path('assets') / 'dog1.jpg')) -dog2_int = read_image(str(Path('assets') / 'dog2.jpg')) +dog1_int = read_image(str(Path('../assets') / 'dog1.jpg')) +dog2_int = read_image(str(Path('../assets') / 'dog2.jpg')) +dog_list = [dog1_int, dog2_int] -grid = make_grid([dog1_int, dog2_int, dog1_int, dog2_int]) +grid = make_grid(dog_list) show(grid) -#################################### +# %% # Visualizing bounding boxes # -------------------------- # We can use :func:`~torchvision.utils.draw_bounding_boxes` to draw boxes on an @@ -62,41 +68,39 @@ result = draw_bounding_boxes(dog1_int, boxes, colors=colors, width=5) show(result) -##################################### +# %% # Naturally, we can also plot bounding boxes produced by torchvision detection -# models. Here is demo with a Faster R-CNN model loaded from +# models. Here is a demo with a Faster R-CNN model loaded from # :func:`~torchvision.models.detection.fasterrcnn_resnet50_fpn` -# model. You can also try using a RetinaNet with -# :func:`~torchvision.models.detection.retinanet_resnet50_fpn`, an SSDlite with -# :func:`~torchvision.models.detection.ssdlite320_mobilenet_v3_large` or an SSD with -# :func:`~torchvision.models.detection.ssd300_vgg16`. For more details -# on the output of such models, you may refer to :ref:`instance_seg_output`. +# model. For more details on the output of such models, you may +# refer to :ref:`instance_seg_output`. + +from torchvision.models.detection import fasterrcnn_resnet50_fpn, FasterRCNN_ResNet50_FPN_Weights -from torchvision.models.detection import fasterrcnn_resnet50_fpn -from torchvision.transforms.functional import convert_image_dtype +weights = FasterRCNN_ResNet50_FPN_Weights.DEFAULT +transforms = weights.transforms() -batch_int = torch.stack([dog1_int, dog2_int]) -batch = convert_image_dtype(batch_int, dtype=torch.float) +images = [transforms(d) for d in dog_list] -model = fasterrcnn_resnet50_fpn(pretrained=True, progress=False) +model = fasterrcnn_resnet50_fpn(weights=weights, progress=False) model = model.eval() -outputs = model(batch) +outputs = model(images) print(outputs) -##################################### +# %% # Let's plot the boxes detected by our model. We will only plot the boxes with a # score greater than a given threshold. score_threshold = .8 dogs_with_boxes = [ draw_bounding_boxes(dog_int, boxes=output['boxes'][output['scores'] > score_threshold], width=4) - for dog_int, output in zip(batch_int, outputs) + for dog_int, output in zip(dog_list, outputs) ] show(dogs_with_boxes) -##################################### +# %% # Visualizing segmentation masks # ------------------------------ # The :func:`~torchvision.utils.draw_segmentation_masks` function can be used to @@ -110,26 +114,22 @@ show(dogs_with_boxes) # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ # # We will see how to use it with torchvision's FCN Resnet-50, loaded with -# :func:`~torchvision.models.segmentation.fcn_resnet50`. You can also try using -# DeepLabv3 (:func:`~torchvision.models.segmentation.deeplabv3_resnet50`) or -# lraspp mobilenet models -# (:func:`~torchvision.models.segmentation.lraspp_mobilenet_v3_large`). -# -# Let's start by looking at the ouput of the model. Remember that in general, -# images must be normalized before they're passed to a semantic segmentation -# model. +# :func:`~torchvision.models.segmentation.fcn_resnet50`. Let's start by looking +# at the output of the model. -from torchvision.models.segmentation import fcn_resnet50 +from torchvision.models.segmentation import fcn_resnet50, FCN_ResNet50_Weights +weights = FCN_ResNet50_Weights.DEFAULT +transforms = weights.transforms(resize_size=None) -model = fcn_resnet50(pretrained=True, progress=False) +model = fcn_resnet50(weights=weights, progress=False) model = model.eval() -normalized_batch = F.normalize(batch, mean=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225)) -output = model(normalized_batch)['out'] +batch = torch.stack([transforms(d) for d in dog_list]) +output = model(batch)['out'] print(output.shape, output.min().item(), output.max().item()) -##################################### +# %% # As we can see above, the output of the segmentation model is a tensor of shape # ``(batch_size, num_classes, H, W)``. Each value is a non-normalized score, and # we can normalize them into ``[0, 1]`` by using a softmax. After the softmax, @@ -139,24 +139,19 @@ print(output.shape, output.min().item(), output.max().item()) # Let's plot the masks that have been detected for the dog class and for the # boat class: -sem_classes = [ - '__background__', 'aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus', - 'car', 'cat', 'chair', 'cow', 'diningtable', 'dog', 'horse', 'motorbike', - 'person', 'pottedplant', 'sheep', 'sofa', 'train', 'tvmonitor' -] -sem_class_to_idx = {cls: idx for (idx, cls) in enumerate(sem_classes)} +sem_class_to_idx = {cls: idx for (idx, cls) in enumerate(weights.meta["categories"])} normalized_masks = torch.nn.functional.softmax(output, dim=1) dog_and_boat_masks = [ normalized_masks[img_idx, sem_class_to_idx[cls]] - for img_idx in range(batch.shape[0]) + for img_idx in range(len(dog_list)) for cls in ('dog', 'boat') ] show(dog_and_boat_masks) -##################################### +# %% # As expected, the model is confident about the dog class, but not so much for # the boat class. # @@ -171,7 +166,7 @@ print(f"shape = {boolean_dog_masks.shape}, dtype = {boolean_dog_masks.dtype}") show([m.float() for m in boolean_dog_masks]) -##################################### +# %% # The line above where we define ``boolean_dog_masks`` is a bit cryptic, but you # can read it as the following query: "For which pixels is 'dog' the most likely # class?" @@ -189,15 +184,15 @@ from torchvision.utils import draw_segmentation_masks dogs_with_masks = [ draw_segmentation_masks(img, masks=mask, alpha=0.7) - for img, mask in zip(batch_int, boolean_dog_masks) + for img, mask in zip(dog_list, boolean_dog_masks) ] show(dogs_with_masks) -##################################### +# %% # We can plot more than one mask per image! Remember that the model returned as # many masks as there are classes. Let's ask the same query as above, but this # time for *all* classes, not just the dog class: "For each pixel and each class -# C, is class C the most most likely class?" +# C, is class C the most likely class?" # # This one is a bit more involved, so we'll first show how to do it with a # single image, and then we'll generalize to the batch @@ -213,7 +208,7 @@ print(f"dog1_all_classes_masks = {dog1_all_classes_masks.shape}, dtype = {dog1_a dog_with_all_masks = draw_segmentation_masks(dog1_int, masks=dog1_all_classes_masks, alpha=.6) show(dog_with_all_masks) -##################################### +# %% # We can see in the image above that only 2 masks were drawn: the mask for the # background and the mask for the dog. This is because the model thinks that # only these 2 classes are the most likely ones across all the pixels. If the @@ -235,12 +230,12 @@ all_classes_masks = all_classes_masks.swapaxes(0, 1) dogs_with_masks = [ draw_segmentation_masks(img, masks=mask, alpha=.6) - for img, mask in zip(batch_int, all_classes_masks) + for img, mask in zip(dog_list, all_classes_masks) ] show(dogs_with_masks) -##################################### +# %% # .. _instance_seg_output: # # Instance segmentation models @@ -261,14 +256,20 @@ show(dogs_with_masks) # of them may not have masks, like # :func:`~torchvision.models.detection.fasterrcnn_resnet50_fpn`. -from torchvision.models.detection import maskrcnn_resnet50_fpn -model = maskrcnn_resnet50_fpn(pretrained=True, progress=False) +from torchvision.models.detection import maskrcnn_resnet50_fpn, MaskRCNN_ResNet50_FPN_Weights + +weights = MaskRCNN_ResNet50_FPN_Weights.DEFAULT +transforms = weights.transforms() + +images = [transforms(d) for d in dog_list] + +model = maskrcnn_resnet50_fpn(weights=weights, progress=False) model = model.eval() -output = model(batch) +output = model(images) print(output) -##################################### +# %% # Let's break this down. For each image in the batch, the model outputs some # detections (or instances). The number of detections varies for each input # image. Each instance is described by its bounding box, its label, its score @@ -291,33 +292,16 @@ dog1_masks = dog1_output['masks'] print(f"shape = {dog1_masks.shape}, dtype = {dog1_masks.dtype}, " f"min = {dog1_masks.min()}, max = {dog1_masks.max()}") -##################################### -# Here the masks corresponds to probabilities indicating, for each pixel, how +# %% +# Here the masks correspond to probabilities indicating, for each pixel, how # likely it is to belong to the predicted label of that instance. Those # predicted labels correspond to the 'labels' element in the same output dict. # Let's see which labels were predicted for the instances of the first image. -inst_classes = [ - '__background__', 'person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus', - 'train', 'truck', 'boat', 'traffic light', 'fire hydrant', 'N/A', 'stop sign', - 'parking meter', 'bench', 'bird', 'cat', 'dog', 'horse', 'sheep', 'cow', - 'elephant', 'bear', 'zebra', 'giraffe', 'N/A', 'backpack', 'umbrella', 'N/A', 'N/A', - 'handbag', 'tie', 'suitcase', 'frisbee', 'skis', 'snowboard', 'sports ball', - 'kite', 'baseball bat', 'baseball glove', 'skateboard', 'surfboard', 'tennis racket', - 'bottle', 'N/A', 'wine glass', 'cup', 'fork', 'knife', 'spoon', 'bowl', - 'banana', 'apple', 'sandwich', 'orange', 'broccoli', 'carrot', 'hot dog', 'pizza', - 'donut', 'cake', 'chair', 'couch', 'potted plant', 'bed', 'N/A', 'dining table', - 'N/A', 'N/A', 'toilet', 'N/A', 'tv', 'laptop', 'mouse', 'remote', 'keyboard', 'cell phone', - 'microwave', 'oven', 'toaster', 'sink', 'refrigerator', 'N/A', 'book', - 'clock', 'vase', 'scissors', 'teddy bear', 'hair drier', 'toothbrush' -] - -inst_class_to_idx = {cls: idx for (idx, cls) in enumerate(inst_classes)} - print("For the first dog, the following instances were detected:") -print([inst_classes[label] for label in dog1_output['labels']]) +print([weights.meta["categories"][label] for label in dog1_output['labels']]) -##################################### +# %% # Interestingly, the model detects two persons in the image. Let's go ahead and # plot those masks. Since :func:`~torchvision.utils.draw_segmentation_masks` # expects boolean masks, we need to convert those probabilities into boolean @@ -335,15 +319,15 @@ dog1_bool_masks = dog1_bool_masks.squeeze(1) show(draw_segmentation_masks(dog1_int, dog1_bool_masks, alpha=0.9)) -##################################### +# %% # The model seems to have properly detected the dog, but it also confused trees -# with people. Looking more closely at the scores will help us plotting more +# with people. Looking more closely at the scores will help us plot more # relevant masks: print(dog1_output['scores']) -##################################### -# Clearly the model is less confident about the dog detection than it is about +# %% +# Clearly the model is more confident about the dog detection than it is about # the people detections. That's good news. When plotting the masks, we can ask # for only those that have a good score. Let's use a score threshold of .75 # here, and also plot the masks of the second dog. @@ -357,11 +341,182 @@ boolean_masks = [ dogs_with_masks = [ draw_segmentation_masks(img, mask.squeeze(1)) - for img, mask in zip(batch_int, boolean_masks) + for img, mask in zip(dog_list, boolean_masks) ] show(dogs_with_masks) -##################################### +# %% # The two 'people' masks in the first image where not selected because they have -# a lower score than the score threshold. Similarly in the second image, the +# a lower score than the score threshold. Similarly, in the second image, the # instance with class 15 (which corresponds to 'bench') was not selected. + +# %% +# .. _keypoint_output: +# +# Visualizing keypoints +# ------------------------------ +# The :func:`~torchvision.utils.draw_keypoints` function can be used to +# draw keypoints on images. We will see how to use it with +# torchvision's KeypointRCNN loaded with :func:`~torchvision.models.detection.keypointrcnn_resnet50_fpn`. +# We will first have a look at output of the model. +# + +from torchvision.models.detection import keypointrcnn_resnet50_fpn, KeypointRCNN_ResNet50_FPN_Weights +from torchvision.io import read_image + +person_int = read_image(str(Path("../assets") / "person1.jpg")) + +weights = KeypointRCNN_ResNet50_FPN_Weights.DEFAULT +transforms = weights.transforms() + +person_float = transforms(person_int) + +model = keypointrcnn_resnet50_fpn(weights=weights, progress=False) +model = model.eval() + +outputs = model([person_float]) +print(outputs) + +# %% +# As we see the output contains a list of dictionaries. +# The output list is of length batch_size. +# We currently have just a single image so length of list is 1. +# Each entry in the list corresponds to an input image, +# and it is a dict with keys `boxes`, `labels`, `scores`, `keypoints` and `keypoint_scores`. +# Each value associated to those keys has `num_instances` elements in it. +# In our case above there are 2 instances detected in the image. + +kpts = outputs[0]['keypoints'] +scores = outputs[0]['scores'] + +print(kpts) +print(scores) + +# %% +# The KeypointRCNN model detects there are two instances in the image. +# If you plot the boxes by using :func:`~draw_bounding_boxes` +# you would recognize they are the person and the surfboard. +# If we look at the scores, we will realize that the model is much more confident about the person than surfboard. +# We could now set a threshold confidence and plot instances which we are confident enough. +# Let us set a threshold of 0.75 and filter out the keypoints corresponding to the person. + +detect_threshold = 0.75 +idx = torch.where(scores > detect_threshold) +keypoints = kpts[idx] + +print(keypoints) + +# %% +# Great, now we have the keypoints corresponding to the person. +# Each keypoint is represented by x, y coordinates and the visibility. +# We can now use the :func:`~torchvision.utils.draw_keypoints` function to draw keypoints. +# Note that the utility expects uint8 images. + +from torchvision.utils import draw_keypoints + +res = draw_keypoints(person_int, keypoints, colors="blue", radius=3) +show(res) + +# %% +# As we see, the keypoints appear as colored circles over the image. +# The coco keypoints for a person are ordered and represent the following list.\ + +coco_keypoints = [ + "nose", "left_eye", "right_eye", "left_ear", "right_ear", + "left_shoulder", "right_shoulder", "left_elbow", "right_elbow", + "left_wrist", "right_wrist", "left_hip", "right_hip", + "left_knee", "right_knee", "left_ankle", "right_ankle", +] + +# %% +# What if we are interested in joining the keypoints? +# This is especially useful in creating pose detection or action recognition. +# We can join the keypoints easily using the `connectivity` parameter. +# A close observation would reveal that we would need to join the points in below +# order to construct human skeleton. +# +# nose -> left_eye -> left_ear. (0, 1), (1, 3) +# +# nose -> right_eye -> right_ear. (0, 2), (2, 4) +# +# nose -> left_shoulder -> left_elbow -> left_wrist. (0, 5), (5, 7), (7, 9) +# +# nose -> right_shoulder -> right_elbow -> right_wrist. (0, 6), (6, 8), (8, 10) +# +# left_shoulder -> left_hip -> left_knee -> left_ankle. (5, 11), (11, 13), (13, 15) +# +# right_shoulder -> right_hip -> right_knee -> right_ankle. (6, 12), (12, 14), (14, 16) +# +# We will create a list containing these keypoint ids to be connected. + +connect_skeleton = [ + (0, 1), (0, 2), (1, 3), (2, 4), (0, 5), (0, 6), (5, 7), (6, 8), + (7, 9), (8, 10), (5, 11), (6, 12), (11, 13), (12, 14), (13, 15), (14, 16) +] + +# %% +# We pass the above list to the connectivity parameter to connect the keypoints. +# + +res = draw_keypoints(person_int, keypoints, connectivity=connect_skeleton, colors="blue", radius=4, width=3) +show(res) + +# %% +# That looks pretty good. +# +# .. _draw_keypoints_with_visibility: +# +# Drawing Keypoints with Visibility +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +# Let's have a look at the results, another keypoint prediction module produced, and show the connectivity: + +prediction = torch.tensor( + [[[208.0176, 214.2409, 1.0000], + [000.0000, 000.0000, 0.0000], + [197.8246, 210.6392, 1.0000], + [000.0000, 000.0000, 0.0000], + [178.6378, 217.8425, 1.0000], + [221.2086, 253.8591, 1.0000], + [160.6502, 269.4662, 1.0000], + [243.9929, 304.2822, 1.0000], + [138.4654, 328.8935, 1.0000], + [277.5698, 340.8990, 1.0000], + [153.4551, 374.5145, 1.0000], + [000.0000, 000.0000, 0.0000], + [226.0053, 370.3125, 1.0000], + [221.8081, 455.5516, 1.0000], + [273.9723, 448.9486, 1.0000], + [193.6275, 546.1933, 1.0000], + [273.3727, 545.5930, 1.0000]]] +) + +res = draw_keypoints(person_int, prediction, connectivity=connect_skeleton, colors="blue", radius=4, width=3) +show(res) + +# %% +# What happened there? +# The model, which predicted the new keypoints, +# can't detect the three points that are hidden on the upper left body of the skateboarder. +# More precisely, the model predicted that `(x, y, vis) = (0, 0, 0)` for the left_eye, left_ear, and left_hip. +# So we definitely don't want to display those keypoints and connections, and you don't have to. +# Looking at the parameters of :func:`~torchvision.utils.draw_keypoints`, +# we can see that we can pass a visibility tensor as an additional argument. +# Given the models' prediction, we have the visibility as the third keypoint dimension, we just need to extract it. +# Let's split the ``prediction`` into the keypoint coordinates and their respective visibility, +# and pass both of them as arguments to :func:`~torchvision.utils.draw_keypoints`. + +coordinates, visibility = prediction.split([2, 1], dim=-1) +visibility = visibility.bool() + +res = draw_keypoints( + person_int, coordinates, visibility=visibility, connectivity=connect_skeleton, colors="blue", radius=4, width=3 +) +show(res) + +# %% +# We can see that the undetected keypoints are not draw and the invisible keypoint connections were skipped. +# This can reduce the noise on images with multiple detections, or in cases like ours, +# when the keypoint-prediction model missed some detections. +# Most torch keypoint-prediction models return the visibility for every prediction, ready for you to use it. +# The :func:`~torchvision.models.detection.keypointrcnn_resnet50_fpn` model, +# which we used in the first case, does so too. diff --git a/gallery/plot_scripted_tensor_transforms.py b/gallery/plot_scripted_tensor_transforms.py deleted file mode 100644 index 4eeeeb311b93b1bc8d3bdff56f90583e75d548af..0000000000000000000000000000000000000000 --- a/gallery/plot_scripted_tensor_transforms.py +++ /dev/null @@ -1,145 +0,0 @@ -""" -========================= -Tensor transforms and JIT -========================= - -This example illustrates various features that are now supported by the -:ref:`image transformations ` on Tensor images. In particular, we -show how image transforms can be performed on GPU, and how one can also script -them using JIT compilation. - -Prior to v0.8.0, transforms in torchvision have traditionally been PIL-centric -and presented multiple limitations due to that. Now, since v0.8.0, transforms -implementations are Tensor and PIL compatible and we can achieve the following -new features: - -- transform multi-band torch tensor images (with more than 3-4 channels) -- torchscript transforms together with your model for deployment -- support for GPU acceleration -- batched transformation such as for videos -- read and decode data directly as torch tensor with torchscript support (for PNG and JPEG image formats) - -.. note:: - These features are only possible with **Tensor** images. -""" - -from pathlib import Path - -import matplotlib.pyplot as plt -import numpy as np - -import torch -import torchvision.transforms as T -from torchvision.io import read_image - - -plt.rcParams["savefig.bbox"] = 'tight' -torch.manual_seed(1) - - -def show(imgs): - fix, axs = plt.subplots(ncols=len(imgs), squeeze=False) - for i, img in enumerate(imgs): - img = T.ToPILImage()(img.to('cpu')) - axs[0, i].imshow(np.asarray(img)) - axs[0, i].set(xticklabels=[], yticklabels=[], xticks=[], yticks=[]) - - -#################################### -# The :func:`~torchvision.io.read_image` function allows to read an image and -# directly load it as a tensor - -dog1 = read_image(str(Path('assets') / 'dog1.jpg')) -dog2 = read_image(str(Path('assets') / 'dog2.jpg')) -show([dog1, dog2]) - -#################################### -# Transforming images on GPU -# -------------------------- -# Most transforms natively support tensors on top of PIL images (to visualize -# the effect of the transforms, you may refer to see -# :ref:`sphx_glr_auto_examples_plot_transforms.py`). -# Using tensor images, we can run the transforms on GPUs if cuda is available! - -import torch.nn as nn - -transforms = torch.nn.Sequential( - T.RandomCrop(224), - T.RandomHorizontalFlip(p=0.3), -) - -device = 'cuda' if torch.cuda.is_available() else 'cpu' -dog1 = dog1.to(device) -dog2 = dog2.to(device) - -transformed_dog1 = transforms(dog1) -transformed_dog2 = transforms(dog2) -show([transformed_dog1, transformed_dog2]) - -#################################### -# Scriptable transforms for easier deployment via torchscript -# ----------------------------------------------------------- -# We now show how to combine image transformations and a model forward pass, -# while using ``torch.jit.script`` to obtain a single scripted module. -# -# Let's define a ``Predictor`` module that transforms the input tensor and then -# applies an ImageNet model on it. - -from torchvision.models import resnet18 - - -class Predictor(nn.Module): - - def __init__(self): - super().__init__() - self.resnet18 = resnet18(pretrained=True, progress=False).eval() - self.transforms = nn.Sequential( - T.Resize([256, ]), # We use single int value inside a list due to torchscript type restrictions - T.CenterCrop(224), - T.ConvertImageDtype(torch.float), - T.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) - ) - - def forward(self, x: torch.Tensor) -> torch.Tensor: - with torch.no_grad(): - x = self.transforms(x) - y_pred = self.resnet18(x) - return y_pred.argmax(dim=1) - - -#################################### -# Now, let's define scripted and non-scripted instances of ``Predictor`` and -# apply it on multiple tensor images of the same size - -predictor = Predictor().to(device) -scripted_predictor = torch.jit.script(predictor).to(device) - -batch = torch.stack([dog1, dog2]).to(device) - -res = predictor(batch) -res_scripted = scripted_predictor(batch) - -#################################### -# We can verify that the prediction of the scripted and non-scripted models are -# the same: - -import json - -with open(Path('assets') / 'imagenet_class_index.json', 'r') as labels_file: - labels = json.load(labels_file) - -for i, (pred, pred_scripted) in enumerate(zip(res, res_scripted)): - assert pred == pred_scripted - print(f"Prediction for Dog {i + 1}: {labels[str(pred.item())]}") - -#################################### -# Since the model is scripted, it can be easily dumped on disk an re-used - -import tempfile - -with tempfile.NamedTemporaryFile() as f: - scripted_predictor.save(f.name) - - dumped_scripted_predictor = torch.jit.load(f.name) - res_scripted_dumped = dumped_scripted_predictor(batch) -assert (res_scripted_dumped == res_scripted).all() diff --git a/gallery/plot_transforms.py b/gallery/plot_transforms.py deleted file mode 100644 index 032dd584c26ea395043052559bde511dcc1c2afa..0000000000000000000000000000000000000000 --- a/gallery/plot_transforms.py +++ /dev/null @@ -1,282 +0,0 @@ -""" -========================== -Illustration of transforms -========================== - -This example illustrates the various transforms available in :ref:`the -torchvision.transforms module `. -""" - -from PIL import Image -from pathlib import Path -import matplotlib.pyplot as plt -import numpy as np - -import torch -import torchvision.transforms as T - - -plt.rcParams["savefig.bbox"] = 'tight' -orig_img = Image.open(Path('assets') / 'astronaut.jpg') -# if you change the seed, make sure that the randomly-applied transforms -# properly show that the image can be both transformed and *not* transformed! -torch.manual_seed(0) - - -def plot(imgs, with_orig=True, row_title=None, **imshow_kwargs): - if not isinstance(imgs[0], list): - # Make a 2d grid even if there's just 1 row - imgs = [imgs] - - num_rows = len(imgs) - num_cols = len(imgs[0]) + with_orig - fig, axs = plt.subplots(nrows=num_rows, ncols=num_cols, squeeze=False) - for row_idx, row in enumerate(imgs): - row = [orig_img] + row if with_orig else row - for col_idx, img in enumerate(row): - ax = axs[row_idx, col_idx] - ax.imshow(np.asarray(img), **imshow_kwargs) - ax.set(xticklabels=[], yticklabels=[], xticks=[], yticks=[]) - - if with_orig: - axs[0, 0].set(title='Original image') - axs[0, 0].title.set_size(8) - if row_title is not None: - for row_idx in range(num_rows): - axs[row_idx, 0].set(ylabel=row_title[row_idx]) - - plt.tight_layout() - - -#################################### -# Pad -# --- -# The :class:`~torchvision.transforms.Pad` transform -# (see also :func:`~torchvision.transforms.functional.pad`) -# fills image borders with some pixel values. -padded_imgs = [T.Pad(padding=padding)(orig_img) for padding in (3, 10, 30, 50)] -plot(padded_imgs) - -#################################### -# Resize -# ------ -# The :class:`~torchvision.transforms.Resize` transform -# (see also :func:`~torchvision.transforms.functional.resize`) -# resizes an image. -resized_imgs = [T.Resize(size=size)(orig_img) for size in (30, 50, 100, orig_img.size)] -plot(resized_imgs) - -#################################### -# CenterCrop -# ---------- -# The :class:`~torchvision.transforms.CenterCrop` transform -# (see also :func:`~torchvision.transforms.functional.center_crop`) -# crops the given image at the center. -center_crops = [T.CenterCrop(size=size)(orig_img) for size in (30, 50, 100, orig_img.size)] -plot(center_crops) - -#################################### -# FiveCrop -# -------- -# The :class:`~torchvision.transforms.FiveCrop` transform -# (see also :func:`~torchvision.transforms.functional.five_crop`) -# crops the given image into four corners and the central crop. -(top_left, top_right, bottom_left, bottom_right, center) = T.FiveCrop(size=(100, 100))(orig_img) -plot([top_left, top_right, bottom_left, bottom_right, center]) - -#################################### -# Grayscale -# --------- -# The :class:`~torchvision.transforms.Grayscale` transform -# (see also :func:`~torchvision.transforms.functional.to_grayscale`) -# converts an image to grayscale -gray_img = T.Grayscale()(orig_img) -plot([gray_img], cmap='gray') - -#################################### -# Random transforms -# ----------------- -# The following transforms are random, which means that the same transfomer -# instance will produce different result each time it transforms a given image. -# -# ColorJitter -# ~~~~~~~~~~~ -# The :class:`~torchvision.transforms.ColorJitter` transform -# randomly changes the brightness, saturation, and other properties of an image. -jitter = T.ColorJitter(brightness=.5, hue=.3) -jitted_imgs = [jitter(orig_img) for _ in range(4)] -plot(jitted_imgs) - -#################################### -# GaussianBlur -# ~~~~~~~~~~~~ -# The :class:`~torchvision.transforms.GaussianBlur` transform -# (see also :func:`~torchvision.transforms.functional.gaussian_blur`) -# performs gaussian blur transform on an image. -blurrer = T.GaussianBlur(kernel_size=(5, 9), sigma=(0.1, 5)) -blurred_imgs = [blurrer(orig_img) for _ in range(4)] -plot(blurred_imgs) - -#################################### -# RandomPerspective -# ~~~~~~~~~~~~~~~~~ -# The :class:`~torchvision.transforms.RandomPerspective` transform -# (see also :func:`~torchvision.transforms.functional.perspective`) -# performs random perspective transform on an image. -perspective_transformer = T.RandomPerspective(distortion_scale=0.6, p=1.0) -perspective_imgs = [perspective_transformer(orig_img) for _ in range(4)] -plot(perspective_imgs) - -#################################### -# RandomRotation -# ~~~~~~~~~~~~~~ -# The :class:`~torchvision.transforms.RandomRotation` transform -# (see also :func:`~torchvision.transforms.functional.rotate`) -# rotates an image with random angle. -rotater = T.RandomRotation(degrees=(0, 180)) -rotated_imgs = [rotater(orig_img) for _ in range(4)] -plot(rotated_imgs) - -#################################### -# RandomAffine -# ~~~~~~~~~~~~ -# The :class:`~torchvision.transforms.RandomAffine` transform -# (see also :func:`~torchvision.transforms.functional.affine`) -# performs random affine transform on an image. -affine_transfomer = T.RandomAffine(degrees=(30, 70), translate=(0.1, 0.3), scale=(0.5, 0.75)) -affine_imgs = [affine_transfomer(orig_img) for _ in range(4)] -plot(affine_imgs) - -#################################### -# RandomCrop -# ~~~~~~~~~~ -# The :class:`~torchvision.transforms.RandomCrop` transform -# (see also :func:`~torchvision.transforms.functional.crop`) -# crops an image at a random location. -cropper = T.RandomCrop(size=(128, 128)) -crops = [cropper(orig_img) for _ in range(4)] -plot(crops) - -#################################### -# RandomResizedCrop -# ~~~~~~~~~~~~~~~~~ -# The :class:`~torchvision.transforms.RandomResizedCrop` transform -# (see also :func:`~torchvision.transforms.functional.resized_crop`) -# crops an image at a random location, and then resizes the crop to a given -# size. -resize_cropper = T.RandomResizedCrop(size=(32, 32)) -resized_crops = [resize_cropper(orig_img) for _ in range(4)] -plot(resized_crops) - -#################################### -# RandomInvert -# ~~~~~~~~~~~~ -# The :class:`~torchvision.transforms.RandomInvert` transform -# (see also :func:`~torchvision.transforms.functional.invert`) -# randomly inverts the colors of the given image. -inverter = T.RandomInvert() -invertered_imgs = [inverter(orig_img) for _ in range(4)] -plot(invertered_imgs) - -#################################### -# RandomPosterize -# ~~~~~~~~~~~~~~~ -# The :class:`~torchvision.transforms.RandomPosterize` transform -# (see also :func:`~torchvision.transforms.functional.posterize`) -# randomly posterizes the image by reducing the number of bits -# of each color channel. -posterizer = T.RandomPosterize(bits=2) -posterized_imgs = [posterizer(orig_img) for _ in range(4)] -plot(posterized_imgs) - -#################################### -# RandomSolarize -# ~~~~~~~~~~~~~~ -# The :class:`~torchvision.transforms.RandomSolarize` transform -# (see also :func:`~torchvision.transforms.functional.solarize`) -# randomly solarizes the image by inverting all pixel values above -# the threshold. -solarizer = T.RandomSolarize(threshold=192.0) -solarized_imgs = [solarizer(orig_img) for _ in range(4)] -plot(solarized_imgs) - -#################################### -# RandomAdjustSharpness -# ~~~~~~~~~~~~~~~~~~~~~ -# The :class:`~torchvision.transforms.RandomAdjustSharpness` transform -# (see also :func:`~torchvision.transforms.functional.adjust_sharpness`) -# randomly adjusts the sharpness of the given image. -sharpness_adjuster = T.RandomAdjustSharpness(sharpness_factor=2) -sharpened_imgs = [sharpness_adjuster(orig_img) for _ in range(4)] -plot(sharpened_imgs) - -#################################### -# RandomAutocontrast -# ~~~~~~~~~~~~~~~~~~ -# The :class:`~torchvision.transforms.RandomAutocontrast` transform -# (see also :func:`~torchvision.transforms.functional.autocontrast`) -# randomly applies autocontrast to the given image. -autocontraster = T.RandomAutocontrast() -autocontrasted_imgs = [autocontraster(orig_img) for _ in range(4)] -plot(autocontrasted_imgs) - -#################################### -# RandomEqualize -# ~~~~~~~~~~~~~~ -# The :class:`~torchvision.transforms.RandomEqualize` transform -# (see also :func:`~torchvision.transforms.functional.equalize`) -# randomly equalizes the histogram of the given image. -equalizer = T.RandomEqualize() -equalized_imgs = [equalizer(orig_img) for _ in range(4)] -plot(equalized_imgs) - -#################################### -# AutoAugment -# ~~~~~~~~~~~ -# The :class:`~torchvision.transforms.AutoAugment` transform -# automatically augments data based on a given auto-augmentation policy. -# See :class:`~torchvision.transforms.AutoAugmentPolicy` for the available policies. -policies = [T.AutoAugmentPolicy.CIFAR10, T.AutoAugmentPolicy.IMAGENET, T.AutoAugmentPolicy.SVHN] -augmenters = [T.AutoAugment(policy) for policy in policies] -imgs = [ - [augmenter(orig_img) for _ in range(4)] - for augmenter in augmenters -] -row_title = [str(policy).split('.')[-1] for policy in policies] -plot(imgs, row_title=row_title) - -#################################### -# Randomly-applied transforms -# --------------------------- -# -# Some transforms are randomly-applied given a probability ``p``. That is, the -# transformed image may actually be the same as the original one, even when -# called with the same transformer instance! -# -# RandomHorizontalFlip -# ~~~~~~~~~~~~~~~~~~~~ -# The :class:`~torchvision.transforms.RandomHorizontalFlip` transform -# (see also :func:`~torchvision.transforms.functional.hflip`) -# performs horizontal flip of an image, with a given probability. -hflipper = T.RandomHorizontalFlip(p=0.5) -transformed_imgs = [hflipper(orig_img) for _ in range(4)] -plot(transformed_imgs) - -#################################### -# RandomVerticalFlip -# ~~~~~~~~~~~~~~~~~~ -# The :class:`~torchvision.transforms.RandomVerticalFlip` transform -# (see also :func:`~torchvision.transforms.functional.vflip`) -# performs vertical flip of an image, with a given probability. -vflipper = T.RandomVerticalFlip(p=0.5) -transformed_imgs = [vflipper(orig_img) for _ in range(4)] -plot(transformed_imgs) - -#################################### -# RandomApply -# ~~~~~~~~~~~ -# The :class:`~torchvision.transforms.RandomApply` transform -# randomly applies a list of transforms, with a given probability. -applier = T.RandomApply(transforms=[T.RandomCrop(size=(64, 64))], p=0.5) -transformed_imgs = [applier(orig_img) for _ in range(4)] -plot(transformed_imgs) diff --git a/gallery/transforms/README.rst b/gallery/transforms/README.rst new file mode 100644 index 0000000000000000000000000000000000000000..1b8b1b08155ae339948c20d13f2f55d5a580a6bc --- /dev/null +++ b/gallery/transforms/README.rst @@ -0,0 +1,4 @@ +.. _transforms_gallery: + +Transforms +---------- diff --git a/gallery/transforms/helpers.py b/gallery/transforms/helpers.py new file mode 100644 index 0000000000000000000000000000000000000000..e94d717eb7df9a7585cf1704262368208bf0e786 --- /dev/null +++ b/gallery/transforms/helpers.py @@ -0,0 +1,50 @@ +import matplotlib.pyplot as plt +import torch +from torchvision.utils import draw_bounding_boxes, draw_segmentation_masks +from torchvision import tv_tensors +from torchvision.transforms.v2 import functional as F + + +def plot(imgs, row_title=None, **imshow_kwargs): + if not isinstance(imgs[0], list): + # Make a 2d grid even if there's just 1 row + imgs = [imgs] + + num_rows = len(imgs) + num_cols = len(imgs[0]) + _, axs = plt.subplots(nrows=num_rows, ncols=num_cols, squeeze=False) + for row_idx, row in enumerate(imgs): + for col_idx, img in enumerate(row): + boxes = None + masks = None + if isinstance(img, tuple): + img, target = img + if isinstance(target, dict): + boxes = target.get("boxes") + masks = target.get("masks") + elif isinstance(target, tv_tensors.BoundingBoxes): + boxes = target + else: + raise ValueError(f"Unexpected target type: {type(target)}") + img = F.to_image(img) + if img.dtype.is_floating_point and img.min() < 0: + # Poor man's re-normalization for the colors to be OK-ish. This + # is useful for images coming out of Normalize() + img -= img.min() + img /= img.max() + + img = F.to_dtype(img, torch.uint8, scale=True) + if boxes is not None: + img = draw_bounding_boxes(img, boxes, colors="yellow", width=3) + if masks is not None: + img = draw_segmentation_masks(img, masks.to(torch.bool), colors=["green"] * masks.shape[0], alpha=.65) + + ax = axs[row_idx, col_idx] + ax.imshow(img.permute(1, 2, 0).numpy(), **imshow_kwargs) + ax.set(xticklabels=[], yticklabels=[], xticks=[], yticks=[]) + + if row_title is not None: + for row_idx in range(num_rows): + axs[row_idx, 0].set(ylabel=row_title[row_idx]) + + plt.tight_layout() diff --git a/gallery/transforms/plot_custom_transforms.py b/gallery/transforms/plot_custom_transforms.py new file mode 100644 index 0000000000000000000000000000000000000000..898c2cd0beaedbe21c5b112aed556a689518bb49 --- /dev/null +++ b/gallery/transforms/plot_custom_transforms.py @@ -0,0 +1,121 @@ +""" +=================================== +How to write your own v2 transforms +=================================== + +.. note:: + Try on `collab `_ + or :ref:`go to the end ` to download the full example code. + +This guide explains how to write transforms that are compatible with the +torchvision transforms V2 API. +""" + +# %% +import torch +from torchvision import tv_tensors +from torchvision.transforms import v2 + + +# %% +# Just create a ``nn.Module`` and override the ``forward`` method +# =============================================================== +# +# In most cases, this is all you're going to need, as long as you already know +# the structure of the input that your transform will expect. For example if +# you're just doing image classification, your transform will typically accept a +# single image as input, or a ``(img, label)`` input. So you can just hard-code +# your ``forward`` method to accept just that, e.g. +# +# .. code:: python +# +# class MyCustomTransform(torch.nn.Module): +# def forward(self, img, label): +# # Do some transformations +# return new_img, new_label +# +# .. note:: +# +# This means that if you have a custom transform that is already compatible +# with the V1 transforms (those in ``torchvision.transforms``), it will +# still work with the V2 transforms without any change! +# +# We will illustrate this more completely below with a typical detection case, +# where our samples are just images, bounding boxes and labels: + +class MyCustomTransform(torch.nn.Module): + def forward(self, img, bboxes, label): # we assume inputs are always structured like this + print( + f"I'm transforming an image of shape {img.shape} " + f"with bboxes = {bboxes}\n{label = }" + ) + # Do some transformations. Here, we're just passing though the input + return img, bboxes, label + + +transforms = v2.Compose([ + MyCustomTransform(), + v2.RandomResizedCrop((224, 224), antialias=True), + v2.RandomHorizontalFlip(p=1), + v2.Normalize(mean=[0, 0, 0], std=[1, 1, 1]) +]) + +H, W = 256, 256 +img = torch.rand(3, H, W) +bboxes = tv_tensors.BoundingBoxes( + torch.tensor([[0, 10, 10, 20], [50, 50, 70, 70]]), + format="XYXY", + canvas_size=(H, W) +) +label = 3 + +out_img, out_bboxes, out_label = transforms(img, bboxes, label) +# %% +print(f"Output image shape: {out_img.shape}\nout_bboxes = {out_bboxes}\n{out_label = }") +# %% +# .. note:: +# While working with TVTensor classes in your code, make sure to +# familiarize yourself with this section: +# :ref:`tv_tensor_unwrapping_behaviour` +# +# Supporting arbitrary input structures +# ===================================== +# +# In the section above, we have assumed that you already know the structure of +# your inputs and that you're OK with hard-coding this expected structure in +# your code. If you want your custom transforms to be as flexible as possible, +# this can be a bit limiting. +# +# A key feature of the builtin Torchvision V2 transforms is that they can accept +# arbitrary input structure and return the same structure as output (with +# transformed entries). For example, transforms can accept a single image, or a +# tuple of ``(img, label)``, or an arbitrary nested dictionary as input: + +structured_input = { + "img": img, + "annotations": (bboxes, label), + "something_that_will_be_ignored": (1, "hello") +} +structured_output = v2.RandomHorizontalFlip(p=1)(structured_input) + +assert isinstance(structured_output, dict) +assert structured_output["something_that_will_be_ignored"] == (1, "hello") +print(f"The transformed bboxes are:\n{structured_output['annotations'][0]}") + +# %% +# If you want to reproduce this behavior in your own transform, we invite you to +# look at our `code +# `_ +# and adapt it to your needs. +# +# In brief, the core logic is to unpack the input into a flat list using `pytree +# `_, and +# then transform only the entries that can be transformed (the decision is made +# based on the **class** of the entries, as all TVTensors are +# tensor-subclasses) plus some custom logic that is out of score here - check the +# code for details. The (potentially transformed) entries are then repacked and +# returned, in the same structure as the input. +# +# We do not provide public dev-facing tools to achieve that at this time, but if +# this is something that would be valuable to you, please let us know by opening +# an issue on our `GitHub repo `_. diff --git a/gallery/transforms/plot_custom_tv_tensors.py b/gallery/transforms/plot_custom_tv_tensors.py new file mode 100644 index 0000000000000000000000000000000000000000..bf5ee198837ca34c40ec279293184b2db19efb9d --- /dev/null +++ b/gallery/transforms/plot_custom_tv_tensors.py @@ -0,0 +1,119 @@ +""" +==================================== +How to write your own TVTensor class +==================================== + +.. note:: + Try on `collab `_ + or :ref:`go to the end ` to download the full example code. + +This guide is intended for advanced users and downstream library maintainers. We explain how to +write your own TVTensor class, and how to make it compatible with the built-in +Torchvision v2 transforms. Before continuing, make sure you have read +:ref:`sphx_glr_auto_examples_transforms_plot_tv_tensors.py`. +""" + +# %% +import torch +from torchvision import tv_tensors +from torchvision.transforms import v2 + +# %% +# We will create a very simple class that just inherits from the base +# :class:`~torchvision.tv_tensors.TVTensor` class. It will be enough to cover +# what you need to know to implement your more elaborate uses-cases. If you need +# to create a class that carries meta-data, take a look at how the +# :class:`~torchvision.tv_tensors.BoundingBoxes` class is `implemented +# `_. + + +class MyTVTensor(tv_tensors.TVTensor): + pass + + +my_dp = MyTVTensor([1, 2, 3]) +my_dp + +# %% +# Now that we have defined our custom TVTensor class, we want it to be +# compatible with the built-in torchvision transforms, and the functional API. +# For that, we need to implement a kernel which performs the core of the +# transformation, and then "hook" it to the functional that we want to support +# via :func:`~torchvision.transforms.v2.functional.register_kernel`. +# +# We illustrate this process below: we create a kernel for the "horizontal flip" +# operation of our MyTVTensor class, and register it to the functional API. + +from torchvision.transforms.v2 import functional as F + + +@F.register_kernel(functional="hflip", tv_tensor_cls=MyTVTensor) +def hflip_my_tv_tensor(my_dp, *args, **kwargs): + print("Flipping!") + out = my_dp.flip(-1) + return tv_tensors.wrap(out, like=my_dp) + + +# %% +# To understand why :func:`~torchvision.tv_tensors.wrap` is used, see +# :ref:`tv_tensor_unwrapping_behaviour`. Ignore the ``*args, **kwargs`` for now, +# we will explain it below in :ref:`param_forwarding`. +# +# .. note:: +# +# In our call to ``register_kernel`` above we used a string +# ``functional="hflip"`` to refer to the functional we want to hook into. We +# could also have used the functional *itself*, i.e. +# ``@register_kernel(functional=F.hflip, ...)``. +# +# Now that we have registered our kernel, we can call the functional API on a +# ``MyTVTensor`` instance: + +my_dp = MyTVTensor(torch.rand(3, 256, 256)) +_ = F.hflip(my_dp) + +# %% +# And we can also use the +# :class:`~torchvision.transforms.v2.RandomHorizontalFlip` transform, since it relies on :func:`~torchvision.transforms.v2.functional.hflip` internally: +t = v2.RandomHorizontalFlip(p=1) +_ = t(my_dp) + +# %% +# .. note:: +# +# We cannot register a kernel for a transform class, we can only register a +# kernel for a **functional**. The reason we can't register a transform +# class is because one transform may internally rely on more than one +# functional, so in general we can't register a single kernel for a given +# class. +# +# .. _param_forwarding: +# +# Parameter forwarding, and ensuring future compatibility of your kernels +# ----------------------------------------------------------------------- +# +# The functional API that you're hooking into is public and therefore +# **backward** compatible: we guarantee that the parameters of these functionals +# won't be removed or renamed without a proper deprecation cycle. However, we +# don't guarantee **forward** compatibility, and we may add new parameters in +# the future. +# +# Imagine that in a future version, Torchvision adds a new ``inplace`` parameter +# to its :func:`~torchvision.transforms.v2.functional.hflip` functional. If you +# already defined and registered your own kernel as + +def hflip_my_tv_tensor(my_dp): # noqa + print("Flipping!") + out = my_dp.flip(-1) + return tv_tensors.wrap(out, like=my_dp) + + +# %% +# then calling ``F.hflip(my_dp)`` will **fail**, because ``hflip`` will try to +# pass the new ``inplace`` parameter to your kernel, but your kernel doesn't +# accept it. +# +# For this reason, we recommend to always define your kernels with +# ``*args, **kwargs`` in their signature, as done above. This way, your kernel +# will be able to accept any new parameter that we may add in the future. +# (Technically, adding `**kwargs` only should be enough). diff --git a/gallery/transforms/plot_cutmix_mixup.py b/gallery/transforms/plot_cutmix_mixup.py new file mode 100644 index 0000000000000000000000000000000000000000..d26b027b121ad849b6638f3387460aa8d6ec9ed5 --- /dev/null +++ b/gallery/transforms/plot_cutmix_mixup.py @@ -0,0 +1,150 @@ + +""" +=========================== +How to use CutMix and MixUp +=========================== + +.. note:: + Try on `collab `_ + or :ref:`go to the end ` to download the full example code. + +:class:`~torchvision.transforms.v2.CutMix` and +:class:`~torchvision.transforms.v2.MixUp` are popular augmentation strategies +that can improve classification accuracy. + +These transforms are slightly different from the rest of the Torchvision +transforms, because they expect +**batches** of samples as input, not individual images. In this example we'll +explain how to use them: after the ``DataLoader``, or as part of a collation +function. +""" + +# %% +import torch +from torchvision.datasets import FakeData +from torchvision.transforms import v2 + + +NUM_CLASSES = 100 + +# %% +# Pre-processing pipeline +# ----------------------- +# +# We'll use a simple but typical image classification pipeline: + +preproc = v2.Compose([ + v2.PILToTensor(), + v2.RandomResizedCrop(size=(224, 224), antialias=True), + v2.RandomHorizontalFlip(p=0.5), + v2.ToDtype(torch.float32, scale=True), # to float32 in [0, 1] + v2.Normalize(mean=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225)), # typically from ImageNet +]) + +dataset = FakeData(size=1000, num_classes=NUM_CLASSES, transform=preproc) + +img, label = dataset[0] +print(f"{type(img) = }, {img.dtype = }, {img.shape = }, {label = }") + +# %% +# +# One important thing to note is that neither CutMix nor MixUp are part of this +# pre-processing pipeline. We'll add them a bit later once we define the +# DataLoader. Just as a refresher, this is what the DataLoader and training loop +# would look like if we weren't using CutMix or MixUp: + +from torch.utils.data import DataLoader + +dataloader = DataLoader(dataset, batch_size=4, shuffle=True) + +for images, labels in dataloader: + print(f"{images.shape = }, {labels.shape = }") + print(labels.dtype) + # + break +# %% + +# %% +# Where to use MixUp and CutMix +# ----------------------------- +# +# After the DataLoader +# ^^^^^^^^^^^^^^^^^^^^ +# +# Now let's add CutMix and MixUp. The simplest way to do this right after the +# DataLoader: the Dataloader has already batched the images and labels for us, +# and this is exactly what these transforms expect as input: + +dataloader = DataLoader(dataset, batch_size=4, shuffle=True) + +cutmix = v2.CutMix(num_classes=NUM_CLASSES) +mixup = v2.MixUp(num_classes=NUM_CLASSES) +cutmix_or_mixup = v2.RandomChoice([cutmix, mixup]) + +for images, labels in dataloader: + print(f"Before CutMix/MixUp: {images.shape = }, {labels.shape = }") + images, labels = cutmix_or_mixup(images, labels) + print(f"After CutMix/MixUp: {images.shape = }, {labels.shape = }") + + # + break +# %% +# +# Note how the labels were also transformed: we went from a batched label of +# shape (batch_size,) to a tensor of shape (batch_size, num_classes). The +# transformed labels can still be passed as-is to a loss function like +# :func:`torch.nn.functional.cross_entropy`. +# +# As part of the collation function +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +# +# Passing the transforms after the DataLoader is the simplest way to use CutMix +# and MixUp, but one disadvantage is that it does not take advantage of the +# DataLoader multi-processing. For that, we can pass those transforms as part of +# the collation function (refer to the `PyTorch docs +# `_ to learn +# more about collation). + +from torch.utils.data import default_collate + + +def collate_fn(batch): + return cutmix_or_mixup(*default_collate(batch)) + + +dataloader = DataLoader(dataset, batch_size=4, shuffle=True, num_workers=2, collate_fn=collate_fn) + +for images, labels in dataloader: + print(f"{images.shape = }, {labels.shape = }") + # No need to call cutmix_or_mixup, it's already been called as part of the DataLoader! + # + break + +# %% +# Non-standard input format +# ------------------------- +# +# So far we've used a typical sample structure where we pass ``(images, +# labels)`` as inputs. MixUp and CutMix will magically work by default with most +# common sample structures: tuples where the second parameter is a tensor label, +# or dict with a "label[s]" key. Look at the documentation of the +# ``labels_getter`` parameter for more details. +# +# If your samples have a different structure, you can still use CutMix and MixUp +# by passing a callable to the ``labels_getter`` parameter. For example: + +batch = { + "imgs": torch.rand(4, 3, 224, 224), + "target": { + "classes": torch.randint(0, NUM_CLASSES, size=(4,)), + "some_other_key": "this is going to be passed-through" + } +} + + +def labels_getter(batch): + return batch["target"]["classes"] + + +out = v2.CutMix(num_classes=NUM_CLASSES, labels_getter=labels_getter)(batch) +print(f"{out['imgs'].shape = }, {out['target']['classes'].shape = }") diff --git a/gallery/transforms/plot_transforms_e2e.py b/gallery/transforms/plot_transforms_e2e.py new file mode 100644 index 0000000000000000000000000000000000000000..d2481c880a57040ed5b8e9abd6e284b696a3bab1 --- /dev/null +++ b/gallery/transforms/plot_transforms_e2e.py @@ -0,0 +1,181 @@ +""" +=============================================================== +Transforms v2: End-to-end object detection/segmentation example +=============================================================== + +.. note:: + Try on `collab `_ + or :ref:`go to the end ` to download the full example code. + +Object detection and segmentation tasks are natively supported: +``torchvision.transforms.v2`` enables jointly transforming images, videos, +bounding boxes, and masks. + +This example showcases an end-to-end instance segmentation training case using +Torchvision utils from ``torchvision.datasets``, ``torchvision.models`` and +``torchvision.transforms.v2``. Everything covered here can be applied similarly +to object detection or semantic segmentation tasks. +""" + +# %% +import pathlib + +import torch +import torch.utils.data + +from torchvision import models, datasets, tv_tensors +from torchvision.transforms import v2 + +torch.manual_seed(0) + +# This loads fake data for illustration purposes of this example. In practice, you'll have +# to replace this with the proper data. +# If you're trying to run that on collab, you can download the assets and the +# helpers from https://github.com/pytorch/vision/tree/main/gallery/ +ROOT = pathlib.Path("../assets") / "coco" +IMAGES_PATH = str(ROOT / "images") +ANNOTATIONS_PATH = str(ROOT / "instances.json") +from helpers import plot + + +# %% +# Dataset preparation +# ------------------- +# +# We start off by loading the :class:`~torchvision.datasets.CocoDetection` dataset to have a look at what it currently +# returns. + +dataset = datasets.CocoDetection(IMAGES_PATH, ANNOTATIONS_PATH) + +sample = dataset[0] +img, target = sample +print(f"{type(img) = }\n{type(target) = }\n{type(target[0]) = }\n{target[0].keys() = }") + + +# %% +# Torchvision datasets preserve the data structure and types as it was intended +# by the datasets authors. So by default, the output structure may not always be +# compatible with the models or the transforms. +# +# To overcome that, we can use the +# :func:`~torchvision.datasets.wrap_dataset_for_transforms_v2` function. For +# :class:`~torchvision.datasets.CocoDetection`, this changes the target +# structure to a single dictionary of lists: + +dataset = datasets.wrap_dataset_for_transforms_v2(dataset, target_keys=("boxes", "labels", "masks")) + +sample = dataset[0] +img, target = sample +print(f"{type(img) = }\n{type(target) = }\n{target.keys() = }") +print(f"{type(target['boxes']) = }\n{type(target['labels']) = }\n{type(target['masks']) = }") + +# %% +# We used the ``target_keys`` parameter to specify the kind of output we're +# interested in. Our dataset now returns a target which is dict where the values +# are :ref:`TVTensors ` (all are :class:`torch.Tensor` +# subclasses). We're dropped all unncessary keys from the previous output, but +# if you need any of the original keys e.g. "image_id", you can still ask for +# it. +# +# .. note:: +# +# If you just want to do detection, you don't need and shouldn't pass +# "masks" in ``target_keys``: if masks are present in the sample, they will +# be transformed, slowing down your transformations unnecessarily. +# +# As baseline, let's have a look at a sample without transformations: + +plot([dataset[0], dataset[1]]) + + +# %% +# Transforms +# ---------- +# +# Let's now define our pre-processing transforms. All the transforms know how +# to handle images, bounding boxes and masks when relevant. +# +# Transforms are typically passed as the ``transforms`` parameter of the +# dataset so that they can leverage multi-processing from the +# :class:`torch.utils.data.DataLoader`. + +transforms = v2.Compose( + [ + v2.ToImage(), + v2.RandomPhotometricDistort(p=1), + v2.RandomZoomOut(fill={tv_tensors.Image: (123, 117, 104), "others": 0}), + v2.RandomIoUCrop(), + v2.RandomHorizontalFlip(p=1), + v2.SanitizeBoundingBoxes(), + v2.ToDtype(torch.float32, scale=True), + ] +) + +dataset = datasets.CocoDetection(IMAGES_PATH, ANNOTATIONS_PATH, transforms=transforms) +dataset = datasets.wrap_dataset_for_transforms_v2(dataset, target_keys=["boxes", "labels", "masks"]) + +# %% +# A few things are worth noting here: +# +# - We're converting the PIL image into a +# :class:`~torchvision.transforms.v2.Image` object. This isn't strictly +# necessary, but relying on Tensors (here: a Tensor subclass) will +# :ref:`generally be faster `. +# - We are calling :class:`~torchvision.transforms.v2.SanitizeBoundingBoxes` to +# make sure we remove degenerate bounding boxes, as well as their +# corresponding labels and masks. +# :class:`~torchvision.transforms.v2.SanitizeBoundingBoxes` should be placed +# at least once at the end of a detection pipeline; it is particularly +# critical if :class:`~torchvision.transforms.v2.RandomIoUCrop` was used. +# +# Let's look how the sample looks like with our augmentation pipeline in place: + +# sphinx_gallery_thumbnail_number = 2 +plot([dataset[0], dataset[1]]) + + +# %% +# We can see that the color of the images were distorted, zoomed in or out, and flipped. +# The bounding boxes and the masks were transformed accordingly. And without any further ado, we can start training. +# +# Data loading and training loop +# ------------------------------ +# +# Below we're using Mask-RCNN which is an instance segmentation model, but +# everything we've covered in this tutorial also applies to object detection and +# semantic segmentation tasks. + +data_loader = torch.utils.data.DataLoader( + dataset, + batch_size=2, + # We need a custom collation function here, since the object detection + # models expect a sequence of images and target dictionaries. The default + # collation function tries to torch.stack() the individual elements, + # which fails in general for object detection, because the number of bounding + # boxes varies between the images of the same batch. + collate_fn=lambda batch: tuple(zip(*batch)), +) + +model = models.get_model("maskrcnn_resnet50_fpn_v2", weights=None, weights_backbone=None).train() + +for imgs, targets in data_loader: + loss_dict = model(imgs, targets) + # Put your training logic here + + print(f"{[img.shape for img in imgs] = }") + print(f"{[type(target) for target in targets] = }") + for name, loss_val in loss_dict.items(): + print(f"{name:<20}{loss_val:.3f}") + +# %% +# Training References +# ------------------- +# +# From there, you can check out the `torchvision references +# `_ where you'll find +# the actual training scripts we use to train our models. +# +# **Disclaimer** The code in our references is more complex than what you'll +# need for your own use-cases: this is because we're supporting different +# backends (PIL, tensors, TVTensors) and different transforms namespaces (v1 and +# v2). So don't be afraid to simplify and only keep what you need. diff --git a/gallery/transforms/plot_transforms_getting_started.py b/gallery/transforms/plot_transforms_getting_started.py new file mode 100644 index 0000000000000000000000000000000000000000..c61d1cc1be0681a708d6bc08a8ac3369c4c54ddc --- /dev/null +++ b/gallery/transforms/plot_transforms_getting_started.py @@ -0,0 +1,266 @@ +""" +================================== +Getting started with transforms v2 +================================== + +.. note:: + Try on `collab `_ + or :ref:`go to the end ` to download the full example code. + +This example illustrates all of what you need to know to get started with the +new :mod:`torchvision.transforms.v2` API. We'll cover simple tasks like +image classification, and more advanced ones like object detection / +segmentation. +""" + +# %% +# First, a bit of setup +from pathlib import Path +import torch +import matplotlib.pyplot as plt +plt.rcParams["savefig.bbox"] = 'tight' + +from torchvision.transforms import v2 +from torchvision.io import read_image + +torch.manual_seed(1) + +# If you're trying to run that on collab, you can download the assets and the +# helpers from https://github.com/pytorch/vision/tree/main/gallery/ +from helpers import plot +img = read_image(str(Path('../assets') / 'astronaut.jpg')) +print(f"{type(img) = }, {img.dtype = }, {img.shape = }") + +# %% +# The basics +# ---------- +# +# The Torchvision transforms behave like a regular :class:`torch.nn.Module` (in +# fact, most of them are): instantiate a transform, pass an input, get a +# transformed output: + +transform = v2.RandomCrop(size=(224, 224)) +out = transform(img) + +plot([img, out]) + +# %% +# I just want to do image classification +# -------------------------------------- +# +# If you just care about image classification, things are very simple. A basic +# classification pipeline may look like this: + +transforms = v2.Compose([ + v2.RandomResizedCrop(size=(224, 224), antialias=True), + v2.RandomHorizontalFlip(p=0.5), + v2.ToDtype(torch.float32, scale=True), + v2.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]), +]) +out = transforms(img) + +plot([img, out]) + +# %% +# Such transformation pipeline is typically passed as the ``transform`` argument +# to the :ref:`Datasets `, e.g. ``ImageNet(..., +# transform=transforms)``. +# +# That's pretty much all there is. From there, read through our :ref:`main docs +# ` to learn more about recommended practices and conventions, or +# explore more :ref:`examples ` e.g. how to use augmentation +# transforms like :ref:`CutMix and MixUp +# `. +# +# .. note:: +# +# If you're already relying on the ``torchvision.transforms`` v1 API, +# we recommend to :ref:`switch to the new v2 transforms`. It's +# very easy: the v2 transforms are fully compatible with the v1 API, so you +# only need to change the import! +# +# Detection, Segmentation, Videos +# ------------------------------- +# +# The new Torchvision transforms in the ``torchvision.transforms.v2`` namespace +# support tasks beyond image classification: they can also transform bounding +# boxes, segmentation / detection masks, or videos. +# +# Let's briefly look at a detection example with bounding boxes. + +from torchvision import tv_tensors # we'll describe this a bit later, bare with us + +boxes = tv_tensors.BoundingBoxes( + [ + [15, 10, 370, 510], + [275, 340, 510, 510], + [130, 345, 210, 425] + ], + format="XYXY", canvas_size=img.shape[-2:]) + +transforms = v2.Compose([ + v2.RandomResizedCrop(size=(224, 224), antialias=True), + v2.RandomPhotometricDistort(p=1), + v2.RandomHorizontalFlip(p=1), +]) +out_img, out_boxes = transforms(img, boxes) +print(type(boxes), type(out_boxes)) + +plot([(img, boxes), (out_img, out_boxes)]) + +# %% +# +# The example above focuses on object detection. But if we had masks +# (:class:`torchvision.tv_tensors.Mask`) for object segmentation or semantic +# segmentation, or videos (:class:`torchvision.tv_tensors.Video`), we could have +# passed them to the transforms in exactly the same way. +# +# By now you likely have a few questions: what are these TVTensors, how do we +# use them, and what is the expected input/output of those transforms? We'll +# answer these in the next sections. + +# %% +# +# .. _what_are_tv_tensors: +# +# What are TVTensors? +# -------------------- +# +# TVTensors are :class:`torch.Tensor` subclasses. The available TVTensors are +# :class:`~torchvision.tv_tensors.Image`, +# :class:`~torchvision.tv_tensors.BoundingBoxes`, +# :class:`~torchvision.tv_tensors.Mask`, and +# :class:`~torchvision.tv_tensors.Video`. +# +# TVTensors look and feel just like regular tensors - they **are** tensors. +# Everything that is supported on a plain :class:`torch.Tensor` like ``.sum()`` +# or any ``torch.*`` operator will also work on a TVTensor: + +img_dp = tv_tensors.Image(torch.randint(0, 256, (3, 256, 256), dtype=torch.uint8)) + +print(f"{isinstance(img_dp, torch.Tensor) = }") +print(f"{img_dp.dtype = }, {img_dp.shape = }, {img_dp.sum() = }") + +# %% +# These TVTensor classes are at the core of the transforms: in order to +# transform a given input, the transforms first look at the **class** of the +# object, and dispatch to the appropriate implementation accordingly. +# +# You don't need to know much more about TVTensors at this point, but advanced +# users who want to learn more can refer to +# :ref:`sphx_glr_auto_examples_transforms_plot_tv_tensors.py`. +# +# What do I pass as input? +# ------------------------ +# +# Above, we've seen two examples: one where we passed a single image as input +# i.e. ``out = transforms(img)``, and one where we passed both an image and +# bounding boxes, i.e. ``out_img, out_boxes = transforms(img, boxes)``. +# +# In fact, transforms support **arbitrary input structures**. The input can be a +# single image, a tuple, an arbitrarily nested dictionary... pretty much +# anything. The same structure will be returned as output. Below, we use the +# same detection transforms, but pass a tuple (image, target_dict) as input and +# we're getting the same structure as output: + +target = { + "boxes": boxes, + "labels": torch.arange(boxes.shape[0]), + "this_is_ignored": ("arbitrary", {"structure": "!"}) +} + +# Re-using the transforms and definitions from above. +out_img, out_target = transforms(img, target) + +# sphinx_gallery_thumbnail_number = 4 +plot([(img, target["boxes"]), (out_img, out_target["boxes"])]) +print(f"{out_target['this_is_ignored']}") + +# %% +# We passed a tuple so we get a tuple back, and the second element is the +# tranformed target dict. Transforms don't really care about the structure of +# the input; as mentioned above, they only care about the **type** of the +# objects and transforms them accordingly. +# +# *Foreign* objects like strings or ints are simply passed-through. This can be +# useful e.g. if you want to associate a path with every single sample when +# debugging! +# +# .. _passthrough_heuristic: +# +# .. note:: +# +# **Disclaimer** This note is slightly advanced and can be safely skipped on +# a first read. +# +# Pure :class:`torch.Tensor` objects are, in general, treated as images (or +# as videos for video-specific transforms). Indeed, you may have noticed +# that in the code above we haven't used the +# :class:`~torchvision.tv_tensors.Image` class at all, and yet our images +# got transformed properly. Transforms follow the following logic to +# determine whether a pure Tensor should be treated as an image (or video), +# or just ignored: +# +# * If there is an :class:`~torchvision.tv_tensors.Image`, +# :class:`~torchvision.tv_tensors.Video`, +# or :class:`PIL.Image.Image` instance in the input, all other pure +# tensors are passed-through. +# * If there is no :class:`~torchvision.tv_tensors.Image` or +# :class:`~torchvision.tv_tensors.Video` instance, only the first pure +# :class:`torch.Tensor` will be transformed as image or video, while all +# others will be passed-through. Here "first" means "first in a depth-wise +# traversal". +# +# This is what happened in the detection example above: the first pure +# tensor was the image so it got transformed properly, and all other pure +# tensor instances like the ``labels`` were passed-through (although labels +# can still be transformed by some transforms like +# :class:`~torchvision.transforms.v2.SanitizeBoundingBoxes`!). +# +# .. _transforms_datasets_intercompatibility: +# +# Transforms and Datasets intercompatibility +# ------------------------------------------ +# +# Roughly speaking, the output of the datasets must correspond to the input of +# the transforms. How to do that depends on whether you're using the torchvision +# :ref:`built-in datatsets `, or your own custom datasets. +# +# Using built-in datasets +# ^^^^^^^^^^^^^^^^^^^^^^^ +# +# If you're just doing image classification, you don't need to do anything. Just +# use ``transform`` argument of the dataset e.g. ``ImageNet(..., +# transform=transforms)`` and you're good to go. +# +# Torchvision also supports datasets for object detection or segmentation like +# :class:`torchvision.datasets.CocoDetection`. Those datasets predate +# the existence of the :mod:`torchvision.transforms.v2` module and of the +# TVTensors, so they don't return TVTensors out of the box. +# +# An easy way to force those datasets to return TVTensors and to make them +# compatible with v2 transforms is to use the +# :func:`torchvision.datasets.wrap_dataset_for_transforms_v2` function: +# +# .. code-block:: python +# +# from torchvision.datasets import CocoDetection, wrap_dataset_for_transforms_v2 +# +# dataset = CocoDetection(..., transforms=my_transforms) +# dataset = wrap_dataset_for_transforms_v2(dataset) +# # Now the dataset returns TVTensors! +# +# Using your own datasets +# ^^^^^^^^^^^^^^^^^^^^^^^ +# +# If you have a custom dataset, then you'll need to convert your objects into +# the appropriate TVTensor classes. Creating TVTensor instances is very easy, +# refer to :ref:`tv_tensor_creation` for more details. +# +# There are two main places where you can implement that conversion logic: +# +# - At the end of the datasets's ``__getitem__`` method, before returning the +# sample (or by sub-classing the dataset). +# - As the very first step of your transforms pipeline +# +# Either way, the logic will depend on your specific dataset. diff --git a/gallery/transforms/plot_transforms_illustrations.py b/gallery/transforms/plot_transforms_illustrations.py new file mode 100644 index 0000000000000000000000000000000000000000..2145a74d5e21843b1fe8b28f9ef81391698af398 --- /dev/null +++ b/gallery/transforms/plot_transforms_illustrations.py @@ -0,0 +1,331 @@ +""" +========================== +Illustration of transforms +========================== + +.. note:: + Try on `collab `_ + or :ref:`go to the end ` to download the full example code. + +This example illustrates some of the various transforms available in :ref:`the +torchvision.transforms.v2 module `. +""" +# %% + +# sphinx_gallery_thumbnail_path = "../../gallery/assets/transforms_thumbnail.png" + +from PIL import Image +from pathlib import Path +import matplotlib.pyplot as plt + +import torch +from torchvision.transforms import v2 + +plt.rcParams["savefig.bbox"] = 'tight' + +# if you change the seed, make sure that the randomly-applied transforms +# properly show that the image can be both transformed and *not* transformed! +torch.manual_seed(0) + +# If you're trying to run that on collab, you can download the assets and the +# helpers from https://github.com/pytorch/vision/tree/main/gallery/ +from helpers import plot +orig_img = Image.open(Path('../assets') / 'astronaut.jpg') + +# %% +# Geometric Transforms +# -------------------- +# Geometric image transformation refers to the process of altering the geometric properties of an image, +# such as its shape, size, orientation, or position. +# It involves applying mathematical operations to the image pixels or coordinates to achieve the desired transformation. +# +# Pad +# ~~~ +# The :class:`~torchvision.transforms.Pad` transform +# (see also :func:`~torchvision.transforms.functional.pad`) +# pads all image borders with some pixel values. +padded_imgs = [v2.Pad(padding=padding)(orig_img) for padding in (3, 10, 30, 50)] +plot([orig_img] + padded_imgs) + +# %% +# Resize +# ~~~~~~ +# The :class:`~torchvision.transforms.Resize` transform +# (see also :func:`~torchvision.transforms.functional.resize`) +# resizes an image. +resized_imgs = [v2.Resize(size=size)(orig_img) for size in (30, 50, 100, orig_img.size)] +plot([orig_img] + resized_imgs) + +# %% +# CenterCrop +# ~~~~~~~~~~ +# The :class:`~torchvision.transforms.CenterCrop` transform +# (see also :func:`~torchvision.transforms.functional.center_crop`) +# crops the given image at the center. +center_crops = [v2.CenterCrop(size=size)(orig_img) for size in (30, 50, 100, orig_img.size)] +plot([orig_img] + center_crops) + +# %% +# FiveCrop +# ~~~~~~~~ +# The :class:`~torchvision.transforms.FiveCrop` transform +# (see also :func:`~torchvision.transforms.functional.five_crop`) +# crops the given image into four corners and the central crop. +(top_left, top_right, bottom_left, bottom_right, center) = v2.FiveCrop(size=(100, 100))(orig_img) +plot([orig_img] + [top_left, top_right, bottom_left, bottom_right, center]) + +# %% +# RandomPerspective +# ~~~~~~~~~~~~~~~~~ +# The :class:`~torchvision.transforms.RandomPerspective` transform +# (see also :func:`~torchvision.transforms.functional.perspective`) +# performs random perspective transform on an image. +perspective_transformer = v2.RandomPerspective(distortion_scale=0.6, p=1.0) +perspective_imgs = [perspective_transformer(orig_img) for _ in range(4)] +plot([orig_img] + perspective_imgs) + +# %% +# RandomRotation +# ~~~~~~~~~~~~~~ +# The :class:`~torchvision.transforms.RandomRotation` transform +# (see also :func:`~torchvision.transforms.functional.rotate`) +# rotates an image with random angle. +rotater = v2.RandomRotation(degrees=(0, 180)) +rotated_imgs = [rotater(orig_img) for _ in range(4)] +plot([orig_img] + rotated_imgs) + +# %% +# RandomAffine +# ~~~~~~~~~~~~ +# The :class:`~torchvision.transforms.RandomAffine` transform +# (see also :func:`~torchvision.transforms.functional.affine`) +# performs random affine transform on an image. +affine_transfomer = v2.RandomAffine(degrees=(30, 70), translate=(0.1, 0.3), scale=(0.5, 0.75)) +affine_imgs = [affine_transfomer(orig_img) for _ in range(4)] +plot([orig_img] + affine_imgs) + +# %% +# ElasticTransform +# ~~~~~~~~~~~~~~~~ +# The :class:`~torchvision.transforms.ElasticTransform` transform +# (see also :func:`~torchvision.transforms.functional.elastic_transform`) +# Randomly transforms the morphology of objects in images and produces a +# see-through-water-like effect. +elastic_transformer = v2.ElasticTransform(alpha=250.0) +transformed_imgs = [elastic_transformer(orig_img) for _ in range(2)] +plot([orig_img] + transformed_imgs) + +# %% +# RandomCrop +# ~~~~~~~~~~ +# The :class:`~torchvision.transforms.RandomCrop` transform +# (see also :func:`~torchvision.transforms.functional.crop`) +# crops an image at a random location. +cropper = v2.RandomCrop(size=(128, 128)) +crops = [cropper(orig_img) for _ in range(4)] +plot([orig_img] + crops) + +# %% +# RandomResizedCrop +# ~~~~~~~~~~~~~~~~~ +# The :class:`~torchvision.transforms.RandomResizedCrop` transform +# (see also :func:`~torchvision.transforms.functional.resized_crop`) +# crops an image at a random location, and then resizes the crop to a given +# size. +resize_cropper = v2.RandomResizedCrop(size=(32, 32)) +resized_crops = [resize_cropper(orig_img) for _ in range(4)] +plot([orig_img] + resized_crops) + +# %% +# Photometric Transforms +# ---------------------- +# Photometric image transformation refers to the process of modifying the photometric properties of an image, +# such as its brightness, contrast, color, or tone. +# These transformations are applied to change the visual appearance of an image +# while preserving its geometric structure. +# +# Except :class:`~torchvision.transforms.Grayscale`, the following transforms are random, +# which means that the same transform +# instance will produce different result each time it transforms a given image. +# +# Grayscale +# ~~~~~~~~~ +# The :class:`~torchvision.transforms.Grayscale` transform +# (see also :func:`~torchvision.transforms.functional.to_grayscale`) +# converts an image to grayscale +gray_img = v2.Grayscale()(orig_img) +plot([orig_img, gray_img], cmap='gray') + +# %% +# ColorJitter +# ~~~~~~~~~~~ +# The :class:`~torchvision.transforms.ColorJitter` transform +# randomly changes the brightness, contrast, saturation, hue, and other properties of an image. +jitter = v2.ColorJitter(brightness=.5, hue=.3) +jittered_imgs = [jitter(orig_img) for _ in range(4)] +plot([orig_img] + jittered_imgs) + +# %% +# GaussianBlur +# ~~~~~~~~~~~~ +# The :class:`~torchvision.transforms.GaussianBlur` transform +# (see also :func:`~torchvision.transforms.functional.gaussian_blur`) +# performs gaussian blur transform on an image. +blurrer = v2.GaussianBlur(kernel_size=(5, 9), sigma=(0.1, 5.)) +blurred_imgs = [blurrer(orig_img) for _ in range(4)] +plot([orig_img] + blurred_imgs) + +# %% +# RandomInvert +# ~~~~~~~~~~~~ +# The :class:`~torchvision.transforms.RandomInvert` transform +# (see also :func:`~torchvision.transforms.functional.invert`) +# randomly inverts the colors of the given image. +inverter = v2.RandomInvert() +invertered_imgs = [inverter(orig_img) for _ in range(4)] +plot([orig_img] + invertered_imgs) + +# %% +# RandomPosterize +# ~~~~~~~~~~~~~~~ +# The :class:`~torchvision.transforms.RandomPosterize` transform +# (see also :func:`~torchvision.transforms.functional.posterize`) +# randomly posterizes the image by reducing the number of bits +# of each color channel. +posterizer = v2.RandomPosterize(bits=2) +posterized_imgs = [posterizer(orig_img) for _ in range(4)] +plot([orig_img] + posterized_imgs) + +# %% +# RandomSolarize +# ~~~~~~~~~~~~~~ +# The :class:`~torchvision.transforms.RandomSolarize` transform +# (see also :func:`~torchvision.transforms.functional.solarize`) +# randomly solarizes the image by inverting all pixel values above +# the threshold. +solarizer = v2.RandomSolarize(threshold=192.0) +solarized_imgs = [solarizer(orig_img) for _ in range(4)] +plot([orig_img] + solarized_imgs) + +# %% +# RandomAdjustSharpness +# ~~~~~~~~~~~~~~~~~~~~~ +# The :class:`~torchvision.transforms.RandomAdjustSharpness` transform +# (see also :func:`~torchvision.transforms.functional.adjust_sharpness`) +# randomly adjusts the sharpness of the given image. +sharpness_adjuster = v2.RandomAdjustSharpness(sharpness_factor=2) +sharpened_imgs = [sharpness_adjuster(orig_img) for _ in range(4)] +plot([orig_img] + sharpened_imgs) + +# %% +# RandomAutocontrast +# ~~~~~~~~~~~~~~~~~~ +# The :class:`~torchvision.transforms.RandomAutocontrast` transform +# (see also :func:`~torchvision.transforms.functional.autocontrast`) +# randomly applies autocontrast to the given image. +autocontraster = v2.RandomAutocontrast() +autocontrasted_imgs = [autocontraster(orig_img) for _ in range(4)] +plot([orig_img] + autocontrasted_imgs) + +# %% +# RandomEqualize +# ~~~~~~~~~~~~~~ +# The :class:`~torchvision.transforms.RandomEqualize` transform +# (see also :func:`~torchvision.transforms.functional.equalize`) +# randomly equalizes the histogram of the given image. +equalizer = v2.RandomEqualize() +equalized_imgs = [equalizer(orig_img) for _ in range(4)] +plot([orig_img] + equalized_imgs) + +# %% +# JPEG +# ~~~~~~~~~~~~~~ +# The :class:`~torchvision.transforms.v2.JPEG` transform +# (see also :func:`~torchvision.transforms.v2.functional.jpeg`) +# applies JPEG compression to the given image with random +# degree of compression. +jpeg = v2.JPEG((5, 50)) +jpeg_imgs = [jpeg(orig_img) for _ in range(4)] +plot([orig_img] + jpeg_imgs) + +# %% +# Augmentation Transforms +# ----------------------- +# The following transforms are combinations of multiple transforms, +# either geometric or photometric, or both. +# +# AutoAugment +# ~~~~~~~~~~~ +# The :class:`~torchvision.transforms.AutoAugment` transform +# automatically augments data based on a given auto-augmentation policy. +# See :class:`~torchvision.transforms.AutoAugmentPolicy` for the available policies. +policies = [v2.AutoAugmentPolicy.CIFAR10, v2.AutoAugmentPolicy.IMAGENET, v2.AutoAugmentPolicy.SVHN] +augmenters = [v2.AutoAugment(policy) for policy in policies] +imgs = [ + [augmenter(orig_img) for _ in range(4)] + for augmenter in augmenters +] +row_title = [str(policy).split('.')[-1] for policy in policies] +plot([[orig_img] + row for row in imgs], row_title=row_title) + +# %% +# RandAugment +# ~~~~~~~~~~~ +# The :class:`~torchvision.transforms.RandAugment` is an alternate version of AutoAugment. +augmenter = v2.RandAugment() +imgs = [augmenter(orig_img) for _ in range(4)] +plot([orig_img] + imgs) + +# %% +# TrivialAugmentWide +# ~~~~~~~~~~~~~~~~~~ +# The :class:`~torchvision.transforms.TrivialAugmentWide` is an alternate implementation of AutoAugment. +# However, instead of transforming an image multiple times, it transforms an image only once +# using a random transform from a given list with a random strength number. +augmenter = v2.TrivialAugmentWide() +imgs = [augmenter(orig_img) for _ in range(4)] +plot([orig_img] + imgs) + +# %% +# AugMix +# ~~~~~~ +# The :class:`~torchvision.transforms.AugMix` transform interpolates between augmented versions of an image. +augmenter = v2.AugMix() +imgs = [augmenter(orig_img) for _ in range(4)] +plot([orig_img] + imgs) + +# %% +# Randomly-applied Transforms +# --------------------------- +# +# The following transforms are randomly-applied given a probability ``p``. That is, given ``p = 0.5``, +# there is a 50% chance to return the original image, and a 50% chance to return the transformed image, +# even when called with the same transform instance! +# +# RandomHorizontalFlip +# ~~~~~~~~~~~~~~~~~~~~ +# The :class:`~torchvision.transforms.RandomHorizontalFlip` transform +# (see also :func:`~torchvision.transforms.functional.hflip`) +# performs horizontal flip of an image, with a given probability. +hflipper = v2.RandomHorizontalFlip(p=0.5) +transformed_imgs = [hflipper(orig_img) for _ in range(4)] +plot([orig_img] + transformed_imgs) + +# %% +# RandomVerticalFlip +# ~~~~~~~~~~~~~~~~~~ +# The :class:`~torchvision.transforms.RandomVerticalFlip` transform +# (see also :func:`~torchvision.transforms.functional.vflip`) +# performs vertical flip of an image, with a given probability. +vflipper = v2.RandomVerticalFlip(p=0.5) +transformed_imgs = [vflipper(orig_img) for _ in range(4)] +plot([orig_img] + transformed_imgs) + +# %% +# RandomApply +# ~~~~~~~~~~~ +# The :class:`~torchvision.transforms.RandomApply` transform +# randomly applies a list of transforms, with a given probability. +applier = v2.RandomApply(transforms=[v2.RandomCrop(size=(64, 64))], p=0.5) +transformed_imgs = [applier(orig_img) for _ in range(4)] +plot([orig_img] + transformed_imgs) diff --git a/gallery/transforms/plot_tv_tensors.py b/gallery/transforms/plot_tv_tensors.py new file mode 100644 index 0000000000000000000000000000000000000000..0cdbe9d083142ead856afe5387da0d4b1dd1ef0a --- /dev/null +++ b/gallery/transforms/plot_tv_tensors.py @@ -0,0 +1,224 @@ +""" +============= +TVTensors FAQ +============= + +.. note:: + Try on `collab `_ + or :ref:`go to the end ` to download the full example code. + + +TVTensors are Tensor subclasses introduced together with +``torchvision.transforms.v2``. This example showcases what these TVTensors are +and how they behave. + +.. warning:: + + **Intended Audience** Unless you're writing your own transforms or your own TVTensors, you + probably do not need to read this guide. This is a fairly low-level topic + that most users will not need to worry about: you do not need to understand + the internals of TVTensors to efficiently rely on + ``torchvision.transforms.v2``. It may however be useful for advanced users + trying to implement their own datasets, transforms, or work directly with + the TVTensors. +""" + +# %% +import PIL.Image + +import torch +from torchvision import tv_tensors + + +# %% +# What are TVTensors? +# ------------------- +# +# TVTensors are zero-copy tensor subclasses: + +tensor = torch.rand(3, 256, 256) +image = tv_tensors.Image(tensor) + +assert isinstance(image, torch.Tensor) +assert image.data_ptr() == tensor.data_ptr() + +# %% +# Under the hood, they are needed in :mod:`torchvision.transforms.v2` to correctly dispatch to the appropriate function +# for the input data. +# +# :mod:`torchvision.tv_tensors` supports four types of TVTensors: +# +# * :class:`~torchvision.tv_tensors.Image` +# * :class:`~torchvision.tv_tensors.Video` +# * :class:`~torchvision.tv_tensors.BoundingBoxes` +# * :class:`~torchvision.tv_tensors.Mask` +# +# What can I do with a TVTensor? +# ------------------------------ +# +# TVTensors look and feel just like regular tensors - they **are** tensors. +# Everything that is supported on a plain :class:`torch.Tensor` like ``.sum()`` or +# any ``torch.*`` operator will also work on TVTensors. See +# :ref:`tv_tensor_unwrapping_behaviour` for a few gotchas. + +# %% +# .. _tv_tensor_creation: +# +# How do I construct a TVTensor? +# ------------------------------ +# +# Using the constructor +# ^^^^^^^^^^^^^^^^^^^^^ +# +# Each TVTensor class takes any tensor-like data that can be turned into a :class:`~torch.Tensor` + +image = tv_tensors.Image([[[[0, 1], [1, 0]]]]) +print(image) + + +# %% +# Similar to other PyTorch creations ops, the constructor also takes the ``dtype``, ``device``, and ``requires_grad`` +# parameters. + +float_image = tv_tensors.Image([[[0, 1], [1, 0]]], dtype=torch.float32, requires_grad=True) +print(float_image) + + +# %% +# In addition, :class:`~torchvision.tv_tensors.Image` and :class:`~torchvision.tv_tensors.Mask` can also take a +# :class:`PIL.Image.Image` directly: + +image = tv_tensors.Image(PIL.Image.open("../assets/astronaut.jpg")) +print(image.shape, image.dtype) + +# %% +# Some TVTensors require additional metadata to be passed in ordered to be constructed. For example, +# :class:`~torchvision.tv_tensors.BoundingBoxes` requires the coordinate format as well as the size of the +# corresponding image (``canvas_size``) alongside the actual values. These +# metadata are required to properly transform the bounding boxes. + +bboxes = tv_tensors.BoundingBoxes( + [[17, 16, 344, 495], [0, 10, 0, 10]], + format=tv_tensors.BoundingBoxFormat.XYXY, + canvas_size=image.shape[-2:] +) +print(bboxes) + +# %% +# Using ``tv_tensors.wrap()`` +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^ +# +# You can also use the :func:`~torchvision.tv_tensors.wrap` function to wrap a tensor object +# into a TVTensor. This is useful when you already have an object of the +# desired type, which typically happens when writing transforms: you just want +# to wrap the output like the input. + +new_bboxes = torch.tensor([0, 20, 30, 40]) +new_bboxes = tv_tensors.wrap(new_bboxes, like=bboxes) +assert isinstance(new_bboxes, tv_tensors.BoundingBoxes) +assert new_bboxes.canvas_size == bboxes.canvas_size + +# %% +# The metadata of ``new_bboxes`` is the same as ``bboxes``, but you could pass +# it as a parameter to override it. +# +# .. _tv_tensor_unwrapping_behaviour: +# +# I had a TVTensor but now I have a Tensor. Help! +# ----------------------------------------------- +# +# By default, operations on :class:`~torchvision.tv_tensors.TVTensor` objects +# will return a pure Tensor: + + +assert isinstance(bboxes, tv_tensors.BoundingBoxes) + +# Shift bboxes by 3 pixels in both H and W +new_bboxes = bboxes + 3 + +assert isinstance(new_bboxes, torch.Tensor) +assert not isinstance(new_bboxes, tv_tensors.BoundingBoxes) + +# %% +# .. note:: +# +# This behavior only affects native ``torch`` operations. If you are using +# the built-in ``torchvision`` transforms or functionals, you will always get +# as output the same type that you passed as input (pure ``Tensor`` or +# ``TVTensor``). + +# %% +# But I want a TVTensor back! +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^ +# +# You can re-wrap a pure tensor into a TVTensor by just calling the TVTensor +# constructor, or by using the :func:`~torchvision.tv_tensors.wrap` function +# (see more details above in :ref:`tv_tensor_creation`): + +new_bboxes = bboxes + 3 +new_bboxes = tv_tensors.wrap(new_bboxes, like=bboxes) +assert isinstance(new_bboxes, tv_tensors.BoundingBoxes) + +# %% +# Alternatively, you can use the :func:`~torchvision.tv_tensors.set_return_type` +# as a global config setting for the whole program, or as a context manager +# (read its docs to learn more about caveats): + +with tv_tensors.set_return_type("TVTensor"): + new_bboxes = bboxes + 3 +assert isinstance(new_bboxes, tv_tensors.BoundingBoxes) + +# %% +# Why is this happening? +# ^^^^^^^^^^^^^^^^^^^^^^ +# +# **For performance reasons**. :class:`~torchvision.tv_tensors.TVTensor` +# classes are Tensor subclasses, so any operation involving a +# :class:`~torchvision.tv_tensors.TVTensor` object will go through the +# `__torch_function__ +# `_ +# protocol. This induces a small overhead, which we want to avoid when possible. +# This doesn't matter for built-in ``torchvision`` transforms because we can +# avoid the overhead there, but it could be a problem in your model's +# ``forward``. +# +# **The alternative isn't much better anyway.** For every operation where +# preserving the :class:`~torchvision.tv_tensors.TVTensor` type makes +# sense, there are just as many operations where returning a pure Tensor is +# preferable: for example, is ``img.sum()`` still an :class:`~torchvision.tv_tensors.Image`? +# If we were to preserve :class:`~torchvision.tv_tensors.TVTensor` types all +# the way, even model's logits or the output of the loss function would end up +# being of type :class:`~torchvision.tv_tensors.Image`, and surely that's not +# desirable. +# +# .. note:: +# +# This behaviour is something we're actively seeking feedback on. If you find this surprising or if you +# have any suggestions on how to better support your use-cases, please reach out to us via this issue: +# https://github.com/pytorch/vision/issues/7319 +# +# Exceptions +# ^^^^^^^^^^ +# +# There are a few exceptions to this "unwrapping" rule: +# :meth:`~torch.Tensor.clone`, :meth:`~torch.Tensor.to`, +# :meth:`torch.Tensor.detach`, and :meth:`~torch.Tensor.requires_grad_` retain +# the TVTensor type. +# +# Inplace operations on TVTensors like ``obj.add_()`` will preserve the type of +# ``obj``. However, the **returned** value of inplace operations will be a pure +# tensor: + +image = tv_tensors.Image([[[0, 1], [1, 0]]]) + +new_image = image.add_(1).mul_(2) + +# image got transformed in-place and is still a TVTensor Image, but new_image +# is a Tensor. They share the same underlying data and they're equal, just +# different classes. +assert isinstance(image, tv_tensors.Image) +print(image) + +assert isinstance(new_image, torch.Tensor) and not isinstance(new_image, tv_tensors.Image) +assert (new_image == image).all() +assert new_image.data_ptr() == image.data_ptr() diff --git a/hubconf.py b/hubconf.py index 097759bdd8935db41e0e98d7f91290474569b9eb..637827127cab488eb0cf7d08ff9eb120a1989155 100644 --- a/hubconf.py +++ b/hubconf.py @@ -1,21 +1,85 @@ # Optional list of dependencies required by the package -dependencies = ['torch'] +dependencies = ["torch"] -# classification +from torchvision.models import get_model_weights, get_weight from torchvision.models.alexnet import alexnet -from torchvision.models.densenet import densenet121, densenet169, densenet201, densenet161 -from torchvision.models.inception import inception_v3 -from torchvision.models.resnet import resnet18, resnet34, resnet50, resnet101, resnet152,\ - resnext50_32x4d, resnext101_32x8d, wide_resnet50_2, wide_resnet101_2 -from torchvision.models.squeezenet import squeezenet1_0, squeezenet1_1 -from torchvision.models.vgg import vgg11, vgg13, vgg16, vgg19, vgg11_bn, vgg13_bn, vgg16_bn, vgg19_bn +from torchvision.models.convnext import convnext_base, convnext_large, convnext_small, convnext_tiny +from torchvision.models.densenet import densenet121, densenet161, densenet169, densenet201 +from torchvision.models.efficientnet import ( + efficientnet_b0, + efficientnet_b1, + efficientnet_b2, + efficientnet_b3, + efficientnet_b4, + efficientnet_b5, + efficientnet_b6, + efficientnet_b7, + efficientnet_v2_l, + efficientnet_v2_m, + efficientnet_v2_s, +) from torchvision.models.googlenet import googlenet -from torchvision.models.shufflenetv2 import shufflenet_v2_x0_5, shufflenet_v2_x1_0 +from torchvision.models.inception import inception_v3 +from torchvision.models.maxvit import maxvit_t +from torchvision.models.mnasnet import mnasnet0_5, mnasnet0_75, mnasnet1_0, mnasnet1_3 from torchvision.models.mobilenetv2 import mobilenet_v2 from torchvision.models.mobilenetv3 import mobilenet_v3_large, mobilenet_v3_small -from torchvision.models.mnasnet import mnasnet0_5, mnasnet0_75, mnasnet1_0, \ - mnasnet1_3 - -# segmentation -from torchvision.models.segmentation import fcn_resnet50, fcn_resnet101, \ - deeplabv3_resnet50, deeplabv3_resnet101, deeplabv3_mobilenet_v3_large, lraspp_mobilenet_v3_large +from torchvision.models.optical_flow import raft_large, raft_small +from torchvision.models.regnet import ( + regnet_x_16gf, + regnet_x_1_6gf, + regnet_x_32gf, + regnet_x_3_2gf, + regnet_x_400mf, + regnet_x_800mf, + regnet_x_8gf, + regnet_y_128gf, + regnet_y_16gf, + regnet_y_1_6gf, + regnet_y_32gf, + regnet_y_3_2gf, + regnet_y_400mf, + regnet_y_800mf, + regnet_y_8gf, +) +from torchvision.models.resnet import ( + resnet101, + resnet152, + resnet18, + resnet34, + resnet50, + resnext101_32x8d, + resnext101_64x4d, + resnext50_32x4d, + wide_resnet101_2, + wide_resnet50_2, +) +from torchvision.models.segmentation import ( + deeplabv3_mobilenet_v3_large, + deeplabv3_resnet101, + deeplabv3_resnet50, + fcn_resnet101, + fcn_resnet50, + lraspp_mobilenet_v3_large, +) +from torchvision.models.shufflenetv2 import ( + shufflenet_v2_x0_5, + shufflenet_v2_x1_0, + shufflenet_v2_x1_5, + shufflenet_v2_x2_0, +) +from torchvision.models.squeezenet import squeezenet1_0, squeezenet1_1 +from torchvision.models.swin_transformer import swin_b, swin_s, swin_t, swin_v2_b, swin_v2_s, swin_v2_t +from torchvision.models.vgg import vgg11, vgg11_bn, vgg13, vgg13_bn, vgg16, vgg16_bn, vgg19, vgg19_bn +from torchvision.models.video import ( + mc3_18, + mvit_v1_b, + mvit_v2_s, + r2plus1d_18, + r3d_18, + s3d, + swin3d_b, + swin3d_s, + swin3d_t, +) +from torchvision.models.vision_transformer import vit_b_16, vit_b_32, vit_h_14, vit_l_16, vit_l_32 diff --git a/ios/CMakeLists.txt b/ios/CMakeLists.txt index 2ac46c15018a3b5a72b034168266d08c2cdc6cd9..4201240a42725dc52e05e67859347c65459e7e8e 100644 --- a/ios/CMakeLists.txt +++ b/ios/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.4.1) set(TARGET torchvision_ops) project(${TARGET} CXX) -set(CMAKE_CXX_STANDARD 14) +set(CMAKE_CXX_STANDARD 17) set(LIBTORCH_HEADER_ROOT ${LIBTORCH_HEADER_ROOT}) set(LIBRARY_OUTPUT_PATH ../lib) @@ -11,13 +11,6 @@ file(GLOB VISION_SRCS ../torchvision/csrc/ops/*.h ../torchvision/csrc/ops/*.cpp) -# Remove interpolate_aa sources as they are temporary code -# see https://github.com/pytorch/vision/pull/3761 -# and using TensorIterator unavailable with iOS -list(REMOVE_ITEM VISION_SRCS "${CMAKE_CURRENT_LIST_DIR}/../torchvision/csrc/ops/cpu/interpolate_aa_kernels.cpp") -list(REMOVE_ITEM VISION_SRCS "${CMAKE_CURRENT_LIST_DIR}/../torchvision/csrc/ops/interpolate_aa.cpp") -list(REMOVE_ITEM VISION_SRCS "${CMAKE_CURRENT_LIST_DIR}/../torchvision/csrc/ops/interpolate_aa.h") - add_library(${TARGET} STATIC ${VISION_SRCS} ) diff --git a/ios/LibTorchvision.podspec b/ios/LibTorchvision.podspec new file mode 100644 index 0000000000000000000000000000000000000000..b88fb70ac40fe786a323e2eb40065ac0ad537dcc --- /dev/null +++ b/ios/LibTorchvision.podspec @@ -0,0 +1,24 @@ +pytorch_version = '2.0.0' + +Pod::Spec.new do |s| + s.name = 'LibTorchvision' + s.version = '0.15.1' + s.authors = 'PyTorch Team' + s.license = { :type => 'BSD' } + s.homepage = 'https://github.com/pytorch/vision' + s.source = { :http => "https://ossci-ios.s3.amazonaws.com/libtorchvision_ops_ios_#{s.version}.zip" } + s.summary = '"The C++ library of TorchVision ops for iOS' + s.description = <<-DESC + The C++ library of TorchVision ops for iOS. + This version (#{s.version}) requires the installation of LibTorch #{pytorch_version} or LibTorch-Lite #{pytorch_version}. + DESC + s.ios.deployment_target = '12.0' + s.vendored_libraries = 'install/lib/*.a' + s.user_target_xcconfig = { + 'VALID_ARCHS' => 'x86_64 arm64', + 'OTHER_LDFLAGS' => '$(inherited) -force_load "$(PODS_ROOT)/LibTorchvision/install/lib/libtorchvision_ops.a"', + 'CLANG_CXX_LANGUAGE_STANDARD' => 'c++14', + 'CLANG_CXX_LIBRARY' => 'libc++' + } + s.library = ['c++', 'stdc++'] +end diff --git a/ios/README.md b/ios/README.md new file mode 100644 index 0000000000000000000000000000000000000000..0b50245f1ee819ede8dbdc177c10e06db48e8408 --- /dev/null +++ b/ios/README.md @@ -0,0 +1,3 @@ +## Status + +The iOS demo of TorchVision is currently unmaintained, untested and likely out-of-date. diff --git a/ios/VisionTestApp/VisionTestApp.xcodeproj/project.pbxproj b/ios/VisionTestApp/VisionTestApp.xcodeproj/project.pbxproj index 5e71c77e6f85c92b45e9ba62e3d48aa35b2ce14c..1c25d9d350ef3aacc24fbe56943290c9a03add79 100644 --- a/ios/VisionTestApp/VisionTestApp.xcodeproj/project.pbxproj +++ b/ios/VisionTestApp/VisionTestApp.xcodeproj/project.pbxproj @@ -7,27 +7,10 @@ objects = { /* Begin PBXBuildFile section */ - 0C12EF3D2616383D00B66C86 /* avx.py in Resources */ = {isa = PBXBuildFile; fileRef = 0C12EEF32616383C00B66C86 /* avx.py */; }; - 0C12EF3E2616383D00B66C86 /* __init__.py in Resources */ = {isa = PBXBuildFile; fileRef = 0C12EEF42616383C00B66C86 /* __init__.py */; }; - 0C12EF3F2616383D00B66C86 /* avx2.py in Resources */ = {isa = PBXBuildFile; fileRef = 0C12EEF62616383C00B66C86 /* avx2.py */; }; - 0C12EF402616383D00B66C86 /* THTensor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0C12EF192616383C00B66C86 /* THTensor.cpp */; }; - 0C12EF412616383D00B66C86 /* THTensorMath.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0C12EF1A2616383C00B66C86 /* THTensorMath.cpp */; }; - 0C12EF422616383D00B66C86 /* THStorageCopy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0C12EF1C2616383C00B66C86 /* THStorageCopy.cpp */; }; - 0C12EF432616383D00B66C86 /* THLapack.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0C12EF212616383C00B66C86 /* THLapack.cpp */; }; - 0C12EF442616383D00B66C86 /* THStorage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0C12EF242616383C00B66C86 /* THStorage.cpp */; }; - 0C12EF452616383D00B66C86 /* THBlas.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0C12EF262616383C00B66C86 /* THBlas.cpp */; }; - 0C12EF462616383D00B66C86 /* THTensorLapack.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0C12EF272616383C00B66C86 /* THTensorLapack.cpp */; }; - 0C12EF472616383D00B66C86 /* libtorch_cpu.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 0C12EF332616383C00B66C86 /* libtorch_cpu.a */; }; - 0C12EF482616383D00B66C86 /* libtorch.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 0C12EF342616383C00B66C86 /* libtorch.a */; }; - 0C12EF492616383D00B66C86 /* libcpuinfo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 0C12EF352616383C00B66C86 /* libcpuinfo.a */; }; - 0C12EF4A2616383D00B66C86 /* libXNNPACK.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 0C12EF362616383C00B66C86 /* libXNNPACK.a */; }; - 0C12EF4C2616383D00B66C86 /* libpthreadpool.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 0C12EF382616383C00B66C86 /* libpthreadpool.a */; }; - 0C12EF4D2616383D00B66C86 /* libc10.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 0C12EF392616383C00B66C86 /* libc10.a */; }; - 0C12EF4E2616383D00B66C86 /* libeigen_blas.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 0C12EF3A2616383C00B66C86 /* libeigen_blas.a */; }; - 0C12EF4F2616383D00B66C86 /* libclog.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 0C12EF3B2616383C00B66C86 /* libclog.a */; }; - 0C12EF502616383D00B66C86 /* libpytorch_qnnpack.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 0C12EF3C2616383C00B66C86 /* libpytorch_qnnpack.a */; }; 0C12EF7626163B7600B66C86 /* frcnn_mnetv3.pt in Resources */ = {isa = PBXBuildFile; fileRef = 0C12EF7526163B7600B66C86 /* frcnn_mnetv3.pt */; }; - 0C12EF7A26163C7C00B66C86 /* libtorchvision_ops.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 0C12EF372616383C00B66C86 /* libtorchvision_ops.a */; }; + 0CDCAE46274ED8FA006F9077 /* CoreML.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0CDCAE45274ED8FA006F9077 /* CoreML.framework */; }; + 0CDCAE48274ED902006F9077 /* MetalPerformanceShaders.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0CDCAE47274ED902006F9077 /* MetalPerformanceShaders.framework */; }; + 0CDCAE4A274ED909006F9077 /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0CDCAE49274ED909006F9077 /* Accelerate.framework */; }; 0CEB0AC026151A8800F1F7D5 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 0CEB0ABF26151A8800F1F7D5 /* AppDelegate.m */; }; 0CEB0AC626151A8800F1F7D5 /* ViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 0CEB0AC526151A8800F1F7D5 /* ViewController.mm */; }; 0CEB0AC926151A8800F1F7D5 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 0CEB0AC726151A8800F1F7D5 /* Main.storyboard */; }; @@ -38,1729 +21,10 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ - 0C12E78A2616383A00B66C86 /* attr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = attr.h; sourceTree = ""; }; - 0C12E78B2616383A00B66C86 /* embed.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = embed.h; sourceTree = ""; }; - 0C12E78C2616383A00B66C86 /* numpy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = numpy.h; sourceTree = ""; }; - 0C12E78D2616383A00B66C86 /* pybind11.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pybind11.h; sourceTree = ""; }; - 0C12E78E2616383A00B66C86 /* operators.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = operators.h; sourceTree = ""; }; - 0C12E78F2616383A00B66C86 /* iostream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iostream.h; sourceTree = ""; }; - 0C12E7902616383A00B66C86 /* chrono.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = chrono.h; sourceTree = ""; }; - 0C12E7912616383A00B66C86 /* stl_bind.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stl_bind.h; sourceTree = ""; }; - 0C12E7922616383A00B66C86 /* buffer_info.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = buffer_info.h; sourceTree = ""; }; - 0C12E7932616383A00B66C86 /* options.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = options.h; sourceTree = ""; }; - 0C12E7942616383A00B66C86 /* functional.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = functional.h; sourceTree = ""; }; - 0C12E7952616383A00B66C86 /* stl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stl.h; sourceTree = ""; }; - 0C12E7972616383A00B66C86 /* typeid.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = typeid.h; sourceTree = ""; }; - 0C12E7982616383A00B66C86 /* descr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = descr.h; sourceTree = ""; }; - 0C12E7992616383A00B66C86 /* internals.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = internals.h; sourceTree = ""; }; - 0C12E79A2616383A00B66C86 /* common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = common.h; sourceTree = ""; }; - 0C12E79B2616383A00B66C86 /* class.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = class.h; sourceTree = ""; }; - 0C12E79C2616383A00B66C86 /* init.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = init.h; sourceTree = ""; }; - 0C12E79D2616383A00B66C86 /* common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = common.h; sourceTree = ""; }; - 0C12E79E2616383A00B66C86 /* eval.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = eval.h; sourceTree = ""; }; - 0C12E79F2616383A00B66C86 /* cast.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cast.h; sourceTree = ""; }; - 0C12E7A02616383A00B66C86 /* eigen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = eigen.h; sourceTree = ""; }; - 0C12E7A12616383A00B66C86 /* pytypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pytypes.h; sourceTree = ""; }; - 0C12E7A22616383A00B66C86 /* complex.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = complex.h; sourceTree = ""; }; - 0C12E7A52616383A00B66C86 /* optical_flow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = optical_flow.h; sourceTree = ""; }; - 0C12E7A62616383A00B66C86 /* video_decoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = video_decoder.h; sourceTree = ""; }; - 0C12E7A72616383A00B66C86 /* video_input_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = video_input_op.h; sourceTree = ""; }; - 0C12E7A82616383A00B66C86 /* video_io.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = video_io.h; sourceTree = ""; }; - 0C12E7AB2616383A00B66C86 /* conv_transpose_unpool_base_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = conv_transpose_unpool_base_op.h; sourceTree = ""; }; - 0C12E7AD2616383A00B66C86 /* operator_fallback_ideep.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = operator_fallback_ideep.h; sourceTree = ""; }; - 0C12E7AE2616383A00B66C86 /* conv_pool_base_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = conv_pool_base_op.h; sourceTree = ""; }; - 0C12E7B02616383A00B66C86 /* ideep_context.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ideep_context.h; sourceTree = ""; }; - 0C12E7B12616383A00B66C86 /* ideep_operator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ideep_operator.h; sourceTree = ""; }; - 0C12E7B22616383A00B66C86 /* ideep_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ideep_utils.h; sourceTree = ""; }; - 0C12E7B42616383A00B66C86 /* net_async_task_graph.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = net_async_task_graph.h; sourceTree = ""; }; - 0C12E7B52616383A00B66C86 /* net_simple_refcount.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = net_simple_refcount.h; sourceTree = ""; }; - 0C12E7B62616383A00B66C86 /* tensor_impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tensor_impl.h; sourceTree = ""; }; - 0C12E7B72616383A00B66C86 /* plan_executor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = plan_executor.h; sourceTree = ""; }; - 0C12E7B82616383A00B66C86 /* qtensor_serialization.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = qtensor_serialization.h; sourceTree = ""; }; - 0C12E7B92616383A00B66C86 /* context_gpu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = context_gpu.h; sourceTree = ""; }; - 0C12E7BA2616383A00B66C86 /* observer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = observer.h; sourceTree = ""; }; - 0C12E7BB2616383A00B66C86 /* blob_serializer_base.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blob_serializer_base.h; sourceTree = ""; }; - 0C12E7BC2616383A00B66C86 /* memonger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = memonger.h; sourceTree = ""; }; - 0C12E7BD2616383A00B66C86 /* tensor_int8.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tensor_int8.h; sourceTree = ""; }; - 0C12E7BE2616383A00B66C86 /* static_tracepoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = static_tracepoint.h; sourceTree = ""; }; - 0C12E7BF2616383A00B66C86 /* net.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = net.h; sourceTree = ""; }; - 0C12E7C02616383A00B66C86 /* numa.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = numa.h; sourceTree = ""; }; - 0C12E7C12616383A00B66C86 /* scope_guard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = scope_guard.h; sourceTree = ""; }; - 0C12E7C22616383A00B66C86 /* test_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = test_utils.h; sourceTree = ""; }; - 0C12E7C32616383A00B66C86 /* event.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = event.h; sourceTree = ""; }; - 0C12E7C42616383A00B66C86 /* types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = types.h; sourceTree = ""; }; - 0C12E7C52616383A00B66C86 /* context_base.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = context_base.h; sourceTree = ""; }; - 0C12E7C62616383A00B66C86 /* operator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = operator.h; sourceTree = ""; }; - 0C12E7C72616383A00B66C86 /* db.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = db.h; sourceTree = ""; }; - 0C12E7C82616383A00B66C86 /* blob.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blob.h; sourceTree = ""; }; - 0C12E7C92616383A00B66C86 /* static_tracepoint_elfx86.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = static_tracepoint_elfx86.h; sourceTree = ""; }; - 0C12E7CA2616383A00B66C86 /* net_async_tracing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = net_async_tracing.h; sourceTree = ""; }; - 0C12E7CB2616383A00B66C86 /* flags.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = flags.h; sourceTree = ""; }; - 0C12E7CC2616383A00B66C86 /* net_async_task_future.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = net_async_task_future.h; sourceTree = ""; }; - 0C12E7CD2616383A00B66C86 /* operator_schema.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = operator_schema.h; sourceTree = ""; }; - 0C12E7CE2616383A00B66C86 /* context.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = context.h; sourceTree = ""; }; - 0C12E7CF2616383A00B66C86 /* net_async_base.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = net_async_base.h; sourceTree = ""; }; - 0C12E7D02616383A00B66C86 /* prof_dag_counters.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = prof_dag_counters.h; sourceTree = ""; }; - 0C12E7D12616383A00B66C86 /* logging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = logging.h; sourceTree = ""; }; - 0C12E7D22616383A00B66C86 /* net_async_scheduling.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = net_async_scheduling.h; sourceTree = ""; }; - 0C12E7D32616383A00B66C86 /* graph.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = graph.h; sourceTree = ""; }; - 0C12E7D42616383A00B66C86 /* common_cudnn.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = common_cudnn.h; sourceTree = ""; }; - 0C12E7D52616383A00B66C86 /* net_async_task.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = net_async_task.h; sourceTree = ""; }; - 0C12E7D62616383A00B66C86 /* export_caffe2_op_to_c10.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = export_caffe2_op_to_c10.h; sourceTree = ""; }; - 0C12E7D72616383A00B66C86 /* net_simple.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = net_simple.h; sourceTree = ""; }; - 0C12E7D82616383A00B66C86 /* workspace.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = workspace.h; sourceTree = ""; }; - 0C12E7D92616383A00B66C86 /* timer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = timer.h; sourceTree = ""; }; - 0C12E7DA2616383A00B66C86 /* event_cpu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = event_cpu.h; sourceTree = ""; }; - 0C12E7DB2616383A00B66C86 /* common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = common.h; sourceTree = ""; }; - 0C12E7DC2616383A00B66C86 /* blob_stats.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blob_stats.h; sourceTree = ""; }; - 0C12E7DD2616383A00B66C86 /* allocator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = allocator.h; sourceTree = ""; }; - 0C12E7DE2616383A00B66C86 /* macros.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = macros.h; sourceTree = ""; }; - 0C12E7E02616383A00B66C86 /* miopen_wrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = miopen_wrapper.h; sourceTree = ""; }; - 0C12E7E12616383A00B66C86 /* common_miopen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = common_miopen.h; sourceTree = ""; }; - 0C12E7E22616383A00B66C86 /* storage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = storage.h; sourceTree = ""; }; - 0C12E7E32616383A00B66C86 /* transform.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = transform.h; sourceTree = ""; }; - 0C12E7E42616383A00B66C86 /* common_omp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = common_omp.h; sourceTree = ""; }; - 0C12E7E52616383A00B66C86 /* export_c10_op_to_caffe2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = export_c10_op_to_caffe2.h; sourceTree = ""; }; - 0C12E7EB2616383A00B66C86 /* OpClasses.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpClasses.h; sourceTree = ""; }; - 0C12E7EC2616383A00B66C86 /* OpEnum.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpEnum.h; sourceTree = ""; }; - 0C12E7ED2616383A00B66C86 /* OpNames.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpNames.h; sourceTree = ""; }; - 0C12E7EF2616383A00B66C86 /* Compiler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Compiler.h; sourceTree = ""; }; - 0C12E7F02616383A00B66C86 /* NeuralNet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NeuralNet.h; sourceTree = ""; }; - 0C12E7F12616383A00B66C86 /* ControlFlow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ControlFlow.h; sourceTree = ""; }; - 0C12E7F32616383A00B66C86 /* SubgraphMatcher.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SubgraphMatcher.h; sourceTree = ""; }; - 0C12E7F42616383A00B66C86 /* Match.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Match.h; sourceTree = ""; }; - 0C12E7F62616383A00B66C86 /* Algorithms.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Algorithms.h; sourceTree = ""; }; - 0C12E7F72616383A00B66C86 /* TopoSort.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TopoSort.h; sourceTree = ""; }; - 0C12E7F82616383A00B66C86 /* Graph.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Graph.h; sourceTree = ""; }; - 0C12E7F92616383A00B66C86 /* TarjansImpl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TarjansImpl.h; sourceTree = ""; }; - 0C12E7FA2616383A00B66C86 /* BinaryMatchImpl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BinaryMatchImpl.h; sourceTree = ""; }; - 0C12E7FC2616383A00B66C86 /* Dot.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Dot.h; sourceTree = ""; }; - 0C12E7FE2616383A00B66C86 /* Casting.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Casting.h; sourceTree = ""; }; - 0C12E7FF2616383A00B66C86 /* Common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Common.h; sourceTree = ""; }; - 0C12E8012616383A00B66C86 /* test_util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = test_util.h; sourceTree = ""; }; - 0C12E8022616383A00B66C86 /* module.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = module.h; sourceTree = ""; }; - 0C12E8032616383A00B66C86 /* init.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = init.h; sourceTree = ""; }; - 0C12E8042616383A00B66C86 /* net_dag_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = net_dag_utils.h; sourceTree = ""; }; - 0C12E8052616383A00B66C86 /* stats.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stats.h; sourceTree = ""; }; - 0C12E8062616383A00B66C86 /* tensor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tensor.h; sourceTree = ""; }; - 0C12E8072616383A00B66C86 /* common_gpu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = common_gpu.h; sourceTree = ""; }; - 0C12E8082616383A00B66C86 /* qtensor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = qtensor.h; sourceTree = ""; }; - 0C12E8092616383A00B66C86 /* net_parallel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = net_parallel.h; sourceTree = ""; }; - 0C12E80A2616383A00B66C86 /* operator_gradient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = operator_gradient.h; sourceTree = ""; }; - 0C12E80B2616383A00B66C86 /* cudnn_wrappers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cudnn_wrappers.h; sourceTree = ""; }; - 0C12E80C2616383A00B66C86 /* distributions_stubs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = distributions_stubs.h; sourceTree = ""; }; - 0C12E80D2616383A00B66C86 /* blob_serialization.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blob_serialization.h; sourceTree = ""; }; - 0C12E80F2616383A00B66C86 /* mpi_common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mpi_common.h; sourceTree = ""; }; - 0C12E8102616383A00B66C86 /* mpi_ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mpi_ops.h; sourceTree = ""; }; - 0C12E8122616383A00B66C86 /* caffe2_pb.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = caffe2_pb.h; sourceTree = ""; }; - 0C12E8132616383A00B66C86 /* torch_pb.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = torch_pb.h; sourceTree = ""; }; - 0C12E8172616383A00B66C86 /* top_k.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = top_k.h; sourceTree = ""; }; - 0C12E8182616383A00B66C86 /* channel_stats_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = channel_stats_op.h; sourceTree = ""; }; - 0C12E8192616383A00B66C86 /* gru_unit_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gru_unit_op.h; sourceTree = ""; }; - 0C12E81A2616383A00B66C86 /* half_float_ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = half_float_ops.h; sourceTree = ""; }; - 0C12E81B2616383A00B66C86 /* sqr_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sqr_op.h; sourceTree = ""; }; - 0C12E81C2616383A00B66C86 /* mean_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mean_op.h; sourceTree = ""; }; - 0C12E81D2616383A00B66C86 /* thresholded_relu_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = thresholded_relu_op.h; sourceTree = ""; }; - 0C12E81E2616383A00B66C86 /* ctc_greedy_decoder_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ctc_greedy_decoder_op.h; sourceTree = ""; }; - 0C12E81F2616383A00B66C86 /* conv_op_cache_cudnn.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = conv_op_cache_cudnn.h; sourceTree = ""; }; - 0C12E8202616383A00B66C86 /* utility_ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = utility_ops.h; sourceTree = ""; }; - 0C12E8212616383A00B66C86 /* selu_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = selu_op.h; sourceTree = ""; }; - 0C12E8222616383A00B66C86 /* map_ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = map_ops.h; sourceTree = ""; }; - 0C12E8232616383A00B66C86 /* roi_align_rotated_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = roi_align_rotated_op.h; sourceTree = ""; }; - 0C12E8242616383A00B66C86 /* fused_rowwise_random_quantization_ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fused_rowwise_random_quantization_ops.h; sourceTree = ""; }; - 0C12E8252616383A00B66C86 /* stop_gradient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stop_gradient.h; sourceTree = ""; }; - 0C12E8262616383A00B66C86 /* batch_gather_ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = batch_gather_ops.h; sourceTree = ""; }; - 0C12E8272616383A00B66C86 /* asin_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = asin_op.h; sourceTree = ""; }; - 0C12E8282616383A00B66C86 /* cosh_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cosh_op.h; sourceTree = ""; }; - 0C12E8292616383A00B66C86 /* atan_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = atan_op.h; sourceTree = ""; }; - 0C12E82A2616383A00B66C86 /* reverse_packed_segs_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = reverse_packed_segs_op.h; sourceTree = ""; }; - 0C12E82B2616383A00B66C86 /* given_tensor_byte_string_to_uint8_fill_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = given_tensor_byte_string_to_uint8_fill_op.h; sourceTree = ""; }; - 0C12E82C2616383A00B66C86 /* ensure_clipped_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ensure_clipped_op.h; sourceTree = ""; }; - 0C12E82D2616383A00B66C86 /* conv_transpose_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = conv_transpose_op.h; sourceTree = ""; }; - 0C12E82E2616383A00B66C86 /* generate_proposals_op_util_nms.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = generate_proposals_op_util_nms.h; sourceTree = ""; }; - 0C12E82F2616383A00B66C86 /* enforce_finite_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = enforce_finite_op.h; sourceTree = ""; }; - 0C12E8302616383A00B66C86 /* conv_transpose_unpool_op_base.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = conv_transpose_unpool_op_base.h; sourceTree = ""; }; - 0C12E8312616383A00B66C86 /* gather_fused_8bit_rowwise_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gather_fused_8bit_rowwise_op.h; sourceTree = ""; }; - 0C12E8322616383A00B66C86 /* batch_matmul_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = batch_matmul_op.h; sourceTree = ""; }; - 0C12E8332616383A00B66C86 /* batch_bucketize_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = batch_bucketize_op.h; sourceTree = ""; }; - 0C12E8342616383A00B66C86 /* softsign_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = softsign_op.h; sourceTree = ""; }; - 0C12E8352616383A00B66C86 /* elementwise_logical_ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = elementwise_logical_ops.h; sourceTree = ""; }; - 0C12E8362616383A00B66C86 /* percentile_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = percentile_op.h; sourceTree = ""; }; - 0C12E8372616383A00B66C86 /* length_split_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = length_split_op.h; sourceTree = ""; }; - 0C12E8382616383A00B66C86 /* locally_connected_op_impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = locally_connected_op_impl.h; sourceTree = ""; }; - 0C12E8392616383A00B66C86 /* rmac_regions_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rmac_regions_op.h; sourceTree = ""; }; - 0C12E83A2616383A00B66C86 /* hard_sigmoid_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hard_sigmoid_op.h; sourceTree = ""; }; - 0C12E83B2616383A00B66C86 /* ensure_cpu_output_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ensure_cpu_output_op.h; sourceTree = ""; }; - 0C12E83C2616383A00B66C86 /* batch_box_cox_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = batch_box_cox_op.h; sourceTree = ""; }; - 0C12E83D2616383A00B66C86 /* ctc_beam_search_decoder_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ctc_beam_search_decoder_op.h; sourceTree = ""; }; - 0C12E83E2616383A00B66C86 /* flexible_top_k.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = flexible_top_k.h; sourceTree = ""; }; - 0C12E83F2616383A00B66C86 /* fully_connected_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fully_connected_op.h; sourceTree = ""; }; - 0C12E8402616383A00B66C86 /* key_split_ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = key_split_ops.h; sourceTree = ""; }; - 0C12E8412616383A00B66C86 /* reciprocal_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = reciprocal_op.h; sourceTree = ""; }; - 0C12E8422616383A00B66C86 /* roi_align_gradient_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = roi_align_gradient_op.h; sourceTree = ""; }; - 0C12E8432616383A00B66C86 /* group_norm_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = group_norm_op.h; sourceTree = ""; }; - 0C12E8442616383A00B66C86 /* load_save_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = load_save_op.h; sourceTree = ""; }; - 0C12E8452616383A00B66C86 /* cos_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cos_op.h; sourceTree = ""; }; - 0C12E8462616383A00B66C86 /* expand_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = expand_op.h; sourceTree = ""; }; - 0C12E8472616383A00B66C86 /* elementwise_ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = elementwise_ops.h; sourceTree = ""; }; - 0C12E8482616383A00B66C86 /* im2col_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = im2col_op.h; sourceTree = ""; }; - 0C12E8492616383A00B66C86 /* space_batch_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = space_batch_op.h; sourceTree = ""; }; - 0C12E84A2616383A00B66C86 /* relu_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = relu_op.h; sourceTree = ""; }; - 0C12E84B2616383A00B66C86 /* while_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = while_op.h; sourceTree = ""; }; - 0C12E84C2616383A00B66C86 /* remove_data_blocks_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = remove_data_blocks_op.h; sourceTree = ""; }; - 0C12E84D2616383A00B66C86 /* elementwise_mul_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = elementwise_mul_op.h; sourceTree = ""; }; - 0C12E84E2616383A00B66C86 /* numpy_tile_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = numpy_tile_op.h; sourceTree = ""; }; - 0C12E84F2616383A00B66C86 /* rowmul_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rowmul_op.h; sourceTree = ""; }; - 0C12E8502616383A00B66C86 /* accumulate_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = accumulate_op.h; sourceTree = ""; }; - 0C12E8512616383A00B66C86 /* sparse_lp_regularizer_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sparse_lp_regularizer_op.h; sourceTree = ""; }; - 0C12E8522616383A00B66C86 /* bisect_percentile_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bisect_percentile_op.h; sourceTree = ""; }; - 0C12E8532616383A00B66C86 /* tile_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tile_op.h; sourceTree = ""; }; - 0C12E8542616383A00B66C86 /* gelu_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gelu_op.h; sourceTree = ""; }; - 0C12E8552616383A00B66C86 /* stats_put_ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stats_put_ops.h; sourceTree = ""; }; - 0C12E8562616383A00B66C86 /* given_tensor_fill_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = given_tensor_fill_op.h; sourceTree = ""; }; - 0C12E8572616383A00B66C86 /* accuracy_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = accuracy_op.h; sourceTree = ""; }; - 0C12E8582616383A00B66C86 /* bbox_transform_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bbox_transform_op.h; sourceTree = ""; }; - 0C12E8592616383A00B66C86 /* boolean_unmask_ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = boolean_unmask_ops.h; sourceTree = ""; }; - 0C12E85A2616383A00B66C86 /* glu_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = glu_op.h; sourceTree = ""; }; - 0C12E85B2616383A00B66C86 /* resize_3d_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = resize_3d_op.h; sourceTree = ""; }; - 0C12E85C2616383A00B66C86 /* unsafe_coalesce.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = unsafe_coalesce.h; sourceTree = ""; }; - 0C12E85D2616383A00B66C86 /* conv_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = conv_op.h; sourceTree = ""; }; - 0C12E85E2616383A00B66C86 /* conv_op_impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = conv_op_impl.h; sourceTree = ""; }; - 0C12E85F2616383A00B66C86 /* erf_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = erf_op.h; sourceTree = ""; }; - 0C12E8602616383A00B66C86 /* fused_rowwise_8bit_conversion_ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fused_rowwise_8bit_conversion_ops.h; sourceTree = ""; }; - 0C12E8612616383A00B66C86 /* locally_connected_op_util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = locally_connected_op_util.h; sourceTree = ""; }; - 0C12E8622616383A00B66C86 /* channel_backprop_stats_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = channel_backprop_stats_op.h; sourceTree = ""; }; - 0C12E8632616383A00B66C86 /* order_switch_ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = order_switch_ops.h; sourceTree = ""; }; - 0C12E8642616383A00B66C86 /* lengths_reducer_fused_nbit_rowwise_ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lengths_reducer_fused_nbit_rowwise_ops.h; sourceTree = ""; }; - 0C12E8652616383A00B66C86 /* lengths_reducer_fused_8bit_rowwise_ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lengths_reducer_fused_8bit_rowwise_ops.h; sourceTree = ""; }; - 0C12E8662616383A00B66C86 /* load_save_op_util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = load_save_op_util.h; sourceTree = ""; }; - 0C12E8672616383A00B66C86 /* conv_transpose_op_impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = conv_transpose_op_impl.h; sourceTree = ""; }; - 0C12E8682616383A00B66C86 /* op_utils_cudnn.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = op_utils_cudnn.h; sourceTree = ""; }; - 0C12E8692616383A00B66C86 /* prelu_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = prelu_op.h; sourceTree = ""; }; - 0C12E86A2616383A00B66C86 /* box_with_nms_limit_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = box_with_nms_limit_op.h; sourceTree = ""; }; - 0C12E86B2616383A00B66C86 /* fc_inference.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fc_inference.h; sourceTree = ""; }; - 0C12E86C2616383A00B66C86 /* distance_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = distance_op.h; sourceTree = ""; }; - 0C12E86D2616383A00B66C86 /* data_couple.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = data_couple.h; sourceTree = ""; }; - 0C12E86E2616383A00B66C86 /* dataset_ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dataset_ops.h; sourceTree = ""; }; - 0C12E86F2616383A00B66C86 /* merge_id_lists_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = merge_id_lists_op.h; sourceTree = ""; }; - 0C12E8702616383A00B66C86 /* generate_proposals_op_util_nms_gpu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = generate_proposals_op_util_nms_gpu.h; sourceTree = ""; }; - 0C12E8712616383A00B66C86 /* async_net_barrier_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = async_net_barrier_op.h; sourceTree = ""; }; - 0C12E8722616383A00B66C86 /* deform_conv_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = deform_conv_op.h; sourceTree = ""; }; - 0C12E8742616383A00B66C86 /* int8_relu_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = int8_relu_op.h; sourceTree = ""; }; - 0C12E8752616383A00B66C86 /* int8_channel_shuffle_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = int8_channel_shuffle_op.h; sourceTree = ""; }; - 0C12E8762616383A00B66C86 /* int8_concat_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = int8_concat_op.h; sourceTree = ""; }; - 0C12E8772616383A00B66C86 /* int8_dequantize_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = int8_dequantize_op.h; sourceTree = ""; }; - 0C12E8782616383A00B66C86 /* int8_slice_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = int8_slice_op.h; sourceTree = ""; }; - 0C12E8792616383A00B66C86 /* int8_quantize_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = int8_quantize_op.h; sourceTree = ""; }; - 0C12E87A2616383A00B66C86 /* int8_flatten_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = int8_flatten_op.h; sourceTree = ""; }; - 0C12E87B2616383A00B66C86 /* int8_max_pool_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = int8_max_pool_op.h; sourceTree = ""; }; - 0C12E87C2616383A00B66C86 /* int8_softmax_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = int8_softmax_op.h; sourceTree = ""; }; - 0C12E87D2616383A00B66C86 /* int8_average_pool_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = int8_average_pool_op.h; sourceTree = ""; }; - 0C12E87E2616383A00B66C86 /* int8_fc_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = int8_fc_op.h; sourceTree = ""; }; - 0C12E87F2616383A00B66C86 /* int8_conv_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = int8_conv_op.h; sourceTree = ""; }; - 0C12E8802616383A00B66C86 /* int8_test_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = int8_test_utils.h; sourceTree = ""; }; - 0C12E8812616383A00B66C86 /* int8_roi_align_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = int8_roi_align_op.h; sourceTree = ""; }; - 0C12E8822616383A00B66C86 /* int8_given_tensor_fill_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = int8_given_tensor_fill_op.h; sourceTree = ""; }; - 0C12E8832616383A00B66C86 /* int8_reshape_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = int8_reshape_op.h; sourceTree = ""; }; - 0C12E8842616383A00B66C86 /* int8_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = int8_utils.h; sourceTree = ""; }; - 0C12E8852616383A00B66C86 /* int8_resize_nearest_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = int8_resize_nearest_op.h; sourceTree = ""; }; - 0C12E8862616383A00B66C86 /* int8_sigmoid_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = int8_sigmoid_op.h; sourceTree = ""; }; - 0C12E8872616383A00B66C86 /* int8_simd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = int8_simd.h; sourceTree = ""; }; - 0C12E8882616383A00B66C86 /* int8_conv_transpose_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = int8_conv_transpose_op.h; sourceTree = ""; }; - 0C12E8892616383A00B66C86 /* int8_leaky_relu_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = int8_leaky_relu_op.h; sourceTree = ""; }; - 0C12E88A2616383A00B66C86 /* int8_add_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = int8_add_op.h; sourceTree = ""; }; - 0C12E88B2616383A00B66C86 /* int8_transpose_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = int8_transpose_op.h; sourceTree = ""; }; - 0C12E88C2616383A00B66C86 /* sqrt_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sqrt_op.h; sourceTree = ""; }; - 0C12E88D2616383A00B66C86 /* elementwise_div_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = elementwise_div_op.h; sourceTree = ""; }; - 0C12E88E2616383A00B66C86 /* deform_conv_op_impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = deform_conv_op_impl.h; sourceTree = ""; }; - 0C12E88F2616383A00B66C86 /* feature_maps_ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = feature_maps_ops.h; sourceTree = ""; }; - 0C12E8902616383A00B66C86 /* text_file_reader_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = text_file_reader_utils.h; sourceTree = ""; }; - 0C12E8912616383A00B66C86 /* scale_blobs_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = scale_blobs_op.h; sourceTree = ""; }; - 0C12E8922616383A00B66C86 /* pool_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pool_op.h; sourceTree = ""; }; - 0C12E8932616383A00B66C86 /* conv_transpose_op_mobile_impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = conv_transpose_op_mobile_impl.h; sourceTree = ""; }; - 0C12E8942616383A00B66C86 /* dense_vector_to_id_list_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dense_vector_to_id_list_op.h; sourceTree = ""; }; - 0C12E8952616383A00B66C86 /* minmax_ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = minmax_ops.h; sourceTree = ""; }; - 0C12E8962616383A00B66C86 /* lengths_tile_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lengths_tile_op.h; sourceTree = ""; }; - 0C12E8972616383A00B66C86 /* pool_op_util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pool_op_util.h; sourceTree = ""; }; - 0C12E8982616383A00B66C86 /* no_default_engine_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = no_default_engine_op.h; sourceTree = ""; }; - 0C12E8992616383A00B66C86 /* onnx_while_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = onnx_while_op.h; sourceTree = ""; }; - 0C12E89A2616383A00B66C86 /* reduce_front_back_sum_mean_ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = reduce_front_back_sum_mean_ops.h; sourceTree = ""; }; - 0C12E89B2616383A00B66C86 /* roi_pool_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = roi_pool_op.h; sourceTree = ""; }; - 0C12E89C2616383A00B66C86 /* flatten_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = flatten_op.h; sourceTree = ""; }; - 0C12E89D2616383A00B66C86 /* self_binning_histogram_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = self_binning_histogram_op.h; sourceTree = ""; }; - 0C12E89E2616383A00B66C86 /* normalize_l1_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = normalize_l1_op.h; sourceTree = ""; }; - 0C12E89F2616383A00B66C86 /* pow_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pow_op.h; sourceTree = ""; }; - 0C12E8A02616383A00B66C86 /* exp_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = exp_op.h; sourceTree = ""; }; - 0C12E8A12616383A00B66C86 /* heatmap_max_keypoint_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = heatmap_max_keypoint_op.h; sourceTree = ""; }; - 0C12E8A22616383A00B66C86 /* assert_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = assert_op.h; sourceTree = ""; }; - 0C12E8A32616383A00B66C86 /* piecewise_linear_transform_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = piecewise_linear_transform_op.h; sourceTree = ""; }; - 0C12E8A42616383A00B66C86 /* cbrt_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cbrt_op.h; sourceTree = ""; }; - 0C12E8A52616383A00B66C86 /* weighted_sample_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = weighted_sample_op.h; sourceTree = ""; }; - 0C12E8A62616383A00B66C86 /* tanh_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tanh_op.h; sourceTree = ""; }; - 0C12E8A72616383A00B66C86 /* softmax_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = softmax_op.h; sourceTree = ""; }; - 0C12E8A82616383A00B66C86 /* listwise_l2r_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = listwise_l2r_op.h; sourceTree = ""; }; - 0C12E8A92616383A00B66C86 /* variable_length_sequence_padding.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = variable_length_sequence_padding.h; sourceTree = ""; }; - 0C12E8AA2616383A00B66C86 /* elementwise_add_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = elementwise_add_op.h; sourceTree = ""; }; - 0C12E8AB2616383A00B66C86 /* leaky_relu_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = leaky_relu_op.h; sourceTree = ""; }; - 0C12E8AC2616383A00B66C86 /* elementwise_linear_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = elementwise_linear_op.h; sourceTree = ""; }; - 0C12E8AD2616383A00B66C86 /* elu_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = elu_op.h; sourceTree = ""; }; - 0C12E8AE2616383A00B66C86 /* jsd_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = jsd_op.h; sourceTree = ""; }; - 0C12E8AF2616383A00B66C86 /* collect_and_distribute_fpn_rpn_proposals_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = collect_and_distribute_fpn_rpn_proposals_op.h; sourceTree = ""; }; - 0C12E8B02616383A00B66C86 /* reduce_ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = reduce_ops.h; sourceTree = ""; }; - 0C12E8B12616383A00B66C86 /* string_ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = string_ops.h; sourceTree = ""; }; - 0C12E8B22616383A00B66C86 /* boolean_mask_ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = boolean_mask_ops.h; sourceTree = ""; }; - 0C12E8B32616383A00B66C86 /* local_response_normalization_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = local_response_normalization_op.h; sourceTree = ""; }; - 0C12E8B42616383A00B66C86 /* partition_ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = partition_ops.h; sourceTree = ""; }; - 0C12E8B52616383A00B66C86 /* sparse_dropout_with_replacement_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sparse_dropout_with_replacement_op.h; sourceTree = ""; }; - 0C12E8B62616383A00B66C86 /* loss_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = loss_op.h; sourceTree = ""; }; - 0C12E8B72616383A00B66C86 /* counter_ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = counter_ops.h; sourceTree = ""; }; - 0C12E8B82616383A00B66C86 /* h_softmax_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = h_softmax_op.h; sourceTree = ""; }; - 0C12E8B92616383A00B66C86 /* lengths_reducer_rowwise_8bit_ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lengths_reducer_rowwise_8bit_ops.h; sourceTree = ""; }; - 0C12E8BA2616383A00B66C86 /* copy_rows_to_tensor_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = copy_rows_to_tensor_op.h; sourceTree = ""; }; - 0C12E8BB2616383A00B66C86 /* moments_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = moments_op.h; sourceTree = ""; }; - 0C12E8BC2616383A00B66C86 /* logit_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = logit_op.h; sourceTree = ""; }; - 0C12E8BD2616383A00B66C86 /* perplexity_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = perplexity_op.h; sourceTree = ""; }; - 0C12E8BE2616383A00B66C86 /* roi_align_rotated_gradient_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = roi_align_rotated_gradient_op.h; sourceTree = ""; }; - 0C12E8BF2616383A00B66C86 /* ceil_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ceil_op.h; sourceTree = ""; }; - 0C12E8C02616383A00B66C86 /* find_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = find_op.h; sourceTree = ""; }; - 0C12E8C12616383A00B66C86 /* layer_norm_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = layer_norm_op.h; sourceTree = ""; }; - 0C12E8C22616383A00B66C86 /* negate_gradient_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = negate_gradient_op.h; sourceTree = ""; }; - 0C12E8C32616383A00B66C86 /* resize_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = resize_op.h; sourceTree = ""; }; - 0C12E8C42616383A00B66C86 /* lengths_reducer_ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lengths_reducer_ops.h; sourceTree = ""; }; - 0C12E8C52616383A00B66C86 /* batch_sparse_to_dense_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = batch_sparse_to_dense_op.h; sourceTree = ""; }; - 0C12E8C62616383A00B66C86 /* replace_nan_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = replace_nan_op.h; sourceTree = ""; }; - 0C12E8C72616383A00B66C86 /* max_pool_with_index_gpu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = max_pool_with_index_gpu.h; sourceTree = ""; }; - 0C12E8C82616383A00B66C86 /* find_duplicate_elements_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = find_duplicate_elements_op.h; sourceTree = ""; }; - 0C12E8C92616383A00B66C86 /* expand_squeeze_dims_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = expand_squeeze_dims_op.h; sourceTree = ""; }; - 0C12E8CA2616383A00B66C86 /* sinusoid_position_encoding_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sinusoid_position_encoding_op.h; sourceTree = ""; }; - 0C12E8CB2616383A00B66C86 /* pack_segments.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pack_segments.h; sourceTree = ""; }; - 0C12E8CC2616383A00B66C86 /* softplus_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = softplus_op.h; sourceTree = ""; }; - 0C12E8CD2616383A00B66C86 /* quantile_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = quantile_op.h; sourceTree = ""; }; - 0C12E8CE2616383A00B66C86 /* sinh_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sinh_op.h; sourceTree = ""; }; - 0C12E8CF2616383A00B66C86 /* fused_rowwise_nbitfake_conversion_ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fused_rowwise_nbitfake_conversion_ops.h; sourceTree = ""; }; - 0C12E8D02616383A00B66C86 /* cross_entropy_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cross_entropy_op.h; sourceTree = ""; }; - 0C12E8D12616383A00B66C86 /* feed_blob_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = feed_blob_op.h; sourceTree = ""; }; - 0C12E8D22616383A00B66C86 /* slice_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = slice_op.h; sourceTree = ""; }; - 0C12E8D32616383A00B66C86 /* rsqrt_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rsqrt_op.h; sourceTree = ""; }; - 0C12E8D42616383A00B66C86 /* free_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = free_op.h; sourceTree = ""; }; - 0C12E8D52616383A00B66C86 /* square_root_divide_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = square_root_divide_op.h; sourceTree = ""; }; - 0C12E8D62616383A00B66C86 /* conv_op_shared.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = conv_op_shared.h; sourceTree = ""; }; - 0C12E8D72616383A00B66C86 /* apmeter_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = apmeter_op.h; sourceTree = ""; }; - 0C12E8D82616383A00B66C86 /* lstm_unit_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lstm_unit_op.h; sourceTree = ""; }; - 0C12E8D92616383A00B66C86 /* index_hash_ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = index_hash_ops.h; sourceTree = ""; }; - 0C12E8DA2616383A00B66C86 /* lengths_pad_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lengths_pad_op.h; sourceTree = ""; }; - 0C12E8DB2616383A00B66C86 /* elementwise_ops_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = elementwise_ops_utils.h; sourceTree = ""; }; - 0C12E8DC2616383A00B66C86 /* sparse_normalize_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sparse_normalize_op.h; sourceTree = ""; }; - 0C12E8DD2616383A00B66C86 /* multi_class_accuracy_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = multi_class_accuracy_op.h; sourceTree = ""; }; - 0C12E8DE2616383A00B66C86 /* cast_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cast_op.h; sourceTree = ""; }; - 0C12E8DF2616383A00B66C86 /* transpose_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = transpose_op.h; sourceTree = ""; }; - 0C12E8E02616383A00B66C86 /* create_scope_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = create_scope_op.h; sourceTree = ""; }; - 0C12E8E12616383A00B66C86 /* zero_gradient_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = zero_gradient_op.h; sourceTree = ""; }; - 0C12E8E22616383A00B66C86 /* lstm_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lstm_utils.h; sourceTree = ""; }; - 0C12E8E32616383A00B66C86 /* tt_linear_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tt_linear_op.h; sourceTree = ""; }; - 0C12E8E42616383A00B66C86 /* relu_n_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = relu_n_op.h; sourceTree = ""; }; - 0C12E8E52616383A00B66C86 /* generate_proposals_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = generate_proposals_op.h; sourceTree = ""; }; - 0C12E8E72616383A00B66C86 /* activation_ops_miopen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = activation_ops_miopen.h; sourceTree = ""; }; - 0C12E8E82616383A00B66C86 /* lpnorm_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lpnorm_op.h; sourceTree = ""; }; - 0C12E8E92616383A00B66C86 /* sequence_ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sequence_ops.h; sourceTree = ""; }; - 0C12E8EA2616383A00B66C86 /* abs_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = abs_op.h; sourceTree = ""; }; - 0C12E8EB2616383A00B66C86 /* activation_ops_cudnn.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = activation_ops_cudnn.h; sourceTree = ""; }; - 0C12E8EC2616383A00B66C86 /* elementwise_op_test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = elementwise_op_test.h; sourceTree = ""; }; - 0C12E8ED2616383A00B66C86 /* inference_lstm_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = inference_lstm_op.h; sourceTree = ""; }; - 0C12E8EE2616383A00B66C86 /* concat_split_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = concat_split_op.h; sourceTree = ""; }; - 0C12E8EF2616383A00B66C86 /* reduction_ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = reduction_ops.h; sourceTree = ""; }; - 0C12E8F02616383A00B66C86 /* gather_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gather_op.h; sourceTree = ""; }; - 0C12E8F12616383A00B66C86 /* log_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = log_op.h; sourceTree = ""; }; - 0C12E8F22616383A00B66C86 /* conv_pool_op_base.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = conv_pool_op_base.h; sourceTree = ""; }; - 0C12E8F32616383A00B66C86 /* unique_ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = unique_ops.h; sourceTree = ""; }; - 0C12E8F42616383A00B66C86 /* elementwise_sub_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = elementwise_sub_op.h; sourceTree = ""; }; - 0C12E8F52616383A00B66C86 /* segment_reduction_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = segment_reduction_op.h; sourceTree = ""; }; - 0C12E8F62616383A00B66C86 /* fused_rowwise_nbit_conversion_ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fused_rowwise_nbit_conversion_ops.h; sourceTree = ""; }; - 0C12E8F72616383A00B66C86 /* stump_func_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stump_func_op.h; sourceTree = ""; }; - 0C12E8F82616383A00B66C86 /* swish_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = swish_op.h; sourceTree = ""; }; - 0C12E8F92616383A00B66C86 /* pack_rnn_sequence_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pack_rnn_sequence_op.h; sourceTree = ""; }; - 0C12E8FA2616383A00B66C86 /* softmax_with_loss_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = softmax_with_loss_op.h; sourceTree = ""; }; - 0C12E8FB2616383A00B66C86 /* integral_image_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = integral_image_op.h; sourceTree = ""; }; - 0C12E8FC2616383A00B66C86 /* mish_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mish_op.h; sourceTree = ""; }; - 0C12E8FD2616383A00B66C86 /* weighted_multi_sampling_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = weighted_multi_sampling_op.h; sourceTree = ""; }; - 0C12E8FE2616383A00B66C86 /* bucketize_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bucketize_op.h; sourceTree = ""; }; - 0C12E8FF2616383A00B66C86 /* is_empty_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = is_empty_op.h; sourceTree = ""; }; - 0C12E9002616383A00B66C86 /* mod_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mod_op.h; sourceTree = ""; }; - 0C12E9012616383A00B66C86 /* clip_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = clip_op.h; sourceTree = ""; }; - 0C12E9022616383A00B66C86 /* prepend_dim_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = prepend_dim_op.h; sourceTree = ""; }; - 0C12E9032616383A00B66C86 /* copy_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = copy_op.h; sourceTree = ""; }; - 0C12E9042616383A00B66C86 /* rank_loss_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rank_loss_op.h; sourceTree = ""; }; - 0C12E9052616383A00B66C86 /* lengths_top_k_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lengths_top_k_op.h; sourceTree = ""; }; - 0C12E9062616383A00B66C86 /* summarize_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = summarize_op.h; sourceTree = ""; }; - 0C12E9072616383A00B66C86 /* one_hot_ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = one_hot_ops.h; sourceTree = ""; }; - 0C12E9082616383A00B66C86 /* cc_bmm_bg_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cc_bmm_bg_op.h; sourceTree = ""; }; - 0C12E9092616383A00B66C86 /* acos_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = acos_op.h; sourceTree = ""; }; - 0C12E90A2616383A00B66C86 /* softmax_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = softmax_utils.h; sourceTree = ""; }; - 0C12E90B2616383A00B66C86 /* tensor_protos_db_input.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tensor_protos_db_input.h; sourceTree = ""; }; - 0C12E90C2616383A00B66C86 /* generate_proposals_op_util_boxes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = generate_proposals_op_util_boxes.h; sourceTree = ""; }; - 0C12E90D2616383A00B66C86 /* conv_transpose_op_mobile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = conv_transpose_op_mobile.h; sourceTree = ""; }; - 0C12E90E2616383A00B66C86 /* arg_ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = arg_ops.h; sourceTree = ""; }; - 0C12E90F2616383A00B66C86 /* negative_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = negative_op.h; sourceTree = ""; }; - 0C12E9102616383A00B66C86 /* operator_fallback_gpu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = operator_fallback_gpu.h; sourceTree = ""; }; - 0C12E9112616383A00B66C86 /* margin_ranking_criterion_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = margin_ranking_criterion_op.h; sourceTree = ""; }; - 0C12E9122616383A00B66C86 /* matmul_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = matmul_op.h; sourceTree = ""; }; - 0C12E9132616383A00B66C86 /* roi_align_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = roi_align_op.h; sourceTree = ""; }; - 0C12E9142616383A00B66C86 /* pad_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pad_op.h; sourceTree = ""; }; - 0C12E9152616383A00B66C86 /* histogram_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = histogram_op.h; sourceTree = ""; }; - 0C12E9162616383A00B66C86 /* floor_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = floor_op.h; sourceTree = ""; }; - 0C12E9172616383A00B66C86 /* normalize_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = normalize_op.h; sourceTree = ""; }; - 0C12E9182616383A00B66C86 /* cube_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cube_op.h; sourceTree = ""; }; - 0C12E9192616383A00B66C86 /* reshape_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = reshape_op.h; sourceTree = ""; }; - 0C12E91A2616383A00B66C86 /* instance_norm_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = instance_norm_op.h; sourceTree = ""; }; - 0C12E91B2616383A00B66C86 /* ngram_ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ngram_ops.h; sourceTree = ""; }; - 0C12E91C2616383A00B66C86 /* if_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = if_op.h; sourceTree = ""; }; - 0C12E91D2616383A00B66C86 /* reduce_front_back_max_ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = reduce_front_back_max_ops.h; sourceTree = ""; }; - 0C12E91E2616383A00B66C86 /* reducer_functors.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = reducer_functors.h; sourceTree = ""; }; - 0C12E91F2616383A00B66C86 /* affine_channel_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = affine_channel_op.h; sourceTree = ""; }; - 0C12E9202616383A00B66C86 /* sigmoid_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sigmoid_op.h; sourceTree = ""; }; - 0C12E9212616383A00B66C86 /* channel_shuffle_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = channel_shuffle_op.h; sourceTree = ""; }; - 0C12E9222616383A00B66C86 /* locally_connected_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = locally_connected_op.h; sourceTree = ""; }; - 0C12E9232616383A00B66C86 /* conditional_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = conditional_op.h; sourceTree = ""; }; - 0C12E9242616383A00B66C86 /* rms_norm_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rms_norm_op.h; sourceTree = ""; }; - 0C12E9252616383A00B66C86 /* dropout_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dropout_op.h; sourceTree = ""; }; - 0C12E9262616383A00B66C86 /* gather_ranges_to_dense_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gather_ranges_to_dense_op.h; sourceTree = ""; }; - 0C12E9272616383A00B66C86 /* shape_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = shape_op.h; sourceTree = ""; }; - 0C12E9282616383A00B66C86 /* index_ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = index_ops.h; sourceTree = ""; }; - 0C12E9292616383A00B66C86 /* tan_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tan_op.h; sourceTree = ""; }; - 0C12E92A2616383A00B66C86 /* scale_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = scale_op.h; sourceTree = ""; }; - 0C12E92B2616383A00B66C86 /* cosine_embedding_criterion_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cosine_embedding_criterion_op.h; sourceTree = ""; }; - 0C12E92C2616383A00B66C86 /* sparse_to_dense_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sparse_to_dense_op.h; sourceTree = ""; }; - 0C12E92D2616383A00B66C86 /* quant_decode_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = quant_decode_op.h; sourceTree = ""; }; - 0C12E92F2616383A00B66C86 /* recurrent_network_blob_fetcher_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = recurrent_network_blob_fetcher_op.h; sourceTree = ""; }; - 0C12E9302616383A00B66C86 /* recurrent_op_cudnn.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = recurrent_op_cudnn.h; sourceTree = ""; }; - 0C12E9312616383A00B66C86 /* recurrent_network_executor_gpu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = recurrent_network_executor_gpu.h; sourceTree = ""; }; - 0C12E9322616383A00B66C86 /* recurrent_network_executor_incl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = recurrent_network_executor_incl.h; sourceTree = ""; }; - 0C12E9342616383A00B66C86 /* recurrent_op_miopen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = recurrent_op_miopen.h; sourceTree = ""; }; - 0C12E9352616383A00B66C86 /* recurrent_network_executor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = recurrent_network_executor.h; sourceTree = ""; }; - 0C12E9362616383A00B66C86 /* recurrent_network_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = recurrent_network_op.h; sourceTree = ""; }; - 0C12E9372616383A00B66C86 /* sparse_to_dense_mask_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sparse_to_dense_mask_op.h; sourceTree = ""; }; - 0C12E9382616383A00B66C86 /* sin_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sin_op.h; sourceTree = ""; }; - 0C12E9392616383A00B66C86 /* upsample_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = upsample_op.h; sourceTree = ""; }; - 0C12E93A2616383A00B66C86 /* filler_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = filler_op.h; sourceTree = ""; }; - 0C12E93B2616383A00B66C86 /* batch_permutation_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = batch_permutation_op.h; sourceTree = ""; }; - 0C12E93C2616383A00B66C86 /* spatial_softmax_with_loss_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = spatial_softmax_with_loss_op.h; sourceTree = ""; }; - 0C12E93D2616383A00B66C86 /* batch_moments_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = batch_moments_op.h; sourceTree = ""; }; - 0C12E93E2616383A00B66C86 /* alias_with_name.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = alias_with_name.h; sourceTree = ""; }; - 0C12E93F2616383A00B66C86 /* do_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = do_op.h; sourceTree = ""; }; - 0C12E9402616383A00B66C86 /* prefetch_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = prefetch_op.h; sourceTree = ""; }; - 0C12E9412616383A00B66C86 /* byte_weight_dequant_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = byte_weight_dequant_op.h; sourceTree = ""; }; - 0C12E9422616383A00B66C86 /* spatial_batch_norm_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = spatial_batch_norm_op.h; sourceTree = ""; }; - 0C12E9442616383A00B66C86 /* helper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = helper.h; sourceTree = ""; }; - 0C12E9452616383A00B66C86 /* device.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = device.h; sourceTree = ""; }; - 0C12E9462616383A00B66C86 /* onnxifi_init.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = onnxifi_init.h; sourceTree = ""; }; - 0C12E9472616383A00B66C86 /* backend.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = backend.h; sourceTree = ""; }; - 0C12E9492616383A00B66C86 /* schema.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = schema.h; sourceTree = ""; }; - 0C12E94A2616383A00B66C86 /* constants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = constants.h; sourceTree = ""; }; - 0C12E94B2616383A00B66C86 /* operator_sets.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = operator_sets.h; sourceTree = ""; }; - 0C12E94C2616383A00B66C86 /* backend_rep.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = backend_rep.h; sourceTree = ""; }; - 0C12E94D2616383A00B66C86 /* onnx_exporter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = onnx_exporter.h; sourceTree = ""; }; - 0C12E94E2616383A00B66C86 /* offline_tensor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = offline_tensor.h; sourceTree = ""; }; - 0C12E94F2616383A00B66C86 /* onnxifi_graph_info.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = onnxifi_graph_info.h; sourceTree = ""; }; - 0C12E9542616383A00B66C86 /* pybind_state.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pybind_state.h; sourceTree = ""; }; - 0C12E9552616383A00B66C86 /* pybind_state_registry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pybind_state_registry.h; sourceTree = ""; }; - 0C12E95D2616383A00B66C86 /* dlpack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dlpack.h; sourceTree = ""; }; - 0C12E9692616383A00B66C86 /* pybind_state_dlpack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pybind_state_dlpack.h; sourceTree = ""; }; - 0C12E9712616383A00B66C86 /* redis_store_handler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = redis_store_handler.h; sourceTree = ""; }; - 0C12E9722616383A00B66C86 /* file_store_handler_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = file_store_handler_op.h; sourceTree = ""; }; - 0C12E9732616383A00B66C86 /* store_handler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = store_handler.h; sourceTree = ""; }; - 0C12E9742616383A00B66C86 /* store_ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = store_ops.h; sourceTree = ""; }; - 0C12E9752616383A00B66C86 /* file_store_handler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = file_store_handler.h; sourceTree = ""; }; - 0C12E9762616383A00B66C86 /* redis_store_handler_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = redis_store_handler_op.h; sourceTree = ""; }; - 0C12E9782616383A00B66C86 /* embedding_lookup.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = embedding_lookup.h; sourceTree = ""; }; - 0C12E9792616383A00B66C86 /* fused_8bit_rowwise_embedding_lookup_idx.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fused_8bit_rowwise_embedding_lookup_idx.h; sourceTree = ""; }; - 0C12E97A2616383A00B66C86 /* lstm_unit_cpu-impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "lstm_unit_cpu-impl.h"; sourceTree = ""; }; - 0C12E97B2616383A00B66C86 /* embedding_lookup_idx.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = embedding_lookup_idx.h; sourceTree = ""; }; - 0C12E97C2616383A00B66C86 /* adagrad.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = adagrad.h; sourceTree = ""; }; - 0C12E97D2616383A00B66C86 /* lstm_unit_cpu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lstm_unit_cpu.h; sourceTree = ""; }; - 0C12E97E2616383A00B66C86 /* cvtsh_ss_bugfix.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cvtsh_ss_bugfix.h; sourceTree = ""; }; - 0C12E97F2616383A00B66C86 /* common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = common.h; sourceTree = ""; }; - 0C12E9802616383A00B66C86 /* math.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = math.h; sourceTree = ""; }; - 0C12E9812616383A00B66C86 /* typed_axpy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = typed_axpy.h; sourceTree = ""; }; - 0C12E9822616383A00B66C86 /* fused_nbit_rowwise_conversion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fused_nbit_rowwise_conversion.h; sourceTree = ""; }; - 0C12E9832616383A00B66C86 /* fused_8bit_rowwise_embedding_lookup.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fused_8bit_rowwise_embedding_lookup.h; sourceTree = ""; }; - 0C12E9842616383A00B66C86 /* lstm_unit_cpu_common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lstm_unit_cpu_common.h; sourceTree = ""; }; - 0C12E9872616383A00B66C86 /* fully_connected_op_decomposition.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fully_connected_op_decomposition.h; sourceTree = ""; }; - 0C12E9882616383A00B66C86 /* fully_connected_op_sparse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fully_connected_op_sparse.h; sourceTree = ""; }; - 0C12E9892616383A00B66C86 /* tt_contraction_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tt_contraction_op.h; sourceTree = ""; }; - 0C12E98A2616383A00B66C86 /* fully_connected_op_prune.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fully_connected_op_prune.h; sourceTree = ""; }; - 0C12E98B2616383A00B66C86 /* funhash_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = funhash_op.h; sourceTree = ""; }; - 0C12E98C2616383A00B66C86 /* sparse_funhash_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sparse_funhash_op.h; sourceTree = ""; }; - 0C12E98D2616383A00B66C86 /* sparse_matrix_reshape_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sparse_matrix_reshape_op.h; sourceTree = ""; }; - 0C12E98E2616383A00B66C86 /* tt_pad_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tt_pad_op.h; sourceTree = ""; }; - 0C12E9912616383A00B66C86 /* common_rtc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = common_rtc.h; sourceTree = ""; }; - 0C12E9932616383A00B66C86 /* read_adapter_interface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = read_adapter_interface.h; sourceTree = ""; }; - 0C12E9942616383A00B66C86 /* crc_alt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = crc_alt.h; sourceTree = ""; }; - 0C12E9952616383A00B66C86 /* versions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = versions.h; sourceTree = ""; }; - 0C12E9962616383A00B66C86 /* inline_container.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = inline_container.h; sourceTree = ""; }; - 0C12E9972616383A00B66C86 /* file_adapter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = file_adapter.h; sourceTree = ""; }; - 0C12E9982616383A00B66C86 /* istream_adapter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = istream_adapter.h; sourceTree = ""; }; - 0C12E99A2616383A00B66C86 /* filler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = filler.h; sourceTree = ""; }; - 0C12E99B2616383A00B66C86 /* math-detail.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "math-detail.h"; sourceTree = ""; }; - 0C12E99C2616383A00B66C86 /* signal_handler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = signal_handler.h; sourceTree = ""; }; - 0C12E99D2616383A00B66C86 /* cpu_neon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cpu_neon.h; sourceTree = ""; }; - 0C12E99E2616383A00B66C86 /* conversions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = conversions.h; sourceTree = ""; }; - 0C12E99F2616383A00B66C86 /* string_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = string_utils.h; sourceTree = ""; }; - 0C12E9A02616383A00B66C86 /* simple_queue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = simple_queue.h; sourceTree = ""; }; - 0C12E9A12616383A00B66C86 /* cpuid.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cpuid.h; sourceTree = ""; }; - 0C12E9A32616383A00B66C86 /* ThreadPool.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ThreadPool.h; sourceTree = ""; }; - 0C12E9A42616383A00B66C86 /* ThreadPoolCommon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ThreadPoolCommon.h; sourceTree = ""; }; - 0C12E9A52616383A00B66C86 /* pthreadpool.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pthreadpool.h; sourceTree = ""; }; - 0C12E9A62616383A00B66C86 /* pthreadpool-cpp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "pthreadpool-cpp.h"; sourceTree = ""; }; - 0C12E9A72616383A00B66C86 /* WorkersPool.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WorkersPool.h; sourceTree = ""; }; - 0C12E9A82616383A00B66C86 /* thread_pool_guard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = thread_pool_guard.h; sourceTree = ""; }; - 0C12E9AA2616383A00B66C86 /* utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = utils.h; sourceTree = ""; }; - 0C12E9AB2616383A00B66C86 /* broadcast.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = broadcast.h; sourceTree = ""; }; - 0C12E9AC2616383A00B66C86 /* elementwise.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = elementwise.h; sourceTree = ""; }; - 0C12E9AD2616383A00B66C86 /* half_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = half_utils.h; sourceTree = ""; }; - 0C12E9AE2616383A00B66C86 /* reduce.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = reduce.h; sourceTree = ""; }; - 0C12E9AF2616383A00B66C86 /* transpose.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = transpose.h; sourceTree = ""; }; - 0C12E9B02616383A00B66C86 /* fixed_divisor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fixed_divisor.h; sourceTree = ""; }; - 0C12E9B12616383A00B66C86 /* proto_wrap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = proto_wrap.h; sourceTree = ""; }; - 0C12E9B22616383A00B66C86 /* bench_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bench_utils.h; sourceTree = ""; }; - 0C12E9B32616383A00B66C86 /* cast.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cast.h; sourceTree = ""; }; - 0C12E9B52616383A00B66C86 /* murmur_hash3.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = murmur_hash3.h; sourceTree = ""; }; - 0C12E9B62616383A00B66C86 /* math.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = math.h; sourceTree = ""; }; - 0C12E9B72616383B00B66C86 /* eigen_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = eigen_utils.h; sourceTree = ""; }; - 0C12E9B82616383B00B66C86 /* smart_tensor_printer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = smart_tensor_printer.h; sourceTree = ""; }; - 0C12E9B92616383B00B66C86 /* proto_convert.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = proto_convert.h; sourceTree = ""; }; - 0C12E9BA2616383B00B66C86 /* proto_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = proto_utils.h; sourceTree = ""; }; - 0C12E9BB2616383B00B66C86 /* cblas.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cblas.h; sourceTree = ""; }; - 0C12E9BC2616383B00B66C86 /* map_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = map_utils.h; sourceTree = ""; }; - 0C12E9BD2616383B00B66C86 /* zmq_helper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = zmq_helper.h; sourceTree = ""; }; - 0C12E9C12616383B00B66C86 /* ctc_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ctc_op.h; sourceTree = ""; }; - 0C12E9C32616383B00B66C86 /* cuda_nccl_gpu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cuda_nccl_gpu.h; sourceTree = ""; }; - 0C12E9C92616383B00B66C86 /* allreduce_ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = allreduce_ops.h; sourceTree = ""; }; - 0C12E9CA2616383B00B66C86 /* allgather_ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = allgather_ops.h; sourceTree = ""; }; - 0C12E9CB2616383B00B66C86 /* context.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = context.h; sourceTree = ""; }; - 0C12E9CC2616383B00B66C86 /* store_handler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = store_handler.h; sourceTree = ""; }; - 0C12E9CD2616383B00B66C86 /* broadcast_ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = broadcast_ops.h; sourceTree = ""; }; - 0C12E9CE2616383B00B66C86 /* reduce_scatter_ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = reduce_scatter_ops.h; sourceTree = ""; }; - 0C12E9CF2616383B00B66C86 /* common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = common.h; sourceTree = ""; }; - 0C12E9D02616383B00B66C86 /* common_world_ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = common_world_ops.h; sourceTree = ""; }; - 0C12E9D12616383B00B66C86 /* barrier_ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = barrier_ops.h; sourceTree = ""; }; - 0C12E9D32616383B00B66C86 /* sum_fp16_fake_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sum_fp16_fake_op.h; sourceTree = ""; }; - 0C12E9D42616383B00B66C86 /* lengths_reducer_fused_4bit_rowwise_fp16_fake_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lengths_reducer_fused_4bit_rowwise_fp16_fake_op.h; sourceTree = ""; }; - 0C12E9D52616383B00B66C86 /* int8_dequantize_op_nnpi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = int8_dequantize_op_nnpi.h; sourceTree = ""; }; - 0C12E9D72616383B00B66C86 /* fp16_gemm_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fp16_gemm_utils.h; sourceTree = ""; }; - 0C12E9D82616383B00B66C86 /* fp16_fma.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fp16_fma.h; sourceTree = ""; }; - 0C12E9D92616383B00B66C86 /* fp16_fc_acc_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fp16_fc_acc_op.h; sourceTree = ""; }; - 0C12E9DA2616383B00B66C86 /* layernorm_fp16_fake_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = layernorm_fp16_fake_op.h; sourceTree = ""; }; - 0C12E9DB2616383B00B66C86 /* unary_fp16_fake_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = unary_fp16_fake_op.h; sourceTree = ""; }; - 0C12E9DC2616383B00B66C86 /* int8_quantize_op_nnpi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = int8_quantize_op_nnpi.h; sourceTree = ""; }; - 0C12E9DD2616383B00B66C86 /* lengths_reducer_ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lengths_reducer_ops.h; sourceTree = ""; }; - 0C12E9DE2616383B00B66C86 /* common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = common.h; sourceTree = ""; }; - 0C12E9DF2616383B00B66C86 /* batch_matmul_fp16_fake_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = batch_matmul_fp16_fake_op.h; sourceTree = ""; }; - 0C12E9E02616383B00B66C86 /* lengths_reducer_fused_8bit_rowwise_fp16_fake_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lengths_reducer_fused_8bit_rowwise_fp16_fake_op.h; sourceTree = ""; }; - 0C12E9E12616383B00B66C86 /* spatial_batch_norm_fp16_fake_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = spatial_batch_norm_fp16_fake_op.h; sourceTree = ""; }; - 0C12E9E22616383B00B66C86 /* quant_lut_fp16_fake_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = quant_lut_fp16_fake_op.h; sourceTree = ""; }; - 0C12E9E32616383B00B66C86 /* int8_swish_op_nnpi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = int8_swish_op_nnpi.h; sourceTree = ""; }; - 0C12E9E72616383B00B66C86 /* context.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = context.h; sourceTree = ""; }; - 0C12E9EA2616383B00B66C86 /* prof_dag_stats_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = prof_dag_stats_op.h; sourceTree = ""; }; - 0C12E9EC2616383B00B66C86 /* tensorrt_tranformer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tensorrt_tranformer.h; sourceTree = ""; }; - 0C12E9ED2616383B00B66C86 /* trt_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = trt_utils.h; sourceTree = ""; }; - 0C12E9EE2616383B00B66C86 /* tensorrt_op_trt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tensorrt_op_trt.h; sourceTree = ""; }; - 0C12E9F02616383B00B66C86 /* shm_mutex.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = shm_mutex.h; sourceTree = ""; }; - 0C12E9F32616383B00B66C86 /* aten_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aten_op.h; sourceTree = ""; }; - 0C12E9F52616383B00B66C86 /* aten_op_template.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aten_op_template.h; sourceTree = ""; }; - 0C12E9F82616383B00B66C86 /* image_input_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = image_input_op.h; sourceTree = ""; }; - 0C12E9F92616383B00B66C86 /* transform_gpu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = transform_gpu.h; sourceTree = ""; }; - 0C12E9FC2616383B00B66C86 /* fbgemm_fp16_pack_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fbgemm_fp16_pack_op.h; sourceTree = ""; }; - 0C12E9FD2616383B00B66C86 /* concat_dnnlowp_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = concat_dnnlowp_op.h; sourceTree = ""; }; - 0C12E9FE2616383B00B66C86 /* fully_connected_dnnlowp_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fully_connected_dnnlowp_op.h; sourceTree = ""; }; - 0C12E9FF2616383B00B66C86 /* int8_quant_scheme_blob_fill.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = int8_quant_scheme_blob_fill.h; sourceTree = ""; }; - 0C12EA002616383B00B66C86 /* quantize_dnnlowp_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = quantize_dnnlowp_op.h; sourceTree = ""; }; - 0C12EA012616383B00B66C86 /* batch_matmul_dnnlowp_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = batch_matmul_dnnlowp_op.h; sourceTree = ""; }; - 0C12EA022616383B00B66C86 /* utility_dnnlowp_ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = utility_dnnlowp_ops.h; sourceTree = ""; }; - 0C12EA032616383B00B66C86 /* activation_distribution_observer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = activation_distribution_observer.h; sourceTree = ""; }; - 0C12EA042616383B00B66C86 /* compute_equalization_scale.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = compute_equalization_scale.h; sourceTree = ""; }; - 0C12EA052616383B00B66C86 /* caffe2_dnnlowp_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = caffe2_dnnlowp_utils.h; sourceTree = ""; }; - 0C12EA062616383B00B66C86 /* dnnlowp_partition.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dnnlowp_partition.h; sourceTree = ""; }; - 0C12EA072616383B00B66C86 /* fully_connected_fake_lowp_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fully_connected_fake_lowp_op.h; sourceTree = ""; }; - 0C12EA082616383B00B66C86 /* op_wrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = op_wrapper.h; sourceTree = ""; }; - 0C12EA092616383B00B66C86 /* batch_permutation_dnnlowp_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = batch_permutation_dnnlowp_op.h; sourceTree = ""; }; - 0C12EA0A2616383B00B66C86 /* conv_relu_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = conv_relu_op.h; sourceTree = ""; }; - 0C12EA0B2616383B00B66C86 /* conv_pool_dnnlowp_op_base.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = conv_pool_dnnlowp_op_base.h; sourceTree = ""; }; - 0C12EA0C2616383B00B66C86 /* mmio.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mmio.h; sourceTree = ""; }; - 0C12EA0D2616383B00B66C86 /* lstm_unit_dnnlowp_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lstm_unit_dnnlowp_op.h; sourceTree = ""; }; - 0C12EA0E2616383B00B66C86 /* fbgemm_pack_matrix_cache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fbgemm_pack_matrix_cache.h; sourceTree = ""; }; - 0C12EA0F2616383B00B66C86 /* im2col_dnnlowp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = im2col_dnnlowp.h; sourceTree = ""; }; - 0C12EA102616383B00B66C86 /* fbgemm_pack_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fbgemm_pack_op.h; sourceTree = ""; }; - 0C12EA112616383B00B66C86 /* resize_nearest_dnnlowp_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = resize_nearest_dnnlowp_op.h; sourceTree = ""; }; - 0C12EA122616383B00B66C86 /* group_norm_dnnlowp_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = group_norm_dnnlowp_op.h; sourceTree = ""; }; - 0C12EA132616383B00B66C86 /* elementwise_dnnlowp_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = elementwise_dnnlowp_op.h; sourceTree = ""; }; - 0C12EA142616383B00B66C86 /* fb_fc_packed_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fb_fc_packed_op.h; sourceTree = ""; }; - 0C12EA152616383B00B66C86 /* relu_dnnlowp_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = relu_dnnlowp_op.h; sourceTree = ""; }; - 0C12EA162616383B00B66C86 /* spatial_batch_norm_dnnlowp_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = spatial_batch_norm_dnnlowp_op.h; sourceTree = ""; }; - 0C12EA172616383B00B66C86 /* dequantize_dnnlowp_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dequantize_dnnlowp_op.h; sourceTree = ""; }; - 0C12EA182616383B00B66C86 /* kl_minimization.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = kl_minimization.h; sourceTree = ""; }; - 0C12EA192616383B00B66C86 /* dynamic_histogram.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dynamic_histogram.h; sourceTree = ""; }; - 0C12EA1A2616383B00B66C86 /* tanh.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tanh.h; sourceTree = ""; }; - 0C12EA1B2616383B00B66C86 /* fbgemm_pack_blob.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fbgemm_pack_blob.h; sourceTree = ""; }; - 0C12EA1C2616383B00B66C86 /* resize_nearest_3d_dnnlowp_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = resize_nearest_3d_dnnlowp_op.h; sourceTree = ""; }; - 0C12EA1D2616383B00B66C86 /* int8_gen_quant_params.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = int8_gen_quant_params.h; sourceTree = ""; }; - 0C12EA1E2616383B00B66C86 /* conv_dnnlowp_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = conv_dnnlowp_op.h; sourceTree = ""; }; - 0C12EA1F2616383B00B66C86 /* sigmoid.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sigmoid.h; sourceTree = ""; }; - 0C12EA202616383B00B66C86 /* channel_shuffle_dnnlowp_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = channel_shuffle_dnnlowp_op.h; sourceTree = ""; }; - 0C12EA212616383B00B66C86 /* int8_gen_quant_params_min_max.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = int8_gen_quant_params_min_max.h; sourceTree = ""; }; - 0C12EA222616383B00B66C86 /* quantization_error_minimization.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = quantization_error_minimization.h; sourceTree = ""; }; - 0C12EA232616383B00B66C86 /* elementwise_linear_dnnlowp_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = elementwise_linear_dnnlowp_op.h; sourceTree = ""; }; - 0C12EA242616383B00B66C86 /* dnnlowp_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dnnlowp_op.h; sourceTree = ""; }; - 0C12EA252616383B00B66C86 /* l2_minimization.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = l2_minimization.h; sourceTree = ""; }; - 0C12EA262616383B00B66C86 /* dnnlowp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dnnlowp.h; sourceTree = ""; }; - 0C12EA272616383B00B66C86 /* conv_dnnlowp_acc16_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = conv_dnnlowp_acc16_op.h; sourceTree = ""; }; - 0C12EA282616383B00B66C86 /* transpose.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = transpose.h; sourceTree = ""; }; - 0C12EA292616383B00B66C86 /* pool_dnnlowp_op_avx2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pool_dnnlowp_op_avx2.h; sourceTree = ""; }; - 0C12EA2A2616383B00B66C86 /* fully_connected_dnnlowp_acc16_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fully_connected_dnnlowp_acc16_op.h; sourceTree = ""; }; - 0C12EA2C2616383B00B66C86 /* single_op_transform.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = single_op_transform.h; sourceTree = ""; }; - 0C12EA2D2616383B00B66C86 /* common_subexpression_elimination.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = common_subexpression_elimination.h; sourceTree = ""; }; - 0C12EA2E2616383B00B66C86 /* conv_to_nnpack_transform.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = conv_to_nnpack_transform.h; sourceTree = ""; }; - 0C12EA2F2616383B00B66C86 /* pattern_net_transform.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pattern_net_transform.h; sourceTree = ""; }; - 0C12EA342616383B00B66C86 /* libopencl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = libopencl.h; sourceTree = ""; }; - 0C12EA362616383B00B66C86 /* cl_platform.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cl_platform.h; sourceTree = ""; }; - 0C12EA372616383B00B66C86 /* opencl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = opencl.h; sourceTree = ""; }; - 0C12EA382616383B00B66C86 /* cl_ext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cl_ext.h; sourceTree = ""; }; - 0C12EA392616383B00B66C86 /* cl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cl.h; sourceTree = ""; }; - 0C12EA3A2616383B00B66C86 /* cl_gl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cl_gl.h; sourceTree = ""; }; - 0C12EA3B2616383B00B66C86 /* cl_gl_ext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cl_gl_ext.h; sourceTree = ""; }; - 0C12EA3E2616383B00B66C86 /* ios_caffe_defines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ios_caffe_defines.h; sourceTree = ""; }; - 0C12EA402616383B00B66C86 /* mpscnn_graph_mask.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mpscnn_graph_mask.h; sourceTree = ""; }; - 0C12EA412616383B00B66C86 /* mpscnn.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mpscnn.h; sourceTree = ""; }; - 0C12EA422616383B00B66C86 /* mpscnn_test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mpscnn_test.h; sourceTree = ""; }; - 0C12EA432616383B00B66C86 /* mpscnn_kernels.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mpscnn_kernels.h; sourceTree = ""; }; - 0C12EA442616383B00B66C86 /* mpscnn_context.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mpscnn_context.h; sourceTree = ""; }; - 0C12EA452616383B00B66C86 /* ios_caffe.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ios_caffe.h; sourceTree = ""; }; - 0C12EA462616383B00B66C86 /* ios_caffe_predictor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ios_caffe_predictor.h; sourceTree = ""; }; - 0C12EA482616383B00B66C86 /* snpe_ffi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = snpe_ffi.h; sourceTree = ""; }; - 0C12EA4A2616383B00B66C86 /* nnapi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = nnapi.h; sourceTree = ""; }; - 0C12EA4B2616383B00B66C86 /* NeuralNetworks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NeuralNetworks.h; sourceTree = ""; }; - 0C12EA4C2616383B00B66C86 /* dlnnapi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dlnnapi.h; sourceTree = ""; }; - 0C12EA4E2616383B00B66C86 /* ulp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ulp.h; sourceTree = ""; }; - 0C12EA4F2616383B00B66C86 /* ulp_neon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ulp_neon.h; sourceTree = ""; }; - 0C12EA522616383B00B66C86 /* libvulkan-stub.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "libvulkan-stub.h"; sourceTree = ""; }; - 0C12EA542616383B00B66C86 /* vulkan.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vulkan.h; sourceTree = ""; }; - 0C12EA552616383B00B66C86 /* vk_platform.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vk_platform.h; sourceTree = ""; }; - 0C12EA582616383B00B66C86 /* fp16_momentum_sgd_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fp16_momentum_sgd_op.h; sourceTree = ""; }; - 0C12EA592616383B00B66C86 /* rmsprop_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rmsprop_op.h; sourceTree = ""; }; - 0C12EA5A2616383B00B66C86 /* lars_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lars_op.h; sourceTree = ""; }; - 0C12EA5B2616383B00B66C86 /* yellowfin_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = yellowfin_op.h; sourceTree = ""; }; - 0C12EA5C2616383B00B66C86 /* math_lp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = math_lp.h; sourceTree = ""; }; - 0C12EA5D2616383B00B66C86 /* storm_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = storm_op.h; sourceTree = ""; }; - 0C12EA5E2616383B00B66C86 /* adagrad_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = adagrad_op.h; sourceTree = ""; }; - 0C12EA5F2616383B00B66C86 /* clip_tensor_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = clip_tensor_op.h; sourceTree = ""; }; - 0C12EA602616383B00B66C86 /* gftrl_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gftrl_op.h; sourceTree = ""; }; - 0C12EA612616383B00B66C86 /* adadelta_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = adadelta_op.h; sourceTree = ""; }; - 0C12EA622616383B00B66C86 /* learning_rate_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = learning_rate_op.h; sourceTree = ""; }; - 0C12EA632616383B00B66C86 /* adagrad_fused.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = adagrad_fused.h; sourceTree = ""; }; - 0C12EA642616383B00B66C86 /* adam_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = adam_op.h; sourceTree = ""; }; - 0C12EA652616383B00B66C86 /* ftrl_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ftrl_op.h; sourceTree = ""; }; - 0C12EA662616383B00B66C86 /* weight_scale_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = weight_scale_op.h; sourceTree = ""; }; - 0C12EA672616383B00B66C86 /* learning_rate_adaption_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = learning_rate_adaption_op.h; sourceTree = ""; }; - 0C12EA682616383B00B66C86 /* rowwise_counter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rowwise_counter.h; sourceTree = ""; }; - 0C12EA692616383B00B66C86 /* iter_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iter_op.h; sourceTree = ""; }; - 0C12EA6A2616383B00B66C86 /* rowwise_adagrad_fused.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rowwise_adagrad_fused.h; sourceTree = ""; }; - 0C12EA6B2616383B00B66C86 /* momentum_sgd_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = momentum_sgd_op.h; sourceTree = ""; }; - 0C12EA6C2616383B00B66C86 /* wngrad_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wngrad_op.h; sourceTree = ""; }; - 0C12EA6D2616383B00B66C86 /* decay_adagrad_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = decay_adagrad_op.h; sourceTree = ""; }; - 0C12EA6E2616383B00B66C86 /* learning_rate_functors.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = learning_rate_functors.h; sourceTree = ""; }; - 0C12EA6F2616383B00B66C86 /* fp32_momentum_sgd_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fp32_momentum_sgd_op.h; sourceTree = ""; }; - 0C12EA712616383B00B66C86 /* blobs_queue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blobs_queue.h; sourceTree = ""; }; - 0C12EA722616383B00B66C86 /* rebatching_queue_ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rebatching_queue_ops.h; sourceTree = ""; }; - 0C12EA732616383B00B66C86 /* queue_ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = queue_ops.h; sourceTree = ""; }; - 0C12EA742616383B00B66C86 /* rebatching_queue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rebatching_queue.h; sourceTree = ""; }; - 0C12EA752616383B00B66C86 /* blobs_queue_db.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blobs_queue_db.h; sourceTree = ""; }; - 0C12EA772616383B00B66C86 /* create_db_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = create_db_op.h; sourceTree = ""; }; - 0C12EA7B2616383B00B66C86 /* ast.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ast.h; sourceTree = ""; }; - 0C12EA7C2616383B00B66C86 /* graphmatcher.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = graphmatcher.h; sourceTree = ""; }; - 0C12EA7D2616383B00B66C86 /* device.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = device.h; sourceTree = ""; }; - 0C12EA7E2616383B00B66C86 /* annotations.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = annotations.h; sourceTree = ""; }; - 0C12EA7F2616383B00B66C86 /* mobile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mobile.h; sourceTree = ""; }; - 0C12EA802616383B00B66C86 /* onnxifi_transformer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = onnxifi_transformer.h; sourceTree = ""; }; - 0C12EA812616383B00B66C86 /* converter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = converter.h; sourceTree = ""; }; - 0C12EA822616383B00B66C86 /* backend_transformer_base.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = backend_transformer_base.h; sourceTree = ""; }; - 0C12EA832616383B00B66C86 /* fakefp16_transform.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fakefp16_transform.h; sourceTree = ""; }; - 0C12EA842616383B00B66C86 /* fusion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fusion.h; sourceTree = ""; }; - 0C12EA852616383B00B66C86 /* shape_info.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = shape_info.h; sourceTree = ""; }; - 0C12EA862616383B00B66C86 /* optimizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = optimizer.h; sourceTree = ""; }; - 0C12EA872616383B00B66C86 /* glow_net_transform.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = glow_net_transform.h; sourceTree = ""; }; - 0C12EA882616383B00B66C86 /* backend_cutting.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = backend_cutting.h; sourceTree = ""; }; - 0C12EA892616383B00B66C86 /* distributed.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = distributed.h; sourceTree = ""; }; - 0C12EA8A2616383B00B66C86 /* onnxifi_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = onnxifi_op.h; sourceTree = ""; }; - 0C12EA8B2616383B00B66C86 /* tvm_transformer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tvm_transformer.h; sourceTree = ""; }; - 0C12EA8C2616383B00B66C86 /* passes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = passes.h; sourceTree = ""; }; - 0C12EA8D2616383B00B66C86 /* bound_shape_inferencer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bound_shape_inferencer.h; sourceTree = ""; }; - 0C12EA8F2616383B00B66C86 /* concat_elim.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = concat_elim.h; sourceTree = ""; }; - 0C12EA902616383B00B66C86 /* pointwise_elim.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pointwise_elim.h; sourceTree = ""; }; - 0C12EA912616383B00B66C86 /* freeze_quantization_params.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = freeze_quantization_params.h; sourceTree = ""; }; - 0C12EA922616383B00B66C86 /* in_batch_broadcast.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = in_batch_broadcast.h; sourceTree = ""; }; - 0C12EA932616383B00B66C86 /* cc_amrc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cc_amrc.h; sourceTree = ""; }; - 0C12EA942616383B00B66C86 /* onnx_convert.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = onnx_convert.h; sourceTree = ""; }; - 0C12EA952616383B00B66C86 /* optimize_ideep.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = optimize_ideep.h; sourceTree = ""; }; - 0C12EA972616383B00B66C86 /* ThreadLocalPtr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ThreadLocalPtr.h; sourceTree = ""; }; - 0C12EA982616383B00B66C86 /* InferenceGraph.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InferenceGraph.h; sourceTree = ""; }; - 0C12EA992616383B00B66C86 /* predictor_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = predictor_utils.h; sourceTree = ""; }; - 0C12EA9A2616383B00B66C86 /* predictor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = predictor.h; sourceTree = ""; }; - 0C12EA9B2616383B00B66C86 /* predictor_config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = predictor_config.h; sourceTree = ""; }; - 0C12EA9D2616383B00B66C86 /* data_filler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = data_filler.h; sourceTree = ""; }; - 0C12EA9E2616383B00B66C86 /* utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = utils.h; sourceTree = ""; }; - 0C12EA9F2616383B00B66C86 /* net_supplier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = net_supplier.h; sourceTree = ""; }; - 0C12EAA02616383B00B66C86 /* time_profiler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = time_profiler.h; sourceTree = ""; }; - 0C12EAA12616383B00B66C86 /* emulator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = emulator.h; sourceTree = ""; }; - 0C12EAA22616383B00B66C86 /* output_formatter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = output_formatter.h; sourceTree = ""; }; - 0C12EAA32616383B00B66C86 /* std_output_formatter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = std_output_formatter.h; sourceTree = ""; }; - 0C12EAA42616383B00B66C86 /* benchmark.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = benchmark.h; sourceTree = ""; }; - 0C12EAA52616383B00B66C86 /* profiler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = profiler.h; sourceTree = ""; }; - 0C12EAA62616383B00B66C86 /* transforms.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = transforms.h; sourceTree = ""; }; - 0C12EAA82616383B00B66C86 /* operator_attaching_net_observer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = operator_attaching_net_observer.h; sourceTree = ""; }; - 0C12EAA92616383B00B66C86 /* time_observer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = time_observer.h; sourceTree = ""; }; - 0C12EAAA2616383B00B66C86 /* runcnt_observer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = runcnt_observer.h; sourceTree = ""; }; - 0C12EAAB2616383B00B66C86 /* profile_observer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = profile_observer.h; sourceTree = ""; }; - 0C12EAB12616383B00B66C86 /* quant_decomp_zstd_op.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = quant_decomp_zstd_op.h; sourceTree = ""; }; - 0C12EAB22616383B00B66C86 /* cpuinfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cpuinfo.h; sourceTree = ""; }; - 0C12EAB52616383B00B66C86 /* Size.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Size.h; sourceTree = ""; }; - 0C12EAB62616383B00B66C86 /* utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = utils.h; sourceTree = ""; }; - 0C12EAB72616383B00B66C86 /* Device.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Device.h; sourceTree = ""; }; - 0C12EAB92616383B00B66C86 /* init.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = init.h; sourceTree = ""; }; - 0C12EABA2616383B00B66C86 /* onnx.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = onnx.h; sourceTree = ""; }; - 0C12EABB2616383B00B66C86 /* Types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Types.h; sourceTree = ""; }; - 0C12EABE2616383B00B66C86 /* utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = utils.h; sourceTree = ""; }; - 0C12EAC02616383B00B66C86 /* container.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = container.h; sourceTree = ""; }; - 0C12EAC12616383B00B66C86 /* context.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = context.h; sourceTree = ""; }; - 0C12EAC32616383B00B66C86 /* cleanup_autograd_context_req.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cleanup_autograd_context_req.h; sourceTree = ""; }; - 0C12EAC42616383B00B66C86 /* cleanup_autograd_context_resp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cleanup_autograd_context_resp.h; sourceTree = ""; }; - 0C12EAC52616383B00B66C86 /* rref_backward_req.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rref_backward_req.h; sourceTree = ""; }; - 0C12EAC62616383B00B66C86 /* rpc_with_profiling_req.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rpc_with_profiling_req.h; sourceTree = ""; }; - 0C12EAC72616383B00B66C86 /* propagate_gradients_resp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = propagate_gradients_resp.h; sourceTree = ""; }; - 0C12EAC82616383B00B66C86 /* propagate_gradients_req.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = propagate_gradients_req.h; sourceTree = ""; }; - 0C12EAC92616383B00B66C86 /* autograd_metadata.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = autograd_metadata.h; sourceTree = ""; }; - 0C12EACA2616383B00B66C86 /* rpc_with_autograd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rpc_with_autograd.h; sourceTree = ""; }; - 0C12EACB2616383B00B66C86 /* rref_backward_resp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rref_backward_resp.h; sourceTree = ""; }; - 0C12EACC2616383B00B66C86 /* rpc_with_profiling_resp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rpc_with_profiling_resp.h; sourceTree = ""; }; - 0C12EACD2616383B00B66C86 /* python_autograd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = python_autograd.h; sourceTree = ""; }; - 0C12EACE2616383B00B66C86 /* autograd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = autograd.h; sourceTree = ""; }; - 0C12EAD02616383B00B66C86 /* sendrpc_backward.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sendrpc_backward.h; sourceTree = ""; }; - 0C12EAD12616383B00B66C86 /* recvrpc_backward.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = recvrpc_backward.h; sourceTree = ""; }; - 0C12EAD32616383B00B66C86 /* dist_engine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dist_engine.h; sourceTree = ""; }; - 0C12EAD62616383B00B66C86 /* RpcMetricsHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RpcMetricsHandler.h; sourceTree = ""; }; - 0C12EAD72616383B00B66C86 /* utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = utils.h; sourceTree = ""; }; - 0C12EAD82616383B00B66C86 /* rref_context.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rref_context.h; sourceTree = ""; }; - 0C12EAD92616383B00B66C86 /* request_callback_impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = request_callback_impl.h; sourceTree = ""; }; - 0C12EADA2616383B00B66C86 /* python_resp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = python_resp.h; sourceTree = ""; }; - 0C12EADB2616383B00B66C86 /* rref_impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rref_impl.h; sourceTree = ""; }; - 0C12EADC2616383B00B66C86 /* request_callback.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = request_callback.h; sourceTree = ""; }; - 0C12EADD2616383B00B66C86 /* types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = types.h; sourceTree = ""; }; - 0C12EADE2616383B00B66C86 /* rref_proto.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rref_proto.h; sourceTree = ""; }; - 0C12EADF2616383B00B66C86 /* py_rref.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = py_rref.h; sourceTree = ""; }; - 0C12EAE02616383B00B66C86 /* rpc_agent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rpc_agent.h; sourceTree = ""; }; - 0C12EAE12616383B00B66C86 /* python_functions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = python_functions.h; sourceTree = ""; }; - 0C12EAE22616383B00B66C86 /* message.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = message.h; sourceTree = ""; }; - 0C12EAE32616383B00B66C86 /* request_callback_no_python.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = request_callback_no_python.h; sourceTree = ""; }; - 0C12EAE42616383B00B66C86 /* python_remote_call.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = python_remote_call.h; sourceTree = ""; }; - 0C12EAE52616383B00B66C86 /* python_call.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = python_call.h; sourceTree = ""; }; - 0C12EAE62616383B00B66C86 /* tensorpipe_agent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tensorpipe_agent.h; sourceTree = ""; }; - 0C12EAE72616383B00B66C86 /* script_remote_call.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = script_remote_call.h; sourceTree = ""; }; - 0C12EAE92616383B00B66C86 /* testing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = testing.h; sourceTree = ""; }; - 0C12EAEA2616383B00B66C86 /* faulty_process_group_agent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = faulty_process_group_agent.h; sourceTree = ""; }; - 0C12EAEB2616383B00B66C86 /* macros.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = macros.h; sourceTree = ""; }; - 0C12EAEC2616383B00B66C86 /* script_resp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = script_resp.h; sourceTree = ""; }; - 0C12EAED2616383B00B66C86 /* rpc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rpc.h; sourceTree = ""; }; - 0C12EAEE2616383B00B66C86 /* rpc_command_base.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rpc_command_base.h; sourceTree = ""; }; - 0C12EAF02616383B00B66C86 /* remote_profiler_manager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = remote_profiler_manager.h; sourceTree = ""; }; - 0C12EAF12616383B00B66C86 /* server_process_global_profiler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = server_process_global_profiler.h; sourceTree = ""; }; - 0C12EAF22616383B00B66C86 /* script_call.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = script_call.h; sourceTree = ""; }; - 0C12EAF32616383B00B66C86 /* unpickled_python_remote_call.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = unpickled_python_remote_call.h; sourceTree = ""; }; - 0C12EAF42616383B00B66C86 /* torchscript_functions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = torchscript_functions.h; sourceTree = ""; }; - 0C12EAF52616383B00B66C86 /* unpickled_python_call.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = unpickled_python_call.h; sourceTree = ""; }; - 0C12EAF62616383B00B66C86 /* tensorpipe_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tensorpipe_utils.h; sourceTree = ""; }; - 0C12EAF72616383B00B66C86 /* agent_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = agent_utils.h; sourceTree = ""; }; - 0C12EAF82616383B00B66C86 /* process_group_agent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = process_group_agent.h; sourceTree = ""; }; - 0C12EAF92616383B00B66C86 /* python_rpc_handler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = python_rpc_handler.h; sourceTree = ""; }; - 0C12EAFB2616383B00B66C86 /* python_comm_hook.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = python_comm_hook.h; sourceTree = ""; }; - 0C12EAFC2616383B00B66C86 /* c10d.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = c10d.h; sourceTree = ""; }; - 0C12EAFF2616383B00B66C86 /* python_functions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = python_functions.h; sourceTree = ""; }; - 0C12EB002616383B00B66C86 /* Functions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Functions.h; sourceTree = ""; }; - 0C12EB012616383B00B66C86 /* variable_factories.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = variable_factories.h; sourceTree = ""; }; - 0C12EB022616383B00B66C86 /* python_function.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = python_function.h; sourceTree = ""; }; - 0C12EB032616383B00B66C86 /* custom_function.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = custom_function.h; sourceTree = ""; }; - 0C12EB042616383B00B66C86 /* python_linalg_functions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = python_linalg_functions.h; sourceTree = ""; }; - 0C12EB052616383B00B66C86 /* record_function_ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = record_function_ops.h; sourceTree = ""; }; - 0C12EB062616383B00B66C86 /* engine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = engine.h; sourceTree = ""; }; - 0C12EB072616383B00B66C86 /* edge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = edge.h; sourceTree = ""; }; - 0C12EB082616383B00B66C86 /* saved_variable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = saved_variable.h; sourceTree = ""; }; - 0C12EB092616383B00B66C86 /* python_engine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = python_engine.h; sourceTree = ""; }; - 0C12EB0A2616383B00B66C86 /* python_legacy_variable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = python_legacy_variable.h; sourceTree = ""; }; - 0C12EB0B2616383B00B66C86 /* python_cpp_function.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = python_cpp_function.h; sourceTree = ""; }; - 0C12EB0C2616383B00B66C86 /* python_hook.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = python_hook.h; sourceTree = ""; }; - 0C12EB0D2616383B00B66C86 /* VariableTypeUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VariableTypeUtils.h; sourceTree = ""; }; - 0C12EB0E2616383B00B66C86 /* python_autograd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = python_autograd.h; sourceTree = ""; }; - 0C12EB0F2616383B00B66C86 /* profiler_kineto.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = profiler_kineto.h; sourceTree = ""; }; - 0C12EB102616383B00B66C86 /* variable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = variable.h; sourceTree = ""; }; - 0C12EB122616383B00B66C86 /* wrap_outputs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wrap_outputs.h; sourceTree = ""; }; - 0C12EB132616383B00B66C86 /* python_arg_parsing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = python_arg_parsing.h; sourceTree = ""; }; - 0C12EB142616383B00B66C86 /* grad_layout_contract.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = grad_layout_contract.h; sourceTree = ""; }; - 0C12EB152616383B00B66C86 /* lambda_post_hook.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lambda_post_hook.h; sourceTree = ""; }; - 0C12EB162616383B00B66C86 /* error_messages.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = error_messages.h; sourceTree = ""; }; - 0C12EB172616383B00B66C86 /* python_fft_functions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = python_fft_functions.h; sourceTree = ""; }; - 0C12EB182616383B00B66C86 /* python_variable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = python_variable.h; sourceTree = ""; }; - 0C12EB192616383B00B66C86 /* function_hook.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = function_hook.h; sourceTree = ""; }; - 0C12EB1A2616383B00B66C86 /* input_metadata.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = input_metadata.h; sourceTree = ""; }; - 0C12EB1B2616383B00B66C86 /* grad_mode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = grad_mode.h; sourceTree = ""; }; - 0C12EB1C2616383B00B66C86 /* symbolic.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = symbolic.h; sourceTree = ""; }; - 0C12EB1D2616383B00B66C86 /* input_buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = input_buffer.h; sourceTree = ""; }; - 0C12EB1E2616383B00B66C86 /* profiler_legacy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = profiler_legacy.h; sourceTree = ""; }; - 0C12EB1F2616383B00B66C86 /* autograd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = autograd.h; sourceTree = ""; }; - 0C12EB202616383B00B66C86 /* cpp_hook.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cpp_hook.h; sourceTree = ""; }; - 0C12EB222616383B00B66C86 /* utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = utils.h; sourceTree = ""; }; - 0C12EB232616383B00B66C86 /* pybind.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pybind.h; sourceTree = ""; }; - 0C12EB242616383B00B66C86 /* comm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = comm.h; sourceTree = ""; }; - 0C12EB252616383B00B66C86 /* basic_ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = basic_ops.h; sourceTree = ""; }; - 0C12EB262616383B00B66C86 /* accumulate_grad.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = accumulate_grad.h; sourceTree = ""; }; - 0C12EB272616383B00B66C86 /* tensor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tensor.h; sourceTree = ""; }; - 0C12EB282616383B00B66C86 /* python_special_functions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = python_special_functions.h; sourceTree = ""; }; - 0C12EB292616383B00B66C86 /* FunctionsManual.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FunctionsManual.h; sourceTree = ""; }; - 0C12EB2A2616383B00B66C86 /* forward_grad.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = forward_grad.h; sourceTree = ""; }; - 0C12EB2B2616383B00B66C86 /* python_anomaly_mode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = python_anomaly_mode.h; sourceTree = ""; }; - 0C12EB2C2616383B00B66C86 /* python_nn_functions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = python_nn_functions.h; sourceTree = ""; }; - 0C12EB2D2616383B00B66C86 /* InferenceMode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InferenceMode.h; sourceTree = ""; }; - 0C12EB2E2616383B00B66C86 /* python_variable_indexing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = python_variable_indexing.h; sourceTree = ""; }; - 0C12EB2F2616383B00B66C86 /* profiler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = profiler.h; sourceTree = ""; }; - 0C12EB302616383B00B66C86 /* function.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = function.h; sourceTree = ""; }; - 0C12EB312616383B00B66C86 /* anomaly_mode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = anomaly_mode.h; sourceTree = ""; }; - 0C12EB322616383B00B66C86 /* profiler_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = profiler_utils.h; sourceTree = ""; }; - 0C12EB352616383B00B66C86 /* interpreter_impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = interpreter_impl.h; sourceTree = ""; }; - 0C12EB382616383B00B66C86 /* deploy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = deploy.h; sourceTree = ""; }; - 0C12EB3A2616383B00B66C86 /* init.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = init.h; sourceTree = ""; }; - 0C12EB3C2616383B00B66C86 /* utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = utils.h; sourceTree = ""; }; - 0C12EB3D2616383B00B66C86 /* THCP.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = THCP.h; sourceTree = ""; }; - 0C12EB3E2616383B00B66C86 /* nccl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = nccl.h; sourceTree = ""; }; - 0C12EB3F2616383B00B66C86 /* python_nccl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = python_nccl.h; sourceTree = ""; }; - 0C12EB402616383B00B66C86 /* device_set.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = device_set.h; sourceTree = ""; }; - 0C12EB412616383B00B66C86 /* Event.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Event.h; sourceTree = ""; }; - 0C12EB422616383B00B66C86 /* serialization.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = serialization.h; sourceTree = ""; }; - 0C12EB432616383B00B66C86 /* python_comm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = python_comm.h; sourceTree = ""; }; - 0C12EB442616383B00B66C86 /* comm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = comm.h; sourceTree = ""; }; - 0C12EB452616383B00B66C86 /* Stream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Stream.h; sourceTree = ""; }; - 0C12EB472616383B00B66C86 /* undef_macros.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = undef_macros.h; sourceTree = ""; }; - 0C12EB482616383B00B66C86 /* restore_macros.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = restore_macros.h; sourceTree = ""; }; - 0C12EB492616383B00B66C86 /* Storage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Storage.h; sourceTree = ""; }; - 0C12EB4A2616383B00B66C86 /* Module.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Module.h; sourceTree = ""; }; - 0C12EB4B2616383B00B66C86 /* override_macros.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = override_macros.h; sourceTree = ""; }; - 0C12EB4C2616383B00B66C86 /* serialization.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = serialization.h; sourceTree = ""; }; - 0C12EB4D2616383B00B66C86 /* Exceptions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Exceptions.h; sourceTree = ""; }; - 0C12EB4E2616383B00B66C86 /* QScheme.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QScheme.h; sourceTree = ""; }; - 0C12EB502616383B00B66C86 /* object_ptr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = object_ptr.h; sourceTree = ""; }; - 0C12EB512616383B00B66C86 /* tensor_numpy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tensor_numpy.h; sourceTree = ""; }; - 0C12EB522616383B00B66C86 /* tensor_dtypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tensor_dtypes.h; sourceTree = ""; }; - 0C12EB532616383B00B66C86 /* python_tuples.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = python_tuples.h; sourceTree = ""; }; - 0C12EB542616383B00B66C86 /* python_numbers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = python_numbers.h; sourceTree = ""; }; - 0C12EB552616383B00B66C86 /* python_scalars.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = python_scalars.h; sourceTree = ""; }; - 0C12EB562616383B00B66C86 /* pybind.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pybind.h; sourceTree = ""; }; - 0C12EB572616383B00B66C86 /* tensor_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tensor_types.h; sourceTree = ""; }; - 0C12EB582616383B00B66C86 /* tensor_memoryformats.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tensor_memoryformats.h; sourceTree = ""; }; - 0C12EB592616383B00B66C86 /* python_arg_parser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = python_arg_parser.h; sourceTree = ""; }; - 0C12EB5A2616383B00B66C86 /* cuda_lazy_init.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cuda_lazy_init.h; sourceTree = ""; }; - 0C12EB5B2616383B00B66C86 /* tensor_new.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tensor_new.h; sourceTree = ""; }; - 0C12EB5C2616383B00B66C86 /* tensor_qschemes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tensor_qschemes.h; sourceTree = ""; }; - 0C12EB5D2616383B00B66C86 /* python_dispatch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = python_dispatch.h; sourceTree = ""; }; - 0C12EB5E2616383B00B66C86 /* tensor_list.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tensor_list.h; sourceTree = ""; }; - 0C12EB5F2616383B00B66C86 /* invalid_arguments.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = invalid_arguments.h; sourceTree = ""; }; - 0C12EB602616383B00B66C86 /* auto_gil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = auto_gil.h; sourceTree = ""; }; - 0C12EB612616383B00B66C86 /* python_strings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = python_strings.h; sourceTree = ""; }; - 0C12EB622616383B00B66C86 /* byte_order.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = byte_order.h; sourceTree = ""; }; - 0C12EB632616383B00B66C86 /* pycfunction_helpers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pycfunction_helpers.h; sourceTree = ""; }; - 0C12EB642616383B00B66C86 /* cuda_enabled.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cuda_enabled.h; sourceTree = ""; }; - 0C12EB652616383B00B66C86 /* numpy_stub.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = numpy_stub.h; sourceTree = ""; }; - 0C12EB662616383B00B66C86 /* out_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = out_types.h; sourceTree = ""; }; - 0C12EB672616383B00B66C86 /* memory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = memory.h; sourceTree = ""; }; - 0C12EB682616383B00B66C86 /* tensor_layouts.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tensor_layouts.h; sourceTree = ""; }; - 0C12EB692616383B00B66C86 /* structseq.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = structseq.h; sourceTree = ""; }; - 0C12EB6A2616383B00B66C86 /* throughput_benchmark.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = throughput_benchmark.h; sourceTree = ""; }; - 0C12EB6B2616383B00B66C86 /* disable_torch_function.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = disable_torch_function.h; sourceTree = ""; }; - 0C12EB6C2616383B00B66C86 /* throughput_benchmark-inl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "throughput_benchmark-inl.h"; sourceTree = ""; }; - 0C12EB6D2616383B00B66C86 /* tensor_flatten.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tensor_flatten.h; sourceTree = ""; }; - 0C12EB6E2616383B00B66C86 /* tensor_apply.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tensor_apply.h; sourceTree = ""; }; - 0C12EB6F2616383B00B66C86 /* init.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = init.h; sourceTree = ""; }; - 0C12EB702616383B00B66C86 /* python_compat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = python_compat.h; sourceTree = ""; }; - 0C12EB712616383B00B66C86 /* disallow_copy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = disallow_copy.h; sourceTree = ""; }; - 0C12EB722616383B00B66C86 /* six.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = six.h; sourceTree = ""; }; - 0C12EB732616383B00B66C86 /* python_stub.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = python_stub.h; sourceTree = ""; }; - 0C12EB742616383B00B66C86 /* variadic.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = variadic.h; sourceTree = ""; }; - 0C12EB752616383B00B66C86 /* Stream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Stream.h; sourceTree = ""; }; - 0C12EB762616383B00B66C86 /* StorageDefs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StorageDefs.h; sourceTree = ""; }; - 0C12EB772616383B00B66C86 /* DataLoader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DataLoader.h; sourceTree = ""; }; - 0C12EB782616383B00B66C86 /* THP.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = THP.h; sourceTree = ""; }; - 0C12EB792616383B00B66C86 /* python_headers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = python_headers.h; sourceTree = ""; }; - 0C12EB7A2616383B00B66C86 /* Layout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Layout.h; sourceTree = ""; }; - 0C12EB7B2616383B00B66C86 /* DynamicTypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DynamicTypes.h; sourceTree = ""; }; - 0C12EB7C2616383B00B66C86 /* copy_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = copy_utils.h; sourceTree = ""; }; - 0C12EB7F2616383B00B66C86 /* jit_opt_limit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = jit_opt_limit.h; sourceTree = ""; }; - 0C12EB812616383B00B66C86 /* error_report.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = error_report.h; sourceTree = ""; }; - 0C12EB822616383B00B66C86 /* source_range.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = source_range.h; sourceTree = ""; }; - 0C12EB832616383B00B66C86 /* edit_distance.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = edit_distance.h; sourceTree = ""; }; - 0C12EB842616383B00B66C86 /* canonicalize_modified_loop.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = canonicalize_modified_loop.h; sourceTree = ""; }; - 0C12EB852616383B00B66C86 /* schema_matching.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = schema_matching.h; sourceTree = ""; }; - 0C12EB862616383B00B66C86 /* function_schema_parser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = function_schema_parser.h; sourceTree = ""; }; - 0C12EB872616383B00B66C86 /* tree_views.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tree_views.h; sourceTree = ""; }; - 0C12EB882616383B00B66C86 /* ir_emitter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ir_emitter.h; sourceTree = ""; }; - 0C12EB892616383B00B66C86 /* parser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = parser.h; sourceTree = ""; }; - 0C12EB8A2616383B00B66C86 /* strtod.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = strtod.h; sourceTree = ""; }; - 0C12EB8B2616383B00B66C86 /* tree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tree.h; sourceTree = ""; }; - 0C12EB8C2616383B00B66C86 /* concrete_module_type.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = concrete_module_type.h; sourceTree = ""; }; - 0C12EB8D2616383B00B66C86 /* builtin_functions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = builtin_functions.h; sourceTree = ""; }; - 0C12EB8E2616383B00B66C86 /* exit_transforms.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = exit_transforms.h; sourceTree = ""; }; - 0C12EB8F2616383B00B66C86 /* parse_string_literal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = parse_string_literal.h; sourceTree = ""; }; - 0C12EB902616383B00B66C86 /* sugared_value.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sugared_value.h; sourceTree = ""; }; - 0C12EB912616383B00B66C86 /* inline_loop_condition.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = inline_loop_condition.h; sourceTree = ""; }; - 0C12EB922616383B00B66C86 /* name_mangler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = name_mangler.h; sourceTree = ""; }; - 0C12EB932616383B00B66C86 /* code_template.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = code_template.h; sourceTree = ""; }; - 0C12EB942616383B00B66C86 /* tracer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tracer.h; sourceTree = ""; }; - 0C12EB952616383B00B66C86 /* resolver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = resolver.h; sourceTree = ""; }; - 0C12EB962616383B00B66C86 /* script_type_parser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = script_type_parser.h; sourceTree = ""; }; - 0C12EB972616383B00B66C86 /* schema_type_parser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = schema_type_parser.h; sourceTree = ""; }; - 0C12EB982616383B00B66C86 /* lexer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lexer.h; sourceTree = ""; }; - 0C12EB992616383B00B66C86 /* versioned_symbols.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = versioned_symbols.h; sourceTree = ""; }; - 0C12EB9A2616383B00B66C86 /* convert_to_ssa.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = convert_to_ssa.h; sourceTree = ""; }; - 0C12EB9B2616383B00B66C86 /* mini_environment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mini_environment.h; sourceTree = ""; }; - 0C12EB9C2616383B00B66C86 /* parser_constants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = parser_constants.h; sourceTree = ""; }; - 0C12EB9E2616383B00B66C86 /* pybind.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pybind.h; sourceTree = ""; }; - 0C12EB9F2616383B00B66C86 /* python_ir.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = python_ir.h; sourceTree = ""; }; - 0C12EBA02616383B00B66C86 /* script_init.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = script_init.h; sourceTree = ""; }; - 0C12EBA12616383B00B66C86 /* python_tree_views.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = python_tree_views.h; sourceTree = ""; }; - 0C12EBA22616383B00B66C86 /* python_ivalue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = python_ivalue.h; sourceTree = ""; }; - 0C12EBA32616383B00B66C86 /* python_custom_class.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = python_custom_class.h; sourceTree = ""; }; - 0C12EBA42616383B00B66C86 /* update_graph_executor_opt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = update_graph_executor_opt.h; sourceTree = ""; }; - 0C12EBA52616383B00B66C86 /* python_tracer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = python_tracer.h; sourceTree = ""; }; - 0C12EBA62616383B00B66C86 /* pybind_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pybind_utils.h; sourceTree = ""; }; - 0C12EBA72616383B00B66C86 /* init.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = init.h; sourceTree = ""; }; - 0C12EBA82616383B00B66C86 /* python_sugared_value.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = python_sugared_value.h; sourceTree = ""; }; - 0C12EBA92616383B00B66C86 /* python_arg_flatten.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = python_arg_flatten.h; sourceTree = ""; }; - 0C12EBAA2616383B00B66C86 /* module_python.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = module_python.h; sourceTree = ""; }; - 0C12EBAC2616383B00B66C86 /* ir_mutator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ir_mutator.h; sourceTree = ""; }; - 0C12EBAD2616383B00B66C86 /* ir_simplifier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ir_simplifier.h; sourceTree = ""; }; - 0C12EBAE2616383B00B66C86 /* ir_visitor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ir_visitor.h; sourceTree = ""; }; - 0C12EBAF2616383B00B66C86 /* llvm_jit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = llvm_jit.h; sourceTree = ""; }; - 0C12EBB02616383B00B66C86 /* tensorexpr_init.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tensorexpr_init.h; sourceTree = ""; }; - 0C12EBB12616383B00B66C86 /* types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = types.h; sourceTree = ""; }; - 0C12EBB22616383B00B66C86 /* mem_dependency_checker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mem_dependency_checker.h; sourceTree = ""; }; - 0C12EBB32616383B00B66C86 /* ir.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ir.h; sourceTree = ""; }; - 0C12EBB42616383B00B66C86 /* exceptions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = exceptions.h; sourceTree = ""; }; - 0C12EBB52616383B00B66C86 /* cuda_codegen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cuda_codegen.h; sourceTree = ""; }; - 0C12EBB62616383B00B66C86 /* hash_provider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hash_provider.h; sourceTree = ""; }; - 0C12EBB72616383B00B66C86 /* ir_printer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ir_printer.h; sourceTree = ""; }; - 0C12EBB82616383B00B66C86 /* llvm_codegen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = llvm_codegen.h; sourceTree = ""; }; - 0C12EBB92616383B00B66C86 /* expr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = expr.h; sourceTree = ""; }; - 0C12EBBA2616383B00B66C86 /* cuda_random.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cuda_random.h; sourceTree = ""; }; - 0C12EBBB2616383B00B66C86 /* execution_counter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = execution_counter.h; sourceTree = ""; }; - 0C12EBBC2616383B00B66C86 /* codegen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = codegen.h; sourceTree = ""; }; - 0C12EBBD2616383B00B66C86 /* unique_name_manager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = unique_name_manager.h; sourceTree = ""; }; - 0C12EBBE2616383B00B66C86 /* cpp_codegen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cpp_codegen.h; sourceTree = ""; }; - 0C12EBBF2616383B00B66C86 /* var_substitutor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = var_substitutor.h; sourceTree = ""; }; - 0C12EBC02616383B00B66C86 /* eval.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = eval.h; sourceTree = ""; }; - 0C12EBC12616383B00B66C86 /* bounds_inference.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bounds_inference.h; sourceTree = ""; }; - 0C12EBC22616383B00B66C86 /* intrinsic_symbols.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = intrinsic_symbols.h; sourceTree = ""; }; - 0C12EBC32616383B00B66C86 /* block_codegen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = block_codegen.h; sourceTree = ""; }; - 0C12EBC42616383B00B66C86 /* external_functions_registry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = external_functions_registry.h; sourceTree = ""; }; - 0C12EBC52616383B00B66C86 /* kernel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = kernel.h; sourceTree = ""; }; - 0C12EBC62616383B00B66C86 /* loopnest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = loopnest.h; sourceTree = ""; }; - 0C12EBC72616383B00B66C86 /* bounds_overlap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bounds_overlap.h; sourceTree = ""; }; - 0C12EBC82616383B00B66C86 /* ir_verifier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ir_verifier.h; sourceTree = ""; }; - 0C12EBC92616383B00B66C86 /* dim_arg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dim_arg.h; sourceTree = ""; }; - 0C12EBCA2616383B00B66C86 /* external_functions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = external_functions.h; sourceTree = ""; }; - 0C12EBCB2616383B00B66C86 /* stmt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stmt.h; sourceTree = ""; }; - 0C12EBCC2616383B00B66C86 /* half_support.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = half_support.h; sourceTree = ""; }; - 0C12EBCD2616383B00B66C86 /* registerizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = registerizer.h; sourceTree = ""; }; - 0C12EBCE2616383B00B66C86 /* reduction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = reduction.h; sourceTree = ""; }; - 0C12EBCF2616383B00B66C86 /* tensor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tensor.h; sourceTree = ""; }; - 0C12EBD02616383B00B66C86 /* mem_arena.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mem_arena.h; sourceTree = ""; }; - 0C12EBD12616383B00B66C86 /* analysis.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = analysis.h; sourceTree = ""; }; - 0C12EBD32616383B00B66C86 /* named_value.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = named_value.h; sourceTree = ""; }; - 0C12EBD42616383B00B66C86 /* irparser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = irparser.h; sourceTree = ""; }; - 0C12EBD52616383B00B66C86 /* ir.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ir.h; sourceTree = ""; }; - 0C12EBD62616383B00B66C86 /* graph_node_list.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = graph_node_list.h; sourceTree = ""; }; - 0C12EBD72616383B00B66C86 /* ir_views.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ir_views.h; sourceTree = ""; }; - 0C12EBD82616383B00B66C86 /* alias_analysis.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = alias_analysis.h; sourceTree = ""; }; - 0C12EBD92616383B00B66C86 /* attributes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = attributes.h; sourceTree = ""; }; - 0C12EBDA2616383B00B66C86 /* type_hashing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = type_hashing.h; sourceTree = ""; }; - 0C12EBDB2616383B00B66C86 /* constants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = constants.h; sourceTree = ""; }; - 0C12EBDC2616383B00B66C86 /* subgraph_matcher.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = subgraph_matcher.h; sourceTree = ""; }; - 0C12EBDD2616383B00B66C86 /* scope.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = scope.h; sourceTree = ""; }; - 0C12EBDE2616383B00B66C86 /* node_hashing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = node_hashing.h; sourceTree = ""; }; - 0C12EBE02616383B00B66C86 /* cuda.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cuda.h; sourceTree = ""; }; - 0C12EBE22616383B00B66C86 /* import_source.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = import_source.h; sourceTree = ""; }; - 0C12EBE32616383B00B66C86 /* export.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = export.h; sourceTree = ""; }; - 0C12EBE42616383B00B66C86 /* import_export_helpers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = import_export_helpers.h; sourceTree = ""; }; - 0C12EBE52616383B00B66C86 /* type_name_uniquer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = type_name_uniquer.h; sourceTree = ""; }; - 0C12EBE62616383B00B66C86 /* pickler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pickler.h; sourceTree = ""; }; - 0C12EBE72616383B00B66C86 /* python_print.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = python_print.h; sourceTree = ""; }; - 0C12EBE82616383B00B66C86 /* import_legacy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = import_legacy.h; sourceTree = ""; }; - 0C12EBE92616383B00B66C86 /* import_export_functions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = import_export_functions.h; sourceTree = ""; }; - 0C12EBEA2616383B00B66C86 /* pickle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pickle.h; sourceTree = ""; }; - 0C12EBEB2616383B00B66C86 /* import_export_constants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = import_export_constants.h; sourceTree = ""; }; - 0C12EBEC2616383B00B66C86 /* source_range_serialization_impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = source_range_serialization_impl.h; sourceTree = ""; }; - 0C12EBED2616383B00B66C86 /* import.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = import.h; sourceTree = ""; }; - 0C12EBEE2616383B00B66C86 /* unpickler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = unpickler.h; sourceTree = ""; }; - 0C12EBEF2616383B00B66C86 /* source_range_serialization.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = source_range_serialization.h; sourceTree = ""; }; - 0C12EBF02616383B00B66C86 /* onnx.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = onnx.h; sourceTree = ""; }; - 0C12EBF22616383B00B66C86 /* backend_interface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = backend_interface.h; sourceTree = ""; }; - 0C12EBF32616383B00B66C86 /* backend.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = backend.h; sourceTree = ""; }; - 0C12EBF42616383B00B66C86 /* backend_resolver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = backend_resolver.h; sourceTree = ""; }; - 0C12EBF52616383B00B66C86 /* backend_detail.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = backend_detail.h; sourceTree = ""; }; - 0C12EBF62616383B00B66C86 /* backend_init.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = backend_init.h; sourceTree = ""; }; - 0C12EBF82616383B00B66C86 /* slice_indices_adjust.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = slice_indices_adjust.h; sourceTree = ""; }; - 0C12EBF92616383B00B66C86 /* operator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = operator.h; sourceTree = ""; }; - 0C12EBFA2616383B00B66C86 /* interpreter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = interpreter.h; sourceTree = ""; }; - 0C12EBFB2616383B00B66C86 /* register_ops_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = register_ops_utils.h; sourceTree = ""; }; - 0C12EBFC2616383B00B66C86 /* jit_exception.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = jit_exception.h; sourceTree = ""; }; - 0C12EBFD2616383B00B66C86 /* exception_message.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = exception_message.h; sourceTree = ""; }; - 0C12EBFE2616383B00B66C86 /* argument_spec.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = argument_spec.h; sourceTree = ""; }; - 0C12EBFF2616383B00B66C86 /* logging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = logging.h; sourceTree = ""; }; - 0C12EC002616383B00B66C86 /* profiling_graph_executor_impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = profiling_graph_executor_impl.h; sourceTree = ""; }; - 0C12EC012616383B00B66C86 /* custom_operator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = custom_operator.h; sourceTree = ""; }; - 0C12EC032616383B00B66C86 /* fusion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fusion.h; sourceTree = ""; }; - 0C12EC042616383B00B66C86 /* passes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = passes.h; sourceTree = ""; }; - 0C12EC052616383B00B66C86 /* ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ops.h; sourceTree = ""; }; - 0C12EC062616383B00B66C86 /* impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = impl.h; sourceTree = ""; }; - 0C12EC072616383B00B66C86 /* init.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = init.h; sourceTree = ""; }; - 0C12EC082616383B00B66C86 /* vararg_functions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vararg_functions.h; sourceTree = ""; }; - 0C12EC092616383B00B66C86 /* symbolic_script.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = symbolic_script.h; sourceTree = ""; }; - 0C12EC0A2616383B00B66C86 /* variable_tensor_list.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = variable_tensor_list.h; sourceTree = ""; }; - 0C12EC0B2616383B00B66C86 /* autodiff.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = autodiff.h; sourceTree = ""; }; - 0C12EC0C2616383B00B66C86 /* print_handler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = print_handler.h; sourceTree = ""; }; - 0C12EC0D2616383B00B66C86 /* profiling_record.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = profiling_record.h; sourceTree = ""; }; - 0C12EC0E2616383B00B66C86 /* graph_executor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = graph_executor.h; sourceTree = ""; }; - 0C12EC0F2616383B00B66C86 /* operator_options.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = operator_options.h; sourceTree = ""; }; - 0C12EC102616383B00B66C86 /* instruction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = instruction.h; sourceTree = ""; }; - 0C12EC112616383B00B66C86 /* graph_executor_impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = graph_executor_impl.h; sourceTree = ""; }; - 0C12EC132616383B00B66C86 /* remove_expands.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = remove_expands.h; sourceTree = ""; }; - 0C12EC142616383B00B66C86 /* peephole_list_idioms.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = peephole_list_idioms.h; sourceTree = ""; }; - 0C12EC152616383B00B66C86 /* subgraph_rewrite.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = subgraph_rewrite.h; sourceTree = ""; }; - 0C12EC162616383B00B66C86 /* fuse_relu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fuse_relu.h; sourceTree = ""; }; - 0C12EC172616383B00B66C86 /* guard_elimination.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = guard_elimination.h; sourceTree = ""; }; - 0C12EC182616383B00B66C86 /* peephole_alias_sensitive.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = peephole_alias_sensitive.h; sourceTree = ""; }; - 0C12EC192616383B00B66C86 /* freeze_module.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = freeze_module.h; sourceTree = ""; }; - 0C12EC1A2616383B00B66C86 /* clear_undefinedness.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = clear_undefinedness.h; sourceTree = ""; }; - 0C12EC1B2616383B00B66C86 /* peephole.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = peephole.h; sourceTree = ""; }; - 0C12EC1C2616383B00B66C86 /* remove_dropout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = remove_dropout.h; sourceTree = ""; }; - 0C12EC1D2616383B00B66C86 /* update_differentiable_graph_requires_grad.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = update_differentiable_graph_requires_grad.h; sourceTree = ""; }; - 0C12EC1E2616383B00B66C86 /* metal_rewrite.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = metal_rewrite.h; sourceTree = ""; }; - 0C12EC1F2616383B00B66C86 /* liveness.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = liveness.h; sourceTree = ""; }; - 0C12EC212616383B00B66C86 /* eval_peephole.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = eval_peephole.h; sourceTree = ""; }; - 0C12EC222616383B00B66C86 /* function_substitution.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = function_substitution.h; sourceTree = ""; }; - 0C12EC232616383B00B66C86 /* helper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = helper.h; sourceTree = ""; }; - 0C12EC242616383B00B66C86 /* unpack_quantized_weights.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = unpack_quantized_weights.h; sourceTree = ""; }; - 0C12EC252616383B00B66C86 /* preprocess_for_onnx.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = preprocess_for_onnx.h; sourceTree = ""; }; - 0C12EC262616383B00B66C86 /* scalar_type_analysis.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = scalar_type_analysis.h; sourceTree = ""; }; - 0C12EC272616383B00B66C86 /* shape_type_inference.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = shape_type_inference.h; sourceTree = ""; }; - 0C12EC282616383B00B66C86 /* peephole.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = peephole.h; sourceTree = ""; }; - 0C12EC292616383B00B66C86 /* eliminate_unused_items.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = eliminate_unused_items.h; sourceTree = ""; }; - 0C12EC2A2616383B00B66C86 /* constant_fold.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = constant_fold.h; sourceTree = ""; }; - 0C12EC2B2616383B00B66C86 /* constant_map.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = constant_map.h; sourceTree = ""; }; - 0C12EC2C2616383B00B66C86 /* fixup_onnx_controlflow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fixup_onnx_controlflow.h; sourceTree = ""; }; - 0C12EC2D2616383B00B66C86 /* cast_all_constant_to_floating.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cast_all_constant_to_floating.h; sourceTree = ""; }; - 0C12EC2E2616383B00B66C86 /* fold_if_node.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fold_if_node.h; sourceTree = ""; }; - 0C12EC2F2616383B00B66C86 /* list_model_parameters.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = list_model_parameters.h; sourceTree = ""; }; - 0C12EC312616383B00B66C86 /* common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = common.h; sourceTree = ""; }; - 0C12EC322616383B00B66C86 /* pattern_conversion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pattern_conversion.h; sourceTree = ""; }; - 0C12EC332616383B00B66C86 /* pattern_encapsulation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pattern_encapsulation.h; sourceTree = ""; }; - 0C12EC342616383B00B66C86 /* remove_inplace_ops_for_onnx.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = remove_inplace_ops_for_onnx.h; sourceTree = ""; }; - 0C12EC352616383B00B66C86 /* prepare_division_for_onnx.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = prepare_division_for_onnx.h; sourceTree = ""; }; - 0C12EC362616383B00B66C86 /* remove_mutation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = remove_mutation.h; sourceTree = ""; }; - 0C12EC372616383B00B66C86 /* common_subexpression_elimination.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = common_subexpression_elimination.h; sourceTree = ""; }; - 0C12EC382616383B00B66C86 /* batch_mm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = batch_mm.h; sourceTree = ""; }; - 0C12EC392616383B00B66C86 /* constant_pooling.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = constant_pooling.h; sourceTree = ""; }; - 0C12EC3A2616383B00B66C86 /* canonicalize_graph_fuser_ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = canonicalize_graph_fuser_ops.h; sourceTree = ""; }; - 0C12EC3B2616383B00B66C86 /* fuse_linear.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fuse_linear.h; sourceTree = ""; }; - 0C12EC3C2616383B00B66C86 /* annotate_warns.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = annotate_warns.h; sourceTree = ""; }; - 0C12EC3D2616383B00B66C86 /* specialize_autogradzero.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = specialize_autogradzero.h; sourceTree = ""; }; - 0C12EC3E2616383B00B66C86 /* prepack_folding.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = prepack_folding.h; sourceTree = ""; }; - 0C12EC3F2616383B00B66C86 /* frozen_conv_folding.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = frozen_conv_folding.h; sourceTree = ""; }; - 0C12EC402616383B00B66C86 /* constant_propagation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = constant_propagation.h; sourceTree = ""; }; - 0C12EC412616383B00B66C86 /* insert_guards.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = insert_guards.h; sourceTree = ""; }; - 0C12EC432616383B00B66C86 /* memory_dag.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = memory_dag.h; sourceTree = ""; }; - 0C12EC442616383B00B66C86 /* subgraph_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = subgraph_utils.h; sourceTree = ""; }; - 0C12EC452616383B00B66C86 /* check_alias_annotation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = check_alias_annotation.h; sourceTree = ""; }; - 0C12EC462616383B00B66C86 /* inliner.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = inliner.h; sourceTree = ""; }; - 0C12EC472616383B00B66C86 /* lower_grad_of.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lower_grad_of.h; sourceTree = ""; }; - 0C12EC492616383B00B66C86 /* helper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = helper.h; sourceTree = ""; }; - 0C12EC4A2616383B00B66C86 /* quantization_type.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = quantization_type.h; sourceTree = ""; }; - 0C12EC4B2616383B00B66C86 /* insert_observers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = insert_observers.h; sourceTree = ""; }; - 0C12EC4C2616383B00B66C86 /* dedup_module_uses.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dedup_module_uses.h; sourceTree = ""; }; - 0C12EC4D2616383B00B66C86 /* quantization_patterns.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = quantization_patterns.h; sourceTree = ""; }; - 0C12EC4E2616383B00B66C86 /* finalize.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = finalize.h; sourceTree = ""; }; - 0C12EC4F2616383B00B66C86 /* insert_quant_dequant.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = insert_quant_dequant.h; sourceTree = ""; }; - 0C12EC502616383B00B66C86 /* fusion_passes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fusion_passes.h; sourceTree = ""; }; - 0C12EC512616383B00B66C86 /* normalize_ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = normalize_ops.h; sourceTree = ""; }; - 0C12EC522616383B00B66C86 /* vulkan_rewrite.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vulkan_rewrite.h; sourceTree = ""; }; - 0C12EC532616383B00B66C86 /* erase_number_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = erase_number_types.h; sourceTree = ""; }; - 0C12EC542616383B00B66C86 /* graph_rewrite_helper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = graph_rewrite_helper.h; sourceTree = ""; }; - 0C12EC552616383B00B66C86 /* graph_fuser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = graph_fuser.h; sourceTree = ""; }; - 0C12EC562616383B00B66C86 /* fold_conv_bn.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fold_conv_bn.h; sourceTree = ""; }; - 0C12EC572616383B00B66C86 /* remove_redundant_profiles.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = remove_redundant_profiles.h; sourceTree = ""; }; - 0C12EC582616383B00B66C86 /* inline_forked_closures.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = inline_forked_closures.h; sourceTree = ""; }; - 0C12EC592616383B00B66C86 /* tensorexpr_fuser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tensorexpr_fuser.h; sourceTree = ""; }; - 0C12EC5A2616383B00B66C86 /* decompose_ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = decompose_ops.h; sourceTree = ""; }; - 0C12EC5B2616383B00B66C86 /* remove_inplace_ops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = remove_inplace_ops.h; sourceTree = ""; }; - 0C12EC5C2616383B00B66C86 /* inline_fork_wait.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = inline_fork_wait.h; sourceTree = ""; }; - 0C12EC5D2616383B00B66C86 /* create_autodiff_subgraphs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = create_autodiff_subgraphs.h; sourceTree = ""; }; - 0C12EC5E2616383B00B66C86 /* requires_grad_analysis.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = requires_grad_analysis.h; sourceTree = ""; }; - 0C12EC5F2616383B00B66C86 /* dead_code_elimination.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dead_code_elimination.h; sourceTree = ""; }; - 0C12EC602616383B00B66C86 /* clear_profiling.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = clear_profiling.h; sourceTree = ""; }; - 0C12EC612616383B00B66C86 /* create_functional_graphs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = create_functional_graphs.h; sourceTree = ""; }; - 0C12EC622616383B00B66C86 /* bailout_graph.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bailout_graph.h; sourceTree = ""; }; - 0C12EC632616383B00B66C86 /* lower_tuples.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lower_tuples.h; sourceTree = ""; }; - 0C12EC642616383B00B66C86 /* frozen_graph_optimizations.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = frozen_graph_optimizations.h; sourceTree = ""; }; - 0C12EC652616383B00B66C86 /* frozen_ops_to_mkldnn.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = frozen_ops_to_mkldnn.h; sourceTree = ""; }; - 0C12EC662616383B00B66C86 /* canonicalize.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = canonicalize.h; sourceTree = ""; }; - 0C12EC672616383B00B66C86 /* hoist_conv_packed_params.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hoist_conv_packed_params.h; sourceTree = ""; }; - 0C12EC682616383B00B66C86 /* loop_unrolling.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = loop_unrolling.h; sourceTree = ""; }; - 0C12EC692616383B00B66C86 /* shape_analysis.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = shape_analysis.h; sourceTree = ""; }; - 0C12EC6A2616383B00B66C86 /* fixup_trace_scope_blocks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fixup_trace_scope_blocks.h; sourceTree = ""; }; - 0C12EC6B2616383B00B66C86 /* remove_exceptions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = remove_exceptions.h; sourceTree = ""; }; - 0C12EC6C2616383B00B66C86 /* inline_autodiff_subgraphs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = inline_autodiff_subgraphs.h; sourceTree = ""; }; - 0C12EC6D2616383B00B66C86 /* inplace_check.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = inplace_check.h; sourceTree = ""; }; - 0C12EC6E2616383B00B66C86 /* cuda_graph_fuser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cuda_graph_fuser.h; sourceTree = ""; }; - 0C12EC6F2616383B00B66C86 /* pass_manager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pass_manager.h; sourceTree = ""; }; - 0C12EC702616383B00B66C86 /* onnx.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = onnx.h; sourceTree = ""; }; - 0C12EC712616383B00B66C86 /* xnnpack_rewrite.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xnnpack_rewrite.h; sourceTree = ""; }; - 0C12EC722616383B00B66C86 /* lift_closures.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lift_closures.h; sourceTree = ""; }; - 0C12EC732616383B00B66C86 /* frozen_conv_add_relu_fusion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = frozen_conv_add_relu_fusion.h; sourceTree = ""; }; - 0C12EC742616383B00B66C86 /* lower_graph.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lower_graph.h; sourceTree = ""; }; - 0C12EC782616383B00B66C86 /* type.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = type.h; sourceTree = ""; }; - 0C12EC792616383B00B66C86 /* executor_kernel_arg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = executor_kernel_arg.h; sourceTree = ""; }; - 0C12EC7A2616383B00B66C86 /* utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = utils.h; sourceTree = ""; }; - 0C12EC7B2616383B00B66C86 /* kernel_ir_printer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = kernel_ir_printer.h; sourceTree = ""; }; - 0C12EC7D2616383B00B66C86 /* index_compute.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = index_compute.h; sourceTree = ""; }; - 0C12EC7E2616383B00B66C86 /* transform_replay.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = transform_replay.h; sourceTree = ""; }; - 0C12EC7F2616383B00B66C86 /* parser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = parser.h; sourceTree = ""; }; - 0C12EC802616383B00B66C86 /* executor_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = executor_utils.h; sourceTree = ""; }; - 0C12EC812616383B00B66C86 /* manager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = manager.h; sourceTree = ""; }; - 0C12EC822616383B00B66C86 /* scheduler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = scheduler.h; sourceTree = ""; }; - 0C12EC832616383B00B66C86 /* lower_unroll.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lower_unroll.h; sourceTree = ""; }; - 0C12EC852616383B00B66C86 /* ir_printer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ir_printer.h; sourceTree = ""; }; - 0C12EC862616383B00B66C86 /* lower_insert_syncs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lower_insert_syncs.h; sourceTree = ""; }; - 0C12EC872616383B00B66C86 /* lower2device.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lower2device.h; sourceTree = ""; }; - 0C12EC882616383B00B66C86 /* predicate_compute.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = predicate_compute.h; sourceTree = ""; }; - 0C12EC892616383B00B66C86 /* compute_at.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = compute_at.h; sourceTree = ""; }; - 0C12EC8A2616383B00B66C86 /* ir_all_nodes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ir_all_nodes.h; sourceTree = ""; }; - 0C12EC8B2616383B00B66C86 /* mutator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mutator.h; sourceTree = ""; }; - 0C12EC8D2616383B00B66C86 /* documentation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = documentation.h; sourceTree = ""; }; - 0C12EC8F2616383B00B66C86 /* fusion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fusion.h; sourceTree = ""; }; - 0C12EC902616383B00B66C86 /* lower_loops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lower_loops.h; sourceTree = ""; }; - 0C12EC912616383B00B66C86 /* interface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = interface.h; sourceTree = ""; }; - 0C12EC922616383B00B66C86 /* arith.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = arith.h; sourceTree = ""; }; - 0C12EC932616383B00B66C86 /* kernel_cache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = kernel_cache.h; sourceTree = ""; }; - 0C12EC942616383B00B66C86 /* codegen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = codegen.h; sourceTree = ""; }; - 0C12EC952616383B00B66C86 /* ir_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ir_utils.h; sourceTree = ""; }; - 0C12EC962616383B00B66C86 /* lower_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lower_utils.h; sourceTree = ""; }; - 0C12EC972616383B00B66C86 /* lower_index.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lower_index.h; sourceTree = ""; }; - 0C12EC982616383B00B66C86 /* transform_rfactor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = transform_rfactor.h; sourceTree = ""; }; - 0C12EC992616383B00B66C86 /* transform_iter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = transform_iter.h; sourceTree = ""; }; - 0C12EC9A2616383B00B66C86 /* lower_alias_memory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lower_alias_memory.h; sourceTree = ""; }; - 0C12EC9B2616383B00B66C86 /* executor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = executor.h; sourceTree = ""; }; - 0C12EC9C2616383B00B66C86 /* ir_graphviz.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ir_graphviz.h; sourceTree = ""; }; - 0C12EC9D2616383B00B66C86 /* ir_iostream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ir_iostream.h; sourceTree = ""; }; - 0C12EC9E2616383B00B66C86 /* partition.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = partition.h; sourceTree = ""; }; - 0C12EC9F2616383B00B66C86 /* shape_inference.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = shape_inference.h; sourceTree = ""; }; - 0C12ECA02616383B00B66C86 /* kernel_ir_builder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = kernel_ir_builder.h; sourceTree = ""; }; - 0C12ECA12616383B00B66C86 /* instrumentation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = instrumentation.h; sourceTree = ""; }; - 0C12ECA22616383B00B66C86 /* kernel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = kernel.h; sourceTree = ""; }; - 0C12ECA32616383B00B66C86 /* dispatch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dispatch.h; sourceTree = ""; }; - 0C12ECA42616383B00B66C86 /* lower_validation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lower_validation.h; sourceTree = ""; }; - 0C12ECA52616383B00B66C86 /* ir_internal_nodes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ir_internal_nodes.h; sourceTree = ""; }; - 0C12ECA62616383B00B66C86 /* lower_thread_predicate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lower_thread_predicate.h; sourceTree = ""; }; - 0C12ECA72616383B00B66C86 /* ir_interface_nodes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ir_interface_nodes.h; sourceTree = ""; }; - 0C12ECA82616383B00B66C86 /* ir_cloner.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ir_cloner.h; sourceTree = ""; }; - 0C12ECA92616383B00B66C86 /* ir_base_nodes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ir_base_nodes.h; sourceTree = ""; }; - 0C12ECAA2616383B00B66C86 /* executor_launch_params.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = executor_launch_params.h; sourceTree = ""; }; - 0C12ECAB2616383B00B66C86 /* kernel_ir.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = kernel_ir.h; sourceTree = ""; }; - 0C12ECAC2616383B00B66C86 /* iter_visitor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iter_visitor.h; sourceTree = ""; }; - 0C12ECAD2616383B00B66C86 /* expr_evaluator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = expr_evaluator.h; sourceTree = ""; }; - 0C12ECAF2616383B00B66C86 /* tensor_info.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tensor_info.h; sourceTree = ""; }; - 0C12ECB02616383B00B66C86 /* arg_spec.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = arg_spec.h; sourceTree = ""; }; - 0C12ECB12616383B00B66C86 /* compiler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = compiler.h; sourceTree = ""; }; - 0C12ECB22616383B00B66C86 /* fallback.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fallback.h; sourceTree = ""; }; - 0C12ECB42616383B00B66C86 /* temp_file.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = temp_file.h; sourceTree = ""; }; - 0C12ECB52616383B00B66C86 /* fused_kernel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fused_kernel.h; sourceTree = ""; }; - 0C12ECB62616383B00B66C86 /* resource_strings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = resource_strings.h; sourceTree = ""; }; - 0C12ECB82616383B00B66C86 /* fused_kernel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fused_kernel.h; sourceTree = ""; }; - 0C12ECB92616383B00B66C86 /* resource_strings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = resource_strings.h; sourceTree = ""; }; - 0C12ECBA2616383B00B66C86 /* partition_desc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = partition_desc.h; sourceTree = ""; }; - 0C12ECBB2616383B00B66C86 /* fused_kernel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fused_kernel.h; sourceTree = ""; }; - 0C12ECBC2616383B00B66C86 /* kernel_spec.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = kernel_spec.h; sourceTree = ""; }; - 0C12ECBD2616383B00B66C86 /* interface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = interface.h; sourceTree = ""; }; - 0C12ECBE2616383B00B66C86 /* kernel_cache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = kernel_cache.h; sourceTree = ""; }; - 0C12ECBF2616383B00B66C86 /* codegen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = codegen.h; sourceTree = ""; }; - 0C12ECC02616383B00B66C86 /* executor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = executor.h; sourceTree = ""; }; - 0C12ECC12616383B00B66C86 /* tensor_desc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tensor_desc.h; sourceTree = ""; }; - 0C12ECC32616383B00B66C86 /* file_check.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = file_check.h; sourceTree = ""; }; - 0C12ECC42616383B00B66C86 /* hooks_for_testing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hooks_for_testing.h; sourceTree = ""; }; - 0C12ECC52616383B00B66C86 /* jit_log.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = jit_log.h; sourceTree = ""; }; - 0C12ECC72616383B00B66C86 /* observer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = observer.h; sourceTree = ""; }; - 0C12ECC82616383B00B66C86 /* sequential.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sequential.h; sourceTree = ""; }; - 0C12ECC92616383B00B66C86 /* interpreter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = interpreter.h; sourceTree = ""; }; - 0C12ECCA2616383B00B66C86 /* export_data.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = export_data.h; sourceTree = ""; }; - 0C12ECCB2616383B00B66C86 /* method.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = method.h; sourceTree = ""; }; - 0C12ECCD2616383B00B66C86 /* sgd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sgd.h; sourceTree = ""; }; - 0C12ECCE2616383B00B66C86 /* import_data.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = import_data.h; sourceTree = ""; }; - 0C12ECCF2616383B00B66C86 /* type_parser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = type_parser.h; sourceTree = ""; }; - 0C12ECD02616383B00B66C86 /* import.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = import.h; sourceTree = ""; }; - 0C12ECD12616383B00B66C86 /* module.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = module.h; sourceTree = ""; }; - 0C12ECD22616383B00B66C86 /* function.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = function.h; sourceTree = ""; }; - 0C12ECD32616383B00B66C86 /* resource_guard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = resource_guard.h; sourceTree = ""; }; - 0C12ECD52616383B00B66C86 /* function_impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = function_impl.h; sourceTree = ""; }; - 0C12ECD62616383B00B66C86 /* method.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = method.h; sourceTree = ""; }; - 0C12ECD72616383B00B66C86 /* compilation_unit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = compilation_unit.h; sourceTree = ""; }; - 0C12ECD82616383B00B66C86 /* object.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = object.h; sourceTree = ""; }; - 0C12ECD92616383B00B66C86 /* module.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = module.h; sourceTree = ""; }; - 0C12ECDA2616383B00B66C86 /* Storage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Storage.h; sourceTree = ""; }; - 0C12ECDE2616383B00B66C86 /* fft.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fft.h; sourceTree = ""; }; - 0C12ECDF2616383B00B66C86 /* utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = utils.h; sourceTree = ""; }; - 0C12ECE02616383B00B66C86 /* version.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = version.h; sourceTree = ""; }; - 0C12ECE32616383B00B66C86 /* normalization.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = normalization.h; sourceTree = ""; }; - 0C12ECE42616383B00B66C86 /* rnn.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rnn.h; sourceTree = ""; }; - 0C12ECE52616383B00B66C86 /* distance.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = distance.h; sourceTree = ""; }; - 0C12ECE62616383B00B66C86 /* batchnorm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = batchnorm.h; sourceTree = ""; }; - 0C12ECE72616383B00B66C86 /* linear.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = linear.h; sourceTree = ""; }; - 0C12ECE82616383B00B66C86 /* instancenorm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = instancenorm.h; sourceTree = ""; }; - 0C12ECE92616383B00B66C86 /* vision.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vision.h; sourceTree = ""; }; - 0C12ECEA2616383B00B66C86 /* transformercoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = transformercoder.h; sourceTree = ""; }; - 0C12ECEB2616383B00B66C86 /* dropout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dropout.h; sourceTree = ""; }; - 0C12ECEC2616383B00B66C86 /* upsampling.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = upsampling.h; sourceTree = ""; }; - 0C12ECED2616383B00B66C86 /* embedding.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = embedding.h; sourceTree = ""; }; - 0C12ECEE2616383C00B66C86 /* fold.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fold.h; sourceTree = ""; }; - 0C12ECEF2616383C00B66C86 /* activation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = activation.h; sourceTree = ""; }; - 0C12ECF02616383C00B66C86 /* transformer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = transformer.h; sourceTree = ""; }; - 0C12ECF12616383C00B66C86 /* pooling.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pooling.h; sourceTree = ""; }; - 0C12ECF22616383C00B66C86 /* transformerlayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = transformerlayer.h; sourceTree = ""; }; - 0C12ECF32616383C00B66C86 /* adaptive.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = adaptive.h; sourceTree = ""; }; - 0C12ECF42616383C00B66C86 /* conv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = conv.h; sourceTree = ""; }; - 0C12ECF52616383C00B66C86 /* padding.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = padding.h; sourceTree = ""; }; - 0C12ECF62616383C00B66C86 /* pixelshuffle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pixelshuffle.h; sourceTree = ""; }; - 0C12ECF72616383C00B66C86 /* loss.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = loss.h; sourceTree = ""; }; - 0C12ECF82616383C00B66C86 /* utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = utils.h; sourceTree = ""; }; - 0C12ECFA2616383C00B66C86 /* data_parallel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = data_parallel.h; sourceTree = ""; }; - 0C12ECFB2616383C00B66C86 /* pimpl-inl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "pimpl-inl.h"; sourceTree = ""; }; - 0C12ECFD2616383C00B66C86 /* rnn.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rnn.h; sourceTree = ""; }; - 0C12ECFE2616383C00B66C86 /* clip_grad.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = clip_grad.h; sourceTree = ""; }; - 0C12ECFF2616383C00B66C86 /* convert_parameters.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = convert_parameters.h; sourceTree = ""; }; - 0C12ED002616383C00B66C86 /* options.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = options.h; sourceTree = ""; }; - 0C12ED012616383C00B66C86 /* functional.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = functional.h; sourceTree = ""; }; - 0C12ED022616383C00B66C86 /* modules.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = modules.h; sourceTree = ""; }; - 0C12ED032616383C00B66C86 /* pimpl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pimpl.h; sourceTree = ""; }; - 0C12ED042616383C00B66C86 /* module.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = module.h; sourceTree = ""; }; - 0C12ED062616383C00B66C86 /* normalization.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = normalization.h; sourceTree = ""; }; - 0C12ED072616383C00B66C86 /* utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = utils.h; sourceTree = ""; }; - 0C12ED082616383C00B66C86 /* rnn.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rnn.h; sourceTree = ""; }; - 0C12ED092616383C00B66C86 /* distance.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = distance.h; sourceTree = ""; }; - 0C12ED0A2616383C00B66C86 /* batchnorm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = batchnorm.h; sourceTree = ""; }; - 0C12ED0B2616383C00B66C86 /* linear.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = linear.h; sourceTree = ""; }; - 0C12ED0C2616383C00B66C86 /* instancenorm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = instancenorm.h; sourceTree = ""; }; - 0C12ED0D2616383C00B66C86 /* transformercoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = transformercoder.h; sourceTree = ""; }; - 0C12ED0E2616383C00B66C86 /* _functions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _functions.h; sourceTree = ""; }; - 0C12ED102616383C00B66C86 /* named_any.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = named_any.h; sourceTree = ""; }; - 0C12ED112616383C00B66C86 /* any_value.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = any_value.h; sourceTree = ""; }; - 0C12ED122616383C00B66C86 /* modulelist.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = modulelist.h; sourceTree = ""; }; - 0C12ED132616383C00B66C86 /* moduledict.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = moduledict.h; sourceTree = ""; }; - 0C12ED142616383C00B66C86 /* sequential.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sequential.h; sourceTree = ""; }; - 0C12ED152616383C00B66C86 /* functional.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = functional.h; sourceTree = ""; }; - 0C12ED162616383C00B66C86 /* parameterlist.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = parameterlist.h; sourceTree = ""; }; - 0C12ED172616383C00B66C86 /* parameterdict.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = parameterdict.h; sourceTree = ""; }; - 0C12ED182616383C00B66C86 /* any.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = any.h; sourceTree = ""; }; - 0C12ED192616383C00B66C86 /* any_module_holder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = any_module_holder.h; sourceTree = ""; }; - 0C12ED1A2616383C00B66C86 /* dropout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dropout.h; sourceTree = ""; }; - 0C12ED1B2616383C00B66C86 /* common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = common.h; sourceTree = ""; }; - 0C12ED1C2616383C00B66C86 /* upsampling.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = upsampling.h; sourceTree = ""; }; - 0C12ED1D2616383C00B66C86 /* embedding.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = embedding.h; sourceTree = ""; }; - 0C12ED1E2616383C00B66C86 /* fold.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fold.h; sourceTree = ""; }; - 0C12ED1F2616383C00B66C86 /* activation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = activation.h; sourceTree = ""; }; - 0C12ED202616383C00B66C86 /* transformer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = transformer.h; sourceTree = ""; }; - 0C12ED212616383C00B66C86 /* pooling.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pooling.h; sourceTree = ""; }; - 0C12ED222616383C00B66C86 /* transformerlayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = transformerlayer.h; sourceTree = ""; }; - 0C12ED232616383C00B66C86 /* adaptive.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = adaptive.h; sourceTree = ""; }; - 0C12ED242616383C00B66C86 /* conv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = conv.h; sourceTree = ""; }; - 0C12ED252616383C00B66C86 /* padding.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = padding.h; sourceTree = ""; }; - 0C12ED262616383C00B66C86 /* pixelshuffle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pixelshuffle.h; sourceTree = ""; }; - 0C12ED272616383C00B66C86 /* loss.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = loss.h; sourceTree = ""; }; - 0C12ED282616383C00B66C86 /* init.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = init.h; sourceTree = ""; }; - 0C12ED292616383C00B66C86 /* cloneable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cloneable.h; sourceTree = ""; }; - 0C12ED2B2616383C00B66C86 /* normalization.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = normalization.h; sourceTree = ""; }; - 0C12ED2C2616383C00B66C86 /* distance.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = distance.h; sourceTree = ""; }; - 0C12ED2D2616383C00B66C86 /* batchnorm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = batchnorm.h; sourceTree = ""; }; - 0C12ED2E2616383C00B66C86 /* linear.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = linear.h; sourceTree = ""; }; - 0C12ED2F2616383C00B66C86 /* instancenorm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = instancenorm.h; sourceTree = ""; }; - 0C12ED302616383C00B66C86 /* vision.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vision.h; sourceTree = ""; }; - 0C12ED312616383C00B66C86 /* dropout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dropout.h; sourceTree = ""; }; - 0C12ED322616383C00B66C86 /* upsampling.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = upsampling.h; sourceTree = ""; }; - 0C12ED332616383C00B66C86 /* embedding.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = embedding.h; sourceTree = ""; }; - 0C12ED342616383C00B66C86 /* fold.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fold.h; sourceTree = ""; }; - 0C12ED352616383C00B66C86 /* activation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = activation.h; sourceTree = ""; }; - 0C12ED362616383C00B66C86 /* pooling.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pooling.h; sourceTree = ""; }; - 0C12ED372616383C00B66C86 /* conv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = conv.h; sourceTree = ""; }; - 0C12ED382616383C00B66C86 /* padding.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = padding.h; sourceTree = ""; }; - 0C12ED392616383C00B66C86 /* pixelshuffle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pixelshuffle.h; sourceTree = ""; }; - 0C12ED3A2616383C00B66C86 /* loss.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = loss.h; sourceTree = ""; }; - 0C12ED3C2616383C00B66C86 /* init.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = init.h; sourceTree = ""; }; - 0C12ED3D2616383C00B66C86 /* enum.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = enum.h; sourceTree = ""; }; - 0C12ED3E2616383C00B66C86 /* types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = types.h; sourceTree = ""; }; - 0C12ED3F2616383C00B66C86 /* all.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = all.h; sourceTree = ""; }; - 0C12ED402616383C00B66C86 /* data.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = data.h; sourceTree = ""; }; - 0C12ED412616383C00B66C86 /* arg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = arg.h; sourceTree = ""; }; - 0C12ED432616383C00B66C86 /* rmsprop.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rmsprop.h; sourceTree = ""; }; - 0C12ED442616383C00B66C86 /* lbfgs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lbfgs.h; sourceTree = ""; }; - 0C12ED452616383C00B66C86 /* optimizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = optimizer.h; sourceTree = ""; }; - 0C12ED462616383C00B66C86 /* adagrad.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = adagrad.h; sourceTree = ""; }; - 0C12ED472616383C00B66C86 /* sgd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sgd.h; sourceTree = ""; }; - 0C12ED482616383C00B66C86 /* serialize.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = serialize.h; sourceTree = ""; }; - 0C12ED492616383C00B66C86 /* adamw.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = adamw.h; sourceTree = ""; }; - 0C12ED4B2616383C00B66C86 /* lr_scheduler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lr_scheduler.h; sourceTree = ""; }; - 0C12ED4C2616383C00B66C86 /* step_lr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = step_lr.h; sourceTree = ""; }; - 0C12ED4D2616383C00B66C86 /* adam.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = adam.h; sourceTree = ""; }; - 0C12ED4F2616383C00B66C86 /* archive.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = archive.h; sourceTree = ""; }; - 0C12ED502616383C00B66C86 /* input-archive.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "input-archive.h"; sourceTree = ""; }; - 0C12ED512616383C00B66C86 /* output-archive.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "output-archive.h"; sourceTree = ""; }; - 0C12ED522616383C00B66C86 /* tensor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tensor.h; sourceTree = ""; }; - 0C12ED532616383C00B66C86 /* torch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = torch.h; sourceTree = ""; }; - 0C12ED542616383C00B66C86 /* optim.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = optim.h; sourceTree = ""; }; - 0C12ED552616383C00B66C86 /* jit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = jit.h; sourceTree = ""; }; - 0C12ED572616383C00B66C86 /* static.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = static.h; sourceTree = ""; }; - 0C12ED582616383C00B66C86 /* TensorDataContainer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TensorDataContainer.h; sourceTree = ""; }; - 0C12ED592616383C00B66C86 /* nn.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = nn.h; sourceTree = ""; }; - 0C12ED5A2616383C00B66C86 /* ordered_dict.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ordered_dict.h; sourceTree = ""; }; - 0C12ED5B2616383C00B66C86 /* cuda.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cuda.h; sourceTree = ""; }; - 0C12ED5C2616383C00B66C86 /* autograd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = autograd.h; sourceTree = ""; }; - 0C12ED5D2616383C00B66C86 /* linalg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = linalg.h; sourceTree = ""; }; - 0C12ED5E2616383C00B66C86 /* special.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = special.h; sourceTree = ""; }; - 0C12ED5F2616383C00B66C86 /* python.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = python.h; sourceTree = ""; }; - 0C12ED602616383C00B66C86 /* serialize.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = serialize.h; sourceTree = ""; }; - 0C12ED622616383C00B66C86 /* example.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = example.h; sourceTree = ""; }; - 0C12ED632616383C00B66C86 /* dataloader_options.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dataloader_options.h; sourceTree = ""; }; - 0C12ED652616383C00B66C86 /* mnist.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mnist.h; sourceTree = ""; }; - 0C12ED662616383C00B66C86 /* shared.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = shared.h; sourceTree = ""; }; - 0C12ED672616383C00B66C86 /* map.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = map.h; sourceTree = ""; }; - 0C12ED682616383C00B66C86 /* chunk.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = chunk.h; sourceTree = ""; }; - 0C12ED692616383C00B66C86 /* stateful.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stateful.h; sourceTree = ""; }; - 0C12ED6A2616383C00B66C86 /* tensor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tensor.h; sourceTree = ""; }; - 0C12ED6B2616383C00B66C86 /* base.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = base.h; sourceTree = ""; }; - 0C12ED6C2616383C00B66C86 /* worker_exception.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = worker_exception.h; sourceTree = ""; }; - 0C12ED6D2616383C00B66C86 /* dataloader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dataloader.h; sourceTree = ""; }; - 0C12ED6F2616383C00B66C86 /* data_shuttle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = data_shuttle.h; sourceTree = ""; }; - 0C12ED702616383C00B66C86 /* sequencers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sequencers.h; sourceTree = ""; }; - 0C12ED712616383C00B66C86 /* queue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = queue.h; sourceTree = ""; }; - 0C12ED722616383C00B66C86 /* samplers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = samplers.h; sourceTree = ""; }; - 0C12ED742616383C00B66C86 /* lambda.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lambda.h; sourceTree = ""; }; - 0C12ED752616383C00B66C86 /* stack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stack.h; sourceTree = ""; }; - 0C12ED762616383C00B66C86 /* collate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = collate.h; sourceTree = ""; }; - 0C12ED772616383C00B66C86 /* tensor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tensor.h; sourceTree = ""; }; - 0C12ED782616383C00B66C86 /* base.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = base.h; sourceTree = ""; }; - 0C12ED7A2616383C00B66C86 /* sequential.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sequential.h; sourceTree = ""; }; - 0C12ED7B2616383C00B66C86 /* custom_batch_request.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = custom_batch_request.h; sourceTree = ""; }; - 0C12ED7C2616383C00B66C86 /* stream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stream.h; sourceTree = ""; }; - 0C12ED7D2616383C00B66C86 /* distributed.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = distributed.h; sourceTree = ""; }; - 0C12ED7E2616383C00B66C86 /* serialize.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = serialize.h; sourceTree = ""; }; - 0C12ED7F2616383C00B66C86 /* random.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = random.h; sourceTree = ""; }; - 0C12ED802616383C00B66C86 /* base.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = base.h; sourceTree = ""; }; - 0C12ED812616383C00B66C86 /* datasets.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = datasets.h; sourceTree = ""; }; - 0C12ED822616383C00B66C86 /* transforms.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = transforms.h; sourceTree = ""; }; - 0C12ED832616383C00B66C86 /* iterator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iterator.h; sourceTree = ""; }; - 0C12ED852616383C00B66C86 /* stateless.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stateless.h; sourceTree = ""; }; - 0C12ED862616383C00B66C86 /* stateful.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stateful.h; sourceTree = ""; }; - 0C12ED872616383C00B66C86 /* base.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = base.h; sourceTree = ""; }; - 0C12ED882616383C00B66C86 /* expanding_array.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = expanding_array.h; sourceTree = ""; }; - 0C12ED952616383C00B66C86 /* MemoryFormat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MemoryFormat.h; sourceTree = ""; }; - 0C12ED972616383C00B66C86 /* utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = utils.h; sourceTree = ""; }; - 0C12ED982616383C00B66C86 /* serialization.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = serialization.h; sourceTree = ""; }; - 0C12ED992616383C00B66C86 /* Storage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Storage.h; sourceTree = ""; }; - 0C12ED9B2616383C00B66C86 /* python_tensor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = python_tensor.h; sourceTree = ""; }; - 0C12ED9C2616383C00B66C86 /* WindowsTorchApiMacro.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WindowsTorchApiMacro.h; sourceTree = ""; }; - 0C12ED9D2616383C00B66C86 /* Dtype.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Dtype.h; sourceTree = ""; }; - 0C12ED9E2616383C00B66C86 /* Module.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Module.h; sourceTree = ""; }; - 0C12ED9F2616383C00B66C86 /* THP_export.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = THP_export.h; sourceTree = ""; }; - 0C12EDA02616383C00B66C86 /* python_dimname.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = python_dimname.h; sourceTree = ""; }; - 0C12EDA12616383C00B66C86 /* CudaIPCTypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CudaIPCTypes.h; sourceTree = ""; }; - 0C12EDA22616383C00B66C86 /* Generator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Generator.h; sourceTree = ""; }; - 0C12EDA32616383C00B66C86 /* TypeInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TypeInfo.h; sourceTree = ""; }; - 0C12EDA42616383C00B66C86 /* PythonTypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PythonTypes.h; sourceTree = ""; }; - 0C12EDA52616383C00B66C86 /* script.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = script.h; sourceTree = ""; }; - 0C12EDA62616383C00B66C86 /* library.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = library.h; sourceTree = ""; }; - 0C12EDA72616383C00B66C86 /* custom_class_detail.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = custom_class_detail.h; sourceTree = ""; }; - 0C12EDA82616383C00B66C86 /* custom_class.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = custom_class.h; sourceTree = ""; }; - 0C12EDA92616383C00B66C86 /* extension.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = extension.h; sourceTree = ""; }; - 0C12EDAA2616383C00B66C86 /* xnnpack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xnnpack.h; sourceTree = ""; }; - 0C12EDAB2616383C00B66C86 /* fp16.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fp16.h; sourceTree = ""; }; - 0C12EDAC2616383C00B66C86 /* qnnpack_func.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = qnnpack_func.h; sourceTree = ""; }; - 0C12EDAD2616383C00B66C86 /* pthreadpool.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pthreadpool.h; sourceTree = ""; }; - 0C12EDAE2616383C00B66C86 /* clog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = clog.h; sourceTree = ""; }; - 0C12EDB02616383C00B66C86 /* Formatting.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Formatting.h; sourceTree = ""; }; - 0C12EDB12616383C00B66C86 /* CPUFunctions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPUFunctions.h; sourceTree = ""; }; - 0C12EDB22616383C00B66C86 /* MetaFunctions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MetaFunctions.h; sourceTree = ""; }; - 0C12EDB32616383C00B66C86 /* Utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Utils.h; sourceTree = ""; }; - 0C12EDB42616383C00B66C86 /* CUDAGeneratorImpl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CUDAGeneratorImpl.h; sourceTree = ""; }; - 0C12EDB52616383C00B66C86 /* TensorOptions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TensorOptions.h; sourceTree = ""; }; - 0C12EDB62616383C00B66C86 /* TensorUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TensorUtils.h; sourceTree = ""; }; - 0C12EDB72616383C00B66C86 /* MemoryOverlap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MemoryOverlap.h; sourceTree = ""; }; - 0C12EDB82616383C00B66C86 /* InitialTensorOptions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InitialTensorOptions.h; sourceTree = ""; }; - 0C12EDB92616383C00B66C86 /* Version.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Version.h; sourceTree = ""; }; - 0C12EDBA2616383C00B66C86 /* DLConvertor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DLConvertor.h; sourceTree = ""; }; - 0C12EDBB2616383C00B66C86 /* Device.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Device.h; sourceTree = ""; }; - 0C12EDBD2616383C00B66C86 /* Dict_inl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Dict_inl.h; sourceTree = ""; }; - 0C12EDBE2616383C00B66C86 /* Formatting.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Formatting.h; sourceTree = ""; }; - 0C12EDBF2616383C00B66C86 /* TensorBody.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TensorBody.h; sourceTree = ""; }; - 0C12EDC12616383C00B66C86 /* adaption.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = adaption.h; sourceTree = ""; }; - 0C12EDC22616383C00B66C86 /* op_allowlist.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = op_allowlist.h; sourceTree = ""; }; - 0C12EDC32616383C00B66C86 /* op_registration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = op_registration.h; sourceTree = ""; }; - 0C12EDC42616383C00B66C86 /* infer_schema.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = infer_schema.h; sourceTree = ""; }; - 0C12EDC52616383C00B66C86 /* jit_type_base.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = jit_type_base.h; sourceTree = ""; }; - 0C12EDC62616383C00B66C86 /* typeid.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = typeid.h; sourceTree = ""; }; - 0C12EDC72616383C00B66C86 /* rref_interface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rref_interface.h; sourceTree = ""; }; - 0C12EDC82616383C00B66C86 /* Range.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Range.h; sourceTree = ""; }; - 0C12EDC92616383C00B66C86 /* interned_strings_class.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = interned_strings_class.h; sourceTree = ""; }; - 0C12EDCA2616383C00B66C86 /* operator_name.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = operator_name.h; sourceTree = ""; }; - 0C12EDCB2616383C00B66C86 /* DeprecatedTypePropertiesRegistry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DeprecatedTypePropertiesRegistry.h; sourceTree = ""; }; - 0C12EDCC2616383C00B66C86 /* Backtrace.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Backtrace.h; sourceTree = ""; }; - 0C12EDCD2616383C00B66C86 /* TransformationHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TransformationHelper.h; sourceTree = ""; }; - 0C12EDCE2616383C00B66C86 /* blob.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blob.h; sourceTree = ""; }; - 0C12EDCF2616383C00B66C86 /* function_schema.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = function_schema.h; sourceTree = ""; }; - 0C12EDD12616383C00B66C86 /* OperatorOptions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OperatorOptions.h; sourceTree = ""; }; - 0C12EDD22616383C00B66C86 /* RegistrationHandleRAII.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RegistrationHandleRAII.h; sourceTree = ""; }; - 0C12EDD32616383C00B66C86 /* ObservedOperators.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ObservedOperators.h; sourceTree = ""; }; - 0C12EDD42616383C00B66C86 /* DispatchKeyExtractor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DispatchKeyExtractor.h; sourceTree = ""; }; - 0C12EDD52616383C00B66C86 /* Dispatcher.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Dispatcher.h; sourceTree = ""; }; - 0C12EDD62616383C00B66C86 /* CppSignature.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CppSignature.h; sourceTree = ""; }; - 0C12EDD72616383C00B66C86 /* OperatorEntry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OperatorEntry.h; sourceTree = ""; }; - 0C12EDD82616383C00B66C86 /* MT19937RNGEngine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MT19937RNGEngine.h; sourceTree = ""; }; - 0C12EDD92616383C00B66C86 /* ivalue_to.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ivalue_to.h; sourceTree = ""; }; - 0C12EDDA2616383C00B66C86 /* aten_interned_strings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aten_interned_strings.h; sourceTree = ""; }; - 0C12EDDB2616383C00B66C86 /* LegacyTypeDispatch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LegacyTypeDispatch.h; sourceTree = ""; }; - 0C12EDDC2616383C00B66C86 /* function_schema_inl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = function_schema_inl.h; sourceTree = ""; }; - 0C12EDDD2616383C00B66C86 /* qualified_name.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = qualified_name.h; sourceTree = ""; }; - 0C12EDDE2616383C00B66C86 /* UndefinedTensorImpl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UndefinedTensorImpl.h; sourceTree = ""; }; - 0C12EDDF2616383C00B66C86 /* NamedTensor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NamedTensor.h; sourceTree = ""; }; - 0C12EDE02616383C00B66C86 /* Scalar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Scalar.h; sourceTree = ""; }; - 0C12EDE12616383C00B66C86 /* functional.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = functional.h; sourceTree = ""; }; - 0C12EDE22616383C00B66C86 /* DeprecatedTypeProperties.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DeprecatedTypeProperties.h; sourceTree = ""; }; - 0C12EDE32616383C00B66C86 /* interned_strings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = interned_strings.h; sourceTree = ""; }; - 0C12EDE42616383C00B66C86 /* List.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = List.h; sourceTree = ""; }; - 0C12EDE52616383C00B66C86 /* ATenOpList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ATenOpList.h; sourceTree = ""; }; - 0C12EDE62616383C00B66C86 /* Dict.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Dict.h; sourceTree = ""; }; - 0C12EDE72616383C00B66C86 /* grad_mode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = grad_mode.h; sourceTree = ""; }; - 0C12EDE82616383C00B66C86 /* DistributionsHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DistributionsHelper.h; sourceTree = ""; }; - 0C12EDE92616383C00B66C86 /* Macros.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Macros.h; sourceTree = ""; }; - 0C12EDEA2616383C00B66C86 /* VariableHooksInterface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VariableHooksInterface.h; sourceTree = ""; }; - 0C12EDEB2616383C00B66C86 /* ScalarType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScalarType.h; sourceTree = ""; }; - 0C12EDEC2616383C00B66C86 /* Array.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Array.h; sourceTree = ""; }; - 0C12EDED2616383C00B66C86 /* stack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stack.h; sourceTree = ""; }; - 0C12EDEE2616383C00B66C86 /* ATenGeneral.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ATenGeneral.h; sourceTree = ""; }; - 0C12EDEF2616383C00B66C86 /* UnsafeFromTH.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnsafeFromTH.h; sourceTree = ""; }; - 0C12EDF02616383C00B66C86 /* QuantizerBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QuantizerBase.h; sourceTree = ""; }; - 0C12EDF12616383C00B66C86 /* alias_info.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = alias_info.h; sourceTree = ""; }; - 0C12EDF22616383C00B66C86 /* List_inl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = List_inl.h; sourceTree = ""; }; - 0C12EDF32616383C00B66C86 /* jit_type.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = jit_type.h; sourceTree = ""; }; - 0C12EDF42616383C00B66C86 /* ivalue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ivalue.h; sourceTree = ""; }; - 0C12EDF52616383C00B66C86 /* Dimname.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Dimname.h; sourceTree = ""; }; - 0C12EDF62616383C00B66C86 /* Vitals.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Vitals.h; sourceTree = ""; }; - 0C12EDF92616383C00B66C86 /* make_boxed_from_unboxed_functor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = make_boxed_from_unboxed_functor.h; sourceTree = ""; }; - 0C12EDFA2616383C00B66C86 /* boxing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = boxing.h; sourceTree = ""; }; - 0C12EDFB2616383C00B66C86 /* test_helpers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = test_helpers.h; sourceTree = ""; }; - 0C12EDFC2616383C00B66C86 /* WrapFunctionIntoFunctor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WrapFunctionIntoFunctor.h; sourceTree = ""; }; - 0C12EDFD2616383C00B66C86 /* WrapFunctionIntoRuntimeFunctor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WrapFunctionIntoRuntimeFunctor.h; sourceTree = ""; }; - 0C12EDFE2616383C00B66C86 /* KernelFunction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KernelFunction.h; sourceTree = ""; }; - 0C12EDFF2616383C00B66C86 /* KernelFunction_impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KernelFunction_impl.h; sourceTree = ""; }; - 0C12EE002616383C00B66C86 /* builtin_function.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = builtin_function.h; sourceTree = ""; }; - 0C12EE012616383C00B66C86 /* DimVector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DimVector.h; sourceTree = ""; }; - 0C12EE022616383C00B66C86 /* Reduction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Reduction.h; sourceTree = ""; }; - 0C12EE032616383C00B66C86 /* Tensor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Tensor.h; sourceTree = ""; }; - 0C12EE042616383C00B66C86 /* function.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = function.h; sourceTree = ""; }; - 0C12EE052616383C00B66C86 /* Generator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Generator.h; sourceTree = ""; }; - 0C12EE062616383C00B66C86 /* PhiloxRNGEngine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PhiloxRNGEngine.h; sourceTree = ""; }; - 0C12EE072616383C00B66C86 /* TensorAccessor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TensorAccessor.h; sourceTree = ""; }; - 0C12EE082616383C00B66C86 /* ivalue_inl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ivalue_inl.h; sourceTree = ""; }; - 0C12EE092616383C00B66C86 /* Variadic.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Variadic.h; sourceTree = ""; }; - 0C12EE0A2616383C00B66C86 /* VmapMode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VmapMode.h; sourceTree = ""; }; - 0C12EE0B2616383C00B66C86 /* BatchedFallback.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BatchedFallback.h; sourceTree = ""; }; - 0C12EE0C2616383C00B66C86 /* dlpack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dlpack.h; sourceTree = ""; }; - 0C12EE0D2616383C00B66C86 /* Config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Config.h; sourceTree = ""; }; - 0C12EE0E2616383C00B66C86 /* SparseTensorUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SparseTensorUtils.h; sourceTree = ""; }; - 0C12EE0F2616383C00B66C86 /* Backtrace.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Backtrace.h; sourceTree = ""; }; - 0C12EE122616383C00B66C86 /* vec256_bfloat16.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vec256_bfloat16.h; sourceTree = ""; }; - 0C12EE132616383C00B66C86 /* vec256_float_neon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vec256_float_neon.h; sourceTree = ""; }; - 0C12EE142616383C00B66C86 /* missing_vst1_neon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = missing_vst1_neon.h; sourceTree = ""; }; - 0C12EE152616383C00B66C86 /* vec256_qint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vec256_qint.h; sourceTree = ""; }; - 0C12EE162616383C00B66C86 /* intrinsics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = intrinsics.h; sourceTree = ""; }; - 0C12EE172616383C00B66C86 /* functional.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = functional.h; sourceTree = ""; }; - 0C12EE182616383C00B66C86 /* vec256_complex_float.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vec256_complex_float.h; sourceTree = ""; }; - 0C12EE192616383C00B66C86 /* vec256_double.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vec256_double.h; sourceTree = ""; }; - 0C12EE1A2616383C00B66C86 /* vec256_base.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vec256_base.h; sourceTree = ""; }; - 0C12EE1B2616383C00B66C86 /* vec256_float.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vec256_float.h; sourceTree = ""; }; - 0C12EE1C2616383C00B66C86 /* missing_vld1_neon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = missing_vld1_neon.h; sourceTree = ""; }; - 0C12EE1D2616383C00B66C86 /* vec256.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vec256.h; sourceTree = ""; }; - 0C12EE1E2616383C00B66C86 /* vec256_int.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vec256_int.h; sourceTree = ""; }; - 0C12EE1F2616383C00B66C86 /* vec256_complex_double.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vec256_complex_double.h; sourceTree = ""; }; - 0C12EE202616383C00B66C86 /* FlushDenormal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FlushDenormal.h; sourceTree = ""; }; - 0C12EE212616383C00B66C86 /* vml.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vml.h; sourceTree = ""; }; - 0C12EE222616383C00B66C86 /* TracerMode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TracerMode.h; sourceTree = ""; }; - 0C12EE232616383C00B66C86 /* Backend.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Backend.h; sourceTree = ""; }; - 0C12EE242616383C00B66C86 /* RegistrationDeclarations.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RegistrationDeclarations.h; sourceTree = ""; }; - 0C12EE252616383C00B66C86 /* CompositeImplicitAutogradFunctions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CompositeImplicitAutogradFunctions.h; sourceTree = ""; }; - 0C12EE262616383C00B66C86 /* PTThreadPool.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PTThreadPool.h; sourceTree = ""; }; - 0C12EE272616383C00B66C86 /* OpaqueTensorImpl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpaqueTensorImpl.h; sourceTree = ""; }; - 0C12EE282616383C00B66C86 /* LegacyTHFunctionsCPU.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LegacyTHFunctionsCPU.h; sourceTree = ""; }; - 0C12EE2A2616383C00B66C86 /* QTensorImpl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QTensorImpl.h; sourceTree = ""; }; - 0C12EE2B2616383C00B66C86 /* Quantizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Quantizer.h; sourceTree = ""; }; - 0C12EE2C2616383C00B66C86 /* record_function.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = record_function.h; sourceTree = ""; }; - 0C12EE2D2616383C00B66C86 /* WrapDimUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WrapDimUtils.h; sourceTree = ""; }; - 0C12EE2E2616383C00B66C86 /* RedispatchFunctions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RedispatchFunctions.h; sourceTree = ""; }; - 0C12EE2F2616383C00B66C86 /* Context.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Context.h; sourceTree = ""; }; - 0C12EE302616383C00B66C86 /* div_rtn.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = div_rtn.h; sourceTree = ""; }; - 0C12EE312616383C00B66C86 /* ExpandUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ExpandUtils.h; sourceTree = ""; }; - 0C12EE322616383C00B66C86 /* TypeDefault.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TypeDefault.h; sourceTree = ""; }; - 0C12EE332616383C00B66C86 /* CPUFixedAllocator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPUFixedAllocator.h; sourceTree = ""; }; - 0C12EE342616383C00B66C86 /* NamedTensor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NamedTensor.h; sourceTree = ""; }; - 0C12EE352616383C00B66C86 /* Scalar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Scalar.h; sourceTree = ""; }; - 0C12EE362616383C00B66C86 /* ParallelNativeTBB.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ParallelNativeTBB.h; sourceTree = ""; }; - 0C12EE372616383C00B66C86 /* ArrayRef.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ArrayRef.h; sourceTree = ""; }; - 0C12EE382616383C00B66C86 /* SequenceNumber.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SequenceNumber.h; sourceTree = ""; }; - 0C12EE392616383C00B66C86 /* MatrixRef.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MatrixRef.h; sourceTree = ""; }; - 0C12EE3A2616383C00B66C86 /* CompositeExplicitAutogradFunctions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CompositeExplicitAutogradFunctions.h; sourceTree = ""; }; - 0C12EE3B2616383C00B66C86 /* NumericUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NumericUtils.h; sourceTree = ""; }; - 0C12EE3C2616383C00B66C86 /* ATen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ATen.h; sourceTree = ""; }; - 0C12EE3D2616383C00B66C86 /* TensorNames.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TensorNames.h; sourceTree = ""; }; - 0C12EE3E2616383C00B66C86 /* TensorMeta.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TensorMeta.h; sourceTree = ""; }; - 0C12EE3F2616383C00B66C86 /* TensorIndexing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TensorIndexing.h; sourceTree = ""; }; - 0C12EE402616383C00B66C86 /* Layout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Layout.h; sourceTree = ""; }; - 0C12EE412616383C00B66C86 /* SparseTensorImpl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SparseTensorImpl.h; sourceTree = ""; }; - 0C12EE432616383C00B66C86 /* CUDAHooksInterface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CUDAHooksInterface.h; sourceTree = ""; }; - 0C12EE442616383C00B66C86 /* FunctionTraits.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FunctionTraits.h; sourceTree = ""; }; - 0C12EE452616383C00B66C86 /* HIPHooksInterface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HIPHooksInterface.h; sourceTree = ""; }; - 0C12EE462616383C00B66C86 /* WrapDimUtilsMulti.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WrapDimUtilsMulti.h; sourceTree = ""; }; - 0C12EE472616383C00B66C86 /* TensorOperators.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TensorOperators.h; sourceTree = ""; }; - 0C12EE482616383C00B66C86 /* ScalarType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScalarType.h; sourceTree = ""; }; - 0C12EE492616383C00B66C86 /* cpp_custom_type_hack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cpp_custom_type_hack.h; sourceTree = ""; }; - 0C12EE4A2616383C00B66C86 /* VmapTransforms.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VmapTransforms.h; sourceTree = ""; }; - 0C12EE4B2616383C00B66C86 /* Storage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Storage.h; sourceTree = ""; }; - 0C12EE4C2616383C00B66C86 /* DeviceGuard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DeviceGuard.h; sourceTree = ""; }; - 0C12EE4D2616383C00B66C86 /* ParallelNative.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ParallelNative.h; sourceTree = ""; }; - 0C12EE4E2616383C00B66C86 /* Dispatch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Dispatch.h; sourceTree = ""; }; - 0C12EE4F2616383C00B66C86 /* CPUGeneratorImpl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPUGeneratorImpl.h; sourceTree = ""; }; - 0C12EE502616383C00B66C86 /* Functions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Functions.h; sourceTree = ""; }; - 0C12EE512616383C00B66C86 /* ParallelOpenMP.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ParallelOpenMP.h; sourceTree = ""; }; - 0C12EE522616383C00B66C86 /* BatchedTensorImpl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BatchedTensorImpl.h; sourceTree = ""; }; - 0C12EE532616383C00B66C86 /* CPUApplyUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPUApplyUtils.h; sourceTree = ""; }; - 0C12EE542616383C00B66C86 /* ThreadLocalState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ThreadLocalState.h; sourceTree = ""; }; - 0C12EE552616383C00B66C86 /* ScalarOps.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScalarOps.h; sourceTree = ""; }; - 0C12EE562616383C00B66C86 /* NativeFunctions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NativeFunctions.h; sourceTree = ""; }; - 0C12EE572616383C00B66C86 /* DynamicLibrary.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DynamicLibrary.h; sourceTree = ""; }; - 0C12EE582616383C00B66C86 /* TensorGeometry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TensorGeometry.h; sourceTree = ""; }; - 0C12EE592616383C00B66C86 /* TensorIterator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TensorIterator.h; sourceTree = ""; }; - 0C12EE5A2616383C00B66C86 /* NamedTensorUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NamedTensorUtils.h; sourceTree = ""; }; - 0C12EE5B2616383C00B66C86 /* Dimname.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Dimname.h; sourceTree = ""; }; - 0C12EE5C2616383C00B66C86 /* autocast_mode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = autocast_mode.h; sourceTree = ""; }; - 0C12EE5D2616383C00B66C86 /* Parallel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Parallel.h; sourceTree = ""; }; - 0C12EE5E2616383C00B66C86 /* DimVector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DimVector.h; sourceTree = ""; }; - 0C12EE5F2616383C00B66C86 /* InferSize.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InferSize.h; sourceTree = ""; }; - 0C12EE602616383C00B66C86 /* SmallVector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SmallVector.h; sourceTree = ""; }; - 0C12EE612616383C00B66C86 /* Tensor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Tensor.h; sourceTree = ""; }; - 0C12EE622616383C00B66C86 /* Generator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Generator.h; sourceTree = ""; }; - 0C12EE632616383C00B66C86 /* AccumulateType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AccumulateType.h; sourceTree = ""; }; - 0C12EE642616383C00B66C86 /* TensorAccessor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TensorAccessor.h; sourceTree = ""; }; - 0C12EE652616383C00B66C86 /* LegacyTHFunctionsCUDA.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LegacyTHFunctionsCUDA.h; sourceTree = ""; }; - 0C12EE6A2616383C00B66C86 /* InlineStreamGuard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InlineStreamGuard.h; sourceTree = ""; }; - 0C12EE6B2616383C00B66C86 /* SizesAndStrides.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SizesAndStrides.h; sourceTree = ""; }; - 0C12EE6C2616383C00B66C86 /* InlineDeviceGuard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InlineDeviceGuard.h; sourceTree = ""; }; - 0C12EE6D2616383C00B66C86 /* LocalDispatchKeySet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LocalDispatchKeySet.h; sourceTree = ""; }; - 0C12EE6E2616383C00B66C86 /* VirtualGuardImpl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VirtualGuardImpl.h; sourceTree = ""; }; - 0C12EE6F2616383C00B66C86 /* InlineEvent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InlineEvent.h; sourceTree = ""; }; - 0C12EE702616383C00B66C86 /* DeviceGuardImplInterface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DeviceGuardImplInterface.h; sourceTree = ""; }; - 0C12EE712616383C00B66C86 /* FakeGuardImpl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FakeGuardImpl.h; sourceTree = ""; }; - 0C12EE722616383C00B66C86 /* QEngine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QEngine.h; sourceTree = ""; }; - 0C12EE732616383C00B66C86 /* TensorOptions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TensorOptions.h; sourceTree = ""; }; - 0C12EE742616383C00B66C86 /* Device.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Device.h; sourceTree = ""; }; - 0C12EE752616383C00B66C86 /* CPUAllocator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPUAllocator.h; sourceTree = ""; }; - 0C12EE762616383C00B66C86 /* DefaultDtype.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DefaultDtype.h; sourceTree = ""; }; - 0C12EE772616383C00B66C86 /* DefaultTensorOptions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DefaultTensorOptions.h; sourceTree = ""; }; - 0C12EE782616383C00B66C86 /* Event.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Event.h; sourceTree = ""; }; - 0C12EE792616383C00B66C86 /* Backend.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Backend.h; sourceTree = ""; }; - 0C12EE7A2616383C00B66C86 /* CompileTimeFunctionPointer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CompileTimeFunctionPointer.h; sourceTree = ""; }; - 0C12EE7B2616383C00B66C86 /* WrapDimMinimal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WrapDimMinimal.h; sourceTree = ""; }; - 0C12EE7C2616383C00B66C86 /* QScheme.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QScheme.h; sourceTree = ""; }; - 0C12EE7D2616383C00B66C86 /* Stream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Stream.h; sourceTree = ""; }; - 0C12EE7E2616383C00B66C86 /* UndefinedTensorImpl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UndefinedTensorImpl.h; sourceTree = ""; }; - 0C12EE7F2616383C00B66C86 /* Scalar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Scalar.h; sourceTree = ""; }; - 0C12EE802616383C00B66C86 /* thread_pool.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = thread_pool.h; sourceTree = ""; }; - 0C12EE812616383C00B66C86 /* CopyBytes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CopyBytes.h; sourceTree = ""; }; - 0C12EE822616383C00B66C86 /* StreamGuard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StreamGuard.h; sourceTree = ""; }; - 0C12EE832616383C00B66C86 /* Layout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Layout.h; sourceTree = ""; }; - 0C12EE842616383C00B66C86 /* GeneratorImpl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GeneratorImpl.h; sourceTree = ""; }; - 0C12EE852616383C00B66C86 /* DispatchKeySet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DispatchKeySet.h; sourceTree = ""; }; - 0C12EE862616383C00B66C86 /* Allocator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Allocator.h; sourceTree = ""; }; - 0C12EE872616383C00B66C86 /* TensorImpl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TensorImpl.h; sourceTree = ""; }; - 0C12EE882616383C00B66C86 /* ScalarType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScalarType.h; sourceTree = ""; }; - 0C12EE892616383C00B66C86 /* Storage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Storage.h; sourceTree = ""; }; - 0C12EE8A2616383C00B66C86 /* DeviceType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DeviceType.h; sourceTree = ""; }; - 0C12EE8B2616383C00B66C86 /* DeviceGuard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DeviceGuard.h; sourceTree = ""; }; - 0C12EE8C2616383C00B66C86 /* StorageImpl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StorageImpl.h; sourceTree = ""; }; - 0C12EE8D2616383C00B66C86 /* MemoryFormat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MemoryFormat.h; sourceTree = ""; }; - 0C12EE8E2616383C00B66C86 /* DispatchKey.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DispatchKey.h; sourceTree = ""; }; - 0C12EE8F2616383C00B66C86 /* ScalarTypeToTypeMeta.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScalarTypeToTypeMeta.h; sourceTree = ""; }; - 0C12EE902616383C00B66C86 /* InferenceMode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InferenceMode.h; sourceTree = ""; }; - 0C12EE952616383C00B66C86 /* complex_test_common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = complex_test_common.h; sourceTree = ""; }; - 0C12EE962616383C00B66C86 /* complex_math_test_common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = complex_math_test_common.h; sourceTree = ""; }; - 0C12EE972616383C00B66C86 /* Macros.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Macros.h; sourceTree = ""; }; - 0C12EE992616383C00B66C86 /* Type.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Type.h; sourceTree = ""; }; - 0C12EE9A2616383C00B66C86 /* order_preserving_flat_hash_map.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = order_preserving_flat_hash_map.h; sourceTree = ""; }; - 0C12EE9B2616383C00B66C86 /* reverse_iterator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = reverse_iterator.h; sourceTree = ""; }; - 0C12EE9C2616383C00B66C86 /* quint4x2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = quint4x2.h; sourceTree = ""; }; - 0C12EE9D2616383C00B66C86 /* Half.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Half.h; sourceTree = ""; }; - 0C12EE9E2616383C00B66C86 /* flat_hash_map.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = flat_hash_map.h; sourceTree = ""; }; - 0C12EE9F2616383C00B66C86 /* llvmMathExtras.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = llvmMathExtras.h; sourceTree = ""; }; - 0C12EEA02616383C00B66C86 /* math_compat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = math_compat.h; sourceTree = ""; }; - 0C12EEA12616383C00B66C86 /* Bitset.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Bitset.h; sourceTree = ""; }; - 0C12EEA22616383C00B66C86 /* typeid.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = typeid.h; sourceTree = ""; }; - 0C12EEA32616383C00B66C86 /* intrusive_ptr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = intrusive_ptr.h; sourceTree = ""; }; - 0C12EEA42616383C00B66C86 /* string_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = string_utils.h; sourceTree = ""; }; - 0C12EEA52616383C00B66C86 /* win32-headers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "win32-headers.h"; sourceTree = ""; }; - 0C12EEA62616383C00B66C86 /* AlignOf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AlignOf.h; sourceTree = ""; }; - 0C12EEA72616383C00B66C86 /* numa.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = numa.h; sourceTree = ""; }; - 0C12EEA82616383C00B66C86 /* qint32.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = qint32.h; sourceTree = ""; }; - 0C12EEA92616383C00B66C86 /* MaybeOwned.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MaybeOwned.h; sourceTree = ""; }; - 0C12EEAA2616383C00B66C86 /* Half-inl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "Half-inl.h"; sourceTree = ""; }; - 0C12EEAB2616383C00B66C86 /* TypeTraits.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TypeTraits.h; sourceTree = ""; }; - 0C12EEAC2616383C00B66C86 /* FunctionRef.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FunctionRef.h; sourceTree = ""; }; - 0C12EEAD2616383C00B66C86 /* Backtrace.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Backtrace.h; sourceTree = ""; }; - 0C12EEAE2616383C00B66C86 /* BFloat16-inl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "BFloat16-inl.h"; sourceTree = ""; }; - 0C12EEAF2616383C00B66C86 /* in_place.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = in_place.h; sourceTree = ""; }; - 0C12EEB02616383C00B66C86 /* ConstexprCrc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ConstexprCrc.h; sourceTree = ""; }; - 0C12EEB12616383C00B66C86 /* IdWrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IdWrapper.h; sourceTree = ""; }; - 0C12EEB22616383C00B66C86 /* Flags.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Flags.h; sourceTree = ""; }; - 0C12EEB32616383C00B66C86 /* overloaded.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = overloaded.h; sourceTree = ""; }; - 0C12EEB42616383C00B66C86 /* quint8.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = quint8.h; sourceTree = ""; }; - 0C12EEB52616383C00B66C86 /* StringUtil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StringUtil.h; sourceTree = ""; }; - 0C12EEB62616383C00B66C86 /* Logging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Logging.h; sourceTree = ""; }; - 0C12EEB72616383C00B66C86 /* MathConstants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MathConstants.h; sourceTree = ""; }; - 0C12EEB82616383C00B66C86 /* Registry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Registry.h; sourceTree = ""; }; - 0C12EEB92616383C00B66C86 /* Optional.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Optional.h; sourceTree = ""; }; - 0C12EEBA2616383C00B66C86 /* tempfile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tempfile.h; sourceTree = ""; }; - 0C12EEBB2616383C00B66C86 /* ArrayRef.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ArrayRef.h; sourceTree = ""; }; - 0C12EEBC2616383C00B66C86 /* thread_name.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = thread_name.h; sourceTree = ""; }; - 0C12EEBD2616383C00B66C86 /* Unicode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Unicode.h; sourceTree = ""; }; - 0C12EEBE2616383C00B66C86 /* TypeCast.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TypeCast.h; sourceTree = ""; }; - 0C12EEBF2616383C00B66C86 /* sparse_bitset.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sparse_bitset.h; sourceTree = ""; }; - 0C12EEC02616383C00B66C86 /* BFloat16.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BFloat16.h; sourceTree = ""; }; - 0C12EEC12616383C00B66C86 /* TypeList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TypeList.h; sourceTree = ""; }; - 0C12EEC22616383C00B66C86 /* TypeIndex.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TypeIndex.h; sourceTree = ""; }; - 0C12EEC32616383C00B66C86 /* Array.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Array.h; sourceTree = ""; }; - 0C12EEC42616383C00B66C86 /* logging_is_google_glog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = logging_is_google_glog.h; sourceTree = ""; }; - 0C12EEC52616383C00B66C86 /* Metaprogramming.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Metaprogramming.h; sourceTree = ""; }; - 0C12EEC62616383C00B66C86 /* either.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = either.h; sourceTree = ""; }; - 0C12EEC72616383C00B66C86 /* BFloat16-math.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "BFloat16-math.h"; sourceTree = ""; }; - 0C12EEC82616383C00B66C86 /* Deprecated.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Deprecated.h; sourceTree = ""; }; - 0C12EEC92616383C00B66C86 /* irange.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = irange.h; sourceTree = ""; }; - 0C12EECA2616383C00B66C86 /* LeftRight.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LeftRight.h; sourceTree = ""; }; - 0C12EECB2616383C00B66C86 /* qint8.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = qint8.h; sourceTree = ""; }; - 0C12EECC2616383C00B66C86 /* complex_math.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = complex_math.h; sourceTree = ""; }; - 0C12EECD2616383C00B66C86 /* logging_is_not_google_glog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = logging_is_not_google_glog.h; sourceTree = ""; }; - 0C12EECE2616383C00B66C86 /* Exception.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Exception.h; sourceTree = ""; }; - 0C12EECF2616383C00B66C86 /* UniqueVoidPtr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UniqueVoidPtr.h; sourceTree = ""; }; - 0C12EED02616383C00B66C86 /* ThreadLocalDebugInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ThreadLocalDebugInfo.h; sourceTree = ""; }; - 0C12EED12616383C00B66C86 /* accumulate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = accumulate.h; sourceTree = ""; }; - 0C12EED22616383C00B66C86 /* C++17.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "C++17.h"; sourceTree = ""; }; - 0C12EED32616383C00B66C86 /* SmallVector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SmallVector.h; sourceTree = ""; }; - 0C12EED42616383C00B66C86 /* hash.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hash.h; sourceTree = ""; }; - 0C12EED52616383C00B66C86 /* python_stub.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = python_stub.h; sourceTree = ""; }; - 0C12EED62616383C00B66C86 /* complex.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = complex.h; sourceTree = ""; }; - 0C12EED72616383C00B66C86 /* string_view.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = string_view.h; sourceTree = ""; }; - 0C12EED82616383C00B66C86 /* variant.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = variant.h; sourceTree = ""; }; - 0C12EED92616383C00B66C86 /* complex_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = complex_utils.h; sourceTree = ""; }; - 0C12EEDC2616383C00B66C86 /* CUDATest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CUDATest.h; sourceTree = ""; }; - 0C12EEDD2616383C00B66C86 /* CUDAGuardImpl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CUDAGuardImpl.h; sourceTree = ""; }; - 0C12EEDE2616383C00B66C86 /* CUDAMathCompat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CUDAMathCompat.h; sourceTree = ""; }; - 0C12EEE12616383C00B66C86 /* CUDAStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CUDAStream.h; sourceTree = ""; }; - 0C12EEE22616383C00B66C86 /* CUDAGuard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CUDAGuard.h; sourceTree = ""; }; - 0C12EEE32616383C00B66C86 /* CUDAGraphsC10Utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CUDAGraphsC10Utils.h; sourceTree = ""; }; - 0C12EEE42616383C00B66C86 /* CUDAMacros.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CUDAMacros.h; sourceTree = ""; }; - 0C12EEE52616383C00B66C86 /* CUDAFunctions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CUDAFunctions.h; sourceTree = ""; }; - 0C12EEE62616383C00B66C86 /* CUDAException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CUDAException.h; sourceTree = ""; }; - 0C12EEE72616383C00B66C86 /* CUDACachingAllocator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CUDACachingAllocator.h; sourceTree = ""; }; - 0C12EEE92616383C00B66C86 /* cmake_macros.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cmake_macros.h; sourceTree = ""; }; - 0C12EEEA2616383C00B66C86 /* Export.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Export.h; sourceTree = ""; }; - 0C12EEEB2616383C00B66C86 /* Macros.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Macros.h; sourceTree = ""; }; - 0C12EEED2616383C00B66C86 /* CPUCachingAllocator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPUCachingAllocator.h; sourceTree = ""; }; - 0C12EEEE2616383C00B66C86 /* CPUProfilingAllocator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CPUProfilingAllocator.h; sourceTree = ""; }; - 0C12EEF02616383C00B66C86 /* psimd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = psimd.h; sourceTree = ""; }; - 0C12EEF12616383C00B66C86 /* fxdiv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fxdiv.h; sourceTree = ""; }; - 0C12EEF32616383C00B66C86 /* avx.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = avx.py; sourceTree = ""; }; - 0C12EEF42616383C00B66C86 /* __init__.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = __init__.py; sourceTree = ""; }; - 0C12EEF52616383C00B66C86 /* fp16.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fp16.h; sourceTree = ""; }; - 0C12EEF62616383C00B66C86 /* avx2.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = avx2.py; sourceTree = ""; }; - 0C12EEF72616383C00B66C86 /* psimd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = psimd.h; sourceTree = ""; }; - 0C12EEF82616383C00B66C86 /* bitcasts.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bitcasts.h; sourceTree = ""; }; - 0C12EEFB2616383C00B66C86 /* THCUNN.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = THCUNN.h; sourceTree = ""; }; - 0C12EEFD2616383C00B66C86 /* THTensorDimApply.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = THTensorDimApply.h; sourceTree = ""; }; - 0C12EEFE2616383C00B66C86 /* THBlas.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = THBlas.h; sourceTree = ""; }; - 0C12EEFF2616383C00B66C86 /* THGenerateQUInt8Type.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = THGenerateQUInt8Type.h; sourceTree = ""; }; - 0C12EF002616383C00B66C86 /* THGenerateQInt8Type.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = THGenerateQInt8Type.h; sourceTree = ""; }; - 0C12EF012616383C00B66C86 /* THGenerateComplexTypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = THGenerateComplexTypes.h; sourceTree = ""; }; - 0C12EF022616383C00B66C86 /* THGenerateFloatType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = THGenerateFloatType.h; sourceTree = ""; }; - 0C12EF032616383C00B66C86 /* THGenerateQInt32Type.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = THGenerateQInt32Type.h; sourceTree = ""; }; - 0C12EF042616383C00B66C86 /* THGenerateDoubleType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = THGenerateDoubleType.h; sourceTree = ""; }; - 0C12EF052616383C00B66C86 /* THGenerateShortType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = THGenerateShortType.h; sourceTree = ""; }; - 0C12EF062616383C00B66C86 /* THGenerateIntTypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = THGenerateIntTypes.h; sourceTree = ""; }; - 0C12EF072616383C00B66C86 /* THGenerateLongType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = THGenerateLongType.h; sourceTree = ""; }; - 0C12EF082616383C00B66C86 /* THGenerateComplexFloatType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = THGenerateComplexFloatType.h; sourceTree = ""; }; - 0C12EF092616383C00B66C86 /* THAllocator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = THAllocator.h; sourceTree = ""; }; - 0C12EF0A2616383C00B66C86 /* THGenerateCharType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = THGenerateCharType.h; sourceTree = ""; }; - 0C12EF0B2616383C00B66C86 /* THStorage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = THStorage.h; sourceTree = ""; }; - 0C12EF0C2616383C00B66C86 /* THHalf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = THHalf.h; sourceTree = ""; }; - 0C12EF0D2616383C00B66C86 /* THGenerateHalfType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = THGenerateHalfType.h; sourceTree = ""; }; - 0C12EF0E2616383C00B66C86 /* THGenerateIntType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = THGenerateIntType.h; sourceTree = ""; }; - 0C12EF0F2616383C00B66C86 /* THVector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = THVector.h; sourceTree = ""; }; - 0C12EF102616383C00B66C86 /* THGeneral.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = THGeneral.h; sourceTree = ""; }; - 0C12EF112616383C00B66C86 /* THGenerateBoolType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = THGenerateBoolType.h; sourceTree = ""; }; - 0C12EF122616383C00B66C86 /* THLapack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = THLapack.h; sourceTree = ""; }; - 0C12EF132616383C00B66C86 /* THGenerateComplexDoubleType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = THGenerateComplexDoubleType.h; sourceTree = ""; }; - 0C12EF142616383C00B66C86 /* THGenerateBFloat16Type.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = THGenerateBFloat16Type.h; sourceTree = ""; }; - 0C12EF152616383C00B66C86 /* THGenerateQTypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = THGenerateQTypes.h; sourceTree = ""; }; - 0C12EF162616383C00B66C86 /* THGenerateFloatTypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = THGenerateFloatTypes.h; sourceTree = ""; }; - 0C12EF182616383C00B66C86 /* THBlas.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = THBlas.h; sourceTree = ""; }; - 0C12EF192616383C00B66C86 /* THTensor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = THTensor.cpp; sourceTree = ""; }; - 0C12EF1A2616383C00B66C86 /* THTensorMath.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = THTensorMath.cpp; sourceTree = ""; }; - 0C12EF1B2616383C00B66C86 /* THTensorMath.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = THTensorMath.h; sourceTree = ""; }; - 0C12EF1C2616383C00B66C86 /* THStorageCopy.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = THStorageCopy.cpp; sourceTree = ""; }; - 0C12EF1D2616383C00B66C86 /* THTensorFastGetSet.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = THTensorFastGetSet.hpp; sourceTree = ""; }; - 0C12EF1E2616383C00B66C86 /* THStorage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = THStorage.h; sourceTree = ""; }; - 0C12EF1F2616383C00B66C86 /* THTensorLapack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = THTensorLapack.h; sourceTree = ""; }; - 0C12EF202616383C00B66C86 /* THVector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = THVector.h; sourceTree = ""; }; - 0C12EF212616383C00B66C86 /* THLapack.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = THLapack.cpp; sourceTree = ""; }; - 0C12EF222616383C00B66C86 /* THStorageCopy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = THStorageCopy.h; sourceTree = ""; }; - 0C12EF232616383C00B66C86 /* THLapack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = THLapack.h; sourceTree = ""; }; - 0C12EF242616383C00B66C86 /* THStorage.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = THStorage.cpp; sourceTree = ""; }; - 0C12EF252616383C00B66C86 /* THTensor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = THTensor.h; sourceTree = ""; }; - 0C12EF262616383C00B66C86 /* THBlas.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = THBlas.cpp; sourceTree = ""; }; - 0C12EF272616383C00B66C86 /* THTensorLapack.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = THTensorLapack.cpp; sourceTree = ""; }; - 0C12EF282616383C00B66C86 /* THTensor.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = THTensor.hpp; sourceTree = ""; }; - 0C12EF292616383C00B66C86 /* THTensor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = THTensor.h; sourceTree = ""; }; - 0C12EF2A2616383C00B66C86 /* TH.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TH.h; sourceTree = ""; }; - 0C12EF2B2616383C00B66C86 /* THTensorApply.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = THTensorApply.h; sourceTree = ""; }; - 0C12EF2C2616383C00B66C86 /* THStorageFunctions.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = THStorageFunctions.hpp; sourceTree = ""; }; - 0C12EF2D2616383C00B66C86 /* THGenerateAllTypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = THGenerateAllTypes.h; sourceTree = ""; }; - 0C12EF2E2616383C00B66C86 /* THTensor.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = THTensor.hpp; sourceTree = ""; }; - 0C12EF2F2616383C00B66C86 /* THGenerateByteType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = THGenerateByteType.h; sourceTree = ""; }; - 0C12EF302616383C00B66C86 /* THStorageFunctions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = THStorageFunctions.h; sourceTree = ""; }; - 0C12EF312616383C00B66C86 /* THGenerateQUInt4x2Type.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = THGenerateQUInt4x2Type.h; sourceTree = ""; }; - 0C12EF332616383C00B66C86 /* libtorch_cpu.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libtorch_cpu.a; sourceTree = ""; }; - 0C12EF342616383C00B66C86 /* libtorch.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libtorch.a; sourceTree = ""; }; - 0C12EF352616383C00B66C86 /* libcpuinfo.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libcpuinfo.a; sourceTree = ""; }; - 0C12EF362616383C00B66C86 /* libXNNPACK.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libXNNPACK.a; sourceTree = ""; }; - 0C12EF372616383C00B66C86 /* libtorchvision_ops.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libtorchvision_ops.a; sourceTree = ""; }; - 0C12EF382616383C00B66C86 /* libpthreadpool.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libpthreadpool.a; sourceTree = ""; }; - 0C12EF392616383C00B66C86 /* libc10.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libc10.a; sourceTree = ""; }; - 0C12EF3A2616383C00B66C86 /* libeigen_blas.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libeigen_blas.a; sourceTree = ""; }; - 0C12EF3B2616383C00B66C86 /* libclog.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libclog.a; sourceTree = ""; }; - 0C12EF3C2616383C00B66C86 /* libpytorch_qnnpack.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libpytorch_qnnpack.a; sourceTree = ""; }; 0C12EF7526163B7600B66C86 /* frcnn_mnetv3.pt */ = {isa = PBXFileReference; lastKnownFileType = file; path = frcnn_mnetv3.pt; sourceTree = ""; }; + 0CDCAE45274ED8FA006F9077 /* CoreML.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreML.framework; path = System/Library/Frameworks/CoreML.framework; sourceTree = SDKROOT; }; + 0CDCAE47274ED902006F9077 /* MetalPerformanceShaders.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MetalPerformanceShaders.framework; path = System/Library/Frameworks/MetalPerformanceShaders.framework; sourceTree = SDKROOT; }; + 0CDCAE49274ED909006F9077 /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; }; 0CEB0ABB26151A8800F1F7D5 /* VisionTestApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = VisionTestApp.app; sourceTree = BUILT_PRODUCTS_DIR; }; 0CEB0ABE26151A8800F1F7D5 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 0CEB0ABF26151A8800F1F7D5 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; @@ -1780,3762 +44,21 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 0C12EF502616383D00B66C86 /* libpytorch_qnnpack.a in Frameworks */, - 0C12EF4C2616383D00B66C86 /* libpthreadpool.a in Frameworks */, - 0C12EF4F2616383D00B66C86 /* libclog.a in Frameworks */, - 0C12EF482616383D00B66C86 /* libtorch.a in Frameworks */, - 0C12EF4A2616383D00B66C86 /* libXNNPACK.a in Frameworks */, - 0C12EF472616383D00B66C86 /* libtorch_cpu.a in Frameworks */, - 0C12EF7A26163C7C00B66C86 /* libtorchvision_ops.a in Frameworks */, - 0C12EF492616383D00B66C86 /* libcpuinfo.a in Frameworks */, - 0C12EF4E2616383D00B66C86 /* libeigen_blas.a in Frameworks */, - 0C12EF4D2616383D00B66C86 /* libc10.a in Frameworks */, + 0CDCAE4A274ED909006F9077 /* Accelerate.framework in Frameworks */, + 0CDCAE48274ED902006F9077 /* MetalPerformanceShaders.framework in Frameworks */, + 0CDCAE46274ED8FA006F9077 /* CoreML.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 0C12E7872616383A00B66C86 /* install */ = { - isa = PBXGroup; - children = ( - 0C12E7882616383A00B66C86 /* include */, - 0C12EF322616383C00B66C86 /* lib */, - ); - path = install; - sourceTree = ""; - }; - 0C12E7882616383A00B66C86 /* include */ = { - isa = PBXGroup; - children = ( - 0C12E7892616383A00B66C86 /* pybind11 */, - 0C12E7A32616383A00B66C86 /* caffe2 */, - 0C12EAB22616383B00B66C86 /* cpuinfo.h */, - 0C12EAB32616383B00B66C86 /* torch */, - 0C12EDAA2616383C00B66C86 /* xnnpack.h */, - 0C12EDAB2616383C00B66C86 /* fp16.h */, - 0C12EDAC2616383C00B66C86 /* qnnpack_func.h */, - 0C12EDAD2616383C00B66C86 /* pthreadpool.h */, - 0C12EDAE2616383C00B66C86 /* clog.h */, - 0C12EDAF2616383C00B66C86 /* ATen */, - 0C12EE662616383C00B66C86 /* c10 */, - 0C12EEF02616383C00B66C86 /* psimd.h */, - 0C12EEF12616383C00B66C86 /* fxdiv.h */, - 0C12EEF22616383C00B66C86 /* fp16 */, - 0C12EEF92616383C00B66C86 /* THCUNN */, - 0C12EEFC2616383C00B66C86 /* TH */, - ); - path = include; - sourceTree = ""; - }; - 0C12E7892616383A00B66C86 /* pybind11 */ = { - isa = PBXGroup; - children = ( - 0C12E78A2616383A00B66C86 /* attr.h */, - 0C12E78B2616383A00B66C86 /* embed.h */, - 0C12E78C2616383A00B66C86 /* numpy.h */, - 0C12E78D2616383A00B66C86 /* pybind11.h */, - 0C12E78E2616383A00B66C86 /* operators.h */, - 0C12E78F2616383A00B66C86 /* iostream.h */, - 0C12E7902616383A00B66C86 /* chrono.h */, - 0C12E7912616383A00B66C86 /* stl_bind.h */, - 0C12E7922616383A00B66C86 /* buffer_info.h */, - 0C12E7932616383A00B66C86 /* options.h */, - 0C12E7942616383A00B66C86 /* functional.h */, - 0C12E7952616383A00B66C86 /* stl.h */, - 0C12E7962616383A00B66C86 /* detail */, - 0C12E79D2616383A00B66C86 /* common.h */, - 0C12E79E2616383A00B66C86 /* eval.h */, - 0C12E79F2616383A00B66C86 /* cast.h */, - 0C12E7A02616383A00B66C86 /* eigen.h */, - 0C12E7A12616383A00B66C86 /* pytypes.h */, - 0C12E7A22616383A00B66C86 /* complex.h */, - ); - path = pybind11; - sourceTree = ""; - }; - 0C12E7962616383A00B66C86 /* detail */ = { - isa = PBXGroup; - children = ( - 0C12E7972616383A00B66C86 /* typeid.h */, - 0C12E7982616383A00B66C86 /* descr.h */, - 0C12E7992616383A00B66C86 /* internals.h */, - 0C12E79A2616383A00B66C86 /* common.h */, - 0C12E79B2616383A00B66C86 /* class.h */, - 0C12E79C2616383A00B66C86 /* init.h */, - ); - path = detail; - sourceTree = ""; - }; - 0C12E7A32616383A00B66C86 /* caffe2 */ = { - isa = PBXGroup; - children = ( - 0C12E7A42616383A00B66C86 /* video */, - 0C12E7A92616383A00B66C86 /* ideep */, - 0C12E7B32616383A00B66C86 /* core */, - 0C12E80E2616383A00B66C86 /* mpi */, - 0C12E8112616383A00B66C86 /* proto */, - 0C12E8142616383A00B66C86 /* test */, - 0C12E8162616383A00B66C86 /* operators */, - 0C12E9432616383A00B66C86 /* onnx */, - 0C12E9502616383A00B66C86 /* python */, - 0C12E9702616383A00B66C86 /* distributed */, - 0C12E9772616383A00B66C86 /* perfkernels */, - 0C12E9852616383A00B66C86 /* experiments */, - 0C12E9902616383A00B66C86 /* cuda_rtc */, - 0C12E9922616383A00B66C86 /* serialize */, - 0C12E9992616383A00B66C86 /* utils */, - 0C12E9BE2616383B00B66C86 /* contrib */, - 0C12E9F72616383B00B66C86 /* image */, - 0C12E9FA2616383B00B66C86 /* quantization */, - 0C12EA2B2616383B00B66C86 /* transforms */, - 0C12EA302616383B00B66C86 /* mobile */, - 0C12EA572616383B00B66C86 /* sgd */, - 0C12EA702616383B00B66C86 /* queue */, - 0C12EA762616383B00B66C86 /* db */, - 0C12EA782616383B00B66C86 /* opt */, - 0C12EA962616383B00B66C86 /* predictor */, - 0C12EAA72616383B00B66C86 /* observers */, - 0C12EAAC2616383B00B66C86 /* share */, - ); - path = caffe2; - sourceTree = ""; - }; - 0C12E7A42616383A00B66C86 /* video */ = { - isa = PBXGroup; - children = ( - 0C12E7A52616383A00B66C86 /* optical_flow.h */, - 0C12E7A62616383A00B66C86 /* video_decoder.h */, - 0C12E7A72616383A00B66C86 /* video_input_op.h */, - 0C12E7A82616383A00B66C86 /* video_io.h */, - ); - path = video; - sourceTree = ""; - }; - 0C12E7A92616383A00B66C86 /* ideep */ = { - isa = PBXGroup; - children = ( - 0C12E7AA2616383A00B66C86 /* operators */, - 0C12E7AF2616383A00B66C86 /* utils */, - 0C12E7B22616383A00B66C86 /* ideep_utils.h */, - ); - path = ideep; - sourceTree = ""; - }; - 0C12E7AA2616383A00B66C86 /* operators */ = { - isa = PBXGroup; - children = ( - 0C12E7AB2616383A00B66C86 /* conv_transpose_unpool_base_op.h */, - 0C12E7AC2616383A00B66C86 /* quantization */, - 0C12E7AD2616383A00B66C86 /* operator_fallback_ideep.h */, - 0C12E7AE2616383A00B66C86 /* conv_pool_base_op.h */, - ); - path = operators; - sourceTree = ""; - }; - 0C12E7AC2616383A00B66C86 /* quantization */ = { - isa = PBXGroup; - children = ( - ); - path = quantization; - sourceTree = ""; - }; - 0C12E7AF2616383A00B66C86 /* utils */ = { - isa = PBXGroup; - children = ( - 0C12E7B02616383A00B66C86 /* ideep_context.h */, - 0C12E7B12616383A00B66C86 /* ideep_operator.h */, - ); - path = utils; - sourceTree = ""; - }; - 0C12E7B32616383A00B66C86 /* core */ = { - isa = PBXGroup; - children = ( - 0C12E7B42616383A00B66C86 /* net_async_task_graph.h */, - 0C12E7B52616383A00B66C86 /* net_simple_refcount.h */, - 0C12E7B62616383A00B66C86 /* tensor_impl.h */, - 0C12E7B72616383A00B66C86 /* plan_executor.h */, - 0C12E7B82616383A00B66C86 /* qtensor_serialization.h */, - 0C12E7B92616383A00B66C86 /* context_gpu.h */, - 0C12E7BA2616383A00B66C86 /* observer.h */, - 0C12E7BB2616383A00B66C86 /* blob_serializer_base.h */, - 0C12E7BC2616383A00B66C86 /* memonger.h */, - 0C12E7BD2616383A00B66C86 /* tensor_int8.h */, - 0C12E7BE2616383A00B66C86 /* static_tracepoint.h */, - 0C12E7BF2616383A00B66C86 /* net.h */, - 0C12E7C02616383A00B66C86 /* numa.h */, - 0C12E7C12616383A00B66C86 /* scope_guard.h */, - 0C12E7C22616383A00B66C86 /* test_utils.h */, - 0C12E7C32616383A00B66C86 /* event.h */, - 0C12E7C42616383A00B66C86 /* types.h */, - 0C12E7C52616383A00B66C86 /* context_base.h */, - 0C12E7C62616383A00B66C86 /* operator.h */, - 0C12E7C72616383A00B66C86 /* db.h */, - 0C12E7C82616383A00B66C86 /* blob.h */, - 0C12E7C92616383A00B66C86 /* static_tracepoint_elfx86.h */, - 0C12E7CA2616383A00B66C86 /* net_async_tracing.h */, - 0C12E7CB2616383A00B66C86 /* flags.h */, - 0C12E7CC2616383A00B66C86 /* net_async_task_future.h */, - 0C12E7CD2616383A00B66C86 /* operator_schema.h */, - 0C12E7CE2616383A00B66C86 /* context.h */, - 0C12E7CF2616383A00B66C86 /* net_async_base.h */, - 0C12E7D02616383A00B66C86 /* prof_dag_counters.h */, - 0C12E7D12616383A00B66C86 /* logging.h */, - 0C12E7D22616383A00B66C86 /* net_async_scheduling.h */, - 0C12E7D32616383A00B66C86 /* graph.h */, - 0C12E7D42616383A00B66C86 /* common_cudnn.h */, - 0C12E7D52616383A00B66C86 /* net_async_task.h */, - 0C12E7D62616383A00B66C86 /* export_caffe2_op_to_c10.h */, - 0C12E7D72616383A00B66C86 /* net_simple.h */, - 0C12E7D82616383A00B66C86 /* workspace.h */, - 0C12E7D92616383A00B66C86 /* timer.h */, - 0C12E7DA2616383A00B66C86 /* event_cpu.h */, - 0C12E7DB2616383A00B66C86 /* common.h */, - 0C12E7DC2616383A00B66C86 /* blob_stats.h */, - 0C12E7DD2616383A00B66C86 /* allocator.h */, - 0C12E7DE2616383A00B66C86 /* macros.h */, - 0C12E7DF2616383A00B66C86 /* hip */, - 0C12E7E22616383A00B66C86 /* storage.h */, - 0C12E7E32616383A00B66C86 /* transform.h */, - 0C12E7E42616383A00B66C86 /* common_omp.h */, - 0C12E7E52616383A00B66C86 /* export_c10_op_to_caffe2.h */, - 0C12E7E62616383A00B66C86 /* nomnigraph */, - 0C12E8022616383A00B66C86 /* module.h */, - 0C12E8032616383A00B66C86 /* init.h */, - 0C12E8042616383A00B66C86 /* net_dag_utils.h */, - 0C12E8052616383A00B66C86 /* stats.h */, - 0C12E8062616383A00B66C86 /* tensor.h */, - 0C12E8072616383A00B66C86 /* common_gpu.h */, - 0C12E8082616383A00B66C86 /* qtensor.h */, - 0C12E8092616383A00B66C86 /* net_parallel.h */, - 0C12E80A2616383A00B66C86 /* operator_gradient.h */, - 0C12E80B2616383A00B66C86 /* cudnn_wrappers.h */, - 0C12E80C2616383A00B66C86 /* distributions_stubs.h */, - 0C12E80D2616383A00B66C86 /* blob_serialization.h */, - ); - path = core; - sourceTree = ""; - }; - 0C12E7DF2616383A00B66C86 /* hip */ = { - isa = PBXGroup; - children = ( - 0C12E7E02616383A00B66C86 /* miopen_wrapper.h */, - 0C12E7E12616383A00B66C86 /* common_miopen.h */, - ); - path = hip; - sourceTree = ""; - }; - 0C12E7E62616383A00B66C86 /* nomnigraph */ = { - isa = PBXGroup; - children = ( - 0C12E7E72616383A00B66C86 /* Representations */, - 0C12E7E82616383A00B66C86 /* include */, - 0C12E8002616383A00B66C86 /* tests */, - ); - path = nomnigraph; - sourceTree = ""; - }; - 0C12E7E72616383A00B66C86 /* Representations */ = { - isa = PBXGroup; - children = ( - ); - path = Representations; - sourceTree = ""; - }; - 0C12E7E82616383A00B66C86 /* include */ = { - isa = PBXGroup; - children = ( - 0C12E7E92616383A00B66C86 /* nomnigraph */, - ); - path = include; - sourceTree = ""; - }; - 0C12E7E92616383A00B66C86 /* nomnigraph */ = { - isa = PBXGroup; - children = ( - 0C12E7EA2616383A00B66C86 /* Generated */, - 0C12E7EE2616383A00B66C86 /* Representations */, - 0C12E7F22616383A00B66C86 /* Transformations */, - 0C12E7F52616383A00B66C86 /* Graph */, - 0C12E7FB2616383A00B66C86 /* Converters */, - 0C12E7FD2616383A00B66C86 /* Support */, - ); - path = nomnigraph; - sourceTree = ""; - }; - 0C12E7EA2616383A00B66C86 /* Generated */ = { - isa = PBXGroup; - children = ( - 0C12E7EB2616383A00B66C86 /* OpClasses.h */, - 0C12E7EC2616383A00B66C86 /* OpEnum.h */, - 0C12E7ED2616383A00B66C86 /* OpNames.h */, - ); - path = Generated; - sourceTree = ""; - }; - 0C12E7EE2616383A00B66C86 /* Representations */ = { - isa = PBXGroup; - children = ( - 0C12E7EF2616383A00B66C86 /* Compiler.h */, - 0C12E7F02616383A00B66C86 /* NeuralNet.h */, - 0C12E7F12616383A00B66C86 /* ControlFlow.h */, - ); - path = Representations; - sourceTree = ""; - }; - 0C12E7F22616383A00B66C86 /* Transformations */ = { - isa = PBXGroup; - children = ( - 0C12E7F32616383A00B66C86 /* SubgraphMatcher.h */, - 0C12E7F42616383A00B66C86 /* Match.h */, - ); - path = Transformations; - sourceTree = ""; - }; - 0C12E7F52616383A00B66C86 /* Graph */ = { - isa = PBXGroup; - children = ( - 0C12E7F62616383A00B66C86 /* Algorithms.h */, - 0C12E7F72616383A00B66C86 /* TopoSort.h */, - 0C12E7F82616383A00B66C86 /* Graph.h */, - 0C12E7F92616383A00B66C86 /* TarjansImpl.h */, - 0C12E7FA2616383A00B66C86 /* BinaryMatchImpl.h */, - ); - path = Graph; - sourceTree = ""; - }; - 0C12E7FB2616383A00B66C86 /* Converters */ = { - isa = PBXGroup; - children = ( - 0C12E7FC2616383A00B66C86 /* Dot.h */, - ); - path = Converters; - sourceTree = ""; - }; - 0C12E7FD2616383A00B66C86 /* Support */ = { - isa = PBXGroup; - children = ( - 0C12E7FE2616383A00B66C86 /* Casting.h */, - 0C12E7FF2616383A00B66C86 /* Common.h */, - ); - path = Support; - sourceTree = ""; - }; - 0C12E8002616383A00B66C86 /* tests */ = { - isa = PBXGroup; - children = ( - 0C12E8012616383A00B66C86 /* test_util.h */, - ); - path = tests; - sourceTree = ""; - }; - 0C12E80E2616383A00B66C86 /* mpi */ = { - isa = PBXGroup; - children = ( - 0C12E80F2616383A00B66C86 /* mpi_common.h */, - 0C12E8102616383A00B66C86 /* mpi_ops.h */, - ); - path = mpi; - sourceTree = ""; - }; - 0C12E8112616383A00B66C86 /* proto */ = { - isa = PBXGroup; - children = ( - 0C12E8122616383A00B66C86 /* caffe2_pb.h */, - 0C12E8132616383A00B66C86 /* torch_pb.h */, - ); - path = proto; - sourceTree = ""; - }; - 0C12E8142616383A00B66C86 /* test */ = { - isa = PBXGroup; - children = ( - 0C12E8152616383A00B66C86 /* assets */, - ); - path = test; - sourceTree = ""; - }; - 0C12E8152616383A00B66C86 /* assets */ = { - isa = PBXGroup; - children = ( - ); - path = assets; - sourceTree = ""; - }; - 0C12E8162616383A00B66C86 /* operators */ = { - isa = PBXGroup; - children = ( - 0C12E8172616383A00B66C86 /* top_k.h */, - 0C12E8182616383A00B66C86 /* channel_stats_op.h */, - 0C12E8192616383A00B66C86 /* gru_unit_op.h */, - 0C12E81A2616383A00B66C86 /* half_float_ops.h */, - 0C12E81B2616383A00B66C86 /* sqr_op.h */, - 0C12E81C2616383A00B66C86 /* mean_op.h */, - 0C12E81D2616383A00B66C86 /* thresholded_relu_op.h */, - 0C12E81E2616383A00B66C86 /* ctc_greedy_decoder_op.h */, - 0C12E81F2616383A00B66C86 /* conv_op_cache_cudnn.h */, - 0C12E8202616383A00B66C86 /* utility_ops.h */, - 0C12E8212616383A00B66C86 /* selu_op.h */, - 0C12E8222616383A00B66C86 /* map_ops.h */, - 0C12E8232616383A00B66C86 /* roi_align_rotated_op.h */, - 0C12E8242616383A00B66C86 /* fused_rowwise_random_quantization_ops.h */, - 0C12E8252616383A00B66C86 /* stop_gradient.h */, - 0C12E8262616383A00B66C86 /* batch_gather_ops.h */, - 0C12E8272616383A00B66C86 /* asin_op.h */, - 0C12E8282616383A00B66C86 /* cosh_op.h */, - 0C12E8292616383A00B66C86 /* atan_op.h */, - 0C12E82A2616383A00B66C86 /* reverse_packed_segs_op.h */, - 0C12E82B2616383A00B66C86 /* given_tensor_byte_string_to_uint8_fill_op.h */, - 0C12E82C2616383A00B66C86 /* ensure_clipped_op.h */, - 0C12E82D2616383A00B66C86 /* conv_transpose_op.h */, - 0C12E82E2616383A00B66C86 /* generate_proposals_op_util_nms.h */, - 0C12E82F2616383A00B66C86 /* enforce_finite_op.h */, - 0C12E8302616383A00B66C86 /* conv_transpose_unpool_op_base.h */, - 0C12E8312616383A00B66C86 /* gather_fused_8bit_rowwise_op.h */, - 0C12E8322616383A00B66C86 /* batch_matmul_op.h */, - 0C12E8332616383A00B66C86 /* batch_bucketize_op.h */, - 0C12E8342616383A00B66C86 /* softsign_op.h */, - 0C12E8352616383A00B66C86 /* elementwise_logical_ops.h */, - 0C12E8362616383A00B66C86 /* percentile_op.h */, - 0C12E8372616383A00B66C86 /* length_split_op.h */, - 0C12E8382616383A00B66C86 /* locally_connected_op_impl.h */, - 0C12E8392616383A00B66C86 /* rmac_regions_op.h */, - 0C12E83A2616383A00B66C86 /* hard_sigmoid_op.h */, - 0C12E83B2616383A00B66C86 /* ensure_cpu_output_op.h */, - 0C12E83C2616383A00B66C86 /* batch_box_cox_op.h */, - 0C12E83D2616383A00B66C86 /* ctc_beam_search_decoder_op.h */, - 0C12E83E2616383A00B66C86 /* flexible_top_k.h */, - 0C12E83F2616383A00B66C86 /* fully_connected_op.h */, - 0C12E8402616383A00B66C86 /* key_split_ops.h */, - 0C12E8412616383A00B66C86 /* reciprocal_op.h */, - 0C12E8422616383A00B66C86 /* roi_align_gradient_op.h */, - 0C12E8432616383A00B66C86 /* group_norm_op.h */, - 0C12E8442616383A00B66C86 /* load_save_op.h */, - 0C12E8452616383A00B66C86 /* cos_op.h */, - 0C12E8462616383A00B66C86 /* expand_op.h */, - 0C12E8472616383A00B66C86 /* elementwise_ops.h */, - 0C12E8482616383A00B66C86 /* im2col_op.h */, - 0C12E8492616383A00B66C86 /* space_batch_op.h */, - 0C12E84A2616383A00B66C86 /* relu_op.h */, - 0C12E84B2616383A00B66C86 /* while_op.h */, - 0C12E84C2616383A00B66C86 /* remove_data_blocks_op.h */, - 0C12E84D2616383A00B66C86 /* elementwise_mul_op.h */, - 0C12E84E2616383A00B66C86 /* numpy_tile_op.h */, - 0C12E84F2616383A00B66C86 /* rowmul_op.h */, - 0C12E8502616383A00B66C86 /* accumulate_op.h */, - 0C12E8512616383A00B66C86 /* sparse_lp_regularizer_op.h */, - 0C12E8522616383A00B66C86 /* bisect_percentile_op.h */, - 0C12E8532616383A00B66C86 /* tile_op.h */, - 0C12E8542616383A00B66C86 /* gelu_op.h */, - 0C12E8552616383A00B66C86 /* stats_put_ops.h */, - 0C12E8562616383A00B66C86 /* given_tensor_fill_op.h */, - 0C12E8572616383A00B66C86 /* accuracy_op.h */, - 0C12E8582616383A00B66C86 /* bbox_transform_op.h */, - 0C12E8592616383A00B66C86 /* boolean_unmask_ops.h */, - 0C12E85A2616383A00B66C86 /* glu_op.h */, - 0C12E85B2616383A00B66C86 /* resize_3d_op.h */, - 0C12E85C2616383A00B66C86 /* unsafe_coalesce.h */, - 0C12E85D2616383A00B66C86 /* conv_op.h */, - 0C12E85E2616383A00B66C86 /* conv_op_impl.h */, - 0C12E85F2616383A00B66C86 /* erf_op.h */, - 0C12E8602616383A00B66C86 /* fused_rowwise_8bit_conversion_ops.h */, - 0C12E8612616383A00B66C86 /* locally_connected_op_util.h */, - 0C12E8622616383A00B66C86 /* channel_backprop_stats_op.h */, - 0C12E8632616383A00B66C86 /* order_switch_ops.h */, - 0C12E8642616383A00B66C86 /* lengths_reducer_fused_nbit_rowwise_ops.h */, - 0C12E8652616383A00B66C86 /* lengths_reducer_fused_8bit_rowwise_ops.h */, - 0C12E8662616383A00B66C86 /* load_save_op_util.h */, - 0C12E8672616383A00B66C86 /* conv_transpose_op_impl.h */, - 0C12E8682616383A00B66C86 /* op_utils_cudnn.h */, - 0C12E8692616383A00B66C86 /* prelu_op.h */, - 0C12E86A2616383A00B66C86 /* box_with_nms_limit_op.h */, - 0C12E86B2616383A00B66C86 /* fc_inference.h */, - 0C12E86C2616383A00B66C86 /* distance_op.h */, - 0C12E86D2616383A00B66C86 /* data_couple.h */, - 0C12E86E2616383A00B66C86 /* dataset_ops.h */, - 0C12E86F2616383A00B66C86 /* merge_id_lists_op.h */, - 0C12E8702616383A00B66C86 /* generate_proposals_op_util_nms_gpu.h */, - 0C12E8712616383A00B66C86 /* async_net_barrier_op.h */, - 0C12E8722616383A00B66C86 /* deform_conv_op.h */, - 0C12E8732616383A00B66C86 /* quantized */, - 0C12E88C2616383A00B66C86 /* sqrt_op.h */, - 0C12E88D2616383A00B66C86 /* elementwise_div_op.h */, - 0C12E88E2616383A00B66C86 /* deform_conv_op_impl.h */, - 0C12E88F2616383A00B66C86 /* feature_maps_ops.h */, - 0C12E8902616383A00B66C86 /* text_file_reader_utils.h */, - 0C12E8912616383A00B66C86 /* scale_blobs_op.h */, - 0C12E8922616383A00B66C86 /* pool_op.h */, - 0C12E8932616383A00B66C86 /* conv_transpose_op_mobile_impl.h */, - 0C12E8942616383A00B66C86 /* dense_vector_to_id_list_op.h */, - 0C12E8952616383A00B66C86 /* minmax_ops.h */, - 0C12E8962616383A00B66C86 /* lengths_tile_op.h */, - 0C12E8972616383A00B66C86 /* pool_op_util.h */, - 0C12E8982616383A00B66C86 /* no_default_engine_op.h */, - 0C12E8992616383A00B66C86 /* onnx_while_op.h */, - 0C12E89A2616383A00B66C86 /* reduce_front_back_sum_mean_ops.h */, - 0C12E89B2616383A00B66C86 /* roi_pool_op.h */, - 0C12E89C2616383A00B66C86 /* flatten_op.h */, - 0C12E89D2616383A00B66C86 /* self_binning_histogram_op.h */, - 0C12E89E2616383A00B66C86 /* normalize_l1_op.h */, - 0C12E89F2616383A00B66C86 /* pow_op.h */, - 0C12E8A02616383A00B66C86 /* exp_op.h */, - 0C12E8A12616383A00B66C86 /* heatmap_max_keypoint_op.h */, - 0C12E8A22616383A00B66C86 /* assert_op.h */, - 0C12E8A32616383A00B66C86 /* piecewise_linear_transform_op.h */, - 0C12E8A42616383A00B66C86 /* cbrt_op.h */, - 0C12E8A52616383A00B66C86 /* weighted_sample_op.h */, - 0C12E8A62616383A00B66C86 /* tanh_op.h */, - 0C12E8A72616383A00B66C86 /* softmax_op.h */, - 0C12E8A82616383A00B66C86 /* listwise_l2r_op.h */, - 0C12E8A92616383A00B66C86 /* variable_length_sequence_padding.h */, - 0C12E8AA2616383A00B66C86 /* elementwise_add_op.h */, - 0C12E8AB2616383A00B66C86 /* leaky_relu_op.h */, - 0C12E8AC2616383A00B66C86 /* elementwise_linear_op.h */, - 0C12E8AD2616383A00B66C86 /* elu_op.h */, - 0C12E8AE2616383A00B66C86 /* jsd_op.h */, - 0C12E8AF2616383A00B66C86 /* collect_and_distribute_fpn_rpn_proposals_op.h */, - 0C12E8B02616383A00B66C86 /* reduce_ops.h */, - 0C12E8B12616383A00B66C86 /* string_ops.h */, - 0C12E8B22616383A00B66C86 /* boolean_mask_ops.h */, - 0C12E8B32616383A00B66C86 /* local_response_normalization_op.h */, - 0C12E8B42616383A00B66C86 /* partition_ops.h */, - 0C12E8B52616383A00B66C86 /* sparse_dropout_with_replacement_op.h */, - 0C12E8B62616383A00B66C86 /* loss_op.h */, - 0C12E8B72616383A00B66C86 /* counter_ops.h */, - 0C12E8B82616383A00B66C86 /* h_softmax_op.h */, - 0C12E8B92616383A00B66C86 /* lengths_reducer_rowwise_8bit_ops.h */, - 0C12E8BA2616383A00B66C86 /* copy_rows_to_tensor_op.h */, - 0C12E8BB2616383A00B66C86 /* moments_op.h */, - 0C12E8BC2616383A00B66C86 /* logit_op.h */, - 0C12E8BD2616383A00B66C86 /* perplexity_op.h */, - 0C12E8BE2616383A00B66C86 /* roi_align_rotated_gradient_op.h */, - 0C12E8BF2616383A00B66C86 /* ceil_op.h */, - 0C12E8C02616383A00B66C86 /* find_op.h */, - 0C12E8C12616383A00B66C86 /* layer_norm_op.h */, - 0C12E8C22616383A00B66C86 /* negate_gradient_op.h */, - 0C12E8C32616383A00B66C86 /* resize_op.h */, - 0C12E8C42616383A00B66C86 /* lengths_reducer_ops.h */, - 0C12E8C52616383A00B66C86 /* batch_sparse_to_dense_op.h */, - 0C12E8C62616383A00B66C86 /* replace_nan_op.h */, - 0C12E8C72616383A00B66C86 /* max_pool_with_index_gpu.h */, - 0C12E8C82616383A00B66C86 /* find_duplicate_elements_op.h */, - 0C12E8C92616383A00B66C86 /* expand_squeeze_dims_op.h */, - 0C12E8CA2616383A00B66C86 /* sinusoid_position_encoding_op.h */, - 0C12E8CB2616383A00B66C86 /* pack_segments.h */, - 0C12E8CC2616383A00B66C86 /* softplus_op.h */, - 0C12E8CD2616383A00B66C86 /* quantile_op.h */, - 0C12E8CE2616383A00B66C86 /* sinh_op.h */, - 0C12E8CF2616383A00B66C86 /* fused_rowwise_nbitfake_conversion_ops.h */, - 0C12E8D02616383A00B66C86 /* cross_entropy_op.h */, - 0C12E8D12616383A00B66C86 /* feed_blob_op.h */, - 0C12E8D22616383A00B66C86 /* slice_op.h */, - 0C12E8D32616383A00B66C86 /* rsqrt_op.h */, - 0C12E8D42616383A00B66C86 /* free_op.h */, - 0C12E8D52616383A00B66C86 /* square_root_divide_op.h */, - 0C12E8D62616383A00B66C86 /* conv_op_shared.h */, - 0C12E8D72616383A00B66C86 /* apmeter_op.h */, - 0C12E8D82616383A00B66C86 /* lstm_unit_op.h */, - 0C12E8D92616383A00B66C86 /* index_hash_ops.h */, - 0C12E8DA2616383A00B66C86 /* lengths_pad_op.h */, - 0C12E8DB2616383A00B66C86 /* elementwise_ops_utils.h */, - 0C12E8DC2616383A00B66C86 /* sparse_normalize_op.h */, - 0C12E8DD2616383A00B66C86 /* multi_class_accuracy_op.h */, - 0C12E8DE2616383A00B66C86 /* cast_op.h */, - 0C12E8DF2616383A00B66C86 /* transpose_op.h */, - 0C12E8E02616383A00B66C86 /* create_scope_op.h */, - 0C12E8E12616383A00B66C86 /* zero_gradient_op.h */, - 0C12E8E22616383A00B66C86 /* lstm_utils.h */, - 0C12E8E32616383A00B66C86 /* tt_linear_op.h */, - 0C12E8E42616383A00B66C86 /* relu_n_op.h */, - 0C12E8E52616383A00B66C86 /* generate_proposals_op.h */, - 0C12E8E62616383A00B66C86 /* hip */, - 0C12E8E82616383A00B66C86 /* lpnorm_op.h */, - 0C12E8E92616383A00B66C86 /* sequence_ops.h */, - 0C12E8EA2616383A00B66C86 /* abs_op.h */, - 0C12E8EB2616383A00B66C86 /* activation_ops_cudnn.h */, - 0C12E8EC2616383A00B66C86 /* elementwise_op_test.h */, - 0C12E8ED2616383A00B66C86 /* inference_lstm_op.h */, - 0C12E8EE2616383A00B66C86 /* concat_split_op.h */, - 0C12E8EF2616383A00B66C86 /* reduction_ops.h */, - 0C12E8F02616383A00B66C86 /* gather_op.h */, - 0C12E8F12616383A00B66C86 /* log_op.h */, - 0C12E8F22616383A00B66C86 /* conv_pool_op_base.h */, - 0C12E8F32616383A00B66C86 /* unique_ops.h */, - 0C12E8F42616383A00B66C86 /* elementwise_sub_op.h */, - 0C12E8F52616383A00B66C86 /* segment_reduction_op.h */, - 0C12E8F62616383A00B66C86 /* fused_rowwise_nbit_conversion_ops.h */, - 0C12E8F72616383A00B66C86 /* stump_func_op.h */, - 0C12E8F82616383A00B66C86 /* swish_op.h */, - 0C12E8F92616383A00B66C86 /* pack_rnn_sequence_op.h */, - 0C12E8FA2616383A00B66C86 /* softmax_with_loss_op.h */, - 0C12E8FB2616383A00B66C86 /* integral_image_op.h */, - 0C12E8FC2616383A00B66C86 /* mish_op.h */, - 0C12E8FD2616383A00B66C86 /* weighted_multi_sampling_op.h */, - 0C12E8FE2616383A00B66C86 /* bucketize_op.h */, - 0C12E8FF2616383A00B66C86 /* is_empty_op.h */, - 0C12E9002616383A00B66C86 /* mod_op.h */, - 0C12E9012616383A00B66C86 /* clip_op.h */, - 0C12E9022616383A00B66C86 /* prepend_dim_op.h */, - 0C12E9032616383A00B66C86 /* copy_op.h */, - 0C12E9042616383A00B66C86 /* rank_loss_op.h */, - 0C12E9052616383A00B66C86 /* lengths_top_k_op.h */, - 0C12E9062616383A00B66C86 /* summarize_op.h */, - 0C12E9072616383A00B66C86 /* one_hot_ops.h */, - 0C12E9082616383A00B66C86 /* cc_bmm_bg_op.h */, - 0C12E9092616383A00B66C86 /* acos_op.h */, - 0C12E90A2616383A00B66C86 /* softmax_utils.h */, - 0C12E90B2616383A00B66C86 /* tensor_protos_db_input.h */, - 0C12E90C2616383A00B66C86 /* generate_proposals_op_util_boxes.h */, - 0C12E90D2616383A00B66C86 /* conv_transpose_op_mobile.h */, - 0C12E90E2616383A00B66C86 /* arg_ops.h */, - 0C12E90F2616383A00B66C86 /* negative_op.h */, - 0C12E9102616383A00B66C86 /* operator_fallback_gpu.h */, - 0C12E9112616383A00B66C86 /* margin_ranking_criterion_op.h */, - 0C12E9122616383A00B66C86 /* matmul_op.h */, - 0C12E9132616383A00B66C86 /* roi_align_op.h */, - 0C12E9142616383A00B66C86 /* pad_op.h */, - 0C12E9152616383A00B66C86 /* histogram_op.h */, - 0C12E9162616383A00B66C86 /* floor_op.h */, - 0C12E9172616383A00B66C86 /* normalize_op.h */, - 0C12E9182616383A00B66C86 /* cube_op.h */, - 0C12E9192616383A00B66C86 /* reshape_op.h */, - 0C12E91A2616383A00B66C86 /* instance_norm_op.h */, - 0C12E91B2616383A00B66C86 /* ngram_ops.h */, - 0C12E91C2616383A00B66C86 /* if_op.h */, - 0C12E91D2616383A00B66C86 /* reduce_front_back_max_ops.h */, - 0C12E91E2616383A00B66C86 /* reducer_functors.h */, - 0C12E91F2616383A00B66C86 /* affine_channel_op.h */, - 0C12E9202616383A00B66C86 /* sigmoid_op.h */, - 0C12E9212616383A00B66C86 /* channel_shuffle_op.h */, - 0C12E9222616383A00B66C86 /* locally_connected_op.h */, - 0C12E9232616383A00B66C86 /* conditional_op.h */, - 0C12E9242616383A00B66C86 /* rms_norm_op.h */, - 0C12E9252616383A00B66C86 /* dropout_op.h */, - 0C12E9262616383A00B66C86 /* gather_ranges_to_dense_op.h */, - 0C12E9272616383A00B66C86 /* shape_op.h */, - 0C12E9282616383A00B66C86 /* index_ops.h */, - 0C12E9292616383A00B66C86 /* tan_op.h */, - 0C12E92A2616383A00B66C86 /* scale_op.h */, - 0C12E92B2616383A00B66C86 /* cosine_embedding_criterion_op.h */, - 0C12E92C2616383A00B66C86 /* sparse_to_dense_op.h */, - 0C12E92D2616383A00B66C86 /* quant_decode_op.h */, - 0C12E92E2616383A00B66C86 /* rnn */, - 0C12E9372616383A00B66C86 /* sparse_to_dense_mask_op.h */, - 0C12E9382616383A00B66C86 /* sin_op.h */, - 0C12E9392616383A00B66C86 /* upsample_op.h */, - 0C12E93A2616383A00B66C86 /* filler_op.h */, - 0C12E93B2616383A00B66C86 /* batch_permutation_op.h */, - 0C12E93C2616383A00B66C86 /* spatial_softmax_with_loss_op.h */, - 0C12E93D2616383A00B66C86 /* batch_moments_op.h */, - 0C12E93E2616383A00B66C86 /* alias_with_name.h */, - 0C12E93F2616383A00B66C86 /* do_op.h */, - 0C12E9402616383A00B66C86 /* prefetch_op.h */, - 0C12E9412616383A00B66C86 /* byte_weight_dequant_op.h */, - 0C12E9422616383A00B66C86 /* spatial_batch_norm_op.h */, - ); - path = operators; - sourceTree = ""; - }; - 0C12E8732616383A00B66C86 /* quantized */ = { - isa = PBXGroup; - children = ( - 0C12E8742616383A00B66C86 /* int8_relu_op.h */, - 0C12E8752616383A00B66C86 /* int8_channel_shuffle_op.h */, - 0C12E8762616383A00B66C86 /* int8_concat_op.h */, - 0C12E8772616383A00B66C86 /* int8_dequantize_op.h */, - 0C12E8782616383A00B66C86 /* int8_slice_op.h */, - 0C12E8792616383A00B66C86 /* int8_quantize_op.h */, - 0C12E87A2616383A00B66C86 /* int8_flatten_op.h */, - 0C12E87B2616383A00B66C86 /* int8_max_pool_op.h */, - 0C12E87C2616383A00B66C86 /* int8_softmax_op.h */, - 0C12E87D2616383A00B66C86 /* int8_average_pool_op.h */, - 0C12E87E2616383A00B66C86 /* int8_fc_op.h */, - 0C12E87F2616383A00B66C86 /* int8_conv_op.h */, - 0C12E8802616383A00B66C86 /* int8_test_utils.h */, - 0C12E8812616383A00B66C86 /* int8_roi_align_op.h */, - 0C12E8822616383A00B66C86 /* int8_given_tensor_fill_op.h */, - 0C12E8832616383A00B66C86 /* int8_reshape_op.h */, - 0C12E8842616383A00B66C86 /* int8_utils.h */, - 0C12E8852616383A00B66C86 /* int8_resize_nearest_op.h */, - 0C12E8862616383A00B66C86 /* int8_sigmoid_op.h */, - 0C12E8872616383A00B66C86 /* int8_simd.h */, - 0C12E8882616383A00B66C86 /* int8_conv_transpose_op.h */, - 0C12E8892616383A00B66C86 /* int8_leaky_relu_op.h */, - 0C12E88A2616383A00B66C86 /* int8_add_op.h */, - 0C12E88B2616383A00B66C86 /* int8_transpose_op.h */, - ); - path = quantized; - sourceTree = ""; - }; - 0C12E8E62616383A00B66C86 /* hip */ = { - isa = PBXGroup; - children = ( - 0C12E8E72616383A00B66C86 /* activation_ops_miopen.h */, - ); - path = hip; - sourceTree = ""; - }; - 0C12E92E2616383A00B66C86 /* rnn */ = { - isa = PBXGroup; - children = ( - 0C12E92F2616383A00B66C86 /* recurrent_network_blob_fetcher_op.h */, - 0C12E9302616383A00B66C86 /* recurrent_op_cudnn.h */, - 0C12E9312616383A00B66C86 /* recurrent_network_executor_gpu.h */, - 0C12E9322616383A00B66C86 /* recurrent_network_executor_incl.h */, - 0C12E9332616383A00B66C86 /* hip */, - 0C12E9352616383A00B66C86 /* recurrent_network_executor.h */, - 0C12E9362616383A00B66C86 /* recurrent_network_op.h */, - ); - path = rnn; - sourceTree = ""; - }; - 0C12E9332616383A00B66C86 /* hip */ = { - isa = PBXGroup; - children = ( - 0C12E9342616383A00B66C86 /* recurrent_op_miopen.h */, - ); - path = hip; - sourceTree = ""; - }; - 0C12E9432616383A00B66C86 /* onnx */ = { - isa = PBXGroup; - children = ( - 0C12E9442616383A00B66C86 /* helper.h */, - 0C12E9452616383A00B66C86 /* device.h */, - 0C12E9462616383A00B66C86 /* onnxifi_init.h */, - 0C12E9472616383A00B66C86 /* backend.h */, - 0C12E9482616383A00B66C86 /* torch_ops */, - 0C12E94C2616383A00B66C86 /* backend_rep.h */, - 0C12E94D2616383A00B66C86 /* onnx_exporter.h */, - 0C12E94E2616383A00B66C86 /* offline_tensor.h */, - 0C12E94F2616383A00B66C86 /* onnxifi_graph_info.h */, - ); - path = onnx; - sourceTree = ""; - }; - 0C12E9482616383A00B66C86 /* torch_ops */ = { - isa = PBXGroup; - children = ( - 0C12E9492616383A00B66C86 /* schema.h */, - 0C12E94A2616383A00B66C86 /* constants.h */, - 0C12E94B2616383A00B66C86 /* operator_sets.h */, - ); - path = torch_ops; - sourceTree = ""; - }; - 0C12E9502616383A00B66C86 /* python */ = { - isa = PBXGroup; - children = ( - 0C12E9512616383A00B66C86 /* serialized_test */, - 0C12E9542616383A00B66C86 /* pybind_state.h */, - 0C12E9552616383A00B66C86 /* pybind_state_registry.h */, - 0C12E9562616383A00B66C86 /* ideep */, - 0C12E9572616383A00B66C86 /* mint */, - 0C12E95B2616383A00B66C86 /* layers */, - 0C12E95C2616383A00B66C86 /* test */, - 0C12E95D2616383A00B66C86 /* dlpack.h */, - 0C12E95E2616383A00B66C86 /* onnx */, - 0C12E9612616383A00B66C86 /* trt */, - 0C12E9632616383A00B66C86 /* operator_test */, - 0C12E9642616383A00B66C86 /* models */, - 0C12E9662616383A00B66C86 /* docs */, - 0C12E9672616383A00B66C86 /* fakelowp */, - 0C12E9682616383A00B66C86 /* modeling */, - 0C12E9692616383A00B66C86 /* pybind_state_dlpack.h */, - 0C12E96A2616383A00B66C86 /* mkl */, - 0C12E96B2616383A00B66C86 /* examples */, - 0C12E96C2616383A00B66C86 /* benchmarks */, - 0C12E96D2616383A00B66C86 /* predictor */, - 0C12E96E2616383A00B66C86 /* helpers */, - 0C12E96F2616383A00B66C86 /* rnn */, - ); - path = python; - sourceTree = ""; - }; - 0C12E9512616383A00B66C86 /* serialized_test */ = { - isa = PBXGroup; - children = ( - 0C12E9522616383A00B66C86 /* data */, - ); - path = serialized_test; - sourceTree = ""; - }; - 0C12E9522616383A00B66C86 /* data */ = { - isa = PBXGroup; - children = ( - 0C12E9532616383A00B66C86 /* operator_test */, - ); - path = data; - sourceTree = ""; - }; - 0C12E9532616383A00B66C86 /* operator_test */ = { - isa = PBXGroup; - children = ( - ); - path = operator_test; - sourceTree = ""; - }; - 0C12E9562616383A00B66C86 /* ideep */ = { - isa = PBXGroup; - children = ( - ); - path = ideep; - sourceTree = ""; - }; - 0C12E9572616383A00B66C86 /* mint */ = { - isa = PBXGroup; - children = ( - 0C12E9582616383A00B66C86 /* static */, - 0C12E95A2616383A00B66C86 /* templates */, - ); - path = mint; - sourceTree = ""; - }; - 0C12E9582616383A00B66C86 /* static */ = { - isa = PBXGroup; - children = ( - 0C12E9592616383A00B66C86 /* css */, - ); - path = static; - sourceTree = ""; - }; - 0C12E9592616383A00B66C86 /* css */ = { - isa = PBXGroup; - children = ( - ); - path = css; - sourceTree = ""; - }; - 0C12E95A2616383A00B66C86 /* templates */ = { - isa = PBXGroup; - children = ( - ); - path = templates; - sourceTree = ""; - }; - 0C12E95B2616383A00B66C86 /* layers */ = { - isa = PBXGroup; - children = ( - ); - path = layers; - sourceTree = ""; - }; - 0C12E95C2616383A00B66C86 /* test */ = { - isa = PBXGroup; - children = ( - ); - path = test; - sourceTree = ""; - }; - 0C12E95E2616383A00B66C86 /* onnx */ = { - isa = PBXGroup; - children = ( - 0C12E95F2616383A00B66C86 /* bin */, - 0C12E9602616383A00B66C86 /* tests */, - ); - path = onnx; - sourceTree = ""; - }; - 0C12E95F2616383A00B66C86 /* bin */ = { - isa = PBXGroup; - children = ( - ); - path = bin; - sourceTree = ""; - }; - 0C12E9602616383A00B66C86 /* tests */ = { - isa = PBXGroup; - children = ( - ); - path = tests; - sourceTree = ""; - }; - 0C12E9612616383A00B66C86 /* trt */ = { - isa = PBXGroup; - children = ( - 0C12E9622616383A00B66C86 /* data */, - ); - path = trt; - sourceTree = ""; - }; - 0C12E9622616383A00B66C86 /* data */ = { - isa = PBXGroup; - children = ( - ); - path = data; - sourceTree = ""; - }; - 0C12E9632616383A00B66C86 /* operator_test */ = { - isa = PBXGroup; - children = ( - ); - path = operator_test; - sourceTree = ""; - }; - 0C12E9642616383A00B66C86 /* models */ = { - isa = PBXGroup; - children = ( - 0C12E9652616383A00B66C86 /* seq2seq */, - ); - path = models; - sourceTree = ""; - }; - 0C12E9652616383A00B66C86 /* seq2seq */ = { - isa = PBXGroup; - children = ( - ); - path = seq2seq; - sourceTree = ""; - }; - 0C12E9662616383A00B66C86 /* docs */ = { - isa = PBXGroup; - children = ( - ); - path = docs; - sourceTree = ""; - }; - 0C12E9672616383A00B66C86 /* fakelowp */ = { - isa = PBXGroup; - children = ( - ); - path = fakelowp; - sourceTree = ""; - }; - 0C12E9682616383A00B66C86 /* modeling */ = { - isa = PBXGroup; - children = ( - ); - path = modeling; - sourceTree = ""; - }; - 0C12E96A2616383A00B66C86 /* mkl */ = { - isa = PBXGroup; - children = ( - ); - path = mkl; - sourceTree = ""; - }; - 0C12E96B2616383A00B66C86 /* examples */ = { - isa = PBXGroup; - children = ( - ); - path = examples; - sourceTree = ""; - }; - 0C12E96C2616383A00B66C86 /* benchmarks */ = { - isa = PBXGroup; - children = ( - ); - path = benchmarks; - sourceTree = ""; - }; - 0C12E96D2616383A00B66C86 /* predictor */ = { - isa = PBXGroup; - children = ( - ); - path = predictor; - sourceTree = ""; - }; - 0C12E96E2616383A00B66C86 /* helpers */ = { - isa = PBXGroup; - children = ( - ); - path = helpers; - sourceTree = ""; - }; - 0C12E96F2616383A00B66C86 /* rnn */ = { - isa = PBXGroup; - children = ( - ); - path = rnn; - sourceTree = ""; - }; - 0C12E9702616383A00B66C86 /* distributed */ = { - isa = PBXGroup; - children = ( - 0C12E9712616383A00B66C86 /* redis_store_handler.h */, - 0C12E9722616383A00B66C86 /* file_store_handler_op.h */, - 0C12E9732616383A00B66C86 /* store_handler.h */, - 0C12E9742616383A00B66C86 /* store_ops.h */, - 0C12E9752616383A00B66C86 /* file_store_handler.h */, - 0C12E9762616383A00B66C86 /* redis_store_handler_op.h */, - ); - path = distributed; - sourceTree = ""; - }; - 0C12E9772616383A00B66C86 /* perfkernels */ = { - isa = PBXGroup; - children = ( - 0C12E9782616383A00B66C86 /* embedding_lookup.h */, - 0C12E9792616383A00B66C86 /* fused_8bit_rowwise_embedding_lookup_idx.h */, - 0C12E97A2616383A00B66C86 /* lstm_unit_cpu-impl.h */, - 0C12E97B2616383A00B66C86 /* embedding_lookup_idx.h */, - 0C12E97C2616383A00B66C86 /* adagrad.h */, - 0C12E97D2616383A00B66C86 /* lstm_unit_cpu.h */, - 0C12E97E2616383A00B66C86 /* cvtsh_ss_bugfix.h */, - 0C12E97F2616383A00B66C86 /* common.h */, - 0C12E9802616383A00B66C86 /* math.h */, - 0C12E9812616383A00B66C86 /* typed_axpy.h */, - 0C12E9822616383A00B66C86 /* fused_nbit_rowwise_conversion.h */, - 0C12E9832616383A00B66C86 /* fused_8bit_rowwise_embedding_lookup.h */, - 0C12E9842616383A00B66C86 /* lstm_unit_cpu_common.h */, - ); - path = perfkernels; - sourceTree = ""; - }; - 0C12E9852616383A00B66C86 /* experiments */ = { - isa = PBXGroup; - children = ( - 0C12E9862616383A00B66C86 /* operators */, - 0C12E98F2616383A00B66C86 /* python */, - ); - path = experiments; - sourceTree = ""; - }; - 0C12E9862616383A00B66C86 /* operators */ = { - isa = PBXGroup; - children = ( - 0C12E9872616383A00B66C86 /* fully_connected_op_decomposition.h */, - 0C12E9882616383A00B66C86 /* fully_connected_op_sparse.h */, - 0C12E9892616383A00B66C86 /* tt_contraction_op.h */, - 0C12E98A2616383A00B66C86 /* fully_connected_op_prune.h */, - 0C12E98B2616383A00B66C86 /* funhash_op.h */, - 0C12E98C2616383A00B66C86 /* sparse_funhash_op.h */, - 0C12E98D2616383A00B66C86 /* sparse_matrix_reshape_op.h */, - 0C12E98E2616383A00B66C86 /* tt_pad_op.h */, - ); - path = operators; - sourceTree = ""; - }; - 0C12E98F2616383A00B66C86 /* python */ = { - isa = PBXGroup; - children = ( - ); - path = python; - sourceTree = ""; - }; - 0C12E9902616383A00B66C86 /* cuda_rtc */ = { - isa = PBXGroup; - children = ( - 0C12E9912616383A00B66C86 /* common_rtc.h */, - ); - path = cuda_rtc; - sourceTree = ""; - }; - 0C12E9922616383A00B66C86 /* serialize */ = { - isa = PBXGroup; - children = ( - 0C12E9932616383A00B66C86 /* read_adapter_interface.h */, - 0C12E9942616383A00B66C86 /* crc_alt.h */, - 0C12E9952616383A00B66C86 /* versions.h */, - 0C12E9962616383A00B66C86 /* inline_container.h */, - 0C12E9972616383A00B66C86 /* file_adapter.h */, - 0C12E9982616383A00B66C86 /* istream_adapter.h */, - ); - path = serialize; - sourceTree = ""; - }; - 0C12E9992616383A00B66C86 /* utils */ = { - isa = PBXGroup; - children = ( - 0C12E99A2616383A00B66C86 /* filler.h */, - 0C12E99B2616383A00B66C86 /* math-detail.h */, - 0C12E99C2616383A00B66C86 /* signal_handler.h */, - 0C12E99D2616383A00B66C86 /* cpu_neon.h */, - 0C12E99E2616383A00B66C86 /* conversions.h */, - 0C12E99F2616383A00B66C86 /* string_utils.h */, - 0C12E9A02616383A00B66C86 /* simple_queue.h */, - 0C12E9A12616383A00B66C86 /* cpuid.h */, - 0C12E9A22616383A00B66C86 /* threadpool */, - 0C12E9A92616383A00B66C86 /* math */, - 0C12E9B02616383A00B66C86 /* fixed_divisor.h */, - 0C12E9B12616383A00B66C86 /* proto_wrap.h */, - 0C12E9B22616383A00B66C86 /* bench_utils.h */, - 0C12E9B32616383A00B66C86 /* cast.h */, - 0C12E9B42616383A00B66C86 /* hip */, - 0C12E9B52616383A00B66C86 /* murmur_hash3.h */, - 0C12E9B62616383A00B66C86 /* math.h */, - 0C12E9B72616383B00B66C86 /* eigen_utils.h */, - 0C12E9B82616383B00B66C86 /* smart_tensor_printer.h */, - 0C12E9B92616383B00B66C86 /* proto_convert.h */, - 0C12E9BA2616383B00B66C86 /* proto_utils.h */, - 0C12E9BB2616383B00B66C86 /* cblas.h */, - 0C12E9BC2616383B00B66C86 /* map_utils.h */, - 0C12E9BD2616383B00B66C86 /* zmq_helper.h */, - ); - path = utils; - sourceTree = ""; - }; - 0C12E9A22616383A00B66C86 /* threadpool */ = { - isa = PBXGroup; - children = ( - 0C12E9A32616383A00B66C86 /* ThreadPool.h */, - 0C12E9A42616383A00B66C86 /* ThreadPoolCommon.h */, - 0C12E9A52616383A00B66C86 /* pthreadpool.h */, - 0C12E9A62616383A00B66C86 /* pthreadpool-cpp.h */, - 0C12E9A72616383A00B66C86 /* WorkersPool.h */, - 0C12E9A82616383A00B66C86 /* thread_pool_guard.h */, - ); - path = threadpool; - sourceTree = ""; - }; - 0C12E9A92616383A00B66C86 /* math */ = { - isa = PBXGroup; - children = ( - 0C12E9AA2616383A00B66C86 /* utils.h */, - 0C12E9AB2616383A00B66C86 /* broadcast.h */, - 0C12E9AC2616383A00B66C86 /* elementwise.h */, - 0C12E9AD2616383A00B66C86 /* half_utils.h */, - 0C12E9AE2616383A00B66C86 /* reduce.h */, - 0C12E9AF2616383A00B66C86 /* transpose.h */, - ); - path = math; - sourceTree = ""; - }; - 0C12E9B42616383A00B66C86 /* hip */ = { - isa = PBXGroup; - children = ( - ); - path = hip; - sourceTree = ""; - }; - 0C12E9BE2616383B00B66C86 /* contrib */ = { - isa = PBXGroup; - children = ( - 0C12E9BF2616383B00B66C86 /* nnpack */, - 0C12E9C02616383B00B66C86 /* warpctc */, - 0C12E9C22616383B00B66C86 /* nccl */, - 0C12E9C42616383B00B66C86 /* ideep */, - 0C12E9C52616383B00B66C86 /* docker-ubuntu-14.04 */, - 0C12E9C62616383B00B66C86 /* playground */, - 0C12E9C82616383B00B66C86 /* gloo */, - 0C12E9D22616383B00B66C86 /* fakelowp */, - 0C12E9E42616383B00B66C86 /* script */, - 0C12E9E62616383B00B66C86 /* opencl */, - 0C12E9E92616383B00B66C86 /* prof */, - 0C12E9EB2616383B00B66C86 /* tensorrt */, - 0C12E9EF2616383B00B66C86 /* shm_mutex */, - 0C12E9F12616383B00B66C86 /* tensorboard */, - 0C12E9F22616383B00B66C86 /* aten */, - 0C12E9F62616383B00B66C86 /* pytorch */, - ); - path = contrib; - sourceTree = ""; - }; - 0C12E9BF2616383B00B66C86 /* nnpack */ = { - isa = PBXGroup; - children = ( - ); - path = nnpack; - sourceTree = ""; - }; - 0C12E9C02616383B00B66C86 /* warpctc */ = { - isa = PBXGroup; - children = ( - 0C12E9C12616383B00B66C86 /* ctc_op.h */, - ); - path = warpctc; - sourceTree = ""; - }; - 0C12E9C22616383B00B66C86 /* nccl */ = { - isa = PBXGroup; - children = ( - 0C12E9C32616383B00B66C86 /* cuda_nccl_gpu.h */, - ); - path = nccl; - sourceTree = ""; - }; - 0C12E9C42616383B00B66C86 /* ideep */ = { - isa = PBXGroup; - children = ( - ); - path = ideep; - sourceTree = ""; - }; - 0C12E9C52616383B00B66C86 /* docker-ubuntu-14.04 */ = { - isa = PBXGroup; - children = ( - ); - path = "docker-ubuntu-14.04"; - sourceTree = ""; - }; - 0C12E9C62616383B00B66C86 /* playground */ = { - isa = PBXGroup; - children = ( - 0C12E9C72616383B00B66C86 /* resnetdemo */, - ); - path = playground; - sourceTree = ""; - }; - 0C12E9C72616383B00B66C86 /* resnetdemo */ = { - isa = PBXGroup; - children = ( - ); - path = resnetdemo; - sourceTree = ""; - }; - 0C12E9C82616383B00B66C86 /* gloo */ = { - isa = PBXGroup; - children = ( - 0C12E9C92616383B00B66C86 /* allreduce_ops.h */, - 0C12E9CA2616383B00B66C86 /* allgather_ops.h */, - 0C12E9CB2616383B00B66C86 /* context.h */, - 0C12E9CC2616383B00B66C86 /* store_handler.h */, - 0C12E9CD2616383B00B66C86 /* broadcast_ops.h */, - 0C12E9CE2616383B00B66C86 /* reduce_scatter_ops.h */, - 0C12E9CF2616383B00B66C86 /* common.h */, - 0C12E9D02616383B00B66C86 /* common_world_ops.h */, - 0C12E9D12616383B00B66C86 /* barrier_ops.h */, - ); - path = gloo; - sourceTree = ""; - }; - 0C12E9D22616383B00B66C86 /* fakelowp */ = { - isa = PBXGroup; - children = ( - 0C12E9D32616383B00B66C86 /* sum_fp16_fake_op.h */, - 0C12E9D42616383B00B66C86 /* lengths_reducer_fused_4bit_rowwise_fp16_fake_op.h */, - 0C12E9D52616383B00B66C86 /* int8_dequantize_op_nnpi.h */, - 0C12E9D62616383B00B66C86 /* test */, - 0C12E9D72616383B00B66C86 /* fp16_gemm_utils.h */, - 0C12E9D82616383B00B66C86 /* fp16_fma.h */, - 0C12E9D92616383B00B66C86 /* fp16_fc_acc_op.h */, - 0C12E9DA2616383B00B66C86 /* layernorm_fp16_fake_op.h */, - 0C12E9DB2616383B00B66C86 /* unary_fp16_fake_op.h */, - 0C12E9DC2616383B00B66C86 /* int8_quantize_op_nnpi.h */, - 0C12E9DD2616383B00B66C86 /* lengths_reducer_ops.h */, - 0C12E9DE2616383B00B66C86 /* common.h */, - 0C12E9DF2616383B00B66C86 /* batch_matmul_fp16_fake_op.h */, - 0C12E9E02616383B00B66C86 /* lengths_reducer_fused_8bit_rowwise_fp16_fake_op.h */, - 0C12E9E12616383B00B66C86 /* spatial_batch_norm_fp16_fake_op.h */, - 0C12E9E22616383B00B66C86 /* quant_lut_fp16_fake_op.h */, - 0C12E9E32616383B00B66C86 /* int8_swish_op_nnpi.h */, - ); - path = fakelowp; - sourceTree = ""; - }; - 0C12E9D62616383B00B66C86 /* test */ = { - isa = PBXGroup; - children = ( - ); - path = test; - sourceTree = ""; - }; - 0C12E9E42616383B00B66C86 /* script */ = { - isa = PBXGroup; - children = ( - 0C12E9E52616383B00B66C86 /* examples */, - ); - path = script; - sourceTree = ""; - }; - 0C12E9E52616383B00B66C86 /* examples */ = { - isa = PBXGroup; - children = ( - ); - path = examples; - sourceTree = ""; - }; - 0C12E9E62616383B00B66C86 /* opencl */ = { - isa = PBXGroup; - children = ( - 0C12E9E72616383B00B66C86 /* context.h */, - 0C12E9E82616383B00B66C86 /* OpenCL */, - ); - path = opencl; - sourceTree = ""; - }; - 0C12E9E82616383B00B66C86 /* OpenCL */ = { - isa = PBXGroup; - children = ( - ); - path = OpenCL; - sourceTree = ""; - }; - 0C12E9E92616383B00B66C86 /* prof */ = { - isa = PBXGroup; - children = ( - 0C12E9EA2616383B00B66C86 /* prof_dag_stats_op.h */, - ); - path = prof; - sourceTree = ""; - }; - 0C12E9EB2616383B00B66C86 /* tensorrt */ = { - isa = PBXGroup; - children = ( - 0C12E9EC2616383B00B66C86 /* tensorrt_tranformer.h */, - 0C12E9ED2616383B00B66C86 /* trt_utils.h */, - 0C12E9EE2616383B00B66C86 /* tensorrt_op_trt.h */, - ); - path = tensorrt; - sourceTree = ""; - }; - 0C12E9EF2616383B00B66C86 /* shm_mutex */ = { - isa = PBXGroup; - children = ( - 0C12E9F02616383B00B66C86 /* shm_mutex.h */, - ); - path = shm_mutex; - sourceTree = ""; - }; - 0C12E9F12616383B00B66C86 /* tensorboard */ = { - isa = PBXGroup; - children = ( - ); - path = tensorboard; - sourceTree = ""; - }; - 0C12E9F22616383B00B66C86 /* aten */ = { - isa = PBXGroup; - children = ( - 0C12E9F32616383B00B66C86 /* aten_op.h */, - 0C12E9F42616383B00B66C86 /* docs */, - 0C12E9F52616383B00B66C86 /* aten_op_template.h */, - ); - path = aten; - sourceTree = ""; - }; - 0C12E9F42616383B00B66C86 /* docs */ = { - isa = PBXGroup; - children = ( - ); - path = docs; - sourceTree = ""; - }; - 0C12E9F62616383B00B66C86 /* pytorch */ = { - isa = PBXGroup; - children = ( - ); - path = pytorch; - sourceTree = ""; - }; - 0C12E9F72616383B00B66C86 /* image */ = { - isa = PBXGroup; - children = ( - 0C12E9F82616383B00B66C86 /* image_input_op.h */, - 0C12E9F92616383B00B66C86 /* transform_gpu.h */, - ); - path = image; - sourceTree = ""; - }; - 0C12E9FA2616383B00B66C86 /* quantization */ = { - isa = PBXGroup; - children = ( - 0C12E9FB2616383B00B66C86 /* server */, - ); - path = quantization; - sourceTree = ""; - }; - 0C12E9FB2616383B00B66C86 /* server */ = { - isa = PBXGroup; - children = ( - 0C12E9FC2616383B00B66C86 /* fbgemm_fp16_pack_op.h */, - 0C12E9FD2616383B00B66C86 /* concat_dnnlowp_op.h */, - 0C12E9FE2616383B00B66C86 /* fully_connected_dnnlowp_op.h */, - 0C12E9FF2616383B00B66C86 /* int8_quant_scheme_blob_fill.h */, - 0C12EA002616383B00B66C86 /* quantize_dnnlowp_op.h */, - 0C12EA012616383B00B66C86 /* batch_matmul_dnnlowp_op.h */, - 0C12EA022616383B00B66C86 /* utility_dnnlowp_ops.h */, - 0C12EA032616383B00B66C86 /* activation_distribution_observer.h */, - 0C12EA042616383B00B66C86 /* compute_equalization_scale.h */, - 0C12EA052616383B00B66C86 /* caffe2_dnnlowp_utils.h */, - 0C12EA062616383B00B66C86 /* dnnlowp_partition.h */, - 0C12EA072616383B00B66C86 /* fully_connected_fake_lowp_op.h */, - 0C12EA082616383B00B66C86 /* op_wrapper.h */, - 0C12EA092616383B00B66C86 /* batch_permutation_dnnlowp_op.h */, - 0C12EA0A2616383B00B66C86 /* conv_relu_op.h */, - 0C12EA0B2616383B00B66C86 /* conv_pool_dnnlowp_op_base.h */, - 0C12EA0C2616383B00B66C86 /* mmio.h */, - 0C12EA0D2616383B00B66C86 /* lstm_unit_dnnlowp_op.h */, - 0C12EA0E2616383B00B66C86 /* fbgemm_pack_matrix_cache.h */, - 0C12EA0F2616383B00B66C86 /* im2col_dnnlowp.h */, - 0C12EA102616383B00B66C86 /* fbgemm_pack_op.h */, - 0C12EA112616383B00B66C86 /* resize_nearest_dnnlowp_op.h */, - 0C12EA122616383B00B66C86 /* group_norm_dnnlowp_op.h */, - 0C12EA132616383B00B66C86 /* elementwise_dnnlowp_op.h */, - 0C12EA142616383B00B66C86 /* fb_fc_packed_op.h */, - 0C12EA152616383B00B66C86 /* relu_dnnlowp_op.h */, - 0C12EA162616383B00B66C86 /* spatial_batch_norm_dnnlowp_op.h */, - 0C12EA172616383B00B66C86 /* dequantize_dnnlowp_op.h */, - 0C12EA182616383B00B66C86 /* kl_minimization.h */, - 0C12EA192616383B00B66C86 /* dynamic_histogram.h */, - 0C12EA1A2616383B00B66C86 /* tanh.h */, - 0C12EA1B2616383B00B66C86 /* fbgemm_pack_blob.h */, - 0C12EA1C2616383B00B66C86 /* resize_nearest_3d_dnnlowp_op.h */, - 0C12EA1D2616383B00B66C86 /* int8_gen_quant_params.h */, - 0C12EA1E2616383B00B66C86 /* conv_dnnlowp_op.h */, - 0C12EA1F2616383B00B66C86 /* sigmoid.h */, - 0C12EA202616383B00B66C86 /* channel_shuffle_dnnlowp_op.h */, - 0C12EA212616383B00B66C86 /* int8_gen_quant_params_min_max.h */, - 0C12EA222616383B00B66C86 /* quantization_error_minimization.h */, - 0C12EA232616383B00B66C86 /* elementwise_linear_dnnlowp_op.h */, - 0C12EA242616383B00B66C86 /* dnnlowp_op.h */, - 0C12EA252616383B00B66C86 /* l2_minimization.h */, - 0C12EA262616383B00B66C86 /* dnnlowp.h */, - 0C12EA272616383B00B66C86 /* conv_dnnlowp_acc16_op.h */, - 0C12EA282616383B00B66C86 /* transpose.h */, - 0C12EA292616383B00B66C86 /* pool_dnnlowp_op_avx2.h */, - 0C12EA2A2616383B00B66C86 /* fully_connected_dnnlowp_acc16_op.h */, - ); - path = server; - sourceTree = ""; - }; - 0C12EA2B2616383B00B66C86 /* transforms */ = { - isa = PBXGroup; - children = ( - 0C12EA2C2616383B00B66C86 /* single_op_transform.h */, - 0C12EA2D2616383B00B66C86 /* common_subexpression_elimination.h */, - 0C12EA2E2616383B00B66C86 /* conv_to_nnpack_transform.h */, - 0C12EA2F2616383B00B66C86 /* pattern_net_transform.h */, - ); - path = transforms; - sourceTree = ""; - }; - 0C12EA302616383B00B66C86 /* mobile */ = { - isa = PBXGroup; - children = ( - 0C12EA312616383B00B66C86 /* contrib */, - ); - path = mobile; - sourceTree = ""; - }; - 0C12EA312616383B00B66C86 /* contrib */ = { - isa = PBXGroup; - children = ( - 0C12EA322616383B00B66C86 /* libopencl-stub */, - 0C12EA3D2616383B00B66C86 /* ios */, - 0C12EA472616383B00B66C86 /* snpe */, - 0C12EA492616383B00B66C86 /* nnapi */, - 0C12EA4D2616383B00B66C86 /* ulp2 */, - 0C12EA502616383B00B66C86 /* libvulkan-stub */, - ); - path = contrib; - sourceTree = ""; - }; - 0C12EA322616383B00B66C86 /* libopencl-stub */ = { - isa = PBXGroup; - children = ( - 0C12EA332616383B00B66C86 /* include */, - 0C12EA3C2616383B00B66C86 /* src */, - ); - path = "libopencl-stub"; - sourceTree = ""; - }; - 0C12EA332616383B00B66C86 /* include */ = { - isa = PBXGroup; - children = ( - 0C12EA342616383B00B66C86 /* libopencl.h */, - 0C12EA352616383B00B66C86 /* CL */, - ); - path = include; - sourceTree = ""; - }; - 0C12EA352616383B00B66C86 /* CL */ = { - isa = PBXGroup; - children = ( - 0C12EA362616383B00B66C86 /* cl_platform.h */, - 0C12EA372616383B00B66C86 /* opencl.h */, - 0C12EA382616383B00B66C86 /* cl_ext.h */, - 0C12EA392616383B00B66C86 /* cl.h */, - 0C12EA3A2616383B00B66C86 /* cl_gl.h */, - 0C12EA3B2616383B00B66C86 /* cl_gl_ext.h */, - ); - path = CL; - sourceTree = ""; - }; - 0C12EA3C2616383B00B66C86 /* src */ = { - isa = PBXGroup; - children = ( - ); - path = src; - sourceTree = ""; - }; - 0C12EA3D2616383B00B66C86 /* ios */ = { - isa = PBXGroup; - children = ( - 0C12EA3E2616383B00B66C86 /* ios_caffe_defines.h */, - 0C12EA3F2616383B00B66C86 /* mpscnn */, - 0C12EA452616383B00B66C86 /* ios_caffe.h */, - 0C12EA462616383B00B66C86 /* ios_caffe_predictor.h */, - ); - path = ios; - sourceTree = ""; - }; - 0C12EA3F2616383B00B66C86 /* mpscnn */ = { - isa = PBXGroup; - children = ( - 0C12EA402616383B00B66C86 /* mpscnn_graph_mask.h */, - 0C12EA412616383B00B66C86 /* mpscnn.h */, - 0C12EA422616383B00B66C86 /* mpscnn_test.h */, - 0C12EA432616383B00B66C86 /* mpscnn_kernels.h */, - 0C12EA442616383B00B66C86 /* mpscnn_context.h */, - ); - path = mpscnn; - sourceTree = ""; - }; - 0C12EA472616383B00B66C86 /* snpe */ = { - isa = PBXGroup; - children = ( - 0C12EA482616383B00B66C86 /* snpe_ffi.h */, - ); - path = snpe; - sourceTree = ""; - }; - 0C12EA492616383B00B66C86 /* nnapi */ = { - isa = PBXGroup; - children = ( - 0C12EA4A2616383B00B66C86 /* nnapi.h */, - 0C12EA4B2616383B00B66C86 /* NeuralNetworks.h */, - 0C12EA4C2616383B00B66C86 /* dlnnapi.h */, - ); - path = nnapi; - sourceTree = ""; - }; - 0C12EA4D2616383B00B66C86 /* ulp2 */ = { - isa = PBXGroup; - children = ( - 0C12EA4E2616383B00B66C86 /* ulp.h */, - 0C12EA4F2616383B00B66C86 /* ulp_neon.h */, - ); - path = ulp2; - sourceTree = ""; - }; - 0C12EA502616383B00B66C86 /* libvulkan-stub */ = { - isa = PBXGroup; - children = ( - 0C12EA512616383B00B66C86 /* include */, - 0C12EA562616383B00B66C86 /* src */, - ); - path = "libvulkan-stub"; - sourceTree = ""; - }; - 0C12EA512616383B00B66C86 /* include */ = { - isa = PBXGroup; - children = ( - 0C12EA522616383B00B66C86 /* libvulkan-stub.h */, - 0C12EA532616383B00B66C86 /* vulkan */, - ); - path = include; - sourceTree = ""; - }; - 0C12EA532616383B00B66C86 /* vulkan */ = { - isa = PBXGroup; - children = ( - 0C12EA542616383B00B66C86 /* vulkan.h */, - 0C12EA552616383B00B66C86 /* vk_platform.h */, - ); - path = vulkan; - sourceTree = ""; - }; - 0C12EA562616383B00B66C86 /* src */ = { - isa = PBXGroup; - children = ( - ); - path = src; - sourceTree = ""; - }; - 0C12EA572616383B00B66C86 /* sgd */ = { - isa = PBXGroup; - children = ( - 0C12EA582616383B00B66C86 /* fp16_momentum_sgd_op.h */, - 0C12EA592616383B00B66C86 /* rmsprop_op.h */, - 0C12EA5A2616383B00B66C86 /* lars_op.h */, - 0C12EA5B2616383B00B66C86 /* yellowfin_op.h */, - 0C12EA5C2616383B00B66C86 /* math_lp.h */, - 0C12EA5D2616383B00B66C86 /* storm_op.h */, - 0C12EA5E2616383B00B66C86 /* adagrad_op.h */, - 0C12EA5F2616383B00B66C86 /* clip_tensor_op.h */, - 0C12EA602616383B00B66C86 /* gftrl_op.h */, - 0C12EA612616383B00B66C86 /* adadelta_op.h */, - 0C12EA622616383B00B66C86 /* learning_rate_op.h */, - 0C12EA632616383B00B66C86 /* adagrad_fused.h */, - 0C12EA642616383B00B66C86 /* adam_op.h */, - 0C12EA652616383B00B66C86 /* ftrl_op.h */, - 0C12EA662616383B00B66C86 /* weight_scale_op.h */, - 0C12EA672616383B00B66C86 /* learning_rate_adaption_op.h */, - 0C12EA682616383B00B66C86 /* rowwise_counter.h */, - 0C12EA692616383B00B66C86 /* iter_op.h */, - 0C12EA6A2616383B00B66C86 /* rowwise_adagrad_fused.h */, - 0C12EA6B2616383B00B66C86 /* momentum_sgd_op.h */, - 0C12EA6C2616383B00B66C86 /* wngrad_op.h */, - 0C12EA6D2616383B00B66C86 /* decay_adagrad_op.h */, - 0C12EA6E2616383B00B66C86 /* learning_rate_functors.h */, - 0C12EA6F2616383B00B66C86 /* fp32_momentum_sgd_op.h */, - ); - path = sgd; - sourceTree = ""; - }; - 0C12EA702616383B00B66C86 /* queue */ = { - isa = PBXGroup; - children = ( - 0C12EA712616383B00B66C86 /* blobs_queue.h */, - 0C12EA722616383B00B66C86 /* rebatching_queue_ops.h */, - 0C12EA732616383B00B66C86 /* queue_ops.h */, - 0C12EA742616383B00B66C86 /* rebatching_queue.h */, - 0C12EA752616383B00B66C86 /* blobs_queue_db.h */, - ); - path = queue; - sourceTree = ""; - }; - 0C12EA762616383B00B66C86 /* db */ = { - isa = PBXGroup; - children = ( - 0C12EA772616383B00B66C86 /* create_db_op.h */, - ); - path = db; - sourceTree = ""; - }; - 0C12EA782616383B00B66C86 /* opt */ = { - isa = PBXGroup; - children = ( - 0C12EA792616383B00B66C86 /* nql */, - 0C12EA7D2616383B00B66C86 /* device.h */, - 0C12EA7E2616383B00B66C86 /* annotations.h */, - 0C12EA7F2616383B00B66C86 /* mobile.h */, - 0C12EA802616383B00B66C86 /* onnxifi_transformer.h */, - 0C12EA812616383B00B66C86 /* converter.h */, - 0C12EA822616383B00B66C86 /* backend_transformer_base.h */, - 0C12EA832616383B00B66C86 /* fakefp16_transform.h */, - 0C12EA842616383B00B66C86 /* fusion.h */, - 0C12EA852616383B00B66C86 /* shape_info.h */, - 0C12EA862616383B00B66C86 /* optimizer.h */, - 0C12EA872616383B00B66C86 /* glow_net_transform.h */, - 0C12EA882616383B00B66C86 /* backend_cutting.h */, - 0C12EA892616383B00B66C86 /* distributed.h */, - 0C12EA8A2616383B00B66C86 /* onnxifi_op.h */, - 0C12EA8B2616383B00B66C86 /* tvm_transformer.h */, - 0C12EA8C2616383B00B66C86 /* passes.h */, - 0C12EA8D2616383B00B66C86 /* bound_shape_inferencer.h */, - 0C12EA8E2616383B00B66C86 /* custom */, - 0C12EA942616383B00B66C86 /* onnx_convert.h */, - 0C12EA952616383B00B66C86 /* optimize_ideep.h */, - ); - path = opt; - sourceTree = ""; - }; - 0C12EA792616383B00B66C86 /* nql */ = { - isa = PBXGroup; - children = ( - 0C12EA7A2616383B00B66C86 /* tests */, - 0C12EA7B2616383B00B66C86 /* ast.h */, - 0C12EA7C2616383B00B66C86 /* graphmatcher.h */, - ); - path = nql; - sourceTree = ""; - }; - 0C12EA7A2616383B00B66C86 /* tests */ = { - isa = PBXGroup; - children = ( - ); - path = tests; - sourceTree = ""; - }; - 0C12EA8E2616383B00B66C86 /* custom */ = { - isa = PBXGroup; - children = ( - 0C12EA8F2616383B00B66C86 /* concat_elim.h */, - 0C12EA902616383B00B66C86 /* pointwise_elim.h */, - 0C12EA912616383B00B66C86 /* freeze_quantization_params.h */, - 0C12EA922616383B00B66C86 /* in_batch_broadcast.h */, - 0C12EA932616383B00B66C86 /* cc_amrc.h */, - ); - path = custom; - sourceTree = ""; - }; - 0C12EA962616383B00B66C86 /* predictor */ = { - isa = PBXGroup; - children = ( - 0C12EA972616383B00B66C86 /* ThreadLocalPtr.h */, - 0C12EA982616383B00B66C86 /* InferenceGraph.h */, - 0C12EA992616383B00B66C86 /* predictor_utils.h */, - 0C12EA9A2616383B00B66C86 /* predictor.h */, - 0C12EA9B2616383B00B66C86 /* predictor_config.h */, - 0C12EA9C2616383B00B66C86 /* emulator */, - 0C12EAA62616383B00B66C86 /* transforms.h */, - ); - path = predictor; - sourceTree = ""; - }; - 0C12EA9C2616383B00B66C86 /* emulator */ = { - isa = PBXGroup; - children = ( - 0C12EA9D2616383B00B66C86 /* data_filler.h */, - 0C12EA9E2616383B00B66C86 /* utils.h */, - 0C12EA9F2616383B00B66C86 /* net_supplier.h */, - 0C12EAA02616383B00B66C86 /* time_profiler.h */, - 0C12EAA12616383B00B66C86 /* emulator.h */, - 0C12EAA22616383B00B66C86 /* output_formatter.h */, - 0C12EAA32616383B00B66C86 /* std_output_formatter.h */, - 0C12EAA42616383B00B66C86 /* benchmark.h */, - 0C12EAA52616383B00B66C86 /* profiler.h */, - ); - path = emulator; - sourceTree = ""; - }; - 0C12EAA72616383B00B66C86 /* observers */ = { - isa = PBXGroup; - children = ( - 0C12EAA82616383B00B66C86 /* operator_attaching_net_observer.h */, - 0C12EAA92616383B00B66C86 /* time_observer.h */, - 0C12EAAA2616383B00B66C86 /* runcnt_observer.h */, - 0C12EAAB2616383B00B66C86 /* profile_observer.h */, - ); - path = observers; - sourceTree = ""; - }; - 0C12EAAC2616383B00B66C86 /* share */ = { - isa = PBXGroup; - children = ( - 0C12EAAD2616383B00B66C86 /* contrib */, - ); - path = share; - sourceTree = ""; - }; - 0C12EAAD2616383B00B66C86 /* contrib */ = { - isa = PBXGroup; - children = ( - 0C12EAAE2616383B00B66C86 /* nnpack */, - 0C12EAAF2616383B00B66C86 /* depthwise */, - 0C12EAB02616383B00B66C86 /* zstd */, - ); - path = contrib; - sourceTree = ""; - }; - 0C12EAAE2616383B00B66C86 /* nnpack */ = { - isa = PBXGroup; - children = ( - ); - path = nnpack; - sourceTree = ""; - }; - 0C12EAAF2616383B00B66C86 /* depthwise */ = { - isa = PBXGroup; - children = ( - ); - path = depthwise; - sourceTree = ""; - }; - 0C12EAB02616383B00B66C86 /* zstd */ = { - isa = PBXGroup; - children = ( - 0C12EAB12616383B00B66C86 /* quant_decomp_zstd_op.h */, - ); - path = zstd; - sourceTree = ""; - }; - 0C12EAB32616383B00B66C86 /* torch */ = { - isa = PBXGroup; - children = ( - 0C12EAB42616383B00B66C86 /* csrc */, - 0C12EDA52616383C00B66C86 /* script.h */, - 0C12EDA62616383C00B66C86 /* library.h */, - 0C12EDA72616383C00B66C86 /* custom_class_detail.h */, - 0C12EDA82616383C00B66C86 /* custom_class.h */, - 0C12EDA92616383C00B66C86 /* extension.h */, - ); - path = torch; - sourceTree = ""; - }; - 0C12EAB42616383B00B66C86 /* csrc */ = { - isa = PBXGroup; - children = ( - 0C12EAB52616383B00B66C86 /* Size.h */, - 0C12EAB62616383B00B66C86 /* utils.h */, - 0C12EAB72616383B00B66C86 /* Device.h */, - 0C12EAB82616383B00B66C86 /* onnx */, - 0C12EABB2616383B00B66C86 /* Types.h */, - 0C12EABC2616383B00B66C86 /* distributed */, - 0C12EAFD2616383B00B66C86 /* autograd */, - 0C12EB332616383B00B66C86 /* deploy */, - 0C12EB392616383B00B66C86 /* multiprocessing */, - 0C12EB3B2616383B00B66C86 /* cuda */, - 0C12EB4C2616383B00B66C86 /* serialization.h */, - 0C12EB4D2616383B00B66C86 /* Exceptions.h */, - 0C12EB4E2616383B00B66C86 /* QScheme.h */, - 0C12EB4F2616383B00B66C86 /* utils */, - 0C12EB752616383B00B66C86 /* Stream.h */, - 0C12EB762616383B00B66C86 /* StorageDefs.h */, - 0C12EB772616383B00B66C86 /* DataLoader.h */, - 0C12EB782616383B00B66C86 /* THP.h */, - 0C12EB792616383B00B66C86 /* python_headers.h */, - 0C12EB7A2616383B00B66C86 /* Layout.h */, - 0C12EB7B2616383B00B66C86 /* DynamicTypes.h */, - 0C12EB7C2616383B00B66C86 /* copy_utils.h */, - 0C12EB7D2616383B00B66C86 /* jit */, - 0C12ECDA2616383B00B66C86 /* Storage.h */, - 0C12ECDB2616383B00B66C86 /* api */, - 0C12ED952616383C00B66C86 /* MemoryFormat.h */, - 0C12ED962616383C00B66C86 /* generic */, - 0C12ED9A2616383C00B66C86 /* tensor */, - 0C12ED9C2616383C00B66C86 /* WindowsTorchApiMacro.h */, - 0C12ED9D2616383C00B66C86 /* Dtype.h */, - 0C12ED9E2616383C00B66C86 /* Module.h */, - 0C12ED9F2616383C00B66C86 /* THP_export.h */, - 0C12EDA02616383C00B66C86 /* python_dimname.h */, - 0C12EDA12616383C00B66C86 /* CudaIPCTypes.h */, - 0C12EDA22616383C00B66C86 /* Generator.h */, - 0C12EDA32616383C00B66C86 /* TypeInfo.h */, - 0C12EDA42616383C00B66C86 /* PythonTypes.h */, - ); - path = csrc; - sourceTree = ""; - }; - 0C12EAB82616383B00B66C86 /* onnx */ = { - isa = PBXGroup; - children = ( - 0C12EAB92616383B00B66C86 /* init.h */, - 0C12EABA2616383B00B66C86 /* onnx.h */, - ); - path = onnx; - sourceTree = ""; - }; - 0C12EABC2616383B00B66C86 /* distributed */ = { - isa = PBXGroup; - children = ( - 0C12EABD2616383B00B66C86 /* autograd */, - 0C12EAD42616383B00B66C86 /* rpc */, - 0C12EAFA2616383B00B66C86 /* c10d */, - ); - path = distributed; - sourceTree = ""; - }; - 0C12EABD2616383B00B66C86 /* autograd */ = { - isa = PBXGroup; - children = ( - 0C12EABE2616383B00B66C86 /* utils.h */, - 0C12EABF2616383B00B66C86 /* context */, - 0C12EAC22616383B00B66C86 /* rpc_messages */, - 0C12EACD2616383B00B66C86 /* python_autograd.h */, - 0C12EACE2616383B00B66C86 /* autograd.h */, - 0C12EACF2616383B00B66C86 /* functions */, - 0C12EAD22616383B00B66C86 /* engine */, - ); - path = autograd; - sourceTree = ""; - }; - 0C12EABF2616383B00B66C86 /* context */ = { - isa = PBXGroup; - children = ( - 0C12EAC02616383B00B66C86 /* container.h */, - 0C12EAC12616383B00B66C86 /* context.h */, - ); - path = context; - sourceTree = ""; - }; - 0C12EAC22616383B00B66C86 /* rpc_messages */ = { - isa = PBXGroup; - children = ( - 0C12EAC32616383B00B66C86 /* cleanup_autograd_context_req.h */, - 0C12EAC42616383B00B66C86 /* cleanup_autograd_context_resp.h */, - 0C12EAC52616383B00B66C86 /* rref_backward_req.h */, - 0C12EAC62616383B00B66C86 /* rpc_with_profiling_req.h */, - 0C12EAC72616383B00B66C86 /* propagate_gradients_resp.h */, - 0C12EAC82616383B00B66C86 /* propagate_gradients_req.h */, - 0C12EAC92616383B00B66C86 /* autograd_metadata.h */, - 0C12EACA2616383B00B66C86 /* rpc_with_autograd.h */, - 0C12EACB2616383B00B66C86 /* rref_backward_resp.h */, - 0C12EACC2616383B00B66C86 /* rpc_with_profiling_resp.h */, - ); - path = rpc_messages; - sourceTree = ""; - }; - 0C12EACF2616383B00B66C86 /* functions */ = { - isa = PBXGroup; - children = ( - 0C12EAD02616383B00B66C86 /* sendrpc_backward.h */, - 0C12EAD12616383B00B66C86 /* recvrpc_backward.h */, - ); - path = functions; - sourceTree = ""; - }; - 0C12EAD22616383B00B66C86 /* engine */ = { - isa = PBXGroup; - children = ( - 0C12EAD32616383B00B66C86 /* dist_engine.h */, - ); - path = engine; - sourceTree = ""; - }; - 0C12EAD42616383B00B66C86 /* rpc */ = { - isa = PBXGroup; - children = ( - 0C12EAD52616383B00B66C86 /* metrics */, - 0C12EAD72616383B00B66C86 /* utils.h */, - 0C12EAD82616383B00B66C86 /* rref_context.h */, - 0C12EAD92616383B00B66C86 /* request_callback_impl.h */, - 0C12EADA2616383B00B66C86 /* python_resp.h */, - 0C12EADB2616383B00B66C86 /* rref_impl.h */, - 0C12EADC2616383B00B66C86 /* request_callback.h */, - 0C12EADD2616383B00B66C86 /* types.h */, - 0C12EADE2616383B00B66C86 /* rref_proto.h */, - 0C12EADF2616383B00B66C86 /* py_rref.h */, - 0C12EAE02616383B00B66C86 /* rpc_agent.h */, - 0C12EAE12616383B00B66C86 /* python_functions.h */, - 0C12EAE22616383B00B66C86 /* message.h */, - 0C12EAE32616383B00B66C86 /* request_callback_no_python.h */, - 0C12EAE42616383B00B66C86 /* python_remote_call.h */, - 0C12EAE52616383B00B66C86 /* python_call.h */, - 0C12EAE62616383B00B66C86 /* tensorpipe_agent.h */, - 0C12EAE72616383B00B66C86 /* script_remote_call.h */, - 0C12EAE82616383B00B66C86 /* testing */, - 0C12EAEB2616383B00B66C86 /* macros.h */, - 0C12EAEC2616383B00B66C86 /* script_resp.h */, - 0C12EAED2616383B00B66C86 /* rpc.h */, - 0C12EAEE2616383B00B66C86 /* rpc_command_base.h */, - 0C12EAEF2616383B00B66C86 /* profiler */, - 0C12EAF22616383B00B66C86 /* script_call.h */, - 0C12EAF32616383B00B66C86 /* unpickled_python_remote_call.h */, - 0C12EAF42616383B00B66C86 /* torchscript_functions.h */, - 0C12EAF52616383B00B66C86 /* unpickled_python_call.h */, - 0C12EAF62616383B00B66C86 /* tensorpipe_utils.h */, - 0C12EAF72616383B00B66C86 /* agent_utils.h */, - 0C12EAF82616383B00B66C86 /* process_group_agent.h */, - 0C12EAF92616383B00B66C86 /* python_rpc_handler.h */, - ); - path = rpc; - sourceTree = ""; - }; - 0C12EAD52616383B00B66C86 /* metrics */ = { - isa = PBXGroup; - children = ( - 0C12EAD62616383B00B66C86 /* RpcMetricsHandler.h */, - ); - path = metrics; - sourceTree = ""; - }; - 0C12EAE82616383B00B66C86 /* testing */ = { - isa = PBXGroup; - children = ( - 0C12EAE92616383B00B66C86 /* testing.h */, - 0C12EAEA2616383B00B66C86 /* faulty_process_group_agent.h */, - ); - path = testing; - sourceTree = ""; - }; - 0C12EAEF2616383B00B66C86 /* profiler */ = { - isa = PBXGroup; - children = ( - 0C12EAF02616383B00B66C86 /* remote_profiler_manager.h */, - 0C12EAF12616383B00B66C86 /* server_process_global_profiler.h */, - ); - path = profiler; - sourceTree = ""; - }; - 0C12EAFA2616383B00B66C86 /* c10d */ = { - isa = PBXGroup; - children = ( - 0C12EAFB2616383B00B66C86 /* python_comm_hook.h */, - 0C12EAFC2616383B00B66C86 /* c10d.h */, - ); - path = c10d; - sourceTree = ""; - }; - 0C12EAFD2616383B00B66C86 /* autograd */ = { - isa = PBXGroup; - children = ( - 0C12EAFE2616383B00B66C86 /* generated */, - 0C12EB022616383B00B66C86 /* python_function.h */, - 0C12EB032616383B00B66C86 /* custom_function.h */, - 0C12EB042616383B00B66C86 /* python_linalg_functions.h */, - 0C12EB052616383B00B66C86 /* record_function_ops.h */, - 0C12EB062616383B00B66C86 /* engine.h */, - 0C12EB072616383B00B66C86 /* edge.h */, - 0C12EB082616383B00B66C86 /* saved_variable.h */, - 0C12EB092616383B00B66C86 /* python_engine.h */, - 0C12EB0A2616383B00B66C86 /* python_legacy_variable.h */, - 0C12EB0B2616383B00B66C86 /* python_cpp_function.h */, - 0C12EB0C2616383B00B66C86 /* python_hook.h */, - 0C12EB0D2616383B00B66C86 /* VariableTypeUtils.h */, - 0C12EB0E2616383B00B66C86 /* python_autograd.h */, - 0C12EB0F2616383B00B66C86 /* profiler_kineto.h */, - 0C12EB102616383B00B66C86 /* variable.h */, - 0C12EB112616383B00B66C86 /* utils */, - 0C12EB172616383B00B66C86 /* python_fft_functions.h */, - 0C12EB182616383B00B66C86 /* python_variable.h */, - 0C12EB192616383B00B66C86 /* function_hook.h */, - 0C12EB1A2616383B00B66C86 /* input_metadata.h */, - 0C12EB1B2616383B00B66C86 /* grad_mode.h */, - 0C12EB1C2616383B00B66C86 /* symbolic.h */, - 0C12EB1D2616383B00B66C86 /* input_buffer.h */, - 0C12EB1E2616383B00B66C86 /* profiler_legacy.h */, - 0C12EB1F2616383B00B66C86 /* autograd.h */, - 0C12EB202616383B00B66C86 /* cpp_hook.h */, - 0C12EB212616383B00B66C86 /* functions */, - 0C12EB282616383B00B66C86 /* python_special_functions.h */, - 0C12EB292616383B00B66C86 /* FunctionsManual.h */, - 0C12EB2A2616383B00B66C86 /* forward_grad.h */, - 0C12EB2B2616383B00B66C86 /* python_anomaly_mode.h */, - 0C12EB2C2616383B00B66C86 /* python_nn_functions.h */, - 0C12EB2D2616383B00B66C86 /* InferenceMode.h */, - 0C12EB2E2616383B00B66C86 /* python_variable_indexing.h */, - 0C12EB2F2616383B00B66C86 /* profiler.h */, - 0C12EB302616383B00B66C86 /* function.h */, - 0C12EB312616383B00B66C86 /* anomaly_mode.h */, - 0C12EB322616383B00B66C86 /* profiler_utils.h */, - ); - path = autograd; - sourceTree = ""; - }; - 0C12EAFE2616383B00B66C86 /* generated */ = { - isa = PBXGroup; - children = ( - 0C12EAFF2616383B00B66C86 /* python_functions.h */, - 0C12EB002616383B00B66C86 /* Functions.h */, - 0C12EB012616383B00B66C86 /* variable_factories.h */, - ); - path = generated; - sourceTree = ""; - }; - 0C12EB112616383B00B66C86 /* utils */ = { - isa = PBXGroup; - children = ( - 0C12EB122616383B00B66C86 /* wrap_outputs.h */, - 0C12EB132616383B00B66C86 /* python_arg_parsing.h */, - 0C12EB142616383B00B66C86 /* grad_layout_contract.h */, - 0C12EB152616383B00B66C86 /* lambda_post_hook.h */, - 0C12EB162616383B00B66C86 /* error_messages.h */, - ); - path = utils; - sourceTree = ""; - }; - 0C12EB212616383B00B66C86 /* functions */ = { - isa = PBXGroup; - children = ( - 0C12EB222616383B00B66C86 /* utils.h */, - 0C12EB232616383B00B66C86 /* pybind.h */, - 0C12EB242616383B00B66C86 /* comm.h */, - 0C12EB252616383B00B66C86 /* basic_ops.h */, - 0C12EB262616383B00B66C86 /* accumulate_grad.h */, - 0C12EB272616383B00B66C86 /* tensor.h */, - ); - path = functions; - sourceTree = ""; - }; - 0C12EB332616383B00B66C86 /* deploy */ = { - isa = PBXGroup; - children = ( - 0C12EB342616383B00B66C86 /* interpreter */, - 0C12EB372616383B00B66C86 /* example */, - 0C12EB382616383B00B66C86 /* deploy.h */, - ); - path = deploy; - sourceTree = ""; - }; - 0C12EB342616383B00B66C86 /* interpreter */ = { - isa = PBXGroup; - children = ( - 0C12EB352616383B00B66C86 /* interpreter_impl.h */, - 0C12EB362616383B00B66C86 /* third_party */, - ); - path = interpreter; - sourceTree = ""; - }; - 0C12EB362616383B00B66C86 /* third_party */ = { - isa = PBXGroup; - children = ( - ); - path = third_party; - sourceTree = ""; - }; - 0C12EB372616383B00B66C86 /* example */ = { - isa = PBXGroup; - children = ( - ); - path = example; - sourceTree = ""; - }; - 0C12EB392616383B00B66C86 /* multiprocessing */ = { - isa = PBXGroup; - children = ( - 0C12EB3A2616383B00B66C86 /* init.h */, - ); - path = multiprocessing; - sourceTree = ""; - }; - 0C12EB3B2616383B00B66C86 /* cuda */ = { - isa = PBXGroup; - children = ( - 0C12EB3C2616383B00B66C86 /* utils.h */, - 0C12EB3D2616383B00B66C86 /* THCP.h */, - 0C12EB3E2616383B00B66C86 /* nccl.h */, - 0C12EB3F2616383B00B66C86 /* python_nccl.h */, - 0C12EB402616383B00B66C86 /* device_set.h */, - 0C12EB412616383B00B66C86 /* Event.h */, - 0C12EB422616383B00B66C86 /* serialization.h */, - 0C12EB432616383B00B66C86 /* python_comm.h */, - 0C12EB442616383B00B66C86 /* comm.h */, - 0C12EB452616383B00B66C86 /* Stream.h */, - 0C12EB462616383B00B66C86 /* shared */, - 0C12EB472616383B00B66C86 /* undef_macros.h */, - 0C12EB482616383B00B66C86 /* restore_macros.h */, - 0C12EB492616383B00B66C86 /* Storage.h */, - 0C12EB4A2616383B00B66C86 /* Module.h */, - 0C12EB4B2616383B00B66C86 /* override_macros.h */, - ); - path = cuda; - sourceTree = ""; - }; - 0C12EB462616383B00B66C86 /* shared */ = { - isa = PBXGroup; - children = ( - ); - path = shared; - sourceTree = ""; - }; - 0C12EB4F2616383B00B66C86 /* utils */ = { - isa = PBXGroup; - children = ( - 0C12EB502616383B00B66C86 /* object_ptr.h */, - 0C12EB512616383B00B66C86 /* tensor_numpy.h */, - 0C12EB522616383B00B66C86 /* tensor_dtypes.h */, - 0C12EB532616383B00B66C86 /* python_tuples.h */, - 0C12EB542616383B00B66C86 /* python_numbers.h */, - 0C12EB552616383B00B66C86 /* python_scalars.h */, - 0C12EB562616383B00B66C86 /* pybind.h */, - 0C12EB572616383B00B66C86 /* tensor_types.h */, - 0C12EB582616383B00B66C86 /* tensor_memoryformats.h */, - 0C12EB592616383B00B66C86 /* python_arg_parser.h */, - 0C12EB5A2616383B00B66C86 /* cuda_lazy_init.h */, - 0C12EB5B2616383B00B66C86 /* tensor_new.h */, - 0C12EB5C2616383B00B66C86 /* tensor_qschemes.h */, - 0C12EB5D2616383B00B66C86 /* python_dispatch.h */, - 0C12EB5E2616383B00B66C86 /* tensor_list.h */, - 0C12EB5F2616383B00B66C86 /* invalid_arguments.h */, - 0C12EB602616383B00B66C86 /* auto_gil.h */, - 0C12EB612616383B00B66C86 /* python_strings.h */, - 0C12EB622616383B00B66C86 /* byte_order.h */, - 0C12EB632616383B00B66C86 /* pycfunction_helpers.h */, - 0C12EB642616383B00B66C86 /* cuda_enabled.h */, - 0C12EB652616383B00B66C86 /* numpy_stub.h */, - 0C12EB662616383B00B66C86 /* out_types.h */, - 0C12EB672616383B00B66C86 /* memory.h */, - 0C12EB682616383B00B66C86 /* tensor_layouts.h */, - 0C12EB692616383B00B66C86 /* structseq.h */, - 0C12EB6A2616383B00B66C86 /* throughput_benchmark.h */, - 0C12EB6B2616383B00B66C86 /* disable_torch_function.h */, - 0C12EB6C2616383B00B66C86 /* throughput_benchmark-inl.h */, - 0C12EB6D2616383B00B66C86 /* tensor_flatten.h */, - 0C12EB6E2616383B00B66C86 /* tensor_apply.h */, - 0C12EB6F2616383B00B66C86 /* init.h */, - 0C12EB702616383B00B66C86 /* python_compat.h */, - 0C12EB712616383B00B66C86 /* disallow_copy.h */, - 0C12EB722616383B00B66C86 /* six.h */, - 0C12EB732616383B00B66C86 /* python_stub.h */, - 0C12EB742616383B00B66C86 /* variadic.h */, - ); - path = utils; - sourceTree = ""; - }; - 0C12EB7D2616383B00B66C86 /* jit */ = { - isa = PBXGroup; - children = ( - 0C12EB7E2616383B00B66C86 /* generated */, - 0C12EB7F2616383B00B66C86 /* jit_opt_limit.h */, - 0C12EB802616383B00B66C86 /* frontend */, - 0C12EB9D2616383B00B66C86 /* python */, - 0C12EBAB2616383B00B66C86 /* tensorexpr */, - 0C12EBD22616383B00B66C86 /* ir */, - 0C12EBDF2616383B00B66C86 /* cuda */, - 0C12EBE12616383B00B66C86 /* serialization */, - 0C12EBF12616383B00B66C86 /* backends */, - 0C12EBF72616383B00B66C86 /* runtime */, - 0C12EC122616383B00B66C86 /* passes */, - 0C12EC752616383B00B66C86 /* docs */, - 0C12EC762616383B00B66C86 /* codegen */, - 0C12ECC22616383B00B66C86 /* testing */, - 0C12ECC52616383B00B66C86 /* jit_log.h */, - 0C12ECC62616383B00B66C86 /* mobile */, - 0C12ECD32616383B00B66C86 /* resource_guard.h */, - 0C12ECD42616383B00B66C86 /* api */, - ); - path = jit; - sourceTree = ""; - }; - 0C12EB7E2616383B00B66C86 /* generated */ = { - isa = PBXGroup; - children = ( - ); - path = generated; - sourceTree = ""; - }; - 0C12EB802616383B00B66C86 /* frontend */ = { - isa = PBXGroup; - children = ( - 0C12EB812616383B00B66C86 /* error_report.h */, - 0C12EB822616383B00B66C86 /* source_range.h */, - 0C12EB832616383B00B66C86 /* edit_distance.h */, - 0C12EB842616383B00B66C86 /* canonicalize_modified_loop.h */, - 0C12EB852616383B00B66C86 /* schema_matching.h */, - 0C12EB862616383B00B66C86 /* function_schema_parser.h */, - 0C12EB872616383B00B66C86 /* tree_views.h */, - 0C12EB882616383B00B66C86 /* ir_emitter.h */, - 0C12EB892616383B00B66C86 /* parser.h */, - 0C12EB8A2616383B00B66C86 /* strtod.h */, - 0C12EB8B2616383B00B66C86 /* tree.h */, - 0C12EB8C2616383B00B66C86 /* concrete_module_type.h */, - 0C12EB8D2616383B00B66C86 /* builtin_functions.h */, - 0C12EB8E2616383B00B66C86 /* exit_transforms.h */, - 0C12EB8F2616383B00B66C86 /* parse_string_literal.h */, - 0C12EB902616383B00B66C86 /* sugared_value.h */, - 0C12EB912616383B00B66C86 /* inline_loop_condition.h */, - 0C12EB922616383B00B66C86 /* name_mangler.h */, - 0C12EB932616383B00B66C86 /* code_template.h */, - 0C12EB942616383B00B66C86 /* tracer.h */, - 0C12EB952616383B00B66C86 /* resolver.h */, - 0C12EB962616383B00B66C86 /* script_type_parser.h */, - 0C12EB972616383B00B66C86 /* schema_type_parser.h */, - 0C12EB982616383B00B66C86 /* lexer.h */, - 0C12EB992616383B00B66C86 /* versioned_symbols.h */, - 0C12EB9A2616383B00B66C86 /* convert_to_ssa.h */, - 0C12EB9B2616383B00B66C86 /* mini_environment.h */, - 0C12EB9C2616383B00B66C86 /* parser_constants.h */, - ); - path = frontend; - sourceTree = ""; - }; - 0C12EB9D2616383B00B66C86 /* python */ = { - isa = PBXGroup; - children = ( - 0C12EB9E2616383B00B66C86 /* pybind.h */, - 0C12EB9F2616383B00B66C86 /* python_ir.h */, - 0C12EBA02616383B00B66C86 /* script_init.h */, - 0C12EBA12616383B00B66C86 /* python_tree_views.h */, - 0C12EBA22616383B00B66C86 /* python_ivalue.h */, - 0C12EBA32616383B00B66C86 /* python_custom_class.h */, - 0C12EBA42616383B00B66C86 /* update_graph_executor_opt.h */, - 0C12EBA52616383B00B66C86 /* python_tracer.h */, - 0C12EBA62616383B00B66C86 /* pybind_utils.h */, - 0C12EBA72616383B00B66C86 /* init.h */, - 0C12EBA82616383B00B66C86 /* python_sugared_value.h */, - 0C12EBA92616383B00B66C86 /* python_arg_flatten.h */, - 0C12EBAA2616383B00B66C86 /* module_python.h */, - ); - path = python; - sourceTree = ""; - }; - 0C12EBAB2616383B00B66C86 /* tensorexpr */ = { - isa = PBXGroup; - children = ( - 0C12EBAC2616383B00B66C86 /* ir_mutator.h */, - 0C12EBAD2616383B00B66C86 /* ir_simplifier.h */, - 0C12EBAE2616383B00B66C86 /* ir_visitor.h */, - 0C12EBAF2616383B00B66C86 /* llvm_jit.h */, - 0C12EBB02616383B00B66C86 /* tensorexpr_init.h */, - 0C12EBB12616383B00B66C86 /* types.h */, - 0C12EBB22616383B00B66C86 /* mem_dependency_checker.h */, - 0C12EBB32616383B00B66C86 /* ir.h */, - 0C12EBB42616383B00B66C86 /* exceptions.h */, - 0C12EBB52616383B00B66C86 /* cuda_codegen.h */, - 0C12EBB62616383B00B66C86 /* hash_provider.h */, - 0C12EBB72616383B00B66C86 /* ir_printer.h */, - 0C12EBB82616383B00B66C86 /* llvm_codegen.h */, - 0C12EBB92616383B00B66C86 /* expr.h */, - 0C12EBBA2616383B00B66C86 /* cuda_random.h */, - 0C12EBBB2616383B00B66C86 /* execution_counter.h */, - 0C12EBBC2616383B00B66C86 /* codegen.h */, - 0C12EBBD2616383B00B66C86 /* unique_name_manager.h */, - 0C12EBBE2616383B00B66C86 /* cpp_codegen.h */, - 0C12EBBF2616383B00B66C86 /* var_substitutor.h */, - 0C12EBC02616383B00B66C86 /* eval.h */, - 0C12EBC12616383B00B66C86 /* bounds_inference.h */, - 0C12EBC22616383B00B66C86 /* intrinsic_symbols.h */, - 0C12EBC32616383B00B66C86 /* block_codegen.h */, - 0C12EBC42616383B00B66C86 /* external_functions_registry.h */, - 0C12EBC52616383B00B66C86 /* kernel.h */, - 0C12EBC62616383B00B66C86 /* loopnest.h */, - 0C12EBC72616383B00B66C86 /* bounds_overlap.h */, - 0C12EBC82616383B00B66C86 /* ir_verifier.h */, - 0C12EBC92616383B00B66C86 /* dim_arg.h */, - 0C12EBCA2616383B00B66C86 /* external_functions.h */, - 0C12EBCB2616383B00B66C86 /* stmt.h */, - 0C12EBCC2616383B00B66C86 /* half_support.h */, - 0C12EBCD2616383B00B66C86 /* registerizer.h */, - 0C12EBCE2616383B00B66C86 /* reduction.h */, - 0C12EBCF2616383B00B66C86 /* tensor.h */, - 0C12EBD02616383B00B66C86 /* mem_arena.h */, - 0C12EBD12616383B00B66C86 /* analysis.h */, - ); - path = tensorexpr; - sourceTree = ""; - }; - 0C12EBD22616383B00B66C86 /* ir */ = { - isa = PBXGroup; - children = ( - 0C12EBD32616383B00B66C86 /* named_value.h */, - 0C12EBD42616383B00B66C86 /* irparser.h */, - 0C12EBD52616383B00B66C86 /* ir.h */, - 0C12EBD62616383B00B66C86 /* graph_node_list.h */, - 0C12EBD72616383B00B66C86 /* ir_views.h */, - 0C12EBD82616383B00B66C86 /* alias_analysis.h */, - 0C12EBD92616383B00B66C86 /* attributes.h */, - 0C12EBDA2616383B00B66C86 /* type_hashing.h */, - 0C12EBDB2616383B00B66C86 /* constants.h */, - 0C12EBDC2616383B00B66C86 /* subgraph_matcher.h */, - 0C12EBDD2616383B00B66C86 /* scope.h */, - 0C12EBDE2616383B00B66C86 /* node_hashing.h */, - ); - path = ir; - sourceTree = ""; - }; - 0C12EBDF2616383B00B66C86 /* cuda */ = { - isa = PBXGroup; - children = ( - 0C12EBE02616383B00B66C86 /* cuda.h */, - ); - path = cuda; - sourceTree = ""; - }; - 0C12EBE12616383B00B66C86 /* serialization */ = { - isa = PBXGroup; - children = ( - 0C12EBE22616383B00B66C86 /* import_source.h */, - 0C12EBE32616383B00B66C86 /* export.h */, - 0C12EBE42616383B00B66C86 /* import_export_helpers.h */, - 0C12EBE52616383B00B66C86 /* type_name_uniquer.h */, - 0C12EBE62616383B00B66C86 /* pickler.h */, - 0C12EBE72616383B00B66C86 /* python_print.h */, - 0C12EBE82616383B00B66C86 /* import_legacy.h */, - 0C12EBE92616383B00B66C86 /* import_export_functions.h */, - 0C12EBEA2616383B00B66C86 /* pickle.h */, - 0C12EBEB2616383B00B66C86 /* import_export_constants.h */, - 0C12EBEC2616383B00B66C86 /* source_range_serialization_impl.h */, - 0C12EBED2616383B00B66C86 /* import.h */, - 0C12EBEE2616383B00B66C86 /* unpickler.h */, - 0C12EBEF2616383B00B66C86 /* source_range_serialization.h */, - 0C12EBF02616383B00B66C86 /* onnx.h */, - ); - path = serialization; - sourceTree = ""; - }; - 0C12EBF12616383B00B66C86 /* backends */ = { - isa = PBXGroup; - children = ( - 0C12EBF22616383B00B66C86 /* backend_interface.h */, - 0C12EBF32616383B00B66C86 /* backend.h */, - 0C12EBF42616383B00B66C86 /* backend_resolver.h */, - 0C12EBF52616383B00B66C86 /* backend_detail.h */, - 0C12EBF62616383B00B66C86 /* backend_init.h */, - ); - path = backends; - sourceTree = ""; - }; - 0C12EBF72616383B00B66C86 /* runtime */ = { - isa = PBXGroup; - children = ( - 0C12EBF82616383B00B66C86 /* slice_indices_adjust.h */, - 0C12EBF92616383B00B66C86 /* operator.h */, - 0C12EBFA2616383B00B66C86 /* interpreter.h */, - 0C12EBFB2616383B00B66C86 /* register_ops_utils.h */, - 0C12EBFC2616383B00B66C86 /* jit_exception.h */, - 0C12EBFD2616383B00B66C86 /* exception_message.h */, - 0C12EBFE2616383B00B66C86 /* argument_spec.h */, - 0C12EBFF2616383B00B66C86 /* logging.h */, - 0C12EC002616383B00B66C86 /* profiling_graph_executor_impl.h */, - 0C12EC012616383B00B66C86 /* custom_operator.h */, - 0C12EC022616383B00B66C86 /* static */, - 0C12EC082616383B00B66C86 /* vararg_functions.h */, - 0C12EC092616383B00B66C86 /* symbolic_script.h */, - 0C12EC0A2616383B00B66C86 /* variable_tensor_list.h */, - 0C12EC0B2616383B00B66C86 /* autodiff.h */, - 0C12EC0C2616383B00B66C86 /* print_handler.h */, - 0C12EC0D2616383B00B66C86 /* profiling_record.h */, - 0C12EC0E2616383B00B66C86 /* graph_executor.h */, - 0C12EC0F2616383B00B66C86 /* operator_options.h */, - 0C12EC102616383B00B66C86 /* instruction.h */, - 0C12EC112616383B00B66C86 /* graph_executor_impl.h */, - ); - path = runtime; - sourceTree = ""; - }; - 0C12EC022616383B00B66C86 /* static */ = { - isa = PBXGroup; - children = ( - 0C12EC032616383B00B66C86 /* fusion.h */, - 0C12EC042616383B00B66C86 /* passes.h */, - 0C12EC052616383B00B66C86 /* ops.h */, - 0C12EC062616383B00B66C86 /* impl.h */, - 0C12EC072616383B00B66C86 /* init.h */, - ); - path = static; - sourceTree = ""; - }; - 0C12EC122616383B00B66C86 /* passes */ = { - isa = PBXGroup; - children = ( - 0C12EC132616383B00B66C86 /* remove_expands.h */, - 0C12EC142616383B00B66C86 /* peephole_list_idioms.h */, - 0C12EC152616383B00B66C86 /* subgraph_rewrite.h */, - 0C12EC162616383B00B66C86 /* fuse_relu.h */, - 0C12EC172616383B00B66C86 /* guard_elimination.h */, - 0C12EC182616383B00B66C86 /* peephole_alias_sensitive.h */, - 0C12EC192616383B00B66C86 /* freeze_module.h */, - 0C12EC1A2616383B00B66C86 /* clear_undefinedness.h */, - 0C12EC1B2616383B00B66C86 /* peephole.h */, - 0C12EC1C2616383B00B66C86 /* remove_dropout.h */, - 0C12EC1D2616383B00B66C86 /* update_differentiable_graph_requires_grad.h */, - 0C12EC1E2616383B00B66C86 /* metal_rewrite.h */, - 0C12EC1F2616383B00B66C86 /* liveness.h */, - 0C12EC202616383B00B66C86 /* onnx */, - 0C12EC362616383B00B66C86 /* remove_mutation.h */, - 0C12EC372616383B00B66C86 /* common_subexpression_elimination.h */, - 0C12EC382616383B00B66C86 /* batch_mm.h */, - 0C12EC392616383B00B66C86 /* constant_pooling.h */, - 0C12EC3A2616383B00B66C86 /* canonicalize_graph_fuser_ops.h */, - 0C12EC3B2616383B00B66C86 /* fuse_linear.h */, - 0C12EC3C2616383B00B66C86 /* annotate_warns.h */, - 0C12EC3D2616383B00B66C86 /* specialize_autogradzero.h */, - 0C12EC3E2616383B00B66C86 /* prepack_folding.h */, - 0C12EC3F2616383B00B66C86 /* frozen_conv_folding.h */, - 0C12EC402616383B00B66C86 /* constant_propagation.h */, - 0C12EC412616383B00B66C86 /* insert_guards.h */, - 0C12EC422616383B00B66C86 /* utils */, - 0C12EC462616383B00B66C86 /* inliner.h */, - 0C12EC472616383B00B66C86 /* lower_grad_of.h */, - 0C12EC482616383B00B66C86 /* quantization */, - 0C12EC512616383B00B66C86 /* normalize_ops.h */, - 0C12EC522616383B00B66C86 /* vulkan_rewrite.h */, - 0C12EC532616383B00B66C86 /* erase_number_types.h */, - 0C12EC542616383B00B66C86 /* graph_rewrite_helper.h */, - 0C12EC552616383B00B66C86 /* graph_fuser.h */, - 0C12EC562616383B00B66C86 /* fold_conv_bn.h */, - 0C12EC572616383B00B66C86 /* remove_redundant_profiles.h */, - 0C12EC582616383B00B66C86 /* inline_forked_closures.h */, - 0C12EC592616383B00B66C86 /* tensorexpr_fuser.h */, - 0C12EC5A2616383B00B66C86 /* decompose_ops.h */, - 0C12EC5B2616383B00B66C86 /* remove_inplace_ops.h */, - 0C12EC5C2616383B00B66C86 /* inline_fork_wait.h */, - 0C12EC5D2616383B00B66C86 /* create_autodiff_subgraphs.h */, - 0C12EC5E2616383B00B66C86 /* requires_grad_analysis.h */, - 0C12EC5F2616383B00B66C86 /* dead_code_elimination.h */, - 0C12EC602616383B00B66C86 /* clear_profiling.h */, - 0C12EC612616383B00B66C86 /* create_functional_graphs.h */, - 0C12EC622616383B00B66C86 /* bailout_graph.h */, - 0C12EC632616383B00B66C86 /* lower_tuples.h */, - 0C12EC642616383B00B66C86 /* frozen_graph_optimizations.h */, - 0C12EC652616383B00B66C86 /* frozen_ops_to_mkldnn.h */, - 0C12EC662616383B00B66C86 /* canonicalize.h */, - 0C12EC672616383B00B66C86 /* hoist_conv_packed_params.h */, - 0C12EC682616383B00B66C86 /* loop_unrolling.h */, - 0C12EC692616383B00B66C86 /* shape_analysis.h */, - 0C12EC6A2616383B00B66C86 /* fixup_trace_scope_blocks.h */, - 0C12EC6B2616383B00B66C86 /* remove_exceptions.h */, - 0C12EC6C2616383B00B66C86 /* inline_autodiff_subgraphs.h */, - 0C12EC6D2616383B00B66C86 /* inplace_check.h */, - 0C12EC6E2616383B00B66C86 /* cuda_graph_fuser.h */, - 0C12EC6F2616383B00B66C86 /* pass_manager.h */, - 0C12EC702616383B00B66C86 /* onnx.h */, - 0C12EC712616383B00B66C86 /* xnnpack_rewrite.h */, - 0C12EC722616383B00B66C86 /* lift_closures.h */, - 0C12EC732616383B00B66C86 /* frozen_conv_add_relu_fusion.h */, - 0C12EC742616383B00B66C86 /* lower_graph.h */, - ); - path = passes; - sourceTree = ""; - }; - 0C12EC202616383B00B66C86 /* onnx */ = { - isa = PBXGroup; - children = ( - 0C12EC212616383B00B66C86 /* eval_peephole.h */, - 0C12EC222616383B00B66C86 /* function_substitution.h */, - 0C12EC232616383B00B66C86 /* helper.h */, - 0C12EC242616383B00B66C86 /* unpack_quantized_weights.h */, - 0C12EC252616383B00B66C86 /* preprocess_for_onnx.h */, - 0C12EC262616383B00B66C86 /* scalar_type_analysis.h */, - 0C12EC272616383B00B66C86 /* shape_type_inference.h */, - 0C12EC282616383B00B66C86 /* peephole.h */, - 0C12EC292616383B00B66C86 /* eliminate_unused_items.h */, - 0C12EC2A2616383B00B66C86 /* constant_fold.h */, - 0C12EC2B2616383B00B66C86 /* constant_map.h */, - 0C12EC2C2616383B00B66C86 /* fixup_onnx_controlflow.h */, - 0C12EC2D2616383B00B66C86 /* cast_all_constant_to_floating.h */, - 0C12EC2E2616383B00B66C86 /* fold_if_node.h */, - 0C12EC2F2616383B00B66C86 /* list_model_parameters.h */, - 0C12EC302616383B00B66C86 /* pattern_conversion */, - 0C12EC342616383B00B66C86 /* remove_inplace_ops_for_onnx.h */, - 0C12EC352616383B00B66C86 /* prepare_division_for_onnx.h */, - ); - path = onnx; - sourceTree = ""; - }; - 0C12EC302616383B00B66C86 /* pattern_conversion */ = { - isa = PBXGroup; - children = ( - 0C12EC312616383B00B66C86 /* common.h */, - 0C12EC322616383B00B66C86 /* pattern_conversion.h */, - 0C12EC332616383B00B66C86 /* pattern_encapsulation.h */, - ); - path = pattern_conversion; - sourceTree = ""; - }; - 0C12EC422616383B00B66C86 /* utils */ = { - isa = PBXGroup; - children = ( - 0C12EC432616383B00B66C86 /* memory_dag.h */, - 0C12EC442616383B00B66C86 /* subgraph_utils.h */, - 0C12EC452616383B00B66C86 /* check_alias_annotation.h */, - ); - path = utils; - sourceTree = ""; - }; - 0C12EC482616383B00B66C86 /* quantization */ = { - isa = PBXGroup; - children = ( - 0C12EC492616383B00B66C86 /* helper.h */, - 0C12EC4A2616383B00B66C86 /* quantization_type.h */, - 0C12EC4B2616383B00B66C86 /* insert_observers.h */, - 0C12EC4C2616383B00B66C86 /* dedup_module_uses.h */, - 0C12EC4D2616383B00B66C86 /* quantization_patterns.h */, - 0C12EC4E2616383B00B66C86 /* finalize.h */, - 0C12EC4F2616383B00B66C86 /* insert_quant_dequant.h */, - 0C12EC502616383B00B66C86 /* fusion_passes.h */, - ); - path = quantization; - sourceTree = ""; - }; - 0C12EC752616383B00B66C86 /* docs */ = { - isa = PBXGroup; - children = ( - ); - path = docs; - sourceTree = ""; - }; - 0C12EC762616383B00B66C86 /* codegen */ = { - isa = PBXGroup; - children = ( - 0C12EC772616383B00B66C86 /* cuda */, - 0C12ECAE2616383B00B66C86 /* fuser */, - ); - path = codegen; - sourceTree = ""; - }; - 0C12EC772616383B00B66C86 /* cuda */ = { - isa = PBXGroup; - children = ( - 0C12EC782616383B00B66C86 /* type.h */, - 0C12EC792616383B00B66C86 /* executor_kernel_arg.h */, - 0C12EC7A2616383B00B66C86 /* utils.h */, - 0C12EC7B2616383B00B66C86 /* kernel_ir_printer.h */, - 0C12EC7C2616383B00B66C86 /* tools */, - 0C12EC7D2616383B00B66C86 /* index_compute.h */, - 0C12EC7E2616383B00B66C86 /* transform_replay.h */, - 0C12EC7F2616383B00B66C86 /* parser.h */, - 0C12EC802616383B00B66C86 /* executor_utils.h */, - 0C12EC812616383B00B66C86 /* manager.h */, - 0C12EC822616383B00B66C86 /* scheduler.h */, - 0C12EC832616383B00B66C86 /* lower_unroll.h */, - 0C12EC842616383B00B66C86 /* runtime */, - 0C12EC852616383B00B66C86 /* ir_printer.h */, - 0C12EC862616383B00B66C86 /* lower_insert_syncs.h */, - 0C12EC872616383B00B66C86 /* lower2device.h */, - 0C12EC882616383B00B66C86 /* predicate_compute.h */, - 0C12EC892616383B00B66C86 /* compute_at.h */, - 0C12EC8A2616383B00B66C86 /* ir_all_nodes.h */, - 0C12EC8B2616383B00B66C86 /* mutator.h */, - 0C12EC8C2616383B00B66C86 /* docs */, - 0C12EC8F2616383B00B66C86 /* fusion.h */, - 0C12EC902616383B00B66C86 /* lower_loops.h */, - 0C12EC912616383B00B66C86 /* interface.h */, - 0C12EC922616383B00B66C86 /* arith.h */, - 0C12EC932616383B00B66C86 /* kernel_cache.h */, - 0C12EC942616383B00B66C86 /* codegen.h */, - 0C12EC952616383B00B66C86 /* ir_utils.h */, - 0C12EC962616383B00B66C86 /* lower_utils.h */, - 0C12EC972616383B00B66C86 /* lower_index.h */, - 0C12EC982616383B00B66C86 /* transform_rfactor.h */, - 0C12EC992616383B00B66C86 /* transform_iter.h */, - 0C12EC9A2616383B00B66C86 /* lower_alias_memory.h */, - 0C12EC9B2616383B00B66C86 /* executor.h */, - 0C12EC9C2616383B00B66C86 /* ir_graphviz.h */, - 0C12EC9D2616383B00B66C86 /* ir_iostream.h */, - 0C12EC9E2616383B00B66C86 /* partition.h */, - 0C12EC9F2616383B00B66C86 /* shape_inference.h */, - 0C12ECA02616383B00B66C86 /* kernel_ir_builder.h */, - 0C12ECA12616383B00B66C86 /* instrumentation.h */, - 0C12ECA22616383B00B66C86 /* kernel.h */, - 0C12ECA32616383B00B66C86 /* dispatch.h */, - 0C12ECA42616383B00B66C86 /* lower_validation.h */, - 0C12ECA52616383B00B66C86 /* ir_internal_nodes.h */, - 0C12ECA62616383B00B66C86 /* lower_thread_predicate.h */, - 0C12ECA72616383B00B66C86 /* ir_interface_nodes.h */, - 0C12ECA82616383B00B66C86 /* ir_cloner.h */, - 0C12ECA92616383B00B66C86 /* ir_base_nodes.h */, - 0C12ECAA2616383B00B66C86 /* executor_launch_params.h */, - 0C12ECAB2616383B00B66C86 /* kernel_ir.h */, - 0C12ECAC2616383B00B66C86 /* iter_visitor.h */, - 0C12ECAD2616383B00B66C86 /* expr_evaluator.h */, - ); - path = cuda; - sourceTree = ""; - }; - 0C12EC7C2616383B00B66C86 /* tools */ = { - isa = PBXGroup; - children = ( - ); - path = tools; - sourceTree = ""; - }; - 0C12EC842616383B00B66C86 /* runtime */ = { - isa = PBXGroup; - children = ( - ); - path = runtime; - sourceTree = ""; - }; - 0C12EC8C2616383B00B66C86 /* docs */ = { - isa = PBXGroup; - children = ( - 0C12EC8D2616383B00B66C86 /* documentation.h */, - 0C12EC8E2616383B00B66C86 /* images */, - ); - path = docs; - sourceTree = ""; - }; - 0C12EC8E2616383B00B66C86 /* images */ = { - isa = PBXGroup; - children = ( - ); - path = images; - sourceTree = ""; - }; - 0C12ECAE2616383B00B66C86 /* fuser */ = { - isa = PBXGroup; - children = ( - 0C12ECAF2616383B00B66C86 /* tensor_info.h */, - 0C12ECB02616383B00B66C86 /* arg_spec.h */, - 0C12ECB12616383B00B66C86 /* compiler.h */, - 0C12ECB22616383B00B66C86 /* fallback.h */, - 0C12ECB32616383B00B66C86 /* cpu */, - 0C12ECB72616383B00B66C86 /* cuda */, - 0C12ECBA2616383B00B66C86 /* partition_desc.h */, - 0C12ECBB2616383B00B66C86 /* fused_kernel.h */, - 0C12ECBC2616383B00B66C86 /* kernel_spec.h */, - 0C12ECBD2616383B00B66C86 /* interface.h */, - 0C12ECBE2616383B00B66C86 /* kernel_cache.h */, - 0C12ECBF2616383B00B66C86 /* codegen.h */, - 0C12ECC02616383B00B66C86 /* executor.h */, - 0C12ECC12616383B00B66C86 /* tensor_desc.h */, - ); - path = fuser; - sourceTree = ""; - }; - 0C12ECB32616383B00B66C86 /* cpu */ = { - isa = PBXGroup; - children = ( - 0C12ECB42616383B00B66C86 /* temp_file.h */, - 0C12ECB52616383B00B66C86 /* fused_kernel.h */, - 0C12ECB62616383B00B66C86 /* resource_strings.h */, - ); - path = cpu; - sourceTree = ""; - }; - 0C12ECB72616383B00B66C86 /* cuda */ = { - isa = PBXGroup; - children = ( - 0C12ECB82616383B00B66C86 /* fused_kernel.h */, - 0C12ECB92616383B00B66C86 /* resource_strings.h */, - ); - path = cuda; - sourceTree = ""; - }; - 0C12ECC22616383B00B66C86 /* testing */ = { - isa = PBXGroup; - children = ( - 0C12ECC32616383B00B66C86 /* file_check.h */, - 0C12ECC42616383B00B66C86 /* hooks_for_testing.h */, - ); - path = testing; - sourceTree = ""; - }; - 0C12ECC62616383B00B66C86 /* mobile */ = { - isa = PBXGroup; - children = ( - 0C12ECC72616383B00B66C86 /* observer.h */, - 0C12ECC82616383B00B66C86 /* sequential.h */, - 0C12ECC92616383B00B66C86 /* interpreter.h */, - 0C12ECCA2616383B00B66C86 /* export_data.h */, - 0C12ECCB2616383B00B66C86 /* method.h */, - 0C12ECCC2616383B00B66C86 /* optim */, - 0C12ECCE2616383B00B66C86 /* import_data.h */, - 0C12ECCF2616383B00B66C86 /* type_parser.h */, - 0C12ECD02616383B00B66C86 /* import.h */, - 0C12ECD12616383B00B66C86 /* module.h */, - 0C12ECD22616383B00B66C86 /* function.h */, - ); - path = mobile; - sourceTree = ""; - }; - 0C12ECCC2616383B00B66C86 /* optim */ = { - isa = PBXGroup; - children = ( - 0C12ECCD2616383B00B66C86 /* sgd.h */, - ); - path = optim; - sourceTree = ""; - }; - 0C12ECD42616383B00B66C86 /* api */ = { - isa = PBXGroup; - children = ( - 0C12ECD52616383B00B66C86 /* function_impl.h */, - 0C12ECD62616383B00B66C86 /* method.h */, - 0C12ECD72616383B00B66C86 /* compilation_unit.h */, - 0C12ECD82616383B00B66C86 /* object.h */, - 0C12ECD92616383B00B66C86 /* module.h */, - ); - path = api; - sourceTree = ""; - }; - 0C12ECDB2616383B00B66C86 /* api */ = { - isa = PBXGroup; - children = ( - 0C12ECDC2616383B00B66C86 /* include */, - 0C12ED892616383C00B66C86 /* src */, - ); - path = api; - sourceTree = ""; - }; - 0C12ECDC2616383B00B66C86 /* include */ = { - isa = PBXGroup; - children = ( - 0C12ECDD2616383B00B66C86 /* torch */, - ); - path = include; - sourceTree = ""; - }; - 0C12ECDD2616383B00B66C86 /* torch */ = { - isa = PBXGroup; - children = ( - 0C12ECDE2616383B00B66C86 /* fft.h */, - 0C12ECDF2616383B00B66C86 /* utils.h */, - 0C12ECE02616383B00B66C86 /* version.h */, - 0C12ECE12616383B00B66C86 /* nn */, - 0C12ED3B2616383C00B66C86 /* python */, - 0C12ED3D2616383C00B66C86 /* enum.h */, - 0C12ED3E2616383C00B66C86 /* types.h */, - 0C12ED3F2616383C00B66C86 /* all.h */, - 0C12ED402616383C00B66C86 /* data.h */, - 0C12ED412616383C00B66C86 /* arg.h */, - 0C12ED422616383C00B66C86 /* optim */, - 0C12ED4E2616383C00B66C86 /* serialize */, - 0C12ED532616383C00B66C86 /* torch.h */, - 0C12ED542616383C00B66C86 /* optim.h */, - 0C12ED552616383C00B66C86 /* jit.h */, - 0C12ED562616383C00B66C86 /* detail */, - 0C12ED592616383C00B66C86 /* nn.h */, - 0C12ED5A2616383C00B66C86 /* ordered_dict.h */, - 0C12ED5B2616383C00B66C86 /* cuda.h */, - 0C12ED5C2616383C00B66C86 /* autograd.h */, - 0C12ED5D2616383C00B66C86 /* linalg.h */, - 0C12ED5E2616383C00B66C86 /* special.h */, - 0C12ED5F2616383C00B66C86 /* python.h */, - 0C12ED602616383C00B66C86 /* serialize.h */, - 0C12ED612616383C00B66C86 /* data */, - 0C12ED882616383C00B66C86 /* expanding_array.h */, - ); - path = torch; - sourceTree = ""; - }; - 0C12ECE12616383B00B66C86 /* nn */ = { - isa = PBXGroup; - children = ( - 0C12ECE22616383B00B66C86 /* options */, - 0C12ECF82616383C00B66C86 /* utils.h */, - 0C12ECF92616383C00B66C86 /* parallel */, - 0C12ECFB2616383C00B66C86 /* pimpl-inl.h */, - 0C12ECFC2616383C00B66C86 /* utils */, - 0C12ED002616383C00B66C86 /* options.h */, - 0C12ED012616383C00B66C86 /* functional.h */, - 0C12ED022616383C00B66C86 /* modules.h */, - 0C12ED032616383C00B66C86 /* pimpl.h */, - 0C12ED042616383C00B66C86 /* module.h */, - 0C12ED052616383C00B66C86 /* modules */, - 0C12ED282616383C00B66C86 /* init.h */, - 0C12ED292616383C00B66C86 /* cloneable.h */, - 0C12ED2A2616383C00B66C86 /* functional */, - ); - path = nn; - sourceTree = ""; - }; - 0C12ECE22616383B00B66C86 /* options */ = { - isa = PBXGroup; - children = ( - 0C12ECE32616383B00B66C86 /* normalization.h */, - 0C12ECE42616383B00B66C86 /* rnn.h */, - 0C12ECE52616383B00B66C86 /* distance.h */, - 0C12ECE62616383B00B66C86 /* batchnorm.h */, - 0C12ECE72616383B00B66C86 /* linear.h */, - 0C12ECE82616383B00B66C86 /* instancenorm.h */, - 0C12ECE92616383B00B66C86 /* vision.h */, - 0C12ECEA2616383B00B66C86 /* transformercoder.h */, - 0C12ECEB2616383B00B66C86 /* dropout.h */, - 0C12ECEC2616383B00B66C86 /* upsampling.h */, - 0C12ECED2616383B00B66C86 /* embedding.h */, - 0C12ECEE2616383C00B66C86 /* fold.h */, - 0C12ECEF2616383C00B66C86 /* activation.h */, - 0C12ECF02616383C00B66C86 /* transformer.h */, - 0C12ECF12616383C00B66C86 /* pooling.h */, - 0C12ECF22616383C00B66C86 /* transformerlayer.h */, - 0C12ECF32616383C00B66C86 /* adaptive.h */, - 0C12ECF42616383C00B66C86 /* conv.h */, - 0C12ECF52616383C00B66C86 /* padding.h */, - 0C12ECF62616383C00B66C86 /* pixelshuffle.h */, - 0C12ECF72616383C00B66C86 /* loss.h */, - ); - path = options; - sourceTree = ""; - }; - 0C12ECF92616383C00B66C86 /* parallel */ = { - isa = PBXGroup; - children = ( - 0C12ECFA2616383C00B66C86 /* data_parallel.h */, - ); - path = parallel; - sourceTree = ""; - }; - 0C12ECFC2616383C00B66C86 /* utils */ = { - isa = PBXGroup; - children = ( - 0C12ECFD2616383C00B66C86 /* rnn.h */, - 0C12ECFE2616383C00B66C86 /* clip_grad.h */, - 0C12ECFF2616383C00B66C86 /* convert_parameters.h */, - ); - path = utils; - sourceTree = ""; - }; - 0C12ED052616383C00B66C86 /* modules */ = { - isa = PBXGroup; - children = ( - 0C12ED062616383C00B66C86 /* normalization.h */, - 0C12ED072616383C00B66C86 /* utils.h */, - 0C12ED082616383C00B66C86 /* rnn.h */, - 0C12ED092616383C00B66C86 /* distance.h */, - 0C12ED0A2616383C00B66C86 /* batchnorm.h */, - 0C12ED0B2616383C00B66C86 /* linear.h */, - 0C12ED0C2616383C00B66C86 /* instancenorm.h */, - 0C12ED0D2616383C00B66C86 /* transformercoder.h */, - 0C12ED0E2616383C00B66C86 /* _functions.h */, - 0C12ED0F2616383C00B66C86 /* container */, - 0C12ED1A2616383C00B66C86 /* dropout.h */, - 0C12ED1B2616383C00B66C86 /* common.h */, - 0C12ED1C2616383C00B66C86 /* upsampling.h */, - 0C12ED1D2616383C00B66C86 /* embedding.h */, - 0C12ED1E2616383C00B66C86 /* fold.h */, - 0C12ED1F2616383C00B66C86 /* activation.h */, - 0C12ED202616383C00B66C86 /* transformer.h */, - 0C12ED212616383C00B66C86 /* pooling.h */, - 0C12ED222616383C00B66C86 /* transformerlayer.h */, - 0C12ED232616383C00B66C86 /* adaptive.h */, - 0C12ED242616383C00B66C86 /* conv.h */, - 0C12ED252616383C00B66C86 /* padding.h */, - 0C12ED262616383C00B66C86 /* pixelshuffle.h */, - 0C12ED272616383C00B66C86 /* loss.h */, - ); - path = modules; - sourceTree = ""; - }; - 0C12ED0F2616383C00B66C86 /* container */ = { - isa = PBXGroup; - children = ( - 0C12ED102616383C00B66C86 /* named_any.h */, - 0C12ED112616383C00B66C86 /* any_value.h */, - 0C12ED122616383C00B66C86 /* modulelist.h */, - 0C12ED132616383C00B66C86 /* moduledict.h */, - 0C12ED142616383C00B66C86 /* sequential.h */, - 0C12ED152616383C00B66C86 /* functional.h */, - 0C12ED162616383C00B66C86 /* parameterlist.h */, - 0C12ED172616383C00B66C86 /* parameterdict.h */, - 0C12ED182616383C00B66C86 /* any.h */, - 0C12ED192616383C00B66C86 /* any_module_holder.h */, - ); - path = container; - sourceTree = ""; - }; - 0C12ED2A2616383C00B66C86 /* functional */ = { - isa = PBXGroup; - children = ( - 0C12ED2B2616383C00B66C86 /* normalization.h */, - 0C12ED2C2616383C00B66C86 /* distance.h */, - 0C12ED2D2616383C00B66C86 /* batchnorm.h */, - 0C12ED2E2616383C00B66C86 /* linear.h */, - 0C12ED2F2616383C00B66C86 /* instancenorm.h */, - 0C12ED302616383C00B66C86 /* vision.h */, - 0C12ED312616383C00B66C86 /* dropout.h */, - 0C12ED322616383C00B66C86 /* upsampling.h */, - 0C12ED332616383C00B66C86 /* embedding.h */, - 0C12ED342616383C00B66C86 /* fold.h */, - 0C12ED352616383C00B66C86 /* activation.h */, - 0C12ED362616383C00B66C86 /* pooling.h */, - 0C12ED372616383C00B66C86 /* conv.h */, - 0C12ED382616383C00B66C86 /* padding.h */, - 0C12ED392616383C00B66C86 /* pixelshuffle.h */, - 0C12ED3A2616383C00B66C86 /* loss.h */, - ); - path = functional; - sourceTree = ""; - }; - 0C12ED3B2616383C00B66C86 /* python */ = { - isa = PBXGroup; - children = ( - 0C12ED3C2616383C00B66C86 /* init.h */, - ); - path = python; - sourceTree = ""; - }; - 0C12ED422616383C00B66C86 /* optim */ = { - isa = PBXGroup; - children = ( - 0C12ED432616383C00B66C86 /* rmsprop.h */, - 0C12ED442616383C00B66C86 /* lbfgs.h */, - 0C12ED452616383C00B66C86 /* optimizer.h */, - 0C12ED462616383C00B66C86 /* adagrad.h */, - 0C12ED472616383C00B66C86 /* sgd.h */, - 0C12ED482616383C00B66C86 /* serialize.h */, - 0C12ED492616383C00B66C86 /* adamw.h */, - 0C12ED4A2616383C00B66C86 /* schedulers */, - 0C12ED4D2616383C00B66C86 /* adam.h */, - ); - path = optim; - sourceTree = ""; - }; - 0C12ED4A2616383C00B66C86 /* schedulers */ = { - isa = PBXGroup; - children = ( - 0C12ED4B2616383C00B66C86 /* lr_scheduler.h */, - 0C12ED4C2616383C00B66C86 /* step_lr.h */, - ); - path = schedulers; - sourceTree = ""; - }; - 0C12ED4E2616383C00B66C86 /* serialize */ = { - isa = PBXGroup; - children = ( - 0C12ED4F2616383C00B66C86 /* archive.h */, - 0C12ED502616383C00B66C86 /* input-archive.h */, - 0C12ED512616383C00B66C86 /* output-archive.h */, - 0C12ED522616383C00B66C86 /* tensor.h */, - ); - path = serialize; - sourceTree = ""; - }; - 0C12ED562616383C00B66C86 /* detail */ = { - isa = PBXGroup; - children = ( - 0C12ED572616383C00B66C86 /* static.h */, - 0C12ED582616383C00B66C86 /* TensorDataContainer.h */, - ); - path = detail; - sourceTree = ""; - }; - 0C12ED612616383C00B66C86 /* data */ = { - isa = PBXGroup; - children = ( - 0C12ED622616383C00B66C86 /* example.h */, - 0C12ED632616383C00B66C86 /* dataloader_options.h */, - 0C12ED642616383C00B66C86 /* datasets */, - 0C12ED6C2616383C00B66C86 /* worker_exception.h */, - 0C12ED6D2616383C00B66C86 /* dataloader.h */, - 0C12ED6E2616383C00B66C86 /* detail */, - 0C12ED722616383C00B66C86 /* samplers.h */, - 0C12ED732616383C00B66C86 /* transforms */, - 0C12ED792616383C00B66C86 /* samplers */, - 0C12ED812616383C00B66C86 /* datasets.h */, - 0C12ED822616383C00B66C86 /* transforms.h */, - 0C12ED832616383C00B66C86 /* iterator.h */, - 0C12ED842616383C00B66C86 /* dataloader */, - ); - path = data; - sourceTree = ""; - }; - 0C12ED642616383C00B66C86 /* datasets */ = { - isa = PBXGroup; - children = ( - 0C12ED652616383C00B66C86 /* mnist.h */, - 0C12ED662616383C00B66C86 /* shared.h */, - 0C12ED672616383C00B66C86 /* map.h */, - 0C12ED682616383C00B66C86 /* chunk.h */, - 0C12ED692616383C00B66C86 /* stateful.h */, - 0C12ED6A2616383C00B66C86 /* tensor.h */, - 0C12ED6B2616383C00B66C86 /* base.h */, - ); - path = datasets; - sourceTree = ""; - }; - 0C12ED6E2616383C00B66C86 /* detail */ = { - isa = PBXGroup; - children = ( - 0C12ED6F2616383C00B66C86 /* data_shuttle.h */, - 0C12ED702616383C00B66C86 /* sequencers.h */, - 0C12ED712616383C00B66C86 /* queue.h */, - ); - path = detail; - sourceTree = ""; - }; - 0C12ED732616383C00B66C86 /* transforms */ = { - isa = PBXGroup; - children = ( - 0C12ED742616383C00B66C86 /* lambda.h */, - 0C12ED752616383C00B66C86 /* stack.h */, - 0C12ED762616383C00B66C86 /* collate.h */, - 0C12ED772616383C00B66C86 /* tensor.h */, - 0C12ED782616383C00B66C86 /* base.h */, - ); - path = transforms; - sourceTree = ""; - }; - 0C12ED792616383C00B66C86 /* samplers */ = { - isa = PBXGroup; - children = ( - 0C12ED7A2616383C00B66C86 /* sequential.h */, - 0C12ED7B2616383C00B66C86 /* custom_batch_request.h */, - 0C12ED7C2616383C00B66C86 /* stream.h */, - 0C12ED7D2616383C00B66C86 /* distributed.h */, - 0C12ED7E2616383C00B66C86 /* serialize.h */, - 0C12ED7F2616383C00B66C86 /* random.h */, - 0C12ED802616383C00B66C86 /* base.h */, - ); - path = samplers; - sourceTree = ""; - }; - 0C12ED842616383C00B66C86 /* dataloader */ = { - isa = PBXGroup; - children = ( - 0C12ED852616383C00B66C86 /* stateless.h */, - 0C12ED862616383C00B66C86 /* stateful.h */, - 0C12ED872616383C00B66C86 /* base.h */, - ); - path = dataloader; - sourceTree = ""; - }; - 0C12ED892616383C00B66C86 /* src */ = { - isa = PBXGroup; - children = ( - 0C12ED8A2616383C00B66C86 /* nn */, - 0C12ED8E2616383C00B66C86 /* python */, - 0C12ED8F2616383C00B66C86 /* optim */, - 0C12ED912616383C00B66C86 /* serialize */, - 0C12ED922616383C00B66C86 /* data */, - ); - path = src; - sourceTree = ""; - }; - 0C12ED8A2616383C00B66C86 /* nn */ = { - isa = PBXGroup; - children = ( - 0C12ED8B2616383C00B66C86 /* options */, - 0C12ED8C2616383C00B66C86 /* modules */, - ); - path = nn; - sourceTree = ""; - }; - 0C12ED8B2616383C00B66C86 /* options */ = { - isa = PBXGroup; - children = ( - ); - path = options; - sourceTree = ""; - }; - 0C12ED8C2616383C00B66C86 /* modules */ = { - isa = PBXGroup; - children = ( - 0C12ED8D2616383C00B66C86 /* container */, - ); - path = modules; - sourceTree = ""; - }; - 0C12ED8D2616383C00B66C86 /* container */ = { - isa = PBXGroup; - children = ( - ); - path = container; - sourceTree = ""; - }; - 0C12ED8E2616383C00B66C86 /* python */ = { - isa = PBXGroup; - children = ( - ); - path = python; - sourceTree = ""; - }; - 0C12ED8F2616383C00B66C86 /* optim */ = { - isa = PBXGroup; - children = ( - 0C12ED902616383C00B66C86 /* schedulers */, - ); - path = optim; - sourceTree = ""; - }; - 0C12ED902616383C00B66C86 /* schedulers */ = { - isa = PBXGroup; - children = ( - ); - path = schedulers; - sourceTree = ""; - }; - 0C12ED912616383C00B66C86 /* serialize */ = { - isa = PBXGroup; - children = ( - ); - path = serialize; - sourceTree = ""; - }; - 0C12ED922616383C00B66C86 /* data */ = { - isa = PBXGroup; - children = ( - 0C12ED932616383C00B66C86 /* datasets */, - 0C12ED942616383C00B66C86 /* samplers */, - ); - path = data; - sourceTree = ""; - }; - 0C12ED932616383C00B66C86 /* datasets */ = { - isa = PBXGroup; - children = ( - ); - path = datasets; - sourceTree = ""; - }; - 0C12ED942616383C00B66C86 /* samplers */ = { - isa = PBXGroup; - children = ( - ); - path = samplers; - sourceTree = ""; - }; - 0C12ED962616383C00B66C86 /* generic */ = { - isa = PBXGroup; - children = ( - 0C12ED972616383C00B66C86 /* utils.h */, - 0C12ED982616383C00B66C86 /* serialization.h */, - 0C12ED992616383C00B66C86 /* Storage.h */, - ); - path = generic; - sourceTree = ""; - }; - 0C12ED9A2616383C00B66C86 /* tensor */ = { - isa = PBXGroup; - children = ( - 0C12ED9B2616383C00B66C86 /* python_tensor.h */, - ); - path = tensor; - sourceTree = ""; - }; - 0C12EDAF2616383C00B66C86 /* ATen */ = { - isa = PBXGroup; - children = ( - 0C12EDB02616383C00B66C86 /* Formatting.h */, - 0C12EDB12616383C00B66C86 /* CPUFunctions.h */, - 0C12EDB22616383C00B66C86 /* MetaFunctions.h */, - 0C12EDB32616383C00B66C86 /* Utils.h */, - 0C12EDB42616383C00B66C86 /* CUDAGeneratorImpl.h */, - 0C12EDB52616383C00B66C86 /* TensorOptions.h */, - 0C12EDB62616383C00B66C86 /* TensorUtils.h */, - 0C12EDB72616383C00B66C86 /* MemoryOverlap.h */, - 0C12EDB82616383C00B66C86 /* InitialTensorOptions.h */, - 0C12EDB92616383C00B66C86 /* Version.h */, - 0C12EDBA2616383C00B66C86 /* DLConvertor.h */, - 0C12EDBB2616383C00B66C86 /* Device.h */, - 0C12EDBC2616383C00B66C86 /* core */, - 0C12EE0A2616383C00B66C86 /* VmapMode.h */, - 0C12EE0B2616383C00B66C86 /* BatchedFallback.h */, - 0C12EE0C2616383C00B66C86 /* dlpack.h */, - 0C12EE0D2616383C00B66C86 /* Config.h */, - 0C12EE0E2616383C00B66C86 /* SparseTensorUtils.h */, - 0C12EE0F2616383C00B66C86 /* Backtrace.h */, - 0C12EE102616383C00B66C86 /* cpu */, - 0C12EE222616383C00B66C86 /* TracerMode.h */, - 0C12EE232616383C00B66C86 /* Backend.h */, - 0C12EE242616383C00B66C86 /* RegistrationDeclarations.h */, - 0C12EE252616383C00B66C86 /* CompositeImplicitAutogradFunctions.h */, - 0C12EE262616383C00B66C86 /* PTThreadPool.h */, - 0C12EE272616383C00B66C86 /* OpaqueTensorImpl.h */, - 0C12EE282616383C00B66C86 /* LegacyTHFunctionsCPU.h */, - 0C12EE292616383C00B66C86 /* quantized */, - 0C12EE2C2616383C00B66C86 /* record_function.h */, - 0C12EE2D2616383C00B66C86 /* WrapDimUtils.h */, - 0C12EE2E2616383C00B66C86 /* RedispatchFunctions.h */, - 0C12EE2F2616383C00B66C86 /* Context.h */, - 0C12EE302616383C00B66C86 /* div_rtn.h */, - 0C12EE312616383C00B66C86 /* ExpandUtils.h */, - 0C12EE322616383C00B66C86 /* TypeDefault.h */, - 0C12EE332616383C00B66C86 /* CPUFixedAllocator.h */, - 0C12EE342616383C00B66C86 /* NamedTensor.h */, - 0C12EE352616383C00B66C86 /* Scalar.h */, - 0C12EE362616383C00B66C86 /* ParallelNativeTBB.h */, - 0C12EE372616383C00B66C86 /* ArrayRef.h */, - 0C12EE382616383C00B66C86 /* SequenceNumber.h */, - 0C12EE392616383C00B66C86 /* MatrixRef.h */, - 0C12EE3A2616383C00B66C86 /* CompositeExplicitAutogradFunctions.h */, - 0C12EE3B2616383C00B66C86 /* NumericUtils.h */, - 0C12EE3C2616383C00B66C86 /* ATen.h */, - 0C12EE3D2616383C00B66C86 /* TensorNames.h */, - 0C12EE3E2616383C00B66C86 /* TensorMeta.h */, - 0C12EE3F2616383C00B66C86 /* TensorIndexing.h */, - 0C12EE402616383C00B66C86 /* Layout.h */, - 0C12EE412616383C00B66C86 /* SparseTensorImpl.h */, - 0C12EE422616383C00B66C86 /* detail */, - 0C12EE462616383C00B66C86 /* WrapDimUtilsMulti.h */, - 0C12EE472616383C00B66C86 /* TensorOperators.h */, - 0C12EE482616383C00B66C86 /* ScalarType.h */, - 0C12EE492616383C00B66C86 /* cpp_custom_type_hack.h */, - 0C12EE4A2616383C00B66C86 /* VmapTransforms.h */, - 0C12EE4B2616383C00B66C86 /* Storage.h */, - 0C12EE4C2616383C00B66C86 /* DeviceGuard.h */, - 0C12EE4D2616383C00B66C86 /* ParallelNative.h */, - 0C12EE4E2616383C00B66C86 /* Dispatch.h */, - 0C12EE4F2616383C00B66C86 /* CPUGeneratorImpl.h */, - 0C12EE502616383C00B66C86 /* Functions.h */, - 0C12EE512616383C00B66C86 /* ParallelOpenMP.h */, - 0C12EE522616383C00B66C86 /* BatchedTensorImpl.h */, - 0C12EE532616383C00B66C86 /* CPUApplyUtils.h */, - 0C12EE542616383C00B66C86 /* ThreadLocalState.h */, - 0C12EE552616383C00B66C86 /* ScalarOps.h */, - 0C12EE562616383C00B66C86 /* NativeFunctions.h */, - 0C12EE572616383C00B66C86 /* DynamicLibrary.h */, - 0C12EE582616383C00B66C86 /* TensorGeometry.h */, - 0C12EE592616383C00B66C86 /* TensorIterator.h */, - 0C12EE5A2616383C00B66C86 /* NamedTensorUtils.h */, - 0C12EE5B2616383C00B66C86 /* Dimname.h */, - 0C12EE5C2616383C00B66C86 /* autocast_mode.h */, - 0C12EE5D2616383C00B66C86 /* Parallel.h */, - 0C12EE5E2616383C00B66C86 /* DimVector.h */, - 0C12EE5F2616383C00B66C86 /* InferSize.h */, - 0C12EE602616383C00B66C86 /* SmallVector.h */, - 0C12EE612616383C00B66C86 /* Tensor.h */, - 0C12EE622616383C00B66C86 /* Generator.h */, - 0C12EE632616383C00B66C86 /* AccumulateType.h */, - 0C12EE642616383C00B66C86 /* TensorAccessor.h */, - 0C12EE652616383C00B66C86 /* LegacyTHFunctionsCUDA.h */, - ); - path = ATen; - sourceTree = ""; - }; - 0C12EDBC2616383C00B66C86 /* core */ = { - isa = PBXGroup; - children = ( - 0C12EDBD2616383C00B66C86 /* Dict_inl.h */, - 0C12EDBE2616383C00B66C86 /* Formatting.h */, - 0C12EDBF2616383C00B66C86 /* TensorBody.h */, - 0C12EDC02616383C00B66C86 /* op_registration */, - 0C12EDC52616383C00B66C86 /* jit_type_base.h */, - 0C12EDC62616383C00B66C86 /* typeid.h */, - 0C12EDC72616383C00B66C86 /* rref_interface.h */, - 0C12EDC82616383C00B66C86 /* Range.h */, - 0C12EDC92616383C00B66C86 /* interned_strings_class.h */, - 0C12EDCA2616383C00B66C86 /* operator_name.h */, - 0C12EDCB2616383C00B66C86 /* DeprecatedTypePropertiesRegistry.h */, - 0C12EDCC2616383C00B66C86 /* Backtrace.h */, - 0C12EDCD2616383C00B66C86 /* TransformationHelper.h */, - 0C12EDCE2616383C00B66C86 /* blob.h */, - 0C12EDCF2616383C00B66C86 /* function_schema.h */, - 0C12EDD02616383C00B66C86 /* dispatch */, - 0C12EDD82616383C00B66C86 /* MT19937RNGEngine.h */, - 0C12EDD92616383C00B66C86 /* ivalue_to.h */, - 0C12EDDA2616383C00B66C86 /* aten_interned_strings.h */, - 0C12EDDB2616383C00B66C86 /* LegacyTypeDispatch.h */, - 0C12EDDC2616383C00B66C86 /* function_schema_inl.h */, - 0C12EDDD2616383C00B66C86 /* qualified_name.h */, - 0C12EDDE2616383C00B66C86 /* UndefinedTensorImpl.h */, - 0C12EDDF2616383C00B66C86 /* NamedTensor.h */, - 0C12EDE02616383C00B66C86 /* Scalar.h */, - 0C12EDE12616383C00B66C86 /* functional.h */, - 0C12EDE22616383C00B66C86 /* DeprecatedTypeProperties.h */, - 0C12EDE32616383C00B66C86 /* interned_strings.h */, - 0C12EDE42616383C00B66C86 /* List.h */, - 0C12EDE52616383C00B66C86 /* ATenOpList.h */, - 0C12EDE62616383C00B66C86 /* Dict.h */, - 0C12EDE72616383C00B66C86 /* grad_mode.h */, - 0C12EDE82616383C00B66C86 /* DistributionsHelper.h */, - 0C12EDE92616383C00B66C86 /* Macros.h */, - 0C12EDEA2616383C00B66C86 /* VariableHooksInterface.h */, - 0C12EDEB2616383C00B66C86 /* ScalarType.h */, - 0C12EDEC2616383C00B66C86 /* Array.h */, - 0C12EDED2616383C00B66C86 /* stack.h */, - 0C12EDEE2616383C00B66C86 /* ATenGeneral.h */, - 0C12EDEF2616383C00B66C86 /* UnsafeFromTH.h */, - 0C12EDF02616383C00B66C86 /* QuantizerBase.h */, - 0C12EDF12616383C00B66C86 /* alias_info.h */, - 0C12EDF22616383C00B66C86 /* List_inl.h */, - 0C12EDF32616383C00B66C86 /* jit_type.h */, - 0C12EDF42616383C00B66C86 /* ivalue.h */, - 0C12EDF52616383C00B66C86 /* Dimname.h */, - 0C12EDF62616383C00B66C86 /* Vitals.h */, - 0C12EDF72616383C00B66C86 /* boxing */, - 0C12EE002616383C00B66C86 /* builtin_function.h */, - 0C12EE012616383C00B66C86 /* DimVector.h */, - 0C12EE022616383C00B66C86 /* Reduction.h */, - 0C12EE032616383C00B66C86 /* Tensor.h */, - 0C12EE042616383C00B66C86 /* function.h */, - 0C12EE052616383C00B66C86 /* Generator.h */, - 0C12EE062616383C00B66C86 /* PhiloxRNGEngine.h */, - 0C12EE072616383C00B66C86 /* TensorAccessor.h */, - 0C12EE082616383C00B66C86 /* ivalue_inl.h */, - 0C12EE092616383C00B66C86 /* Variadic.h */, - ); - path = core; - sourceTree = ""; - }; - 0C12EDC02616383C00B66C86 /* op_registration */ = { - isa = PBXGroup; - children = ( - 0C12EDC12616383C00B66C86 /* adaption.h */, - 0C12EDC22616383C00B66C86 /* op_allowlist.h */, - 0C12EDC32616383C00B66C86 /* op_registration.h */, - 0C12EDC42616383C00B66C86 /* infer_schema.h */, - ); - path = op_registration; - sourceTree = ""; - }; - 0C12EDD02616383C00B66C86 /* dispatch */ = { - isa = PBXGroup; - children = ( - 0C12EDD12616383C00B66C86 /* OperatorOptions.h */, - 0C12EDD22616383C00B66C86 /* RegistrationHandleRAII.h */, - 0C12EDD32616383C00B66C86 /* ObservedOperators.h */, - 0C12EDD42616383C00B66C86 /* DispatchKeyExtractor.h */, - 0C12EDD52616383C00B66C86 /* Dispatcher.h */, - 0C12EDD62616383C00B66C86 /* CppSignature.h */, - 0C12EDD72616383C00B66C86 /* OperatorEntry.h */, - ); - path = dispatch; - sourceTree = ""; - }; - 0C12EDF72616383C00B66C86 /* boxing */ = { - isa = PBXGroup; - children = ( - 0C12EDF82616383C00B66C86 /* impl */, - 0C12EDFE2616383C00B66C86 /* KernelFunction.h */, - 0C12EDFF2616383C00B66C86 /* KernelFunction_impl.h */, - ); - path = boxing; - sourceTree = ""; - }; - 0C12EDF82616383C00B66C86 /* impl */ = { - isa = PBXGroup; - children = ( - 0C12EDF92616383C00B66C86 /* make_boxed_from_unboxed_functor.h */, - 0C12EDFA2616383C00B66C86 /* boxing.h */, - 0C12EDFB2616383C00B66C86 /* test_helpers.h */, - 0C12EDFC2616383C00B66C86 /* WrapFunctionIntoFunctor.h */, - 0C12EDFD2616383C00B66C86 /* WrapFunctionIntoRuntimeFunctor.h */, - ); - path = impl; - sourceTree = ""; - }; - 0C12EE102616383C00B66C86 /* cpu */ = { - isa = PBXGroup; - children = ( - 0C12EE112616383C00B66C86 /* vec256 */, - 0C12EE202616383C00B66C86 /* FlushDenormal.h */, - 0C12EE212616383C00B66C86 /* vml.h */, - ); - path = cpu; - sourceTree = ""; - }; - 0C12EE112616383C00B66C86 /* vec256 */ = { - isa = PBXGroup; - children = ( - 0C12EE122616383C00B66C86 /* vec256_bfloat16.h */, - 0C12EE132616383C00B66C86 /* vec256_float_neon.h */, - 0C12EE142616383C00B66C86 /* missing_vst1_neon.h */, - 0C12EE152616383C00B66C86 /* vec256_qint.h */, - 0C12EE162616383C00B66C86 /* intrinsics.h */, - 0C12EE172616383C00B66C86 /* functional.h */, - 0C12EE182616383C00B66C86 /* vec256_complex_float.h */, - 0C12EE192616383C00B66C86 /* vec256_double.h */, - 0C12EE1A2616383C00B66C86 /* vec256_base.h */, - 0C12EE1B2616383C00B66C86 /* vec256_float.h */, - 0C12EE1C2616383C00B66C86 /* missing_vld1_neon.h */, - 0C12EE1D2616383C00B66C86 /* vec256.h */, - 0C12EE1E2616383C00B66C86 /* vec256_int.h */, - 0C12EE1F2616383C00B66C86 /* vec256_complex_double.h */, - ); - path = vec256; - sourceTree = ""; - }; - 0C12EE292616383C00B66C86 /* quantized */ = { - isa = PBXGroup; - children = ( - 0C12EE2A2616383C00B66C86 /* QTensorImpl.h */, - 0C12EE2B2616383C00B66C86 /* Quantizer.h */, - ); - path = quantized; - sourceTree = ""; - }; - 0C12EE422616383C00B66C86 /* detail */ = { - isa = PBXGroup; - children = ( - 0C12EE432616383C00B66C86 /* CUDAHooksInterface.h */, - 0C12EE442616383C00B66C86 /* FunctionTraits.h */, - 0C12EE452616383C00B66C86 /* HIPHooksInterface.h */, - ); - path = detail; - sourceTree = ""; - }; - 0C12EE662616383C00B66C86 /* c10 */ = { - isa = PBXGroup; - children = ( - 0C12EE672616383C00B66C86 /* benchmark */, - 0C12EE682616383C00B66C86 /* core */, - 0C12EE912616383C00B66C86 /* test */, - 0C12EE982616383C00B66C86 /* util */, - 0C12EEDA2616383C00B66C86 /* cuda */, - 0C12EEE82616383C00B66C86 /* macros */, - 0C12EEEC2616383C00B66C86 /* mobile */, - 0C12EEEF2616383C00B66C86 /* hip */, - ); - path = c10; - sourceTree = ""; - }; - 0C12EE672616383C00B66C86 /* benchmark */ = { - isa = PBXGroup; - children = ( - ); - path = benchmark; - sourceTree = ""; - }; - 0C12EE682616383C00B66C86 /* core */ = { - isa = PBXGroup; - children = ( - 0C12EE692616383C00B66C86 /* impl */, - 0C12EE722616383C00B66C86 /* QEngine.h */, - 0C12EE732616383C00B66C86 /* TensorOptions.h */, - 0C12EE742616383C00B66C86 /* Device.h */, - 0C12EE752616383C00B66C86 /* CPUAllocator.h */, - 0C12EE762616383C00B66C86 /* DefaultDtype.h */, - 0C12EE772616383C00B66C86 /* DefaultTensorOptions.h */, - 0C12EE782616383C00B66C86 /* Event.h */, - 0C12EE792616383C00B66C86 /* Backend.h */, - 0C12EE7A2616383C00B66C86 /* CompileTimeFunctionPointer.h */, - 0C12EE7B2616383C00B66C86 /* WrapDimMinimal.h */, - 0C12EE7C2616383C00B66C86 /* QScheme.h */, - 0C12EE7D2616383C00B66C86 /* Stream.h */, - 0C12EE7E2616383C00B66C86 /* UndefinedTensorImpl.h */, - 0C12EE7F2616383C00B66C86 /* Scalar.h */, - 0C12EE802616383C00B66C86 /* thread_pool.h */, - 0C12EE812616383C00B66C86 /* CopyBytes.h */, - 0C12EE822616383C00B66C86 /* StreamGuard.h */, - 0C12EE832616383C00B66C86 /* Layout.h */, - 0C12EE842616383C00B66C86 /* GeneratorImpl.h */, - 0C12EE852616383C00B66C86 /* DispatchKeySet.h */, - 0C12EE862616383C00B66C86 /* Allocator.h */, - 0C12EE872616383C00B66C86 /* TensorImpl.h */, - 0C12EE882616383C00B66C86 /* ScalarType.h */, - 0C12EE892616383C00B66C86 /* Storage.h */, - 0C12EE8A2616383C00B66C86 /* DeviceType.h */, - 0C12EE8B2616383C00B66C86 /* DeviceGuard.h */, - 0C12EE8C2616383C00B66C86 /* StorageImpl.h */, - 0C12EE8D2616383C00B66C86 /* MemoryFormat.h */, - 0C12EE8E2616383C00B66C86 /* DispatchKey.h */, - 0C12EE8F2616383C00B66C86 /* ScalarTypeToTypeMeta.h */, - 0C12EE902616383C00B66C86 /* InferenceMode.h */, - ); - path = core; - sourceTree = ""; - }; - 0C12EE692616383C00B66C86 /* impl */ = { - isa = PBXGroup; - children = ( - 0C12EE6A2616383C00B66C86 /* InlineStreamGuard.h */, - 0C12EE6B2616383C00B66C86 /* SizesAndStrides.h */, - 0C12EE6C2616383C00B66C86 /* InlineDeviceGuard.h */, - 0C12EE6D2616383C00B66C86 /* LocalDispatchKeySet.h */, - 0C12EE6E2616383C00B66C86 /* VirtualGuardImpl.h */, - 0C12EE6F2616383C00B66C86 /* InlineEvent.h */, - 0C12EE702616383C00B66C86 /* DeviceGuardImplInterface.h */, - 0C12EE712616383C00B66C86 /* FakeGuardImpl.h */, - ); - path = impl; - sourceTree = ""; - }; - 0C12EE912616383C00B66C86 /* test */ = { - isa = PBXGroup; - children = ( - 0C12EE922616383C00B66C86 /* core */, - 0C12EE942616383C00B66C86 /* util */, - ); - path = test; - sourceTree = ""; - }; - 0C12EE922616383C00B66C86 /* core */ = { - isa = PBXGroup; - children = ( - 0C12EE932616383C00B66C86 /* impl */, - ); - path = core; - sourceTree = ""; - }; - 0C12EE932616383C00B66C86 /* impl */ = { - isa = PBXGroup; - children = ( - ); - path = impl; - sourceTree = ""; - }; - 0C12EE942616383C00B66C86 /* util */ = { - isa = PBXGroup; - children = ( - 0C12EE952616383C00B66C86 /* complex_test_common.h */, - 0C12EE962616383C00B66C86 /* complex_math_test_common.h */, - 0C12EE972616383C00B66C86 /* Macros.h */, - ); - path = util; - sourceTree = ""; - }; - 0C12EE982616383C00B66C86 /* util */ = { - isa = PBXGroup; - children = ( - 0C12EE992616383C00B66C86 /* Type.h */, - 0C12EE9A2616383C00B66C86 /* order_preserving_flat_hash_map.h */, - 0C12EE9B2616383C00B66C86 /* reverse_iterator.h */, - 0C12EE9C2616383C00B66C86 /* quint4x2.h */, - 0C12EE9D2616383C00B66C86 /* Half.h */, - 0C12EE9E2616383C00B66C86 /* flat_hash_map.h */, - 0C12EE9F2616383C00B66C86 /* llvmMathExtras.h */, - 0C12EEA02616383C00B66C86 /* math_compat.h */, - 0C12EEA12616383C00B66C86 /* Bitset.h */, - 0C12EEA22616383C00B66C86 /* typeid.h */, - 0C12EEA32616383C00B66C86 /* intrusive_ptr.h */, - 0C12EEA42616383C00B66C86 /* string_utils.h */, - 0C12EEA52616383C00B66C86 /* win32-headers.h */, - 0C12EEA62616383C00B66C86 /* AlignOf.h */, - 0C12EEA72616383C00B66C86 /* numa.h */, - 0C12EEA82616383C00B66C86 /* qint32.h */, - 0C12EEA92616383C00B66C86 /* MaybeOwned.h */, - 0C12EEAA2616383C00B66C86 /* Half-inl.h */, - 0C12EEAB2616383C00B66C86 /* TypeTraits.h */, - 0C12EEAC2616383C00B66C86 /* FunctionRef.h */, - 0C12EEAD2616383C00B66C86 /* Backtrace.h */, - 0C12EEAE2616383C00B66C86 /* BFloat16-inl.h */, - 0C12EEAF2616383C00B66C86 /* in_place.h */, - 0C12EEB02616383C00B66C86 /* ConstexprCrc.h */, - 0C12EEB12616383C00B66C86 /* IdWrapper.h */, - 0C12EEB22616383C00B66C86 /* Flags.h */, - 0C12EEB32616383C00B66C86 /* overloaded.h */, - 0C12EEB42616383C00B66C86 /* quint8.h */, - 0C12EEB52616383C00B66C86 /* StringUtil.h */, - 0C12EEB62616383C00B66C86 /* Logging.h */, - 0C12EEB72616383C00B66C86 /* MathConstants.h */, - 0C12EEB82616383C00B66C86 /* Registry.h */, - 0C12EEB92616383C00B66C86 /* Optional.h */, - 0C12EEBA2616383C00B66C86 /* tempfile.h */, - 0C12EEBB2616383C00B66C86 /* ArrayRef.h */, - 0C12EEBC2616383C00B66C86 /* thread_name.h */, - 0C12EEBD2616383C00B66C86 /* Unicode.h */, - 0C12EEBE2616383C00B66C86 /* TypeCast.h */, - 0C12EEBF2616383C00B66C86 /* sparse_bitset.h */, - 0C12EEC02616383C00B66C86 /* BFloat16.h */, - 0C12EEC12616383C00B66C86 /* TypeList.h */, - 0C12EEC22616383C00B66C86 /* TypeIndex.h */, - 0C12EEC32616383C00B66C86 /* Array.h */, - 0C12EEC42616383C00B66C86 /* logging_is_google_glog.h */, - 0C12EEC52616383C00B66C86 /* Metaprogramming.h */, - 0C12EEC62616383C00B66C86 /* either.h */, - 0C12EEC72616383C00B66C86 /* BFloat16-math.h */, - 0C12EEC82616383C00B66C86 /* Deprecated.h */, - 0C12EEC92616383C00B66C86 /* irange.h */, - 0C12EECA2616383C00B66C86 /* LeftRight.h */, - 0C12EECB2616383C00B66C86 /* qint8.h */, - 0C12EECC2616383C00B66C86 /* complex_math.h */, - 0C12EECD2616383C00B66C86 /* logging_is_not_google_glog.h */, - 0C12EECE2616383C00B66C86 /* Exception.h */, - 0C12EECF2616383C00B66C86 /* UniqueVoidPtr.h */, - 0C12EED02616383C00B66C86 /* ThreadLocalDebugInfo.h */, - 0C12EED12616383C00B66C86 /* accumulate.h */, - 0C12EED22616383C00B66C86 /* C++17.h */, - 0C12EED32616383C00B66C86 /* SmallVector.h */, - 0C12EED42616383C00B66C86 /* hash.h */, - 0C12EED52616383C00B66C86 /* python_stub.h */, - 0C12EED62616383C00B66C86 /* complex.h */, - 0C12EED72616383C00B66C86 /* string_view.h */, - 0C12EED82616383C00B66C86 /* variant.h */, - 0C12EED92616383C00B66C86 /* complex_utils.h */, - ); - path = util; - sourceTree = ""; - }; - 0C12EEDA2616383C00B66C86 /* cuda */ = { - isa = PBXGroup; - children = ( - 0C12EEDB2616383C00B66C86 /* impl */, - 0C12EEDE2616383C00B66C86 /* CUDAMathCompat.h */, - 0C12EEDF2616383C00B66C86 /* test */, - 0C12EEE12616383C00B66C86 /* CUDAStream.h */, - 0C12EEE22616383C00B66C86 /* CUDAGuard.h */, - 0C12EEE32616383C00B66C86 /* CUDAGraphsC10Utils.h */, - 0C12EEE42616383C00B66C86 /* CUDAMacros.h */, - 0C12EEE52616383C00B66C86 /* CUDAFunctions.h */, - 0C12EEE62616383C00B66C86 /* CUDAException.h */, - 0C12EEE72616383C00B66C86 /* CUDACachingAllocator.h */, - ); - path = cuda; - sourceTree = ""; - }; - 0C12EEDB2616383C00B66C86 /* impl */ = { - isa = PBXGroup; - children = ( - 0C12EEDC2616383C00B66C86 /* CUDATest.h */, - 0C12EEDD2616383C00B66C86 /* CUDAGuardImpl.h */, - ); - path = impl; - sourceTree = ""; - }; - 0C12EEDF2616383C00B66C86 /* test */ = { - isa = PBXGroup; - children = ( - 0C12EEE02616383C00B66C86 /* impl */, - ); - path = test; - sourceTree = ""; - }; - 0C12EEE02616383C00B66C86 /* impl */ = { - isa = PBXGroup; - children = ( - ); - path = impl; - sourceTree = ""; - }; - 0C12EEE82616383C00B66C86 /* macros */ = { - isa = PBXGroup; - children = ( - 0C12EEE92616383C00B66C86 /* cmake_macros.h */, - 0C12EEEA2616383C00B66C86 /* Export.h */, - 0C12EEEB2616383C00B66C86 /* Macros.h */, - ); - path = macros; - sourceTree = ""; - }; - 0C12EEEC2616383C00B66C86 /* mobile */ = { - isa = PBXGroup; - children = ( - 0C12EEED2616383C00B66C86 /* CPUCachingAllocator.h */, - 0C12EEEE2616383C00B66C86 /* CPUProfilingAllocator.h */, - ); - path = mobile; - sourceTree = ""; - }; - 0C12EEEF2616383C00B66C86 /* hip */ = { - isa = PBXGroup; - children = ( - ); - path = hip; - sourceTree = ""; - }; - 0C12EEF22616383C00B66C86 /* fp16 */ = { - isa = PBXGroup; - children = ( - 0C12EEF32616383C00B66C86 /* avx.py */, - 0C12EEF42616383C00B66C86 /* __init__.py */, - 0C12EEF52616383C00B66C86 /* fp16.h */, - 0C12EEF62616383C00B66C86 /* avx2.py */, - 0C12EEF72616383C00B66C86 /* psimd.h */, - 0C12EEF82616383C00B66C86 /* bitcasts.h */, - ); - path = fp16; - sourceTree = ""; - }; - 0C12EEF92616383C00B66C86 /* THCUNN */ = { - isa = PBXGroup; - children = ( - 0C12EEFA2616383C00B66C86 /* generic */, - ); - path = THCUNN; - sourceTree = ""; - }; - 0C12EEFA2616383C00B66C86 /* generic */ = { - isa = PBXGroup; - children = ( - 0C12EEFB2616383C00B66C86 /* THCUNN.h */, - ); - path = generic; - sourceTree = ""; - }; - 0C12EEFC2616383C00B66C86 /* TH */ = { - isa = PBXGroup; - children = ( - 0C12EEFD2616383C00B66C86 /* THTensorDimApply.h */, - 0C12EEFE2616383C00B66C86 /* THBlas.h */, - 0C12EEFF2616383C00B66C86 /* THGenerateQUInt8Type.h */, - 0C12EF002616383C00B66C86 /* THGenerateQInt8Type.h */, - 0C12EF012616383C00B66C86 /* THGenerateComplexTypes.h */, - 0C12EF022616383C00B66C86 /* THGenerateFloatType.h */, - 0C12EF032616383C00B66C86 /* THGenerateQInt32Type.h */, - 0C12EF042616383C00B66C86 /* THGenerateDoubleType.h */, - 0C12EF052616383C00B66C86 /* THGenerateShortType.h */, - 0C12EF062616383C00B66C86 /* THGenerateIntTypes.h */, - 0C12EF072616383C00B66C86 /* THGenerateLongType.h */, - 0C12EF082616383C00B66C86 /* THGenerateComplexFloatType.h */, - 0C12EF092616383C00B66C86 /* THAllocator.h */, - 0C12EF0A2616383C00B66C86 /* THGenerateCharType.h */, - 0C12EF0B2616383C00B66C86 /* THStorage.h */, - 0C12EF0C2616383C00B66C86 /* THHalf.h */, - 0C12EF0D2616383C00B66C86 /* THGenerateHalfType.h */, - 0C12EF0E2616383C00B66C86 /* THGenerateIntType.h */, - 0C12EF0F2616383C00B66C86 /* THVector.h */, - 0C12EF102616383C00B66C86 /* THGeneral.h */, - 0C12EF112616383C00B66C86 /* THGenerateBoolType.h */, - 0C12EF122616383C00B66C86 /* THLapack.h */, - 0C12EF132616383C00B66C86 /* THGenerateComplexDoubleType.h */, - 0C12EF142616383C00B66C86 /* THGenerateBFloat16Type.h */, - 0C12EF152616383C00B66C86 /* THGenerateQTypes.h */, - 0C12EF162616383C00B66C86 /* THGenerateFloatTypes.h */, - 0C12EF172616383C00B66C86 /* generic */, - 0C12EF292616383C00B66C86 /* THTensor.h */, - 0C12EF2A2616383C00B66C86 /* TH.h */, - 0C12EF2B2616383C00B66C86 /* THTensorApply.h */, - 0C12EF2C2616383C00B66C86 /* THStorageFunctions.hpp */, - 0C12EF2D2616383C00B66C86 /* THGenerateAllTypes.h */, - 0C12EF2E2616383C00B66C86 /* THTensor.hpp */, - 0C12EF2F2616383C00B66C86 /* THGenerateByteType.h */, - 0C12EF302616383C00B66C86 /* THStorageFunctions.h */, - 0C12EF312616383C00B66C86 /* THGenerateQUInt4x2Type.h */, - ); - path = TH; - sourceTree = ""; - }; - 0C12EF172616383C00B66C86 /* generic */ = { - isa = PBXGroup; - children = ( - 0C12EF182616383C00B66C86 /* THBlas.h */, - 0C12EF192616383C00B66C86 /* THTensor.cpp */, - 0C12EF1A2616383C00B66C86 /* THTensorMath.cpp */, - 0C12EF1B2616383C00B66C86 /* THTensorMath.h */, - 0C12EF1C2616383C00B66C86 /* THStorageCopy.cpp */, - 0C12EF1D2616383C00B66C86 /* THTensorFastGetSet.hpp */, - 0C12EF1E2616383C00B66C86 /* THStorage.h */, - 0C12EF1F2616383C00B66C86 /* THTensorLapack.h */, - 0C12EF202616383C00B66C86 /* THVector.h */, - 0C12EF212616383C00B66C86 /* THLapack.cpp */, - 0C12EF222616383C00B66C86 /* THStorageCopy.h */, - 0C12EF232616383C00B66C86 /* THLapack.h */, - 0C12EF242616383C00B66C86 /* THStorage.cpp */, - 0C12EF252616383C00B66C86 /* THTensor.h */, - 0C12EF262616383C00B66C86 /* THBlas.cpp */, - 0C12EF272616383C00B66C86 /* THTensorLapack.cpp */, - 0C12EF282616383C00B66C86 /* THTensor.hpp */, - ); - path = generic; - sourceTree = ""; - }; - 0C12EF322616383C00B66C86 /* lib */ = { - isa = PBXGroup; - children = ( - 0C12EF332616383C00B66C86 /* libtorch_cpu.a */, - 0C12EF342616383C00B66C86 /* libtorch.a */, - 0C12EF352616383C00B66C86 /* libcpuinfo.a */, - 0C12EF362616383C00B66C86 /* libXNNPACK.a */, - 0C12EF372616383C00B66C86 /* libtorchvision_ops.a */, - 0C12EF382616383C00B66C86 /* libpthreadpool.a */, - 0C12EF392616383C00B66C86 /* libc10.a */, - 0C12EF3A2616383C00B66C86 /* libeigen_blas.a */, - 0C12EF3B2616383C00B66C86 /* libclog.a */, - 0C12EF3C2616383C00B66C86 /* libpytorch_qnnpack.a */, - ); - path = lib; - sourceTree = ""; - }; 0C12EF6F26163A4C00B66C86 /* Frameworks */ = { isa = PBXGroup; children = ( + 0CDCAE49274ED909006F9077 /* Accelerate.framework */, + 0CDCAE47274ED902006F9077 /* MetalPerformanceShaders.framework */, + 0CDCAE45274ED8FA006F9077 /* CoreML.framework */, ); name = Frameworks; sourceTree = ""; @@ -5543,7 +66,6 @@ 0CEB0AB226151A8800F1F7D5 = { isa = PBXGroup; children = ( - 0C12E7872616383A00B66C86 /* install */, 0CEB0ABD26151A8800F1F7D5 /* VisionTestApp */, 0CEB0ABC26151A8800F1F7D5 /* Products */, 0C12EF6F26163A4C00B66C86 /* Frameworks */, @@ -5633,12 +155,9 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 0C12EF3D2616383D00B66C86 /* avx.py in Resources */, 0CEB0ACE26151A8900F1F7D5 /* LaunchScreen.storyboard in Resources */, - 0C12EF3F2616383D00B66C86 /* avx2.py in Resources */, 0C12EF7626163B7600B66C86 /* frcnn_mnetv3.pt in Resources */, 0CEB0ACB26151A8900F1F7D5 /* Assets.xcassets in Resources */, - 0C12EF3E2616383D00B66C86 /* __init__.py in Resources */, 0CEB0AC926151A8800F1F7D5 /* Main.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -5652,15 +171,8 @@ files = ( 0CEB0AC626151A8800F1F7D5 /* ViewController.mm in Sources */, 0CEB0AC026151A8800F1F7D5 /* AppDelegate.m in Sources */, - 0C12EF412616383D00B66C86 /* THTensorMath.cpp in Sources */, - 0C12EF422616383D00B66C86 /* THStorageCopy.cpp in Sources */, - 0C12EF462616383D00B66C86 /* THTensorLapack.cpp in Sources */, 0CEB0AD126151A8900F1F7D5 /* main.m in Sources */, - 0C12EF432616383D00B66C86 /* THLapack.cpp in Sources */, - 0C12EF402616383D00B66C86 /* THTensor.cpp in Sources */, - 0C12EF442616383D00B66C86 /* THStorage.cpp in Sources */, 0CEB0B3A26152ED900F1F7D5 /* ModelRunner.mm in Sources */, - 0C12EF452616383D00B66C86 /* THBlas.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -5831,24 +343,7 @@ OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", - "-l\"XNNPACK\"", - "-l\"c++\"", - "-l\"c10\"", - "-l\"clog\"", - "-l\"cpuinfo\"", - "-l\"eigen_blas\"", - "-l\"pthreadpool\"", - "-l\"pytorch_qnnpack\"", - "-l\"stdc++\"", - "-l\"torch\"", - "-l\"torch_cpu\"", - "-l\"torchvision_ops\"", - "-force_load", - "$(PROJECT_DIR)/install/lib/libtorch.a", - "-force_load", - "$(PROJECT_DIR)/install/lib/libtorch_cpu.a", - "-force_load", - "$(PROJECT_DIR)/install/lib/libtorchvision_ops.a", + "-all_load", ); PRODUCT_BUNDLE_IDENTIFIER = com.pytorch.ios.VisionTestApp.VisionTestApp; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -5881,24 +376,7 @@ OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", - "-l\"XNNPACK\"", - "-l\"c++\"", - "-l\"c10\"", - "-l\"clog\"", - "-l\"cpuinfo\"", - "-l\"eigen_blas\"", - "-l\"pthreadpool\"", - "-l\"pytorch_qnnpack\"", - "-l\"stdc++\"", - "-l\"torch\"", - "-l\"torch_cpu\"", - "-l\"torchvision_ops\"", - "-force_load", - "$(PROJECT_DIR)/install/lib/libtorch.a", - "-force_load", - "$(PROJECT_DIR)/install/lib/libtorch_cpu.a", - "-force_load", - "$(PROJECT_DIR)/install/lib/libtorchvision_ops.a", + "-all_load", ); PRODUCT_BUNDLE_IDENTIFIER = com.pytorch.ios.VisionTestApp.VisionTestApp; PRODUCT_NAME = "$(TARGET_NAME)"; diff --git a/ios/VisionTestApp/VisionTestApp/ViewController.h b/ios/VisionTestApp/VisionTestApp/ViewController.h index 7df67432f9212c3778bcca984c55e003dbcbccd9..82cb7c57f8a71e86bdf59ccc0ba4ee8f0622d082 100644 --- a/ios/VisionTestApp/VisionTestApp/ViewController.h +++ b/ios/VisionTestApp/VisionTestApp/ViewController.h @@ -5,4 +5,3 @@ @end - diff --git a/ios/VisionTestApp/make_assets.py b/ios/VisionTestApp/make_assets.py index 122094b354717f57f1c124f9bbc3d307e18e1171..f14223e6a42d85c677edc16f41a0e87c5355e4fe 100644 --- a/ios/VisionTestApp/make_assets.py +++ b/ios/VisionTestApp/make_assets.py @@ -1,15 +1,19 @@ import torch -import torchvision from torch.utils.mobile_optimizer import optimize_for_mobile +from torchvision.models.detection import ( + fasterrcnn_mobilenet_v3_large_320_fpn, + FasterRCNN_MobileNet_V3_Large_320_FPN_Weights, +) print(torch.__version__) -model = torchvision.models.detection.fasterrcnn_mobilenet_v3_large_320_fpn( - pretrained=True, +model = fasterrcnn_mobilenet_v3_large_320_fpn( + weights=FasterRCNN_MobileNet_V3_Large_320_FPN_Weights.DEFAULT, box_score_thresh=0.7, rpn_post_nms_top_n_test=100, rpn_score_thresh=0.4, - rpn_pre_nms_top_n_test=150) + rpn_pre_nms_top_n_test=150, +) model.eval() script_model = torch.jit.script(model) diff --git a/maintainer_guide.md b/maintainer_guide.md new file mode 100644 index 0000000000000000000000000000000000000000..3d66a701be175a8de7242d26b3c9831196a22e5c --- /dev/null +++ b/maintainer_guide.md @@ -0,0 +1,76 @@ +# Torchvision maintainers guide + +This document aims at documenting user-facing policies / principles used when +developing and maintaining torchvision. Other maintainer info (e.g. release +process) can be found in the meta-internal wiki. + +### What is public and what is private? + +For the Python API, torchvision largely follows the [PyTorch +policy](https://github.com/pytorch/pytorch/wiki/Public-API-definition-and-documentation) +which is consistent with other major packages +([numpy](https://numpy.org/neps/nep-0023-backwards-compatibility.html), +[scikit-learn](https://scikit-learn.org/dev/glossary.html#term-API) etc.). +We recognize that his policy is somewhat imperfect for some edge cases, and that +it's difficult to come up with an accurate technical definition. In broad terms, +which are usually well understood by users, the policy is that: + +- modules that can be accessed without leading underscore are public +- objects in a public file that don't have a leading underscore are public +- class attributes are public iff they have no leading underscore +- the rest of the modules / objects / class attributes are considered private + +The public API has backward-compatible (BC) guarantees defined in our +deprecation policy (see below). The private API has not BC guarantees. + +For C++, code is private. For Meta employees: if a C++ change breaks fbcode, fix +fbcode or revert the change. We should be careful about models running in +production and relying on torchvision ops. + +The `test` folder is not importable and is **private.** Even meta-internal +projects should *not* rely on it (it has happened in the past and is now +programmatically impossible). + +The training references do not have BC guarantees. Breaking changes are +possible, but we should make sure that the tutorials are still running properly, +and that their intended narrative is preserved (by e.g. checking outputs, +etc.). + +The rest of the folders (build, android, ios, etc.) are private and have no BC +guarantees. + +### Deprecation policy. + +Because they're disruptive, **deprecations should only be used sparingly**. + +We largely follow the [PyTorch +policy](https://github.com/pytorch/pytorch/wiki/PyTorch's-Python-Frontend-Backward-and-Forward-Compatibility-Policy): +breaking changes require a deprecation period of at least 2 versions. + +Deprecations should clearly indicate their deadline in the docs and warning +messages. Avoid not committing to a deadline, or keeping deprecated APIs for too +long: it gives no incentive for users to update their code, sends conflicting +messages ("why was this API removed while this other one is still around?"), and +accumulates debt in the project. + +### Should this attribute be public? Should this function be private? + +When designing an API it’s not always obvious what should be exposed as public, +and what should be kept as a private implementation detail. The following +guidelines can be useful: + +* Functional consistency throughout the library is a top priority, for users and + developers’ sake. In doubt and unless it’s clearly wrong, expose what other + similar classes expose. +* Think really hard about the users and their use-cases, and try to expose what + they would need to address those use-cases. Aggressively keep everything else + private. Remember that the “private -> public” direction is way smoother than + the “public -> private” one: in doubt, keep it private. +* When thinking about use-cases, the general API motto applies: make what’s + simple and common easy, and make what’s complex possible (80% / 20% rule). + There might be a ~1% left that’s not addressed: that’s OK. Also, **make what’s + wrong very hard**, if not impossible. + +As a good practice, always create new files and even classes with a leading +underscore in their name. This way, everything is private by default and the +only public surface is explicitly present in an `__init__.py` file. diff --git a/mypy.ini b/mypy.ini index 040b52dfda45248c51a8dab717e3eeb95360cfc2..e66bee0af36c2f0eaeea799f970154ff4bfa3536 100644 --- a/mypy.ini +++ b/mypy.ini @@ -3,12 +3,19 @@ files = torchvision show_error_codes = True pretty = True +allow_redefinition = True +no_implicit_optional = True +warn_redundant_casts = True -[mypy-torchvision.io._video_opt.*] +[mypy-torchvision.io.image.*] ignore_errors = True -[mypy-torchvision.io.*] +[mypy-torchvision.io.video.*] + +ignore_errors = True + +[mypy-torchvision.io.video_reader] ignore_errors = True @@ -16,11 +23,43 @@ ignore_errors = True ignore_errors=True -[mypy-torchvision.models.detection.*] +[mypy-torchvision.models.detection.anchor_utils] + +ignore_errors = True + +[mypy-torchvision.models.detection.transform] + +ignore_errors = True + +[mypy-torchvision.models.detection.roi_heads] + +ignore_errors = True + +[mypy-torchvision.models.detection.faster_rcnn] ignore_errors = True -[mypy-torchvision.models.quantization.*] +[mypy-torchvision.models.detection.mask_rcnn] + +ignore_errors = True + +[mypy-torchvision.models.detection.keypoint_rcnn] + +ignore_errors = True + +[mypy-torchvision.models.detection.retinanet] + +ignore_errors = True + +[mypy-torchvision.models.detection.ssd] + +ignore_errors = True + +[mypy-torchvision.models.detection.ssdlite] + +ignore_errors = True + +[mypy-torchvision.models.detection.fcos] ignore_errors = True @@ -28,7 +67,15 @@ ignore_errors = True ignore_errors = True -[mypy-torchvision.transforms.*] +[mypy-torchvision.transforms._functional_pil] + +ignore_errors = True + +[mypy-torchvision.transforms.functional.*] + +ignore_errors = True + +[mypy-torchvision.transforms.transforms.*] ignore_errors = True @@ -52,10 +99,6 @@ ignore_missing_imports = True ignore_missing_imports = True -[mypy-pandas.*] - -ignore_missing_imports = True - [mypy-accimage.*] ignore_missing_imports = True @@ -67,3 +110,15 @@ ignore_missing_imports = True [mypy-defusedxml.*] ignore_missing_imports = True + +[mypy-torchdata.*] + +ignore_missing_imports = True + +[mypy-h5py.*] + +ignore_missing_imports = True + +[mypy-gdown.*] + +ignore_missing_imports = True diff --git a/packaging/README.md b/packaging/README.md deleted file mode 100644 index 7d3c5f7831bdf831a7aa4c6434c2e32ade722111..0000000000000000000000000000000000000000 --- a/packaging/README.md +++ /dev/null @@ -1,90 +0,0 @@ -# Building torchvision packages for release - -## Anaconda packages - -### Linux - -```bash -nvidia-docker run -it --ipc=host --rm -v $(pwd):/remote soumith/conda-cuda bash -pushd remote/conda - -./build_vision.sh 9.0 -./build_vision.sh 10.0 -./build_vision.sh cpu - -# copy packages over to /remote -# exit docker -# anaconda upload -u pytorch torchvision*.bz2 -``` - -### OSX - -```bash -# create a fresh anaconda environment / install and activate it -conda install -y conda-build anaconda-client -./build_vision.sh cpu - -# copy packages over to /remote -# exit docker -# anaconda upload -u pytorch torchvision*.bz2 -``` - -### Windows - -```bash -# Open `Git Bash` and change dir to `conda` -./build_vision.sh 9.0 -./build_vision.sh 10.0 -./build_vision.sh cpu - -# copy packages to a output directory -# anaconda upload -u pytorch torchvision*.bz2 -``` - -## Wheels - -### Linux - -pushd wheel - -```bash -nvidia-docker run -it --ipc=host --rm -v $(pwd):/remote soumith/manylinux-cuda90:latest bash -cd remote -./linux_manywheel.sh cu90 - -rm -rf /usr/local/cuda* -./linux_manywheel.sh cpu -``` - -```bash -nvidia-docker run -it --ipc=host --rm -v $(pwd):/remote soumith/manylinux-cuda100:latest bash -cd remote -./linux_manywheel.sh cu100 -``` - -wheels are in the folders `cpu`, `cu90`, `cu100`. - -You can upload the `cu90` wheels to twine with `twine upload *.whl`. -Which wheels we upload depends on which wheels PyTorch uploads as default, and right now, it's `cu90`. - -### OSX - -```bash -pushd wheel -./osx_wheel.sh -``` - -### Windows - -```cmd -set PYTORCH_REPO=pytorch - -pushd windows -call build_vision.bat 90 0.3.0 1 -call build_vision.bat 100 0.3.0 1 -call build_vision.bat cpu 0.3.0 1 -``` - -wheels are in the current folder. - -You can upload them to twine with `twine upload *.whl` diff --git a/packaging/build_cmake.sh b/packaging/build_cmake.sh deleted file mode 100755 index 0945f576ee2b5ee47ca8c730a080362403ee0347..0000000000000000000000000000000000000000 --- a/packaging/build_cmake.sh +++ /dev/null @@ -1,106 +0,0 @@ -#!/bin/bash -set -ex - -PARALLELISM=8 -if [ -n "$MAX_JOBS" ]; then - PARALLELISM=$MAX_JOBS -fi - -if [[ "$(uname)" != Darwin && "$OSTYPE" != "msys" ]]; then - eval "$(./conda/bin/conda shell.bash hook)" - conda activate ./env -fi - -script_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" -. "$script_dir/pkg_helpers.bash" - -export BUILD_TYPE=conda -setup_env 0.10.0 -export SOURCE_ROOT_DIR="$PWD" -setup_conda_pytorch_constraint -setup_conda_cudatoolkit_plain_constraint - -if [[ "$OSTYPE" == "msys" ]]; then - conda install -yq conda-build cmake pillow>=5.3.0 future - pip install dataclasses -fi - -setup_visual_studio_constraint -setup_junit_results_folder - -conda install -yq pytorch=$PYTORCH_VERSION $CONDA_CUDATOOLKIT_CONSTRAINT $CONDA_CPUONLY_FEATURE -c "pytorch-${UPLOAD_CHANNEL}" -TORCH_PATH=$(dirname $(python -c "import torch; print(torch.__file__)")) - -if [[ "$(uname)" == Darwin || "$OSTYPE" == "msys" ]]; then - conda install -yq libpng jpeg -else - yum install -y libpng-devel libjpeg-turbo-devel -fi - -mkdir cpp_build -pushd cpp_build - -# Generate libtorchvision files -cmake .. -DTorch_DIR=$TORCH_PATH/share/cmake/Torch -DWITH_CUDA=$CMAKE_USE_CUDA - -# Compile and install libtorchvision -if [[ "$OSTYPE" == "msys" ]]; then - "$script_dir/windows/internal/vc_env_helper.bat" "$script_dir/windows/internal/build_cmake.bat" $PARALLELISM - CONDA_PATH=$(dirname $(which python)) - cp -r "C:/Program Files (x86)/torchvision/include/torchvision" $CONDA_PATH/include -else - make -j$PARALLELISM - make install - - if [[ "$(uname)" == Darwin ]]; then - CONDA_PATH=$(dirname $(dirname $(which python))) - cp -r /usr/local/include/torchvision $CONDA_PATH/include/ - export C_INCLUDE_PATH=/usr/local/include - export CPLUS_INCLUDE_PATH=/usr/local/include - fi -fi - -popd - -# Install torchvision locally -python setup.py develop - -# Trace, compile and run project that uses Faster-RCNN -pushd test/tracing/frcnn -mkdir build - -# Trace model -python trace_model.py -cp fasterrcnn_resnet50_fpn.pt build - -cd build -cmake .. -DTorch_DIR=$TORCH_PATH/share/cmake/Torch -DWITH_CUDA=$CMAKE_USE_CUDA -if [[ "$OSTYPE" == "msys" ]]; then - "$script_dir/windows/internal/vc_env_helper.bat" "$script_dir/windows/internal/build_frcnn.bat" $PARALLELISM - mv fasterrcnn_resnet50_fpn.pt Release - cd Release - export PATH=$(cygpath "C:/Program Files (x86)/torchvision/bin"):$(cygpath $TORCH_PATH)/lib:$PATH -else - make -j$PARALLELISM -fi - -# Run traced program -./test_frcnn_tracing - -# Compile and run the CPP example -popd -cd examples/cpp/hello_world - -mkdir build -cd build -cmake .. -DTorch_DIR=$TORCH_PATH/share/cmake/Torch - -if [[ "$OSTYPE" == "msys" ]]; then - "$script_dir/windows/internal/vc_env_helper.bat" "$script_dir/windows/internal/build_cpp_example.bat" $PARALLELISM - cd Release -else - make -j$PARALLELISM -fi - -# Run CPP example -./hello-world diff --git a/packaging/build_conda.sh b/packaging/build_conda.sh deleted file mode 100755 index 5f2239aae7ef546f5ef47c026dc2e4ecffb65365..0000000000000000000000000000000000000000 --- a/packaging/build_conda.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -set -ex - -script_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" -. "$script_dir/pkg_helpers.bash" - -export BUILD_TYPE=conda -setup_env 0.10.0 -export SOURCE_ROOT_DIR="$PWD" -setup_conda_pytorch_constraint -setup_conda_cudatoolkit_constraint -setup_visual_studio_constraint -setup_junit_results_folder -conda build $CONDA_CHANNEL_FLAGS -c defaults -c conda-forge --no-anaconda-upload --python "$PYTHON_VERSION" packaging/torchvision diff --git a/packaging/build_wheel.sh b/packaging/build_wheel.sh deleted file mode 100755 index 05dc23a43ab185fff3cb2de8a4e44d0dbf064810..0000000000000000000000000000000000000000 --- a/packaging/build_wheel.sh +++ /dev/null @@ -1,59 +0,0 @@ -#!/bin/bash -set -ex - -script_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" -. "$script_dir/pkg_helpers.bash" - -export BUILD_TYPE=wheel -setup_env 0.10.0 -setup_wheel_python -pip_install numpy pyyaml future ninja -setup_pip_pytorch_version -python setup.py clean - -# Copy binaries to be included in the wheel distribution -if [[ "$(uname)" == Darwin || "$OSTYPE" == "msys" ]]; then - python_exec="$(which python)" - bin_path=$(dirname $python_exec) - env_path=$(dirname $bin_path) - if [[ "$(uname)" == Darwin ]]; then - # Install delocate to relocate the required binaries - pip_install delocate - else - cp "$bin_path/Library/bin/libpng16.dll" torchvision - cp "$bin_path/Library/bin/libjpeg.dll" torchvision - fi -else - # Install auditwheel to get some inspection utilities - pip_install auditwheel - - # Point to custom libraries - export LD_LIBRARY_PATH=$(pwd)/ext_libraries/lib:$LD_LIBRARY_PATH - export TORCHVISION_INCLUDE=$(pwd)/ext_libraries/include - export TORCHVISION_LIBRARY=$(pwd)/ext_libraries/lib -fi - -download_copy_ffmpeg - -if [[ "$OSTYPE" == "msys" ]]; then - IS_WHEEL=1 "$script_dir/windows/internal/vc_env_helper.bat" python setup.py bdist_wheel -else - IS_WHEEL=1 python setup.py bdist_wheel -fi - - -if [[ "$(uname)" == Darwin ]]; then - pushd dist/ - python_exec="$(which python)" - bin_path=$(dirname $python_exec) - env_path=$(dirname $bin_path) - for whl in *.whl; do - DYLD_FALLBACK_LIBRARY_PATH="$env_path/lib/:$DYLD_FALLBACK_LIBRARY_PATH" delocate-wheel -v $whl - done -else - if [[ "$OSTYPE" == "msys" ]]; then - "$script_dir/windows/internal/vc_env_helper.bat" python $script_dir/wheel/relocate.py - else - LD_LIBRARY_PATH="/usr/local/lib:$LD_LIBRARY_PATH" python $script_dir/wheel/relocate.py - fi -fi diff --git a/packaging/cut_release.sh b/packaging/cut_release.sh new file mode 100755 index 0000000000000000000000000000000000000000..91e0e5ff15d081cf9a35ff8bd8a97eac6ac4023c --- /dev/null +++ b/packaging/cut_release.sh @@ -0,0 +1,36 @@ +#!/usr/bin/env bash +# +# Usage (run from root of project): +# TEST_INFRA_BRANCH=release/2.1 RELEASE_BRANCH=release/2.1 RELEASE_VERSION=2.1.0 packaging/cut_release.sh +# +# TEST_INFRA_BRANCH: The release branch of test-infra that houses all reusable +# workflows +# +# RELEASE_BRANCH: The name of the release branch for this repo +# +# RELEASE_VERSION: Version of this current release + +set -eou pipefail + +# Create and Check out to Release Branch +git checkout -b "${RELEASE_BRANCH}" + +# Change all GitHub Actions to reference the test-infra release branch +# as opposed to main. +for i in .github/workflows/*.yml; do + if [[ "$OSTYPE" == "darwin"* ]]; then + sed -i '' -e s#@main#@"${TEST_INFRA_BRANCH}"# $i; + sed -i '' -e s#test-infra-ref:[[:space:]]main#"test-infra-ref: ${TEST_INFRA_BRANCH}"# $i; + else + sed -i -e s#@main#@"${TEST_INFRA_BRANCH}"# $i; + sed -i -e s#test-infra-ref:[[:space:]]main#"test-infra-ref: ${TEST_INFRA_BRANCH}"# $i; + fi +done + +# Update the Release Version in version.txt +echo "${RELEASE_VERSION}" >version.txt + +# Optional +# git add ./github/workflows/*.yml version.txt +# git commit -m "[RELEASE-ONLY CHANGES] Branch Cut for Release {RELEASE_VERSION}" +# git push origin "${RELEASE_BRANCH}" diff --git a/packaging/pkg_helpers.bash b/packaging/pkg_helpers.bash deleted file mode 100644 index 826fb525e3abbbed7a08bcdcd4dab2f1a69e17d9..0000000000000000000000000000000000000000 --- a/packaging/pkg_helpers.bash +++ /dev/null @@ -1,405 +0,0 @@ -# A set of useful bash functions for common functionality we need to do in -# many build scripts - - -# Setup CUDA environment variables, based on CU_VERSION -# -# Inputs: -# CU_VERSION (cpu, cu92, cu100) -# NO_CUDA_PACKAGE (bool) -# BUILD_TYPE (conda, wheel) -# -# Outputs: -# VERSION_SUFFIX (e.g., "") -# PYTORCH_VERSION_SUFFIX (e.g., +cpu) -# WHEEL_DIR (e.g., cu100/) -# CUDA_HOME (e.g., /usr/local/cuda-9.2, respected by torch.utils.cpp_extension) -# FORCE_CUDA (respected by torchvision setup.py) -# NVCC_FLAGS (respected by torchvision setup.py) -# -# Precondition: CUDA versions are installed in their conventional locations in -# /usr/local/cuda-* -# -# NOTE: Why VERSION_SUFFIX versus PYTORCH_VERSION_SUFFIX? If you're building -# a package with CUDA on a platform we support CUDA on, VERSION_SUFFIX == -# PYTORCH_VERSION_SUFFIX and everyone is happy. However, if you are building a -# package with only CPU bits (e.g., torchaudio), then VERSION_SUFFIX is always -# empty, but PYTORCH_VERSION_SUFFIX is +cpu (because that's how you get a CPU -# version of a Python package. But that doesn't apply if you're on OS X, -# since the default CU_VERSION on OS X is cpu. -setup_cuda() { - - # First, compute version suffixes. By default, assume no version suffixes - export VERSION_SUFFIX="" - export PYTORCH_VERSION_SUFFIX="" - export WHEEL_DIR="" - # Wheel builds need suffixes (but not if they're on OS X, which never has suffix) - if [[ "$BUILD_TYPE" == "wheel" ]] && [[ "$(uname)" != Darwin ]]; then - # The default CUDA has no suffix - if [[ "$CU_VERSION" != "cu102" ]]; then - export PYTORCH_VERSION_SUFFIX="+$CU_VERSION" - fi - # Match the suffix scheme of pytorch, unless this package does not have - # CUDA builds (in which case, use default) - if [[ -z "$NO_CUDA_PACKAGE" ]]; then - export VERSION_SUFFIX="$PYTORCH_VERSION_SUFFIX" - export WHEEL_DIR="$CU_VERSION/" - fi - fi - - # Now work out the CUDA settings - case "$CU_VERSION" in - cu112) - if [[ "$OSTYPE" == "msys" ]]; then - export CUDA_HOME="C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v11.2" - else - export CUDA_HOME=/usr/local/cuda-11.2/ - fi - export FORCE_CUDA=1 - export TORCH_CUDA_ARCH_LIST="3.5;5.0+PTX;6.0;7.0;7.5;8.0;8.6" - ;; - cu111) - if [[ "$OSTYPE" == "msys" ]]; then - export CUDA_HOME="C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v11.1" - else - export CUDA_HOME=/usr/local/cuda-11.1/ - fi - export FORCE_CUDA=1 - export TORCH_CUDA_ARCH_LIST="3.5;5.0+PTX;6.0;7.0;7.5;8.0;8.6" - ;; - cu110) - if [[ "$OSTYPE" == "msys" ]]; then - export CUDA_HOME="C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v11.0" - else - export CUDA_HOME=/usr/local/cuda-11.0/ - fi - export FORCE_CUDA=1 - export TORCH_CUDA_ARCH_LIST="3.5;5.0+PTX;6.0;7.0;7.5;8.0" - ;; - cu102) - if [[ "$OSTYPE" == "msys" ]]; then - export CUDA_HOME="C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v10.2" - else - export CUDA_HOME=/usr/local/cuda-10.2/ - fi - export FORCE_CUDA=1 - export TORCH_CUDA_ARCH_LIST="3.5;5.0+PTX;6.0;7.0;7.5" - ;; - cu101) - if [[ "$OSTYPE" == "msys" ]]; then - export CUDA_HOME="C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v10.1" - else - export CUDA_HOME=/usr/local/cuda-10.1/ - fi - export FORCE_CUDA=1 - export TORCH_CUDA_ARCH_LIST="3.5;5.0+PTX;6.0;7.0;7.5" - ;; - cu100) - if [[ "$OSTYPE" == "msys" ]]; then - export CUDA_HOME="C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v10.0" - else - export CUDA_HOME=/usr/local/cuda-10.0/ - fi - export FORCE_CUDA=1 - export TORCH_CUDA_ARCH_LIST="3.5;5.0+PTX;6.0;7.0;7.5" - ;; - cu92) - if [[ "$OSTYPE" == "msys" ]]; then - export CUDA_HOME="C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v9.2" - else - export CUDA_HOME=/usr/local/cuda-9.2/ - fi - export FORCE_CUDA=1 - export TORCH_CUDA_ARCH_LIST="3.5;5.0+PTX;6.0;7.0" - ;; - cpu) - ;; - rocm*) - export FORCE_CUDA=1 - ;; - *) - echo "Unrecognized CU_VERSION=$CU_VERSION" - exit 1 - ;; - esac -} - -# Populate build version if necessary, and add version suffix -# -# Inputs: -# BUILD_VERSION (e.g., 0.2.0 or empty) -# VERSION_SUFFIX (e.g., +cpu) -# -# Outputs: -# BUILD_VERSION (e.g., 0.2.0.dev20190807+cpu) -# -# Fill BUILD_VERSION if it doesn't exist already with a nightly string -# Usage: setup_build_version 0.2.0 -setup_build_version() { - if [[ -z "$BUILD_VERSION" ]]; then - export BUILD_VERSION="$1.dev$(date "+%Y%m%d")$VERSION_SUFFIX" - else - export BUILD_VERSION="$BUILD_VERSION$VERSION_SUFFIX" - fi - - # Set build version based on tag if on tag - if [[ -n "${CIRCLE_TAG}" ]]; then - # Strip tag - export BUILD_VERSION="$(echo "${CIRCLE_TAG}" | sed -e 's/^v//' -e 's/-.*$//')${VERSION_SUFFIX}" - fi -} - -# Set some useful variables for OS X, if applicable -setup_macos() { - if [[ "$(uname)" == Darwin ]]; then - export MACOSX_DEPLOYMENT_TARGET=10.9 CC=clang CXX=clang++ - fi -} - - -# Top-level entry point for things every package will need to do -# -# Usage: setup_env 0.2.0 -setup_env() { - setup_cuda - setup_build_version "$1" - setup_macos -} - -# Function to retry functions that sometimes timeout or have flaky failures -retry () { - $* || (sleep 1 && $*) || (sleep 2 && $*) || (sleep 4 && $*) || (sleep 8 && $*) -} - -# Inputs: -# PYTHON_VERSION (2.7, 3.5, 3.6, 3.7) -# UNICODE_ABI (bool) -# -# Outputs: -# PATH modified to put correct Python version in PATH -# -# Precondition: If Linux, you are in a soumith/manylinux-cuda* Docker image -setup_wheel_python() { - if [[ "$(uname)" == Darwin || "$OSTYPE" == "msys" ]]; then - eval "$(conda shell.bash hook)" - conda env remove -n "env$PYTHON_VERSION" || true - if [[ "$PYTHON_VERSION" == 3.9 ]]; then - export CONDA_CHANNEL_FLAGS="${CONDA_CHANNEL_FLAGS} -c=conda-forge" - fi - conda create ${CONDA_CHANNEL_FLAGS} -yn "env$PYTHON_VERSION" python="$PYTHON_VERSION" - conda activate "env$PYTHON_VERSION" - # Install libpng from Anaconda (defaults) - conda install ${CONDA_CHANNEL_FLAGS} -c conda-forge libpng "jpeg<=9b" -y - else - # Install native CentOS libJPEG, LAME, freetype and GnuTLS - yum install -y libjpeg-turbo-devel lame freetype gnutls - case "$PYTHON_VERSION" in - 2.7) - if [[ -n "$UNICODE_ABI" ]]; then - python_abi=cp27-cp27mu - else - python_abi=cp27-cp27m - fi - ;; - 3.5) python_abi=cp35-cp35m ;; - 3.6) python_abi=cp36-cp36m ;; - 3.7) python_abi=cp37-cp37m ;; - 3.8) python_abi=cp38-cp38 ;; - 3.9) python_abi=cp39-cp39 ;; - *) - echo "Unrecognized PYTHON_VERSION=$PYTHON_VERSION" - exit 1 - ;; - esac - # Download all the dependencies required to compile image and video_reader - # extensions - - mkdir -p ext_libraries - pushd ext_libraries - popd - export PATH="/opt/python/$python_abi/bin:$(pwd)/ext_libraries/bin:$PATH" - fi -} - -# Install with pip a bit more robustly than the default -pip_install() { - retry pip install --progress-bar off "$@" -} - -# Install torch with pip, respecting PYTORCH_VERSION, and record the installed -# version into PYTORCH_VERSION, if applicable -setup_pip_pytorch_version() { - if [[ -z "$PYTORCH_VERSION" ]]; then - # Install latest prerelease version of torch, per our nightlies, consistent - # with the requested cuda version - pip_install --pre torch -f "https://download.pytorch.org/whl/nightly/${WHEEL_DIR}torch_nightly.html" - if [[ "$CUDA_VERSION" == "cpu" ]]; then - # CUDA and CPU are ABI compatible on the CPU-only parts, so strip - # in this case - export PYTORCH_VERSION="$(pip show torch | grep ^Version: | sed 's/Version: *//' | sed 's/+.\+//')" - else - export PYTORCH_VERSION="$(pip show torch | grep ^Version: | sed 's/Version: *//')" - fi - else - pip_install "torch==$PYTORCH_VERSION$PYTORCH_VERSION_SUFFIX" \ - -f "https://download.pytorch.org/whl/${CU_VERSION}/torch_stable.html" \ - -f "https://download.pytorch.org/whl/${UPLOAD_CHANNEL}/${CU_VERSION}/torch_${UPLOAD_CHANNEL}.html" - fi -} - -# Fill PYTORCH_VERSION with the latest conda nightly version, and -# CONDA_CHANNEL_FLAGS with appropriate flags to retrieve these versions -# -# You MUST have populated PYTORCH_VERSION_SUFFIX before hand. -setup_conda_pytorch_constraint() { - if [[ -z "$PYTORCH_VERSION" ]]; then - export CONDA_CHANNEL_FLAGS="-c pytorch-nightly -c pytorch" - export PYTORCH_VERSION="$(conda search --json 'pytorch[channel=pytorch-nightly]' | \ - python -c "import os, sys, json, re; cuver = os.environ.get('CU_VERSION'); \ - cuver_1 = cuver.replace('cu', 'cuda') if cuver != 'cpu' else cuver; \ - cuver_2 = (cuver[:-1] + '.' + cuver[-1]).replace('cu', 'cuda') if cuver != 'cpu' else cuver; \ - print(re.sub(r'\\+.*$', '', \ - [x['version'] for x in json.load(sys.stdin)['pytorch'] \ - if (x['platform'] == 'darwin' or cuver_1 in x['fn'] or cuver_2 in x['fn']) \ - and 'py' + os.environ['PYTHON_VERSION'] in x['fn']][-1]))")" - if [[ -z "$PYTORCH_VERSION" ]]; then - echo "PyTorch version auto detection failed" - echo "No package found for CU_VERSION=$CU_VERSION and PYTHON_VERSION=$PYTHON_VERSION" - exit 1 - fi - else - export CONDA_CHANNEL_FLAGS="-c pytorch -c pytorch-${UPLOAD_CHANNEL}" - fi - if [[ "$CU_VERSION" == cpu ]]; then - export CONDA_PYTORCH_BUILD_CONSTRAINT="- pytorch==$PYTORCH_VERSION${PYTORCH_VERSION_SUFFIX}" - export CONDA_PYTORCH_CONSTRAINT="- pytorch==$PYTORCH_VERSION" - else - export CONDA_PYTORCH_BUILD_CONSTRAINT="- pytorch==${PYTORCH_VERSION}${PYTORCH_VERSION_SUFFIX}" - export CONDA_PYTORCH_CONSTRAINT="- pytorch==${PYTORCH_VERSION}${PYTORCH_VERSION_SUFFIX}" - fi - if [[ "$OSTYPE" == msys && "$CU_VERSION" == cu92 ]]; then - export CONDA_CHANNEL_FLAGS="${CONDA_CHANNEL_FLAGS} -c defaults -c numba/label/dev" - fi - if [[ "$PYTHON_VERSION" == 3.9 ]]; then - export CONDA_CHANNEL_FLAGS="${CONDA_CHANNEL_FLAGS} -c=conda-forge" - fi -} - -# Translate CUDA_VERSION into CUDA_CUDATOOLKIT_CONSTRAINT -setup_conda_cudatoolkit_constraint() { - export CONDA_CPUONLY_FEATURE="" - if [[ "$(uname)" == Darwin ]]; then - export CONDA_CUDATOOLKIT_CONSTRAINT="" - else - case "$CU_VERSION" in - cu112) - export CONDA_CUDATOOLKIT_CONSTRAINT="- cudatoolkit >=11.2,<11.3 # [not osx]" - ;; - cu111) - export CONDA_CUDATOOLKIT_CONSTRAINT="- cudatoolkit >=11.1,<11.2 # [not osx]" - ;; - cu110) - export CONDA_CUDATOOLKIT_CONSTRAINT="- cudatoolkit >=11.0,<11.1 # [not osx]" - ;; - cu102) - export CONDA_CUDATOOLKIT_CONSTRAINT="- cudatoolkit >=10.2,<10.3 # [not osx]" - ;; - cu101) - export CONDA_CUDATOOLKIT_CONSTRAINT="- cudatoolkit >=10.1,<10.2 # [not osx]" - ;; - cu100) - export CONDA_CUDATOOLKIT_CONSTRAINT="- cudatoolkit >=10.0,<10.1 # [not osx]" - ;; - cu92) - export CONDA_CUDATOOLKIT_CONSTRAINT="- cudatoolkit >=9.2,<9.3 # [not osx]" - ;; - cpu) - export CONDA_CUDATOOLKIT_CONSTRAINT="" - export CONDA_CPUONLY_FEATURE="- cpuonly" - ;; - *) - echo "Unrecognized CU_VERSION=$CU_VERSION" - exit 1 - ;; - esac - fi -} - -setup_conda_cudatoolkit_plain_constraint() { - export CONDA_CPUONLY_FEATURE="" - export CMAKE_USE_CUDA=1 - if [[ "$(uname)" == Darwin ]]; then - export CONDA_CUDATOOLKIT_CONSTRAINT="" - export CMAKE_USE_CUDA=0 - else - case "$CU_VERSION" in - cu112) - export CONDA_CUDATOOLKIT_CONSTRAINT="cudatoolkit=11.2" - ;; - cu111) - export CONDA_CUDATOOLKIT_CONSTRAINT="cudatoolkit=11.1" - ;; - cu102) - export CONDA_CUDATOOLKIT_CONSTRAINT="cudatoolkit=10.2" - ;; - cu101) - export CONDA_CUDATOOLKIT_CONSTRAINT="cudatoolkit=10.1" - ;; - cu100) - export CONDA_CUDATOOLKIT_CONSTRAINT="cudatoolkit=10.0" - ;; - cu92) - export CONDA_CUDATOOLKIT_CONSTRAINT="cudatoolkit=9.2" - ;; - cpu) - export CONDA_CUDATOOLKIT_CONSTRAINT="" - export CONDA_CPUONLY_FEATURE="cpuonly" - export CMAKE_USE_CUDA=0 - ;; - *) - echo "Unrecognized CU_VERSION=$CU_VERSION" - exit 1 - ;; - esac - fi -} - -# Build the proper compiler package before building the final package -setup_visual_studio_constraint() { - if [[ "$OSTYPE" == "msys" ]]; then - export VSTOOLCHAIN_PACKAGE=vs$VC_YEAR - conda build $CONDA_CHANNEL_FLAGS --no-anaconda-upload packaging/$VSTOOLCHAIN_PACKAGE - cp packaging/$VSTOOLCHAIN_PACKAGE/conda_build_config.yaml packaging/torchvision/conda_build_config.yaml - fi -} - -setup_junit_results_folder() { - if [[ "$CI" == "true" ]]; then - export CONDA_PYTORCH_BUILD_RESULTS_DIRECTORY="${SOURCE_ROOT_DIR}/build_results/results.xml" - fi -} - - -download_copy_ffmpeg() { - if [[ "$OSTYPE" == "msys" ]]; then - # conda install -yq ffmpeg=4.2 -c pytorch - # curl -L -q https://anaconda.org/pytorch/ffmpeg/4.3/download/win-64/ffmpeg-4.3-ha925a31_0.tar.bz2 --output ffmpeg-4.3-ha925a31_0.tar.bz2 - # bzip2 --decompress --stdout ffmpeg-4.3-ha925a31_0.tar.bz2 | tar -x --file=- - # cp Library/bin/*.dll ../torchvision - echo "FFmpeg is disabled currently on Windows" - else - if [[ "$(uname)" == Darwin ]]; then - conda install -yq ffmpeg=4.2 -c pytorch - conda install -yq wget - else - # pushd ext_libraries - # wget -q https://anaconda.org/pytorch/ffmpeg/4.2/download/linux-64/ffmpeg-4.2-hf484d3e_0.tar.bz2 - # tar -xjvf ffmpeg-4.2-hf484d3e_0.tar.bz2 - # rm -rf ffmpeg-4.2-hf484d3e_0.tar.bz2 - # ldconfig - # which ffmpeg - # popd - echo "FFmpeg is disabled currently on Linux" - fi - fi -} diff --git a/packaging/post_build_script.sh b/packaging/post_build_script.sh new file mode 100644 index 0000000000000000000000000000000000000000..ae7542f9f8a97a7e66d255dba0f7925b5c8584fe --- /dev/null +++ b/packaging/post_build_script.sh @@ -0,0 +1,2 @@ +#!/bin/bash +LD_LIBRARY_PATH="/usr/local/lib:$CUDA_HOME/lib64:$LD_LIBRARY_PATH" python packaging/wheel/relocate.py diff --git a/packaging/pre_build_script.sh b/packaging/pre_build_script.sh new file mode 100644 index 0000000000000000000000000000000000000000..d52b4f9097785bf6925fa850f5ac6507ff8c397a --- /dev/null +++ b/packaging/pre_build_script.sh @@ -0,0 +1,50 @@ +#!/bin/bash +if [[ "$(uname)" == Darwin ]]; then + # Uninstall Conflicting jpeg brew formulae + jpeg_packages=$(brew list | grep jpeg) + echo "Existing Jpeg-related Brew libraries" + echo $jpeg_packages + for pkg in $jpeg_packages; do + brew uninstall --ignore-dependencies --force $pkg || true + done + + conda install -yq wget +fi + +if [[ "$(uname)" == Darwin || "$OSTYPE" == "msys" ]]; then + # Install libpng from Anaconda (defaults) + conda install libpng -yq + conda install -yq ffmpeg=4.2 libjpeg-turbo -c pytorch + + # Copy binaries to be included in the wheel distribution + if [[ "$OSTYPE" == "msys" ]]; then + python_exec="$(which python)" + bin_path=$(dirname $python_exec) + cp "$bin_path/Library/bin/libjpeg.dll" torchvision + fi +else + + if [[ "$ARCH" == "aarch64" ]]; then + conda install libpng -yq + conda install -yq ffmpeg=4.2 libjpeg-turbo -c pytorch-nightly + fi + + # Install native CentOS libJPEG, freetype and GnuTLS + yum install -y libjpeg-turbo-devel freetype gnutls + + # Download all the dependencies required to compile image and video_reader + # extensions + mkdir -p ext_libraries + pushd ext_libraries + popd + export PATH="$(pwd)/ext_libraries/bin:$PATH" + pip install auditwheel + + # Point to custom libraries + export LD_LIBRARY_PATH=$(pwd)/ext_libraries/lib:$LD_LIBRARY_PATH + export TORCHVISION_INCLUDE=$(pwd)/ext_libraries/include + export TORCHVISION_LIBRARY=$(pwd)/ext_libraries/lib +fi + +pip install numpy pyyaml future ninja +pip install --upgrade setuptools==72.1.0 diff --git a/packaging/torchvision/conda_build_config.yaml b/packaging/torchvision/conda_build_config.yaml index 257515c8b707fd7d6061f2ef47ea5396db2ead9f..a7c25c6d53475a8c3a32b0d30b9df35727c753f2 100644 --- a/packaging/torchvision/conda_build_config.yaml +++ b/packaging/torchvision/conda_build_config.yaml @@ -7,8 +7,7 @@ c_compiler: cxx_compiler: - vs2017 # [win] python: - - 3.5 - - 3.6 + - 3.8 # This differs from target_platform in that it determines what subdir the compiler # will target, not what subdir the compiler package will be itself. # For example, we need a win-64 vs2008_win-32 package, so that we compile win-32 diff --git a/packaging/torchvision/meta.yaml b/packaging/torchvision/meta.yaml index c9b6d04fdc793019eca612a9b2c3119d24e6643f..78ac930f8e52c7646c25b7e476a5ad108a5edfda 100644 --- a/packaging/torchvision/meta.yaml +++ b/packaging/torchvision/meta.yaml @@ -1,3 +1,4 @@ +{% set build_variant = environ.get('CONDA_BUILD_VARIANT', 'cpu') %} package: name: torchvision version: "{{ environ.get('BUILD_VERSION') }}" @@ -9,27 +10,36 @@ requirements: build: - {{ compiler('c') }} # [win] - libpng - # NOTE: Pinned to fix issues with size_t on Windows - - jpeg <=9b - # NOTE: The only ffmpeg version that we build is actually 4.2 - - ffmpeg >=4.2 # [not win] + - libjpeg-turbo + - ffmpeg >=4.2.2, <5.0.0 # [linux] host: - python - setuptools - {{ environ.get('CONDA_PYTORCH_BUILD_CONSTRAINT') }} - {{ environ.get('CONDA_CUDATOOLKIT_CONSTRAINT') }} - {{ environ.get('CONDA_CPUONLY_FEATURE') }} + - pytorch-mutex 1.0 {{ build_variant }} # [not osx ] + {{ environ.get('CONDA_PYTORCH_BUILD_CONSTRAINT', 'pytorch') }} + {{ environ.get('CONDA_CUDATOOLKIT_CONSTRAINT', '') }} run: - python + - defaults::numpy >=1.11 # [py <= 310] + - numpy >=1.23.5 # [py >= 311] + - requests - libpng - - ffmpeg >=4.2 # [not win] - # NOTE: Pinned to fix issues with size_t on Windows - - jpeg <=9b - - pillow >=5.3.0 - {{ environ.get('CONDA_PYTORCH_CONSTRAINT') }} - {{ environ.get('CONDA_CUDATOOLKIT_CONSTRAINT') }} + - ffmpeg >=4.2.2, <5.0.0 # [linux] + - libjpeg-turbo + - pillow >=5.3.0, !=8.3.* + - pytorch-mutex 1.0 {{ build_variant }} # [not osx ] + {{ environ.get('CONDA_PYTORCH_CONSTRAINT', 'pytorch') }} + {{ environ.get('CONDA_CUDATOOLKIT_CONSTRAINT', '') }} + + {% if build_variant == 'cpu' %} + run_constrained: + - cpuonly + {% elif not osx %} + run_constrained: + - cpuonly <0 + {% endif %} build: string: py{{py}}_{{ environ['CU_VERSION'] }} @@ -39,8 +49,7 @@ build: - FORCE_CUDA - BUILD_VERSION - TORCH_CUDA_ARCH_LIST - features: - {{ environ.get('CONDA_CPUONLY_FEATURE') }} + - MACOSX_DEPLOYMENT_TARGET test: imports: @@ -52,9 +61,7 @@ test: requires: - pytest - scipy - - av - # NOTE: Pinned to fix issues with size_t on Windows - - jpeg <=9b + - libjpeg-turbo - ca-certificates diff --git a/packaging/vs2017/activate.bat b/packaging/vs2017/activate.bat deleted file mode 100644 index ccecfc25442f0563990588edfb0e9f949a4b8af4..0000000000000000000000000000000000000000 --- a/packaging/vs2017/activate.bat +++ /dev/null @@ -1,44 +0,0 @@ -:: Set env vars that tell distutils to use the compiler that we put on path -SET DISTUTILS_USE_SDK=1 -SET MSSdk=1 - -SET "VS_VERSION=15.0" -SET "VS_MAJOR=15" -SET "VS_YEAR=2017" - -set "MSYS2_ARG_CONV_EXCL=/AI;/AL;/OUT;/out" -set "MSYS2_ENV_CONV_EXCL=CL" - -:: For Python 3.5+, ensure that we link with the dynamic runtime. See -:: http://stevedower.id.au/blog/building-for-python-3-5-part-two/ for more info -set "PY_VCRUNTIME_REDIST=%PREFIX%\\bin\\vcruntime140.dll" - -for /f "usebackq tokens=*" %%i in (`"%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" -legacy -products * -version [15^,16^) -property installationPath`) do ( - if exist "%%i" if exist "%%i\VC\Auxiliary\Build\vcvarsall.bat" ( - set "VSINSTALLDIR=%%i\" - goto :vswhere - ) -) - -:vswhere - -:: Shorten PATH to avoid the `input line too long` error. -SET MyPath=%PATH% - -setlocal EnableDelayedExpansion - -SET TempPath="%MyPath:;=";"%" -SET var= -FOR %%a IN (%TempPath%) DO ( - IF EXIST %%~sa ( - SET "var=!var!;%%~sa" - ) -) - -set "TempPath=!var:~1!" -endlocal & set "PATH=%TempPath%" - -:: Shorten current directory too -FOR %%A IN (.) DO CD "%%~sA" - -:: other things added by install_activate.bat at package build time diff --git a/packaging/vs2017/conda_build_config.yaml b/packaging/vs2017/conda_build_config.yaml deleted file mode 100644 index 5188bb0ebecf72aefb1c2e779458998216e4d479..0000000000000000000000000000000000000000 --- a/packaging/vs2017/conda_build_config.yaml +++ /dev/null @@ -1,24 +0,0 @@ -blas_impl: - - mkl # [x86_64] -c_compiler: - - vs2017 # [win] -cxx_compiler: - - vs2017 # [win] -python: - - 3.5 - - 3.6 -# This differs from target_platform in that it determines what subdir the compiler -# will target, not what subdir the compiler package will be itself. -# For example, we need a win-64 vs2008_win-32 package, so that we compile win-32 -# code on win-64 miniconda. -cross_compiler_target_platform: - - win-64 # [win] -target_platform: - - win-64 # [win] -vc: - - 14 -zip_keys: - - # [win] - - vc # [win] - - c_compiler # [win] - - cxx_compiler # [win] diff --git a/packaging/vs2017/install_activate.bat b/packaging/vs2017/install_activate.bat deleted file mode 100644 index de0e6ff3c5209233153adad34654c2f2b800aba2..0000000000000000000000000000000000000000 --- a/packaging/vs2017/install_activate.bat +++ /dev/null @@ -1,30 +0,0 @@ -set YEAR=2017 -set VER=15 - -mkdir "%PREFIX%\etc\conda\activate.d" -COPY "%RECIPE_DIR%\activate.bat" "%PREFIX%\etc\conda\activate.d\vs%YEAR%_compiler_vars.bat" - -IF "%cross_compiler_target_platform%" == "win-64" ( - set "target_platform=amd64" - echo SET "CMAKE_GENERATOR=Visual Studio %VER% %YEAR% Win64" >> "%PREFIX%\etc\conda\activate.d\vs%YEAR%_compiler_vars.bat" - echo pushd "%%VSINSTALLDIR%%" >> "%PREFIX%\etc\conda\activate.d\vs%YEAR%_compiler_vars.bat" - IF "%VSDEVCMD_ARGS%" == "" ( - echo CALL "VC\Auxiliary\Build\vcvarsall.bat" x64 >> "%PREFIX%\etc\conda\activate.d\vs%YEAR%_compiler_vars.bat" - echo popd >> "%PREFIX%\etc\conda\activate.d\vs%YEAR%_compiler_vars.bat" - echo pushd "%%VSINSTALLDIR%%" >> "%PREFIX%\etc\conda\activate.d\vs%YEAR%_compiler_vars.bat" - echo CALL "VC\Auxiliary\Build\vcvarsall.bat" x86_amd64 >> "%PREFIX%\etc\conda\activate.d\vs%YEAR%_compiler_vars.bat" - ) ELSE ( - echo CALL "VC\Auxiliary\Build\vcvarsall.bat" x64 %VSDEVCMD_ARGS% >> "%PREFIX%\etc\conda\activate.d\vs%YEAR%_compiler_vars.bat" - echo popd >> "%PREFIX%\etc\conda\activate.d\vs%YEAR%_compiler_vars.bat" - echo pushd "%%VSINSTALLDIR%%" >> "%PREFIX%\etc\conda\activate.d\vs%YEAR%_compiler_vars.bat" - echo CALL "VC\Auxiliary\Build\vcvarsall.bat" x86_amd64 %VSDEVCMD_ARGS% >> "%PREFIX%\etc\conda\activate.d\vs%YEAR%_compiler_vars.bat" - ) - echo popd >> "%PREFIX%\etc\conda\activate.d\vs%YEAR%_compiler_vars.bat" - ) else ( - set "target_platform=x86" - echo SET "CMAKE_GENERATOR=Visual Studio %VER% %YEAR%" >> "%PREFIX%\etc\conda\activate.d\vs%YEAR%_compiler_vars.bat" - echo pushd "%%VSINSTALLDIR%%" >> "%PREFIX%\etc\conda\activate.d\vs%YEAR%_compiler_vars.bat" - echo CALL "VC\Auxiliary\Build\vcvars32.bat" >> "%PREFIX%\etc\conda\activate.d\vs%YEAR%_compiler_vars.bat" - echo popd - ) - diff --git a/packaging/vs2017/install_runtime.bat b/packaging/vs2017/install_runtime.bat deleted file mode 100644 index 5163c16cf24d49092b6a4aa5cfb1d18a19cc1549..0000000000000000000000000000000000000000 --- a/packaging/vs2017/install_runtime.bat +++ /dev/null @@ -1,49 +0,0 @@ -set VC_PATH=x86 -if "%ARCH%"=="64" ( - set VC_PATH=x64 -) - -set MSC_VER=2017 - -rem :: This should always be present for VC installed with VS. Not sure about VC installed with Visual C++ Build Tools 2015 -rem FOR /F "usebackq tokens=3*" %%A IN (`REG QUERY "HKEY_LOCAL_MACHINE\Software\Microsoft\DevDiv\VC\Servicing\14.0\IDE.x64" /v UpdateVersion`) DO ( -rem set SP=%%A -rem ) - -rem if not "%SP%" == "%PKG_VERSION%" ( -rem echo "Version detected from registry: %SP%" -rem echo "does not match version of package being built (%PKG_VERSION%)" -rem echo "Do you have current updates for VS 2015 installed?" -rem exit 1 -rem ) - - -REM ========== REQUIRES Win 10 SDK be installed, or files otherwise copied to location below! -robocopy "C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\%VC_PATH%" "%LIBRARY_BIN%" *.dll /E -robocopy "C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\%VC_PATH%" "%PREFIX%" *.dll /E -if %ERRORLEVEL% GEQ 8 exit 1 - -REM ========== This one comes from visual studio 2017 -set "VC_VER=141" - -for /f "usebackq tokens=*" %%i in (`"%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" -legacy -products * -version [15^,16^) -property installationPath`) do ( - if exist "%%i" if exist "%%i\VC\Auxiliary\Build\vcvarsall.bat" ( - set "VS15VCVARSALL=%%i\VC\Auxiliary\Build\vcvarsall.bat" - goto :eof - ) -) - -@setlocal -call "%VS15VARSALL%" x64 - -set "REDIST_ROOT=%VCToolsRedistDir%%VC_PATH%" - -robocopy "%REDIST_ROOT%\Microsoft.VC%VC_VER%.CRT" "%LIBRARY_BIN%" *.dll /E -if %ERRORLEVEL% LSS 8 exit 0 -robocopy "%REDIST_ROOT%\Microsoft.VC%VC_VER%.CRT" "%PREFIX%" *.dll /E -if %ERRORLEVEL% LSS 8 exit 0 -robocopy "%REDIST_ROOT%\Microsoft.VC%VC_VER%.OpenMP" "%LIBRARY_BIN%" *.dll /E -if %ERRORLEVEL% LSS 8 exit 0 -robocopy "%REDIST_ROOT%\Microsoft.VC%VC_VER%.OpenMP" "%PREFIX%" *.dll /E -if %ERRORLEVEL% LSS 8 exit 0 -@endlocal diff --git a/packaging/vs2017/meta.yaml b/packaging/vs2017/meta.yaml deleted file mode 100644 index 1f569525ee176da433857aa6ae5a565350320549..0000000000000000000000000000000000000000 --- a/packaging/vs2017/meta.yaml +++ /dev/null @@ -1,24 +0,0 @@ -{% set vcver="14.1" %} -{% set vcfeature="14" %} -{% set vsyear="2017" %} -{% set fullver="15.4.27004.2010" %} - -package: - name: vs{{ vsyear }} - version: {{ fullver }} - -build: - skip: True [not win] - script_env: - - VSDEVCMD_ARGS # [win] - -outputs: - - name: vs{{ vsyear }}_{{ cross_compiler_target_platform }} - script: install_activate.bat - track_features: - # VS 2017 is binary-compatible with VS 2015/vc14. Tools are "v141". - strong: - - vc{{ vcfeature }} - about: - summary: Activation and version verification of MSVC {{ vcver }} (VS {{ vsyear }}) compiler - license: BSD 3-clause diff --git a/packaging/vs2019/conda_build_config.yaml b/packaging/vs2019/conda_build_config.yaml index 358052ec012940bb56778d167bcd69302d255846..b4dc99341d07a245acdfaf4383235230449943a1 100644 --- a/packaging/vs2019/conda_build_config.yaml +++ b/packaging/vs2019/conda_build_config.yaml @@ -5,8 +5,7 @@ c_compiler: cxx_compiler: - vs2019 # [win] python: - - 3.5 - - 3.6 + - 3.8 # This differs from target_platform in that it determines what subdir the compiler # will target, not what subdir the compiler package will be itself. # For example, we need a win-64 vs2008_win-32 package, so that we compile win-32 diff --git a/packaging/vs2019/install_activate.bat b/packaging/vs2019/install_activate.bat index 3c38253aa5dea3bdfc9f8cf4027e721376512154..9e60ccfd2dcb3b43cdd5a64c09029f753ca41e07 100644 --- a/packaging/vs2019/install_activate.bat +++ b/packaging/vs2019/install_activate.bat @@ -27,4 +27,3 @@ IF "%cross_compiler_target_platform%" == "win-64" ( echo CALL "VC\Auxiliary\Build\vcvars32.bat" >> "%PREFIX%\etc\conda\activate.d\vs%YEAR%_compiler_vars.bat" echo popd ) - diff --git a/packaging/vs2019/install_runtime.bat b/packaging/vs2019/install_runtime.bat deleted file mode 100644 index e09a5ccfb0f42cc6de2a2f960d31faf2511ae094..0000000000000000000000000000000000000000 --- a/packaging/vs2019/install_runtime.bat +++ /dev/null @@ -1,49 +0,0 @@ -set VC_PATH=x86 -if "%ARCH%"=="64" ( - set VC_PATH=x64 -) - -set MSC_VER=2019 - -rem :: This should always be present for VC installed with VS. Not sure about VC installed with Visual C++ Build Tools 2015 -rem FOR /F "usebackq tokens=3*" %%A IN (`REG QUERY "HKEY_LOCAL_MACHINE\Software\Microsoft\DevDiv\VC\Servicing\14.0\IDE.x64" /v UpdateVersion`) DO ( -rem set SP=%%A -rem ) - -rem if not "%SP%" == "%PKG_VERSION%" ( -rem echo "Version detected from registry: %SP%" -rem echo "does not match version of package being built (%PKG_VERSION%)" -rem echo "Do you have current updates for VS 2015 installed?" -rem exit 1 -rem ) - - -REM ========== REQUIRES Win 10 SDK be installed, or files otherwise copied to location below! -robocopy "C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\%VC_PATH%" "%LIBRARY_BIN%" *.dll /E -robocopy "C:\Program Files (x86)\Windows Kits\10\Redist\ucrt\DLLs\%VC_PATH%" "%PREFIX%" *.dll /E -if %ERRORLEVEL% GEQ 8 exit 1 - -REM ========== This one comes from visual studio 2019 -set "VC_VER=142" - -for /f "usebackq tokens=*" %%i in (`"%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" -legacy -products * -version [16^,17^) -property installationPath`) do ( - if exist "%%i" if exist "%%i\VC\Auxiliary\Build\vcvarsall.bat" ( - set "VS15VCVARSALL=%%i\VC\Auxiliary\Build\vcvarsall.bat" - goto :eof - ) -) - -@setlocal -call "%VS15VARSALL%" x64 - -set "REDIST_ROOT=%VCToolsRedistDir%%VC_PATH%" - -robocopy "%REDIST_ROOT%\Microsoft.VC%VC_VER%.CRT" "%LIBRARY_BIN%" *.dll /E -if %ERRORLEVEL% LSS 8 exit 0 -robocopy "%REDIST_ROOT%\Microsoft.VC%VC_VER%.CRT" "%PREFIX%" *.dll /E -if %ERRORLEVEL% LSS 8 exit 0 -robocopy "%REDIST_ROOT%\Microsoft.VC%VC_VER%.OpenMP" "%LIBRARY_BIN%" *.dll /E -if %ERRORLEVEL% LSS 8 exit 0 -robocopy "%REDIST_ROOT%\Microsoft.VC%VC_VER%.OpenMP" "%PREFIX%" *.dll /E -if %ERRORLEVEL% LSS 8 exit 0 -@endlocal diff --git a/packaging/wheel/linux_manywheel.sh b/packaging/wheel/linux_manywheel.sh deleted file mode 100644 index 19e7d1a7500613cb38794be173b1482bdcfd4318..0000000000000000000000000000000000000000 --- a/packaging/wheel/linux_manywheel.sh +++ /dev/null @@ -1,62 +0,0 @@ -#!/bin/bash -set -ex - -if [ "$#" -ne 1 ]; then - echo "Illegal number of parameters. Pass cuda version" - echo "CUDA version should be cu92, cu100 or cpu" - exit 1 -fi -export CUVER="$1" # cu[0-9]* cpu - -if [[ "$CUVER" == "cu102" ]]; then - cu_suffix="" -else - cu_suffix="+$CUVER" -fi - -export TORCHVISION_BUILD_VERSION="0.4.0.dev$(date "+%Y%m%d")${cu_suffix}" -export TORCHVISION_BUILD_NUMBER="1" -export TORCHVISION_LOCAL_VERSION_LABEL="$CUVER" -export OUT_DIR="/remote/$CUVER" - -pushd /opt/python -DESIRED_PYTHON=(*/) -popd -for desired_py in "${DESIRED_PYTHON[@]}"; do - python_installations+=("/opt/python/$desired_py") -done - -OLD_PATH=$PATH -cd /tmp -rm -rf vision -git clone https://github.com/pytorch/vision - -cd /tmp/vision - -for PYDIR in "${python_installations[@]}"; do - export PATH=$PYDIR/bin:$OLD_PATH - pip install --upgrade pip - pip install numpy pyyaml future - - pip uninstall -y torch || true - pip uninstall -y torch_nightly || true - - export TORCHVISION_PYTORCH_DEPENDENCY_NAME=torch_nightly - pip install torch_nightly -f https://download.pytorch.org/whl/nightly/$CUVER/torch_nightly.html - # CPU/CUDA variants of PyTorch have ABI compatible PyTorch for - # the CPU only bits. Therefore, we - # strip off the local package qualifier, but ONLY if we're - # doing a CPU build. - if [[ "$CUVER" == "cpu" ]]; then - export TORCHVISION_PYTORCH_DEPENDENCY_VERSION="$(pip show torch_nightly | grep ^Version: | sed 's/Version: \+//' | sed 's/+.\+//')" - else - export TORCHVISION_PYTORCH_DEPENDENCY_VERSION="$(pip show torch_nightly | grep ^Version: | sed 's/Version: \+//')" - fi - echo "Building against ${TORCHVISION_PYTORCH_DEPENDENCY_VERSION}" - - pip install ninja - python setup.py clean - python setup.py bdist_wheel - mkdir -p $OUT_DIR - cp dist/*.whl $OUT_DIR/ -done diff --git a/packaging/wheel/osx_wheel.sh b/packaging/wheel/osx_wheel.sh deleted file mode 100644 index 900485d319954b6ec585c69da31edae7e39ad4d8..0000000000000000000000000000000000000000 --- a/packaging/wheel/osx_wheel.sh +++ /dev/null @@ -1,52 +0,0 @@ -if [[ ":$PATH:" == *"conda"* ]]; then - echo "existing anaconda install in PATH, remove it and run script" - exit 1 -fi -# download and activate anaconda -rm -rf ~/minconda_wheel_env_tmp -wget -q https://repo.anaconda.com/miniconda/Miniconda3-latest-MacOSX-x86_64.sh && \ - chmod +x Miniconda3-latest-MacOSX-x86_64.sh && \ - ./Miniconda3-latest-MacOSX-x86_64.sh -b -p ~/minconda_wheel_env_tmp && \ - rm Miniconda3-latest-MacOSX-x86_64.sh - -. ~/minconda_wheel_env_tmp/bin/activate - - -export TORCHVISION_BUILD_VERSION="0.4.0.dev$(date "+%Y%m%d")" -export TORCHVISION_BUILD_NUMBER="1" -export OUT_DIR=~/torchvision_wheels - -export MACOSX_DEPLOYMENT_TARGET=10.9 CC=clang CXX=clang++ - -pushd /tmp -rm -rf vision -git clone https://github.com/pytorch/vision -pushd vision - -desired_pythons=( "2.7" "3.5" "3.6" "3.7" ) -# for each python -for desired_python in "${desired_pythons[@]}" -do - # create and activate python env - env_name="env$desired_python" - conda create -yn $env_name python="$desired_python" - conda activate $env_name - - pip uninstall -y torch || true - pip uninstall -y torch_nightly || true - - export TORCHVISION_PYTORCH_DEPENDENCY_NAME=torch_nightly - pip install torch_nightly -f https://download.pytorch.org/whl/nightly/cpu/torch_nightly.html - export TORCHVISION_PYTORCH_DEPENDENCY_VERSION="$(pip show torch_nightly | grep ^Version: | sed 's/Version: *//')" - echo "Building against ${TORCHAUDIO_PYTORCH_DEPENDENCY_VERSION}" - - # install torchvision dependencies - pip install ninja scipy pytest - - python setup.py clean - python setup.py bdist_wheel - mkdir -p $OUT_DIR - cp dist/*.whl $OUT_DIR/ -done -popd -popd diff --git a/packaging/wheel/relocate.py b/packaging/wheel/relocate.py index dd2c5d2a4ce7bbfec673c17397d9f600b6f7389c..fb110abd873def571154fe219f1a589dccb9eb06 100644 --- a/packaging/wheel/relocate.py +++ b/packaging/wheel/relocate.py @@ -1,47 +1,60 @@ -# -*- coding: utf-8 -*- - """Helper script to package wheels and relocate binaries.""" -# Standard library imports -import os -import io -import sys import glob -import shutil -import zipfile import hashlib + +# Standard library imports +import os +import os.path as osp import platform +import shutil import subprocess -import os.path as osp +import sys +import zipfile from base64 import urlsafe_b64encode # Third party imports -if sys.platform == 'linux': +if sys.platform == "linux": from auditwheel.lddtree import lddtree -from wheel.bdist_wheel import get_abi_tag ALLOWLIST = { - 'libgcc_s.so.1', 'libstdc++.so.6', 'libm.so.6', - 'libdl.so.2', 'librt.so.1', 'libc.so.6', - 'libnsl.so.1', 'libutil.so.1', 'libpthread.so.0', - 'libresolv.so.2', 'libX11.so.6', 'libXext.so.6', - 'libXrender.so.1', 'libICE.so.6', 'libSM.so.6', - 'libGL.so.1', 'libgobject-2.0.so.0', 'libgthread-2.0.so.0', - 'libglib-2.0.so.0', 'ld-linux-x86-64.so.2', 'ld-2.17.so' + "libgcc_s.so.1", + "libstdc++.so.6", + "libm.so.6", + "libdl.so.2", + "librt.so.1", + "libc.so.6", + "libnsl.so.1", + "libutil.so.1", + "libpthread.so.0", + "libresolv.so.2", + "libX11.so.6", + "libXext.so.6", + "libXrender.so.1", + "libICE.so.6", + "libSM.so.6", + "libGL.so.1", + "libgobject-2.0.so.0", + "libgthread-2.0.so.0", + "libglib-2.0.so.0", + "ld-linux-x86-64.so.2", + "ld-2.17.so", } WINDOWS_ALLOWLIST = { - 'MSVCP140.dll', 'KERNEL32.dll', - 'VCRUNTIME140_1.dll', 'VCRUNTIME140.dll', - 'api-ms-win-crt-heap-l1-1-0.dll', - 'api-ms-win-crt-runtime-l1-1-0.dll', - 'api-ms-win-crt-stdio-l1-1-0.dll', - 'api-ms-win-crt-filesystem-l1-1-0.dll', - 'api-ms-win-crt-string-l1-1-0.dll', - 'api-ms-win-crt-environment-l1-1-0.dll', - 'api-ms-win-crt-math-l1-1-0.dll', - 'api-ms-win-crt-convert-l1-1-0.dll' + "MSVCP140.dll", + "KERNEL32.dll", + "VCRUNTIME140_1.dll", + "VCRUNTIME140.dll", + "api-ms-win-crt-heap-l1-1-0.dll", + "api-ms-win-crt-runtime-l1-1-0.dll", + "api-ms-win-crt-stdio-l1-1-0.dll", + "api-ms-win-crt-filesystem-l1-1-0.dll", + "api-ms-win-crt-string-l1-1-0.dll", + "api-ms-win-crt-environment-l1-1-0.dll", + "api-ms-win-crt-math-l1-1-0.dll", + "api-ms-win-crt-convert-l1-1-0.dll", } @@ -51,33 +64,22 @@ PLATFORM_ARCH = platform.machine() PYTHON_VERSION = sys.version_info -def read_chunks(file, size=io.DEFAULT_BUFFER_SIZE): - """Yield pieces of data from a file-like object until EOF.""" - while True: - chunk = file.read(size) - if not chunk: - break - yield chunk - - def rehash(path, blocksize=1 << 20): """Return (hash, length) for path using hashlib.sha256()""" h = hashlib.sha256() length = 0 - with open(path, 'rb') as f: - for block in read_chunks(f, size=blocksize): + with open(path, "rb") as f: + while block := f.read(blocksize): length += len(block) h.update(block) - digest = 'sha256=' + urlsafe_b64encode( - h.digest() - ).decode('latin1').rstrip('=') + digest = "sha256=" + urlsafe_b64encode(h.digest()).decode("latin1").rstrip("=") # unicode/str python2 issues return (digest, str(length)) # type: ignore def unzip_file(file, dest): """Decompress zip `file` into directory `dest`.""" - with zipfile.ZipFile(file, 'r') as zip_ref: + with zipfile.ZipFile(file, "r") as zip_ref: zip_ref.extractall(dest) @@ -88,8 +90,7 @@ def is_program_installed(basename): On macOS systems, a .app is considered installed if it exists. """ - if (sys.platform == 'darwin' and basename.endswith('.app') and - osp.exists(basename)): + if sys.platform == "darwin" and basename.endswith(".app") and osp.exists(basename): return basename for path in os.environ["PATH"].split(os.pathsep): @@ -105,9 +106,9 @@ def find_program(basename): (return None if not found) """ names = [basename] - if os.name == 'nt': + if os.name == "nt": # Windows platforms - extensions = ('.exe', '.bat', '.cmd', '.dll') + extensions = (".exe", ".bat", ".cmd", ".dll") if not basename.endswith(extensions): names = [basename + ext for ext in extensions] + [basename] for name in names: @@ -118,19 +119,18 @@ def find_program(basename): def patch_new_path(library_path, new_dir): library = osp.basename(library_path) - name, *rest = library.split('.') - rest = '.'.join(rest) - hash_id = hashlib.sha256(library_path.encode('utf-8')).hexdigest()[:8] - new_name = '.'.join([name, hash_id, rest]) + name, *rest = library.split(".") + rest = ".".join(rest) + hash_id = hashlib.sha256(library_path.encode("utf-8")).hexdigest()[:8] + new_name = ".".join([name, hash_id, rest]) return osp.join(new_dir, new_name) def find_dll_dependencies(dumpbin, binary): - out = subprocess.run([dumpbin, "/dependents", binary], - stdout=subprocess.PIPE) - out = out.stdout.strip().decode('utf-8') - start_index = out.find('dependencies:') + len('dependencies:') - end_index = out.find('Summary') + out = subprocess.run([dumpbin, "/dependents", binary], stdout=subprocess.PIPE) + out = out.stdout.strip().decode("utf-8") + start_index = out.find("dependencies:") + len("dependencies:") + end_index = out.find("Summary") dlls = out[start_index:end_index].strip() dlls = dlls.split(os.linesep) dlls = [dll.strip() for dll in dlls] @@ -145,13 +145,13 @@ def relocate_elf_library(patchelf, output_dir, output_library, binary): rename and copy them into the wheel while updating their respective rpaths. """ - print('Relocating {0}'.format(binary)) + print(f"Relocating {binary}") binary_path = osp.join(output_library, binary) ld_tree = lddtree(binary_path) - tree_libs = ld_tree['libs'] + tree_libs = ld_tree["libs"] - binary_queue = [(n, binary) for n in ld_tree['needed']] + binary_queue = [(n, binary) for n in ld_tree["needed"]] binary_paths = {binary: binary_path} binary_dependencies = {} @@ -160,13 +160,13 @@ def relocate_elf_library(patchelf, output_dir, output_library, binary): library_info = tree_libs[library] print(library) - if library_info['path'] is None: - print('Omitting {0}'.format(library)) + if library_info["path"] is None: + print(f"Omitting {library}") continue if library in ALLOWLIST: # Omit glibc/gcc/system libraries - print('Omitting {0}'.format(library)) + print(f"Omitting {library}") continue parent_dependencies = binary_dependencies.get(parent, []) @@ -176,12 +176,12 @@ def relocate_elf_library(patchelf, output_dir, output_library, binary): if library in binary_paths: continue - binary_paths[library] = library_info['path'] - binary_queue += [(n, library) for n in library_info['needed']] + binary_paths[library] = library_info["path"] + binary_queue += [(n, library) for n in library_info["needed"]] - print('Copying dependencies to wheel directory') - new_libraries_path = osp.join(output_dir, 'torchvision.libs') - os.makedirs(new_libraries_path) + print("Copying dependencies to wheel directory") + new_libraries_path = osp.join(output_dir, "torchvision.libs") + os.makedirs(new_libraries_path, exist_ok=True) new_names = {binary: binary_path} @@ -189,11 +189,11 @@ def relocate_elf_library(patchelf, output_dir, output_library, binary): if library != binary: library_path = binary_paths[library] new_library_path = patch_new_path(library_path, new_libraries_path) - print('{0} -> {1}'.format(library, new_library_path)) + print(f"{library} -> {new_library_path}") shutil.copyfile(library_path, new_library_path) new_names[library] = new_library_path - print('Updating dependency names by new files') + print("Updating dependency names by new files") for library in binary_paths: if library != binary: if library not in binary_dependencies: @@ -202,59 +202,26 @@ def relocate_elf_library(patchelf, output_dir, output_library, binary): new_library_name = new_names[library] for dep in library_dependencies: new_dep = osp.basename(new_names[dep]) - print('{0}: {1} -> {2}'.format(library, dep, new_dep)) + print(f"{library}: {dep} -> {new_dep}") subprocess.check_output( - [ - patchelf, - '--replace-needed', - dep, - new_dep, - new_library_name - ], - cwd=new_libraries_path) - - print('Updating library rpath') - subprocess.check_output( - [ - patchelf, - '--set-rpath', - "$ORIGIN", - new_library_name - ], - cwd=new_libraries_path) - - subprocess.check_output( - [ - patchelf, - '--print-rpath', - new_library_name - ], - cwd=new_libraries_path) + [patchelf, "--replace-needed", dep, new_dep, new_library_name], cwd=new_libraries_path + ) + + print("Updating library rpath") + subprocess.check_output([patchelf, "--set-rpath", "$ORIGIN", new_library_name], cwd=new_libraries_path) + + subprocess.check_output([patchelf, "--print-rpath", new_library_name], cwd=new_libraries_path) print("Update library dependencies") library_dependencies = binary_dependencies[binary] for dep in library_dependencies: new_dep = osp.basename(new_names[dep]) - print('{0}: {1} -> {2}'.format(binary, dep, new_dep)) - subprocess.check_output( - [ - patchelf, - '--replace-needed', - dep, - new_dep, - binary - ], - cwd=output_library) - - print('Update library rpath') + print(f"{binary}: {dep} -> {new_dep}") + subprocess.check_output([patchelf, "--replace-needed", dep, new_dep, binary], cwd=output_library) + + print("Update library rpath") subprocess.check_output( - [ - patchelf, - '--set-rpath', - "$ORIGIN:$ORIGIN/../torchvision.libs", - binary_path - ], - cwd=output_library + [patchelf, "--set-rpath", "$ORIGIN:$ORIGIN/../torchvision.libs", binary_path], cwd=output_library ) @@ -265,7 +232,7 @@ def relocate_dll_library(dumpbin, output_dir, output_library, binary): Given a shared library, find the transitive closure of its dependencies, rename and copy them into the wheel. """ - print('Relocating {0}'.format(binary)) + print(f"Relocating {binary}") binary_path = osp.join(output_library, binary) library_dlls = find_dll_dependencies(dumpbin, binary_path) @@ -275,19 +242,19 @@ def relocate_dll_library(dumpbin, output_dir, output_library, binary): while binary_queue != []: library, parent = binary_queue.pop(0) - if library in WINDOWS_ALLOWLIST or library.startswith('api-ms-win'): - print('Omitting {0}'.format(library)) + if library in WINDOWS_ALLOWLIST or library.startswith("api-ms-win"): + print(f"Omitting {library}") continue library_path = find_program(library) if library_path is None: - print('{0} not found'.format(library)) + print(f"{library} not found") continue - if osp.basename(osp.dirname(library_path)) == 'system32': + if osp.basename(osp.dirname(library_path)) == "system32": continue - print('{0}: {1}'.format(library, library_path)) + print(f"{library}: {library_path}") parent_dependencies = binary_dependencies.get(parent, []) parent_dependencies.append(library) binary_dependencies[parent] = parent_dependencies @@ -299,55 +266,54 @@ def relocate_dll_library(dumpbin, output_dir, output_library, binary): downstream_dlls = find_dll_dependencies(dumpbin, library_path) binary_queue += [(n, library) for n in downstream_dlls] - print('Copying dependencies to wheel directory') - package_dir = osp.join(output_dir, 'torchvision') + print("Copying dependencies to wheel directory") + package_dir = osp.join(output_dir, "torchvision") for library in binary_paths: if library != binary: library_path = binary_paths[library] new_library_path = osp.join(package_dir, library) - print('{0} -> {1}'.format(library, new_library_path)) + print(f"{library} -> {new_library_path}") shutil.copyfile(library_path, new_library_path) def compress_wheel(output_dir, wheel, wheel_dir, wheel_name): """Create RECORD file and compress wheel distribution.""" - print('Update RECORD file in wheel') - dist_info = glob.glob(osp.join(output_dir, '*.dist-info'))[0] - record_file = osp.join(dist_info, 'RECORD') + print("Update RECORD file in wheel") + dist_info = glob.glob(osp.join(output_dir, "*.dist-info"))[0] + record_file = osp.join(dist_info, "RECORD") - with open(record_file, 'w') as f: + with open(record_file, "w") as f: for root, _, files in os.walk(output_dir): for this_file in files: full_file = osp.join(root, this_file) rel_file = osp.relpath(full_file, output_dir) if full_file == record_file: - f.write('{0},,\n'.format(rel_file)) + f.write(f"{rel_file},,\n") else: digest, size = rehash(full_file) - f.write('{0},{1},{2}\n'.format(rel_file, digest, size)) + f.write(f"{rel_file},{digest},{size}\n") - print('Compressing wheel') + print("Compressing wheel") base_wheel_name = osp.join(wheel_dir, wheel_name) - shutil.make_archive(base_wheel_name, 'zip', output_dir) + shutil.make_archive(base_wheel_name, "zip", output_dir) os.remove(wheel) - shutil.move('{0}.zip'.format(base_wheel_name), wheel) + shutil.move(f"{base_wheel_name}.zip", wheel) shutil.rmtree(output_dir) def patch_linux(): # Get patchelf location - patchelf = find_program('patchelf') + patchelf = find_program("patchelf") if patchelf is None: - raise FileNotFoundError('Patchelf was not found in the system, please' - ' make sure that is available on the PATH.') + raise FileNotFoundError("Patchelf was not found in the system, please make sure that is available on the PATH.") # Find wheel - print('Finding wheels...') - wheels = glob.glob(osp.join(PACKAGE_ROOT, 'dist', '*.whl')) - output_dir = osp.join(PACKAGE_ROOT, 'dist', '.wheel-process') + print("Finding wheels...") + wheels = glob.glob(osp.join(PACKAGE_ROOT, "dist", "*.whl")) + output_dir = osp.join(PACKAGE_ROOT, "dist", ".wheel-process") - image_binary = 'image.so' - video_binary = 'video_reader.so' + image_binary = "image.so" + video_binary = "video_reader.so" torchvision_binaries = [image_binary, video_binary] for wheel in wheels: if osp.exists(output_dir): @@ -355,37 +321,35 @@ def patch_linux(): os.makedirs(output_dir) - print('Unzipping wheel...') + print("Unzipping wheel...") wheel_file = osp.basename(wheel) wheel_dir = osp.dirname(wheel) - print('{0}'.format(wheel_file)) + print(f"{wheel_file}") wheel_name, _ = osp.splitext(wheel_file) unzip_file(wheel, output_dir) - print('Finding ELF dependencies...') - output_library = osp.join(output_dir, 'torchvision') + print("Finding ELF dependencies...") + output_library = osp.join(output_dir, "torchvision") for binary in torchvision_binaries: if osp.exists(osp.join(output_library, binary)): - relocate_elf_library( - patchelf, output_dir, output_library, binary) + relocate_elf_library(patchelf, output_dir, output_library, binary) compress_wheel(output_dir, wheel, wheel_dir, wheel_name) def patch_win(): # Get dumpbin location - dumpbin = find_program('dumpbin') + dumpbin = find_program("dumpbin") if dumpbin is None: - raise FileNotFoundError('Dumpbin was not found in the system, please' - ' make sure that is available on the PATH.') + raise FileNotFoundError("Dumpbin was not found in the system, please make sure that is available on the PATH.") # Find wheel - print('Finding wheels...') - wheels = glob.glob(osp.join(PACKAGE_ROOT, 'dist', '*.whl')) - output_dir = osp.join(PACKAGE_ROOT, 'dist', '.wheel-process') + print("Finding wheels...") + wheels = glob.glob(osp.join(PACKAGE_ROOT, "dist", "*.whl")) + output_dir = osp.join(PACKAGE_ROOT, "dist", ".wheel-process") - image_binary = 'image.pyd' - video_binary = 'video_reader.pyd' + image_binary = "image.pyd" + video_binary = "video_reader.pyd" torchvision_binaries = [image_binary, video_binary] for wheel in wheels: if osp.exists(output_dir): @@ -393,25 +357,24 @@ def patch_win(): os.makedirs(output_dir) - print('Unzipping wheel...') + print("Unzipping wheel...") wheel_file = osp.basename(wheel) wheel_dir = osp.dirname(wheel) - print('{0}'.format(wheel_file)) + print(f"{wheel_file}") wheel_name, _ = osp.splitext(wheel_file) unzip_file(wheel, output_dir) - print('Finding DLL/PE dependencies...') - output_library = osp.join(output_dir, 'torchvision') + print("Finding DLL/PE dependencies...") + output_library = osp.join(output_dir, "torchvision") for binary in torchvision_binaries: if osp.exists(osp.join(output_library, binary)): - relocate_dll_library( - dumpbin, output_dir, output_library, binary) + relocate_dll_library(dumpbin, output_dir, output_library, binary) compress_wheel(output_dir, wheel, wheel_dir, wheel_name) -if __name__ == '__main__': - if sys.platform == 'linux': +if __name__ == "__main__": + if sys.platform == "linux": patch_linux() - elif sys.platform == 'win32': + elif sys.platform == "win32": patch_win() diff --git a/packaging/windows/internal/build_cpp_example.bat b/packaging/windows/internal/build_cpp_example.bat index e3f7afe9f02c5915fdd22f5c22164286349ab58a..129c574e391f9cada571712c604a2ce41157542c 100644 --- a/packaging/windows/internal/build_cpp_example.bat +++ b/packaging/windows/internal/build_cpp_example.bat @@ -1,3 +1,3 @@ @echo on set CL=/I"C:\Program Files (x86)\torchvision\include" -msbuild "-p:Configuration=Release" "-p:BuildInParallel=true" "-p:MultiProcessorCompilation=true" "-p:CL_MPCount=%1" hello-world.vcxproj -maxcpucount:%1 +msbuild "-p:Configuration=Release" "-p:BuildInParallel=true" "-p:MultiProcessorCompilation=true" "-p:CL_MPCount=%1" run_model.vcxproj -maxcpucount:%1 diff --git a/packaging/windows/internal/build_frcnn.bat b/packaging/windows/internal/build_frcnn.bat deleted file mode 100644 index 36e3757d01cb18d81938a334767c6ca2b7fcfde2..0000000000000000000000000000000000000000 --- a/packaging/windows/internal/build_frcnn.bat +++ /dev/null @@ -1,3 +0,0 @@ -@echo on -set CL=/I"C:\Program Files (x86)\torchvision\include" -msbuild "-p:Configuration=Release" "-p:BuildInParallel=true" "-p:MultiProcessorCompilation=true" "-p:CL_MPCount=%1" test_frcnn_tracing.vcxproj -maxcpucount:%1 diff --git a/packaging/windows/internal/cuda_install.bat b/packaging/windows/internal/cuda_install.bat deleted file mode 100644 index 9ca08e1cfbbe2e8f0999f41e9869a8a7dc7e3cff..0000000000000000000000000000000000000000 --- a/packaging/windows/internal/cuda_install.bat +++ /dev/null @@ -1,201 +0,0 @@ -@echo on - -if "%CU_VERSION%" == "cpu" ( - echo Skipping for CPU builds - exit /b 0 -) - -set SRC_DIR=%~dp0\.. - -if not exist "%SRC_DIR%\temp_build" mkdir "%SRC_DIR%\temp_build" - -set /a CUDA_VER=%CU_VERSION:cu=% -set CUDA_VER_MAJOR=%CUDA_VER:~0,-1% -set CUDA_VER_MINOR=%CUDA_VER:~-1,1% -set CUDA_VERSION_STR=%CUDA_VER_MAJOR%.%CUDA_VER_MINOR% - -if %CUDA_VER% EQU 92 goto cuda92 -if %CUDA_VER% EQU 100 goto cuda100 -if %CUDA_VER% EQU 101 goto cuda101 -if %CUDA_VER% EQU 102 goto cuda102 -if %CUDA_VER% EQU 110 goto cuda110 -if %CUDA_VER% EQU 111 goto cuda111 -if %CUDA_VER% EQU 112 goto cuda112 - -echo CUDA %CUDA_VERSION_STR% is not supported -exit /b 1 - -:cuda92 -if not exist "%SRC_DIR%\temp_build\cuda_9.2.148_win10.exe" ( - curl -k -L https://ossci-windows.s3.amazonaws.com/win2016/cuda_9.2.148_win10.exe --output "%SRC_DIR%\temp_build\cuda_9.2.148_win10.exe" - if errorlevel 1 exit /b 1 - set "CUDA_SETUP_FILE=%SRC_DIR%\temp_build\cuda_9.2.148_win10.exe" - set "ARGS=nvcc_9.2 cuobjdump_9.2 nvprune_9.2 cupti_9.2 cublas_9.2 cublas_dev_9.2 cudart_9.2 cufft_9.2 cufft_dev_9.2 curand_9.2 curand_dev_9.2 cusolver_9.2 cusolver_dev_9.2 cusparse_9.2 cusparse_dev_9.2 nvgraph_9.2 nvgraph_dev_9.2 npp_9.2 npp_dev_9.2 nvrtc_9.2 nvrtc_dev_9.2 nvml_dev_9.2" -) - -if not exist "%SRC_DIR%\temp_build\cudnn-9.2-windows10-x64-v7.2.1.38.zip" ( - curl -k -L https://ossci-windows.s3.amazonaws.com/win2016/cudnn-9.2-windows10-x64-v7.2.1.38.zip --output "%SRC_DIR%\temp_build\cudnn-9.2-windows10-x64-v7.2.1.38.zip" - if errorlevel 1 exit /b 1 - set "CUDNN_SETUP_FILE=%SRC_DIR%\temp_build\cudnn-9.2-windows10-x64-v7.2.1.38.zip" -) - -goto cuda_common - -:cuda100 - -if not exist "%SRC_DIR%\temp_build\cuda_10.0.130_411.31_win10.exe" ( - curl -k -L https://ossci-windows.s3.amazonaws.com/win2016/cuda_10.0.130_411.31_win10.exe --output "%SRC_DIR%\temp_build\cuda_10.0.130_411.31_win10.exe" - if errorlevel 1 exit /b 1 - set "CUDA_SETUP_FILE=%SRC_DIR%\temp_build\cuda_10.0.130_411.31_win10.exe" - set "ARGS=nvcc_10.0 cuobjdump_10.0 nvprune_10.0 cupti_10.0 cublas_10.0 cublas_dev_10.0 cudart_10.0 cufft_10.0 cufft_dev_10.0 curand_10.0 curand_dev_10.0 cusolver_10.0 cusolver_dev_10.0 cusparse_10.0 cusparse_dev_10.0 nvgraph_10.0 nvgraph_dev_10.0 npp_10.0 npp_dev_10.0 nvrtc_10.0 nvrtc_dev_10.0 nvml_dev_10.0" -) - -if not exist "%SRC_DIR%\temp_build\cudnn-10.0-windows10-x64-v7.4.1.5.zip" ( - curl -k -L https://ossci-windows.s3.amazonaws.com/win2016/cudnn-10.0-windows10-x64-v7.4.1.5.zip --output "%SRC_DIR%\temp_build\cudnn-10.0-windows10-x64-v7.4.1.5.zip" - if errorlevel 1 exit /b 1 - set "CUDNN_SETUP_FILE=%SRC_DIR%\temp_build\cudnn-10.0-windows10-x64-v7.4.1.5.zip" -) - -goto cuda_common - -:cuda101 - -if not exist "%SRC_DIR%\temp_build\cuda_10.1.243_426.00_win10.exe" ( - curl -k -L https://ossci-windows.s3.amazonaws.com/cuda_10.1.243_426.00_win10.exe --output "%SRC_DIR%\temp_build\cuda_10.1.243_426.00_win10.exe" - if errorlevel 1 exit /b 1 - set "CUDA_SETUP_FILE=%SRC_DIR%\temp_build\cuda_10.1.243_426.00_win10.exe" - set "ARGS=nvcc_10.1 cuobjdump_10.1 nvprune_10.1 cupti_10.1 cublas_10.1 cublas_dev_10.1 cudart_10.1 cufft_10.1 cufft_dev_10.1 curand_10.1 curand_dev_10.1 cusolver_10.1 cusolver_dev_10.1 cusparse_10.1 cusparse_dev_10.1 nvgraph_10.1 nvgraph_dev_10.1 npp_10.1 npp_dev_10.1 nvrtc_10.1 nvrtc_dev_10.1 nvml_dev_10.1" -) - -if not exist "%SRC_DIR%\temp_build\cudnn-10.1-windows10-x64-v7.6.4.38.zip" ( - curl -k -L https://ossci-windows.s3.amazonaws.com/cudnn-10.1-windows10-x64-v7.6.4.38.zip --output "%SRC_DIR%\temp_build\cudnn-10.1-windows10-x64-v7.6.4.38.zip" - if errorlevel 1 exit /b 1 - set "CUDNN_SETUP_FILE=%SRC_DIR%\temp_build\cudnn-10.1-windows10-x64-v7.6.4.38.zip" -) - -goto cuda_common - -:cuda102 - -if not exist "%SRC_DIR%\temp_build\cuda_10.2.89_441.22_win10.exe" ( - curl -k -L https://ossci-windows.s3.amazonaws.com/cuda_10.2.89_441.22_win10.exe --output "%SRC_DIR%\temp_build\cuda_10.2.89_441.22_win10.exe" - if errorlevel 1 exit /b 1 - set "CUDA_SETUP_FILE=%SRC_DIR%\temp_build\cuda_10.2.89_441.22_win10.exe" - set "ARGS=nvcc_10.2 cuobjdump_10.2 nvprune_10.2 cupti_10.2 cublas_10.2 cublas_dev_10.2 cudart_10.2 cufft_10.2 cufft_dev_10.2 curand_10.2 curand_dev_10.2 cusolver_10.2 cusolver_dev_10.2 cusparse_10.2 cusparse_dev_10.2 nvgraph_10.2 nvgraph_dev_10.2 npp_10.2 npp_dev_10.2 nvrtc_10.2 nvrtc_dev_10.2 nvml_dev_10.2" -) - -if not exist "%SRC_DIR%\temp_build\cudnn-10.2-windows10-x64-v7.6.5.32.zip" ( - curl -k -L https://ossci-windows.s3.amazonaws.com/cudnn-10.2-windows10-x64-v7.6.5.32.zip --output "%SRC_DIR%\temp_build\cudnn-10.2-windows10-x64-v7.6.5.32.zip" - if errorlevel 1 exit /b 1 - set "CUDNN_SETUP_FILE=%SRC_DIR%\temp_build\cudnn-10.2-windows10-x64-v7.6.5.32.zip" -) - -goto cuda_common - -:cuda110 - -if not exist "%SRC_DIR%\temp_build\cuda_11.0.2_451.48_win10.exe" ( - curl -k -L https://ossci-windows.s3.amazonaws.com/cuda_11.0.2_451.48_win10.exe --output "%SRC_DIR%\temp_build\cuda_11.0.2_451.48_win10.exe" - if errorlevel 1 exit /b 1 - set "CUDA_SETUP_FILE=%SRC_DIR%\temp_build\cuda_11.0.2_451.48_win10.exe" - set "ARGS=nvcc_11.0 cuobjdump_11.0 nvprune_11.0 nvprof_11.0 cupti_11.0 cublas_11.0 cublas_dev_11.0 cudart_11.0 cufft_11.0 cufft_dev_11.0 curand_11.0 curand_dev_11.0 cusolver_11.0 cusolver_dev_11.0 cusparse_11.0 cusparse_dev_11.0 npp_11.0 npp_dev_11.0 nvrtc_11.0 nvrtc_dev_11.0 nvml_dev_11.0" -) - -if not exist "%SRC_DIR%\temp_build\cudnn-11.0-windows-x64-v8.0.4.30.zip" ( - curl -k -L https://ossci-windows.s3.amazonaws.com/cudnn-11.0-windows-x64-v8.0.4.30.zip --output "%SRC_DIR%\temp_build\cudnn-11.0-windows-x64-v8.0.4.30.zip" - if errorlevel 1 exit /b 1 - set "CUDNN_SETUP_FILE=%SRC_DIR%\temp_build\cudnn-11.0-windows-x64-v8.0.4.30.zip" -) - -goto cuda_common - -:cuda111 - -if not exist "%SRC_DIR%\temp_build\cuda_11.1.0_456.43_win10.exe" ( - curl -k -L https://ossci-windows.s3.amazonaws.com/cuda_11.1.0_456.43_win10.exe --output "%SRC_DIR%\temp_build\cuda_11.1.0_456.43_win10.exe" - if errorlevel 1 exit /b 1 - set "CUDA_SETUP_FILE=%SRC_DIR%\temp_build\cuda_11.1.0_456.43_win10.exe" - set "ARGS=nvcc_11.1 cuobjdump_11.1 nvprune_11.1 nvprof_11.1 cupti_11.1 cublas_11.1 cublas_dev_11.1 cudart_11.1 cufft_11.1 cufft_dev_11.1 curand_11.1 curand_dev_11.1 cusolver_11.1 cusolver_dev_11.1 cusparse_11.1 cusparse_dev_11.1 npp_11.1 npp_dev_11.1 nvrtc_11.1 nvrtc_dev_11.1 nvml_dev_11.1" -) - -@REM There is no downloadable driver for Tesla on CUDA 11.1 yet. We will use -@REM the driver inside CUDA -if "%JOB_EXECUTOR%" == "windows-with-nvidia-gpu" set "ARGS=%ARGS% Display.Driver" - -if not exist "%SRC_DIR%\temp_build\cudnn-11.1-windows-x64-v8.0.5.39.zip" ( - curl -k -L https://ossci-windows.s3.amazonaws.com/cudnn-11.1-windows-x64-v8.0.5.39.zip --output "%SRC_DIR%\temp_build\cudnn-11.1-windows-x64-v8.0.5.39.zip" - if errorlevel 1 exit /b 1 - set "CUDNN_SETUP_FILE=%SRC_DIR%\temp_build\cudnn-11.1-windows-x64-v8.0.5.39.zip" -) - -goto cuda_common - -:cuda112 - -if not exist "%SRC_DIR%\temp_build\cuda_11.2.0_460.89_win10.exe" ( - curl -k -L https://ossci-windows.s3.amazonaws.com/cuda_11.2.0_460.89_win10.exe --output "%SRC_DIR%\temp_build\cuda_11.2.0_460.89_win10.exe" - if errorlevel 1 exit /b 1 - set "CUDA_SETUP_FILE=%SRC_DIR%\temp_build\cuda_11.2.0_460.89_win10.exe" - set "ARGS=nvcc_11.2 cuobjdump_11.2 nvprune_11.2 nvprof_11.2 cupti_11.2 cublas_11.2 cublas_dev_11.2 cudart_11.2 cufft_11.2 cufft_dev_11.2 curand_11.2 curand_dev_11.2 cusolver_11.2 cusolver_dev_11.2 cusparse_11.2 cusparse_dev_11.2 npp_11.2 npp_dev_11.2 nvrtc_11.2 nvrtc_dev_11.2 nvml_dev_11.2" -) - -if not exist "%SRC_DIR%\temp_build\cudnn-11.2-windows-x64-v8.1.0.77.zip" ( - curl -k -L http://s3.amazonaws.com/ossci-windows/cudnn-11.2-windows-x64-v8.1.0.77.zip --output "%SRC_DIR%\temp_build\cudnn-11.2-windows-x64-v8.1.0.77.zip" - if errorlevel 1 exit /b 1 - set "CUDNN_SETUP_FILE=%SRC_DIR%\temp_build\cudnn-11.2-windows-x64-v8.1.0.77.zip" -) - -goto cuda_common - -:cuda_common - -if not exist "%SRC_DIR%\temp_build\NvToolsExt.7z" ( - curl -k -L https://www.dropbox.com/s/9mcolalfdj4n979/NvToolsExt.7z?dl=1 --output "%SRC_DIR%\temp_build\NvToolsExt.7z" - if errorlevel 1 exit /b 1 -) - -if not exist "%SRC_DIR%\temp_build\gpu_driver_dlls.7z" ( - curl -k -L "https://drive.google.com/u/0/uc?id=1injUyo3lnarMgWyRcXqKg4UGnN0ysmuq&export=download" --output "%SRC_DIR%\temp_build\gpu_driver_dlls.zip" - if errorlevel 1 exit /b 1 -) - -echo Installing CUDA toolkit... -7z x %CUDA_SETUP_FILE% -o"%SRC_DIR%\temp_build\cuda" -pushd "%SRC_DIR%\temp_build\cuda" -start /wait setup.exe -s %ARGS% -popd - -echo Installing VS integration... -xcopy /Y "%SRC_DIR%\temp_build\cuda\CUDAVisualStudioIntegration\extras\visual_studio_integration\MSBuildExtensions\*.*" "C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\Common7\IDE\VC\VCTargets\BuildCustomizations" - -echo Installing NvToolsExt... -7z x %SRC_DIR%\temp_build\NvToolsExt.7z -o"%SRC_DIR%\temp_build\NvToolsExt" -mkdir "%ProgramFiles%\NVIDIA Corporation\NvToolsExt\bin\x64" -mkdir "%ProgramFiles%\NVIDIA Corporation\NvToolsExt\include" -mkdir "%ProgramFiles%\NVIDIA Corporation\NvToolsExt\lib\x64" -xcopy /Y "%SRC_DIR%\temp_build\NvToolsExt\bin\x64\*.*" "%ProgramFiles%\NVIDIA Corporation\NvToolsExt\bin\x64" -xcopy /Y "%SRC_DIR%\temp_build\NvToolsExt\include\*.*" "%ProgramFiles%\NVIDIA Corporation\NvToolsExt\include" -xcopy /Y "%SRC_DIR%\temp_build\NvToolsExt\lib\x64\*.*" "%ProgramFiles%\NVIDIA Corporation\NvToolsExt\lib\x64" - -echo Setting up environment... -set "PATH=%ProgramFiles%\NVIDIA GPU Computing Toolkit\CUDA\v%CUDA_VERSION_STR%\bin;%ProgramFiles%\NVIDIA GPU Computing Toolkit\CUDA\v%CUDA_VERSION_STR%\libnvvp;%PATH%" -set "CUDA_PATH=%ProgramFiles%\NVIDIA GPU Computing Toolkit\CUDA\v%CUDA_VERSION_STR%" -set "CUDA_PATH_V%CUDA_VER_MAJOR%_%CUDA_VER_MINOR%=%ProgramFiles%\NVIDIA GPU Computing Toolkit\CUDA\v%CUDA_VERSION_STR%" -set "NVTOOLSEXT_PATH=%ProgramFiles%\NVIDIA Corporation\NvToolsExt\bin\x64" - -if not exist "%ProgramFiles%\NVIDIA GPU Computing Toolkit\CUDA\v%CUDA_VERSION_STR%\bin\nvcc.exe" ( - echo CUDA %CUDA_VERSION_STR% installed failed. - exit /b 1 -) - -echo Installing cuDNN... -7z x %CUDNN_SETUP_FILE% -o"%SRC_DIR%\temp_build\cudnn" -xcopy /Y "%SRC_DIR%\temp_build\cudnn\cuda\bin\*.*" "%ProgramFiles%\NVIDIA GPU Computing Toolkit\CUDA\v%CUDA_VERSION_STR%\bin" -xcopy /Y "%SRC_DIR%\temp_build\cudnn\cuda\lib\x64\*.*" "%ProgramFiles%\NVIDIA GPU Computing Toolkit\CUDA\v%CUDA_VERSION_STR%\lib\x64" -xcopy /Y "%SRC_DIR%\temp_build\cudnn\cuda\include\*.*" "%ProgramFiles%\NVIDIA GPU Computing Toolkit\CUDA\v%CUDA_VERSION_STR%\include" - -echo Installing GPU driver DLLs -7z x %SRC_DIR%\temp_build\gpu_driver_dlls.zip -o"C:\Windows\System32" - -echo Cleaning temp files -rd /s /q "%SRC_DIR%\temp_build" || ver > nul diff --git a/packaging/windows/internal/vc_env_helper.bat b/packaging/windows/internal/vc_env_helper.bat index e85a372f93d58c87107c7dc1e2d7aa2a5e423445..d3484a66e9f9021a06512a4a7888c7d9329c1029 100644 --- a/packaging/windows/internal/vc_env_helper.bat +++ b/packaging/windows/internal/vc_env_helper.bat @@ -1,7 +1,11 @@ @echo on -set VC_VERSION_LOWER=16 -set VC_VERSION_UPPER=17 +set VC_VERSION_LOWER=17 +set VC_VERSION_UPPER=18 +if "%VC_YEAR%" == "2019" ( + set VC_VERSION_LOWER=16 + set VC_VERSION_UPPER=17 +) if "%VC_YEAR%" == "2017" ( set VC_VERSION_LOWER=15 set VC_VERSION_UPPER=16 diff --git a/packaging/windows/internal/vc_install_helper.sh b/packaging/windows/internal/vc_install_helper.sh deleted file mode 100644 index cdae18065b9f6e97e385fa2002131ef857562306..0000000000000000000000000000000000000000 --- a/packaging/windows/internal/vc_install_helper.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash - -set -ex - -if [[ "$CU_VERSION" == "cu92" ]]; then - export VC_YEAR=2017 - export VSDEVCMD_ARGS="-vcvars_ver=14.13" - powershell packaging/windows/internal/vs2017_install.ps1 -elif [[ "$CU_VERSION" == "cu100" ]]; then - export VC_YEAR=2017 - export VSDEVCMD_ARGS="" - powershell packaging/windows/internal/vs2017_install.ps1 -else - export VC_YEAR=2019 - export VSDEVCMD_ARGS="" -fi diff --git a/packaging/windows/internal/vs2017_install.ps1 b/packaging/windows/internal/vs2017_install.ps1 deleted file mode 100644 index 3e953de1ab7a0fa33238e10fbcd80564246c1a55..0000000000000000000000000000000000000000 --- a/packaging/windows/internal/vs2017_install.ps1 +++ /dev/null @@ -1,25 +0,0 @@ -$VS_DOWNLOAD_LINK = "https://aka.ms/vs/15/release/vs_buildtools.exe" -$VS_INSTALL_ARGS = @("--nocache","--quiet","--wait", "--add Microsoft.VisualStudio.Workload.VCTools", - "--add Microsoft.VisualStudio.Component.VC.Tools.14.13", - "--add Microsoft.Component.MSBuild", - "--add Microsoft.VisualStudio.Component.Roslyn.Compiler", - "--add Microsoft.VisualStudio.Component.TextTemplating", - "--add Microsoft.VisualStudio.Component.VC.CoreIde", - "--add Microsoft.VisualStudio.Component.VC.Redist.14.Latest", - "--add Microsoft.VisualStudio.ComponentGroup.NativeDesktop.Core", - "--add Microsoft.VisualStudio.Component.VC.Tools.x86.x64", - "--add Microsoft.VisualStudio.ComponentGroup.NativeDesktop.Win81") - -curl.exe --retry 3 -kL $VS_DOWNLOAD_LINK --output vs_installer.exe -if ($LASTEXITCODE -ne 0) { - echo "Download of the VS 2017 installer failed" - exit 1 -} - -$process = Start-Process "${PWD}\vs_installer.exe" -ArgumentList $VS_INSTALL_ARGS -NoNewWindow -Wait -PassThru -Remove-Item -Path vs_installer.exe -Force -$exitCode = $process.ExitCode -if (($exitCode -ne 0) -and ($exitCode -ne 3010)) { - echo "VS 2017 installer exited with code $exitCode, which should be one of [0, 3010]." - exit 1 -} diff --git a/packaging/windows/internal/vs2019_install.ps1 b/packaging/windows/internal/vs2019_install.ps1 deleted file mode 100644 index e436051f0dbb2ce9361f3d1c33295249ba032bb2..0000000000000000000000000000000000000000 --- a/packaging/windows/internal/vs2019_install.ps1 +++ /dev/null @@ -1,21 +0,0 @@ -$VS_DOWNLOAD_LINK = "https://aka.ms/vs/16/release/vs_buildtools.exe" -$VS_INSTALL_ARGS = @("--nocache","--quiet","--wait", "--add Microsoft.VisualStudio.Workload.VCTools", - "--add Microsoft.Component.MSBuild", - "--add Microsoft.VisualStudio.Component.Roslyn.Compiler", - "--add Microsoft.VisualStudio.Component.VC.CoreBuildTools", - "--add Microsoft.VisualStudio.Component.VC.Redist.14.Latest", - "--add Microsoft.VisualStudio.Component.VC.Tools.x86.x64") - -curl.exe --retry 3 -kL $VS_DOWNLOAD_LINK --output vs_installer.exe -if ($LASTEXITCODE -ne 0) { - echo "Download of the VS 2019 installer failed" - exit 1 -} - -$process = Start-Process "${PWD}\vs_installer.exe" -ArgumentList $VS_INSTALL_ARGS -NoNewWindow -Wait -PassThru -Remove-Item -Path vs_installer.exe -Force -$exitCode = $process.ExitCode -if (($exitCode -ne 0) -and ($exitCode -ne 3010)) { - echo "VS 2019 installer exited with code $exitCode, which should be one of [0, 3010]." - exit 1 -} diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000000000000000000000000000000000000..61e4a957fc563f9503eb1ef52bb93a701b1fbcb1 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,18 @@ +[tool.usort] + +first_party_detection = false + +[tool.black] + +line-length = 120 +target-version = ["py38"] + +[tool.ufmt] + +excludes = [ + "gallery", +] + +[build-system] + +requires = ["setuptools", "torch", "wheel"] diff --git a/pytest.ini b/pytest.ini new file mode 100644 index 0000000000000000000000000000000000000000..8d52b55d5a667a460e9d630a58616528767d4bc1 --- /dev/null +++ b/pytest.ini @@ -0,0 +1,13 @@ +[pytest] +addopts = + # show tests that (f)ailed, (E)rror, or (X)passed in the summary + -rfEX + # Make tracebacks shorter + --tb=short + # enable all warnings + -Wd + --ignore=test/test_datasets_download.py + --ignore-glob=test/test_prototype_*.py +testpaths = + test +xfail_strict = True diff --git a/references/classification/README.md b/references/classification/README.md index 7a3144b7cac7d34fba12297514e05a13fe871c2c..65ee416bf8959828f786f34f0eeb66131cac51be 100644 --- a/references/classification/README.md +++ b/references/classification/README.md @@ -20,35 +20,56 @@ the following parameters: ### AlexNet and VGG Since `AlexNet` and the original `VGG` architectures do not include batch -normalization, the default initial learning rate `--lr 0.1` is to high. +normalization, the default initial learning rate `--lr 0.1` is too high. ``` -python main.py --model $MODEL --lr 1e-2 +torchrun --nproc_per_node=8 train.py\ + --model $MODEL --lr 1e-2 ``` Here `$MODEL` is one of `alexnet`, `vgg11`, `vgg13`, `vgg16` or `vgg19`. Note that `vgg11_bn`, `vgg13_bn`, `vgg16_bn`, and `vgg19_bn` include batch normalization and thus are trained with the default parameters. -### ResNext-50 32x4d +### GoogLeNet + +The weights of the GoogLeNet model are ported from the original paper rather than trained from scratch. + +### Inception V3 + +The weights of the Inception V3 model are ported from the original paper rather than trained from scratch. + +Since it expects tensors with a size of N x 3 x 299 x 299, to validate the model use the following command: + ``` -python -m torch.distributed.launch --nproc_per_node=8 --use_env train.py\ - --model resnext50_32x4d --epochs 100 +torchrun --nproc_per_node=8 train.py --model inception_v3\ + --test-only --weights Inception_V3_Weights.IMAGENET1K_V1 ``` +### ResNet +``` +torchrun --nproc_per_node=8 train.py --model $MODEL +``` -### ResNext-101 32x8d +Here `$MODEL` is one of `resnet18`, `resnet34`, `resnet50`, `resnet101` or `resnet152`. -On 8 nodes, each with 8 GPUs (for a total of 64 GPUS) +### ResNext ``` -python -m torch.distributed.launch --nproc_per_node=8 --use_env train.py\ - --model resnext101_32x8d --epochs 100 +torchrun --nproc_per_node=8 train.py\ + --model $MODEL --epochs 100 ``` +Here `$MODEL` is one of `resnext50_32x4d` or `resnext101_32x8d`. +Note that the above command corresponds to a single node with 8 GPUs. If you use +a different number of GPUs and/or a different batch size, then the learning rate +should be scaled accordingly. For example, the pretrained model provided by +`torchvision` was trained on 8 nodes, each with 8 GPUs (for a total of 64 GPUs), +with `--batch_size 16` and `--lr 0.4`, instead of the current defaults +which are respectively batch_size=32 and lr=0.1 ### MobileNetV2 ``` -python -m torch.distributed.launch --nproc_per_node=8 --use_env train.py\ +torchrun --nproc_per_node=8 train.py\ --model mobilenet_v2 --epochs 300 --lr 0.045 --wd 0.00004\ --lr-step-size 1 --lr-gamma 0.98 ``` @@ -56,7 +77,7 @@ python -m torch.distributed.launch --nproc_per_node=8 --use_env train.py\ ### MobileNetV3 Large & Small ``` -python -m torch.distributed.launch --nproc_per_node=8 --use_env train.py\ +torchrun --nproc_per_node=8 train.py\ --model $MODEL --epochs 600 --opt rmsprop --batch-size 128 --lr 0.064\ --wd 0.00001 --lr-step-size 2 --lr-gamma 0.973 --auto-augment imagenet --random-erase 0.2 ``` @@ -67,37 +88,236 @@ Then we averaged the parameters of the last 3 checkpoints that improved the Acc@ and [#3354](https://github.com/pytorch/vision/pull/3354) for details. +### EfficientNet-V1 + +The weights of the B0-B4 variants are ported from Ross Wightman's [timm repo](https://github.com/rwightman/pytorch-image-models/blob/01cb46a9a50e3ba4be167965b5764e9702f09b30/timm/models/efficientnet.py#L95-L108). + +The weights of the B5-B7 variants are ported from Luke Melas' [EfficientNet-PyTorch repo](https://github.com/lukemelas/EfficientNet-PyTorch/blob/1039e009545d9329ea026c9f7541341439712b96/efficientnet_pytorch/utils.py#L562-L564). + +All models were trained using Bicubic interpolation and each have custom crop and resize sizes. To validate the models use the following commands: +``` +torchrun --nproc_per_node=8 train.py --model efficientnet_b0 --test-only --weights EfficientNet_B0_Weights.IMAGENET1K_V1 +torchrun --nproc_per_node=8 train.py --model efficientnet_b1 --test-only --weights EfficientNet_B1_Weights.IMAGENET1K_V1 +torchrun --nproc_per_node=8 train.py --model efficientnet_b2 --test-only --weights EfficientNet_B2_Weights.IMAGENET1K_V1 +torchrun --nproc_per_node=8 train.py --model efficientnet_b3 --test-only --weights EfficientNet_B3_Weights.IMAGENET1K_V1 +torchrun --nproc_per_node=8 train.py --model efficientnet_b4 --test-only --weights EfficientNet_B4_Weights.IMAGENET1K_V1 +torchrun --nproc_per_node=8 train.py --model efficientnet_b5 --test-only --weights EfficientNet_B5_Weights.IMAGENET1K_V1 +torchrun --nproc_per_node=8 train.py --model efficientnet_b6 --test-only --weights EfficientNet_B6_Weights.IMAGENET1K_V1 +torchrun --nproc_per_node=8 train.py --model efficientnet_b7 --test-only --weights EfficientNet_B7_Weights.IMAGENET1K_V1 +``` + + +### EfficientNet-V2 +``` +torchrun --nproc_per_node=8 train.py \ +--model $MODEL --batch-size 128 --lr 0.5 --lr-scheduler cosineannealinglr \ +--lr-warmup-epochs 5 --lr-warmup-method linear --auto-augment ta_wide --epochs 600 --random-erase 0.1 \ +--label-smoothing 0.1 --mixup-alpha 0.2 --cutmix-alpha 1.0 --weight-decay 0.00002 --norm-weight-decay 0.0 \ +--train-crop-size $TRAIN_SIZE --model-ema --val-crop-size $EVAL_SIZE --val-resize-size $EVAL_SIZE \ +--ra-sampler --ra-reps 4 +``` +Here `$MODEL` is one of `efficientnet_v2_s` and `efficientnet_v2_m`. +Note that the Small variant had a `$TRAIN_SIZE` of `300` and a `$EVAL_SIZE` of `384`, while the Medium `384` and `480` respectively. + +Note that the above command corresponds to training on a single node with 8 GPUs. +For generating the pre-trained weights, we trained with 4 nodes, each with 8 GPUs (for a total of 32 GPUs), +and `--batch_size 32`. + +The weights of the Large variant are ported from the original paper rather than trained from scratch. See the `EfficientNet_V2_L_Weights` entry for their exact preprocessing transforms. + + +### RegNet + +#### Small models +``` +torchrun --nproc_per_node=8 train.py\ + --model $MODEL --epochs 100 --batch-size 128 --wd 0.00005 --lr=0.8\ + --lr-scheduler=cosineannealinglr --lr-warmup-method=linear\ + --lr-warmup-epochs=5 --lr-warmup-decay=0.1 +``` +Here `$MODEL` is one of `regnet_x_400mf`, `regnet_x_800mf`, `regnet_x_1_6gf`, `regnet_y_400mf`, `regnet_y_800mf` and `regnet_y_1_6gf`. Please note we used learning rate 0.4 for `regent_y_400mf` to get the same Acc@1 as [the paper)(https://arxiv.org/abs/2003.13678). + +#### Medium models +``` +torchrun --nproc_per_node=8 train.py\ + --model $MODEL --epochs 100 --batch-size 64 --wd 0.00005 --lr=0.4\ + --lr-scheduler=cosineannealinglr --lr-warmup-method=linear\ + --lr-warmup-epochs=5 --lr-warmup-decay=0.1 +``` +Here `$MODEL` is one of `regnet_x_3_2gf`, `regnet_x_8gf`, `regnet_x_16gf`, `regnet_y_3_2gf` and `regnet_y_8gf`. + +#### Large models +``` +torchrun --nproc_per_node=8 train.py\ + --model $MODEL --epochs 100 --batch-size 32 --wd 0.00005 --lr=0.2\ + --lr-scheduler=cosineannealinglr --lr-warmup-method=linear\ + --lr-warmup-epochs=5 --lr-warmup-decay=0.1 +``` +Here `$MODEL` is one of `regnet_x_32gf`, `regnet_y_16gf` and `regnet_y_32gf`. + +### Vision Transformer + +#### vit_b_16 +``` +torchrun --nproc_per_node=8 train.py\ + --model vit_b_16 --epochs 300 --batch-size 512 --opt adamw --lr 0.003 --wd 0.3\ + --lr-scheduler cosineannealinglr --lr-warmup-method linear --lr-warmup-epochs 30\ + --lr-warmup-decay 0.033 --amp --label-smoothing 0.11 --mixup-alpha 0.2 --auto-augment ra\ + --clip-grad-norm 1 --ra-sampler --cutmix-alpha 1.0 --model-ema +``` + +Note that the above command corresponds to training on a single node with 8 GPUs. +For generating the pre-trained weights, we trained with 8 nodes, each with 8 GPUs (for a total of 64 GPUs), +and `--batch_size 64`. + +#### vit_b_32 +``` +torchrun --nproc_per_node=8 train.py\ + --model vit_b_32 --epochs 300 --batch-size 512 --opt adamw --lr 0.003 --wd 0.3\ + --lr-scheduler cosineannealinglr --lr-warmup-method linear --lr-warmup-epochs 30\ + --lr-warmup-decay 0.033 --amp --label-smoothing 0.11 --mixup-alpha 0.2 --auto-augment imagenet\ + --clip-grad-norm 1 --ra-sampler --cutmix-alpha 1.0 --model-ema +``` + +Note that the above command corresponds to training on a single node with 8 GPUs. +For generating the pre-trained weights, we trained with 2 nodes, each with 8 GPUs (for a total of 16 GPUs), +and `--batch_size 256`. + +#### vit_l_16 +``` +torchrun --nproc_per_node=8 train.py\ + --model vit_l_16 --epochs 600 --batch-size 128 --lr 0.5 --lr-scheduler cosineannealinglr\ + --lr-warmup-method linear --lr-warmup-epochs 5 --label-smoothing 0.1 --mixup-alpha 0.2\ + --auto-augment ta_wide --random-erase 0.1 --weight-decay 0.00002 --norm-weight-decay 0.0\ + --clip-grad-norm 1 --ra-sampler --cutmix-alpha 1.0 --model-ema --val-resize-size 232 +``` + +Note that the above command corresponds to training on a single node with 8 GPUs. +For generating the pre-trained weights, we trained with 2 nodes, each with 8 GPUs (for a total of 16 GPUs), +and `--batch_size 64`. + +#### vit_l_32 +``` +torchrun --nproc_per_node=8 train.py\ + --model vit_l_32 --epochs 300 --batch-size 512 --opt adamw --lr 0.003 --wd 0.3\ + --lr-scheduler cosineannealinglr --lr-warmup-method linear --lr-warmup-epochs 30\ + --lr-warmup-decay 0.033 --amp --label-smoothing 0.11 --mixup-alpha 0.2 --auto-augment ra\ + --clip-grad-norm 1 --ra-sampler --cutmix-alpha 1.0 --model-ema +``` + +Note that the above command corresponds to training on a single node with 8 GPUs. +For generating the pre-trained weights, we trained with 8 nodes, each with 8 GPUs (for a total of 64 GPUs), +and `--batch_size 64`. + + +### ConvNeXt +``` +torchrun --nproc_per_node=8 train.py\ +--model $MODEL --batch-size 128 --opt adamw --lr 1e-3 --lr-scheduler cosineannealinglr \ +--lr-warmup-epochs 5 --lr-warmup-method linear --auto-augment ta_wide --epochs 600 --random-erase 0.1 \ +--label-smoothing 0.1 --mixup-alpha 0.2 --cutmix-alpha 1.0 --weight-decay 0.05 --norm-weight-decay 0.0 \ +--train-crop-size 176 --model-ema --val-resize-size 232 --ra-sampler --ra-reps 4 +``` +Here `$MODEL` is one of `convnext_tiny`, `convnext_small`, `convnext_base` and `convnext_large`. Note that each variant had its `--val-resize-size` optimized in a post-training step, see their `Weights` entry for their exact value. + +Note that the above command corresponds to training on a single node with 8 GPUs. +For generating the pre-trained weights, we trained with 2 nodes, each with 8 GPUs (for a total of 16 GPUs), +and `--batch_size 64`. + + +### SwinTransformer +``` +torchrun --nproc_per_node=8 train.py\ +--model $MODEL --epochs 300 --batch-size 128 --opt adamw --lr 0.001 --weight-decay 0.05 --norm-weight-decay 0.0 --bias-weight-decay 0.0 --transformer-embedding-decay 0.0 --lr-scheduler cosineannealinglr --lr-min 0.00001 --lr-warmup-method linear --lr-warmup-epochs 20 --lr-warmup-decay 0.01 --amp --label-smoothing 0.1 --mixup-alpha 0.8 --clip-grad-norm 5.0 --cutmix-alpha 1.0 --random-erase 0.25 --interpolation bicubic --auto-augment ta_wide --model-ema --ra-sampler --ra-reps 4 --val-resize-size 224 +``` +Here `$MODEL` is one of `swin_t`, `swin_s` or `swin_b`. +Note that `--val-resize-size` was optimized in a post-training step, see their `Weights` entry for the exact value. + + + + +### SwinTransformer V2 +``` +torchrun --nproc_per_node=8 train.py\ +--model $MODEL --epochs 300 --batch-size 128 --opt adamw --lr 0.001 --weight-decay 0.05 --norm-weight-decay 0.0 --bias-weight-decay 0.0 --transformer-embedding-decay 0.0 --lr-scheduler cosineannealinglr --lr-min 0.00001 --lr-warmup-method linear --lr-warmup-epochs 20 --lr-warmup-decay 0.01 --amp --label-smoothing 0.1 --mixup-alpha 0.8 --clip-grad-norm 5.0 --cutmix-alpha 1.0 --random-erase 0.25 --interpolation bicubic --auto-augment ta_wide --model-ema --ra-sampler --ra-reps 4 --val-resize-size 256 --val-crop-size 256 --train-crop-size 256 +``` +Here `$MODEL` is one of `swin_v2_t`, `swin_v2_s` or `swin_v2_b`. +Note that `--val-resize-size` was optimized in a post-training step, see their `Weights` entry for the exact value. + + +### MaxViT +``` +torchrun --nproc_per_node=8 --n_nodes=4 train.py\ +--model $MODEL --epochs 400 --batch-size 128 --opt adamw --lr 3e-3 --weight-decay 0.05 --lr-scheduler cosineannealinglr --lr-min 1e-5 --lr-warmup-method linear --lr-warmup-epochs 32 --label-smoothing 0.1 --mixup-alpha 0.8 --clip-grad-norm 1.0 --interpolation bicubic --auto-augment ta_wide --policy-magnitude 15 --model-ema --val-resize-size 224\ +--val-crop-size 224 --train-crop-size 224 --amp --model-ema-steps 32 --transformer-embedding-decay 0 --sync-bn +``` +Here `$MODEL` is `maxvit_t`. +Note that `--val-resize-size` was not optimized in a post-training step. + + +### ShuffleNet V2 +``` +torchrun --nproc_per_node=8 train.py \ +--batch-size=128 \ +--lr=0.5 --lr-scheduler=cosineannealinglr --lr-warmup-epochs=5 --lr-warmup-method=linear \ +--auto-augment=ta_wide --epochs=600 --random-erase=0.1 --weight-decay=0.00002 \ +--norm-weight-decay=0.0 --label-smoothing=0.1 --mixup-alpha=0.2 --cutmix-alpha=1.0 \ +--train-crop-size=176 --model-ema --val-resize-size=232 --ra-sampler --ra-reps=4 +``` +Here `$MODEL` is either `shufflenet_v2_x1_5` or `shufflenet_v2_x2_0`. + +The models `shufflenet_v2_x0_5` and `shufflenet_v2_x1_0` were contributed by the community. See [PR-849](https://github.com/pytorch/vision/pull/849#issuecomment-483391686) for details. + + ## Mixed precision training -Automatic Mixed Precision (AMP) training on GPU for Pytorch can be enabled with the [NVIDIA Apex extension](https://github.com/NVIDIA/apex). +Automatic Mixed Precision (AMP) training on GPU for Pytorch can be enabled with the [torch.cuda.amp](https://pytorch.org/docs/stable/amp.html?highlight=amp#module-torch.cuda.amp). -Mixed precision training makes use of both FP32 and FP16 precisions where appropriate. FP16 operations can leverage the Tensor cores on NVIDIA GPUs (Volta, Turing or newer architectures) for improved throughput, generally without loss in model accuracy. Mixed precision training also often allows larger batch sizes. GPU automatic mixed precision training for Pytorch Vision can be enabled via the flag value `--apex=True`. +Mixed precision training makes use of both FP32 and FP16 precisions where appropriate. FP16 operations can leverage the Tensor cores on NVIDIA GPUs (Volta, Turing or newer architectures) for improved throughput, generally without loss in model accuracy. Mixed precision training also often allows larger batch sizes. GPU automatic mixed precision training for Pytorch Vision can be enabled via the flag value `--amp=True`. ``` -python -m torch.distributed.launch --nproc_per_node=8 --use_env train.py\ - --model resnext50_32x4d --epochs 100 --apex +torchrun --nproc_per_node=8 train.py\ + --model resnext50_32x4d --epochs 100 --amp ``` ## Quantized -### Parameters used for generating quantized models: +### Post training quantized models -For all post training quantized models (All quantized models except mobilenet-v2), the settings are: +For all post training quantized models, the settings are: 1. num_calibration_batches: 32 2. num_workers: 16 3. batch_size: 32 4. eval_batch_size: 128 -5. backend: 'fbgemm' +5. qbackend: 'fbgemm' + +``` +python train_quantization.py --device='cpu' --post-training-quantize --qbackend='fbgemm' --model='$MODEL' +``` +Here `$MODEL` is one of `googlenet`, `inception_v3`, `resnet18`, `resnet50`, `resnext101_32x8d`, `shufflenet_v2_x0_5` and `shufflenet_v2_x1_0`. +### Quantized ShuffleNet V2 + +Here are commands that we use to quantize the `shufflenet_v2_x1_5` and `shufflenet_v2_x2_0` models. ``` -python train_quantization.py --device='cpu' --post-training-quantize --backend='fbgemm' --model='' +# For shufflenet_v2_x1_5 +python train_quantization.py --device='cpu' --post-training-quantize --qbackend='fbgemm' \ + --model=shufflenet_v2_x1_5 --weights="ShuffleNet_V2_X1_5_Weights.IMAGENET1K_V1" \ + --train-crop-size 176 --val-resize-size 232 --data-path /datasets01_ontap/imagenet_full_size/061417/ + +# For shufflenet_v2_x2_0 +python train_quantization.py --device='cpu' --post-training-quantize --qbackend='fbgemm' \ + --model=shufflenet_v2_x2_0 --weights="ShuffleNet_V2_X2_0_Weights.IMAGENET1K_V1" \ + --train-crop-size 176 --val-resize-size 232 --data-path /datasets01_ontap/imagenet_full_size/061417/ ``` +### QAT MobileNetV2 + For Mobilenet-v2, the model was trained with quantization aware training, the settings used are: 1. num_workers: 16 2. batch_size: 32 3. eval_batch_size: 128 -4. backend: 'qnnpack' +4. qbackend: 'qnnpack' 5. learning-rate: 0.0001 6. num_epochs: 90 7. num_observer_update_epochs:4 @@ -108,16 +328,18 @@ For Mobilenet-v2, the model was trained with quantization aware training, the se 12. weight-decay: 0.0001 ``` -python -m torch.distributed.launch --nproc_per_node=8 --use_env train_quantization.py --model='mobilenet_v2' +torchrun --nproc_per_node=8 train_quantization.py --model='mobilenet_v2' ``` Training converges at about 10 epochs. +### QAT MobileNetV3 + For Mobilenet-v3 Large, the model was trained with quantization aware training, the settings used are: 1. num_workers: 16 2. batch_size: 32 3. eval_batch_size: 128 -4. backend: 'qnnpack' +4. qbackend: 'qnnpack' 5. learning-rate: 0.001 6. num_epochs: 90 7. num_observer_update_epochs:4 @@ -128,7 +350,7 @@ For Mobilenet-v3 Large, the model was trained with quantization aware training, 12. weight-decay: 0.00001 ``` -python -m torch.distributed.launch --nproc_per_node=8 --use_env train_quantization.py --model='mobilenet_v3_large' \ +torchrun --nproc_per_node=8 train_quantization.py --model='mobilenet_v3_large' \ --wd 0.00001 --lr 0.001 ``` @@ -137,6 +359,10 @@ For post training quant, device is set to CPU. For training, the device is set t ### Command to evaluate quantized models using the pre-trained weights: ``` -python train_quantization.py --device='cpu' --test-only --backend='' --model='' +python train_quantization.py --device='cpu' --test-only --qbackend='' --model='' ``` +For inception_v3 you need to pass the following extra parameters: +``` +--val-resize-size 342 --val-crop-size 299 --train-crop-size 299 +``` diff --git a/references/classification/presets.py b/references/classification/presets.py index 6bb389ba8db19fef16e995bc2b80b67e0d65b69f..8653957a57646925f2f028041e3fc4b2e422ee94 100644 --- a/references/classification/presets.py +++ b/references/classification/presets.py @@ -1,37 +1,119 @@ -from torchvision.transforms import autoaugment, transforms +import torch +from torchvision.transforms.functional import InterpolationMode + + +def get_module(use_v2): + # We need a protected import to avoid the V2 warning in case just V1 is used + if use_v2: + import torchvision.transforms.v2 + + return torchvision.transforms.v2 + else: + import torchvision.transforms + + return torchvision.transforms class ClassificationPresetTrain: - def __init__(self, crop_size, mean=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225), hflip_prob=0.5, - auto_augment_policy=None, random_erase_prob=0.0): - trans = [transforms.RandomResizedCrop(crop_size)] + # Note: this transform assumes that the input to forward() are always PIL + # images, regardless of the backend parameter. We may change that in the + # future though, if we change the output type from the dataset. + def __init__( + self, + *, + crop_size, + mean=(0.485, 0.456, 0.406), + std=(0.229, 0.224, 0.225), + interpolation=InterpolationMode.BILINEAR, + hflip_prob=0.5, + auto_augment_policy=None, + ra_magnitude=9, + augmix_severity=3, + random_erase_prob=0.0, + backend="pil", + use_v2=False, + ): + T = get_module(use_v2) + + transforms = [] + backend = backend.lower() + if backend == "tensor": + transforms.append(T.PILToTensor()) + elif backend != "pil": + raise ValueError(f"backend can be 'tensor' or 'pil', but got {backend}") + + transforms.append(T.RandomResizedCrop(crop_size, interpolation=interpolation, antialias=True)) if hflip_prob > 0: - trans.append(transforms.RandomHorizontalFlip(hflip_prob)) + transforms.append(T.RandomHorizontalFlip(hflip_prob)) if auto_augment_policy is not None: - aa_policy = autoaugment.AutoAugmentPolicy(auto_augment_policy) - trans.append(autoaugment.AutoAugment(policy=aa_policy)) - trans.extend([ - transforms.ToTensor(), - transforms.Normalize(mean=mean, std=std), - ]) + if auto_augment_policy == "ra": + transforms.append(T.RandAugment(interpolation=interpolation, magnitude=ra_magnitude)) + elif auto_augment_policy == "ta_wide": + transforms.append(T.TrivialAugmentWide(interpolation=interpolation)) + elif auto_augment_policy == "augmix": + transforms.append(T.AugMix(interpolation=interpolation, severity=augmix_severity)) + else: + aa_policy = T.AutoAugmentPolicy(auto_augment_policy) + transforms.append(T.AutoAugment(policy=aa_policy, interpolation=interpolation)) + + if backend == "pil": + transforms.append(T.PILToTensor()) + + transforms.extend( + [ + T.ToDtype(torch.float, scale=True) if use_v2 else T.ConvertImageDtype(torch.float), + T.Normalize(mean=mean, std=std), + ] + ) if random_erase_prob > 0: - trans.append(transforms.RandomErasing(p=random_erase_prob)) + transforms.append(T.RandomErasing(p=random_erase_prob)) + + if use_v2: + transforms.append(T.ToPureTensor()) - self.transforms = transforms.Compose(trans) + self.transforms = T.Compose(transforms) def __call__(self, img): return self.transforms(img) class ClassificationPresetEval: - def __init__(self, crop_size, resize_size=256, mean=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225)): - - self.transforms = transforms.Compose([ - transforms.Resize(resize_size), - transforms.CenterCrop(crop_size), - transforms.ToTensor(), - transforms.Normalize(mean=mean, std=std), - ]) + def __init__( + self, + *, + crop_size, + resize_size=256, + mean=(0.485, 0.456, 0.406), + std=(0.229, 0.224, 0.225), + interpolation=InterpolationMode.BILINEAR, + backend="pil", + use_v2=False, + ): + T = get_module(use_v2) + transforms = [] + backend = backend.lower() + if backend == "tensor": + transforms.append(T.PILToTensor()) + elif backend != "pil": + raise ValueError(f"backend can be 'tensor' or 'pil', but got {backend}") + + transforms += [ + T.Resize(resize_size, interpolation=interpolation, antialias=True), + T.CenterCrop(crop_size), + ] + + if backend == "pil": + transforms.append(T.PILToTensor()) + + transforms += [ + T.ToDtype(torch.float, scale=True) if use_v2 else T.ConvertImageDtype(torch.float), + T.Normalize(mean=mean, std=std), + ] + + if use_v2: + transforms.append(T.ToPureTensor()) + + self.transforms = T.Compose(transforms) def __call__(self, img): return self.transforms(img) diff --git a/references/classification/sampler.py b/references/classification/sampler.py new file mode 100644 index 0000000000000000000000000000000000000000..e9dc1735a585cd2b46c50d7cf9389767f081a4dd --- /dev/null +++ b/references/classification/sampler.py @@ -0,0 +1,62 @@ +import math + +import torch +import torch.distributed as dist + + +class RASampler(torch.utils.data.Sampler): + """Sampler that restricts data loading to a subset of the dataset for distributed, + with repeated augmentation. + It ensures that different each augmented version of a sample will be visible to a + different process (GPU). + Heavily based on 'torch.utils.data.DistributedSampler'. + + This is borrowed from the DeiT Repo: + https://github.com/facebookresearch/deit/blob/main/samplers.py + """ + + def __init__(self, dataset, num_replicas=None, rank=None, shuffle=True, seed=0, repetitions=3): + if num_replicas is None: + if not dist.is_available(): + raise RuntimeError("Requires distributed package to be available!") + num_replicas = dist.get_world_size() + if rank is None: + if not dist.is_available(): + raise RuntimeError("Requires distributed package to be available!") + rank = dist.get_rank() + self.dataset = dataset + self.num_replicas = num_replicas + self.rank = rank + self.epoch = 0 + self.num_samples = int(math.ceil(len(self.dataset) * float(repetitions) / self.num_replicas)) + self.total_size = self.num_samples * self.num_replicas + self.num_selected_samples = int(math.floor(len(self.dataset) // 256 * 256 / self.num_replicas)) + self.shuffle = shuffle + self.seed = seed + self.repetitions = repetitions + + def __iter__(self): + if self.shuffle: + # Deterministically shuffle based on epoch + g = torch.Generator() + g.manual_seed(self.seed + self.epoch) + indices = torch.randperm(len(self.dataset), generator=g).tolist() + else: + indices = list(range(len(self.dataset))) + + # Add extra samples to make it evenly divisible + indices = [ele for ele in indices for i in range(self.repetitions)] + indices += indices[: (self.total_size - len(indices))] + assert len(indices) == self.total_size + + # Subsample + indices = indices[self.rank : self.total_size : self.num_replicas] + assert len(indices) == self.num_samples + + return iter(indices[: self.num_selected_samples]) + + def __len__(self): + return self.num_selected_samples + + def set_epoch(self, epoch): + self.epoch = epoch diff --git a/references/classification/train.py b/references/classification/train.py index b4e9d274662cb94d40b55539037adc2857593292..d52124fcf33111a7fc033d39c0bbf0b2541bfb39 100644 --- a/references/classification/train.py +++ b/references/classification/train.py @@ -1,55 +1,71 @@ import datetime import os import time +import warnings +import presets import torch import torch.utils.data -from torch import nn import torchvision - -import presets +import torchvision.transforms import utils - -try: - from apex import amp -except ImportError: - amp = None +from sampler import RASampler +from torch import nn +from torch.utils.data.dataloader import default_collate +from torchvision.transforms.functional import InterpolationMode +from transforms import get_mixup_cutmix -def train_one_epoch(model, criterion, optimizer, data_loader, device, epoch, print_freq, apex=False): +def train_one_epoch(model, criterion, optimizer, data_loader, device, epoch, args, model_ema=None, scaler=None): model.train() metric_logger = utils.MetricLogger(delimiter=" ") - metric_logger.add_meter('lr', utils.SmoothedValue(window_size=1, fmt='{value}')) - metric_logger.add_meter('img/s', utils.SmoothedValue(window_size=10, fmt='{value}')) + metric_logger.add_meter("lr", utils.SmoothedValue(window_size=1, fmt="{value}")) + metric_logger.add_meter("img/s", utils.SmoothedValue(window_size=10, fmt="{value}")) - header = 'Epoch: [{}]'.format(epoch) - for image, target in metric_logger.log_every(data_loader, print_freq, header): + header = f"Epoch: [{epoch}]" + for i, (image, target) in enumerate(metric_logger.log_every(data_loader, args.print_freq, header)): start_time = time.time() image, target = image.to(device), target.to(device) - output = model(image) - loss = criterion(output, target) + with torch.cuda.amp.autocast(enabled=scaler is not None): + output = model(image) + loss = criterion(output, target) optimizer.zero_grad() - if apex: - with amp.scale_loss(loss, optimizer) as scaled_loss: - scaled_loss.backward() + if scaler is not None: + scaler.scale(loss).backward() + if args.clip_grad_norm is not None: + # we should unscale the gradients of optimizer's assigned params if do gradient clipping + scaler.unscale_(optimizer) + nn.utils.clip_grad_norm_(model.parameters(), args.clip_grad_norm) + scaler.step(optimizer) + scaler.update() else: loss.backward() - optimizer.step() + if args.clip_grad_norm is not None: + nn.utils.clip_grad_norm_(model.parameters(), args.clip_grad_norm) + optimizer.step() + + if model_ema and i % args.model_ema_steps == 0: + model_ema.update_parameters(model) + if epoch < args.lr_warmup_epochs: + # Reset ema buffer to keep copying weights during warmup period + model_ema.n_averaged.fill_(0) acc1, acc5 = utils.accuracy(output, target, topk=(1, 5)) batch_size = image.shape[0] metric_logger.update(loss=loss.item(), lr=optimizer.param_groups[0]["lr"]) - metric_logger.meters['acc1'].update(acc1.item(), n=batch_size) - metric_logger.meters['acc5'].update(acc5.item(), n=batch_size) - metric_logger.meters['img/s'].update(batch_size / (time.time() - start_time)) + metric_logger.meters["acc1"].update(acc1.item(), n=batch_size) + metric_logger.meters["acc5"].update(acc5.item(), n=batch_size) + metric_logger.meters["img/s"].update(batch_size / (time.time() - start_time)) -def evaluate(model, criterion, data_loader, device, print_freq=100): +def evaluate(model, criterion, data_loader, device, print_freq=100, log_suffix=""): model.eval() metric_logger = utils.MetricLogger(delimiter=" ") - header = 'Test:' - with torch.no_grad(): + header = f"Test: {log_suffix}" + + num_processed_samples = 0 + with torch.inference_mode(): for image, target in metric_logger.log_every(data_loader, print_freq, header): image = image.to(device, non_blocking=True) target = target.to(device, non_blocking=True) @@ -61,18 +77,34 @@ def evaluate(model, criterion, data_loader, device, print_freq=100): # could have been padded in distributed setup batch_size = image.shape[0] metric_logger.update(loss=loss.item()) - metric_logger.meters['acc1'].update(acc1.item(), n=batch_size) - metric_logger.meters['acc5'].update(acc5.item(), n=batch_size) + metric_logger.meters["acc1"].update(acc1.item(), n=batch_size) + metric_logger.meters["acc5"].update(acc5.item(), n=batch_size) + num_processed_samples += batch_size # gather the stats from all processes + + num_processed_samples = utils.reduce_across_processes(num_processed_samples) + if ( + hasattr(data_loader.dataset, "__len__") + and len(data_loader.dataset) != num_processed_samples + and torch.distributed.get_rank() == 0 + ): + # See FIXME above + warnings.warn( + f"It looks like the dataset has {len(data_loader.dataset)} samples, but {num_processed_samples} " + "samples were used for the validation, which might bias the results. " + "Try adjusting the batch size and / or the world size. " + "Setting the world size to 1 is always a safe bet." + ) + metric_logger.synchronize_between_processes() - print(' * Acc@1 {top1.global_avg:.3f} Acc@5 {top5.global_avg:.3f}' - .format(top1=metric_logger.acc1, top5=metric_logger.acc5)) + print(f"{header} Acc@1 {metric_logger.acc1.global_avg:.3f} Acc@5 {metric_logger.acc5.global_avg:.3f}") return metric_logger.acc1.global_avg def _get_cache_path(filepath): import hashlib + h = hashlib.sha1(filepath.encode()).hexdigest() cache_path = os.path.join("~", ".torch", "vision", "datasets", "imagefolder", h[:10] + ".pt") cache_path = os.path.expanduser(cache_path) @@ -82,24 +114,43 @@ def _get_cache_path(filepath): def load_data(traindir, valdir, args): # Data loading code print("Loading data") - resize_size, crop_size = (342, 299) if args.model == 'inception_v3' else (256, 224) + val_resize_size, val_crop_size, train_crop_size = ( + args.val_resize_size, + args.val_crop_size, + args.train_crop_size, + ) + interpolation = InterpolationMode(args.interpolation) print("Loading training data") st = time.time() cache_path = _get_cache_path(traindir) if args.cache_dataset and os.path.exists(cache_path): # Attention, as the transforms are also cached! - print("Loading dataset_train from {}".format(cache_path)) - dataset, _ = torch.load(cache_path) + print(f"Loading dataset_train from {cache_path}") + # TODO: this could probably be weights_only=True + dataset, _ = torch.load(cache_path, weights_only=False) else: + # We need a default value for the variables below because args may come + # from train_quantization.py which doesn't define them. auto_augment_policy = getattr(args, "auto_augment", None) random_erase_prob = getattr(args, "random_erase", 0.0) + ra_magnitude = getattr(args, "ra_magnitude", None) + augmix_severity = getattr(args, "augmix_severity", None) dataset = torchvision.datasets.ImageFolder( traindir, - presets.ClassificationPresetTrain(crop_size=crop_size, auto_augment_policy=auto_augment_policy, - random_erase_prob=random_erase_prob)) + presets.ClassificationPresetTrain( + crop_size=train_crop_size, + interpolation=interpolation, + auto_augment_policy=auto_augment_policy, + random_erase_prob=random_erase_prob, + ra_magnitude=ra_magnitude, + augmix_severity=augmix_severity, + backend=args.backend, + use_v2=args.use_v2, + ), + ) if args.cache_dataset: - print("Saving dataset_train to {}".format(cache_path)) + print(f"Saving dataset_train to {cache_path}") utils.mkdir(os.path.dirname(cache_path)) utils.save_on_master((dataset, traindir), cache_path) print("Took", time.time() - st) @@ -108,21 +159,41 @@ def load_data(traindir, valdir, args): cache_path = _get_cache_path(valdir) if args.cache_dataset and os.path.exists(cache_path): # Attention, as the transforms are also cached! - print("Loading dataset_test from {}".format(cache_path)) - dataset_test, _ = torch.load(cache_path) + print(f"Loading dataset_test from {cache_path}") + # TODO: this could probably be weights_only=True + dataset_test, _ = torch.load(cache_path, weights_only=False) else: + if args.weights and args.test_only: + weights = torchvision.models.get_weight(args.weights) + preprocessing = weights.transforms(antialias=True) + if args.backend == "tensor": + preprocessing = torchvision.transforms.Compose([torchvision.transforms.PILToTensor(), preprocessing]) + + else: + preprocessing = presets.ClassificationPresetEval( + crop_size=val_crop_size, + resize_size=val_resize_size, + interpolation=interpolation, + backend=args.backend, + use_v2=args.use_v2, + ) + dataset_test = torchvision.datasets.ImageFolder( valdir, - presets.ClassificationPresetEval(crop_size=crop_size, resize_size=resize_size)) + preprocessing, + ) if args.cache_dataset: - print("Saving dataset_test to {}".format(cache_path)) + print(f"Saving dataset_test to {cache_path}") utils.mkdir(os.path.dirname(cache_path)) utils.save_on_master((dataset_test, valdir), cache_path) print("Creating data loaders") if args.distributed: - train_sampler = torch.utils.data.distributed.DistributedSampler(dataset) - test_sampler = torch.utils.data.distributed.DistributedSampler(dataset_test) + if hasattr(args, "ra_sampler") and args.ra_sampler: + train_sampler = RASampler(dataset, shuffle=True, repetitions=args.ra_reps) + else: + train_sampler = torch.utils.data.distributed.DistributedSampler(dataset) + test_sampler = torch.utils.data.distributed.DistributedSampler(dataset_test, shuffle=False) else: train_sampler = torch.utils.data.RandomSampler(dataset) test_sampler = torch.utils.data.SequentialSampler(dataset_test) @@ -131,10 +202,6 @@ def load_data(traindir, valdir, args): def main(args): - if args.apex and amp is None: - raise RuntimeError("Failed to import apex. Please install apex from https://www.github.com/nvidia/apex " - "to enable mixed-precision training.") - if args.output_dir: utils.mkdir(args.output_dir) @@ -143,58 +210,154 @@ def main(args): device = torch.device(args.device) - torch.backends.cudnn.benchmark = True + if args.use_deterministic_algorithms: + torch.backends.cudnn.benchmark = False + torch.use_deterministic_algorithms(True) + else: + torch.backends.cudnn.benchmark = True - train_dir = os.path.join(args.data_path, 'train') - val_dir = os.path.join(args.data_path, 'val') + train_dir = os.path.join(args.data_path, "train") + val_dir = os.path.join(args.data_path, "val") dataset, dataset_test, train_sampler, test_sampler = load_data(train_dir, val_dir, args) - data_loader = torch.utils.data.DataLoader( - dataset, batch_size=args.batch_size, - sampler=train_sampler, num_workers=args.workers, pin_memory=True) + num_classes = len(dataset.classes) + mixup_cutmix = get_mixup_cutmix( + mixup_alpha=args.mixup_alpha, cutmix_alpha=args.cutmix_alpha, num_classes=num_classes, use_v2=args.use_v2 + ) + if mixup_cutmix is not None: + + def collate_fn(batch): + return mixup_cutmix(*default_collate(batch)) + + else: + collate_fn = default_collate + + data_loader = torch.utils.data.DataLoader( + dataset, + batch_size=args.batch_size, + sampler=train_sampler, + num_workers=args.workers, + pin_memory=True, + collate_fn=collate_fn, + ) data_loader_test = torch.utils.data.DataLoader( - dataset_test, batch_size=args.batch_size, - sampler=test_sampler, num_workers=args.workers, pin_memory=True) + dataset_test, batch_size=args.batch_size, sampler=test_sampler, num_workers=args.workers, pin_memory=True + ) print("Creating model") - model = torchvision.models.__dict__[args.model](pretrained=args.pretrained) + model = torchvision.models.get_model(args.model, weights=args.weights, num_classes=num_classes) model.to(device) + if args.distributed and args.sync_bn: model = torch.nn.SyncBatchNorm.convert_sync_batchnorm(model) - criterion = nn.CrossEntropyLoss() + criterion = nn.CrossEntropyLoss(label_smoothing=args.label_smoothing) + + custom_keys_weight_decay = [] + if args.bias_weight_decay is not None: + custom_keys_weight_decay.append(("bias", args.bias_weight_decay)) + if args.transformer_embedding_decay is not None: + for key in ["class_token", "position_embedding", "relative_position_bias_table"]: + custom_keys_weight_decay.append((key, args.transformer_embedding_decay)) + parameters = utils.set_weight_decay( + model, + args.weight_decay, + norm_weight_decay=args.norm_weight_decay, + custom_keys_weight_decay=custom_keys_weight_decay if len(custom_keys_weight_decay) > 0 else None, + ) opt_name = args.opt.lower() - if opt_name == 'sgd': + if opt_name.startswith("sgd"): optimizer = torch.optim.SGD( - model.parameters(), lr=args.lr, momentum=args.momentum, weight_decay=args.weight_decay) - elif opt_name == 'rmsprop': - optimizer = torch.optim.RMSprop(model.parameters(), lr=args.lr, momentum=args.momentum, - weight_decay=args.weight_decay, eps=0.0316, alpha=0.9) + parameters, + lr=args.lr, + momentum=args.momentum, + weight_decay=args.weight_decay, + nesterov="nesterov" in opt_name, + ) + elif opt_name == "rmsprop": + optimizer = torch.optim.RMSprop( + parameters, lr=args.lr, momentum=args.momentum, weight_decay=args.weight_decay, eps=0.0316, alpha=0.9 + ) + elif opt_name == "adamw": + optimizer = torch.optim.AdamW(parameters, lr=args.lr, weight_decay=args.weight_decay) else: - raise RuntimeError("Invalid optimizer {}. Only SGD and RMSprop are supported.".format(args.opt)) - - if args.apex: - model, optimizer = amp.initialize(model, optimizer, - opt_level=args.apex_opt_level - ) - - lr_scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=args.lr_step_size, gamma=args.lr_gamma) + raise RuntimeError(f"Invalid optimizer {args.opt}. Only SGD, RMSprop and AdamW are supported.") + + scaler = torch.cuda.amp.GradScaler() if args.amp else None + + args.lr_scheduler = args.lr_scheduler.lower() + if args.lr_scheduler == "steplr": + main_lr_scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=args.lr_step_size, gamma=args.lr_gamma) + elif args.lr_scheduler == "cosineannealinglr": + main_lr_scheduler = torch.optim.lr_scheduler.CosineAnnealingLR( + optimizer, T_max=args.epochs - args.lr_warmup_epochs, eta_min=args.lr_min + ) + elif args.lr_scheduler == "exponentiallr": + main_lr_scheduler = torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma=args.lr_gamma) + else: + raise RuntimeError( + f"Invalid lr scheduler '{args.lr_scheduler}'. Only StepLR, CosineAnnealingLR and ExponentialLR " + "are supported." + ) + + if args.lr_warmup_epochs > 0: + if args.lr_warmup_method == "linear": + warmup_lr_scheduler = torch.optim.lr_scheduler.LinearLR( + optimizer, start_factor=args.lr_warmup_decay, total_iters=args.lr_warmup_epochs + ) + elif args.lr_warmup_method == "constant": + warmup_lr_scheduler = torch.optim.lr_scheduler.ConstantLR( + optimizer, factor=args.lr_warmup_decay, total_iters=args.lr_warmup_epochs + ) + else: + raise RuntimeError( + f"Invalid warmup lr method '{args.lr_warmup_method}'. Only linear and constant are supported." + ) + lr_scheduler = torch.optim.lr_scheduler.SequentialLR( + optimizer, schedulers=[warmup_lr_scheduler, main_lr_scheduler], milestones=[args.lr_warmup_epochs] + ) + else: + lr_scheduler = main_lr_scheduler model_without_ddp = model if args.distributed: model = torch.nn.parallel.DistributedDataParallel(model, device_ids=[args.gpu]) model_without_ddp = model.module + model_ema = None + if args.model_ema: + # Decay adjustment that aims to keep the decay independent of other hyper-parameters originally proposed at: + # https://github.com/facebookresearch/pycls/blob/f8cd9627/pycls/core/net.py#L123 + # + # total_ema_updates = (Dataset_size / n_GPUs) * epochs / (batch_size_per_gpu * EMA_steps) + # We consider constant = Dataset_size for a given dataset/setup and omit it. Thus: + # adjust = 1 / total_ema_updates ~= n_GPUs * batch_size_per_gpu * EMA_steps / epochs + adjust = args.world_size * args.batch_size * args.model_ema_steps / args.epochs + alpha = 1.0 - args.model_ema_decay + alpha = min(1.0, alpha * adjust) + model_ema = utils.ExponentialMovingAverage(model_without_ddp, device=device, decay=1.0 - alpha) + if args.resume: - checkpoint = torch.load(args.resume, map_location='cpu') - model_without_ddp.load_state_dict(checkpoint['model']) - optimizer.load_state_dict(checkpoint['optimizer']) - lr_scheduler.load_state_dict(checkpoint['lr_scheduler']) - args.start_epoch = checkpoint['epoch'] + 1 + checkpoint = torch.load(args.resume, map_location="cpu", weights_only=True) + model_without_ddp.load_state_dict(checkpoint["model"]) + if not args.test_only: + optimizer.load_state_dict(checkpoint["optimizer"]) + lr_scheduler.load_state_dict(checkpoint["lr_scheduler"]) + args.start_epoch = checkpoint["epoch"] + 1 + if model_ema: + model_ema.load_state_dict(checkpoint["model_ema"]) + if scaler: + scaler.load_state_dict(checkpoint["scaler"]) if args.test_only: - evaluate(model, criterion, data_loader_test, device=device) + # We disable the cudnn benchmarking because it can noticeably affect the accuracy + torch.backends.cudnn.benchmark = False + torch.backends.cudnn.deterministic = True + if model_ema: + evaluate(model_ema, criterion, data_loader_test, device=device, log_suffix="EMA") + else: + evaluate(model, criterion, data_loader_test, device=device) return print("Start training") @@ -202,54 +365,94 @@ def main(args): for epoch in range(args.start_epoch, args.epochs): if args.distributed: train_sampler.set_epoch(epoch) - train_one_epoch(model, criterion, optimizer, data_loader, device, epoch, args.print_freq, args.apex) + train_one_epoch(model, criterion, optimizer, data_loader, device, epoch, args, model_ema, scaler) lr_scheduler.step() evaluate(model, criterion, data_loader_test, device=device) + if model_ema: + evaluate(model_ema, criterion, data_loader_test, device=device, log_suffix="EMA") if args.output_dir: checkpoint = { - 'model': model_without_ddp.state_dict(), - 'optimizer': optimizer.state_dict(), - 'lr_scheduler': lr_scheduler.state_dict(), - 'epoch': epoch, - 'args': args} - utils.save_on_master( - checkpoint, - os.path.join(args.output_dir, 'model_{}.pth'.format(epoch))) - utils.save_on_master( - checkpoint, - os.path.join(args.output_dir, 'checkpoint.pth')) + "model": model_without_ddp.state_dict(), + "optimizer": optimizer.state_dict(), + "lr_scheduler": lr_scheduler.state_dict(), + "epoch": epoch, + "args": args, + } + if model_ema: + checkpoint["model_ema"] = model_ema.state_dict() + if scaler: + checkpoint["scaler"] = scaler.state_dict() + utils.save_on_master(checkpoint, os.path.join(args.output_dir, f"model_{epoch}.pth")) + utils.save_on_master(checkpoint, os.path.join(args.output_dir, "checkpoint.pth")) total_time = time.time() - start_time total_time_str = str(datetime.timedelta(seconds=int(total_time))) - print('Training time {}'.format(total_time_str)) + print(f"Training time {total_time_str}") def get_args_parser(add_help=True): import argparse - parser = argparse.ArgumentParser(description='PyTorch Classification Training', add_help=add_help) - - parser.add_argument('--data-path', default='/datasets01/imagenet_full_size/061417/', help='dataset') - parser.add_argument('--model', default='resnet18', help='model') - parser.add_argument('--device', default='cuda', help='device') - parser.add_argument('-b', '--batch-size', default=32, type=int) - parser.add_argument('--epochs', default=90, type=int, metavar='N', - help='number of total epochs to run') - parser.add_argument('-j', '--workers', default=16, type=int, metavar='N', - help='number of data loading workers (default: 16)') - parser.add_argument('--opt', default='sgd', type=str, help='optimizer') - parser.add_argument('--lr', default=0.1, type=float, help='initial learning rate') - parser.add_argument('--momentum', default=0.9, type=float, metavar='M', - help='momentum') - parser.add_argument('--wd', '--weight-decay', default=1e-4, type=float, - metavar='W', help='weight decay (default: 1e-4)', - dest='weight_decay') - parser.add_argument('--lr-step-size', default=30, type=int, help='decrease lr every step-size epochs') - parser.add_argument('--lr-gamma', default=0.1, type=float, help='decrease lr by a factor of lr-gamma') - parser.add_argument('--print-freq', default=10, type=int, help='print frequency') - parser.add_argument('--output-dir', default='.', help='path where to save') - parser.add_argument('--resume', default='', help='resume from checkpoint') - parser.add_argument('--start-epoch', default=0, type=int, metavar='N', - help='start epoch') + + parser = argparse.ArgumentParser(description="PyTorch Classification Training", add_help=add_help) + + parser.add_argument("--data-path", default="/datasets01/imagenet_full_size/061417/", type=str, help="dataset path") + parser.add_argument("--model", default="resnet18", type=str, help="model name") + parser.add_argument("--device", default="cuda", type=str, help="device (Use cuda or cpu Default: cuda)") + parser.add_argument( + "-b", "--batch-size", default=32, type=int, help="images per gpu, the total batch size is $NGPU x batch_size" + ) + parser.add_argument("--epochs", default=90, type=int, metavar="N", help="number of total epochs to run") + parser.add_argument( + "-j", "--workers", default=16, type=int, metavar="N", help="number of data loading workers (default: 16)" + ) + parser.add_argument("--opt", default="sgd", type=str, help="optimizer") + parser.add_argument("--lr", default=0.1, type=float, help="initial learning rate") + parser.add_argument("--momentum", default=0.9, type=float, metavar="M", help="momentum") + parser.add_argument( + "--wd", + "--weight-decay", + default=1e-4, + type=float, + metavar="W", + help="weight decay (default: 1e-4)", + dest="weight_decay", + ) + parser.add_argument( + "--norm-weight-decay", + default=None, + type=float, + help="weight decay for Normalization layers (default: None, same value as --wd)", + ) + parser.add_argument( + "--bias-weight-decay", + default=None, + type=float, + help="weight decay for bias parameters of all layers (default: None, same value as --wd)", + ) + parser.add_argument( + "--transformer-embedding-decay", + default=None, + type=float, + help="weight decay for embedding parameters for vision transformer models (default: None, same value as --wd)", + ) + parser.add_argument( + "--label-smoothing", default=0.0, type=float, help="label smoothing (default: 0.0)", dest="label_smoothing" + ) + parser.add_argument("--mixup-alpha", default=0.0, type=float, help="mixup alpha (default: 0.0)") + parser.add_argument("--cutmix-alpha", default=0.0, type=float, help="cutmix alpha (default: 0.0)") + parser.add_argument("--lr-scheduler", default="steplr", type=str, help="the lr scheduler (default: steplr)") + parser.add_argument("--lr-warmup-epochs", default=0, type=int, help="the number of epochs to warmup (default: 0)") + parser.add_argument( + "--lr-warmup-method", default="constant", type=str, help="the warmup method (default: constant)" + ) + parser.add_argument("--lr-warmup-decay", default=0.01, type=float, help="the decay for lr") + parser.add_argument("--lr-step-size", default=30, type=int, help="decrease lr every step-size epochs") + parser.add_argument("--lr-gamma", default=0.1, type=float, help="decrease lr by a factor of lr-gamma") + parser.add_argument("--lr-min", default=0.0, type=float, help="minimum lr of lr schedule (default: 0.0)") + parser.add_argument("--print-freq", default=10, type=int, help="print frequency") + parser.add_argument("--output-dir", default=".", type=str, help="path to save outputs") + parser.add_argument("--resume", default="", type=str, help="path of checkpoint") + parser.add_argument("--start-epoch", default=0, type=int, metavar="N", help="start epoch") parser.add_argument( "--cache-dataset", dest="cache_dataset", @@ -268,29 +471,55 @@ def get_args_parser(add_help=True): help="Only test the model", action="store_true", ) - parser.add_argument( - "--pretrained", - dest="pretrained", - help="Use pre-trained models from the modelzoo", - action="store_true", - ) - parser.add_argument('--auto-augment', default=None, help='auto augment policy (default: None)') - parser.add_argument('--random-erase', default=0.0, type=float, help='random erasing probability (default: 0.0)') + parser.add_argument("--auto-augment", default=None, type=str, help="auto augment policy (default: None)") + parser.add_argument("--ra-magnitude", default=9, type=int, help="magnitude of auto augment policy") + parser.add_argument("--augmix-severity", default=3, type=int, help="severity of augmix policy") + parser.add_argument("--random-erase", default=0.0, type=float, help="random erasing probability (default: 0.0)") # Mixed precision training parameters - parser.add_argument('--apex', action='store_true', - help='Use apex for mixed precision training') - parser.add_argument('--apex-opt-level', default='O1', type=str, - help='For apex mixed precision training' - 'O0 for FP32 training, O1 for mixed precision training.' - 'For further detail, see https://github.com/NVIDIA/apex/tree/master/examples/imagenet' - ) + parser.add_argument("--amp", action="store_true", help="Use torch.cuda.amp for mixed precision training") # distributed training parameters - parser.add_argument('--world-size', default=1, type=int, - help='number of distributed processes') - parser.add_argument('--dist-url', default='env://', help='url used to set up distributed training') - + parser.add_argument("--world-size", default=1, type=int, help="number of distributed processes") + parser.add_argument("--dist-url", default="env://", type=str, help="url used to set up distributed training") + parser.add_argument( + "--model-ema", action="store_true", help="enable tracking Exponential Moving Average of model parameters" + ) + parser.add_argument( + "--model-ema-steps", + type=int, + default=32, + help="the number of iterations that controls how often to update the EMA model (default: 32)", + ) + parser.add_argument( + "--model-ema-decay", + type=float, + default=0.99998, + help="decay factor for Exponential Moving Average of model parameters (default: 0.99998)", + ) + parser.add_argument( + "--use-deterministic-algorithms", action="store_true", help="Forces the use of deterministic algorithms only." + ) + parser.add_argument( + "--interpolation", default="bilinear", type=str, help="the interpolation method (default: bilinear)" + ) + parser.add_argument( + "--val-resize-size", default=256, type=int, help="the resize size used for validation (default: 256)" + ) + parser.add_argument( + "--val-crop-size", default=224, type=int, help="the central crop size used for validation (default: 224)" + ) + parser.add_argument( + "--train-crop-size", default=224, type=int, help="the random crop size used for training (default: 224)" + ) + parser.add_argument("--clip-grad-norm", default=None, type=float, help="the maximum gradient norm (default None)") + parser.add_argument("--ra-sampler", action="store_true", help="whether to use Repeated Augmentation in training") + parser.add_argument( + "--ra-reps", default=3, type=int, help="number of repetitions for Repeated Augmentation (default: 3)" + ) + parser.add_argument("--weights", default=None, type=str, help="the weights enum name to load") + parser.add_argument("--backend", default="PIL", type=str.lower, help="PIL or tensor - case insensitive") + parser.add_argument("--use-v2", action="store_true", help="Use V2 transforms") return parser diff --git a/references/classification/train_quantization.py b/references/classification/train_quantization.py index ec945f4f58f915dfdd89203b856f503789d4f346..bd324c6eef7a08453ec0a78f20a718601b1830e8 100644 --- a/references/classification/train_quantization.py +++ b/references/classification/train_quantization.py @@ -1,15 +1,15 @@ +import copy import datetime import os import time -import copy import torch +import torch.ao.quantization import torch.utils.data -from torch import nn import torchvision -import torch.quantization import utils -from train import train_one_epoch, evaluate, load_data +from torch import nn +from train import evaluate, load_data, train_one_epoch def main(args): @@ -20,51 +20,52 @@ def main(args): print(args) if args.post_training_quantize and args.distributed: - raise RuntimeError("Post training quantization example should not be performed " - "on distributed mode") + raise RuntimeError("Post training quantization example should not be performed on distributed mode") # Set backend engine to ensure that quantized model runs on the correct kernels - if args.backend not in torch.backends.quantized.supported_engines: - raise RuntimeError("Quantized backend not supported: " + str(args.backend)) - torch.backends.quantized.engine = args.backend + if args.qbackend not in torch.backends.quantized.supported_engines: + raise RuntimeError("Quantized backend not supported: " + str(args.qbackend)) + torch.backends.quantized.engine = args.qbackend device = torch.device(args.device) torch.backends.cudnn.benchmark = True # Data loading code print("Loading data") - train_dir = os.path.join(args.data_path, 'train') - val_dir = os.path.join(args.data_path, 'val') + train_dir = os.path.join(args.data_path, "train") + val_dir = os.path.join(args.data_path, "val") dataset, dataset_test, train_sampler, test_sampler = load_data(train_dir, val_dir, args) data_loader = torch.utils.data.DataLoader( - dataset, batch_size=args.batch_size, - sampler=train_sampler, num_workers=args.workers, pin_memory=True) + dataset, batch_size=args.batch_size, sampler=train_sampler, num_workers=args.workers, pin_memory=True + ) data_loader_test = torch.utils.data.DataLoader( - dataset_test, batch_size=args.eval_batch_size, - sampler=test_sampler, num_workers=args.workers, pin_memory=True) + dataset_test, batch_size=args.eval_batch_size, sampler=test_sampler, num_workers=args.workers, pin_memory=True + ) print("Creating model", args.model) # when training quantized models, we always start from a pre-trained fp32 reference model - model = torchvision.models.quantization.__dict__[args.model](pretrained=True, quantize=args.test_only) + prefix = "quantized_" + model_name = args.model + if not model_name.startswith(prefix): + model_name = prefix + model_name + model = torchvision.models.get_model(model_name, weights=args.weights, quantize=args.test_only) model.to(device) if not (args.test_only or args.post_training_quantize): - model.fuse_model() - model.qconfig = torch.quantization.get_default_qat_qconfig(args.backend) - torch.quantization.prepare_qat(model, inplace=True) + model.fuse_model(is_qat=True) + model.qconfig = torch.ao.quantization.get_default_qat_qconfig(args.qbackend) + torch.ao.quantization.prepare_qat(model, inplace=True) if args.distributed and args.sync_bn: model = torch.nn.SyncBatchNorm.convert_sync_batchnorm(model) optimizer = torch.optim.SGD( - model.parameters(), lr=args.lr, momentum=args.momentum, - weight_decay=args.weight_decay) + model.parameters(), lr=args.lr, momentum=args.momentum, weight_decay=args.weight_decay + ) - lr_scheduler = torch.optim.lr_scheduler.StepLR(optimizer, - step_size=args.lr_step_size, - gamma=args.lr_gamma) + lr_scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=args.lr_step_size, gamma=args.lr_gamma) criterion = nn.CrossEntropyLoss() model_without_ddp = model @@ -73,34 +74,31 @@ def main(args): model_without_ddp = model.module if args.resume: - checkpoint = torch.load(args.resume, map_location='cpu') - model_without_ddp.load_state_dict(checkpoint['model']) - optimizer.load_state_dict(checkpoint['optimizer']) - lr_scheduler.load_state_dict(checkpoint['lr_scheduler']) - args.start_epoch = checkpoint['epoch'] + 1 + checkpoint = torch.load(args.resume, map_location="cpu", weights_only=True) + model_without_ddp.load_state_dict(checkpoint["model"]) + optimizer.load_state_dict(checkpoint["optimizer"]) + lr_scheduler.load_state_dict(checkpoint["lr_scheduler"]) + args.start_epoch = checkpoint["epoch"] + 1 if args.post_training_quantize: # perform calibration on a subset of the training dataset # for that, create a subset of the training dataset - ds = torch.utils.data.Subset( - dataset, - indices=list(range(args.batch_size * args.num_calibration_batches))) + ds = torch.utils.data.Subset(dataset, indices=list(range(args.batch_size * args.num_calibration_batches))) data_loader_calibration = torch.utils.data.DataLoader( - ds, batch_size=args.batch_size, shuffle=False, num_workers=args.workers, - pin_memory=True) + ds, batch_size=args.batch_size, shuffle=False, num_workers=args.workers, pin_memory=True + ) model.eval() - model.fuse_model() - model.qconfig = torch.quantization.get_default_qconfig(args.backend) - torch.quantization.prepare(model, inplace=True) + model.fuse_model(is_qat=False) + model.qconfig = torch.ao.quantization.get_default_qconfig(args.qbackend) + torch.ao.quantization.prepare(model, inplace=True) # Calibrate first print("Calibrating") evaluate(model, criterion, data_loader_calibration, device=device, print_freq=1) - torch.quantization.convert(model, inplace=True) + torch.ao.quantization.convert(model, inplace=True) if args.output_dir: - print('Saving quantized model') + print("Saving quantized model") if utils.is_main_process(): - torch.save(model.state_dict(), os.path.join(args.output_dir, - 'quantized_post_train_model.pth')) + torch.save(model.state_dict(), os.path.join(args.output_dir, "quantized_post_train_model.pth")) print("Evaluating post-training quantized model") evaluate(model, criterion, data_loader_test, device=device) return @@ -109,113 +107,111 @@ def main(args): evaluate(model, criterion, data_loader_test, device=device) return - model.apply(torch.quantization.enable_observer) - model.apply(torch.quantization.enable_fake_quant) + model.apply(torch.ao.quantization.enable_observer) + model.apply(torch.ao.quantization.enable_fake_quant) start_time = time.time() for epoch in range(args.start_epoch, args.epochs): if args.distributed: train_sampler.set_epoch(epoch) - print('Starting training for epoch', epoch) - train_one_epoch(model, criterion, optimizer, data_loader, device, epoch, - args.print_freq) + print("Starting training for epoch", epoch) + train_one_epoch(model, criterion, optimizer, data_loader, device, epoch, args) lr_scheduler.step() - with torch.no_grad(): + with torch.inference_mode(): if epoch >= args.num_observer_update_epochs: - print('Disabling observer for subseq epochs, epoch = ', epoch) - model.apply(torch.quantization.disable_observer) + print("Disabling observer for subseq epochs, epoch = ", epoch) + model.apply(torch.ao.quantization.disable_observer) if epoch >= args.num_batch_norm_update_epochs: - print('Freezing BN for subseq epochs, epoch = ', epoch) + print("Freezing BN for subseq epochs, epoch = ", epoch) model.apply(torch.nn.intrinsic.qat.freeze_bn_stats) - print('Evaluate QAT model') + print("Evaluate QAT model") - evaluate(model, criterion, data_loader_test, device=device) + evaluate(model, criterion, data_loader_test, device=device, log_suffix="QAT") quantized_eval_model = copy.deepcopy(model_without_ddp) quantized_eval_model.eval() - quantized_eval_model.to(torch.device('cpu')) - torch.quantization.convert(quantized_eval_model, inplace=True) + quantized_eval_model.to(torch.device("cpu")) + torch.ao.quantization.convert(quantized_eval_model, inplace=True) - print('Evaluate Quantized model') - evaluate(quantized_eval_model, criterion, data_loader_test, - device=torch.device('cpu')) + print("Evaluate Quantized model") + evaluate(quantized_eval_model, criterion, data_loader_test, device=torch.device("cpu")) model.train() if args.output_dir: checkpoint = { - 'model': model_without_ddp.state_dict(), - 'eval_model': quantized_eval_model.state_dict(), - 'optimizer': optimizer.state_dict(), - 'lr_scheduler': lr_scheduler.state_dict(), - 'epoch': epoch, - 'args': args} - utils.save_on_master( - checkpoint, - os.path.join(args.output_dir, 'model_{}.pth'.format(epoch))) - utils.save_on_master( - checkpoint, - os.path.join(args.output_dir, 'checkpoint.pth')) - print('Saving models after epoch ', epoch) + "model": model_without_ddp.state_dict(), + "eval_model": quantized_eval_model.state_dict(), + "optimizer": optimizer.state_dict(), + "lr_scheduler": lr_scheduler.state_dict(), + "epoch": epoch, + "args": args, + } + utils.save_on_master(checkpoint, os.path.join(args.output_dir, f"model_{epoch}.pth")) + utils.save_on_master(checkpoint, os.path.join(args.output_dir, "checkpoint.pth")) + print("Saving models after epoch ", epoch) total_time = time.time() - start_time total_time_str = str(datetime.timedelta(seconds=int(total_time))) - print('Training time {}'.format(total_time_str)) + print(f"Training time {total_time_str}") def get_args_parser(add_help=True): import argparse - parser = argparse.ArgumentParser(description='PyTorch Quantized Classification Training', add_help=add_help) - - parser.add_argument('--data-path', - default='/datasets01/imagenet_full_size/061417/', - help='dataset') - parser.add_argument('--model', - default='mobilenet_v2', - help='model') - parser.add_argument('--backend', - default='qnnpack', - help='fbgemm or qnnpack') - parser.add_argument('--device', - default='cuda', - help='device') - - parser.add_argument('-b', '--batch-size', default=32, type=int, - help='batch size for calibration/training') - parser.add_argument('--eval-batch-size', default=128, type=int, - help='batch size for evaluation') - parser.add_argument('--epochs', default=90, type=int, metavar='N', - help='number of total epochs to run') - parser.add_argument('--num-observer-update-epochs', - default=4, type=int, metavar='N', - help='number of total epochs to update observers') - parser.add_argument('--num-batch-norm-update-epochs', default=3, - type=int, metavar='N', - help='number of total epochs to update batch norm stats') - parser.add_argument('--num-calibration-batches', - default=32, type=int, metavar='N', - help='number of batches of training set for \ - observer calibration ') - - parser.add_argument('-j', '--workers', default=16, type=int, metavar='N', - help='number of data loading workers (default: 16)') - parser.add_argument('--lr', - default=0.0001, type=float, - help='initial learning rate') - parser.add_argument('--momentum', - default=0.9, type=float, metavar='M', - help='momentum') - parser.add_argument('--wd', '--weight-decay', default=1e-4, type=float, - metavar='W', help='weight decay (default: 1e-4)', - dest='weight_decay') - parser.add_argument('--lr-step-size', default=30, type=int, - help='decrease lr every step-size epochs') - parser.add_argument('--lr-gamma', default=0.1, type=float, - help='decrease lr by a factor of lr-gamma') - parser.add_argument('--print-freq', default=10, type=int, - help='print frequency') - parser.add_argument('--output-dir', default='.', help='path where to save') - parser.add_argument('--resume', default='', help='resume from checkpoint') - parser.add_argument('--start-epoch', default=0, type=int, metavar='N', - help='start epoch') + + parser = argparse.ArgumentParser(description="PyTorch Quantized Classification Training", add_help=add_help) + + parser.add_argument("--data-path", default="/datasets01/imagenet_full_size/061417/", type=str, help="dataset path") + parser.add_argument("--model", default="mobilenet_v2", type=str, help="model name") + parser.add_argument("--qbackend", default="qnnpack", type=str, help="Quantized backend: fbgemm or qnnpack") + parser.add_argument("--device", default="cuda", type=str, help="device (Use cuda or cpu Default: cuda)") + + parser.add_argument( + "-b", "--batch-size", default=32, type=int, help="images per gpu, the total batch size is $NGPU x batch_size" + ) + parser.add_argument("--eval-batch-size", default=128, type=int, help="batch size for evaluation") + parser.add_argument("--epochs", default=90, type=int, metavar="N", help="number of total epochs to run") + parser.add_argument( + "--num-observer-update-epochs", + default=4, + type=int, + metavar="N", + help="number of total epochs to update observers", + ) + parser.add_argument( + "--num-batch-norm-update-epochs", + default=3, + type=int, + metavar="N", + help="number of total epochs to update batch norm stats", + ) + parser.add_argument( + "--num-calibration-batches", + default=32, + type=int, + metavar="N", + help="number of batches of training set for \ + observer calibration ", + ) + + parser.add_argument( + "-j", "--workers", default=16, type=int, metavar="N", help="number of data loading workers (default: 16)" + ) + parser.add_argument("--lr", default=0.0001, type=float, help="initial learning rate") + parser.add_argument("--momentum", default=0.9, type=float, metavar="M", help="momentum") + parser.add_argument( + "--wd", + "--weight-decay", + default=1e-4, + type=float, + metavar="W", + help="weight decay (default: 1e-4)", + dest="weight_decay", + ) + parser.add_argument("--lr-step-size", default=30, type=int, help="decrease lr every step-size epochs") + parser.add_argument("--lr-gamma", default=0.1, type=float, help="decrease lr by a factor of lr-gamma") + parser.add_argument("--print-freq", default=10, type=int, help="print frequency") + parser.add_argument("--output-dir", default=".", type=str, help="path to save outputs") + parser.add_argument("--resume", default="", type=str, help="path of checkpoint") + parser.add_argument("--start-epoch", default=0, type=int, metavar="N", help="start epoch") parser.add_argument( "--cache-dataset", dest="cache_dataset", @@ -243,15 +239,35 @@ def get_args_parser(add_help=True): ) # distributed training parameters - parser.add_argument('--world-size', default=1, type=int, - help='number of distributed processes') - parser.add_argument('--dist-url', - default='env://', - help='url used to set up distributed training') + parser.add_argument("--world-size", default=1, type=int, help="number of distributed processes") + parser.add_argument("--dist-url", default="env://", type=str, help="url used to set up distributed training") + + parser.add_argument( + "--interpolation", default="bilinear", type=str, help="the interpolation method (default: bilinear)" + ) + parser.add_argument( + "--val-resize-size", default=256, type=int, help="the resize size used for validation (default: 256)" + ) + parser.add_argument( + "--val-crop-size", default=224, type=int, help="the central crop size used for validation (default: 224)" + ) + parser.add_argument( + "--train-crop-size", default=224, type=int, help="the random crop size used for training (default: 224)" + ) + parser.add_argument("--clip-grad-norm", default=None, type=float, help="the maximum gradient norm (default None)") + parser.add_argument("--weights", default=None, type=str, help="the weights enum name to load") + + parser.add_argument("--backend", default="PIL", type=str.lower, help="PIL or tensor - case insensitive") + parser.add_argument("--use-v2", action="store_true", help="Use V2 transforms") return parser if __name__ == "__main__": args = get_args_parser().parse_args() + if args.backend in ("fbgemm", "qnnpack"): + raise ValueError( + "The --backend parameter has been re-purposed to specify the backend of the transforms (PIL or Tensor) " + "instead of the quantized backend. Please use the --qbackend parameter to specify the quantized backend." + ) main(args) diff --git a/references/classification/transforms.py b/references/classification/transforms.py new file mode 100644 index 0000000000000000000000000000000000000000..96236608eec05f2237b1d72e8c1ce1d9c2127faf --- /dev/null +++ b/references/classification/transforms.py @@ -0,0 +1,206 @@ +import math +from typing import Tuple + +import torch +from presets import get_module +from torch import Tensor +from torchvision.transforms import functional as F + + +def get_mixup_cutmix(*, mixup_alpha, cutmix_alpha, num_classes, use_v2): + transforms_module = get_module(use_v2) + + mixup_cutmix = [] + if mixup_alpha > 0: + mixup_cutmix.append( + transforms_module.MixUp(alpha=mixup_alpha, num_classes=num_classes) + if use_v2 + else RandomMixUp(num_classes=num_classes, p=1.0, alpha=mixup_alpha) + ) + if cutmix_alpha > 0: + mixup_cutmix.append( + transforms_module.CutMix(alpha=cutmix_alpha, num_classes=num_classes) + if use_v2 + else RandomCutMix(num_classes=num_classes, p=1.0, alpha=cutmix_alpha) + ) + if not mixup_cutmix: + return None + + return transforms_module.RandomChoice(mixup_cutmix) + + +class RandomMixUp(torch.nn.Module): + """Randomly apply MixUp to the provided batch and targets. + The class implements the data augmentations as described in the paper + `"mixup: Beyond Empirical Risk Minimization" `_. + + Args: + num_classes (int): number of classes used for one-hot encoding. + p (float): probability of the batch being transformed. Default value is 0.5. + alpha (float): hyperparameter of the Beta distribution used for mixup. + Default value is 1.0. + inplace (bool): boolean to make this transform inplace. Default set to False. + """ + + def __init__(self, num_classes: int, p: float = 0.5, alpha: float = 1.0, inplace: bool = False) -> None: + super().__init__() + + if num_classes < 1: + raise ValueError( + f"Please provide a valid positive value for the num_classes. Got num_classes={num_classes}" + ) + + if alpha <= 0: + raise ValueError("Alpha param can't be zero.") + + self.num_classes = num_classes + self.p = p + self.alpha = alpha + self.inplace = inplace + + def forward(self, batch: Tensor, target: Tensor) -> Tuple[Tensor, Tensor]: + """ + Args: + batch (Tensor): Float tensor of size (B, C, H, W) + target (Tensor): Integer tensor of size (B, ) + + Returns: + Tensor: Randomly transformed batch. + """ + if batch.ndim != 4: + raise ValueError(f"Batch ndim should be 4. Got {batch.ndim}") + if target.ndim != 1: + raise ValueError(f"Target ndim should be 1. Got {target.ndim}") + if not batch.is_floating_point(): + raise TypeError(f"Batch dtype should be a float tensor. Got {batch.dtype}.") + if target.dtype != torch.int64: + raise TypeError(f"Target dtype should be torch.int64. Got {target.dtype}") + + if not self.inplace: + batch = batch.clone() + target = target.clone() + + if target.ndim == 1: + target = torch.nn.functional.one_hot(target, num_classes=self.num_classes).to(dtype=batch.dtype) + + if torch.rand(1).item() >= self.p: + return batch, target + + # It's faster to roll the batch by one instead of shuffling it to create image pairs + batch_rolled = batch.roll(1, 0) + target_rolled = target.roll(1, 0) + + # Implemented as on mixup paper, page 3. + lambda_param = float(torch._sample_dirichlet(torch.tensor([self.alpha, self.alpha]))[0]) + batch_rolled.mul_(1.0 - lambda_param) + batch.mul_(lambda_param).add_(batch_rolled) + + target_rolled.mul_(1.0 - lambda_param) + target.mul_(lambda_param).add_(target_rolled) + + return batch, target + + def __repr__(self) -> str: + s = ( + f"{self.__class__.__name__}(" + f"num_classes={self.num_classes}" + f", p={self.p}" + f", alpha={self.alpha}" + f", inplace={self.inplace}" + f")" + ) + return s + + +class RandomCutMix(torch.nn.Module): + """Randomly apply CutMix to the provided batch and targets. + The class implements the data augmentations as described in the paper + `"CutMix: Regularization Strategy to Train Strong Classifiers with Localizable Features" + `_. + + Args: + num_classes (int): number of classes used for one-hot encoding. + p (float): probability of the batch being transformed. Default value is 0.5. + alpha (float): hyperparameter of the Beta distribution used for cutmix. + Default value is 1.0. + inplace (bool): boolean to make this transform inplace. Default set to False. + """ + + def __init__(self, num_classes: int, p: float = 0.5, alpha: float = 1.0, inplace: bool = False) -> None: + super().__init__() + if num_classes < 1: + raise ValueError("Please provide a valid positive value for the num_classes.") + if alpha <= 0: + raise ValueError("Alpha param can't be zero.") + + self.num_classes = num_classes + self.p = p + self.alpha = alpha + self.inplace = inplace + + def forward(self, batch: Tensor, target: Tensor) -> Tuple[Tensor, Tensor]: + """ + Args: + batch (Tensor): Float tensor of size (B, C, H, W) + target (Tensor): Integer tensor of size (B, ) + + Returns: + Tensor: Randomly transformed batch. + """ + if batch.ndim != 4: + raise ValueError(f"Batch ndim should be 4. Got {batch.ndim}") + if target.ndim != 1: + raise ValueError(f"Target ndim should be 1. Got {target.ndim}") + if not batch.is_floating_point(): + raise TypeError(f"Batch dtype should be a float tensor. Got {batch.dtype}.") + if target.dtype != torch.int64: + raise TypeError(f"Target dtype should be torch.int64. Got {target.dtype}") + + if not self.inplace: + batch = batch.clone() + target = target.clone() + + if target.ndim == 1: + target = torch.nn.functional.one_hot(target, num_classes=self.num_classes).to(dtype=batch.dtype) + + if torch.rand(1).item() >= self.p: + return batch, target + + # It's faster to roll the batch by one instead of shuffling it to create image pairs + batch_rolled = batch.roll(1, 0) + target_rolled = target.roll(1, 0) + + # Implemented as on cutmix paper, page 12 (with minor corrections on typos). + lambda_param = float(torch._sample_dirichlet(torch.tensor([self.alpha, self.alpha]))[0]) + _, H, W = F.get_dimensions(batch) + + r_x = torch.randint(W, (1,)) + r_y = torch.randint(H, (1,)) + + r = 0.5 * math.sqrt(1.0 - lambda_param) + r_w_half = int(r * W) + r_h_half = int(r * H) + + x1 = int(torch.clamp(r_x - r_w_half, min=0)) + y1 = int(torch.clamp(r_y - r_h_half, min=0)) + x2 = int(torch.clamp(r_x + r_w_half, max=W)) + y2 = int(torch.clamp(r_y + r_h_half, max=H)) + + batch[:, :, y1:y2, x1:x2] = batch_rolled[:, :, y1:y2, x1:x2] + lambda_param = float(1.0 - (x2 - x1) * (y2 - y1) / (W * H)) + + target_rolled.mul_(1.0 - lambda_param) + target.mul_(lambda_param).add_(target_rolled) + + return batch, target + + def __repr__(self) -> str: + s = ( + f"{self.__class__.__name__}(" + f"num_classes={self.num_classes}" + f", p={self.p}" + f", alpha={self.alpha}" + f", inplace={self.inplace}" + f")" + ) + return s diff --git a/references/classification/utils.py b/references/classification/utils.py index 4e53ed1d3d703109f9e6eba05966fb008e3d5623..7d9f0136ae8e9712b5378fe8726a464fcae090f3 100644 --- a/references/classification/utils.py +++ b/references/classification/utils.py @@ -1,16 +1,17 @@ -from collections import defaultdict, deque, OrderedDict import copy import datetime +import errno import hashlib +import os import time +from collections import defaultdict, deque, OrderedDict +from typing import List, Optional, Tuple + import torch import torch.distributed as dist -import errno -import os - -class SmoothedValue(object): +class SmoothedValue: """Track a series of values and provide access to smoothed values over a window or the global series average. """ @@ -32,11 +33,7 @@ class SmoothedValue(object): """ Warning: does not synchronize the deque! """ - if not is_dist_avail_and_initialized(): - return - t = torch.tensor([self.count, self.total], dtype=torch.float64, device='cuda') - dist.barrier() - dist.all_reduce(t) + t = reduce_across_processes([self.count, self.total]) t = t.tolist() self.count = int(t[0]) self.total = t[1] @@ -65,14 +62,11 @@ class SmoothedValue(object): def __str__(self): return self.fmt.format( - median=self.median, - avg=self.avg, - global_avg=self.global_avg, - max=self.max, - value=self.value) + median=self.median, avg=self.avg, global_avg=self.global_avg, max=self.max, value=self.value + ) -class MetricLogger(object): +class MetricLogger: def __init__(self, delimiter="\t"): self.meters = defaultdict(SmoothedValue) self.delimiter = delimiter @@ -89,15 +83,12 @@ class MetricLogger(object): return self.meters[attr] if attr in self.__dict__: return self.__dict__[attr] - raise AttributeError("'{}' object has no attribute '{}'".format( - type(self).__name__, attr)) + raise AttributeError(f"'{type(self).__name__}' object has no attribute '{attr}'") def __str__(self): loss_str = [] for name, meter in self.meters.items(): - loss_str.append( - "{}: {}".format(name, str(meter)) - ) + loss_str.append(f"{name}: {str(meter)}") return self.delimiter.join(loss_str) def synchronize_between_processes(self): @@ -110,31 +101,28 @@ class MetricLogger(object): def log_every(self, iterable, print_freq, header=None): i = 0 if not header: - header = '' + header = "" start_time = time.time() end = time.time() - iter_time = SmoothedValue(fmt='{avg:.4f}') - data_time = SmoothedValue(fmt='{avg:.4f}') - space_fmt = ':' + str(len(str(len(iterable)))) + 'd' + iter_time = SmoothedValue(fmt="{avg:.4f}") + data_time = SmoothedValue(fmt="{avg:.4f}") + space_fmt = ":" + str(len(str(len(iterable)))) + "d" if torch.cuda.is_available(): - log_msg = self.delimiter.join([ - header, - '[{0' + space_fmt + '}/{1}]', - 'eta: {eta}', - '{meters}', - 'time: {time}', - 'data: {data}', - 'max mem: {memory:.0f}' - ]) + log_msg = self.delimiter.join( + [ + header, + "[{0" + space_fmt + "}/{1}]", + "eta: {eta}", + "{meters}", + "time: {time}", + "data: {data}", + "max mem: {memory:.0f}", + ] + ) else: - log_msg = self.delimiter.join([ - header, - '[{0' + space_fmt + '}/{1}]', - 'eta: {eta}', - '{meters}', - 'time: {time}', - 'data: {data}' - ]) + log_msg = self.delimiter.join( + [header, "[{0" + space_fmt + "}/{1}]", "eta: {eta}", "{meters}", "time: {time}", "data: {data}"] + ) MB = 1024.0 * 1024.0 for obj in iterable: data_time.update(time.time() - end) @@ -144,28 +132,51 @@ class MetricLogger(object): eta_seconds = iter_time.global_avg * (len(iterable) - i) eta_string = str(datetime.timedelta(seconds=int(eta_seconds))) if torch.cuda.is_available(): - print(log_msg.format( - i, len(iterable), eta=eta_string, - meters=str(self), - time=str(iter_time), data=str(data_time), - memory=torch.cuda.max_memory_allocated() / MB)) + print( + log_msg.format( + i, + len(iterable), + eta=eta_string, + meters=str(self), + time=str(iter_time), + data=str(data_time), + memory=torch.cuda.max_memory_allocated() / MB, + ) + ) else: - print(log_msg.format( - i, len(iterable), eta=eta_string, - meters=str(self), - time=str(iter_time), data=str(data_time))) + print( + log_msg.format( + i, len(iterable), eta=eta_string, meters=str(self), time=str(iter_time), data=str(data_time) + ) + ) i += 1 end = time.time() total_time = time.time() - start_time total_time_str = str(datetime.timedelta(seconds=int(total_time))) - print('{} Total time: {}'.format(header, total_time_str)) + print(f"{header} Total time: {total_time_str}") + + +class ExponentialMovingAverage(torch.optim.swa_utils.AveragedModel): + """Maintains moving averages of model parameters using an exponential decay. + ``ema_avg = decay * avg_model_param + (1 - decay) * model_param`` + `torch.optim.swa_utils.AveragedModel `_ + is used to compute the EMA. + """ + + def __init__(self, model, decay, device="cpu"): + def ema_avg(avg_model_param, model_param, num_averaged): + return decay * avg_model_param + (1 - decay) * model_param + + super().__init__(model, device, ema_avg, use_buffers=True) def accuracy(output, target, topk=(1,)): """Computes the accuracy over the k top predictions for the specified values of k""" - with torch.no_grad(): + with torch.inference_mode(): maxk = max(topk) batch_size = target.size(0) + if target.ndim == 2: + target = target.max(dim=1)[1] _, pred = output.topk(maxk, 1, True, True) pred = pred.t() @@ -191,10 +202,11 @@ def setup_for_distributed(is_master): This function disables printing when not in master process """ import builtins as __builtin__ + builtin_print = __builtin__.print def print(*args, **kwargs): - force = kwargs.pop('force', False) + force = kwargs.pop("force", False) if is_master or force: builtin_print(*args, **kwargs) @@ -231,28 +243,29 @@ def save_on_master(*args, **kwargs): def init_distributed_mode(args): - if 'RANK' in os.environ and 'WORLD_SIZE' in os.environ: + if "RANK" in os.environ and "WORLD_SIZE" in os.environ: args.rank = int(os.environ["RANK"]) - args.world_size = int(os.environ['WORLD_SIZE']) - args.gpu = int(os.environ['LOCAL_RANK']) - elif 'SLURM_PROCID' in os.environ: - args.rank = int(os.environ['SLURM_PROCID']) + args.world_size = int(os.environ["WORLD_SIZE"]) + args.gpu = int(os.environ["LOCAL_RANK"]) + elif "SLURM_PROCID" in os.environ: + args.rank = int(os.environ["SLURM_PROCID"]) args.gpu = args.rank % torch.cuda.device_count() elif hasattr(args, "rank"): pass else: - print('Not using distributed mode') + print("Not using distributed mode") args.distributed = False return args.distributed = True torch.cuda.set_device(args.gpu) - args.dist_backend = 'nccl' - print('| distributed init (rank {}): {}'.format( - args.rank, args.dist_url), flush=True) - torch.distributed.init_process_group(backend=args.dist_backend, init_method=args.dist_url, - world_size=args.world_size, rank=args.rank) + args.dist_backend = "nccl" + print(f"| distributed init (rank {args.rank}): {args.dist_url}", flush=True) + torch.distributed.init_process_group( + backend=args.dist_backend, init_method=args.dist_url, world_size=args.world_size, rank=args.rank + ) + torch.distributed.barrier() setup_for_distributed(args.rank == 0) @@ -274,10 +287,7 @@ def average_checkpoints(inputs): for fpath in inputs: with open(fpath, "rb") as f: state = torch.load( - f, - map_location=( - lambda s, _: torch.serialization.default_restore_location(s, "cpu") - ), + f, map_location=(lambda s, _: torch.serialization.default_restore_location(s, "cpu")), weights_only=True ) # Copies over the settings from the first checkpoint if new_state is None: @@ -288,8 +298,7 @@ def average_checkpoints(inputs): params_keys = model_params_keys elif params_keys != model_params_keys: raise KeyError( - "For checkpoint {}, expected list of params: {}, " - "but found: {}".format(f, params_keys, model_params_keys) + f"For checkpoint {f}, expected list of params: {params_keys}, but found: {model_params_keys}" ) for k in params_keys: p = model_params[k] @@ -311,7 +320,7 @@ def average_checkpoints(inputs): return new_state -def store_model_weights(model, checkpoint_path, checkpoint_key='model', strict=True): +def store_model_weights(model, checkpoint_path, checkpoint_key="model", strict=True): """ This method can be used to prepare weights files for new models. It receives as input a model architecture and a checkpoint from the training script and produces @@ -321,22 +330,22 @@ def store_model_weights(model, checkpoint_path, checkpoint_key='model', strict=T from torchvision import models as M # Classification - model = M.mobilenet_v3_large(pretrained=False) + model = M.mobilenet_v3_large(weights=None) print(store_model_weights(model, './class.pth')) # Quantized Classification - model = M.quantization.mobilenet_v3_large(pretrained=False, quantize=False) - model.fuse_model() - model.qconfig = torch.quantization.get_default_qat_qconfig('qnnpack') - _ = torch.quantization.prepare_qat(model, inplace=True) + model = M.quantization.mobilenet_v3_large(weights=None, quantize=False) + model.fuse_model(is_qat=True) + model.qconfig = torch.ao.quantization.get_default_qat_qconfig('qnnpack') + _ = torch.ao.quantization.prepare_qat(model, inplace=True) print(store_model_weights(model, './qat.pth')) # Object Detection - model = M.detection.fasterrcnn_mobilenet_v3_large_fpn(pretrained=False, pretrained_backbone=False) + model = M.detection.fasterrcnn_mobilenet_v3_large_fpn(weights=None, weights_backbone=None) print(store_model_weights(model, './obj.pth')) # Segmentation - model = M.segmentation.deeplabv3_mobilenet_v3_large(pretrained=False, pretrained_backbone=False, aux_loss=True) + model = M.segmentation.deeplabv3_mobilenet_v3_large(weights=None, weights_backbone=None, aux_loss=True) print(store_model_weights(model, './segm.pth', strict=False)) Args: @@ -355,12 +364,15 @@ def store_model_weights(model, checkpoint_path, checkpoint_key='model', strict=T checkpoint_path = os.path.abspath(checkpoint_path) output_dir = os.path.dirname(checkpoint_path) - # Deep copy to avoid side-effects on the model object. + # Deep copy to avoid side effects on the model object. model = copy.deepcopy(model) - checkpoint = torch.load(checkpoint_path, map_location='cpu') + checkpoint = torch.load(checkpoint_path, map_location="cpu", weights_only=True) # Load the weights to the model to validate that everything works - # and remove unnecessary weights (such as auxiliaries, etc) + # and remove unnecessary weights (such as auxiliaries, etc.) + if checkpoint_key == "model_ema": + del checkpoint[checkpoint_key]["n_averaged"] + torch.nn.modules.utils.consume_prefix_in_state_dict_if_present(checkpoint[checkpoint_key], "module.") model.load_state_dict(checkpoint[checkpoint_key], strict=strict) tmp_path = os.path.join(output_dir, str(model.__hash__())) @@ -377,3 +389,76 @@ def store_model_weights(model, checkpoint_path, checkpoint_key='model', strict=T os.replace(tmp_path, output_path) return output_path + + +def reduce_across_processes(val): + if not is_dist_avail_and_initialized(): + # nothing to sync, but we still convert to tensor for consistency with the distributed case. + return torch.tensor(val) + + t = torch.tensor(val, device="cuda") + dist.barrier() + dist.all_reduce(t) + return t + + +def set_weight_decay( + model: torch.nn.Module, + weight_decay: float, + norm_weight_decay: Optional[float] = None, + norm_classes: Optional[List[type]] = None, + custom_keys_weight_decay: Optional[List[Tuple[str, float]]] = None, +): + if not norm_classes: + norm_classes = [ + torch.nn.modules.batchnorm._BatchNorm, + torch.nn.LayerNorm, + torch.nn.GroupNorm, + torch.nn.modules.instancenorm._InstanceNorm, + torch.nn.LocalResponseNorm, + ] + norm_classes = tuple(norm_classes) + + params = { + "other": [], + "norm": [], + } + params_weight_decay = { + "other": weight_decay, + "norm": norm_weight_decay, + } + custom_keys = [] + if custom_keys_weight_decay is not None: + for key, weight_decay in custom_keys_weight_decay: + params[key] = [] + params_weight_decay[key] = weight_decay + custom_keys.append(key) + + def _add_params(module, prefix=""): + for name, p in module.named_parameters(recurse=False): + if not p.requires_grad: + continue + is_custom_key = False + for key in custom_keys: + target_name = f"{prefix}.{name}" if prefix != "" and "." in key else name + if key == target_name: + params[key].append(p) + is_custom_key = True + break + if not is_custom_key: + if norm_weight_decay is not None and isinstance(module, norm_classes): + params["norm"].append(p) + else: + params["other"].append(p) + + for child_name, child_module in module.named_children(): + child_prefix = f"{prefix}.{child_name}" if prefix != "" else child_name + _add_params(child_module, prefix=child_prefix) + + _add_params(model) + + param_groups = [] + for key in params: + if len(params[key]) > 0: + param_groups.append({"params": params[key], "weight_decay": params_weight_decay[key]}) + return param_groups diff --git a/references/depth/stereo/README.md b/references/depth/stereo/README.md new file mode 100644 index 0000000000000000000000000000000000000000..22bcae27ab0e81cbd9899e5db185819f27c1f115 --- /dev/null +++ b/references/depth/stereo/README.md @@ -0,0 +1,180 @@ +# Stereo Matching reference training scripts + +This folder contains reference training scripts for Stereo Matching. +They serve as a log of how to train specific models, so as to provide baseline +training and evaluation scripts to quickly bootstrap research. + + +### CREStereo + +The CREStereo model was trained on a dataset mixture between **CREStereo**, **ETH3D** and the additional split from **Middlebury2014**. +A ratio of **88-6-6** was used in order to train a baseline weight set. We provide multi-set variant as well. +Both used 8 A100 GPUs and a batch size of 2 (so effective batch size is 16). The +rest of the hyper-parameters loosely follow the recipe from https://github.com/megvii-research/CREStereo. +The original recipe trains for **300000** updates (or steps) on the dataset mixture. We modify the learning rate +schedule to one that starts decaying the weight much sooner. Throughout the experiments we found that this reduces +overfitting during evaluation time and gradient clip help stabilize the loss during a pre-mature learning rate change. + +``` +torchrun --nproc_per_node 8 --nnodes 1 train.py \ + --dataset-root $dataset_root \ + --name $name_cre \ + --model crestereo_base \ + --train-datasets crestereo eth3d-train middlebury2014-other \ + --dataset-steps 264000 18000 18000 + --batch-size 2 \ + --lr 0.0004 \ + --min-lr 0.00002 \ + --lr-decay-method cosine \ + --warmup-steps 6000 \ + --decay-after-steps 30000 \ + --clip-grad-norm 1.0 \ +``` + +We employ a multi-set fine-tuning stage where we uniformly sample from multiple datasets. Given hat some of these datasets have extremely large images (``2048x2048`` or more) we opt for a very aggressive scale-range ``[0.2 - 0.8]`` such that as much of the original frame composition is captured inside the ``384x512`` crop. + +``` +torchrun --nproc_per_node 8 --nnodes 1 train.py \ + --dataset-root $dataset_root \ + --name $name_things \ + --model crestereo_base \ + --train-datasets crestereo eth3d-train middlebury2014-other instereo2k fallingthings carla-highres sintel sceneflow-monkaa sceneflow-driving \ + --dataset-steps 12000 12000 12000 12000 12000 12000 12000 12000 12000 + --batch-size 2 \ + --scale-range 0.2 0.8 \ + --lr 0.0004 \ + --lr-decay-method cosine \ + --decay-after-steps 0 \ + --warmup-steps 0 \ + --min-lr 0.00002 \ + --resume-path $checkpoint_dir/$name_cre.pth +``` + + +### Evaluation + +Evaluating the base weights + +``` +torchrun --nproc_per_node 1 --nnodes 1 cascade_evaluation.py --dataset middlebury2014-train --batch-size 1 --dataset-root $dataset_root --model crestereo_base --weights CREStereo_Base_Weights.CRESTEREO_ETH_MBL_V1 +``` + +This should give an **mae of about 1.416** on the train set of `Middlebury2014`. Results may vary slightly depending on the batch size and the number of GPUs. For the most accurate results use 1 GPU and `--batch-size 1`. The created log file should look like this, where the first key is the number of cascades and the nested key is the number of recursive iterations: + +``` +Dataset: middlebury2014-train @size: [384, 512]: +{ + 1: { + 2: {'mae': 2.363, 'rmse': 4.352, '1px': 0.611, '3px': 0.828, '5px': 0.891, 'relepe': 0.176, 'fl-all': 64.511} + 5: {'mae': 1.618, 'rmse': 3.71, '1px': 0.761, '3px': 0.879, '5px': 0.918, 'relepe': 0.154, 'fl-all': 77.128} + 10: {'mae': 1.416, 'rmse': 3.53, '1px': 0.777, '3px': 0.896, '5px': 0.933, 'relepe': 0.148, 'fl-all': 78.388} + 20: {'mae': 1.448, 'rmse': 3.583, '1px': 0.771, '3px': 0.893, '5px': 0.931, 'relepe': 0.145, 'fl-all': 77.7} + }, +} +{ + 2: { + 2: {'mae': 1.972, 'rmse': 4.125, '1px': 0.73, '3px': 0.865, '5px': 0.908, 'relepe': 0.169, 'fl-all': 74.396} + 5: {'mae': 1.403, 'rmse': 3.448, '1px': 0.793, '3px': 0.905, '5px': 0.937, 'relepe': 0.151, 'fl-all': 80.186} + 10: {'mae': 1.312, 'rmse': 3.368, '1px': 0.799, '3px': 0.912, '5px': 0.943, 'relepe': 0.148, 'fl-all': 80.379} + 20: {'mae': 1.376, 'rmse': 3.542, '1px': 0.796, '3px': 0.91, '5px': 0.942, 'relepe': 0.149, 'fl-all': 80.054} + }, +} +``` + +You can also evaluate the Finetuned weights: + +``` +torchrun --nproc_per_node 1 --nnodes 1 cascade_evaluation.py --dataset middlebury2014-train --batch-size 1 --dataset-root $dataset_root --model crestereo_base --weights CREStereo_Base_Weights.CRESTEREO_FINETUNE_MULTI_V1 +``` + +``` +Dataset: middlebury2014-train @size: [384, 512]: +{ + 1: { + 2: {'mae': 1.85, 'rmse': 3.797, '1px': 0.673, '3px': 0.862, '5px': 0.917, 'relepe': 0.171, 'fl-all': 69.736} + 5: {'mae': 1.111, 'rmse': 3.166, '1px': 0.838, '3px': 0.93, '5px': 0.957, 'relepe': 0.134, 'fl-all': 84.596} + 10: {'mae': 1.02, 'rmse': 3.073, '1px': 0.854, '3px': 0.938, '5px': 0.96, 'relepe': 0.129, 'fl-all': 86.042} + 20: {'mae': 0.993, 'rmse': 3.059, '1px': 0.855, '3px': 0.942, '5px': 0.967, 'relepe': 0.126, 'fl-all': 85.784} + }, +} +{ + 2: { + 2: {'mae': 1.667, 'rmse': 3.867, '1px': 0.78, '3px': 0.891, '5px': 0.922, 'relepe': 0.165, 'fl-all': 78.89} + 5: {'mae': 1.158, 'rmse': 3.278, '1px': 0.843, '3px': 0.926, '5px': 0.955, 'relepe': 0.135, 'fl-all': 84.556} + 10: {'mae': 1.046, 'rmse': 3.13, '1px': 0.85, '3px': 0.934, '5px': 0.96, 'relepe': 0.13, 'fl-all': 85.464} + 20: {'mae': 1.021, 'rmse': 3.102, '1px': 0.85, '3px': 0.935, '5px': 0.963, 'relepe': 0.129, 'fl-all': 85.417} + }, +} +``` + +Evaluating the author provided weights: + +``` +torchrun --nproc_per_node 1 --nnodes 1 cascade_evaluation.py --dataset middlebury2014-train --batch-size 1 --dataset-root $dataset_root --model crestereo_base --weights CREStereo_Base_Weights.MEGVII_V1 +``` + +``` +Dataset: middlebury2014-train @size: [384, 512]: +{ + 1: { + 2: {'mae': 1.704, 'rmse': 3.738, '1px': 0.738, '3px': 0.896, '5px': 0.933, 'relepe': 0.157, 'fl-all': 76.464} + 5: {'mae': 0.956, 'rmse': 2.963, '1px': 0.88, '3px': 0.948, '5px': 0.965, 'relepe': 0.124, 'fl-all': 88.186} + 10: {'mae': 0.792, 'rmse': 2.765, '1px': 0.905, '3px': 0.958, '5px': 0.97, 'relepe': 0.114, 'fl-all': 90.429} + 20: {'mae': 0.749, 'rmse': 2.706, '1px': 0.907, '3px': 0.961, '5px': 0.972, 'relepe': 0.113, 'fl-all': 90.807} + }, +} +{ + 2: { + 2: {'mae': 1.702, 'rmse': 3.784, '1px': 0.784, '3px': 0.894, '5px': 0.924, 'relepe': 0.172, 'fl-all': 80.313} + 5: {'mae': 0.932, 'rmse': 2.907, '1px': 0.877, '3px': 0.944, '5px': 0.963, 'relepe': 0.125, 'fl-all': 87.979} + 10: {'mae': 0.773, 'rmse': 2.768, '1px': 0.901, '3px': 0.958, '5px': 0.972, 'relepe': 0.117, 'fl-all': 90.43} + 20: {'mae': 0.854, 'rmse': 2.971, '1px': 0.9, '3px': 0.957, '5px': 0.97, 'relepe': 0.122, 'fl-all': 90.269} + }, +} +``` + +# Concerns when training + +We encourage users to be aware of the **aspect-ratio** and **disparity scale** they are targeting when doing any sort of training or fine-tuning. The model is highly sensitive to these two factors, as a consequence of naive multi-set fine-tuning one can achieve `0.2 mae` relatively fast. We recommend that users pay close attention to how they **balance dataset sizing** when training such networks. + + Ideally, dataset scaling should be trated at an individual level and a thorough **EDA** of the disparity distribution in random crops at the desired training / inference size should be performed prior to any large compute investments. + +### Disparity scaling + +##### Sample A + The top row contains a sample from `Sintel` whereas the bottom row one from `Middlebury`. + +![Disparity1](assets/disparity-domain-drift.jpg) + +From left to right (`left_image`, `right_image`, `valid_mask`, `valid_mask & ground_truth`, `prediction`). **Darker is further away, lighter is closer**. In the case of `Sintel` which is more closely aligned to the original distribution of `CREStereo` we notice that the model accurately predicts the background scale whereas in the case of `Middlebury2014` it cannot correctly estimate the continuous disparity. Notice that the frame composition is similar for both examples. The blue skybox in the `Sintel` scene behaves similarly to the `Middlebury` black background. However, because the `Middlebury` samples comes from an extremely large scene the crop size of `384x512` does not correctly capture the general training distribution. + + + + +##### Sample B + +The top row contains a scene from `Sceneflow` using the `Monkaa` split whilst the bottom row is a scene from `Middlebury`. This sample exhibits the same issues when it comes to **background estimation**. Given the exaggerated size of the `Middlebury` samples the model **colapses the smooth background** of the sample to what it considers to be a mean background disparity value. + +![Disparity2](assets/disparity-background-mode-collapse.jpg) + + +For more detail on why this behaviour occurs based on the training distribution proportions you can read more about the network at: https://github.com/pytorch/vision/pull/6629#discussion_r978160493 + + +### Metric overfitting + +##### Learning is critical in the beginning + +We also advise users to make user of faster training schedules, as the performance gain over long periods time is marginal. Here we exhibit a difference between a faster decay schedule and later decay schedule. + +![Loss1](assets/Loss.jpg) + +In **grey** we set the lr decay to begin after `30000` steps whilst in **orange** we opt for a very late learning rate decay at around `180000` steps. Although exhibiting stronger variance, we can notice that unfreezing the learning rate earlier whilst employing `gradient-norm` out-performs the default configuration. + +##### Gradient norm saves time + +![Loss2](assets/gradient-norm-removal.jpg) + +In **grey** we keep ``gradient norm`` enabled whilst in **orange** we do not. We can notice that remvoing the gradient norm exacerbates the performance decrease in the early stages whilst also showcasing an almost complete collapse around the `60000` steps mark where we started decaying the lr for **orange**. + +Although both runs ahieve an improvement of about ``0.1`` mae after the lr decay start, the benefits of it are observable much faster when ``gradient norm`` is employed as the recovery period is no longer accounted for. diff --git a/references/depth/stereo/__init__.py b/references/depth/stereo/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/references/depth/stereo/assets/Loss.jpg b/references/depth/stereo/assets/Loss.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b6db8e204af6cf21f09f10610f218744a71b1d4d Binary files /dev/null and b/references/depth/stereo/assets/Loss.jpg differ diff --git a/references/depth/stereo/assets/disparity-background-mode-collapse.jpg b/references/depth/stereo/assets/disparity-background-mode-collapse.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b6542e8814f291f0be3eac48a4f18fb5a024cfe0 Binary files /dev/null and b/references/depth/stereo/assets/disparity-background-mode-collapse.jpg differ diff --git a/references/depth/stereo/assets/disparity-domain-drift.jpg b/references/depth/stereo/assets/disparity-domain-drift.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8a98de0367539ee7c01d410fd2beba5c2111791c Binary files /dev/null and b/references/depth/stereo/assets/disparity-domain-drift.jpg differ diff --git a/references/depth/stereo/assets/gradient-norm-removal.jpg b/references/depth/stereo/assets/gradient-norm-removal.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2c3c8459d5eb06b10643b11ab295a57846eb3792 Binary files /dev/null and b/references/depth/stereo/assets/gradient-norm-removal.jpg differ diff --git a/references/depth/stereo/cascade_evaluation.py b/references/depth/stereo/cascade_evaluation.py new file mode 100644 index 0000000000000000000000000000000000000000..7cb6413f1a52f7203873201dfad8ee4942ed43a7 --- /dev/null +++ b/references/depth/stereo/cascade_evaluation.py @@ -0,0 +1,299 @@ +import os +import warnings + +import torch +import torchvision +import torchvision.prototype.models.depth.stereo +import utils +from torch.nn import functional as F +from train import make_eval_loader + +from utils.metrics import AVAILABLE_METRICS +from visualization import make_prediction_image_side_to_side + + +def get_args_parser(add_help=True): + import argparse + + parser = argparse.ArgumentParser(description="PyTorch Stereo Matching Evaluation", add_help=add_help) + parser.add_argument("--dataset", type=str, default="middlebury2014-train", help="dataset to use") + parser.add_argument("--dataset-root", type=str, default="", help="root of the dataset") + + parser.add_argument("--checkpoint", type=str, default="", help="path to weights") + parser.add_argument("--weights", type=str, default=None, help="torchvision API weight") + parser.add_argument( + "--model", + type=str, + default="crestereo_base", + help="which model to use if not speciffying a training checkpoint", + ) + parser.add_argument("--img-folder", type=str, default="images") + + parser.add_argument("--batch-size", type=int, default=1, help="batch size") + parser.add_argument("--workers", type=int, default=0, help="number of workers") + + parser.add_argument("--eval-size", type=int, nargs="+", default=[384, 512], help="resize size") + parser.add_argument( + "--norm-mean", type=float, nargs="+", default=[0.5, 0.5, 0.5], help="mean for image normalization" + ) + parser.add_argument( + "--norm-std", type=float, nargs="+", default=[0.5, 0.5, 0.5], help="std for image normalization" + ) + parser.add_argument( + "--use-grayscale", action="store_true", help="use grayscale images instead of RGB", default=False + ) + parser.add_argument("--max-disparity", type=float, default=None, help="maximum disparity") + parser.add_argument( + "--interpolation-strategy", + type=str, + default="bilinear", + help="interpolation strategy", + choices=["bilinear", "bicubic", "mixed"], + ) + + parser.add_argument("--n_iterations", nargs="+", type=int, default=[10], help="number of recurent iterations") + parser.add_argument("--n_cascades", nargs="+", type=int, default=[1], help="number of cascades") + parser.add_argument( + "--metrics", + type=str, + nargs="+", + default=["mae", "rmse", "1px", "3px", "5px", "relepe"], + help="metrics to log", + choices=AVAILABLE_METRICS, + ) + parser.add_argument("--mixed-precision", action="store_true", help="use mixed precision training") + + parser.add_argument("--world-size", type=int, default=1, help="number of distributed processes") + parser.add_argument("--dist-url", type=str, default="env://", help="url used to set up distributed training") + parser.add_argument("--device", type=str, default="cuda", help="device to use for training") + + parser.add_argument("--save-images", action="store_true", help="save images of the predictions") + parser.add_argument("--padder-type", type=str, default="kitti", help="padder type", choices=["kitti", "sintel"]) + + return parser + + +def cascade_inference(model, image_left, image_right, iterations, cascades): + # check that image size is divisible by 16 * (2 ** (cascades - 1)) + for image in [image_left, image_right]: + if image.shape[-2] % ((2 ** (cascades - 1))) != 0: + raise ValueError( + f"image height is not divisible by {16 * (2 ** (cascades - 1))}. Image shape: {image.shape[-2]}" + ) + + if image.shape[-1] % ((2 ** (cascades - 1))) != 0: + raise ValueError( + f"image width is not divisible by {16 * (2 ** (cascades - 1))}. Image shape: {image.shape[-2]}" + ) + + left_image_pyramid = [image_left] + right_image_pyramid = [image_right] + for idx in range(0, cascades - 1): + ds_factor = int(2 ** (idx + 1)) + ds_shape = (image_left.shape[-2] // ds_factor, image_left.shape[-1] // ds_factor) + left_image_pyramid += F.interpolate(image_left, size=ds_shape, mode="bilinear", align_corners=True).unsqueeze(0) + right_image_pyramid += F.interpolate(image_right, size=ds_shape, mode="bilinear", align_corners=True).unsqueeze( + 0 + ) + + flow_init = None + for left_image, right_image in zip(reversed(left_image_pyramid), reversed(right_image_pyramid)): + flow_pred = model(left_image, right_image, flow_init, num_iters=iterations) + # flow pred is a list + flow_init = flow_pred[-1] + + return flow_init + + +@torch.inference_mode() +def _evaluate( + model, + args, + val_loader, + *, + padder_mode, + print_freq=10, + writer=None, + step=None, + iterations=10, + cascades=1, + batch_size=None, + header=None, + save_images=False, + save_path="", +): + """Helper function to compute various metrics (epe, etc.) for a model on a given dataset. + We process as many samples as possible with ddp. + """ + model.eval() + header = header or "Test:" + device = torch.device(args.device) + metric_logger = utils.MetricLogger(delimiter=" ") + + iterations = iterations or args.recurrent_updates + + logger = utils.MetricLogger() + for meter_name in args.metrics: + logger.add_meter(meter_name, fmt="{global_avg:.4f}") + if "fl-all" not in args.metrics: + logger.add_meter("fl-all", fmt="{global_avg:.4f}") + + num_processed_samples = 0 + with torch.cuda.amp.autocast(enabled=args.mixed_precision, dtype=torch.float16): + batch_idx = 0 + for blob in metric_logger.log_every(val_loader, print_freq, header): + image_left, image_right, disp_gt, valid_disp_mask = (x.to(device) for x in blob) + padder = utils.InputPadder(image_left.shape, mode=padder_mode) + image_left, image_right = padder.pad(image_left, image_right) + + disp_pred = cascade_inference(model, image_left, image_right, iterations, cascades) + disp_pred = disp_pred[:, :1, :, :] + disp_pred = padder.unpad(disp_pred) + + if save_images: + if args.distributed: + rank_prefix = args.rank + else: + rank_prefix = 0 + make_prediction_image_side_to_side( + disp_pred, disp_gt, valid_disp_mask, save_path, prefix=f"batch_{rank_prefix}_{batch_idx}" + ) + + metrics, _ = utils.compute_metrics(disp_pred, disp_gt, valid_disp_mask, metrics=logger.meters.keys()) + num_processed_samples += image_left.shape[0] + for name in metrics: + logger.meters[name].update(metrics[name], n=1) + + batch_idx += 1 + + num_processed_samples = utils.reduce_across_processes(num_processed_samples) / args.world_size + + print("Num_processed_samples: ", num_processed_samples) + if ( + hasattr(val_loader.dataset, "__len__") + and len(val_loader.dataset) != num_processed_samples + and torch.distributed.get_rank() == 0 + ): + warnings.warn( + f"Number of processed samples {num_processed_samples} is different" + f"from the dataset size {len(val_loader.dataset)}. This may happen if" + "the dataset is not divisible by the batch size. Try lowering the batch size for more accurate results." + ) + + if writer is not None and args.rank == 0: + for meter_name, meter_value in logger.meters.items(): + scalar_name = f"{meter_name} {header}" + writer.add_scalar(scalar_name, meter_value.avg, step) + + logger.synchronize_between_processes() + print(header, logger) + + logger_metrics = {k: v.global_avg for k, v in logger.meters.items()} + return logger_metrics + + +def evaluate(model, loader, args, writer=None, step=None): + os.makedirs(args.img_folder, exist_ok=True) + checkpoint_name = os.path.basename(args.checkpoint) or args.weights + image_checkpoint_folder = os.path.join(args.img_folder, checkpoint_name) + + metrics = {} + base_image_folder = os.path.join(image_checkpoint_folder, args.dataset) + os.makedirs(base_image_folder, exist_ok=True) + + for n_cascades in args.n_cascades: + for n_iters in args.n_iterations: + + config = f"{n_cascades}c_{n_iters}i" + config_image_folder = os.path.join(base_image_folder, config) + os.makedirs(config_image_folder, exist_ok=True) + + metrics[config] = _evaluate( + model, + args, + loader, + padder_mode=args.padder_type, + header=f"{args.dataset} evaluation@ size:{args.eval_size} n_cascades:{n_cascades} n_iters:{n_iters}", + batch_size=args.batch_size, + writer=writer, + step=step, + iterations=n_iters, + cascades=n_cascades, + save_path=config_image_folder, + save_images=args.save_images, + ) + + metric_log = [] + metric_log_dict = {} + # print the final results + for config in metrics: + config_tokens = config.split("_") + config_iters = config_tokens[1][:-1] + config_cascades = config_tokens[0][:-1] + + metric_log_dict[config_cascades] = metric_log_dict.get(config_cascades, {}) + metric_log_dict[config_cascades][config_iters] = metrics[config] + + evaluation_str = f"{args.dataset} evaluation@ size:{args.eval_size} n_cascades:{config_cascades} recurrent_updates:{config_iters}" + metrics_str = f"Metrics: {metrics[config]}" + metric_log.extend([evaluation_str, metrics_str]) + + print(evaluation_str) + print(metrics_str) + + eval_log_name = f"{checkpoint_name.replace('.pth', '')}_eval.log" + print("Saving eval log to: ", eval_log_name) + with open(eval_log_name, "w") as f: + f.write(f"Dataset: {args.dataset} @size: {args.eval_size}:\n") + # write the dict line by line for each key, and each value in the keys + for config_cascades in metric_log_dict: + f.write("{\n") + f.write(f"\t{config_cascades}: {{\n") + for config_iters in metric_log_dict[config_cascades]: + # convert every metric to 4 decimal places + metrics = metric_log_dict[config_cascades][config_iters] + metrics = {k: float(f"{v:.3f}") for k, v in metrics.items()} + f.write(f"\t\t{config_iters}: {metrics}\n") + f.write("\t},\n") + f.write("}\n") + + +def load_checkpoint(args): + utils.setup_ddp(args) + + if not args.weights: + checkpoint = torch.load(args.checkpoint, map_location=torch.device("cpu"), weights_only=True) + if "model" in checkpoint: + experiment_args = checkpoint["args"] + model = torchvision.prototype.models.depth.stereo.__dict__[experiment_args.model](weights=None) + model.load_state_dict(checkpoint["model"]) + else: + model = torchvision.prototype.models.depth.stereo.__dict__[args.model](weights=None) + model.load_state_dict(checkpoint) + + # set the appropriate devices + if args.distributed and args.device == "cpu": + raise ValueError("The device must be cuda if we want to run in distributed mode using torchrun") + device = torch.device(args.device) + else: + model = torchvision.prototype.models.depth.stereo.__dict__[args.model](weights=args.weights) + + # convert to DDP if need be + if args.distributed: + model = model.to(args.device) + model = torch.nn.parallel.DistributedDataParallel(model, device_ids=[args.gpu]) + else: + model.to(device) + + return model + + +def main(args): + model = load_checkpoint(args) + loader = make_eval_loader(args.dataset, args) + evaluate(model, loader, args) + + +if __name__ == "__main__": + args = get_args_parser().parse_args() + main(args) diff --git a/references/depth/stereo/parsing.py b/references/depth/stereo/parsing.py new file mode 100644 index 0000000000000000000000000000000000000000..71a3ba9904e787542139c7e7da61a60c9f561d15 --- /dev/null +++ b/references/depth/stereo/parsing.py @@ -0,0 +1,89 @@ +import argparse +from functools import partial + +import torch + +from presets import StereoMatchingEvalPreset, StereoMatchingTrainPreset +from torchvision.datasets import ( + CarlaStereo, + CREStereo, + ETH3DStereo, + FallingThingsStereo, + InStereo2k, + Kitti2012Stereo, + Kitti2015Stereo, + Middlebury2014Stereo, + SceneFlowStereo, + SintelStereo, +) + +VALID_DATASETS = { + "crestereo": partial(CREStereo), + "carla-highres": partial(CarlaStereo), + "instereo2k": partial(InStereo2k), + "sintel": partial(SintelStereo), + "sceneflow-monkaa": partial(SceneFlowStereo, variant="Monkaa", pass_name="both"), + "sceneflow-flyingthings": partial(SceneFlowStereo, variant="FlyingThings3D", pass_name="both"), + "sceneflow-driving": partial(SceneFlowStereo, variant="Driving", pass_name="both"), + "fallingthings": partial(FallingThingsStereo, variant="both"), + "eth3d-train": partial(ETH3DStereo, split="train"), + "eth3d-test": partial(ETH3DStereo, split="test"), + "kitti2015-train": partial(Kitti2015Stereo, split="train"), + "kitti2015-test": partial(Kitti2015Stereo, split="test"), + "kitti2012-train": partial(Kitti2012Stereo, split="train"), + "kitti2012-test": partial(Kitti2012Stereo, split="train"), + "middlebury2014-other": partial( + Middlebury2014Stereo, split="additional", use_ambient_view=True, calibration="both" + ), + "middlebury2014-train": partial(Middlebury2014Stereo, split="train", calibration="perfect"), + "middlebury2014-test": partial(Middlebury2014Stereo, split="test", calibration=None), + "middlebury2014-train-ambient": partial( + Middlebury2014Stereo, split="train", use_ambient_views=True, calibrartion="perfect" + ), +} + + +def make_train_transform(args: argparse.Namespace) -> torch.nn.Module: + return StereoMatchingTrainPreset( + resize_size=args.resize_size, + crop_size=args.crop_size, + rescale_prob=args.rescale_prob, + scaling_type=args.scaling_type, + scale_range=args.scale_range, + scale_interpolation_type=args.interpolation_strategy, + use_grayscale=args.use_grayscale, + mean=args.norm_mean, + std=args.norm_std, + horizontal_flip_prob=args.flip_prob, + gpu_transforms=args.gpu_transforms, + max_disparity=args.max_disparity, + spatial_shift_prob=args.spatial_shift_prob, + spatial_shift_max_angle=args.spatial_shift_max_angle, + spatial_shift_max_displacement=args.spatial_shift_max_displacement, + spatial_shift_interpolation_type=args.interpolation_strategy, + gamma_range=args.gamma_range, + brightness=args.brightness_range, + contrast=args.contrast_range, + saturation=args.saturation_range, + hue=args.hue_range, + asymmetric_jitter_prob=args.asymmetric_jitter_prob, + ) + + +def make_eval_transform(args: argparse.Namespace) -> torch.nn.Module: + if args.eval_size is None: + resize_size = args.crop_size + else: + resize_size = args.eval_size + + return StereoMatchingEvalPreset( + mean=args.norm_mean, + std=args.norm_std, + use_grayscale=args.use_grayscale, + resize_size=resize_size, + interpolation_type=args.interpolation_strategy, + ) + + +def make_dataset(dataset_name: str, dataset_root: str, transforms: torch.nn.Module) -> torch.utils.data.Dataset: + return VALID_DATASETS[dataset_name](root=dataset_root, transforms=transforms) diff --git a/references/depth/stereo/presets.py b/references/depth/stereo/presets.py new file mode 100644 index 0000000000000000000000000000000000000000..cadd2405178214331fb801fc00a08549731f2a38 --- /dev/null +++ b/references/depth/stereo/presets.py @@ -0,0 +1,144 @@ +from typing import Optional, Tuple, Union + +import torch +import transforms as T + + +class StereoMatchingEvalPreset(torch.nn.Module): + def __init__( + self, + mean: float = 0.5, + std: float = 0.5, + resize_size: Optional[Tuple[int, ...]] = None, + max_disparity: Optional[float] = None, + interpolation_type: str = "bilinear", + use_grayscale: bool = False, + ) -> None: + super().__init__() + + transforms = [ + T.ToTensor(), + T.ConvertImageDtype(torch.float32), + ] + + if use_grayscale: + transforms.append(T.ConvertToGrayscale()) + + if resize_size is not None: + transforms.append(T.Resize(resize_size, interpolation_type=interpolation_type)) + + transforms.extend( + [ + T.Normalize(mean=mean, std=std), + T.MakeValidDisparityMask(max_disparity=max_disparity), + T.ValidateModelInput(), + ] + ) + + self.transforms = T.Compose(transforms) + + def forward(self, images, disparities, masks): + return self.transforms(images, disparities, masks) + + +class StereoMatchingTrainPreset(torch.nn.Module): + def __init__( + self, + *, + resize_size: Optional[Tuple[int, ...]], + resize_interpolation_type: str = "bilinear", + # RandomResizeAndCrop params + crop_size: Tuple[int, int], + rescale_prob: float = 1.0, + scaling_type: str = "exponential", + scale_range: Tuple[float, float] = (-0.2, 0.5), + scale_interpolation_type: str = "bilinear", + # convert to grayscale + use_grayscale: bool = False, + # normalization params + mean: float = 0.5, + std: float = 0.5, + # processing device + gpu_transforms: bool = False, + # masking + max_disparity: Optional[int] = 256, + # SpatialShift params + spatial_shift_prob: float = 0.5, + spatial_shift_max_angle: float = 0.5, + spatial_shift_max_displacement: float = 0.5, + spatial_shift_interpolation_type: str = "bilinear", + # AssymetricColorJitter + gamma_range: Tuple[float, float] = (0.8, 1.2), + brightness: Union[int, Tuple[int, int]] = (0.8, 1.2), + contrast: Union[int, Tuple[int, int]] = (0.8, 1.2), + saturation: Union[int, Tuple[int, int]] = 0.0, + hue: Union[int, Tuple[int, int]] = 0.0, + asymmetric_jitter_prob: float = 1.0, + # RandomHorizontalFlip + horizontal_flip_prob: float = 0.5, + # RandomOcclusion + occlusion_prob: float = 0.0, + occlusion_px_range: Tuple[int, int] = (50, 100), + # RandomErase + erase_prob: float = 0.0, + erase_px_range: Tuple[int, int] = (50, 100), + erase_num_repeats: int = 1, + ) -> None: + + if scaling_type not in ["linear", "exponential"]: + raise ValueError(f"Unknown scaling type: {scaling_type}. Available types: linear, exponential") + + super().__init__() + transforms = [T.ToTensor()] + + # when fixing size across multiple datasets, we ensure + # that the same size is used for all datasets when cropping + if resize_size is not None: + transforms.append(T.Resize(resize_size, interpolation_type=resize_interpolation_type)) + + if gpu_transforms: + transforms.append(T.ToGPU()) + + # color handling + color_transforms = [ + T.AsymmetricColorJitter( + brightness=brightness, contrast=contrast, saturation=saturation, hue=hue, p=asymmetric_jitter_prob + ), + T.AsymetricGammaAdjust(p=asymmetric_jitter_prob, gamma_range=gamma_range), + ] + + if use_grayscale: + color_transforms.append(T.ConvertToGrayscale()) + + transforms.extend(color_transforms) + + transforms.extend( + [ + T.RandomSpatialShift( + p=spatial_shift_prob, + max_angle=spatial_shift_max_angle, + max_px_shift=spatial_shift_max_displacement, + interpolation_type=spatial_shift_interpolation_type, + ), + T.ConvertImageDtype(torch.float32), + T.RandomRescaleAndCrop( + crop_size=crop_size, + scale_range=scale_range, + rescale_prob=rescale_prob, + scaling_type=scaling_type, + interpolation_type=scale_interpolation_type, + ), + T.RandomHorizontalFlip(horizontal_flip_prob), + # occlusion after flip, otherwise we're occluding the reference image + T.RandomOcclusion(p=occlusion_prob, occlusion_px_range=occlusion_px_range), + T.RandomErase(p=erase_prob, erase_px_range=erase_px_range, max_erase=erase_num_repeats), + T.Normalize(mean=mean, std=std), + T.MakeValidDisparityMask(max_disparity), + T.ValidateModelInput(), + ] + ) + + self.transforms = T.Compose(transforms) + + def forward(self, images, disparties, mask): + return self.transforms(images, disparties, mask) diff --git a/references/depth/stereo/train.py b/references/depth/stereo/train.py new file mode 100644 index 0000000000000000000000000000000000000000..e3d572153b20e847ae3a2b8e683c3c9a177c8185 --- /dev/null +++ b/references/depth/stereo/train.py @@ -0,0 +1,788 @@ +import argparse +import os +import warnings +from pathlib import Path +from typing import List, Union + +import numpy as np +import torch +import torch.distributed as dist +import torchvision.models.optical_flow +import torchvision.prototype.models.depth.stereo +import utils +import visualization + +from parsing import make_dataset, make_eval_transform, make_train_transform, VALID_DATASETS +from torch import nn +from torchvision.transforms.functional import get_dimensions, InterpolationMode, resize +from utils.metrics import AVAILABLE_METRICS +from utils.norm import freeze_batch_norm + + +def make_stereo_flow(flow: Union[torch.Tensor, List[torch.Tensor]], model_out_channels: int) -> torch.Tensor: + """Helper function to make stereo flow from a given model output""" + if isinstance(flow, list): + return [make_stereo_flow(flow_i, model_out_channels) for flow_i in flow] + + B, C, H, W = flow.shape + # we need to add zero flow if the model outputs 2 channels + if C == 1 and model_out_channels == 2: + zero_flow = torch.zeros_like(flow) + # by convention the flow is X-Y axis, so we need the Y flow last + flow = torch.cat([flow, zero_flow], dim=1) + return flow + + +def make_lr_schedule(args: argparse.Namespace, optimizer: torch.optim.Optimizer) -> np.ndarray: + """Helper function to return a learning rate scheduler for CRE-stereo""" + if args.decay_after_steps < args.warmup_steps: + raise ValueError(f"decay_after_steps: {args.function} must be greater than warmup_steps: {args.warmup_steps}") + + warmup_steps = args.warmup_steps if args.warmup_steps else 0 + flat_lr_steps = args.decay_after_steps - warmup_steps if args.decay_after_steps else 0 + decay_lr_steps = args.total_iterations - flat_lr_steps + + max_lr = args.lr + min_lr = args.min_lr + + schedulers = [] + milestones = [] + + if warmup_steps > 0: + if args.lr_warmup_method == "linear": + warmup_lr_scheduler = torch.optim.lr_scheduler.LinearLR( + optimizer, start_factor=args.lr_warmup_factor, total_iters=warmup_steps + ) + elif args.lr_warmup_method == "constant": + warmup_lr_scheduler = torch.optim.lr_scheduler.ConstantLR( + optimizer, factor=args.lr_warmup_factor, total_iters=warmup_steps + ) + else: + raise ValueError(f"Unknown lr warmup method {args.lr_warmup_method}") + schedulers.append(warmup_lr_scheduler) + milestones.append(warmup_steps) + + if flat_lr_steps > 0: + flat_lr_scheduler = torch.optim.lr_scheduler.ConstantLR(optimizer, factor=max_lr, total_iters=flat_lr_steps) + schedulers.append(flat_lr_scheduler) + milestones.append(flat_lr_steps + warmup_steps) + + if decay_lr_steps > 0: + if args.lr_decay_method == "cosine": + decay_lr_scheduler = torch.optim.lr_scheduler.CosineAnnealingLR( + optimizer, T_max=decay_lr_steps, eta_min=min_lr + ) + elif args.lr_decay_method == "linear": + decay_lr_scheduler = torch.optim.lr_scheduler.LinearLR( + optimizer, start_factor=max_lr, end_factor=min_lr, total_iters=decay_lr_steps + ) + elif args.lr_decay_method == "exponential": + decay_lr_scheduler = torch.optim.lr_scheduler.ExponentialLR( + optimizer, gamma=args.lr_decay_gamma, last_epoch=-1 + ) + else: + raise ValueError(f"Unknown lr decay method {args.lr_decay_method}") + schedulers.append(decay_lr_scheduler) + + scheduler = torch.optim.lr_scheduler.SequentialLR(optimizer, schedulers, milestones=milestones) + return scheduler + + +def shuffle_dataset(dataset): + """Shuffle the dataset""" + perm = torch.randperm(len(dataset)) + return torch.utils.data.Subset(dataset, perm) + + +def resize_dataset_to_n_steps( + dataset: torch.utils.data.Dataset, dataset_steps: int, samples_per_step: int, args: argparse.Namespace +) -> torch.utils.data.Dataset: + original_size = len(dataset) + if args.steps_is_epochs: + samples_per_step = original_size + target_size = dataset_steps * samples_per_step + + dataset_copies = [] + n_expands, remainder = divmod(target_size, original_size) + for idx in range(n_expands): + dataset_copies.append(dataset) + + if remainder > 0: + dataset_copies.append(torch.utils.data.Subset(dataset, list(range(remainder)))) + + if args.dataset_shuffle: + dataset_copies = [shuffle_dataset(dataset_copy) for dataset_copy in dataset_copies] + + dataset = torch.utils.data.ConcatDataset(dataset_copies) + return dataset + + +def get_train_dataset(dataset_root: str, args: argparse.Namespace) -> torch.utils.data.Dataset: + datasets = [] + for dataset_name in args.train_datasets: + transform = make_train_transform(args) + dataset = make_dataset(dataset_name, dataset_root, transform) + datasets.append(dataset) + + if len(datasets) == 0: + raise ValueError("No datasets specified for training") + + samples_per_step = args.world_size * args.batch_size + + for idx, (dataset, steps_per_dataset) in enumerate(zip(datasets, args.dataset_steps)): + datasets[idx] = resize_dataset_to_n_steps(dataset, steps_per_dataset, samples_per_step, args) + + dataset = torch.utils.data.ConcatDataset(datasets) + if args.dataset_order_shuffle: + dataset = shuffle_dataset(dataset) + + print(f"Training dataset: {len(dataset)} samples") + return dataset + + +@torch.inference_mode() +def _evaluate( + model, + args, + val_loader, + *, + padder_mode, + print_freq=10, + writer=None, + step=None, + iterations=None, + batch_size=None, + header=None, +): + """Helper function to compute various metrics (epe, etc.) for a model on a given dataset.""" + model.eval() + header = header or "Test:" + device = torch.device(args.device) + metric_logger = utils.MetricLogger(delimiter=" ") + + iterations = iterations or args.recurrent_updates + + logger = utils.MetricLogger() + for meter_name in args.metrics: + logger.add_meter(meter_name, fmt="{global_avg:.4f}") + if "fl-all" not in args.metrics: + logger.add_meter("fl-all", fmt="{global_avg:.4f}") + + num_processed_samples = 0 + with torch.cuda.amp.autocast(enabled=args.mixed_precision, dtype=torch.float16): + for blob in metric_logger.log_every(val_loader, print_freq, header): + image_left, image_right, disp_gt, valid_disp_mask = (x.to(device) for x in blob) + padder = utils.InputPadder(image_left.shape, mode=padder_mode) + image_left, image_right = padder.pad(image_left, image_right) + + disp_predictions = model(image_left, image_right, flow_init=None, num_iters=iterations) + disp_pred = disp_predictions[-1][:, :1, :, :] + disp_pred = padder.unpad(disp_pred) + + metrics, _ = utils.compute_metrics(disp_pred, disp_gt, valid_disp_mask, metrics=logger.meters.keys()) + num_processed_samples += image_left.shape[0] + for name in metrics: + logger.meters[name].update(metrics[name], n=1) + + num_processed_samples = utils.reduce_across_processes(num_processed_samples) + + print("Num_processed_samples: ", num_processed_samples) + if ( + hasattr(val_loader.dataset, "__len__") + and len(val_loader.dataset) != num_processed_samples + and torch.distributed.get_rank() == 0 + ): + warnings.warn( + f"Number of processed samples {num_processed_samples} is different" + f"from the dataset size {len(val_loader.dataset)}. This may happen if" + "the dataset is not divisible by the batch size. Try lowering the batch size or GPU number for more accurate results." + ) + + if writer is not None and args.rank == 0: + for meter_name, meter_value in logger.meters.items(): + scalar_name = f"{meter_name} {header}" + writer.add_scalar(scalar_name, meter_value.avg, step) + + logger.synchronize_between_processes() + print(header, logger) + + +def make_eval_loader(dataset_name: str, args: argparse.Namespace) -> torch.utils.data.DataLoader: + if args.weights: + weights = torchvision.models.get_weight(args.weights) + trans = weights.transforms() + + def preprocessing(image_left, image_right, disp, valid_disp_mask): + C_o, H_o, W_o = get_dimensions(image_left) + image_left, image_right = trans(image_left, image_right) + + C_t, H_t, W_t = get_dimensions(image_left) + scale_factor = W_t / W_o + + if disp is not None and not isinstance(disp, torch.Tensor): + disp = torch.from_numpy(disp) + if W_t != W_o: + disp = resize(disp, (H_t, W_t), mode=InterpolationMode.BILINEAR) * scale_factor + if valid_disp_mask is not None and not isinstance(valid_disp_mask, torch.Tensor): + valid_disp_mask = torch.from_numpy(valid_disp_mask) + if W_t != W_o: + valid_disp_mask = resize(valid_disp_mask, (H_t, W_t), mode=InterpolationMode.NEAREST) + return image_left, image_right, disp, valid_disp_mask + + else: + preprocessing = make_eval_transform(args) + + val_dataset = make_dataset(dataset_name, args.dataset_root, transforms=preprocessing) + if args.distributed: + sampler = torch.utils.data.distributed.DistributedSampler(val_dataset, shuffle=False, drop_last=False) + else: + sampler = torch.utils.data.SequentialSampler(val_dataset) + + val_loader = torch.utils.data.DataLoader( + val_dataset, + sampler=sampler, + batch_size=args.batch_size, + pin_memory=True, + num_workers=args.workers, + ) + + return val_loader + + +def evaluate(model, loaders, args, writer=None, step=None): + for loader_name, loader in loaders.items(): + _evaluate( + model, + args, + loader, + iterations=args.recurrent_updates, + padder_mode=args.padder_type, + header=f"{loader_name} evaluation", + batch_size=args.batch_size, + writer=writer, + step=step, + ) + + +def run(model, optimizer, scheduler, train_loader, val_loaders, logger, writer, scaler, args): + device = torch.device(args.device) + # wrap the loader in a logger + loader = iter(logger.log_every(train_loader)) + # output channels + model_out_channels = model.module.output_channels if args.distributed else model.output_channels + + torch.set_num_threads(args.threads) + + sequence_criterion = utils.SequenceLoss( + gamma=args.gamma, + max_flow=args.max_disparity, + exclude_large_flows=args.flow_loss_exclude_large, + ).to(device) + + if args.consistency_weight: + consistency_criterion = utils.FlowSequenceConsistencyLoss( + args.gamma, + resize_factor=0.25, + rescale_factor=0.25, + rescale_mode="bilinear", + ).to(device) + else: + consistency_criterion = None + + if args.psnr_weight: + psnr_criterion = utils.PSNRLoss().to(device) + else: + psnr_criterion = None + + if args.smoothness_weight: + smoothness_criterion = utils.SmoothnessLoss().to(device) + else: + smoothness_criterion = None + + if args.photometric_weight: + photometric_criterion = utils.FlowPhotoMetricLoss( + ssim_weight=args.photometric_ssim_weight, + max_displacement_ratio=args.photometric_max_displacement_ratio, + ssim_use_padding=False, + ).to(device) + else: + photometric_criterion = None + + for step in range(args.start_step + 1, args.total_iterations + 1): + data_blob = next(loader) + optimizer.zero_grad() + + # unpack the data blob + image_left, image_right, disp_mask, valid_disp_mask = (x.to(device) for x in data_blob) + with torch.cuda.amp.autocast(enabled=args.mixed_precision, dtype=torch.float16): + disp_predictions = model(image_left, image_right, flow_init=None, num_iters=args.recurrent_updates) + # different models have different outputs, make sure we get the right ones for this task + disp_predictions = make_stereo_flow(disp_predictions, model_out_channels) + # should the architecture or training loop require it, we have to adjust the disparity mask + # target to possibly look like an optical flow mask + disp_mask = make_stereo_flow(disp_mask, model_out_channels) + # sequence loss on top of the model outputs + + loss = sequence_criterion(disp_predictions, disp_mask, valid_disp_mask) * args.flow_loss_weight + + if args.consistency_weight > 0: + loss_consistency = consistency_criterion(disp_predictions) + loss += loss_consistency * args.consistency_weight + + if args.psnr_weight > 0: + loss_psnr = 0.0 + for pred in disp_predictions: + # predictions might have 2 channels + loss_psnr += psnr_criterion( + pred * valid_disp_mask.unsqueeze(1), + disp_mask * valid_disp_mask.unsqueeze(1), + ).mean() # mean the psnr loss over the batch + loss += loss_psnr / len(disp_predictions) * args.psnr_weight + + if args.photometric_weight > 0: + loss_photometric = 0.0 + for pred in disp_predictions: + # predictions might have 1 channel, therefore we need to inpute 0s for the second channel + if model_out_channels == 1: + pred = torch.cat([pred, torch.zeros_like(pred)], dim=1) + + loss_photometric += photometric_criterion( + image_left, image_right, pred, valid_disp_mask + ) # photometric loss already comes out meaned over the batch + loss += loss_photometric / len(disp_predictions) * args.photometric_weight + + if args.smoothness_weight > 0: + loss_smoothness = 0.0 + for pred in disp_predictions: + # predictions might have 2 channels + loss_smoothness += smoothness_criterion( + image_left, pred[:, :1, :, :] + ).mean() # mean the smoothness loss over the batch + loss += loss_smoothness / len(disp_predictions) * args.smoothness_weight + + with torch.no_grad(): + metrics, _ = utils.compute_metrics( + disp_predictions[-1][:, :1, :, :], # predictions might have 2 channels + disp_mask[:, :1, :, :], # so does the ground truth + valid_disp_mask, + args.metrics, + ) + + metrics.pop("fl-all", None) + logger.update(loss=loss, **metrics) + + if scaler is not None: + scaler.scale(loss).backward() + scaler.unscale_(optimizer) + if args.clip_grad_norm: + torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=args.clip_grad_norm) + scaler.step(optimizer) + scaler.update() + else: + loss.backward() + if args.clip_grad_norm: + torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=args.clip_grad_norm) + optimizer.step() + + scheduler.step() + + if not dist.is_initialized() or dist.get_rank() == 0: + if writer is not None and step % args.tensorboard_log_frequency == 0: + # log the loss and metrics to tensorboard + + writer.add_scalar("loss", loss, step) + for name, value in logger.meters.items(): + writer.add_scalar(name, value.avg, step) + # log the images to tensorboard + pred_grid = visualization.make_training_sample_grid( + image_left, image_right, disp_mask, valid_disp_mask, disp_predictions + ) + writer.add_image("predictions", pred_grid, step, dataformats="HWC") + + # second thing we want to see is how relevant the iterative refinement is + pred_sequence_grid = visualization.make_disparity_sequence_grid(disp_predictions, disp_mask) + writer.add_image("sequence", pred_sequence_grid, step, dataformats="HWC") + + if step % args.save_frequency == 0: + if not args.distributed or args.rank == 0: + model_without_ddp = ( + model.module if isinstance(model, torch.nn.parallel.DistributedDataParallel) else model + ) + checkpoint = { + "model": model_without_ddp.state_dict(), + "optimizer": optimizer.state_dict(), + "scheduler": scheduler.state_dict(), + "step": step, + "args": args, + } + os.makedirs(args.checkpoint_dir, exist_ok=True) + torch.save(checkpoint, Path(args.checkpoint_dir) / f"{args.name}_{step}.pth") + torch.save(checkpoint, Path(args.checkpoint_dir) / f"{args.name}.pth") + + if step % args.valid_frequency == 0: + evaluate(model, val_loaders, args, writer, step) + model.train() + if args.freeze_batch_norm: + if isinstance(model, nn.parallel.DistributedDataParallel): + freeze_batch_norm(model.module) + else: + freeze_batch_norm(model) + + # one final save at the end + if not args.distributed or args.rank == 0: + model_without_ddp = model.module if isinstance(model, torch.nn.parallel.DistributedDataParallel) else model + checkpoint = { + "model": model_without_ddp.state_dict(), + "optimizer": optimizer.state_dict(), + "scheduler": scheduler.state_dict(), + "step": step, + "args": args, + } + os.makedirs(args.checkpoint_dir, exist_ok=True) + torch.save(checkpoint, Path(args.checkpoint_dir) / f"{args.name}_{step}.pth") + torch.save(checkpoint, Path(args.checkpoint_dir) / f"{args.name}.pth") + + +def main(args): + args.total_iterations = sum(args.dataset_steps) + + # initialize DDP setting + utils.setup_ddp(args) + print(args) + + args.test_only = args.train_datasets is None + + # set the appropriate devices + if args.distributed and args.device == "cpu": + raise ValueError("The device must be cuda if we want to run in distributed mode using torchrun") + device = torch.device(args.device) + + # select model architecture + model = torchvision.prototype.models.depth.stereo.__dict__[args.model](weights=args.weights) + + # convert to DDP if need be + if args.distributed: + model = model.to(args.gpu) + model = torch.nn.parallel.DistributedDataParallel(model, device_ids=[args.gpu]) + model_without_ddp = model.module + else: + model.to(device) + model_without_ddp = model + + os.makedirs(args.checkpoint_dir, exist_ok=True) + + val_loaders = {name: make_eval_loader(name, args) for name in args.test_datasets} + + # EVAL ONLY configurations + if args.test_only: + evaluate(model, val_loaders, args) + return + + # Sanity check for the parameter count + print(f"Parameter Count: {sum(p.numel() for p in model.parameters() if p.requires_grad)}") + + # Compose the training dataset + train_dataset = get_train_dataset(args.dataset_root, args) + + # initialize the optimizer + if args.optimizer == "adam": + optimizer = torch.optim.Adam(model.parameters(), lr=args.lr, weight_decay=args.weight_decay) + elif args.optimizer == "sgd": + optimizer = torch.optim.SGD(model.parameters(), lr=args.lr, weight_decay=args.weight_decay, momentum=0.9) + else: + raise ValueError(f"Unknown optimizer {args.optimizer}. Please choose between adam and sgd") + + # initialize the learning rate schedule + scheduler = make_lr_schedule(args, optimizer) + + # load them from checkpoint if needed + args.start_step = 0 + if args.resume_path is not None: + checkpoint = torch.load(args.resume_path, map_location="cpu", weights_only=True) + if "model" in checkpoint: + # this means the user requested to resume from a training checkpoint + model_without_ddp.load_state_dict(checkpoint["model"]) + # this means the user wants to continue training from where it was left off + if args.resume_schedule: + optimizer.load_state_dict(checkpoint["optimizer"]) + scheduler.load_state_dict(checkpoint["scheduler"]) + args.start_step = checkpoint["step"] + 1 + # modify starting point of the dat + sample_start_step = args.start_step * args.batch_size * args.world_size + train_dataset = train_dataset[sample_start_step:] + + else: + # this means the user wants to finetune on top of a model state dict + # and that no other changes are required + model_without_ddp.load_state_dict(checkpoint) + + torch.backends.cudnn.benchmark = True + + # enable training mode + model.train() + if args.freeze_batch_norm: + freeze_batch_norm(model_without_ddp) + + # put dataloader on top of the dataset + # make sure to disable shuffling since the dataset is already shuffled + # in order to guarantee quasi randomness whilst retaining a deterministic + # dataset consumption order + if args.distributed: + # the train dataset is preshuffled in order to respect the iteration order + sampler = torch.utils.data.distributed.DistributedSampler(train_dataset, shuffle=False, drop_last=True) + else: + # the train dataset is already shuffled, so we can use a simple SequentialSampler + sampler = torch.utils.data.SequentialSampler(train_dataset) + + train_loader = torch.utils.data.DataLoader( + train_dataset, + sampler=sampler, + batch_size=args.batch_size, + pin_memory=True, + num_workers=args.workers, + ) + + # initialize the logger + if args.tensorboard_summaries: + from torch.utils.tensorboard import SummaryWriter + + tensorboard_path = Path(args.checkpoint_dir) / "tensorboard" + os.makedirs(tensorboard_path, exist_ok=True) + + tensorboard_run = tensorboard_path / f"{args.name}" + writer = SummaryWriter(tensorboard_run) + else: + writer = None + + logger = utils.MetricLogger(delimiter=" ") + + scaler = torch.cuda.amp.GradScaler() if args.mixed_precision else None + # run the training loop + # this will perform optimization, respectively logging and saving checkpoints + # when need be + run( + model=model, + optimizer=optimizer, + scheduler=scheduler, + train_loader=train_loader, + val_loaders=val_loaders, + logger=logger, + writer=writer, + scaler=scaler, + args=args, + ) + + +def get_args_parser(add_help=True): + import argparse + + parser = argparse.ArgumentParser(description="PyTorch Stereo Matching Training", add_help=add_help) + # checkpointing + parser.add_argument("--name", default="crestereo", help="name of the experiment") + parser.add_argument("--resume", type=str, default=None, help="from which checkpoint to resume") + parser.add_argument("--checkpoint-dir", type=str, default="checkpoints", help="path to the checkpoint directory") + + # dataset + parser.add_argument("--dataset-root", type=str, default="", help="path to the dataset root directory") + parser.add_argument( + "--train-datasets", + type=str, + nargs="+", + default=["crestereo"], + help="dataset(s) to train on", + choices=list(VALID_DATASETS.keys()), + ) + parser.add_argument( + "--dataset-steps", type=int, nargs="+", default=[300_000], help="number of steps for each dataset" + ) + parser.add_argument( + "--steps-is-epochs", action="store_true", help="if set, dataset-steps are interpreted as epochs" + ) + parser.add_argument( + "--test-datasets", + type=str, + nargs="+", + default=["middlebury2014-train"], + help="dataset(s) to test on", + choices=["middlebury2014-train"], + ) + parser.add_argument("--dataset-shuffle", type=bool, help="shuffle the dataset", default=True) + parser.add_argument("--dataset-order-shuffle", type=bool, help="shuffle the dataset order", default=True) + parser.add_argument("--batch-size", type=int, default=2, help="batch size per GPU") + parser.add_argument("--workers", type=int, default=4, help="number of workers per GPU") + parser.add_argument( + "--threads", + type=int, + default=16, + help="number of CPU threads per GPU. This can be changed around to speed-up transforms if needed. This can lead to worker thread contention so use with care.", + ) + + # model architecture + parser.add_argument( + "--model", + type=str, + default="crestereo_base", + help="model architecture", + choices=["crestereo_base", "raft_stereo"], + ) + parser.add_argument("--recurrent-updates", type=int, default=10, help="number of recurrent updates") + parser.add_argument("--freeze-batch-norm", action="store_true", help="freeze batch norm parameters") + + # loss parameters + parser.add_argument("--gamma", type=float, default=0.8, help="gamma parameter for the flow sequence loss") + parser.add_argument("--flow-loss-weight", type=float, default=1.0, help="weight for the flow loss") + parser.add_argument( + "--flow-loss-exclude-large", + action="store_true", + help="exclude large flow values from the loss. A large value is defined as a value greater than the ground truth flow norm", + default=False, + ) + parser.add_argument("--consistency-weight", type=float, default=0.0, help="consistency loss weight") + parser.add_argument( + "--consistency-resize-factor", + type=float, + default=0.25, + help="consistency loss resize factor to account for the fact that the flow is computed on a downsampled image", + ) + parser.add_argument("--psnr-weight", type=float, default=0.0, help="psnr loss weight") + parser.add_argument("--smoothness-weight", type=float, default=0.0, help="smoothness loss weight") + parser.add_argument("--photometric-weight", type=float, default=0.0, help="photometric loss weight") + parser.add_argument( + "--photometric-max-displacement-ratio", + type=float, + default=0.15, + help="Only pixels with a displacement smaller than this ratio of the image width will be considered for the photometric loss", + ) + parser.add_argument("--photometric-ssim-weight", type=float, default=0.85, help="photometric ssim loss weight") + + # transforms parameters + parser.add_argument("--gpu-transforms", action="store_true", help="use GPU transforms") + parser.add_argument( + "--eval-size", type=int, nargs="+", default=[384, 512], help="size of the images for evaluation" + ) + parser.add_argument("--resize-size", type=int, nargs=2, default=None, help="resize size") + parser.add_argument("--crop-size", type=int, nargs=2, default=[384, 512], help="crop size") + parser.add_argument("--scale-range", type=float, nargs=2, default=[0.6, 1.0], help="random scale range") + parser.add_argument("--rescale-prob", type=float, default=1.0, help="probability of resizing the image") + parser.add_argument( + "--scaling-type", type=str, default="linear", help="scaling type", choices=["exponential", "linear"] + ) + parser.add_argument("--flip-prob", type=float, default=0.5, help="probability of flipping the image") + parser.add_argument( + "--norm-mean", type=float, nargs="+", default=[0.5, 0.5, 0.5], help="mean for image normalization" + ) + parser.add_argument( + "--norm-std", type=float, nargs="+", default=[0.5, 0.5, 0.5], help="std for image normalization" + ) + parser.add_argument( + "--use-grayscale", action="store_true", help="use grayscale images instead of RGB", default=False + ) + parser.add_argument("--max-disparity", type=float, default=None, help="maximum disparity") + parser.add_argument( + "--interpolation-strategy", + type=str, + default="bilinear", + help="interpolation strategy", + choices=["bilinear", "bicubic", "mixed"], + ) + parser.add_argument("--spatial-shift-prob", type=float, default=1.0, help="probability of shifting the image") + parser.add_argument( + "--spatial-shift-max-angle", type=float, default=0.1, help="maximum angle for the spatial shift" + ) + parser.add_argument( + "--spatial-shift-max-displacement", type=float, default=2.0, help="maximum displacement for the spatial shift" + ) + parser.add_argument("--gamma-range", type=float, nargs="+", default=[0.8, 1.2], help="range for gamma correction") + parser.add_argument( + "--brightness-range", type=float, nargs="+", default=[0.8, 1.2], help="range for brightness correction" + ) + parser.add_argument( + "--contrast-range", type=float, nargs="+", default=[0.8, 1.2], help="range for contrast correction" + ) + parser.add_argument( + "--saturation-range", type=float, nargs="+", default=0.0, help="range for saturation correction" + ) + parser.add_argument("--hue-range", type=float, nargs="+", default=0.0, help="range for hue correction") + parser.add_argument( + "--asymmetric-jitter-prob", + type=float, + default=1.0, + help="probability of using asymmetric jitter instead of symmetric jitter", + ) + parser.add_argument("--occlusion-prob", type=float, default=0.5, help="probability of occluding the rightimage") + parser.add_argument( + "--occlusion-px-range", type=int, nargs="+", default=[50, 100], help="range for the number of occluded pixels" + ) + parser.add_argument("--erase-prob", type=float, default=0.0, help="probability of erasing in both images") + parser.add_argument( + "--erase-px-range", type=int, nargs="+", default=[50, 100], help="range for the number of erased pixels" + ) + parser.add_argument( + "--erase-num-repeats", type=int, default=1, help="number of times to repeat the erase operation" + ) + + # optimizer parameters + parser.add_argument("--optimizer", type=str, default="adam", help="optimizer", choices=["adam", "sgd"]) + parser.add_argument("--lr", type=float, default=4e-4, help="learning rate") + parser.add_argument("--weight-decay", type=float, default=0.0, help="weight decay") + parser.add_argument("--clip-grad-norm", type=float, default=0.0, help="clip grad norm") + + # lr_scheduler parameters + parser.add_argument("--min-lr", type=float, default=2e-5, help="minimum learning rate") + parser.add_argument("--warmup-steps", type=int, default=6_000, help="number of warmup steps") + parser.add_argument( + "--decay-after-steps", type=int, default=180_000, help="number of steps after which to start decay the lr" + ) + parser.add_argument( + "--lr-warmup-method", type=str, default="linear", help="warmup method", choices=["linear", "cosine"] + ) + parser.add_argument("--lr-warmup-factor", type=float, default=0.02, help="warmup factor for the learning rate") + parser.add_argument( + "--lr-decay-method", + type=str, + default="linear", + help="decay method", + choices=["linear", "cosine", "exponential"], + ) + parser.add_argument("--lr-decay-gamma", type=float, default=0.8, help="decay factor for the learning rate") + + # deterministic behaviour + parser.add_argument("--seed", type=int, default=42, help="seed for random number generators") + + # mixed precision training + parser.add_argument("--mixed-precision", action="store_true", help="use mixed precision training") + + # logging + parser.add_argument("--tensorboard-summaries", action="store_true", help="log to tensorboard") + parser.add_argument("--tensorboard-log-frequency", type=int, default=100, help="log frequency") + parser.add_argument("--save-frequency", type=int, default=1_000, help="save frequency") + parser.add_argument("--valid-frequency", type=int, default=1_000, help="validation frequency") + parser.add_argument( + "--metrics", + type=str, + nargs="+", + default=["mae", "rmse", "1px", "3px", "5px", "relepe"], + help="metrics to log", + choices=AVAILABLE_METRICS, + ) + + # distributed parameters + parser.add_argument("--world-size", type=int, default=8, help="number of distributed processes") + parser.add_argument("--dist-url", type=str, default="env://", help="url used to set up distributed training") + parser.add_argument("--device", type=str, default="cuda", help="device to use for training") + + # weights API + parser.add_argument("--weights", type=str, default=None, help="weights API url") + parser.add_argument( + "--resume-path", type=str, default=None, help="a path from which to resume or start fine-tuning" + ) + parser.add_argument("--resume-schedule", action="store_true", help="resume optimizer state") + + # padder parameters + parser.add_argument("--padder-type", type=str, default="kitti", help="padder type", choices=["kitti", "sintel"]) + return parser + + +if __name__ == "__main__": + args = get_args_parser().parse_args() + main(args) diff --git a/references/depth/stereo/transforms.py b/references/depth/stereo/transforms.py new file mode 100644 index 0000000000000000000000000000000000000000..9c4a6bab6d3b56922ea5339d4424356ef9eca292 --- /dev/null +++ b/references/depth/stereo/transforms.py @@ -0,0 +1,650 @@ +import random +from typing import Callable, List, Optional, Sequence, Tuple, Union + +import numpy as np +import PIL.Image +import torch +import torchvision.transforms as T +import torchvision.transforms.functional as F +from torch import Tensor + +T_FLOW = Union[Tensor, np.ndarray, None] +T_MASK = Union[Tensor, np.ndarray, None] +T_STEREO_TENSOR = Tuple[Tensor, Tensor] +T_COLOR_AUG_PARAM = Union[float, Tuple[float, float]] + + +def rand_float_range(size: Sequence[int], low: float, high: float) -> Tensor: + return (low - high) * torch.rand(size) + high + + +class InterpolationStrategy: + + _valid_modes: List[str] = ["mixed", "bicubic", "bilinear"] + + def __init__(self, mode: str = "mixed") -> None: + if mode not in self._valid_modes: + raise ValueError(f"Invalid interpolation mode: {mode}. Valid modes are: {self._valid_modes}") + + if mode == "mixed": + self.strategies = [F.InterpolationMode.BILINEAR, F.InterpolationMode.BICUBIC] + elif mode == "bicubic": + self.strategies = [F.InterpolationMode.BICUBIC] + elif mode == "bilinear": + self.strategies = [F.InterpolationMode.BILINEAR] + + def __call__(self) -> F.InterpolationMode: + return random.choice(self.strategies) + + @classmethod + def is_valid(mode: str) -> bool: + return mode in InterpolationStrategy._valid_modes + + @property + def valid_modes() -> List[str]: + return InterpolationStrategy._valid_modes + + +class ValidateModelInput(torch.nn.Module): + # Pass-through transform that checks the shape and dtypes to make sure the model gets what it expects + def forward(self, images: T_STEREO_TENSOR, disparities: T_FLOW, masks: T_MASK): + if images[0].shape != images[1].shape: + raise ValueError("img1 and img2 should have the same shape.") + h, w = images[0].shape[-2:] + if disparities[0] is not None and disparities[0].shape != (1, h, w): + raise ValueError(f"disparities[0].shape should be (1, {h}, {w}) instead of {disparities[0].shape}") + if masks[0] is not None: + if masks[0].shape != (h, w): + raise ValueError(f"masks[0].shape should be ({h}, {w}) instead of {masks[0].shape}") + if masks[0].dtype != torch.bool: + raise TypeError(f"masks[0] should be of dtype torch.bool instead of {masks[0].dtype}") + + return images, disparities, masks + + +class ConvertToGrayscale(torch.nn.Module): + def __init__(self) -> None: + super().__init__() + + def forward( + self, + images: Tuple[PIL.Image.Image, PIL.Image.Image], + disparities: Tuple[T_FLOW, T_FLOW], + masks: Tuple[T_MASK, T_MASK], + ) -> Tuple[T_STEREO_TENSOR, Tuple[T_FLOW, T_FLOW], Tuple[T_MASK, T_MASK]]: + img_left = F.rgb_to_grayscale(images[0], num_output_channels=3) + img_right = F.rgb_to_grayscale(images[1], num_output_channels=3) + + return (img_left, img_right), disparities, masks + + +class MakeValidDisparityMask(torch.nn.Module): + def __init__(self, max_disparity: Optional[int] = 256) -> None: + super().__init__() + self.max_disparity = max_disparity + + def forward( + self, + images: T_STEREO_TENSOR, + disparities: Tuple[T_FLOW, T_FLOW], + masks: Tuple[T_MASK, T_MASK], + ) -> Tuple[T_STEREO_TENSOR, Tuple[T_FLOW, T_FLOW], Tuple[T_MASK, T_MASK]]: + valid_masks = tuple( + torch.ones(images[idx].shape[-2:], dtype=torch.bool, device=images[idx].device) if mask is None else mask + for idx, mask in enumerate(masks) + ) + + valid_masks = tuple( + torch.logical_and(mask, disparity > 0).squeeze(0) if disparity is not None else mask + for mask, disparity in zip(valid_masks, disparities) + ) + + if self.max_disparity is not None: + valid_masks = tuple( + torch.logical_and(mask, disparity < self.max_disparity).squeeze(0) if disparity is not None else mask + for mask, disparity in zip(valid_masks, disparities) + ) + + return images, disparities, valid_masks + + +class ToGPU(torch.nn.Module): + def __init__(self) -> None: + super().__init__() + + def forward( + self, + images: T_STEREO_TENSOR, + disparities: Tuple[T_FLOW, T_FLOW], + masks: Tuple[T_MASK, T_MASK], + ) -> Tuple[T_STEREO_TENSOR, Tuple[T_FLOW, T_FLOW], Tuple[T_MASK, T_MASK]]: + dev_images = tuple(image.cuda() for image in images) + dev_disparities = tuple(map(lambda x: x.cuda() if x is not None else None, disparities)) + dev_masks = tuple(map(lambda x: x.cuda() if x is not None else None, masks)) + return dev_images, dev_disparities, dev_masks + + +class ConvertImageDtype(torch.nn.Module): + def __init__(self, dtype: torch.dtype): + super().__init__() + self.dtype = dtype + + def forward( + self, + images: T_STEREO_TENSOR, + disparities: Tuple[T_FLOW, T_FLOW], + masks: Tuple[T_MASK, T_MASK], + ) -> Tuple[T_STEREO_TENSOR, Tuple[T_FLOW, T_FLOW], Tuple[T_MASK, T_MASK]]: + img_left = F.convert_image_dtype(images[0], dtype=self.dtype) + img_right = F.convert_image_dtype(images[1], dtype=self.dtype) + + img_left = img_left.contiguous() + img_right = img_right.contiguous() + + return (img_left, img_right), disparities, masks + + +class Normalize(torch.nn.Module): + def __init__(self, mean: List[float], std: List[float]) -> None: + super().__init__() + self.mean = mean + self.std = std + + def forward( + self, + images: T_STEREO_TENSOR, + disparities: Tuple[T_FLOW, T_FLOW], + masks: Tuple[T_MASK, T_MASK], + ) -> Tuple[T_STEREO_TENSOR, Tuple[T_FLOW, T_FLOW], Tuple[T_MASK, T_MASK]]: + + img_left = F.normalize(images[0], mean=self.mean, std=self.std) + img_right = F.normalize(images[1], mean=self.mean, std=self.std) + + img_left = img_left.contiguous() + img_right = img_right.contiguous() + + return (img_left, img_right), disparities, masks + + +class ToTensor(torch.nn.Module): + def forward( + self, + images: Tuple[PIL.Image.Image, PIL.Image.Image], + disparities: Tuple[T_FLOW, T_FLOW], + masks: Tuple[T_MASK, T_MASK], + ) -> Tuple[T_STEREO_TENSOR, Tuple[T_FLOW, T_FLOW], Tuple[T_MASK, T_MASK]]: + if images[0] is None: + raise ValueError("img_left is None") + if images[1] is None: + raise ValueError("img_right is None") + + img_left = F.pil_to_tensor(images[0]) + img_right = F.pil_to_tensor(images[1]) + disparity_tensors = () + mask_tensors = () + + for idx in range(2): + disparity_tensors += (torch.from_numpy(disparities[idx]),) if disparities[idx] is not None else (None,) + mask_tensors += (torch.from_numpy(masks[idx]),) if masks[idx] is not None else (None,) + + return (img_left, img_right), disparity_tensors, mask_tensors + + +class AsymmetricColorJitter(T.ColorJitter): + # p determines the probability of doing asymmetric vs symmetric color jittering + def __init__( + self, + brightness: T_COLOR_AUG_PARAM = 0, + contrast: T_COLOR_AUG_PARAM = 0, + saturation: T_COLOR_AUG_PARAM = 0, + hue: T_COLOR_AUG_PARAM = 0, + p: float = 0.2, + ): + super().__init__(brightness=brightness, contrast=contrast, saturation=saturation, hue=hue) + self.p = p + + def forward( + self, + images: T_STEREO_TENSOR, + disparities: Tuple[T_FLOW, T_FLOW], + masks: Tuple[T_MASK, T_MASK], + ) -> Tuple[T_STEREO_TENSOR, Tuple[T_FLOW, T_FLOW], Tuple[T_MASK, T_MASK]]: + + if torch.rand(1) < self.p: + # asymmetric: different transform for img1 and img2 + img_left = super().forward(images[0]) + img_right = super().forward(images[1]) + else: + # symmetric: same transform for img1 and img2 + batch = torch.stack(images) + batch = super().forward(batch) + img_left, img_right = batch[0], batch[1] + + return (img_left, img_right), disparities, masks + + +class AsymetricGammaAdjust(torch.nn.Module): + def __init__(self, p: float, gamma_range: Tuple[float, float], gain: float = 1) -> None: + super().__init__() + self.gamma_range = gamma_range + self.gain = gain + self.p = p + + def forward( + self, + images: T_STEREO_TENSOR, + disparities: Tuple[T_FLOW, T_FLOW], + masks: Tuple[T_MASK, T_MASK], + ) -> Tuple[T_STEREO_TENSOR, Tuple[T_FLOW, T_FLOW], Tuple[T_MASK, T_MASK]]: + + gamma = rand_float_range((1,), low=self.gamma_range[0], high=self.gamma_range[1]).item() + + if torch.rand(1) < self.p: + # asymmetric: different transform for img1 and img2 + img_left = F.adjust_gamma(images[0], gamma, gain=self.gain) + img_right = F.adjust_gamma(images[1], gamma, gain=self.gain) + else: + # symmetric: same transform for img1 and img2 + batch = torch.stack(images) + batch = F.adjust_gamma(batch, gamma, gain=self.gain) + img_left, img_right = batch[0], batch[1] + + return (img_left, img_right), disparities, masks + + +class RandomErase(torch.nn.Module): + # Produces multiple symmetric random erasures + # these can be viewed as occlusions present in both camera views. + # Similarly to Optical Flow occlusion prediction tasks, we mask these pixels in the disparity map + def __init__( + self, + p: float = 0.5, + erase_px_range: Tuple[int, int] = (50, 100), + value: Union[Tensor, float] = 0, + inplace: bool = False, + max_erase: int = 2, + ): + super().__init__() + self.min_px_erase = erase_px_range[0] + self.max_px_erase = erase_px_range[1] + if self.max_px_erase < 0: + raise ValueError("erase_px_range[1] should be equal or greater than 0") + if self.min_px_erase < 0: + raise ValueError("erase_px_range[0] should be equal or greater than 0") + if self.min_px_erase > self.max_px_erase: + raise ValueError("erase_prx_range[0] should be equal or lower than erase_px_range[1]") + + self.p = p + self.value = value + self.inplace = inplace + self.max_erase = max_erase + + def forward( + self, + images: T_STEREO_TENSOR, + disparities: T_STEREO_TENSOR, + masks: T_STEREO_TENSOR, + ) -> Tuple[T_STEREO_TENSOR, Tuple[T_FLOW, T_FLOW], Tuple[T_MASK, T_MASK]]: + + if torch.rand(1) < self.p: + return images, disparities, masks + + image_left, image_right = images + mask_left, mask_right = masks + for _ in range(torch.randint(self.max_erase, size=(1,)).item()): + y, x, h, w, v = self._get_params(image_left) + image_right = F.erase(image_right, y, x, h, w, v, self.inplace) + image_left = F.erase(image_left, y, x, h, w, v, self.inplace) + # similarly to optical flow occlusion prediction, we consider + # any erasure pixels that are in both images to be occluded therefore + # we mark them as invalid + if mask_left is not None: + mask_left = F.erase(mask_left, y, x, h, w, False, self.inplace) + if mask_right is not None: + mask_right = F.erase(mask_right, y, x, h, w, False, self.inplace) + + return (image_left, image_right), disparities, (mask_left, mask_right) + + def _get_params(self, img: torch.Tensor) -> Tuple[int, int, int, int, float]: + img_h, img_w = img.shape[-2:] + crop_h, crop_w = ( + random.randint(self.min_px_erase, self.max_px_erase), + random.randint(self.min_px_erase, self.max_px_erase), + ) + crop_x, crop_y = (random.randint(0, img_w - crop_w), random.randint(0, img_h - crop_h)) + + return crop_y, crop_x, crop_h, crop_w, self.value + + +class RandomOcclusion(torch.nn.Module): + # This adds an occlusion in the right image + # the occluded patch works as a patch erase where the erase value is the mean + # of the pixels from the selected zone + def __init__(self, p: float = 0.5, occlusion_px_range: Tuple[int, int] = (50, 100), inplace: bool = False): + super().__init__() + + self.min_px_occlusion = occlusion_px_range[0] + self.max_px_occlusion = occlusion_px_range[1] + + if self.max_px_occlusion < 0: + raise ValueError("occlusion_px_range[1] should be greater or equal than 0") + if self.min_px_occlusion < 0: + raise ValueError("occlusion_px_range[0] should be greater or equal than 0") + if self.min_px_occlusion > self.max_px_occlusion: + raise ValueError("occlusion_px_range[0] should be lower than occlusion_px_range[1]") + + self.p = p + self.inplace = inplace + + def forward( + self, + images: T_STEREO_TENSOR, + disparities: T_STEREO_TENSOR, + masks: T_STEREO_TENSOR, + ) -> Tuple[T_STEREO_TENSOR, Tuple[T_FLOW, T_FLOW], Tuple[T_MASK, T_MASK]]: + + left_image, right_image = images + + if torch.rand(1) < self.p: + return images, disparities, masks + + y, x, h, w, v = self._get_params(right_image) + right_image = F.erase(right_image, y, x, h, w, v, self.inplace) + + return ((left_image, right_image), disparities, masks) + + def _get_params(self, img: torch.Tensor) -> Tuple[int, int, int, int, float]: + img_h, img_w = img.shape[-2:] + crop_h, crop_w = ( + random.randint(self.min_px_occlusion, self.max_px_occlusion), + random.randint(self.min_px_occlusion, self.max_px_occlusion), + ) + + crop_x, crop_y = (random.randint(0, img_w - crop_w), random.randint(0, img_h - crop_h)) + occlusion_value = img[..., crop_y : crop_y + crop_h, crop_x : crop_x + crop_w].mean(dim=(-2, -1), keepdim=True) + + return (crop_y, crop_x, crop_h, crop_w, occlusion_value) + + +class RandomSpatialShift(torch.nn.Module): + # This transform applies a vertical shift and a slight angle rotation and the same time + def __init__( + self, p: float = 0.5, max_angle: float = 0.1, max_px_shift: int = 2, interpolation_type: str = "bilinear" + ) -> None: + super().__init__() + self.p = p + self.max_angle = max_angle + self.max_px_shift = max_px_shift + self._interpolation_mode_strategy = InterpolationStrategy(interpolation_type) + + def forward( + self, + images: T_STEREO_TENSOR, + disparities: T_STEREO_TENSOR, + masks: T_STEREO_TENSOR, + ) -> Tuple[T_STEREO_TENSOR, Tuple[T_FLOW, T_FLOW], Tuple[T_MASK, T_MASK]]: + # the transform is applied only on the right image + # in order to mimic slight calibration issues + img_left, img_right = images + + INTERP_MODE = self._interpolation_mode_strategy() + + if torch.rand(1) < self.p: + # [0, 1] -> [-a, a] + shift = rand_float_range((1,), low=-self.max_px_shift, high=self.max_px_shift).item() + angle = rand_float_range((1,), low=-self.max_angle, high=self.max_angle).item() + # sample center point for the rotation matrix + y = torch.randint(size=(1,), low=0, high=img_right.shape[-2]).item() + x = torch.randint(size=(1,), low=0, high=img_right.shape[-1]).item() + # apply affine transformations + img_right = F.affine( + img_right, + angle=angle, + translate=[0, shift], # translation only on the y-axis + center=[x, y], + scale=1.0, + shear=0.0, + interpolation=INTERP_MODE, + ) + + return ((img_left, img_right), disparities, masks) + + +class RandomHorizontalFlip(torch.nn.Module): + def __init__(self, p: float = 0.5) -> None: + super().__init__() + self.p = p + + def forward( + self, + images: T_STEREO_TENSOR, + disparities: Tuple[T_FLOW, T_FLOW], + masks: Tuple[T_MASK, T_MASK], + ) -> Tuple[T_STEREO_TENSOR, Tuple[T_FLOW, T_FLOW], Tuple[T_MASK, T_MASK]]: + + img_left, img_right = images + dsp_left, dsp_right = disparities + mask_left, mask_right = masks + + if dsp_right is not None and torch.rand(1) < self.p: + img_left, img_right = F.hflip(img_left), F.hflip(img_right) + dsp_left, dsp_right = F.hflip(dsp_left), F.hflip(dsp_right) + if mask_left is not None and mask_right is not None: + mask_left, mask_right = F.hflip(mask_left), F.hflip(mask_right) + return ((img_right, img_left), (dsp_right, dsp_left), (mask_right, mask_left)) + + return images, disparities, masks + + +class Resize(torch.nn.Module): + def __init__(self, resize_size: Tuple[int, ...], interpolation_type: str = "bilinear") -> None: + super().__init__() + self.resize_size = list(resize_size) # doing this to keep mypy happy + self._interpolation_mode_strategy = InterpolationStrategy(interpolation_type) + + def forward( + self, + images: T_STEREO_TENSOR, + disparities: Tuple[T_FLOW, T_FLOW], + masks: Tuple[T_MASK, T_MASK], + ) -> Tuple[T_STEREO_TENSOR, Tuple[T_FLOW, T_FLOW], Tuple[T_MASK, T_MASK]]: + resized_images = () + resized_disparities = () + resized_masks = () + + INTERP_MODE = self._interpolation_mode_strategy() + + for img in images: + # We hard-code antialias=False to preserve results after we changed + # its default from None to True (see + # https://github.com/pytorch/vision/pull/7160) + # TODO: we could re-train the stereo models with antialias=True? + resized_images += (F.resize(img, self.resize_size, interpolation=INTERP_MODE, antialias=False),) + + for dsp in disparities: + if dsp is not None: + # rescale disparity to match the new image size + scale_x = self.resize_size[1] / dsp.shape[-1] + resized_disparities += (F.resize(dsp, self.resize_size, interpolation=INTERP_MODE) * scale_x,) + else: + resized_disparities += (None,) + + for mask in masks: + if mask is not None: + resized_masks += ( + # we squeeze and unsqueeze because the API requires > 3D tensors + F.resize( + mask.unsqueeze(0), + self.resize_size, + interpolation=F.InterpolationMode.NEAREST, + ).squeeze(0), + ) + else: + resized_masks += (None,) + + return resized_images, resized_disparities, resized_masks + + +class RandomRescaleAndCrop(torch.nn.Module): + # This transform will resize the input with a given proba, and then crop it. + # These are the reversed operations of the built-in RandomResizedCrop, + # although the order of the operations doesn't matter too much: resizing a + # crop would give the same result as cropping a resized image, up to + # interpolation artifact at the borders of the output. + # + # The reason we don't rely on RandomResizedCrop is because of a significant + # difference in the parametrization of both transforms, in particular, + # because of the way the random parameters are sampled in both transforms, + # which leads to fairly different results (and different epe). For more details see + # https://github.com/pytorch/vision/pull/5026/files#r762932579 + def __init__( + self, + crop_size: Tuple[int, int], + scale_range: Tuple[float, float] = (-0.2, 0.5), + rescale_prob: float = 0.8, + scaling_type: str = "exponential", + interpolation_type: str = "bilinear", + ) -> None: + super().__init__() + self.crop_size = crop_size + self.min_scale = scale_range[0] + self.max_scale = scale_range[1] + self.rescale_prob = rescale_prob + self.scaling_type = scaling_type + self._interpolation_mode_strategy = InterpolationStrategy(interpolation_type) + + if self.scaling_type == "linear" and self.min_scale < 0: + raise ValueError("min_scale must be >= 0 for linear scaling") + + def forward( + self, + images: T_STEREO_TENSOR, + disparities: Tuple[T_FLOW, T_FLOW], + masks: Tuple[T_MASK, T_MASK], + ) -> Tuple[T_STEREO_TENSOR, Tuple[T_FLOW, T_FLOW], Tuple[T_MASK, T_MASK]]: + + img_left, img_right = images + dsp_left, dsp_right = disparities + mask_left, mask_right = masks + INTERP_MODE = self._interpolation_mode_strategy() + + # randomly sample scale + h, w = img_left.shape[-2:] + # Note: in original code, they use + 1 instead of + 8 for sparse datasets (e.g. Kitti) + # It shouldn't matter much + min_scale = max((self.crop_size[0] + 8) / h, (self.crop_size[1] + 8) / w) + + # exponential scaling will draw a random scale in (min_scale, max_scale) and then raise + # 2 to the power of that random value. This final scale distribution will have a different + # mean and variance than a uniform distribution. Note that a scale of 1 will result in + # a rescaling of 2X the original size, whereas a scale of -1 will result in a rescaling + # of 0.5X the original size. + if self.scaling_type == "exponential": + scale = 2 ** torch.empty(1, dtype=torch.float32).uniform_(self.min_scale, self.max_scale).item() + # linear scaling will draw a random scale in (min_scale, max_scale) + elif self.scaling_type == "linear": + scale = torch.empty(1, dtype=torch.float32).uniform_(self.min_scale, self.max_scale).item() + + scale = max(scale, min_scale) + + new_h, new_w = round(h * scale), round(w * scale) + + if torch.rand(1).item() < self.rescale_prob: + # rescale the images + img_left = F.resize(img_left, size=(new_h, new_w), interpolation=INTERP_MODE) + img_right = F.resize(img_right, size=(new_h, new_w), interpolation=INTERP_MODE) + + resized_masks, resized_disparities = (), () + + for disparity, mask in zip(disparities, masks): + if disparity is not None: + if mask is None: + resized_disparity = F.resize(disparity, size=(new_h, new_w), interpolation=INTERP_MODE) + # rescale the disparity + resized_disparity = ( + resized_disparity * torch.tensor([scale], device=resized_disparity.device)[:, None, None] + ) + resized_mask = None + else: + resized_disparity, resized_mask = _resize_sparse_flow( + disparity, mask, scale_x=scale, scale_y=scale + ) + resized_masks += (resized_mask,) + resized_disparities += (resized_disparity,) + + else: + resized_disparities = disparities + resized_masks = masks + + disparities = resized_disparities + masks = resized_masks + + # Note: For sparse datasets (Kitti), the original code uses a "margin" + # See e.g. https://github.com/princeton-vl/RAFT/blob/master/core/utils/augmentor.py#L220:L220 + # We don't, not sure if it matters much + y0 = torch.randint(0, img_left.shape[1] - self.crop_size[0], size=(1,)).item() + x0 = torch.randint(0, img_right.shape[2] - self.crop_size[1], size=(1,)).item() + + img_left = F.crop(img_left, y0, x0, self.crop_size[0], self.crop_size[1]) + img_right = F.crop(img_right, y0, x0, self.crop_size[0], self.crop_size[1]) + if dsp_left is not None: + dsp_left = F.crop(disparities[0], y0, x0, self.crop_size[0], self.crop_size[1]) + if dsp_right is not None: + dsp_right = F.crop(disparities[1], y0, x0, self.crop_size[0], self.crop_size[1]) + + cropped_masks = () + for mask in masks: + if mask is not None: + mask = F.crop(mask, y0, x0, self.crop_size[0], self.crop_size[1]) + cropped_masks += (mask,) + + return ((img_left, img_right), (dsp_left, dsp_right), cropped_masks) + + +def _resize_sparse_flow( + flow: Tensor, valid_flow_mask: Tensor, scale_x: float = 1.0, scale_y: float = 0.0 +) -> Tuple[Tensor, Tensor]: + # This resizes both the flow and the valid_flow_mask mask (which is assumed to be reasonably sparse) + # There are as-many non-zero values in the original flow as in the resized flow (up to OOB) + # So for example if scale_x = scale_y = 2, the sparsity of the output flow is multiplied by 4 + + h, w = flow.shape[-2:] + + h_new = int(round(h * scale_y)) + w_new = int(round(w * scale_x)) + flow_new = torch.zeros(size=[1, h_new, w_new], dtype=flow.dtype) + valid_new = torch.zeros(size=[h_new, w_new], dtype=valid_flow_mask.dtype) + + jj, ii = torch.meshgrid(torch.arange(w), torch.arange(h), indexing="xy") + + ii_valid, jj_valid = ii[valid_flow_mask], jj[valid_flow_mask] + + ii_valid_new = torch.round(ii_valid.to(float) * scale_y).to(torch.long) + jj_valid_new = torch.round(jj_valid.to(float) * scale_x).to(torch.long) + + within_bounds_mask = (0 <= ii_valid_new) & (ii_valid_new < h_new) & (0 <= jj_valid_new) & (jj_valid_new < w_new) + + ii_valid = ii_valid[within_bounds_mask] + jj_valid = jj_valid[within_bounds_mask] + ii_valid_new = ii_valid_new[within_bounds_mask] + jj_valid_new = jj_valid_new[within_bounds_mask] + + valid_flow_new = flow[:, ii_valid, jj_valid] + valid_flow_new *= scale_x + + flow_new[:, ii_valid_new, jj_valid_new] = valid_flow_new + valid_new[ii_valid_new, jj_valid_new] = valid_flow_mask[ii_valid, jj_valid] + + return flow_new, valid_new.bool() + + +class Compose(torch.nn.Module): + def __init__(self, transforms: List[Callable]): + super().__init__() + self.transforms = transforms + + @torch.inference_mode() + def forward(self, images, disparities, masks): + for t in self.transforms: + images, disparities, masks = t(images, disparities, masks) + return images, disparities, masks diff --git a/references/depth/stereo/utils/__init__.py b/references/depth/stereo/utils/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..4dacbe61ba0ac4f958ca562a72f43448dbef7c4c --- /dev/null +++ b/references/depth/stereo/utils/__init__.py @@ -0,0 +1,6 @@ +from .losses import * +from .metrics import * +from .distributed import * +from .logger import * +from .padder import * +from .norm import * diff --git a/references/depth/stereo/utils/distributed.py b/references/depth/stereo/utils/distributed.py new file mode 100644 index 0000000000000000000000000000000000000000..228aa2a0f9ae03a20dcca05310b0b265cd28a008 --- /dev/null +++ b/references/depth/stereo/utils/distributed.py @@ -0,0 +1,60 @@ +import os + +import torch +import torch.distributed as dist + + +def _redefine_print(is_main): + """disables printing when not in main process""" + import builtins as __builtin__ + + builtin_print = __builtin__.print + + def print(*args, **kwargs): + force = kwargs.pop("force", False) + if is_main or force: + builtin_print(*args, **kwargs) + + __builtin__.print = print + + +def setup_ddp(args): + # Set the local_rank, rank, and world_size values as args fields + # This is done differently depending on how we're running the script. We + # currently support either torchrun or the custom run_with_submitit.py + # If you're confused (like I was), this might help a bit + # https://discuss.pytorch.org/t/what-is-the-difference-between-rank-and-local-rank/61940/2 + + if "RANK" in os.environ and "WORLD_SIZE" in os.environ: + args.rank = int(os.environ["RANK"]) + args.world_size = int(os.environ["WORLD_SIZE"]) + args.gpu = int(os.environ["LOCAL_RANK"]) + elif "SLURM_PROCID" in os.environ: + args.rank = int(os.environ["SLURM_PROCID"]) + args.gpu = args.rank % torch.cuda.device_count() + elif hasattr(args, "rank"): + pass + else: + print("Not using distributed mode") + args.distributed = False + args.world_size = 1 + return + + args.distributed = True + + torch.cuda.set_device(args.gpu) + dist.init_process_group( + backend="nccl", + rank=args.rank, + world_size=args.world_size, + init_method=args.dist_url, + ) + torch.distributed.barrier() + _redefine_print(is_main=(args.rank == 0)) + + +def reduce_across_processes(val): + t = torch.tensor(val, device="cuda") + dist.barrier() + dist.all_reduce(t) + return t diff --git a/references/depth/stereo/utils/logger.py b/references/depth/stereo/utils/logger.py new file mode 100644 index 0000000000000000000000000000000000000000..803e9aebd7b8b3af07023b01f67d57c78e255db3 --- /dev/null +++ b/references/depth/stereo/utils/logger.py @@ -0,0 +1,153 @@ +import datetime +import time +from collections import defaultdict, deque + +import torch + +from .distributed import reduce_across_processes + + +class SmoothedValue: + """Track a series of values and provide access to smoothed values over a + window or the global series average. + """ + + def __init__(self, window_size=20, fmt="{median:.4f} ({global_avg:.4f})"): + self.deque = deque(maxlen=window_size) + self.total = 0.0 + self.count = 0 + self.fmt = fmt + + def update(self, value, n=1): + self.deque.append(value) + self.count += n + self.total += value * n + + def synchronize_between_processes(self): + """ + Warning: does not synchronize the deque! + """ + t = reduce_across_processes([self.count, self.total]) + t = t.tolist() + self.count = int(t[0]) + self.total = t[1] + + @property + def median(self): + d = torch.tensor(list(self.deque)) + return d.median().item() + + @property + def avg(self): + d = torch.tensor(list(self.deque), dtype=torch.float32) + return d.mean().item() + + @property + def global_avg(self): + return self.total / self.count + + @property + def max(self): + return max(self.deque) + + @property + def value(self): + return self.deque[-1] + + def __str__(self): + return self.fmt.format( + median=self.median, avg=self.avg, global_avg=self.global_avg, max=self.max, value=self.value + ) + + +class MetricLogger: + def __init__(self, delimiter="\t"): + self.meters = defaultdict(SmoothedValue) + self.delimiter = delimiter + + def update(self, **kwargs): + for k, v in kwargs.items(): + if isinstance(v, torch.Tensor): + v = v.item() + if not isinstance(v, (float, int)): + raise TypeError( + f"This method expects the value of the input arguments to be of type float or int, instead got {type(v)}" + ) + self.meters[k].update(v) + + def __getattr__(self, attr): + if attr in self.meters: + return self.meters[attr] + if attr in self.__dict__: + return self.__dict__[attr] + raise AttributeError(f"'{type(self).__name__}' object has no attribute '{attr}'") + + def __str__(self): + loss_str = [] + for name, meter in self.meters.items(): + loss_str.append(f"{name}: {str(meter)}") + return self.delimiter.join(loss_str) + + def synchronize_between_processes(self): + for meter in self.meters.values(): + meter.synchronize_between_processes() + + def add_meter(self, name, **kwargs): + self.meters[name] = SmoothedValue(**kwargs) + + def log_every(self, iterable, print_freq=5, header=None): + i = 0 + if not header: + header = "" + start_time = time.time() + end = time.time() + iter_time = SmoothedValue(fmt="{avg:.4f}") + data_time = SmoothedValue(fmt="{avg:.4f}") + space_fmt = ":" + str(len(str(len(iterable)))) + "d" + if torch.cuda.is_available(): + log_msg = self.delimiter.join( + [ + header, + "[{0" + space_fmt + "}/{1}]", + "eta: {eta}", + "{meters}", + "time: {time}", + "data: {data}", + "max mem: {memory:.0f}", + ] + ) + else: + log_msg = self.delimiter.join( + [header, "[{0" + space_fmt + "}/{1}]", "eta: {eta}", "{meters}", "time: {time}", "data: {data}"] + ) + MB = 1024.0 * 1024.0 + for obj in iterable: + data_time.update(time.time() - end) + yield obj + iter_time.update(time.time() - end) + if print_freq is not None and i % print_freq == 0: + eta_seconds = iter_time.global_avg * (len(iterable) - i) + eta_string = str(datetime.timedelta(seconds=int(eta_seconds))) + if torch.cuda.is_available(): + print( + log_msg.format( + i, + len(iterable), + eta=eta_string, + meters=str(self), + time=str(iter_time), + data=str(data_time), + memory=torch.cuda.max_memory_allocated() / MB, + ) + ) + else: + print( + log_msg.format( + i, len(iterable), eta=eta_string, meters=str(self), time=str(iter_time), data=str(data_time) + ) + ) + i += 1 + end = time.time() + total_time = time.time() - start_time + total_time_str = str(datetime.timedelta(seconds=int(total_time))) + print(f"{header} Total time: {total_time_str}") diff --git a/references/depth/stereo/utils/losses.py b/references/depth/stereo/utils/losses.py new file mode 100644 index 0000000000000000000000000000000000000000..c809cc74d0f49f1b87277dd0ecece413a0f079c2 --- /dev/null +++ b/references/depth/stereo/utils/losses.py @@ -0,0 +1,503 @@ +from typing import List, Optional + +import torch +from torch import nn, Tensor +from torch.nn import functional as F +from torchvision.prototype.models.depth.stereo.raft_stereo import grid_sample, make_coords_grid + + +def make_gaussian_kernel(kernel_size: int, sigma: float) -> torch.Tensor: + """Function to create a 2D Gaussian kernel.""" + + x = torch.arange(kernel_size, dtype=torch.float32) + y = torch.arange(kernel_size, dtype=torch.float32) + x = x - (kernel_size - 1) / 2 + y = y - (kernel_size - 1) / 2 + x, y = torch.meshgrid(x, y) + grid = (x**2 + y**2) / (2 * sigma**2) + kernel = torch.exp(-grid) + kernel = kernel / kernel.sum() + return kernel + + +def _sequence_loss_fn( + flow_preds: List[Tensor], + flow_gt: Tensor, + valid_flow_mask: Optional[Tensor], + gamma: Tensor, + max_flow: int = 256, + exclude_large: bool = False, + weights: Optional[Tensor] = None, +): + """Loss function defined over sequence of flow predictions""" + torch._assert( + gamma < 1, + "sequence_loss: `gamma` must be lower than 1, but got {}".format(gamma), + ) + + if exclude_large: + # exclude invalid pixels and extremely large diplacements + flow_norm = torch.sum(flow_gt**2, dim=1).sqrt() + if valid_flow_mask is not None: + valid_flow_mask = valid_flow_mask & (flow_norm < max_flow) + else: + valid_flow_mask = flow_norm < max_flow + + if valid_flow_mask is not None: + valid_flow_mask = valid_flow_mask.unsqueeze(1) + flow_preds = torch.stack(flow_preds) # shape = (num_flow_updates, batch_size, 2, H, W) + + abs_diff = (flow_preds - flow_gt).abs() + if valid_flow_mask is not None: + abs_diff = abs_diff * valid_flow_mask.unsqueeze(0) + + abs_diff = abs_diff.mean(axis=(1, 2, 3, 4)) + num_predictions = flow_preds.shape[0] + + # allocating on CPU and moving to device during run-time can force + # an unwanted GPU synchronization that produces a large overhead + if weights is None or len(weights) != num_predictions: + weights = gamma ** torch.arange(num_predictions - 1, -1, -1, device=flow_preds.device, dtype=flow_preds.dtype) + + flow_loss = (abs_diff * weights).sum() + return flow_loss, weights + + +class SequenceLoss(nn.Module): + def __init__(self, gamma: float = 0.8, max_flow: int = 256, exclude_large_flows: bool = False) -> None: + """ + Args: + gamma: value for the exponential weighting of the loss across frames + max_flow: maximum flow value to exclude + exclude_large_flows: whether to exclude large flows + """ + + super().__init__() + self.max_flow = max_flow + self.excluding_large = exclude_large_flows + self.register_buffer("gamma", torch.tensor([gamma])) + # cache the scale factor for the loss + self._weights = None + + def forward(self, flow_preds: List[Tensor], flow_gt: Tensor, valid_flow_mask: Optional[Tensor]) -> Tensor: + """ + Args: + flow_preds: list of flow predictions of shape (batch_size, C, H, W) + flow_gt: ground truth flow of shape (batch_size, C, H, W) + valid_flow_mask: mask of valid flow pixels of shape (batch_size, H, W) + """ + loss, weights = _sequence_loss_fn( + flow_preds, flow_gt, valid_flow_mask, self.gamma, self.max_flow, self.excluding_large, self._weights + ) + self._weights = weights + return loss + + def set_gamma(self, gamma: float) -> None: + self.gamma.fill_(gamma) + # reset the cached scale factor + self._weights = None + + +def _ssim_loss_fn( + source: Tensor, + reference: Tensor, + kernel: Tensor, + eps: float = 1e-8, + c1: float = 0.01**2, + c2: float = 0.03**2, + use_padding: bool = False, +) -> Tensor: + # ref: Algorithm section: https://en.wikipedia.org/wiki/Structural_similarity + # ref: Alternative implementation: https://kornia.readthedocs.io/en/latest/_modules/kornia/metrics/ssim.html#ssim + + torch._assert( + source.ndim == reference.ndim == 4, + "SSIM: `source` and `reference` must be 4-dimensional tensors", + ) + + torch._assert( + source.shape == reference.shape, + "SSIM: `source` and `reference` must have the same shape, but got {} and {}".format( + source.shape, reference.shape + ), + ) + + B, C, H, W = source.shape + kernel = kernel.unsqueeze(0).unsqueeze(0).repeat(C, 1, 1, 1) + if use_padding: + pad_size = kernel.shape[2] // 2 + source = F.pad(source, (pad_size, pad_size, pad_size, pad_size), "reflect") + reference = F.pad(reference, (pad_size, pad_size, pad_size, pad_size), "reflect") + + mu1 = F.conv2d(source, kernel, groups=C) + mu2 = F.conv2d(reference, kernel, groups=C) + + mu1_sq = mu1.pow(2) + mu2_sq = mu2.pow(2) + + mu1_mu2 = mu1 * mu2 + mu_img1_sq = F.conv2d(source.pow(2), kernel, groups=C) + mu_img2_sq = F.conv2d(reference.pow(2), kernel, groups=C) + mu_img1_mu2 = F.conv2d(source * reference, kernel, groups=C) + + sigma1_sq = mu_img1_sq - mu1_sq + sigma2_sq = mu_img2_sq - mu2_sq + sigma12 = mu_img1_mu2 - mu1_mu2 + + numerator = (2 * mu1_mu2 + c1) * (2 * sigma12 + c2) + denominator = (mu1_sq + mu2_sq + c1) * (sigma1_sq + sigma2_sq + c2) + ssim = numerator / (denominator + eps) + + # doing 1 - ssim because we want to maximize the ssim + return 1 - ssim.mean(dim=(1, 2, 3)) + + +class SSIM(nn.Module): + def __init__( + self, + kernel_size: int = 11, + max_val: float = 1.0, + sigma: float = 1.5, + eps: float = 1e-12, + use_padding: bool = True, + ) -> None: + """SSIM loss function. + + Args: + kernel_size: size of the Gaussian kernel + max_val: constant scaling factor + sigma: sigma of the Gaussian kernel + eps: constant for division by zero + use_padding: whether to pad the input tensor such that we have a score for each pixel + """ + super().__init__() + + self.kernel_size = kernel_size + self.max_val = max_val + self.sigma = sigma + + gaussian_kernel = make_gaussian_kernel(kernel_size, sigma) + self.register_buffer("gaussian_kernel", gaussian_kernel) + + self.c1 = (0.01 * self.max_val) ** 2 + self.c2 = (0.03 * self.max_val) ** 2 + + self.use_padding = use_padding + self.eps = eps + + def forward(self, source: torch.Tensor, reference: torch.Tensor) -> torch.Tensor: + """ + Args: + source: source image of shape (batch_size, C, H, W) + reference: reference image of shape (batch_size, C, H, W) + + Returns: + SSIM loss of shape (batch_size,) + """ + return _ssim_loss_fn( + source, + reference, + kernel=self.gaussian_kernel, + c1=self.c1, + c2=self.c2, + use_padding=self.use_padding, + eps=self.eps, + ) + + +def _smoothness_loss_fn(img_gx: Tensor, img_gy: Tensor, val_gx: Tensor, val_gy: Tensor): + # ref: https://github.com/nianticlabs/monodepth2/blob/b676244e5a1ca55564eb5d16ab521a48f823af31/layers.py#L202 + + torch._assert( + img_gx.ndim >= 3, + "smoothness_loss: `img_gx` must be at least 3-dimensional tensor of shape (..., C, H, W)", + ) + + torch._assert( + img_gx.ndim == val_gx.ndim, + "smoothness_loss: `img_gx` and `depth_gx` must have the same dimensionality, but got {} and {}".format( + img_gx.ndim, val_gx.ndim + ), + ) + + for idx in range(img_gx.ndim): + torch._assert( + (img_gx.shape[idx] == val_gx.shape[idx] or (img_gx.shape[idx] == 1 or val_gx.shape[idx] == 1)), + "smoothness_loss: `img_gx` and `depth_gx` must have either the same shape or broadcastable shape, but got {} and {}".format( + img_gx.shape, val_gx.shape + ), + ) + + # -3 is channel dimension + weights_x = torch.exp(-torch.mean(torch.abs(val_gx), axis=-3, keepdim=True)) + weights_y = torch.exp(-torch.mean(torch.abs(val_gy), axis=-3, keepdim=True)) + + smoothness_x = img_gx * weights_x + smoothness_y = img_gy * weights_y + + smoothness = (torch.abs(smoothness_x) + torch.abs(smoothness_y)).mean(axis=(-3, -2, -1)) + return smoothness + + +class SmoothnessLoss(nn.Module): + def __init__(self) -> None: + super().__init__() + + def _x_gradient(self, img: Tensor) -> Tensor: + if img.ndim > 4: + original_shape = img.shape + is_reshaped = True + img = img.reshape(-1, *original_shape[-3:]) + else: + is_reshaped = False + + padded = F.pad(img, (0, 1, 0, 0), mode="replicate") + grad = padded[..., :, :-1] - padded[..., :, 1:] + if is_reshaped: + grad = grad.reshape(original_shape) + return grad + + def _y_gradient(self, x: torch.Tensor) -> torch.Tensor: + if x.ndim > 4: + original_shape = x.shape + is_reshaped = True + x = x.reshape(-1, *original_shape[-3:]) + else: + is_reshaped = False + + padded = F.pad(x, (0, 0, 0, 1), mode="replicate") + grad = padded[..., :-1, :] - padded[..., 1:, :] + if is_reshaped: + grad = grad.reshape(original_shape) + return grad + + def forward(self, images: Tensor, vals: Tensor) -> Tensor: + """ + Args: + images: tensor of shape (D1, D2, ..., DN, C, H, W) + vals: tensor of shape (D1, D2, ..., DN, 1, H, W) + + Returns: + smoothness loss of shape (D1, D2, ..., DN) + """ + img_gx = self._x_gradient(images) + img_gy = self._y_gradient(images) + + val_gx = self._x_gradient(vals) + val_gy = self._y_gradient(vals) + + return _smoothness_loss_fn(img_gx, img_gy, val_gx, val_gy) + + +def _flow_sequence_consistency_loss_fn( + flow_preds: List[Tensor], + gamma: float = 0.8, + resize_factor: float = 0.25, + rescale_factor: float = 0.25, + rescale_mode: str = "bilinear", + weights: Optional[Tensor] = None, +): + """Loss function defined over sequence of flow predictions""" + + # Simplified version of ref: https://arxiv.org/pdf/2006.11242.pdf + # In the original paper, an additional refinement network is used to refine a flow prediction. + # Each step performed by the recurrent module in Raft or CREStereo is a refinement step using a delta_flow update. + # which should be consistent with the previous step. In this implementation, we simplify the overall loss + # term and ignore left-right consistency loss or photometric loss which can be treated separately. + + torch._assert( + rescale_factor <= 1.0, + "sequence_consistency_loss: `rescale_factor` must be less than or equal to 1, but got {}".format( + rescale_factor + ), + ) + + flow_preds = torch.stack(flow_preds) # shape = (num_flow_updates, batch_size, 2, H, W) + N, B, C, H, W = flow_preds.shape + + # rescale flow predictions to account for bilinear upsampling artifacts + if rescale_factor: + flow_preds = ( + F.interpolate( + flow_preds.view(N * B, C, H, W), scale_factor=resize_factor, mode=rescale_mode, align_corners=True + ) + ) * rescale_factor + flow_preds = torch.stack(torch.chunk(flow_preds, N, dim=0), dim=0) + + # force the next prediction to be similar to the previous prediction + abs_diff = (flow_preds[1:] - flow_preds[:-1]).square() + abs_diff = abs_diff.mean(axis=(1, 2, 3, 4)) + + num_predictions = flow_preds.shape[0] - 1 # because we are comparing differences + if weights is None or len(weights) != num_predictions: + weights = gamma ** torch.arange(num_predictions - 1, -1, -1, device=flow_preds.device, dtype=flow_preds.dtype) + + flow_loss = (abs_diff * weights).sum() + return flow_loss, weights + + +class FlowSequenceConsistencyLoss(nn.Module): + def __init__( + self, + gamma: float = 0.8, + resize_factor: float = 0.25, + rescale_factor: float = 0.25, + rescale_mode: str = "bilinear", + ) -> None: + super().__init__() + self.gamma = gamma + self.resize_factor = resize_factor + self.rescale_factor = rescale_factor + self.rescale_mode = rescale_mode + self._weights = None + + def forward(self, flow_preds: List[Tensor]) -> Tensor: + """ + Args: + flow_preds: list of tensors of shape (batch_size, C, H, W) + + Returns: + sequence consistency loss of shape (batch_size,) + """ + loss, weights = _flow_sequence_consistency_loss_fn( + flow_preds, + gamma=self.gamma, + resize_factor=self.resize_factor, + rescale_factor=self.rescale_factor, + rescale_mode=self.rescale_mode, + weights=self._weights, + ) + self._weights = weights + return loss + + def set_gamma(self, gamma: float) -> None: + self.gamma.fill_(gamma) + # reset the cached scale factor + self._weights = None + + +def _psnr_loss_fn(source: torch.Tensor, target: torch.Tensor, max_val: float) -> torch.Tensor: + torch._assert( + source.shape == target.shape, + "psnr_loss: source and target must have the same shape, but got {} and {}".format(source.shape, target.shape), + ) + + # ref https://en.wikipedia.org/wiki/Peak_signal-to-noise_ratio + return 10 * torch.log10(max_val**2 / ((source - target).pow(2).mean(axis=(-3, -2, -1)))) + + +class PSNRLoss(nn.Module): + def __init__(self, max_val: float = 256) -> None: + """ + Args: + max_val: maximum value of the input tensor. This refers to the maximum domain value of the input tensor. + + """ + super().__init__() + self.max_val = max_val + + def forward(self, source: Tensor, target: Tensor) -> Tensor: + """ + Args: + source: tensor of shape (D1, D2, ..., DN, C, H, W) + target: tensor of shape (D1, D2, ..., DN, C, H, W) + + Returns: + psnr loss of shape (D1, D2, ..., DN) + """ + + # multiply by -1 as we want to maximize the psnr + return -1 * _psnr_loss_fn(source, target, self.max_val) + + +class FlowPhotoMetricLoss(nn.Module): + def __init__( + self, + ssim_weight: float = 0.85, + ssim_window_size: int = 11, + ssim_max_val: float = 1.0, + ssim_sigma: float = 1.5, + ssim_eps: float = 1e-12, + ssim_use_padding: bool = True, + max_displacement_ratio: float = 0.15, + ) -> None: + super().__init__() + + self._ssim_loss = SSIM( + kernel_size=ssim_window_size, + max_val=ssim_max_val, + sigma=ssim_sigma, + eps=ssim_eps, + use_padding=ssim_use_padding, + ) + + self._L1_weight = 1 - ssim_weight + self._SSIM_weight = ssim_weight + self._max_displacement_ratio = max_displacement_ratio + + def forward( + self, + source: Tensor, + reference: Tensor, + flow_pred: Tensor, + valid_mask: Optional[Tensor] = None, + ): + """ + Args: + source: tensor of shape (B, C, H, W) + reference: tensor of shape (B, C, H, W) + flow_pred: tensor of shape (B, 2, H, W) + valid_mask: tensor of shape (B, H, W) or None + + Returns: + photometric loss of shape + + """ + torch._assert( + source.ndim == 4, + "FlowPhotoMetricLoss: source must have 4 dimensions, but got {}".format(source.ndim), + ) + torch._assert( + reference.ndim == source.ndim, + "FlowPhotoMetricLoss: source and other must have the same number of dimensions, but got {} and {}".format( + source.ndim, reference.ndim + ), + ) + torch._assert( + flow_pred.shape[1] == 2, + "FlowPhotoMetricLoss: flow_pred must have 2 channels, but got {}".format(flow_pred.shape[1]), + ) + torch._assert( + flow_pred.ndim == 4, + "FlowPhotoMetricLoss: flow_pred must have 4 dimensions, but got {}".format(flow_pred.ndim), + ) + + B, C, H, W = source.shape + flow_channels = flow_pred.shape[1] + + max_displacements = [] + for dim in range(flow_channels): + shape_index = -1 - dim + max_displacements.append(int(self._max_displacement_ratio * source.shape[shape_index])) + + # mask out all pixels that have larger flow than the max flow allowed + max_flow_mask = torch.logical_and( + *[flow_pred[:, dim, :, :] < max_displacements[dim] for dim in range(flow_channels)] + ) + + if valid_mask is not None: + valid_mask = torch.logical_and(valid_mask, max_flow_mask).unsqueeze(1) + else: + valid_mask = max_flow_mask.unsqueeze(1) + + grid = make_coords_grid(B, H, W, device=str(source.device)) + resampled_grids = grid - flow_pred + resampled_grids = resampled_grids.permute(0, 2, 3, 1) + resampled_source = grid_sample(reference, resampled_grids, mode="bilinear") + + # compute SSIM loss + ssim_loss = self._ssim_loss(resampled_source * valid_mask, source * valid_mask) + l1_loss = (resampled_source * valid_mask - source * valid_mask).abs().mean(axis=(-3, -2, -1)) + loss = self._L1_weight * l1_loss + self._SSIM_weight * ssim_loss + + return loss.mean() diff --git a/references/depth/stereo/utils/metrics.py b/references/depth/stereo/utils/metrics.py new file mode 100644 index 0000000000000000000000000000000000000000..05b149fb048b70a95e32b485ac91de7de45c237a --- /dev/null +++ b/references/depth/stereo/utils/metrics.py @@ -0,0 +1,49 @@ +from typing import Dict, List, Optional, Tuple + +from torch import Tensor + +AVAILABLE_METRICS = ["mae", "rmse", "epe", "bad1", "bad2", "epe", "1px", "3px", "5px", "fl-all", "relepe"] + + +def compute_metrics( + flow_pred: Tensor, flow_gt: Tensor, valid_flow_mask: Optional[Tensor], metrics: List[str] +) -> Tuple[Dict[str, float], int]: + for m in metrics: + if m not in AVAILABLE_METRICS: + raise ValueError(f"Invalid metric: {m}. Valid metrics are: {AVAILABLE_METRICS}") + + metrics_dict = {} + + pixels_diffs = (flow_pred - flow_gt).abs() + # there is no Y flow in Stereo Matching, therefore flow.abs() = flow.pow(2).sum(dim=1).sqrt() + flow_norm = flow_gt.abs() + + if valid_flow_mask is not None: + valid_flow_mask = valid_flow_mask.unsqueeze(1) + pixels_diffs = pixels_diffs[valid_flow_mask] + flow_norm = flow_norm[valid_flow_mask] + + num_pixels = pixels_diffs.numel() + if "bad1" in metrics: + metrics_dict["bad1"] = (pixels_diffs > 1).float().mean().item() + if "bad2" in metrics: + metrics_dict["bad2"] = (pixels_diffs > 2).float().mean().item() + + if "mae" in metrics: + metrics_dict["mae"] = pixels_diffs.mean().item() + if "rmse" in metrics: + metrics_dict["rmse"] = pixels_diffs.pow(2).mean().sqrt().item() + if "epe" in metrics: + metrics_dict["epe"] = pixels_diffs.mean().item() + if "1px" in metrics: + metrics_dict["1px"] = (pixels_diffs < 1).float().mean().item() + if "3px" in metrics: + metrics_dict["3px"] = (pixels_diffs < 3).float().mean().item() + if "5px" in metrics: + metrics_dict["5px"] = (pixels_diffs < 5).float().mean().item() + if "fl-all" in metrics: + metrics_dict["fl-all"] = ((pixels_diffs < 3) & ((pixels_diffs / flow_norm) < 0.05)).float().mean().item() * 100 + if "relepe" in metrics: + metrics_dict["relepe"] = (pixels_diffs / flow_norm).mean().item() + + return metrics_dict, num_pixels diff --git a/references/depth/stereo/utils/norm.py b/references/depth/stereo/utils/norm.py new file mode 100644 index 0000000000000000000000000000000000000000..7f6e0011160b16c9e0657a678086037ae7eaa83d --- /dev/null +++ b/references/depth/stereo/utils/norm.py @@ -0,0 +1,13 @@ +import torch + + +def freeze_batch_norm(model): + for m in model.modules(): + if isinstance(m, torch.nn.BatchNorm2d): + m.eval() + + +def unfreeze_batch_norm(model): + for m in model.modules(): + if isinstance(m, torch.nn.BatchNorm2d): + m.train() diff --git a/references/depth/stereo/utils/padder.py b/references/depth/stereo/utils/padder.py new file mode 100644 index 0000000000000000000000000000000000000000..7d2c63afba6a5df6a6fdb878f6badafb0342310a --- /dev/null +++ b/references/depth/stereo/utils/padder.py @@ -0,0 +1,28 @@ +import torch.nn.functional as F + + +class InputPadder: + """Pads images such that dimensions are divisible by 8""" + + # TODO: Ideally, this should be part of the eval transforms preset, instead + # of being part of the validation code. It's not obvious what a good + # solution would be, because we need to unpad the predicted flows according + # to the input images' size, and in some datasets (Kitti) images can have + # variable sizes. + + def __init__(self, dims, mode="sintel"): + self.ht, self.wd = dims[-2:] + pad_ht = (((self.ht // 8) + 1) * 8 - self.ht) % 8 + pad_wd = (((self.wd // 8) + 1) * 8 - self.wd) % 8 + if mode == "sintel": + self._pad = [pad_wd // 2, pad_wd - pad_wd // 2, pad_ht // 2, pad_ht - pad_ht // 2] + else: + self._pad = [pad_wd // 2, pad_wd - pad_wd // 2, 0, pad_ht] + + def pad(self, *inputs): + return [F.pad(x, self._pad, mode="replicate") for x in inputs] + + def unpad(self, x): + ht, wd = x.shape[-2:] + c = [self._pad[2], ht - self._pad[3], self._pad[0], wd - self._pad[1]] + return x[..., c[0] : c[1], c[2] : c[3]] diff --git a/references/depth/stereo/visualization.py b/references/depth/stereo/visualization.py new file mode 100644 index 0000000000000000000000000000000000000000..d043d274614969d206159e5bc4973e6844cf39f7 --- /dev/null +++ b/references/depth/stereo/visualization.py @@ -0,0 +1,126 @@ +import os +from typing import List + +import numpy as np +import torch +from torch import Tensor +from torchvision.utils import make_grid + + +@torch.no_grad() +def make_disparity_image(disparity: Tensor): + # normalize image to [0, 1] + disparity = disparity.detach().cpu() + disparity = (disparity - disparity.min()) / (disparity.max() - disparity.min()) + return disparity + + +@torch.no_grad() +def make_disparity_image_pairs(disparity: Tensor, image: Tensor): + disparity = make_disparity_image(disparity) + # image is in [-1, 1], bring it to [0, 1] + image = image.detach().cpu() + image = image * 0.5 + 0.5 + return disparity, image + + +@torch.no_grad() +def make_disparity_sequence(disparities: List[Tensor]): + # convert each disparity to [0, 1] + for idx, disparity_batch in enumerate(disparities): + disparities[idx] = torch.stack(list(map(make_disparity_image, disparity_batch))) + # make the list into a batch + disparity_sequences = torch.stack(disparities) + return disparity_sequences + + +@torch.no_grad() +def make_pair_grid(*inputs, orientation="horizontal"): + # make a grid of images with the outputs and references side by side + if orientation == "horizontal": + # interleave the outputs and references + canvas = torch.zeros_like(inputs[0]) + canvas = torch.cat([canvas] * len(inputs), dim=0) + size = len(inputs) + for idx, inp in enumerate(inputs): + canvas[idx::size, ...] = inp + grid = make_grid(canvas, nrow=len(inputs), padding=16, normalize=True, scale_each=True) + elif orientation == "vertical": + # interleave the outputs and references + canvas = torch.cat(inputs, dim=0) + size = len(inputs) + for idx, inp in enumerate(inputs): + canvas[idx::size, ...] = inp + grid = make_grid(canvas, nrow=len(inputs[0]), padding=16, normalize=True, scale_each=True) + else: + raise ValueError("Unknown orientation: {}".format(orientation)) + return grid + + +@torch.no_grad() +def make_training_sample_grid( + left_images: Tensor, + right_images: Tensor, + disparities: Tensor, + masks: Tensor, + predictions: List[Tensor], +) -> np.ndarray: + # detach images and renormalize to [0, 1] + images_left = left_images.detach().cpu() * 0.5 + 0.5 + images_right = right_images.detach().cpu() * 0.5 + 0.5 + # detach the disparties and predictions + disparities = disparities.detach().cpu() + predictions = predictions[-1].detach().cpu() + # keep only the first channel of pixels, and repeat it 3 times + disparities = disparities[:, :1, ...].repeat(1, 3, 1, 1) + predictions = predictions[:, :1, ...].repeat(1, 3, 1, 1) + # unsqueeze and repeat the masks + masks = masks.detach().cpu().unsqueeze(1).repeat(1, 3, 1, 1) + # make a grid that will self normalize across the batch + pred_grid = make_pair_grid(images_left, images_right, masks, disparities, predictions, orientation="horizontal") + pred_grid = pred_grid.permute(1, 2, 0).numpy() + pred_grid = (pred_grid * 255).astype(np.uint8) + return pred_grid + + +@torch.no_grad() +def make_disparity_sequence_grid(predictions: List[Tensor], disparities: Tensor) -> np.ndarray: + # right most we will be adding the ground truth + seq_len = len(predictions) + 1 + predictions = list(map(lambda x: x[:, :1, :, :].detach().cpu(), predictions + [disparities])) + sequence = make_disparity_sequence(predictions) + # swap axes to have the in the correct order for each batch sample + sequence = torch.swapaxes(sequence, 0, 1).contiguous().reshape(-1, 1, disparities.shape[-2], disparities.shape[-1]) + sequence = make_grid(sequence, nrow=seq_len, padding=16, normalize=True, scale_each=True) + sequence = sequence.permute(1, 2, 0).numpy() + sequence = (sequence * 255).astype(np.uint8) + return sequence + + +@torch.no_grad() +def make_prediction_image_side_to_side( + predictions: Tensor, disparities: Tensor, valid_mask: Tensor, save_path: str, prefix: str +) -> None: + import matplotlib.pyplot as plt + + # normalize the predictions and disparities in [0, 1] + predictions = (predictions - predictions.min()) / (predictions.max() - predictions.min()) + disparities = (disparities - disparities.min()) / (disparities.max() - disparities.min()) + predictions = predictions * valid_mask + disparities = disparities * valid_mask + + predictions = predictions.detach().cpu() + disparities = disparities.detach().cpu() + + for idx, (pred, gt) in enumerate(zip(predictions, disparities)): + pred = pred.permute(1, 2, 0).numpy() + gt = gt.permute(1, 2, 0).numpy() + # plot pred and gt side by side + fig, ax = plt.subplots(1, 2, figsize=(10, 5)) + ax[0].imshow(pred) + ax[0].set_title("Prediction") + ax[1].imshow(gt) + ax[1].set_title("Ground Truth") + save_name = os.path.join(save_path, "{}_{}.png".format(prefix, idx)) + plt.savefig(save_name) + plt.close() diff --git a/references/detection/README.md b/references/detection/README.md index ea5be6ea791f79b612f954ff56e7d1315b7f405d..d9af26523a5932fd4532656b904b5772042f2cba 100644 --- a/references/detection/README.md +++ b/references/detection/README.md @@ -22,43 +22,50 @@ Except otherwise noted, all models have been trained on 8x V100 GPUs. ### Faster R-CNN ResNet-50 FPN ``` -python -m torch.distributed.launch --nproc_per_node=8 --use_env train.py\ +torchrun --nproc_per_node=8 train.py\ --dataset coco --model fasterrcnn_resnet50_fpn --epochs 26\ - --lr-steps 16 22 --aspect-ratio-group-factor 3 + --lr-steps 16 22 --aspect-ratio-group-factor 3 --weights-backbone ResNet50_Weights.IMAGENET1K_V1 ``` ### Faster R-CNN MobileNetV3-Large FPN ``` -python -m torch.distributed.launch --nproc_per_node=8 --use_env train.py\ +torchrun --nproc_per_node=8 train.py\ --dataset coco --model fasterrcnn_mobilenet_v3_large_fpn --epochs 26\ - --lr-steps 16 22 --aspect-ratio-group-factor 3 + --lr-steps 16 22 --aspect-ratio-group-factor 3 --weights-backbone MobileNet_V3_Large_Weights.IMAGENET1K_V1 ``` ### Faster R-CNN MobileNetV3-Large 320 FPN ``` -python -m torch.distributed.launch --nproc_per_node=8 --use_env train.py\ +torchrun --nproc_per_node=8 train.py\ --dataset coco --model fasterrcnn_mobilenet_v3_large_320_fpn --epochs 26\ - --lr-steps 16 22 --aspect-ratio-group-factor 3 + --lr-steps 16 22 --aspect-ratio-group-factor 3 --weights-backbone MobileNet_V3_Large_Weights.IMAGENET1K_V1 +``` + +### FCOS ResNet-50 FPN +``` +torchrun --nproc_per_node=8 train.py\ + --dataset coco --model fcos_resnet50_fpn --epochs 26\ + --lr-steps 16 22 --aspect-ratio-group-factor 3 --lr 0.01 --amp --weights-backbone ResNet50_Weights.IMAGENET1K_V1 ``` ### RetinaNet ``` -python -m torch.distributed.launch --nproc_per_node=8 --use_env train.py\ +torchrun --nproc_per_node=8 train.py\ --dataset coco --model retinanet_resnet50_fpn --epochs 26\ - --lr-steps 16 22 --aspect-ratio-group-factor 3 --lr 0.01 + --lr-steps 16 22 --aspect-ratio-group-factor 3 --lr 0.01 --weights-backbone ResNet50_Weights.IMAGENET1K_V1 ``` ### SSD300 VGG16 ``` -python -m torch.distributed.launch --nproc_per_node=8 --use_env train.py\ +torchrun --nproc_per_node=8 train.py\ --dataset coco --model ssd300_vgg16 --epochs 120\ --lr-steps 80 110 --aspect-ratio-group-factor 3 --lr 0.002 --batch-size 4\ - --weight-decay 0.0005 --data-augmentation ssd + --weight-decay 0.0005 --data-augmentation ssd --weights-backbone VGG16_Weights.IMAGENET1K_FEATURES ``` ### SSDlite320 MobileNetV3-Large ``` -python -m torch.distributed.launch --nproc_per_node=8 --use_env train.py\ +torchrun --nproc_per_node=8 train.py\ --dataset coco --model ssdlite320_mobilenet_v3_large --epochs 660\ --aspect-ratio-group-factor 3 --lr-scheduler cosineannealinglr --lr 0.15 --batch-size 24\ --weight-decay 0.00004 --data-augmentation ssdlite @@ -67,16 +74,15 @@ python -m torch.distributed.launch --nproc_per_node=8 --use_env train.py\ ### Mask R-CNN ``` -python -m torch.distributed.launch --nproc_per_node=8 --use_env train.py\ +torchrun --nproc_per_node=8 train.py\ --dataset coco --model maskrcnn_resnet50_fpn --epochs 26\ - --lr-steps 16 22 --aspect-ratio-group-factor 3 + --lr-steps 16 22 --aspect-ratio-group-factor 3 --weights-backbone ResNet50_Weights.IMAGENET1K_V1 ``` ### Keypoint R-CNN ``` -python -m torch.distributed.launch --nproc_per_node=8 --use_env train.py\ +torchrun --nproc_per_node=8 train.py\ --dataset coco_kp --model keypointrcnn_resnet50_fpn --epochs 46\ - --lr-steps 36 43 --aspect-ratio-group-factor 3 + --lr-steps 36 43 --aspect-ratio-group-factor 3 --weights-backbone ResNet50_Weights.IMAGENET1K_V1 ``` - diff --git a/references/detection/coco_eval.py b/references/detection/coco_eval.py index 09648f29ae46548626d0f16cd65fd1b5399cacbe..ba1359f8c652bc0e001c634f0a2cbb7f4b0d6106 100644 --- a/references/detection/coco_eval.py +++ b/references/detection/coco_eval.py @@ -1,24 +1,19 @@ -import json -import tempfile - -import numpy as np import copy -import time -import torch -import torch._six +import io +from contextlib import redirect_stdout -from pycocotools.cocoeval import COCOeval -from pycocotools.coco import COCO +import numpy as np import pycocotools.mask as mask_util - -from collections import defaultdict - +import torch import utils +from pycocotools.coco import COCO +from pycocotools.cocoeval import COCOeval -class CocoEvaluator(object): +class CocoEvaluator: def __init__(self, coco_gt, iou_types): - assert isinstance(iou_types, (list, tuple)) + if not isinstance(iou_types, (list, tuple)): + raise TypeError(f"This constructor expects iou_types of type list or tuple, instead got {type(iou_types)}") coco_gt = copy.deepcopy(coco_gt) self.coco_gt = coco_gt @@ -36,7 +31,8 @@ class CocoEvaluator(object): for iou_type in self.iou_types: results = self.prepare(predictions, iou_type) - coco_dt = loadRes(self.coco_gt, results) if results else COCO() + with redirect_stdout(io.StringIO()): + coco_dt = COCO.loadRes(self.coco_gt, results) if results else COCO() coco_eval = self.coco_eval[iou_type] coco_eval.cocoDt = coco_dt @@ -56,18 +52,17 @@ class CocoEvaluator(object): def summarize(self): for iou_type, coco_eval in self.coco_eval.items(): - print("IoU metric: {}".format(iou_type)) + print(f"IoU metric: {iou_type}") coco_eval.summarize() def prepare(self, predictions, iou_type): if iou_type == "bbox": return self.prepare_for_coco_detection(predictions) - elif iou_type == "segm": + if iou_type == "segm": return self.prepare_for_coco_segmentation(predictions) - elif iou_type == "keypoints": + if iou_type == "keypoints": return self.prepare_for_coco_keypoint(predictions) - else: - raise ValueError("Unknown iou type {}".format(iou_type)) + raise ValueError(f"Unknown iou type {iou_type}") def prepare_for_coco_detection(self, predictions): coco_results = [] @@ -109,8 +104,7 @@ class CocoEvaluator(object): labels = prediction["labels"].tolist() rles = [ - mask_util.encode(np.array(mask[0, :, :, np.newaxis], dtype=np.uint8, order="F"))[0] - for mask in masks + mask_util.encode(np.array(mask[0, :, :, np.newaxis], dtype=np.uint8, order="F"))[0] for mask in masks ] for rle in rles: rle["counts"] = rle["counts"].decode("utf-8") @@ -146,7 +140,7 @@ class CocoEvaluator(object): { "image_id": original_id, "category_id": labels[k], - 'keypoints': keypoint, + "keypoints": keypoint, "score": scores[k], } for k, keypoint in enumerate(keypoints) @@ -192,161 +186,7 @@ def create_common_coco_eval(coco_eval, img_ids, eval_imgs): coco_eval._paramsEval = copy.deepcopy(coco_eval.params) -################################################################# -# From pycocotools, just removed the prints and fixed -# a Python3 bug about unicode not defined -################################################################# - -# Ideally, pycocotools wouldn't have hard-coded prints -# so that we could avoid copy-pasting those two functions - -def createIndex(self): - # create index - # print('creating index...') - anns, cats, imgs = {}, {}, {} - imgToAnns, catToImgs = defaultdict(list), defaultdict(list) - if 'annotations' in self.dataset: - for ann in self.dataset['annotations']: - imgToAnns[ann['image_id']].append(ann) - anns[ann['id']] = ann - - if 'images' in self.dataset: - for img in self.dataset['images']: - imgs[img['id']] = img - - if 'categories' in self.dataset: - for cat in self.dataset['categories']: - cats[cat['id']] = cat - - if 'annotations' in self.dataset and 'categories' in self.dataset: - for ann in self.dataset['annotations']: - catToImgs[ann['category_id']].append(ann['image_id']) - - # print('index created!') - - # create class members - self.anns = anns - self.imgToAnns = imgToAnns - self.catToImgs = catToImgs - self.imgs = imgs - self.cats = cats - - -maskUtils = mask_util - - -def loadRes(self, resFile): - """ - Load result file and return a result api object. - Args: - self (obj): coco object with ground truth annotations - resFile (str): file name of result file - Returns: - res (obj): result api object - """ - res = COCO() - res.dataset['images'] = [img for img in self.dataset['images']] - - # print('Loading and preparing results...') - # tic = time.time() - if isinstance(resFile, torch._six.string_classes): - anns = json.load(open(resFile)) - elif type(resFile) == np.ndarray: - anns = self.loadNumpyAnnotations(resFile) - else: - anns = resFile - assert type(anns) == list, 'results in not an array of objects' - annsImgIds = [ann['image_id'] for ann in anns] - assert set(annsImgIds) == (set(annsImgIds) & set(self.getImgIds())), \ - 'Results do not correspond to current coco set' - if 'caption' in anns[0]: - imgIds = set([img['id'] for img in res.dataset['images']]) & set([ann['image_id'] for ann in anns]) - res.dataset['images'] = [img for img in res.dataset['images'] if img['id'] in imgIds] - for id, ann in enumerate(anns): - ann['id'] = id + 1 - elif 'bbox' in anns[0] and not anns[0]['bbox'] == []: - res.dataset['categories'] = copy.deepcopy(self.dataset['categories']) - for id, ann in enumerate(anns): - bb = ann['bbox'] - x1, x2, y1, y2 = [bb[0], bb[0] + bb[2], bb[1], bb[1] + bb[3]] - if 'segmentation' not in ann: - ann['segmentation'] = [[x1, y1, x1, y2, x2, y2, x2, y1]] - ann['area'] = bb[2] * bb[3] - ann['id'] = id + 1 - ann['iscrowd'] = 0 - elif 'segmentation' in anns[0]: - res.dataset['categories'] = copy.deepcopy(self.dataset['categories']) - for id, ann in enumerate(anns): - # now only support compressed RLE format as segmentation results - ann['area'] = maskUtils.area(ann['segmentation']) - if 'bbox' not in ann: - ann['bbox'] = maskUtils.toBbox(ann['segmentation']) - ann['id'] = id + 1 - ann['iscrowd'] = 0 - elif 'keypoints' in anns[0]: - res.dataset['categories'] = copy.deepcopy(self.dataset['categories']) - for id, ann in enumerate(anns): - s = ann['keypoints'] - x = s[0::3] - y = s[1::3] - x1, x2, y1, y2 = np.min(x), np.max(x), np.min(y), np.max(y) - ann['area'] = (x2 - x1) * (y2 - y1) - ann['id'] = id + 1 - ann['bbox'] = [x1, y1, x2 - x1, y2 - y1] - # print('DONE (t={:0.2f}s)'.format(time.time()- tic)) - - res.dataset['annotations'] = anns - createIndex(res) - return res - - -def evaluate(self): - ''' - Run per image evaluation on given images and store results (a list of dict) in self.evalImgs - :return: None - ''' - # tic = time.time() - # print('Running per image evaluation...') - p = self.params - # add backward compatibility if useSegm is specified in params - if p.useSegm is not None: - p.iouType = 'segm' if p.useSegm == 1 else 'bbox' - print('useSegm (deprecated) is not None. Running {} evaluation'.format(p.iouType)) - # print('Evaluate annotation type *{}*'.format(p.iouType)) - p.imgIds = list(np.unique(p.imgIds)) - if p.useCats: - p.catIds = list(np.unique(p.catIds)) - p.maxDets = sorted(p.maxDets) - self.params = p - - self._prepare() - # loop through images, area range, max detection number - catIds = p.catIds if p.useCats else [-1] - - if p.iouType == 'segm' or p.iouType == 'bbox': - computeIoU = self.computeIoU - elif p.iouType == 'keypoints': - computeIoU = self.computeOks - self.ious = { - (imgId, catId): computeIoU(imgId, catId) - for imgId in p.imgIds - for catId in catIds} - - evaluateImg = self.evaluateImg - maxDet = p.maxDets[-1] - evalImgs = [ - evaluateImg(imgId, catId, areaRng, maxDet) - for catId in catIds - for areaRng in p.areaRng - for imgId in p.imgIds - ] - # this is NOT in the pycocotools code, but could be done outside - evalImgs = np.asarray(evalImgs).reshape(len(catIds), len(p.areaRng), len(p.imgIds)) - self._paramsEval = copy.deepcopy(self.params) - # toc = time.time() - # print('DONE (t={:0.2f}s).'.format(toc-tic)) - return p.imgIds, evalImgs - -################################################################# -# end of straight copy from pycocotools, just removing the prints -################################################################# +def evaluate(imgs): + with redirect_stdout(io.StringIO()): + imgs.evaluate() + return imgs.params.imgIds, np.asarray(imgs.evalImgs).reshape(-1, len(imgs.params.areaRng), len(imgs.params.imgIds)) diff --git a/references/detection/coco_utils.py b/references/detection/coco_utils.py index 26701a2cbee2086fd8aef3d5c9a29bc3ee14b7c8..f40dcdff783d7a2ce26d5e453c13dd23b52cc212 100644 --- a/references/detection/coco_utils.py +++ b/references/detection/coco_utils.py @@ -1,34 +1,12 @@ -import copy import os -from PIL import Image import torch import torch.utils.data import torchvision - +import transforms as T from pycocotools import mask as coco_mask from pycocotools.coco import COCO -import transforms as T - - -class FilterAndRemapCocoCategories(object): - def __init__(self, categories, remap=True): - self.categories = categories - self.remap = remap - - def __call__(self, image, target): - anno = target["annotations"] - anno = [obj for obj in anno if obj["category_id"] in self.categories] - if not self.remap: - target["annotations"] = anno - return image, target - anno = copy.deepcopy(anno) - for obj in anno: - obj["category_id"] = self.categories.index(obj["category_id"]) - target["annotations"] = anno - return image, target - def convert_coco_poly_to_mask(segmentations, height, width): masks = [] @@ -47,16 +25,15 @@ def convert_coco_poly_to_mask(segmentations, height, width): return masks -class ConvertCocoPolysToMask(object): +class ConvertCocoPolysToMask: def __call__(self, image, target): w, h = image.size image_id = target["image_id"] - image_id = torch.tensor([image_id]) anno = target["annotations"] - anno = [obj for obj in anno if obj['iscrowd'] == 0] + anno = [obj for obj in anno if obj["iscrowd"] == 0] boxes = [obj["bbox"] for obj in anno] # guard against no boxes via resizing @@ -119,7 +96,7 @@ def _coco_remove_images_without_annotations(dataset, cat_list=None): # if all boxes have close to zero area, there is no annotation if _has_only_empty_bbox(anno): return False - # keypoints task have a slight different critera for considering + # keypoints task have a slight different criteria for considering # if an annotation is valid if "keypoints" not in anno[0]: return True @@ -129,7 +106,6 @@ def _coco_remove_images_without_annotations(dataset, cat_list=None): return True return False - assert isinstance(dataset, torchvision.datasets.CocoDetection) ids = [] for ds_idx, img_id in enumerate(dataset.ids): ann_ids = dataset.coco.getAnnIds(imgIds=img_id, iscrowd=None) @@ -147,55 +123,56 @@ def convert_to_coco_api(ds): coco_ds = COCO() # annotation IDs need to start at 1, not 0, see torchvision issue #1530 ann_id = 1 - dataset = {'images': [], 'categories': [], 'annotations': []} + dataset = {"images": [], "categories": [], "annotations": []} categories = set() for img_idx in range(len(ds)): # find better way to get target # targets = ds.get_annotations(img_idx) img, targets = ds[img_idx] - image_id = targets["image_id"].item() + image_id = targets["image_id"] img_dict = {} - img_dict['id'] = image_id - img_dict['height'] = img.shape[-2] - img_dict['width'] = img.shape[-1] - dataset['images'].append(img_dict) - bboxes = targets["boxes"] + img_dict["id"] = image_id + img_dict["height"] = img.shape[-2] + img_dict["width"] = img.shape[-1] + dataset["images"].append(img_dict) + bboxes = targets["boxes"].clone() bboxes[:, 2:] -= bboxes[:, :2] bboxes = bboxes.tolist() - labels = targets['labels'].tolist() - areas = targets['area'].tolist() - iscrowd = targets['iscrowd'].tolist() - if 'masks' in targets: - masks = targets['masks'] + labels = targets["labels"].tolist() + areas = targets["area"].tolist() + iscrowd = targets["iscrowd"].tolist() + if "masks" in targets: + masks = targets["masks"] # make masks Fortran contiguous for coco_mask masks = masks.permute(0, 2, 1).contiguous().permute(0, 2, 1) - if 'keypoints' in targets: - keypoints = targets['keypoints'] + if "keypoints" in targets: + keypoints = targets["keypoints"] keypoints = keypoints.reshape(keypoints.shape[0], -1).tolist() num_objs = len(bboxes) for i in range(num_objs): ann = {} - ann['image_id'] = image_id - ann['bbox'] = bboxes[i] - ann['category_id'] = labels[i] + ann["image_id"] = image_id + ann["bbox"] = bboxes[i] + ann["category_id"] = labels[i] categories.add(labels[i]) - ann['area'] = areas[i] - ann['iscrowd'] = iscrowd[i] - ann['id'] = ann_id - if 'masks' in targets: + ann["area"] = areas[i] + ann["iscrowd"] = iscrowd[i] + ann["id"] = ann_id + if "masks" in targets: ann["segmentation"] = coco_mask.encode(masks[i].numpy()) - if 'keypoints' in targets: - ann['keypoints'] = keypoints[i] - ann['num_keypoints'] = sum(k != 0 for k in keypoints[i][2::3]) - dataset['annotations'].append(ann) + if "keypoints" in targets: + ann["keypoints"] = keypoints[i] + ann["num_keypoints"] = sum(k != 0 for k in keypoints[i][2::3]) + dataset["annotations"].append(ann) ann_id += 1 - dataset['categories'] = [{'id': i} for i in sorted(categories)] + dataset["categories"] = [{"id": i} for i in sorted(categories)] coco_ds.dataset = dataset coco_ds.createIndex() return coco_ds def get_coco_api_from_dataset(dataset): + # FIXME: This is... awful? for _ in range(10): if isinstance(dataset, torchvision.datasets.CocoDetection): break @@ -208,11 +185,11 @@ def get_coco_api_from_dataset(dataset): class CocoDetection(torchvision.datasets.CocoDetection): def __init__(self, img_folder, ann_file, transforms): - super(CocoDetection, self).__init__(img_folder, ann_file) + super().__init__(img_folder, ann_file) self._transforms = transforms def __getitem__(self, idx): - img, target = super(CocoDetection, self).__getitem__(idx) + img, target = super().__getitem__(idx) image_id = self.ids[idx] target = dict(image_id=image_id, annotations=target) if self._transforms is not None: @@ -220,7 +197,7 @@ class CocoDetection(torchvision.datasets.CocoDetection): return img, target -def get_coco(root, image_set, transforms, mode='instances'): +def get_coco(root, image_set, transforms, mode="instances", use_v2=False, with_masks=False): anno_file_template = "{}_{}2017.json" PATHS = { "train": ("train2017", os.path.join("annotations", anno_file_template.format(mode, "train"))), @@ -228,17 +205,26 @@ def get_coco(root, image_set, transforms, mode='instances'): # "train": ("val2017", os.path.join("annotations", anno_file_template.format(mode, "val"))) } - t = [ConvertCocoPolysToMask()] - - if transforms is not None: - t.append(transforms) - transforms = T.Compose(t) - img_folder, ann_file = PATHS[image_set] img_folder = os.path.join(root, img_folder) ann_file = os.path.join(root, ann_file) - dataset = CocoDetection(img_folder, ann_file, transforms=transforms) + if use_v2: + from torchvision.datasets import wrap_dataset_for_transforms_v2 + + dataset = torchvision.datasets.CocoDetection(img_folder, ann_file, transforms=transforms) + target_keys = ["boxes", "labels", "image_id"] + if with_masks: + target_keys += ["masks"] + dataset = wrap_dataset_for_transforms_v2(dataset, target_keys=target_keys) + else: + # TODO: handle with_masks for V1? + t = [ConvertCocoPolysToMask()] + if transforms is not None: + t.append(transforms) + transforms = T.Compose(t) + + dataset = CocoDetection(img_folder, ann_file, transforms=transforms) if image_set == "train": dataset = _coco_remove_images_without_annotations(dataset) @@ -246,7 +232,3 @@ def get_coco(root, image_set, transforms, mode='instances'): # dataset = torch.utils.data.Subset(dataset, [i for i in range(500)]) return dataset - - -def get_coco_kp(root, image_set, transforms): - return get_coco(root, image_set, transforms, mode="person_keypoints") diff --git a/references/detection/engine.py b/references/detection/engine.py index 49992af60a9f4c0ecf154fc4585af7ee33ee51f5..0e9bfffdf8af566c4bc13436361005c1e7b84dcb 100644 --- a/references/detection/engine.py +++ b/references/detection/engine.py @@ -1,35 +1,35 @@ import math import sys import time -import torch +import torch import torchvision.models.detection.mask_rcnn - -from coco_utils import get_coco_api_from_dataset -from coco_eval import CocoEvaluator import utils +from coco_eval import CocoEvaluator +from coco_utils import get_coco_api_from_dataset -def train_one_epoch(model, optimizer, data_loader, device, epoch, print_freq): +def train_one_epoch(model, optimizer, data_loader, device, epoch, print_freq, scaler=None): model.train() metric_logger = utils.MetricLogger(delimiter=" ") - metric_logger.add_meter('lr', utils.SmoothedValue(window_size=1, fmt='{value:.6f}')) - header = 'Epoch: [{}]'.format(epoch) + metric_logger.add_meter("lr", utils.SmoothedValue(window_size=1, fmt="{value:.6f}")) + header = f"Epoch: [{epoch}]" lr_scheduler = None if epoch == 0: - warmup_factor = 1. / 1000 + warmup_factor = 1.0 / 1000 warmup_iters = min(1000, len(data_loader) - 1) - lr_scheduler = utils.warmup_lr_scheduler(optimizer, warmup_iters, warmup_factor) + lr_scheduler = torch.optim.lr_scheduler.LinearLR( + optimizer, start_factor=warmup_factor, total_iters=warmup_iters + ) for images, targets in metric_logger.log_every(data_loader, print_freq, header): images = list(image.to(device) for image in images) - targets = [{k: v.to(device) for k, v in t.items()} for t in targets] - - loss_dict = model(images, targets) - - losses = sum(loss for loss in loss_dict.values()) + targets = [{k: v.to(device) if isinstance(v, torch.Tensor) else v for k, v in t.items()} for t in targets] + with torch.cuda.amp.autocast(enabled=scaler is not None): + loss_dict = model(images, targets) + losses = sum(loss for loss in loss_dict.values()) # reduce losses over all GPUs for logging purposes loss_dict_reduced = utils.reduce_dict(loss_dict) @@ -38,13 +38,18 @@ def train_one_epoch(model, optimizer, data_loader, device, epoch, print_freq): loss_value = losses_reduced.item() if not math.isfinite(loss_value): - print("Loss is {}, stopping training".format(loss_value)) + print(f"Loss is {loss_value}, stopping training") print(loss_dict_reduced) sys.exit(1) optimizer.zero_grad() - losses.backward() - optimizer.step() + if scaler is not None: + scaler.scale(losses).backward() + scaler.step(optimizer) + scaler.update() + else: + losses.backward() + optimizer.step() if lr_scheduler is not None: lr_scheduler.step() @@ -67,7 +72,7 @@ def _get_iou_types(model): return iou_types -@torch.no_grad() +@torch.inference_mode() def evaluate(model, data_loader, device): n_threads = torch.get_num_threads() # FIXME remove this and make paste_masks_in_image run on the GPU @@ -75,7 +80,7 @@ def evaluate(model, data_loader, device): cpu_device = torch.device("cpu") model.eval() metric_logger = utils.MetricLogger(delimiter=" ") - header = 'Test:' + header = "Test:" coco = get_coco_api_from_dataset(data_loader.dataset) iou_types = _get_iou_types(model) @@ -92,7 +97,7 @@ def evaluate(model, data_loader, device): outputs = [{k: v.to(cpu_device) for k, v in t.items()} for t in outputs] model_time = time.time() - model_time - res = {target["image_id"].item(): output for target, output in zip(targets, outputs)} + res = {target["image_id"]: output for target, output in zip(targets, outputs)} evaluator_time = time.time() coco_evaluator.update(res) evaluator_time = time.time() - evaluator_time diff --git a/references/detection/group_by_aspect_ratio.py b/references/detection/group_by_aspect_ratio.py index 1b76f4c64f7ab470b3bb30160a16e865a3909351..d12e14b540cc788abb98f40134ca9738dcd88a9a 100644 --- a/references/detection/group_by_aspect_ratio.py +++ b/references/detection/group_by_aspect_ratio.py @@ -1,17 +1,16 @@ import bisect -from collections import defaultdict import copy -from itertools import repeat, chain import math -import numpy as np +from collections import defaultdict +from itertools import chain, repeat +import numpy as np import torch import torch.utils.data -from torch.utils.data.sampler import BatchSampler, Sampler -from torch.utils.model_zoo import tqdm import torchvision - from PIL import Image +from torch.utils.data.sampler import BatchSampler, Sampler +from torch.utils.model_zoo import tqdm def _repeat_to_at_least(iterable, n): @@ -34,12 +33,10 @@ class GroupedBatchSampler(BatchSampler): 0, i.e. they must be in the range [0, num_groups). batch_size (int): Size of mini-batch. """ + def __init__(self, sampler, group_ids, batch_size): if not isinstance(sampler, Sampler): - raise ValueError( - "sampler should be an instance of " - "torch.utils.data.Sampler, but got sampler={}".format(sampler) - ) + raise ValueError(f"sampler should be an instance of torch.utils.data.Sampler, but got sampler={sampler}") self.sampler = sampler self.group_ids = group_ids self.batch_size = batch_size @@ -66,10 +63,9 @@ class GroupedBatchSampler(BatchSampler): expected_num_batches = len(self) num_remaining = expected_num_batches - num_batches if num_remaining > 0: - # for the remaining batches, take first the buffers with largest number + # for the remaining batches, take first the buffers with the largest number # of elements - for group_id, _ in sorted(buffer_per_group.items(), - key=lambda x: len(x[1]), reverse=True): + for group_id, _ in sorted(buffer_per_group.items(), key=lambda x: len(x[1]), reverse=True): remaining = self.batch_size - len(buffer_per_group[group_id]) samples_from_group_id = _repeat_to_at_least(samples_per_group[group_id], remaining) buffer_per_group[group_id].extend(samples_from_group_id[:remaining]) @@ -85,10 +81,12 @@ class GroupedBatchSampler(BatchSampler): def _compute_aspect_ratios_slow(dataset, indices=None): - print("Your dataset doesn't support the fast path for " - "computing the aspect ratios, so will iterate over " - "the full dataset and load every image instead. " - "This might take some time...") + print( + "Your dataset doesn't support the fast path for " + "computing the aspect ratios, so will iterate over " + "the full dataset and load every image instead. " + "This might take some time..." + ) if indices is None: indices = range(len(dataset)) @@ -104,9 +102,12 @@ def _compute_aspect_ratios_slow(dataset, indices=None): sampler = SubsetSampler(indices) data_loader = torch.utils.data.DataLoader( - dataset, batch_size=1, sampler=sampler, + dataset, + batch_size=1, + sampler=sampler, num_workers=14, # you might want to increase it for faster processing - collate_fn=lambda x: x[0]) + collate_fn=lambda x: x[0], + ) aspect_ratios = [] with tqdm(total=len(dataset)) as pbar: for _i, (img, _) in enumerate(data_loader): @@ -190,6 +191,6 @@ def create_aspect_ratio_groups(dataset, k=0): # count number of elements per group counts = np.unique(groups, return_counts=True)[1] fbins = [0] + bins + [np.inf] - print("Using {} as bins for aspect ratio quantization".format(fbins)) - print("Count of instances per bin: {}".format(counts)) + print(f"Using {fbins} as bins for aspect ratio quantization") + print(f"Count of instances per bin: {counts}") return groups diff --git a/references/detection/presets.py b/references/detection/presets.py index 1fac69ae35690a5c286cafa8a35b6474ab0d3688..e9b6d56c8861263fbe70acc1f6e01bb56f172e2b 100644 --- a/references/detection/presets.py +++ b/references/detection/presets.py @@ -1,37 +1,114 @@ -import transforms as T +from collections import defaultdict + +import torch +import transforms as reference_transforms + + +def get_modules(use_v2): + # We need a protected import to avoid the V2 warning in case just V1 is used + if use_v2: + import torchvision.transforms.v2 + import torchvision.tv_tensors + + return torchvision.transforms.v2, torchvision.tv_tensors + else: + return reference_transforms, None class DetectionPresetTrain: - def __init__(self, data_augmentation, hflip_prob=0.5, mean=(123., 117., 104.)): - if data_augmentation == 'hflip': - self.transforms = T.Compose([ + # Note: this transform assumes that the input to forward() are always PIL + # images, regardless of the backend parameter. + def __init__( + self, + *, + data_augmentation, + hflip_prob=0.5, + mean=(123.0, 117.0, 104.0), + backend="pil", + use_v2=False, + ): + + T, tv_tensors = get_modules(use_v2) + + transforms = [] + backend = backend.lower() + if backend == "tv_tensor": + transforms.append(T.ToImage()) + elif backend == "tensor": + transforms.append(T.PILToTensor()) + elif backend != "pil": + raise ValueError(f"backend can be 'tv_tensor', 'tensor' or 'pil', but got {backend}") + + if data_augmentation == "hflip": + transforms += [T.RandomHorizontalFlip(p=hflip_prob)] + elif data_augmentation == "lsj": + transforms += [ + T.ScaleJitter(target_size=(1024, 1024), antialias=True), + # TODO: FixedSizeCrop below doesn't work on tensors! + reference_transforms.FixedSizeCrop(size=(1024, 1024), fill=mean), + T.RandomHorizontalFlip(p=hflip_prob), + ] + elif data_augmentation == "multiscale": + transforms += [ + T.RandomShortestSize(min_size=(480, 512, 544, 576, 608, 640, 672, 704, 736, 768, 800), max_size=1333), T.RandomHorizontalFlip(p=hflip_prob), - T.ToTensor(), - ]) - elif data_augmentation == 'ssd': - self.transforms = T.Compose([ + ] + elif data_augmentation == "ssd": + fill = defaultdict(lambda: mean, {tv_tensors.Mask: 0}) if use_v2 else list(mean) + transforms += [ T.RandomPhotometricDistort(), - T.RandomZoomOut(fill=list(mean)), + T.RandomZoomOut(fill=fill), T.RandomIoUCrop(), T.RandomHorizontalFlip(p=hflip_prob), - T.ToTensor(), - ]) - elif data_augmentation == 'ssdlite': - self.transforms = T.Compose([ + ] + elif data_augmentation == "ssdlite": + transforms += [ T.RandomIoUCrop(), T.RandomHorizontalFlip(p=hflip_prob), - T.ToTensor(), - ]) + ] else: raise ValueError(f'Unknown data augmentation policy "{data_augmentation}"') + if backend == "pil": + # Note: we could just convert to pure tensors even in v2. + transforms += [T.ToImage() if use_v2 else T.PILToTensor()] + + transforms += [T.ToDtype(torch.float, scale=True)] + + if use_v2: + transforms += [ + T.ConvertBoundingBoxFormat(tv_tensors.BoundingBoxFormat.XYXY), + T.SanitizeBoundingBoxes(), + T.ToPureTensor(), + ] + + self.transforms = T.Compose(transforms) + def __call__(self, img, target): return self.transforms(img, target) class DetectionPresetEval: - def __init__(self): - self.transforms = T.ToTensor() + def __init__(self, backend="pil", use_v2=False): + T, _ = get_modules(use_v2) + transforms = [] + backend = backend.lower() + if backend == "pil": + # Note: we could just convert to pure tensors even in v2? + transforms += [T.ToImage() if use_v2 else T.PILToTensor()] + elif backend == "tensor": + transforms += [T.PILToTensor()] + elif backend == "tv_tensor": + transforms += [T.ToImage()] + else: + raise ValueError(f"backend can be 'tv_tensor', 'tensor' or 'pil', but got {backend}") + + transforms += [T.ToDtype(torch.float, scale=True)] + + if use_v2: + transforms += [T.ToPureTensor()] + + self.transforms = T.Compose(transforms) def __call__(self, img, target): return self.transforms(img, target) diff --git a/references/detection/train.py b/references/detection/train.py index cd4148e9bf7852d66e074ba522c59e6bb630855b..6a9ffb0af4dfdde08b836b748d59057267868f44 100644 --- a/references/detection/train.py +++ b/references/detection/train.py @@ -21,74 +21,125 @@ import datetime import os import time +import presets import torch import torch.utils.data import torchvision import torchvision.models.detection import torchvision.models.detection.mask_rcnn - -from coco_utils import get_coco, get_coco_kp - -from group_by_aspect_ratio import GroupedBatchSampler, create_aspect_ratio_groups -from engine import train_one_epoch, evaluate - -import presets import utils - - -def get_dataset(name, image_set, transform, data_path): - paths = { - "coco": (data_path, get_coco, 91), - "coco_kp": (data_path, get_coco_kp, 2) - } - p, ds_fn, num_classes = paths[name] - - ds = ds_fn(p, image_set=image_set, transforms=transform) +from coco_utils import get_coco +from engine import evaluate, train_one_epoch +from group_by_aspect_ratio import create_aspect_ratio_groups, GroupedBatchSampler +from torchvision.transforms import InterpolationMode +from transforms import SimpleCopyPaste + + +def copypaste_collate_fn(batch): + copypaste = SimpleCopyPaste(blending=True, resize_interpolation=InterpolationMode.BILINEAR) + return copypaste(*utils.collate_fn(batch)) + + +def get_dataset(is_train, args): + image_set = "train" if is_train else "val" + num_classes, mode = {"coco": (91, "instances"), "coco_kp": (2, "person_keypoints")}[args.dataset] + with_masks = "mask" in args.model + ds = get_coco( + root=args.data_path, + image_set=image_set, + transforms=get_transform(is_train, args), + mode=mode, + use_v2=args.use_v2, + with_masks=with_masks, + ) return ds, num_classes -def get_transform(train, data_augmentation): - return presets.DetectionPresetTrain(data_augmentation) if train else presets.DetectionPresetEval() +def get_transform(is_train, args): + if is_train: + return presets.DetectionPresetTrain( + data_augmentation=args.data_augmentation, backend=args.backend, use_v2=args.use_v2 + ) + elif args.weights and args.test_only: + weights = torchvision.models.get_weight(args.weights) + trans = weights.transforms() + return lambda img, target: (trans(img), target) + else: + return presets.DetectionPresetEval(backend=args.backend, use_v2=args.use_v2) def get_args_parser(add_help=True): import argparse - parser = argparse.ArgumentParser(description='PyTorch Detection Training', add_help=add_help) - - parser.add_argument('--data-path', default='/datasets01/COCO/022719/', help='dataset') - parser.add_argument('--dataset', default='coco', help='dataset') - parser.add_argument('--model', default='maskrcnn_resnet50_fpn', help='model') - parser.add_argument('--device', default='cuda', help='device') - parser.add_argument('-b', '--batch-size', default=2, type=int, - help='images per gpu, the total batch size is $NGPU x batch_size') - parser.add_argument('--epochs', default=26, type=int, metavar='N', - help='number of total epochs to run') - parser.add_argument('-j', '--workers', default=4, type=int, metavar='N', - help='number of data loading workers (default: 4)') - parser.add_argument('--lr', default=0.02, type=float, - help='initial learning rate, 0.02 is the default value for training ' - 'on 8 gpus and 2 images_per_gpu') - parser.add_argument('--momentum', default=0.9, type=float, metavar='M', - help='momentum') - parser.add_argument('--wd', '--weight-decay', default=1e-4, type=float, - metavar='W', help='weight decay (default: 1e-4)', - dest='weight_decay') - parser.add_argument('--lr-scheduler', default="multisteplr", help='the lr scheduler (default: multisteplr)') - parser.add_argument('--lr-step-size', default=8, type=int, - help='decrease lr every step-size epochs (multisteplr scheduler only)') - parser.add_argument('--lr-steps', default=[16, 22], nargs='+', type=int, - help='decrease lr every step-size epochs (multisteplr scheduler only)') - parser.add_argument('--lr-gamma', default=0.1, type=float, - help='decrease lr by a factor of lr-gamma (multisteplr scheduler only)') - parser.add_argument('--print-freq', default=20, type=int, help='print frequency') - parser.add_argument('--output-dir', default='.', help='path where to save') - parser.add_argument('--resume', default='', help='resume from checkpoint') - parser.add_argument('--start_epoch', default=0, type=int, help='start epoch') - parser.add_argument('--aspect-ratio-group-factor', default=3, type=int) - parser.add_argument('--rpn-score-thresh', default=None, type=float, help='rpn score threshold for faster-rcnn') - parser.add_argument('--trainable-backbone-layers', default=None, type=int, - help='number of trainable layers of backbone') - parser.add_argument('--data-augmentation', default="hflip", help='data augmentation policy (default: hflip)') + + parser = argparse.ArgumentParser(description="PyTorch Detection Training", add_help=add_help) + + parser.add_argument("--data-path", default="/datasets01/COCO/022719/", type=str, help="dataset path") + parser.add_argument( + "--dataset", + default="coco", + type=str, + help="dataset name. Use coco for object detection and instance segmentation and coco_kp for Keypoint detection", + ) + parser.add_argument("--model", default="maskrcnn_resnet50_fpn", type=str, help="model name") + parser.add_argument("--device", default="cuda", type=str, help="device (Use cuda or cpu Default: cuda)") + parser.add_argument( + "-b", "--batch-size", default=2, type=int, help="images per gpu, the total batch size is $NGPU x batch_size" + ) + parser.add_argument("--epochs", default=26, type=int, metavar="N", help="number of total epochs to run") + parser.add_argument( + "-j", "--workers", default=4, type=int, metavar="N", help="number of data loading workers (default: 4)" + ) + parser.add_argument("--opt", default="sgd", type=str, help="optimizer") + parser.add_argument( + "--lr", + default=0.02, + type=float, + help="initial learning rate, 0.02 is the default value for training on 8 gpus and 2 images_per_gpu", + ) + parser.add_argument("--momentum", default=0.9, type=float, metavar="M", help="momentum") + parser.add_argument( + "--wd", + "--weight-decay", + default=1e-4, + type=float, + metavar="W", + help="weight decay (default: 1e-4)", + dest="weight_decay", + ) + parser.add_argument( + "--norm-weight-decay", + default=None, + type=float, + help="weight decay for Normalization layers (default: None, same value as --wd)", + ) + parser.add_argument( + "--lr-scheduler", default="multisteplr", type=str, help="name of lr scheduler (default: multisteplr)" + ) + parser.add_argument( + "--lr-step-size", default=8, type=int, help="decrease lr every step-size epochs (multisteplr scheduler only)" + ) + parser.add_argument( + "--lr-steps", + default=[16, 22], + nargs="+", + type=int, + help="decrease lr every step-size epochs (multisteplr scheduler only)", + ) + parser.add_argument( + "--lr-gamma", default=0.1, type=float, help="decrease lr by a factor of lr-gamma (multisteplr scheduler only)" + ) + parser.add_argument("--print-freq", default=20, type=int, help="print frequency") + parser.add_argument("--output-dir", default=".", type=str, help="path to save outputs") + parser.add_argument("--resume", default="", type=str, help="path of checkpoint") + parser.add_argument("--start_epoch", default=0, type=int, help="start epoch") + parser.add_argument("--aspect-ratio-group-factor", default=3, type=int) + parser.add_argument("--rpn-score-thresh", default=None, type=float, help="rpn score threshold for faster-rcnn") + parser.add_argument( + "--trainable-backbone-layers", default=None, type=int, help="number of trainable layers of backbone" + ) + parser.add_argument( + "--data-augmentation", default="hflip", type=str, help="data augmentation policy (default: hflip)" + ) parser.add_argument( "--sync-bn", dest="sync_bn", @@ -101,22 +152,43 @@ def get_args_parser(add_help=True): help="Only test the model", action="store_true", ) + parser.add_argument( - "--pretrained", - dest="pretrained", - help="Use pre-trained models from the modelzoo", - action="store_true", + "--use-deterministic-algorithms", action="store_true", help="Forces the use of deterministic algorithms only." ) # distributed training parameters - parser.add_argument('--world-size', default=1, type=int, - help='number of distributed processes') - parser.add_argument('--dist-url', default='env://', help='url used to set up distributed training') + parser.add_argument("--world-size", default=1, type=int, help="number of distributed processes") + parser.add_argument("--dist-url", default="env://", type=str, help="url used to set up distributed training") + parser.add_argument("--weights", default=None, type=str, help="the weights enum name to load") + parser.add_argument("--weights-backbone", default=None, type=str, help="the backbone weights enum name to load") + + # Mixed precision training parameters + parser.add_argument("--amp", action="store_true", help="Use torch.cuda.amp for mixed precision training") + + # Use CopyPaste augmentation training parameter + parser.add_argument( + "--use-copypaste", + action="store_true", + help="Use CopyPaste data augmentation. Works only with data-augmentation='lsj'.", + ) + + parser.add_argument("--backend", default="PIL", type=str.lower, help="PIL or tensor - case insensitive") + parser.add_argument("--use-v2", action="store_true", help="Use V2 transforms") return parser def main(args): + if args.backend.lower() == "tv_tensor" and not args.use_v2: + raise ValueError("Use --use-v2 if you want to use the tv_tensor backend.") + if args.dataset not in ("coco", "coco_kp"): + raise ValueError(f"Dataset should be coco or coco_kp, got {args.dataset}") + if "keypoint" in args.model and args.dataset != "coco_kp": + raise ValueError("Oops, if you want Keypoint detection, set --dataset coco_kp") + if args.dataset == "coco_kp" and args.use_v2: + raise ValueError("KeyPoint detection doesn't support V2 transforms yet") + if args.output_dir: utils.mkdir(args.output_dir) @@ -125,17 +197,19 @@ def main(args): device = torch.device(args.device) + if args.use_deterministic_algorithms: + torch.use_deterministic_algorithms(True) + # Data loading code print("Loading data") - dataset, num_classes = get_dataset(args.dataset, "train", get_transform(True, args.data_augmentation), - args.data_path) - dataset_test, _ = get_dataset(args.dataset, "val", get_transform(False, args.data_augmentation), args.data_path) + dataset, num_classes = get_dataset(is_train=True, args=args) + dataset_test, _ = get_dataset(is_train=False, args=args) print("Creating data loaders") if args.distributed: train_sampler = torch.utils.data.distributed.DistributedSampler(dataset) - test_sampler = torch.utils.data.distributed.DistributedSampler(dataset_test) + test_sampler = torch.utils.data.distributed.DistributedSampler(dataset_test, shuffle=False) else: train_sampler = torch.utils.data.RandomSampler(dataset) test_sampler = torch.utils.data.SequentialSampler(dataset_test) @@ -144,27 +218,33 @@ def main(args): group_ids = create_aspect_ratio_groups(dataset, k=args.aspect_ratio_group_factor) train_batch_sampler = GroupedBatchSampler(train_sampler, group_ids, args.batch_size) else: - train_batch_sampler = torch.utils.data.BatchSampler( - train_sampler, args.batch_size, drop_last=True) + train_batch_sampler = torch.utils.data.BatchSampler(train_sampler, args.batch_size, drop_last=True) + + train_collate_fn = utils.collate_fn + if args.use_copypaste: + if args.data_augmentation != "lsj": + raise RuntimeError("SimpleCopyPaste algorithm currently only supports the 'lsj' data augmentation policies") + + train_collate_fn = copypaste_collate_fn data_loader = torch.utils.data.DataLoader( - dataset, batch_sampler=train_batch_sampler, num_workers=args.workers, - collate_fn=utils.collate_fn) + dataset, batch_sampler=train_batch_sampler, num_workers=args.workers, collate_fn=train_collate_fn + ) data_loader_test = torch.utils.data.DataLoader( - dataset_test, batch_size=1, - sampler=test_sampler, num_workers=args.workers, - collate_fn=utils.collate_fn) + dataset_test, batch_size=1, sampler=test_sampler, num_workers=args.workers, collate_fn=utils.collate_fn + ) print("Creating model") - kwargs = { - "trainable_backbone_layers": args.trainable_backbone_layers - } + kwargs = {"trainable_backbone_layers": args.trainable_backbone_layers} + if args.data_augmentation in ["multiscale", "lsj"]: + kwargs["_skip_resize"] = True if "rcnn" in args.model: if args.rpn_score_thresh is not None: kwargs["rpn_score_thresh"] = args.rpn_score_thresh - model = torchvision.models.detection.__dict__[args.model](num_classes=num_classes, pretrained=args.pretrained, - **kwargs) + model = torchvision.models.get_model( + args.model, weights=args.weights, weights_backbone=args.weights_backbone, num_classes=num_classes, **kwargs + ) model.to(device) if args.distributed and args.sync_bn: model = torch.nn.SyncBatchNorm.convert_sync_batchnorm(model) @@ -174,27 +254,50 @@ def main(args): model = torch.nn.parallel.DistributedDataParallel(model, device_ids=[args.gpu]) model_without_ddp = model.module - params = [p for p in model.parameters() if p.requires_grad] - optimizer = torch.optim.SGD( - params, lr=args.lr, momentum=args.momentum, weight_decay=args.weight_decay) + if args.norm_weight_decay is None: + parameters = [p for p in model.parameters() if p.requires_grad] + else: + param_groups = torchvision.ops._utils.split_normalization_params(model) + wd_groups = [args.norm_weight_decay, args.weight_decay] + parameters = [{"params": p, "weight_decay": w} for p, w in zip(param_groups, wd_groups) if p] + + opt_name = args.opt.lower() + if opt_name.startswith("sgd"): + optimizer = torch.optim.SGD( + parameters, + lr=args.lr, + momentum=args.momentum, + weight_decay=args.weight_decay, + nesterov="nesterov" in opt_name, + ) + elif opt_name == "adamw": + optimizer = torch.optim.AdamW(parameters, lr=args.lr, weight_decay=args.weight_decay) + else: + raise RuntimeError(f"Invalid optimizer {args.opt}. Only SGD and AdamW are supported.") + + scaler = torch.cuda.amp.GradScaler() if args.amp else None args.lr_scheduler = args.lr_scheduler.lower() - if args.lr_scheduler == 'multisteplr': + if args.lr_scheduler == "multisteplr": lr_scheduler = torch.optim.lr_scheduler.MultiStepLR(optimizer, milestones=args.lr_steps, gamma=args.lr_gamma) - elif args.lr_scheduler == 'cosineannealinglr': + elif args.lr_scheduler == "cosineannealinglr": lr_scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=args.epochs) else: - raise RuntimeError("Invalid lr scheduler '{}'. Only MultiStepLR and CosineAnnealingLR " - "are supported.".format(args.lr_scheduler)) + raise RuntimeError( + f"Invalid lr scheduler '{args.lr_scheduler}'. Only MultiStepLR and CosineAnnealingLR are supported." + ) if args.resume: - checkpoint = torch.load(args.resume, map_location='cpu') - model_without_ddp.load_state_dict(checkpoint['model']) - optimizer.load_state_dict(checkpoint['optimizer']) - lr_scheduler.load_state_dict(checkpoint['lr_scheduler']) - args.start_epoch = checkpoint['epoch'] + 1 + checkpoint = torch.load(args.resume, map_location="cpu", weights_only=True) + model_without_ddp.load_state_dict(checkpoint["model"]) + optimizer.load_state_dict(checkpoint["optimizer"]) + lr_scheduler.load_state_dict(checkpoint["lr_scheduler"]) + args.start_epoch = checkpoint["epoch"] + 1 + if args.amp: + scaler.load_state_dict(checkpoint["scaler"]) if args.test_only: + torch.backends.cudnn.deterministic = True evaluate(model, data_loader_test, device=device) return @@ -203,29 +306,27 @@ def main(args): for epoch in range(args.start_epoch, args.epochs): if args.distributed: train_sampler.set_epoch(epoch) - train_one_epoch(model, optimizer, data_loader, device, epoch, args.print_freq) + train_one_epoch(model, optimizer, data_loader, device, epoch, args.print_freq, scaler) lr_scheduler.step() if args.output_dir: checkpoint = { - 'model': model_without_ddp.state_dict(), - 'optimizer': optimizer.state_dict(), - 'lr_scheduler': lr_scheduler.state_dict(), - 'args': args, - 'epoch': epoch + "model": model_without_ddp.state_dict(), + "optimizer": optimizer.state_dict(), + "lr_scheduler": lr_scheduler.state_dict(), + "args": args, + "epoch": epoch, } - utils.save_on_master( - checkpoint, - os.path.join(args.output_dir, 'model_{}.pth'.format(epoch))) - utils.save_on_master( - checkpoint, - os.path.join(args.output_dir, 'checkpoint.pth')) + if args.amp: + checkpoint["scaler"] = scaler.state_dict() + utils.save_on_master(checkpoint, os.path.join(args.output_dir, f"model_{epoch}.pth")) + utils.save_on_master(checkpoint, os.path.join(args.output_dir, "checkpoint.pth")) # evaluate after every epoch evaluate(model, data_loader_test, device=device) total_time = time.time() - start_time total_time_str = str(datetime.timedelta(seconds=int(total_time))) - print('Training time {}'.format(total_time_str)) + print(f"Training time {total_time_str}") if __name__ == "__main__": diff --git a/references/detection/transforms.py b/references/detection/transforms.py index 8e4b8870eaf0e4729337bf0303f3a6542565a4d2..e07ccfc992153960b5360b59f24b33585ec62130 100644 --- a/references/detection/transforms.py +++ b/references/detection/transforms.py @@ -1,10 +1,10 @@ +from typing import Dict, List, Optional, Tuple, Union + import torch import torchvision - from torch import nn, Tensor -from torchvision.transforms import functional as F -from torchvision.transforms import transforms as T -from typing import List, Tuple, Dict, Optional +from torchvision import ops +from torchvision.transforms import functional as F, InterpolationMode, transforms as T def _flip_coco_person_keypoints(kps, width): @@ -17,7 +17,7 @@ def _flip_coco_person_keypoints(kps, width): return flipped_data -class Compose(object): +class Compose: def __init__(self, transforms): self.transforms = transforms @@ -28,12 +28,13 @@ class Compose(object): class RandomHorizontalFlip(T.RandomHorizontalFlip): - def forward(self, image: Tensor, - target: Optional[Dict[str, Tensor]] = None) -> Tuple[Tensor, Optional[Dict[str, Tensor]]]: + def forward( + self, image: Tensor, target: Optional[Dict[str, Tensor]] = None + ) -> Tuple[Tensor, Optional[Dict[str, Tensor]]]: if torch.rand(1) < self.p: image = F.hflip(image) if target is not None: - width, _ = F._get_image_size(image) + _, _, width = F.get_dimensions(image) target["boxes"][:, [0, 2]] = width - target["boxes"][:, [2, 0]] if "masks" in target: target["masks"] = target["masks"].flip(-1) @@ -44,16 +45,39 @@ class RandomHorizontalFlip(T.RandomHorizontalFlip): return image, target -class ToTensor(nn.Module): - def forward(self, image: Tensor, - target: Optional[Dict[str, Tensor]] = None) -> Tuple[Tensor, Optional[Dict[str, Tensor]]]: - image = F.to_tensor(image) +class PILToTensor(nn.Module): + def forward( + self, image: Tensor, target: Optional[Dict[str, Tensor]] = None + ) -> Tuple[Tensor, Optional[Dict[str, Tensor]]]: + image = F.pil_to_tensor(image) + return image, target + + +class ToDtype(nn.Module): + def __init__(self, dtype: torch.dtype, scale: bool = False) -> None: + super().__init__() + self.dtype = dtype + self.scale = scale + + def forward( + self, image: Tensor, target: Optional[Dict[str, Tensor]] = None + ) -> Tuple[Tensor, Optional[Dict[str, Tensor]]]: + if not self.scale: + return image.to(dtype=self.dtype), target + image = F.convert_image_dtype(image, self.dtype) return image, target class RandomIoUCrop(nn.Module): - def __init__(self, min_scale: float = 0.3, max_scale: float = 1.0, min_aspect_ratio: float = 0.5, - max_aspect_ratio: float = 2.0, sampler_options: Optional[List[float]] = None, trials: int = 40): + def __init__( + self, + min_scale: float = 0.3, + max_scale: float = 1.0, + min_aspect_ratio: float = 0.5, + max_aspect_ratio: float = 2.0, + sampler_options: Optional[List[float]] = None, + trials: int = 40, + ): super().__init__() # Configuration similar to https://github.com/weiliu89/caffe/blob/ssd/examples/ssd/ssd_coco.py#L89-L174 self.min_scale = min_scale @@ -65,18 +89,19 @@ class RandomIoUCrop(nn.Module): self.options = sampler_options self.trials = trials - def forward(self, image: Tensor, - target: Optional[Dict[str, Tensor]] = None) -> Tuple[Tensor, Optional[Dict[str, Tensor]]]: + def forward( + self, image: Tensor, target: Optional[Dict[str, Tensor]] = None + ) -> Tuple[Tensor, Optional[Dict[str, Tensor]]]: if target is None: raise ValueError("The targets can't be None for this transform.") if isinstance(image, torch.Tensor): if image.ndimension() not in {2, 3}: - raise ValueError('image should be 2/3 dimensional. Got {} dimensions.'.format(image.ndimension())) + raise ValueError(f"image should be 2/3 dimensional. Got {image.ndimension()} dimensions.") elif image.ndimension() == 2: image = image.unsqueeze(0) - orig_w, orig_h = F._get_image_size(image) + _, orig_h, orig_w = F.get_dimensions(image) while True: # sample an option @@ -112,8 +137,9 @@ class RandomIoUCrop(nn.Module): # check at least 1 box with jaccard limitations boxes = target["boxes"][is_within_crop_area] - ious = torchvision.ops.boxes.box_iou(boxes, torch.tensor([[left, top, right, bottom]], - dtype=boxes.dtype, device=boxes.device)) + ious = torchvision.ops.boxes.box_iou( + boxes, torch.tensor([[left, top, right, bottom]], dtype=boxes.dtype, device=boxes.device) + ) if ious.max() < min_jaccard_overlap: continue @@ -130,14 +156,16 @@ class RandomIoUCrop(nn.Module): class RandomZoomOut(nn.Module): - def __init__(self, fill: Optional[List[float]] = None, side_range: Tuple[float, float] = (1., 4.), p: float = 0.5): + def __init__( + self, fill: Optional[List[float]] = None, side_range: Tuple[float, float] = (1.0, 4.0), p: float = 0.5 + ): super().__init__() if fill is None: - fill = [0., 0., 0.] + fill = [0.0, 0.0, 0.0] self.fill = fill self.side_range = side_range - if side_range[0] < 1. or side_range[0] > side_range[1]: - raise ValueError("Invalid canvas side range provided {}.".format(side_range)) + if side_range[0] < 1.0 or side_range[0] > side_range[1]: + raise ValueError(f"Invalid canvas side range provided {side_range}.") self.p = p @torch.jit.unused @@ -146,18 +174,19 @@ class RandomZoomOut(nn.Module): # We fake the type to make it work on JIT return tuple(int(x) for x in self.fill) if is_pil else 0 - def forward(self, image: Tensor, - target: Optional[Dict[str, Tensor]] = None) -> Tuple[Tensor, Optional[Dict[str, Tensor]]]: + def forward( + self, image: Tensor, target: Optional[Dict[str, Tensor]] = None + ) -> Tuple[Tensor, Optional[Dict[str, Tensor]]]: if isinstance(image, torch.Tensor): if image.ndimension() not in {2, 3}: - raise ValueError('image should be 2/3 dimensional. Got {} dimensions.'.format(image.ndimension())) + raise ValueError(f"image should be 2/3 dimensional. Got {image.ndimension()} dimensions.") elif image.ndimension() == 2: image = image.unsqueeze(0) - if torch.rand(1) < self.p: + if torch.rand(1) >= self.p: return image, target - orig_w, orig_h = F._get_image_size(image) + _, orig_h, orig_w = F.get_dimensions(image) r = self.side_range[0] + torch.rand(1) * (self.side_range[1] - self.side_range[0]) canvas_width = int(orig_w * r) @@ -176,9 +205,11 @@ class RandomZoomOut(nn.Module): image = F.pad(image, [left, top, right, bottom], fill=fill) if isinstance(image, torch.Tensor): + # PyTorch's pad supports only integers on fill. So we need to overwrite the colour v = torch.tensor(self.fill, device=image.device, dtype=image.dtype).view(-1, 1, 1) - image[..., :top, :] = image[..., :, :left] = image[..., (top + orig_h):, :] = \ - image[..., :, (left + orig_w):] = v + image[..., :top, :] = image[..., :, :left] = image[..., (top + orig_h) :, :] = image[ + ..., :, (left + orig_w) : + ] = v if target is not None: target["boxes"][:, 0::2] += left @@ -188,8 +219,14 @@ class RandomZoomOut(nn.Module): class RandomPhotometricDistort(nn.Module): - def __init__(self, contrast: Tuple[float] = (0.5, 1.5), saturation: Tuple[float] = (0.5, 1.5), - hue: Tuple[float] = (-0.05, 0.05), brightness: Tuple[float] = (0.875, 1.125), p: float = 0.5): + def __init__( + self, + contrast: Tuple[float, float] = (0.5, 1.5), + saturation: Tuple[float, float] = (0.5, 1.5), + hue: Tuple[float, float] = (-0.05, 0.05), + brightness: Tuple[float, float] = (0.875, 1.125), + p: float = 0.5, + ): super().__init__() self._brightness = T.ColorJitter(brightness=brightness) self._contrast = T.ColorJitter(contrast=contrast) @@ -197,11 +234,12 @@ class RandomPhotometricDistort(nn.Module): self._saturation = T.ColorJitter(saturation=saturation) self.p = p - def forward(self, image: Tensor, - target: Optional[Dict[str, Tensor]] = None) -> Tuple[Tensor, Optional[Dict[str, Tensor]]]: + def forward( + self, image: Tensor, target: Optional[Dict[str, Tensor]] = None + ) -> Tuple[Tensor, Optional[Dict[str, Tensor]]]: if isinstance(image, torch.Tensor): if image.ndimension() not in {2, 3}: - raise ValueError('image should be 2/3 dimensional. Got {} dimensions.'.format(image.ndimension())) + raise ValueError(f"image should be 2/3 dimensional. Got {image.ndimension()} dimensions.") elif image.ndimension() == 2: image = image.unsqueeze(0) @@ -226,14 +264,338 @@ class RandomPhotometricDistort(nn.Module): image = self._contrast(image) if r[6] < self.p: - channels = F._get_image_num_channels(image) + channels, _, _ = F.get_dimensions(image) permutation = torch.randperm(channels) is_pil = F._is_pil_image(image) if is_pil: - image = F.to_tensor(image) + image = F.pil_to_tensor(image) + image = F.convert_image_dtype(image) image = image[..., permutation, :, :] if is_pil: image = F.to_pil_image(image) return image, target + + +class ScaleJitter(nn.Module): + """Randomly resizes the image and its bounding boxes within the specified scale range. + The class implements the Scale Jitter augmentation as described in the paper + `"Simple Copy-Paste is a Strong Data Augmentation Method for Instance Segmentation" `_. + + Args: + target_size (tuple of ints): The target size for the transform provided in (height, weight) format. + scale_range (tuple of ints): scaling factor interval, e.g (a, b), then scale is randomly sampled from the + range a <= scale <= b. + interpolation (InterpolationMode): Desired interpolation enum defined by + :class:`torchvision.transforms.InterpolationMode`. Default is ``InterpolationMode.BILINEAR``. + """ + + def __init__( + self, + target_size: Tuple[int, int], + scale_range: Tuple[float, float] = (0.1, 2.0), + interpolation: InterpolationMode = InterpolationMode.BILINEAR, + antialias=True, + ): + super().__init__() + self.target_size = target_size + self.scale_range = scale_range + self.interpolation = interpolation + self.antialias = antialias + + def forward( + self, image: Tensor, target: Optional[Dict[str, Tensor]] = None + ) -> Tuple[Tensor, Optional[Dict[str, Tensor]]]: + if isinstance(image, torch.Tensor): + if image.ndimension() not in {2, 3}: + raise ValueError(f"image should be 2/3 dimensional. Got {image.ndimension()} dimensions.") + elif image.ndimension() == 2: + image = image.unsqueeze(0) + + _, orig_height, orig_width = F.get_dimensions(image) + + scale = self.scale_range[0] + torch.rand(1) * (self.scale_range[1] - self.scale_range[0]) + r = min(self.target_size[1] / orig_height, self.target_size[0] / orig_width) * scale + new_width = int(orig_width * r) + new_height = int(orig_height * r) + + image = F.resize(image, [new_height, new_width], interpolation=self.interpolation, antialias=self.antialias) + + if target is not None: + target["boxes"][:, 0::2] *= new_width / orig_width + target["boxes"][:, 1::2] *= new_height / orig_height + if "masks" in target: + target["masks"] = F.resize( + target["masks"], + [new_height, new_width], + interpolation=InterpolationMode.NEAREST, + antialias=self.antialias, + ) + + return image, target + + +class FixedSizeCrop(nn.Module): + def __init__(self, size, fill=0, padding_mode="constant"): + super().__init__() + size = tuple(T._setup_size(size, error_msg="Please provide only two dimensions (h, w) for size.")) + self.crop_height = size[0] + self.crop_width = size[1] + self.fill = fill # TODO: Fill is currently respected only on PIL. Apply tensor patch. + self.padding_mode = padding_mode + + def _pad(self, img, target, padding): + # Taken from the functional_tensor.py pad + if isinstance(padding, int): + pad_left = pad_right = pad_top = pad_bottom = padding + elif len(padding) == 1: + pad_left = pad_right = pad_top = pad_bottom = padding[0] + elif len(padding) == 2: + pad_left = pad_right = padding[0] + pad_top = pad_bottom = padding[1] + else: + pad_left = padding[0] + pad_top = padding[1] + pad_right = padding[2] + pad_bottom = padding[3] + + padding = [pad_left, pad_top, pad_right, pad_bottom] + img = F.pad(img, padding, self.fill, self.padding_mode) + if target is not None: + target["boxes"][:, 0::2] += pad_left + target["boxes"][:, 1::2] += pad_top + if "masks" in target: + target["masks"] = F.pad(target["masks"], padding, 0, "constant") + + return img, target + + def _crop(self, img, target, top, left, height, width): + img = F.crop(img, top, left, height, width) + if target is not None: + boxes = target["boxes"] + boxes[:, 0::2] -= left + boxes[:, 1::2] -= top + boxes[:, 0::2].clamp_(min=0, max=width) + boxes[:, 1::2].clamp_(min=0, max=height) + + is_valid = (boxes[:, 0] < boxes[:, 2]) & (boxes[:, 1] < boxes[:, 3]) + + target["boxes"] = boxes[is_valid] + target["labels"] = target["labels"][is_valid] + if "masks" in target: + target["masks"] = F.crop(target["masks"][is_valid], top, left, height, width) + + return img, target + + def forward(self, img, target=None): + _, height, width = F.get_dimensions(img) + new_height = min(height, self.crop_height) + new_width = min(width, self.crop_width) + + if new_height != height or new_width != width: + offset_height = max(height - self.crop_height, 0) + offset_width = max(width - self.crop_width, 0) + + r = torch.rand(1) + top = int(offset_height * r) + left = int(offset_width * r) + + img, target = self._crop(img, target, top, left, new_height, new_width) + + pad_bottom = max(self.crop_height - new_height, 0) + pad_right = max(self.crop_width - new_width, 0) + if pad_bottom != 0 or pad_right != 0: + img, target = self._pad(img, target, [0, 0, pad_right, pad_bottom]) + + return img, target + + +class RandomShortestSize(nn.Module): + def __init__( + self, + min_size: Union[List[int], Tuple[int], int], + max_size: int, + interpolation: InterpolationMode = InterpolationMode.BILINEAR, + ): + super().__init__() + self.min_size = [min_size] if isinstance(min_size, int) else list(min_size) + self.max_size = max_size + self.interpolation = interpolation + + def forward( + self, image: Tensor, target: Optional[Dict[str, Tensor]] = None + ) -> Tuple[Tensor, Optional[Dict[str, Tensor]]]: + _, orig_height, orig_width = F.get_dimensions(image) + + min_size = self.min_size[torch.randint(len(self.min_size), (1,)).item()] + r = min(min_size / min(orig_height, orig_width), self.max_size / max(orig_height, orig_width)) + + new_width = int(orig_width * r) + new_height = int(orig_height * r) + + image = F.resize(image, [new_height, new_width], interpolation=self.interpolation) + + if target is not None: + target["boxes"][:, 0::2] *= new_width / orig_width + target["boxes"][:, 1::2] *= new_height / orig_height + if "masks" in target: + target["masks"] = F.resize( + target["masks"], [new_height, new_width], interpolation=InterpolationMode.NEAREST + ) + + return image, target + + +def _copy_paste( + image: torch.Tensor, + target: Dict[str, Tensor], + paste_image: torch.Tensor, + paste_target: Dict[str, Tensor], + blending: bool = True, + resize_interpolation: F.InterpolationMode = F.InterpolationMode.BILINEAR, +) -> Tuple[torch.Tensor, Dict[str, Tensor]]: + + # Random paste targets selection: + num_masks = len(paste_target["masks"]) + + if num_masks < 1: + # Such degerante case with num_masks=0 can happen with LSJ + # Let's just return (image, target) + return image, target + + # We have to please torch script by explicitly specifying dtype as torch.long + random_selection = torch.randint(0, num_masks, (num_masks,), device=paste_image.device) + random_selection = torch.unique(random_selection).to(torch.long) + + paste_masks = paste_target["masks"][random_selection] + paste_boxes = paste_target["boxes"][random_selection] + paste_labels = paste_target["labels"][random_selection] + + masks = target["masks"] + + # We resize source and paste data if they have different sizes + # This is something we introduced here as originally the algorithm works + # on equal-sized data (for example, coming from LSJ data augmentations) + size1 = image.shape[-2:] + size2 = paste_image.shape[-2:] + if size1 != size2: + paste_image = F.resize(paste_image, size1, interpolation=resize_interpolation) + paste_masks = F.resize(paste_masks, size1, interpolation=F.InterpolationMode.NEAREST) + # resize bboxes: + ratios = torch.tensor((size1[1] / size2[1], size1[0] / size2[0]), device=paste_boxes.device) + paste_boxes = paste_boxes.view(-1, 2, 2).mul(ratios).view(paste_boxes.shape) + + paste_alpha_mask = paste_masks.sum(dim=0) > 0 + + if blending: + paste_alpha_mask = F.gaussian_blur( + paste_alpha_mask.unsqueeze(0), + kernel_size=(5, 5), + sigma=[ + 2.0, + ], + ) + + # Copy-paste images: + image = (image * (~paste_alpha_mask)) + (paste_image * paste_alpha_mask) + + # Copy-paste masks: + masks = masks * (~paste_alpha_mask) + non_all_zero_masks = masks.sum((-1, -2)) > 0 + masks = masks[non_all_zero_masks] + + # Do a shallow copy of the target dict + out_target = {k: v for k, v in target.items()} + + out_target["masks"] = torch.cat([masks, paste_masks]) + + # Copy-paste boxes and labels + boxes = ops.masks_to_boxes(masks) + out_target["boxes"] = torch.cat([boxes, paste_boxes]) + + labels = target["labels"][non_all_zero_masks] + out_target["labels"] = torch.cat([labels, paste_labels]) + + # Update additional optional keys: area and iscrowd if exist + if "area" in target: + out_target["area"] = out_target["masks"].sum((-1, -2)).to(torch.float32) + + if "iscrowd" in target and "iscrowd" in paste_target: + # target['iscrowd'] size can be differ from mask size (non_all_zero_masks) + # For example, if previous transforms geometrically modifies masks/boxes/labels but + # does not update "iscrowd" + if len(target["iscrowd"]) == len(non_all_zero_masks): + iscrowd = target["iscrowd"][non_all_zero_masks] + paste_iscrowd = paste_target["iscrowd"][random_selection] + out_target["iscrowd"] = torch.cat([iscrowd, paste_iscrowd]) + + # Check for degenerated boxes and remove them + boxes = out_target["boxes"] + degenerate_boxes = boxes[:, 2:] <= boxes[:, :2] + if degenerate_boxes.any(): + valid_targets = ~degenerate_boxes.any(dim=1) + + out_target["boxes"] = boxes[valid_targets] + out_target["masks"] = out_target["masks"][valid_targets] + out_target["labels"] = out_target["labels"][valid_targets] + + if "area" in out_target: + out_target["area"] = out_target["area"][valid_targets] + if "iscrowd" in out_target and len(out_target["iscrowd"]) == len(valid_targets): + out_target["iscrowd"] = out_target["iscrowd"][valid_targets] + + return image, out_target + + +class SimpleCopyPaste(torch.nn.Module): + def __init__(self, blending=True, resize_interpolation=F.InterpolationMode.BILINEAR): + super().__init__() + self.resize_interpolation = resize_interpolation + self.blending = blending + + def forward( + self, images: List[torch.Tensor], targets: List[Dict[str, Tensor]] + ) -> Tuple[List[torch.Tensor], List[Dict[str, Tensor]]]: + torch._assert( + isinstance(images, (list, tuple)) and all([isinstance(v, torch.Tensor) for v in images]), + "images should be a list of tensors", + ) + torch._assert( + isinstance(targets, (list, tuple)) and len(images) == len(targets), + "targets should be a list of the same size as images", + ) + for target in targets: + # Can not check for instance type dict with inside torch.jit.script + # torch._assert(isinstance(target, dict), "targets item should be a dict") + for k in ["masks", "boxes", "labels"]: + torch._assert(k in target, f"Key {k} should be present in targets") + torch._assert(isinstance(target[k], torch.Tensor), f"Value for the key {k} should be a tensor") + + # images = [t1, t2, ..., tN] + # Let's define paste_images as shifted list of input images + # paste_images = [t2, t3, ..., tN, t1] + # FYI: in TF they mix data on the dataset level + images_rolled = images[-1:] + images[:-1] + targets_rolled = targets[-1:] + targets[:-1] + + output_images: List[torch.Tensor] = [] + output_targets: List[Dict[str, Tensor]] = [] + + for image, target, paste_image, paste_target in zip(images, targets, images_rolled, targets_rolled): + output_image, output_data = _copy_paste( + image, + target, + paste_image, + paste_target, + blending=self.blending, + resize_interpolation=self.resize_interpolation, + ) + output_images.append(output_image) + output_targets.append(output_data) + + return output_images, output_targets + + def __repr__(self) -> str: + s = f"{self.__class__.__name__}(blending={self.blending}, resize_interpolation={self.resize_interpolation})" + return s diff --git a/references/detection/utils.py b/references/detection/utils.py index 3c52abb2167ae2bf0504e77740f17bb1cd7f487d..f73915580f7c70c64ce8bc26e73d18ef72f88e86 100644 --- a/references/detection/utils.py +++ b/references/detection/utils.py @@ -1,14 +1,14 @@ -from collections import defaultdict, deque import datetime import errno import os import time +from collections import defaultdict, deque import torch import torch.distributed as dist -class SmoothedValue(object): +class SmoothedValue: """Track a series of values and provide access to smoothed values over a window or the global series average. """ @@ -32,7 +32,7 @@ class SmoothedValue(object): """ if not is_dist_avail_and_initialized(): return - t = torch.tensor([self.count, self.total], dtype=torch.float64, device='cuda') + t = torch.tensor([self.count, self.total], dtype=torch.float64, device="cuda") dist.barrier() dist.all_reduce(t) t = t.tolist() @@ -63,11 +63,8 @@ class SmoothedValue(object): def __str__(self): return self.fmt.format( - median=self.median, - avg=self.avg, - global_avg=self.global_avg, - max=self.max, - value=self.value) + median=self.median, avg=self.avg, global_avg=self.global_avg, max=self.max, value=self.value + ) def all_gather(data): @@ -98,7 +95,7 @@ def reduce_dict(input_dict, average=True): world_size = get_world_size() if world_size < 2: return input_dict - with torch.no_grad(): + with torch.inference_mode(): names = [] values = [] # sort the keys so that they are consistent across processes @@ -113,7 +110,7 @@ def reduce_dict(input_dict, average=True): return reduced_dict -class MetricLogger(object): +class MetricLogger: def __init__(self, delimiter="\t"): self.meters = defaultdict(SmoothedValue) self.delimiter = delimiter @@ -130,15 +127,12 @@ class MetricLogger(object): return self.meters[attr] if attr in self.__dict__: return self.__dict__[attr] - raise AttributeError("'{}' object has no attribute '{}'".format( - type(self).__name__, attr)) + raise AttributeError(f"'{type(self).__name__}' object has no attribute '{attr}'") def __str__(self): loss_str = [] for name, meter in self.meters.items(): - loss_str.append( - "{}: {}".format(name, str(meter)) - ) + loss_str.append(f"{name}: {str(meter)}") return self.delimiter.join(loss_str) def synchronize_between_processes(self): @@ -151,31 +145,28 @@ class MetricLogger(object): def log_every(self, iterable, print_freq, header=None): i = 0 if not header: - header = '' + header = "" start_time = time.time() end = time.time() - iter_time = SmoothedValue(fmt='{avg:.4f}') - data_time = SmoothedValue(fmt='{avg:.4f}') - space_fmt = ':' + str(len(str(len(iterable)))) + 'd' + iter_time = SmoothedValue(fmt="{avg:.4f}") + data_time = SmoothedValue(fmt="{avg:.4f}") + space_fmt = ":" + str(len(str(len(iterable)))) + "d" if torch.cuda.is_available(): - log_msg = self.delimiter.join([ - header, - '[{0' + space_fmt + '}/{1}]', - 'eta: {eta}', - '{meters}', - 'time: {time}', - 'data: {data}', - 'max mem: {memory:.0f}' - ]) + log_msg = self.delimiter.join( + [ + header, + "[{0" + space_fmt + "}/{1}]", + "eta: {eta}", + "{meters}", + "time: {time}", + "data: {data}", + "max mem: {memory:.0f}", + ] + ) else: - log_msg = self.delimiter.join([ - header, - '[{0' + space_fmt + '}/{1}]', - 'eta: {eta}', - '{meters}', - 'time: {time}', - 'data: {data}' - ]) + log_msg = self.delimiter.join( + [header, "[{0" + space_fmt + "}/{1}]", "eta: {eta}", "{meters}", "time: {time}", "data: {data}"] + ) MB = 1024.0 * 1024.0 for obj in iterable: data_time.update(time.time() - end) @@ -185,39 +176,34 @@ class MetricLogger(object): eta_seconds = iter_time.global_avg * (len(iterable) - i) eta_string = str(datetime.timedelta(seconds=int(eta_seconds))) if torch.cuda.is_available(): - print(log_msg.format( - i, len(iterable), eta=eta_string, - meters=str(self), - time=str(iter_time), data=str(data_time), - memory=torch.cuda.max_memory_allocated() / MB)) + print( + log_msg.format( + i, + len(iterable), + eta=eta_string, + meters=str(self), + time=str(iter_time), + data=str(data_time), + memory=torch.cuda.max_memory_allocated() / MB, + ) + ) else: - print(log_msg.format( - i, len(iterable), eta=eta_string, - meters=str(self), - time=str(iter_time), data=str(data_time))) + print( + log_msg.format( + i, len(iterable), eta=eta_string, meters=str(self), time=str(iter_time), data=str(data_time) + ) + ) i += 1 end = time.time() total_time = time.time() - start_time total_time_str = str(datetime.timedelta(seconds=int(total_time))) - print('{} Total time: {} ({:.4f} s / it)'.format( - header, total_time_str, total_time / len(iterable))) + print(f"{header} Total time: {total_time_str} ({total_time / len(iterable):.4f} s / it)") def collate_fn(batch): return tuple(zip(*batch)) -def warmup_lr_scheduler(optimizer, warmup_iters, warmup_factor): - - def f(x): - if x >= warmup_iters: - return 1 - alpha = float(x) / warmup_iters - return warmup_factor * (1 - alpha) + alpha - - return torch.optim.lr_scheduler.LambdaLR(optimizer, f) - - def mkdir(path): try: os.makedirs(path) @@ -231,10 +217,11 @@ def setup_for_distributed(is_master): This function disables printing when not in master process """ import builtins as __builtin__ + builtin_print = __builtin__.print def print(*args, **kwargs): - force = kwargs.pop('force', False) + force = kwargs.pop("force", False) if is_master or force: builtin_print(*args, **kwargs) @@ -271,25 +258,25 @@ def save_on_master(*args, **kwargs): def init_distributed_mode(args): - if 'RANK' in os.environ and 'WORLD_SIZE' in os.environ: + if "RANK" in os.environ and "WORLD_SIZE" in os.environ: args.rank = int(os.environ["RANK"]) - args.world_size = int(os.environ['WORLD_SIZE']) - args.gpu = int(os.environ['LOCAL_RANK']) - elif 'SLURM_PROCID' in os.environ: - args.rank = int(os.environ['SLURM_PROCID']) + args.world_size = int(os.environ["WORLD_SIZE"]) + args.gpu = int(os.environ["LOCAL_RANK"]) + elif "SLURM_PROCID" in os.environ: + args.rank = int(os.environ["SLURM_PROCID"]) args.gpu = args.rank % torch.cuda.device_count() else: - print('Not using distributed mode') + print("Not using distributed mode") args.distributed = False return args.distributed = True torch.cuda.set_device(args.gpu) - args.dist_backend = 'nccl' - print('| distributed init (rank {}): {}'.format( - args.rank, args.dist_url), flush=True) - torch.distributed.init_process_group(backend=args.dist_backend, init_method=args.dist_url, - world_size=args.world_size, rank=args.rank) + args.dist_backend = "nccl" + print(f"| distributed init (rank {args.rank}): {args.dist_url}", flush=True) + torch.distributed.init_process_group( + backend=args.dist_backend, init_method=args.dist_url, world_size=args.world_size, rank=args.rank + ) torch.distributed.barrier() setup_for_distributed(args.rank == 0) diff --git a/references/optical_flow/README.md b/references/optical_flow/README.md new file mode 100644 index 0000000000000000000000000000000000000000..6ad1d4079f7629d92421accc9bcce2ee391afd9f --- /dev/null +++ b/references/optical_flow/README.md @@ -0,0 +1,72 @@ +# Optical flow reference training scripts + +This folder contains reference training scripts for optical flow. +They serve as a log of how to train specific models, so as to provide baseline +training and evaluation scripts to quickly bootstrap research. + + +### RAFT Large + +The RAFT large model was trained on Flying Chairs and then on Flying Things. +Both used 8 A100 GPUs and a batch size of 2 (so effective batch size is 16). The +rest of the hyper-parameters are exactly the same as the original RAFT training +recipe from https://github.com/princeton-vl/RAFT. The original recipe trains for +100000 updates (or steps) on each dataset - this corresponds to about 72 and 20 +epochs on Chairs and Things respectively: + +``` +num_epochs = ceil(num_steps / number_of_steps_per_epoch) + = ceil(num_steps / (num_samples / effective_batch_size)) +``` + +``` +torchrun --nproc_per_node 8 --nnodes 1 train.py \ + --dataset-root $dataset_root \ + --name $name_chairs \ + --model raft_large \ + --train-dataset chairs \ + --batch-size 2 \ + --lr 0.0004 \ + --weight-decay 0.0001 \ + --epochs 72 \ + --output-dir $chairs_dir +``` + +``` +torchrun --nproc_per_node 8 --nnodes 1 train.py \ + --dataset-root $dataset_root \ + --name $name_things \ + --model raft_large \ + --train-dataset things \ + --batch-size 2 \ + --lr 0.000125 \ + --weight-decay 0.0001 \ + --epochs 20 \ + --freeze-batch-norm \ + --output-dir $things_dir\ + --resume $chairs_dir/$name_chairs.pth +``` + + +### Evaluation + +``` +torchrun --nproc_per_node 1 --nnodes 1 train.py --val-dataset sintel --batch-size 1 --dataset-root $dataset_root --model raft_large --weights Raft_Large_Weights.C_T_SKHT_V2 +``` + +This should give an epe of about 1.3822 on the clean pass and 2.7161 on the +final pass of Sintel-train. Results may vary slightly depending on the batch +size and the number of GPUs. For the most accurate results use 1 GPU and +`--batch-size 1`: + +``` +Sintel val clean epe: 1.3822 1px: 0.9028 3px: 0.9573 5px: 0.9697 per_image_epe: 1.3822 f1: 4.0248 +Sintel val final epe: 2.7161 1px: 0.8528 3px: 0.9204 5px: 0.9392 per_image_epe: 2.7161 f1: 7.5964 +``` + +You can also evaluate on Kitti train: + +``` +torchrun --nproc_per_node 1 --nnodes 1 train.py --val-dataset kitti --batch-size 1 --dataset-root $dataset_root --model raft_large --weights Raft_Large_Weights.C_T_SKHT_V2 +Kitti val epe: 4.7968 1px: 0.6388 3px: 0.8197 5px: 0.8661 per_image_epe: 4.5118 f1: 16.0679 +``` diff --git a/references/optical_flow/presets.py b/references/optical_flow/presets.py new file mode 100644 index 0000000000000000000000000000000000000000..32d9542e692b2dbba3fc461655bc959083b8fa7e --- /dev/null +++ b/references/optical_flow/presets.py @@ -0,0 +1,65 @@ +import torch +import transforms as T + + +class OpticalFlowPresetEval(torch.nn.Module): + def __init__(self): + super().__init__() + + self.transforms = T.Compose( + [ + T.PILToTensor(), + T.ConvertImageDtype(torch.float32), + T.Normalize(mean=0.5, std=0.5), # map [0, 1] into [-1, 1] + T.ValidateModelInput(), + ] + ) + + def forward(self, img1, img2, flow, valid): + return self.transforms(img1, img2, flow, valid) + + +class OpticalFlowPresetTrain(torch.nn.Module): + def __init__( + self, + *, + # RandomResizeAndCrop params + crop_size, + min_scale=-0.2, + max_scale=0.5, + stretch_prob=0.8, + # AsymmetricColorJitter params + brightness=0.4, + contrast=0.4, + saturation=0.4, + hue=0.5 / 3.14, + # Random[H,V]Flip params + asymmetric_jitter_prob=0.2, + do_flip=True, + ): + super().__init__() + + transforms = [ + T.PILToTensor(), + T.AsymmetricColorJitter( + brightness=brightness, contrast=contrast, saturation=saturation, hue=hue, p=asymmetric_jitter_prob + ), + T.RandomResizeAndCrop( + crop_size=crop_size, min_scale=min_scale, max_scale=max_scale, stretch_prob=stretch_prob + ), + ] + + if do_flip: + transforms += [T.RandomHorizontalFlip(p=0.5), T.RandomVerticalFlip(p=0.1)] + + transforms += [ + T.ConvertImageDtype(torch.float32), + T.Normalize(mean=0.5, std=0.5), # map [0, 1] into [-1, 1] + T.RandomErasing(max_erase=2), + T.MakeValidFlowMask(), + T.ValidateModelInput(), + ] + self.transforms = T.Compose(transforms) + + def forward(self, img1, img2, flow, valid): + return self.transforms(img1, img2, flow, valid) diff --git a/references/optical_flow/train.py b/references/optical_flow/train.py new file mode 100644 index 0000000000000000000000000000000000000000..7012ea6f810125bf54c203d8ebd83e80999fd56a --- /dev/null +++ b/references/optical_flow/train.py @@ -0,0 +1,389 @@ +import argparse +import warnings +from math import ceil +from pathlib import Path + +import torch +import torchvision.models.optical_flow +import utils +from presets import OpticalFlowPresetEval, OpticalFlowPresetTrain +from torchvision.datasets import FlyingChairs, FlyingThings3D, HD1K, KittiFlow, Sintel + + +def get_train_dataset(stage, dataset_root): + if stage == "chairs": + transforms = OpticalFlowPresetTrain(crop_size=(368, 496), min_scale=0.1, max_scale=1.0, do_flip=True) + return FlyingChairs(root=dataset_root, split="train", transforms=transforms) + elif stage == "things": + transforms = OpticalFlowPresetTrain(crop_size=(400, 720), min_scale=-0.4, max_scale=0.8, do_flip=True) + return FlyingThings3D(root=dataset_root, split="train", pass_name="both", transforms=transforms) + elif stage == "sintel_SKH": # S + K + H as from paper + crop_size = (368, 768) + transforms = OpticalFlowPresetTrain(crop_size=crop_size, min_scale=-0.2, max_scale=0.6, do_flip=True) + + things_clean = FlyingThings3D(root=dataset_root, split="train", pass_name="clean", transforms=transforms) + sintel = Sintel(root=dataset_root, split="train", pass_name="both", transforms=transforms) + + kitti_transforms = OpticalFlowPresetTrain(crop_size=crop_size, min_scale=-0.3, max_scale=0.5, do_flip=True) + kitti = KittiFlow(root=dataset_root, split="train", transforms=kitti_transforms) + + hd1k_transforms = OpticalFlowPresetTrain(crop_size=crop_size, min_scale=-0.5, max_scale=0.2, do_flip=True) + hd1k = HD1K(root=dataset_root, split="train", transforms=hd1k_transforms) + + # As future improvement, we could probably be using a distributed sampler here + # The distribution is S(.71), T(.135), K(.135), H(.02) + return 100 * sintel + 200 * kitti + 5 * hd1k + things_clean + elif stage == "kitti": + transforms = OpticalFlowPresetTrain( + # resize and crop params + crop_size=(288, 960), + min_scale=-0.2, + max_scale=0.4, + stretch_prob=0, + # flip params + do_flip=False, + # jitter params + brightness=0.3, + contrast=0.3, + saturation=0.3, + hue=0.3 / 3.14, + asymmetric_jitter_prob=0, + ) + return KittiFlow(root=dataset_root, split="train", transforms=transforms) + else: + raise ValueError(f"Unknown stage {stage}") + + +@torch.no_grad() +def _evaluate(model, args, val_dataset, *, padder_mode, num_flow_updates=None, batch_size=None, header=None): + """Helper function to compute various metrics (epe, etc.) for a model on a given dataset. + + We process as many samples as possible with ddp, and process the rest on a single worker. + """ + batch_size = batch_size or args.batch_size + device = torch.device(args.device) + + model.eval() + + if args.distributed: + sampler = torch.utils.data.distributed.DistributedSampler(val_dataset, shuffle=False, drop_last=True) + else: + sampler = torch.utils.data.SequentialSampler(val_dataset) + + val_loader = torch.utils.data.DataLoader( + val_dataset, + sampler=sampler, + batch_size=batch_size, + pin_memory=True, + num_workers=args.workers, + ) + + num_flow_updates = num_flow_updates or args.num_flow_updates + + def inner_loop(blob): + if blob[0].dim() == 3: + # input is not batched, so we add an extra dim for consistency + blob = [x[None, :, :, :] if x is not None else None for x in blob] + + image1, image2, flow_gt = blob[:3] + valid_flow_mask = None if len(blob) == 3 else blob[-1] + + image1, image2 = image1.to(device), image2.to(device) + + padder = utils.InputPadder(image1.shape, mode=padder_mode) + image1, image2 = padder.pad(image1, image2) + + flow_predictions = model(image1, image2, num_flow_updates=num_flow_updates) + flow_pred = flow_predictions[-1] + flow_pred = padder.unpad(flow_pred).cpu() + + metrics, num_pixels_tot = utils.compute_metrics(flow_pred, flow_gt, valid_flow_mask) + + # We compute per-pixel epe (epe) and per-image epe (called f1-epe in RAFT paper). + # per-pixel epe: average epe of all pixels of all images + # per-image epe: average epe on each image independently, then average over images + for name in ("epe", "1px", "3px", "5px", "f1"): # f1 is called f1-all in paper + logger.meters[name].update(metrics[name], n=num_pixels_tot) + logger.meters["per_image_epe"].update(metrics["epe"], n=batch_size) + + logger = utils.MetricLogger() + for meter_name in ("epe", "1px", "3px", "5px", "per_image_epe", "f1"): + logger.add_meter(meter_name, fmt="{global_avg:.4f}") + + num_processed_samples = 0 + for blob in logger.log_every(val_loader, header=header, print_freq=None): + inner_loop(blob) + num_processed_samples += blob[0].shape[0] # batch size + + if args.distributed: + num_processed_samples = utils.reduce_across_processes(num_processed_samples) + print( + f"Batch-processed {num_processed_samples} / {len(val_dataset)} samples. " + "Going to process the remaining samples individually, if any." + ) + if args.rank == 0: # we only need to process the rest on a single worker + for i in range(num_processed_samples, len(val_dataset)): + inner_loop(val_dataset[i]) + + logger.synchronize_between_processes() + + print(header, logger) + + +def evaluate(model, args): + val_datasets = args.val_dataset or [] + + if args.weights and args.test_only: + weights = torchvision.models.get_weight(args.weights) + trans = weights.transforms() + + def preprocessing(img1, img2, flow, valid_flow_mask): + img1, img2 = trans(img1, img2) + if flow is not None and not isinstance(flow, torch.Tensor): + flow = torch.from_numpy(flow) + if valid_flow_mask is not None and not isinstance(valid_flow_mask, torch.Tensor): + valid_flow_mask = torch.from_numpy(valid_flow_mask) + return img1, img2, flow, valid_flow_mask + + else: + preprocessing = OpticalFlowPresetEval() + + for name in val_datasets: + if name == "kitti": + # Kitti has different image sizes, so we need to individually pad them, we can't batch. + # see comment in InputPadder + if args.batch_size != 1 and (not args.distributed or args.rank == 0): + warnings.warn( + f"Batch-size={args.batch_size} was passed. For technical reasons, evaluating on Kitti can only be done with a batch-size of 1." + ) + + val_dataset = KittiFlow(root=args.dataset_root, split="train", transforms=preprocessing) + _evaluate( + model, args, val_dataset, num_flow_updates=24, padder_mode="kitti", header="Kitti val", batch_size=1 + ) + elif name == "sintel": + for pass_name in ("clean", "final"): + val_dataset = Sintel( + root=args.dataset_root, split="train", pass_name=pass_name, transforms=preprocessing + ) + _evaluate( + model, + args, + val_dataset, + num_flow_updates=32, + padder_mode="sintel", + header=f"Sintel val {pass_name}", + ) + else: + warnings.warn(f"Can't validate on {val_dataset}, skipping.") + + +def train_one_epoch(model, optimizer, scheduler, train_loader, logger, args): + device = torch.device(args.device) + for data_blob in logger.log_every(train_loader): + + optimizer.zero_grad() + + image1, image2, flow_gt, valid_flow_mask = (x.to(device) for x in data_blob) + flow_predictions = model(image1, image2, num_flow_updates=args.num_flow_updates) + + loss = utils.sequence_loss(flow_predictions, flow_gt, valid_flow_mask, args.gamma) + metrics, _ = utils.compute_metrics(flow_predictions[-1], flow_gt, valid_flow_mask) + + metrics.pop("f1") + logger.update(loss=loss, **metrics) + + loss.backward() + + torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1) + + optimizer.step() + scheduler.step() + + +def main(args): + utils.setup_ddp(args) + args.test_only = args.train_dataset is None + + if args.distributed and args.device == "cpu": + raise ValueError("The device must be cuda if we want to run in distributed mode using torchrun") + device = torch.device(args.device) + + if args.use_deterministic_algorithms: + torch.backends.cudnn.benchmark = False + torch.use_deterministic_algorithms(True) + else: + torch.backends.cudnn.benchmark = True + + model = torchvision.models.get_model(args.model, weights=args.weights) + + if args.distributed: + model = model.to(args.local_rank) + model = torch.nn.parallel.DistributedDataParallel(model, device_ids=[args.local_rank]) + model_without_ddp = model.module + else: + model.to(device) + model_without_ddp = model + + if args.resume is not None: + checkpoint = torch.load(args.resume, map_location="cpu", weights_only=True) + model_without_ddp.load_state_dict(checkpoint["model"]) + + if args.test_only: + # Set deterministic CUDNN algorithms, since they can affect epe a fair bit. + torch.backends.cudnn.benchmark = False + torch.backends.cudnn.deterministic = True + evaluate(model, args) + return + + print(f"Parameter Count: {sum(p.numel() for p in model.parameters() if p.requires_grad)}") + + train_dataset = get_train_dataset(args.train_dataset, args.dataset_root) + + optimizer = torch.optim.AdamW(model.parameters(), lr=args.lr, weight_decay=args.weight_decay, eps=args.adamw_eps) + + scheduler = torch.optim.lr_scheduler.OneCycleLR( + optimizer=optimizer, + max_lr=args.lr, + epochs=args.epochs, + steps_per_epoch=ceil(len(train_dataset) / (args.world_size * args.batch_size)), + pct_start=0.05, + cycle_momentum=False, + anneal_strategy="linear", + ) + + if args.resume is not None: + optimizer.load_state_dict(checkpoint["optimizer"]) + scheduler.load_state_dict(checkpoint["scheduler"]) + args.start_epoch = checkpoint["epoch"] + 1 + else: + args.start_epoch = 0 + + torch.backends.cudnn.benchmark = True + + model.train() + if args.freeze_batch_norm: + utils.freeze_batch_norm(model.module) + + if args.distributed: + sampler = torch.utils.data.distributed.DistributedSampler(train_dataset, shuffle=True, drop_last=True) + else: + sampler = torch.utils.data.RandomSampler(train_dataset) + + train_loader = torch.utils.data.DataLoader( + train_dataset, + sampler=sampler, + batch_size=args.batch_size, + pin_memory=True, + num_workers=args.workers, + ) + + logger = utils.MetricLogger() + + done = False + for epoch in range(args.start_epoch, args.epochs): + print(f"EPOCH {epoch}") + if args.distributed: + # needed on distributed mode, otherwise the data loading order would be the same for all epochs + sampler.set_epoch(epoch) + + train_one_epoch( + model=model, + optimizer=optimizer, + scheduler=scheduler, + train_loader=train_loader, + logger=logger, + args=args, + ) + + # Note: we don't sync the SmoothedValues across processes, so the printed metrics are just those of rank 0 + print(f"Epoch {epoch} done. ", logger) + + if not args.distributed or args.rank == 0: + checkpoint = { + "model": model_without_ddp.state_dict(), + "optimizer": optimizer.state_dict(), + "scheduler": scheduler.state_dict(), + "epoch": epoch, + "args": args, + } + torch.save(checkpoint, Path(args.output_dir) / f"{args.name}_{epoch}.pth") + torch.save(checkpoint, Path(args.output_dir) / f"{args.name}.pth") + + if epoch % args.val_freq == 0 or done: + evaluate(model, args) + model.train() + if args.freeze_batch_norm: + utils.freeze_batch_norm(model.module) + + +def get_args_parser(add_help=True): + parser = argparse.ArgumentParser(add_help=add_help, description="Train or evaluate an optical-flow model.") + parser.add_argument( + "--name", + default="raft", + type=str, + help="The name of the experiment - determines the name of the files where weights are saved.", + ) + parser.add_argument("--output-dir", default=".", type=str, help="Output dir where checkpoints will be stored.") + parser.add_argument( + "--resume", + type=str, + help="A path to previously saved weights. Used to re-start training from, or evaluate a pre-saved model.", + ) + + parser.add_argument("--workers", type=int, default=12, help="Number of workers for the data loading part.") + + parser.add_argument( + "--train-dataset", + type=str, + help="The dataset to use for training. If not passed, only validation is performed (and you probably want to pass --resume).", + ) + parser.add_argument("--val-dataset", type=str, nargs="+", help="The dataset(s) to use for validation.") + parser.add_argument("--val-freq", type=int, default=2, help="Validate every X epochs") + parser.add_argument("--epochs", type=int, default=20, help="The total number of epochs to train.") + parser.add_argument("--batch-size", type=int, default=2) + + parser.add_argument("--lr", type=float, default=0.00002, help="Learning rate for AdamW optimizer") + parser.add_argument("--weight-decay", type=float, default=0.00005, help="Weight decay for AdamW optimizer") + parser.add_argument("--adamw-eps", type=float, default=1e-8, help="eps value for AdamW optimizer") + + parser.add_argument( + "--freeze-batch-norm", action="store_true", help="Set BatchNorm modules of the model in eval mode." + ) + + parser.add_argument( + "--model", type=str, default="raft_large", help="The name of the model to use - either raft_large or raft_small" + ) + # TODO: resume and weights should be in an exclusive arg group + + parser.add_argument( + "--num_flow_updates", + type=int, + default=12, + help="number of updates (or 'iters') in the update operator of the model.", + ) + + parser.add_argument("--gamma", type=float, default=0.8, help="exponential weighting for loss. Must be < 1.") + + parser.add_argument("--dist-url", default="env://", help="URL used to set up distributed training") + + parser.add_argument( + "--dataset-root", + help="Root folder where the datasets are stored. Will be passed as the 'root' parameter of the datasets.", + required=True, + ) + + parser.add_argument("--weights", default=None, type=str, help="the weights enum name to load.") + parser.add_argument("--device", default="cuda", type=str, help="device (Use cuda or cpu, Default: cuda)") + parser.add_argument( + "--use-deterministic-algorithms", action="store_true", help="Forces the use of deterministic algorithms only." + ) + + return parser + + +if __name__ == "__main__": + args = get_args_parser().parse_args() + Path(args.output_dir).mkdir(exist_ok=True) + main(args) diff --git a/references/optical_flow/transforms.py b/references/optical_flow/transforms.py new file mode 100644 index 0000000000000000000000000000000000000000..bc831a2ee52cb7ad1b87162c3035d134249ba633 --- /dev/null +++ b/references/optical_flow/transforms.py @@ -0,0 +1,271 @@ +import torch +import torchvision.transforms as T +import torchvision.transforms.functional as F + + +class ValidateModelInput(torch.nn.Module): + # Pass-through transform that checks the shape and dtypes to make sure the model gets what it expects + def forward(self, img1, img2, flow, valid_flow_mask): + + if not all(isinstance(arg, torch.Tensor) for arg in (img1, img2, flow, valid_flow_mask) if arg is not None): + raise TypeError("This method expects all input arguments to be of type torch.Tensor.") + if not all(arg.dtype == torch.float32 for arg in (img1, img2, flow) if arg is not None): + raise TypeError("This method expects the tensors img1, img2 and flow of be of dtype torch.float32.") + + if img1.shape != img2.shape: + raise ValueError("img1 and img2 should have the same shape.") + h, w = img1.shape[-2:] + if flow is not None and flow.shape != (2, h, w): + raise ValueError(f"flow.shape should be (2, {h}, {w}) instead of {flow.shape}") + if valid_flow_mask is not None: + if valid_flow_mask.shape != (h, w): + raise ValueError(f"valid_flow_mask.shape should be ({h}, {w}) instead of {valid_flow_mask.shape}") + if valid_flow_mask.dtype != torch.bool: + raise TypeError("valid_flow_mask should be of dtype torch.bool instead of {valid_flow_mask.dtype}") + + return img1, img2, flow, valid_flow_mask + + +class MakeValidFlowMask(torch.nn.Module): + # This transform generates a valid_flow_mask if it doesn't exist. + # The flow is considered valid if ||flow||_inf < threshold + # This is a noop for Kitti and HD1K which already come with a built-in flow mask. + def __init__(self, threshold=1000): + super().__init__() + self.threshold = threshold + + def forward(self, img1, img2, flow, valid_flow_mask): + if flow is not None and valid_flow_mask is None: + valid_flow_mask = (flow.abs() < self.threshold).all(axis=0) + return img1, img2, flow, valid_flow_mask + + +class ConvertImageDtype(torch.nn.Module): + def __init__(self, dtype): + super().__init__() + self.dtype = dtype + + def forward(self, img1, img2, flow, valid_flow_mask): + img1 = F.convert_image_dtype(img1, dtype=self.dtype) + img2 = F.convert_image_dtype(img2, dtype=self.dtype) + + img1 = img1.contiguous() + img2 = img2.contiguous() + + return img1, img2, flow, valid_flow_mask + + +class Normalize(torch.nn.Module): + def __init__(self, mean, std): + super().__init__() + self.mean = mean + self.std = std + + def forward(self, img1, img2, flow, valid_flow_mask): + img1 = F.normalize(img1, mean=self.mean, std=self.std) + img2 = F.normalize(img2, mean=self.mean, std=self.std) + + return img1, img2, flow, valid_flow_mask + + +class PILToTensor(torch.nn.Module): + # Converts all inputs to tensors + # Technically the flow and the valid mask are numpy arrays, not PIL images, but we keep that naming + # for consistency with the rest, e.g. the segmentation reference. + def forward(self, img1, img2, flow, valid_flow_mask): + img1 = F.pil_to_tensor(img1) + img2 = F.pil_to_tensor(img2) + if flow is not None: + flow = torch.from_numpy(flow) + if valid_flow_mask is not None: + valid_flow_mask = torch.from_numpy(valid_flow_mask) + + return img1, img2, flow, valid_flow_mask + + +class AsymmetricColorJitter(T.ColorJitter): + # p determines the proba of doing asymmertric vs symmetric color jittering + def __init__(self, brightness=0, contrast=0, saturation=0, hue=0, p=0.2): + super().__init__(brightness=brightness, contrast=contrast, saturation=saturation, hue=hue) + self.p = p + + def forward(self, img1, img2, flow, valid_flow_mask): + + if torch.rand(1) < self.p: + # asymmetric: different transform for img1 and img2 + img1 = super().forward(img1) + img2 = super().forward(img2) + else: + # symmetric: same transform for img1 and img2 + batch = torch.stack([img1, img2]) + batch = super().forward(batch) + img1, img2 = batch[0], batch[1] + + return img1, img2, flow, valid_flow_mask + + +class RandomErasing(T.RandomErasing): + # This only erases img2, and with an extra max_erase param + # This max_erase is needed because in the RAFT training ref does: + # 0 erasing with .5 proba + # 1 erase with .25 proba + # 2 erase with .25 proba + # and there's no accurate way to achieve this otherwise. + def __init__(self, p=0.5, scale=(0.02, 0.33), ratio=(0.3, 3.3), value=0, inplace=False, max_erase=1): + super().__init__(p=p, scale=scale, ratio=ratio, value=value, inplace=inplace) + self.max_erase = max_erase + if self.max_erase <= 0: + raise ValueError("max_raise should be greater than 0") + + def forward(self, img1, img2, flow, valid_flow_mask): + if torch.rand(1) > self.p: + return img1, img2, flow, valid_flow_mask + + for _ in range(torch.randint(self.max_erase, size=(1,)).item()): + x, y, h, w, v = self.get_params(img2, scale=self.scale, ratio=self.ratio, value=[self.value]) + img2 = F.erase(img2, x, y, h, w, v, self.inplace) + + return img1, img2, flow, valid_flow_mask + + +class RandomHorizontalFlip(T.RandomHorizontalFlip): + def forward(self, img1, img2, flow, valid_flow_mask): + if torch.rand(1) > self.p: + return img1, img2, flow, valid_flow_mask + + img1 = F.hflip(img1) + img2 = F.hflip(img2) + flow = F.hflip(flow) * torch.tensor([-1, 1])[:, None, None] + if valid_flow_mask is not None: + valid_flow_mask = F.hflip(valid_flow_mask) + return img1, img2, flow, valid_flow_mask + + +class RandomVerticalFlip(T.RandomVerticalFlip): + def forward(self, img1, img2, flow, valid_flow_mask): + if torch.rand(1) > self.p: + return img1, img2, flow, valid_flow_mask + + img1 = F.vflip(img1) + img2 = F.vflip(img2) + flow = F.vflip(flow) * torch.tensor([1, -1])[:, None, None] + if valid_flow_mask is not None: + valid_flow_mask = F.vflip(valid_flow_mask) + return img1, img2, flow, valid_flow_mask + + +class RandomResizeAndCrop(torch.nn.Module): + # This transform will resize the input with a given proba, and then crop it. + # These are the reversed operations of the built-in RandomResizedCrop, + # although the order of the operations doesn't matter too much: resizing a + # crop would give the same result as cropping a resized image, up to + # interpolation artifact at the borders of the output. + # + # The reason we don't rely on RandomResizedCrop is because of a significant + # difference in the parametrization of both transforms, in particular, + # because of the way the random parameters are sampled in both transforms, + # which leads to fairly different results (and different epe). For more details see + # https://github.com/pytorch/vision/pull/5026/files#r762932579 + def __init__(self, crop_size, min_scale=-0.2, max_scale=0.5, stretch_prob=0.8): + super().__init__() + self.crop_size = crop_size + self.min_scale = min_scale + self.max_scale = max_scale + self.stretch_prob = stretch_prob + self.resize_prob = 0.8 + self.max_stretch = 0.2 + + def forward(self, img1, img2, flow, valid_flow_mask): + # randomly sample scale + h, w = img1.shape[-2:] + # Note: in original code, they use + 1 instead of + 8 for sparse datasets (e.g. Kitti) + # It shouldn't matter much + min_scale = max((self.crop_size[0] + 8) / h, (self.crop_size[1] + 8) / w) + + scale = 2 ** torch.empty(1, dtype=torch.float32).uniform_(self.min_scale, self.max_scale).item() + scale_x = scale + scale_y = scale + if torch.rand(1) < self.stretch_prob: + scale_x *= 2 ** torch.empty(1, dtype=torch.float32).uniform_(-self.max_stretch, self.max_stretch).item() + scale_y *= 2 ** torch.empty(1, dtype=torch.float32).uniform_(-self.max_stretch, self.max_stretch).item() + + scale_x = max(scale_x, min_scale) + scale_y = max(scale_y, min_scale) + + new_h, new_w = round(h * scale_y), round(w * scale_x) + + if torch.rand(1).item() < self.resize_prob: + # rescale the images + # We hard-code antialias=False to preserve results after we changed + # its default from None to True (see + # https://github.com/pytorch/vision/pull/7160) + # TODO: we could re-train the OF models with antialias=True? + img1 = F.resize(img1, size=(new_h, new_w), antialias=False) + img2 = F.resize(img2, size=(new_h, new_w), antialias=False) + if valid_flow_mask is None: + flow = F.resize(flow, size=(new_h, new_w)) + flow = flow * torch.tensor([scale_x, scale_y])[:, None, None] + else: + flow, valid_flow_mask = self._resize_sparse_flow( + flow, valid_flow_mask, scale_x=scale_x, scale_y=scale_y + ) + + # Note: For sparse datasets (Kitti), the original code uses a "margin" + # See e.g. https://github.com/princeton-vl/RAFT/blob/master/core/utils/augmentor.py#L220:L220 + # We don't, not sure if it matters much + y0 = torch.randint(0, img1.shape[1] - self.crop_size[0], size=(1,)).item() + x0 = torch.randint(0, img1.shape[2] - self.crop_size[1], size=(1,)).item() + + img1 = F.crop(img1, y0, x0, self.crop_size[0], self.crop_size[1]) + img2 = F.crop(img2, y0, x0, self.crop_size[0], self.crop_size[1]) + flow = F.crop(flow, y0, x0, self.crop_size[0], self.crop_size[1]) + if valid_flow_mask is not None: + valid_flow_mask = F.crop(valid_flow_mask, y0, x0, self.crop_size[0], self.crop_size[1]) + + return img1, img2, flow, valid_flow_mask + + def _resize_sparse_flow(self, flow, valid_flow_mask, scale_x=1.0, scale_y=1.0): + # This resizes both the flow and the valid_flow_mask mask (which is assumed to be reasonably sparse) + # There are as-many non-zero values in the original flow as in the resized flow (up to OOB) + # So for example if scale_x = scale_y = 2, the sparsity of the output flow is multiplied by 4 + + h, w = flow.shape[-2:] + + h_new = int(round(h * scale_y)) + w_new = int(round(w * scale_x)) + flow_new = torch.zeros(size=[2, h_new, w_new], dtype=flow.dtype) + valid_new = torch.zeros(size=[h_new, w_new], dtype=valid_flow_mask.dtype) + + jj, ii = torch.meshgrid(torch.arange(w), torch.arange(h), indexing="xy") + + ii_valid, jj_valid = ii[valid_flow_mask], jj[valid_flow_mask] + + ii_valid_new = torch.round(ii_valid.to(float) * scale_y).to(torch.long) + jj_valid_new = torch.round(jj_valid.to(float) * scale_x).to(torch.long) + + within_bounds_mask = (0 <= ii_valid_new) & (ii_valid_new < h_new) & (0 <= jj_valid_new) & (jj_valid_new < w_new) + + ii_valid = ii_valid[within_bounds_mask] + jj_valid = jj_valid[within_bounds_mask] + ii_valid_new = ii_valid_new[within_bounds_mask] + jj_valid_new = jj_valid_new[within_bounds_mask] + + valid_flow_new = flow[:, ii_valid, jj_valid] + valid_flow_new[0] *= scale_x + valid_flow_new[1] *= scale_y + + flow_new[:, ii_valid_new, jj_valid_new] = valid_flow_new + valid_new[ii_valid_new, jj_valid_new] = 1 + + return flow_new, valid_new + + +class Compose(torch.nn.Module): + def __init__(self, transforms): + super().__init__() + self.transforms = transforms + + def forward(self, img1, img2, flow, valid_flow_mask): + for t in self.transforms: + img1, img2, flow, valid_flow_mask = t(img1, img2, flow, valid_flow_mask) + return img1, img2, flow, valid_flow_mask diff --git a/references/optical_flow/utils.py b/references/optical_flow/utils.py new file mode 100644 index 0000000000000000000000000000000000000000..cd4b16eb0d8c9ed773d284e8702e6d87e687733f --- /dev/null +++ b/references/optical_flow/utils.py @@ -0,0 +1,290 @@ +import datetime +import os +import time +from collections import defaultdict, deque + +import torch +import torch.distributed as dist +import torch.nn.functional as F + + +class SmoothedValue: + """Track a series of values and provide access to smoothed values over a + window or the global series average. + """ + + def __init__(self, window_size=20, fmt="{median:.4f} ({global_avg:.4f})"): + self.deque = deque(maxlen=window_size) + self.total = 0.0 + self.count = 0 + self.fmt = fmt + + def update(self, value, n=1): + self.deque.append(value) + self.count += n + self.total += value * n + + def synchronize_between_processes(self): + """ + Warning: does not synchronize the deque! + """ + t = reduce_across_processes([self.count, self.total]) + t = t.tolist() + self.count = int(t[0]) + self.total = t[1] + + @property + def median(self): + d = torch.tensor(list(self.deque)) + return d.median().item() + + @property + def avg(self): + d = torch.tensor(list(self.deque), dtype=torch.float32) + return d.mean().item() + + @property + def global_avg(self): + return self.total / self.count + + @property + def max(self): + return max(self.deque) + + @property + def value(self): + return self.deque[-1] + + def __str__(self): + return self.fmt.format( + median=self.median, avg=self.avg, global_avg=self.global_avg, max=self.max, value=self.value + ) + + +class MetricLogger: + def __init__(self, delimiter="\t"): + self.meters = defaultdict(SmoothedValue) + self.delimiter = delimiter + + def update(self, **kwargs): + for k, v in kwargs.items(): + if isinstance(v, torch.Tensor): + v = v.item() + if not isinstance(v, (float, int)): + raise TypeError( + f"This method expects the value of the input arguments to be of type float or int, instead got {type(v)}" + ) + self.meters[k].update(v) + + def __getattr__(self, attr): + if attr in self.meters: + return self.meters[attr] + if attr in self.__dict__: + return self.__dict__[attr] + raise AttributeError(f"'{type(self).__name__}' object has no attribute '{attr}'") + + def __str__(self): + loss_str = [] + for name, meter in self.meters.items(): + loss_str.append(f"{name}: {str(meter)}") + return self.delimiter.join(loss_str) + + def synchronize_between_processes(self): + for meter in self.meters.values(): + meter.synchronize_between_processes() + + def add_meter(self, name, **kwargs): + self.meters[name] = SmoothedValue(**kwargs) + + def log_every(self, iterable, print_freq=5, header=None): + i = 0 + if not header: + header = "" + start_time = time.time() + end = time.time() + iter_time = SmoothedValue(fmt="{avg:.4f}") + data_time = SmoothedValue(fmt="{avg:.4f}") + space_fmt = ":" + str(len(str(len(iterable)))) + "d" + if torch.cuda.is_available(): + log_msg = self.delimiter.join( + [ + header, + "[{0" + space_fmt + "}/{1}]", + "eta: {eta}", + "{meters}", + "time: {time}", + "data: {data}", + "max mem: {memory:.0f}", + ] + ) + else: + log_msg = self.delimiter.join( + [header, "[{0" + space_fmt + "}/{1}]", "eta: {eta}", "{meters}", "time: {time}", "data: {data}"] + ) + MB = 1024.0 * 1024.0 + for obj in iterable: + data_time.update(time.time() - end) + yield obj + iter_time.update(time.time() - end) + if print_freq is not None and i % print_freq == 0: + eta_seconds = iter_time.global_avg * (len(iterable) - i) + eta_string = str(datetime.timedelta(seconds=int(eta_seconds))) + if torch.cuda.is_available(): + print( + log_msg.format( + i, + len(iterable), + eta=eta_string, + meters=str(self), + time=str(iter_time), + data=str(data_time), + memory=torch.cuda.max_memory_allocated() / MB, + ) + ) + else: + print( + log_msg.format( + i, len(iterable), eta=eta_string, meters=str(self), time=str(iter_time), data=str(data_time) + ) + ) + i += 1 + end = time.time() + total_time = time.time() - start_time + total_time_str = str(datetime.timedelta(seconds=int(total_time))) + print(f"{header} Total time: {total_time_str}") + + +def compute_metrics(flow_pred, flow_gt, valid_flow_mask=None): + + epe = ((flow_pred - flow_gt) ** 2).sum(dim=1).sqrt() + flow_norm = (flow_gt**2).sum(dim=1).sqrt() + + if valid_flow_mask is not None: + epe = epe[valid_flow_mask] + flow_norm = flow_norm[valid_flow_mask] + + relative_epe = epe / flow_norm + + metrics = { + "epe": epe.mean().item(), + "1px": (epe < 1).float().mean().item(), + "3px": (epe < 3).float().mean().item(), + "5px": (epe < 5).float().mean().item(), + "f1": ((epe > 3) & (relative_epe > 0.05)).float().mean().item() * 100, + } + return metrics, epe.numel() + + +def sequence_loss(flow_preds, flow_gt, valid_flow_mask, gamma=0.8, max_flow=400): + """Loss function defined over sequence of flow predictions""" + + if gamma > 1: + raise ValueError(f"Gamma should be < 1, got {gamma}.") + + # exclude invalid pixels and extremely large diplacements + flow_norm = torch.sum(flow_gt**2, dim=1).sqrt() + valid_flow_mask = valid_flow_mask & (flow_norm < max_flow) + + valid_flow_mask = valid_flow_mask[:, None, :, :] + + flow_preds = torch.stack(flow_preds) # shape = (num_flow_updates, batch_size, 2, H, W) + + abs_diff = (flow_preds - flow_gt).abs() + abs_diff = (abs_diff * valid_flow_mask).mean(axis=(1, 2, 3, 4)) + + num_predictions = flow_preds.shape[0] + weights = gamma ** torch.arange(num_predictions - 1, -1, -1).to(flow_gt.device) + flow_loss = (abs_diff * weights).sum() + + return flow_loss + + +class InputPadder: + """Pads images such that dimensions are divisible by 8""" + + # TODO: Ideally, this should be part of the eval transforms preset, instead + # of being part of the validation code. It's not obvious what a good + # solution would be, because we need to unpad the predicted flows according + # to the input images' size, and in some datasets (Kitti) images can have + # variable sizes. + + def __init__(self, dims, mode="sintel"): + self.ht, self.wd = dims[-2:] + pad_ht = (((self.ht // 8) + 1) * 8 - self.ht) % 8 + pad_wd = (((self.wd // 8) + 1) * 8 - self.wd) % 8 + if mode == "sintel": + self._pad = [pad_wd // 2, pad_wd - pad_wd // 2, pad_ht // 2, pad_ht - pad_ht // 2] + else: + self._pad = [pad_wd // 2, pad_wd - pad_wd // 2, 0, pad_ht] + + def pad(self, *inputs): + return [F.pad(x, self._pad, mode="replicate") for x in inputs] + + def unpad(self, x): + ht, wd = x.shape[-2:] + c = [self._pad[2], ht - self._pad[3], self._pad[0], wd - self._pad[1]] + return x[..., c[0] : c[1], c[2] : c[3]] + + +def _redefine_print(is_main): + """disables printing when not in main process""" + import builtins as __builtin__ + + builtin_print = __builtin__.print + + def print(*args, **kwargs): + force = kwargs.pop("force", False) + if is_main or force: + builtin_print(*args, **kwargs) + + __builtin__.print = print + + +def setup_ddp(args): + # Set the local_rank, rank, and world_size values as args fields + # This is done differently depending on how we're running the script. We + # currently support either torchrun or the custom run_with_submitit.py + # If you're confused (like I was), this might help a bit + # https://discuss.pytorch.org/t/what-is-the-difference-between-rank-and-local-rank/61940/2 + + if all(key in os.environ for key in ("LOCAL_RANK", "RANK", "WORLD_SIZE")): + # if we're here, the script was called with torchrun. Otherwise, + # these args will be set already by the run_with_submitit script + args.local_rank = int(os.environ["LOCAL_RANK"]) + args.rank = int(os.environ["RANK"]) + args.world_size = int(os.environ["WORLD_SIZE"]) + + elif "gpu" in args: + # if we're here, the script was called by run_with_submitit.py + args.local_rank = args.gpu + else: + print("Not using distributed mode!") + args.distributed = False + args.world_size = 1 + return + + args.distributed = True + + _redefine_print(is_main=(args.rank == 0)) + + torch.cuda.set_device(args.local_rank) + dist.init_process_group( + backend="nccl", + rank=args.rank, + world_size=args.world_size, + init_method=args.dist_url, + ) + torch.distributed.barrier() + + +def reduce_across_processes(val): + t = torch.tensor(val, device="cuda") + dist.barrier() + dist.all_reduce(t) + return t + + +def freeze_batch_norm(model): + for m in model.modules(): + if isinstance(m, torch.nn.BatchNorm2d): + m.eval() diff --git a/references/segmentation/README.md b/references/segmentation/README.md index 6e24f8366245325feb588d0cb8d6ceee9cb6a2a7..2c8e581dac17c3a4b07a600b9130cd1f4be8b277 100644 --- a/references/segmentation/README.md +++ b/references/segmentation/README.md @@ -1,7 +1,7 @@ # Semantic segmentation reference training scripts This folder contains reference training scripts for semantic segmentation. -They serve as a log of how to train specific models, as provide baseline +They serve as a log of how to train specific models and provide baseline training and evaluation scripts to quickly bootstrap research. All models have been trained on 8x V100 GPUs. @@ -14,30 +14,30 @@ You must modify the following flags: ## fcn_resnet50 ``` -python -m torch.distributed.launch --nproc_per_node=8 --use_env train.py --lr 0.02 --dataset coco -b 4 --model fcn_resnet50 --aux-loss +torchrun --nproc_per_node=8 train.py --lr 0.02 --dataset coco -b 4 --model fcn_resnet50 --aux-loss --weights-backbone ResNet50_Weights.IMAGENET1K_V1 ``` ## fcn_resnet101 ``` -python -m torch.distributed.launch --nproc_per_node=8 --use_env train.py --lr 0.02 --dataset coco -b 4 --model fcn_resnet101 --aux-loss +torchrun --nproc_per_node=8 train.py --lr 0.02 --dataset coco -b 4 --model fcn_resnet101 --aux-loss --weights-backbone ResNet101_Weights.IMAGENET1K_V1 ``` ## deeplabv3_resnet50 ``` -python -m torch.distributed.launch --nproc_per_node=8 --use_env train.py --lr 0.02 --dataset coco -b 4 --model deeplabv3_resnet50 --aux-loss +torchrun --nproc_per_node=8 train.py --lr 0.02 --dataset coco -b 4 --model deeplabv3_resnet50 --aux-loss --weights-backbone ResNet50_Weights.IMAGENET1K_V1 ``` ## deeplabv3_resnet101 ``` -python -m torch.distributed.launch --nproc_per_node=8 --use_env train.py --lr 0.02 --dataset coco -b 4 --model deeplabv3_resnet101 --aux-loss +torchrun --nproc_per_node=8 train.py --lr 0.02 --dataset coco -b 4 --model deeplabv3_resnet101 --aux-loss --weights-backbone ResNet101_Weights.IMAGENET1K_V1 ``` ## deeplabv3_mobilenet_v3_large ``` -python -m torch.distributed.launch --nproc_per_node=8 --use_env train.py --dataset coco -b 4 --model deeplabv3_mobilenet_v3_large --aux-loss --wd 0.000001 +torchrun --nproc_per_node=8 train.py --dataset coco -b 4 --model deeplabv3_mobilenet_v3_large --aux-loss --wd 0.000001 --weights-backbone MobileNet_V3_Large_Weights.IMAGENET1K_V1 ``` ## lraspp_mobilenet_v3_large ``` -python -m torch.distributed.launch --nproc_per_node=8 --use_env train.py --dataset coco -b 4 --model lraspp_mobilenet_v3_large --wd 0.000001 +torchrun --nproc_per_node=8 train.py --dataset coco -b 4 --model lraspp_mobilenet_v3_large --wd 0.000001 --weights-backbone MobileNet_V3_Large_Weights.IMAGENET1K_V1 ``` diff --git a/references/segmentation/coco_utils.py b/references/segmentation/coco_utils.py index c86d5495247629685f9c1d172f511abfb6aa1767..6a15dbefb526c1b01085ed05de0452b5e24d7c30 100644 --- a/references/segmentation/coco_utils.py +++ b/references/segmentation/coco_utils.py @@ -1,17 +1,15 @@ import copy +import os + import torch import torch.utils.data import torchvision from PIL import Image - -import os - from pycocotools import mask as coco_mask - from transforms import Compose -class FilterAndRemapCocoCategories(object): +class FilterAndRemapCocoCategories: def __init__(self, categories, remap=True): self.categories = categories self.remap = remap @@ -43,7 +41,7 @@ def convert_coco_poly_to_mask(segmentations, height, width): return masks -class ConvertCocoPolysToMask(object): +class ConvertCocoPolysToMask: def __call__(self, image, anno): w, h = image.size segmentations = [obj["segmentation"] for obj in anno] @@ -70,7 +68,6 @@ def _coco_remove_images_without_annotations(dataset, cat_list=None): # if more than 1k pixels occupied in the image return sum(obj["area"] for obj in anno) > 1000 - assert isinstance(dataset, torchvision.datasets.CocoDetection) ids = [] for ds_idx, img_id in enumerate(dataset.ids): ann_ids = dataset.coco.getAnnIds(imgIds=img_id, iscrowd=None) @@ -84,26 +81,32 @@ def _coco_remove_images_without_annotations(dataset, cat_list=None): return dataset -def get_coco(root, image_set, transforms): +def get_coco(root, image_set, transforms, use_v2=False): PATHS = { "train": ("train2017", os.path.join("annotations", "instances_train2017.json")), "val": ("val2017", os.path.join("annotations", "instances_val2017.json")), # "train": ("val2017", os.path.join("annotations", "instances_val2017.json")) } - CAT_LIST = [0, 5, 2, 16, 9, 44, 6, 3, 17, 62, 21, 67, 18, 19, 4, - 1, 64, 20, 63, 7, 72] - - transforms = Compose([ - FilterAndRemapCocoCategories(CAT_LIST, remap=True), - ConvertCocoPolysToMask(), - transforms - ]) + CAT_LIST = [0, 5, 2, 16, 9, 44, 6, 3, 17, 62, 21, 67, 18, 19, 4, 1, 64, 20, 63, 7, 72] img_folder, ann_file = PATHS[image_set] img_folder = os.path.join(root, img_folder) ann_file = os.path.join(root, ann_file) - dataset = torchvision.datasets.CocoDetection(img_folder, ann_file, transforms=transforms) + # The 2 "Compose" below achieve the same thing: converting coco detection + # samples into segmentation-compatible samples. They just do it with + # slightly different implementations. We could refactor and unify, but + # keeping them separate helps keeping the v2 version clean + if use_v2: + import v2_extras + from torchvision.datasets import wrap_dataset_for_transforms_v2 + + transforms = Compose([v2_extras.CocoDetectionToVOCSegmentation(), transforms]) + dataset = torchvision.datasets.CocoDetection(img_folder, ann_file, transforms=transforms) + dataset = wrap_dataset_for_transforms_v2(dataset, target_keys={"masks", "labels"}) + else: + transforms = Compose([FilterAndRemapCocoCategories(CAT_LIST, remap=True), ConvertCocoPolysToMask(), transforms]) + dataset = torchvision.datasets.CocoDetection(img_folder, ann_file, transforms=transforms) if image_set == "train": dataset = _coco_remove_images_without_annotations(dataset, CAT_LIST) diff --git a/references/segmentation/presets.py b/references/segmentation/presets.py index 3bf29c237519328028f58de4f2679935e7c2c1f1..803769fcafce82d15f25637e67918dfa0f2d003b 100644 --- a/references/segmentation/presets.py +++ b/references/segmentation/presets.py @@ -1,32 +1,109 @@ -import transforms as T +import torch + + +def get_modules(use_v2): + # We need a protected import to avoid the V2 warning in case just V1 is used + if use_v2: + import torchvision.transforms.v2 + import torchvision.tv_tensors + import v2_extras + + return torchvision.transforms.v2, torchvision.tv_tensors, v2_extras + else: + import transforms + + return transforms, None, None class SegmentationPresetTrain: - def __init__(self, base_size, crop_size, hflip_prob=0.5, mean=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225)): - min_size = int(0.5 * base_size) - max_size = int(2.0 * base_size) + def __init__( + self, + *, + base_size, + crop_size, + hflip_prob=0.5, + mean=(0.485, 0.456, 0.406), + std=(0.229, 0.224, 0.225), + backend="pil", + use_v2=False, + ): + T, tv_tensors, v2_extras = get_modules(use_v2) + + transforms = [] + backend = backend.lower() + if backend == "tv_tensor": + transforms.append(T.ToImage()) + elif backend == "tensor": + transforms.append(T.PILToTensor()) + elif backend != "pil": + raise ValueError(f"backend can be 'tv_tensor', 'tensor' or 'pil', but got {backend}") + + transforms += [T.RandomResize(min_size=int(0.5 * base_size), max_size=int(2.0 * base_size))] - trans = [T.RandomResize(min_size, max_size)] if hflip_prob > 0: - trans.append(T.RandomHorizontalFlip(hflip_prob)) - trans.extend([ - T.RandomCrop(crop_size), - T.ToTensor(), - T.Normalize(mean=mean, std=std), - ]) - self.transforms = T.Compose(trans) + transforms += [T.RandomHorizontalFlip(hflip_prob)] + + if use_v2: + # We need a custom pad transform here, since the padding we want to perform here is fundamentally + # different from the padding in `RandomCrop` if `pad_if_needed=True`. + transforms += [v2_extras.PadIfSmaller(crop_size, fill={tv_tensors.Mask: 255, "others": 0})] + + transforms += [T.RandomCrop(crop_size)] + + if backend == "pil": + transforms += [T.PILToTensor()] + + if use_v2: + img_type = tv_tensors.Image if backend == "tv_tensor" else torch.Tensor + transforms += [ + T.ToDtype(dtype={img_type: torch.float32, tv_tensors.Mask: torch.int64, "others": None}, scale=True) + ] + else: + # No need to explicitly convert masks as they're magically int64 already + transforms += [T.ToDtype(torch.float, scale=True)] + + transforms += [T.Normalize(mean=mean, std=std)] + if use_v2: + transforms += [T.ToPureTensor()] + + self.transforms = T.Compose(transforms) def __call__(self, img, target): return self.transforms(img, target) class SegmentationPresetEval: - def __init__(self, base_size, mean=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225)): - self.transforms = T.Compose([ - T.RandomResize(base_size, base_size), - T.ToTensor(), + def __init__( + self, *, base_size, mean=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225), backend="pil", use_v2=False + ): + T, _, _ = get_modules(use_v2) + + transforms = [] + backend = backend.lower() + if backend == "tensor": + transforms += [T.PILToTensor()] + elif backend == "tv_tensor": + transforms += [T.ToImage()] + elif backend != "pil": + raise ValueError(f"backend can be 'tv_tensor', 'tensor' or 'pil', but got {backend}") + + if use_v2: + transforms += [T.Resize(size=(base_size, base_size))] + else: + transforms += [T.RandomResize(min_size=base_size, max_size=base_size)] + + if backend == "pil": + # Note: we could just convert to pure tensors even in v2? + transforms += [T.ToImage() if use_v2 else T.PILToTensor()] + + transforms += [ + T.ToDtype(torch.float, scale=True), T.Normalize(mean=mean, std=std), - ]) + ] + if use_v2: + transforms += [T.ToPureTensor()] + + self.transforms = T.Compose(transforms) def __call__(self, img, target): return self.transforms(img, target) diff --git a/references/segmentation/train.py b/references/segmentation/train.py index fb6c7eeee154f3fd1878ddb4e8145683c032516d..abdc3c6aacbe67c79b5049d793ad76291fb09e0e 100644 --- a/references/segmentation/train.py +++ b/references/segmentation/train.py @@ -1,36 +1,56 @@ import datetime import os import time +import warnings +import presets import torch import torch.utils.data -from torch import nn import torchvision - -from coco_utils import get_coco -import presets import utils +from coco_utils import get_coco +from torch import nn +from torch.optim.lr_scheduler import PolynomialLR +from torchvision.transforms import functional as F, InterpolationMode -def get_dataset(dir_path, name, image_set, transform): +def get_dataset(args, is_train): def sbd(*args, **kwargs): - return torchvision.datasets.SBDataset(*args, mode='segmentation', **kwargs) + kwargs.pop("use_v2") + return torchvision.datasets.SBDataset(*args, mode="segmentation", **kwargs) + + def voc(*args, **kwargs): + kwargs.pop("use_v2") + return torchvision.datasets.VOCSegmentation(*args, **kwargs) + paths = { - "voc": (dir_path, torchvision.datasets.VOCSegmentation, 21), - "voc_aug": (dir_path, sbd, 21), - "coco": (dir_path, get_coco, 21) + "voc": (args.data_path, voc, 21), + "voc_aug": (args.data_path, sbd, 21), + "coco": (args.data_path, get_coco, 21), } - p, ds_fn, num_classes = paths[name] + p, ds_fn, num_classes = paths[args.dataset] - ds = ds_fn(p, image_set=image_set, transforms=transform) + image_set = "train" if is_train else "val" + ds = ds_fn(p, image_set=image_set, transforms=get_transform(is_train, args), use_v2=args.use_v2) return ds, num_classes -def get_transform(train): - base_size = 520 - crop_size = 480 +def get_transform(is_train, args): + if is_train: + return presets.SegmentationPresetTrain(base_size=520, crop_size=480, backend=args.backend, use_v2=args.use_v2) + elif args.weights and args.test_only: + weights = torchvision.models.get_weight(args.weights) + trans = weights.transforms() - return presets.SegmentationPresetTrain(base_size, crop_size) if train else presets.SegmentationPresetEval(base_size) + def preprocessing(img, target): + img = trans(img) + size = F.get_dimensions(img)[1:] + target = F.resize(target, size, interpolation=InterpolationMode.NEAREST) + return img, F.pil_to_tensor(target) + + return preprocessing + else: + return presets.SegmentationPresetEval(base_size=520, backend=args.backend, use_v2=args.use_v2) def criterion(inputs, target): @@ -39,42 +59,66 @@ def criterion(inputs, target): losses[name] = nn.functional.cross_entropy(x, target, ignore_index=255) if len(losses) == 1: - return losses['out'] + return losses["out"] - return losses['out'] + 0.5 * losses['aux'] + return losses["out"] + 0.5 * losses["aux"] def evaluate(model, data_loader, device, num_classes): model.eval() confmat = utils.ConfusionMatrix(num_classes) metric_logger = utils.MetricLogger(delimiter=" ") - header = 'Test:' - with torch.no_grad(): + header = "Test:" + num_processed_samples = 0 + with torch.inference_mode(): for image, target in metric_logger.log_every(data_loader, 100, header): image, target = image.to(device), target.to(device) output = model(image) - output = output['out'] + output = output["out"] confmat.update(target.flatten(), output.argmax(1).flatten()) + # FIXME need to take into account that the datasets + # could have been padded in distributed setup + num_processed_samples += image.shape[0] confmat.reduce_from_all_processes() + num_processed_samples = utils.reduce_across_processes(num_processed_samples) + if ( + hasattr(data_loader.dataset, "__len__") + and len(data_loader.dataset) != num_processed_samples + and torch.distributed.get_rank() == 0 + ): + # See FIXME above + warnings.warn( + f"It looks like the dataset has {len(data_loader.dataset)} samples, but {num_processed_samples} " + "samples were used for the validation, which might bias the results. " + "Try adjusting the batch size and / or the world size. " + "Setting the world size to 1 is always a safe bet." + ) + return confmat -def train_one_epoch(model, criterion, optimizer, data_loader, lr_scheduler, device, epoch, print_freq): +def train_one_epoch(model, criterion, optimizer, data_loader, lr_scheduler, device, epoch, print_freq, scaler=None): model.train() metric_logger = utils.MetricLogger(delimiter=" ") - metric_logger.add_meter('lr', utils.SmoothedValue(window_size=1, fmt='{value}')) - header = 'Epoch: [{}]'.format(epoch) + metric_logger.add_meter("lr", utils.SmoothedValue(window_size=1, fmt="{value}")) + header = f"Epoch: [{epoch}]" for image, target in metric_logger.log_every(data_loader, print_freq, header): image, target = image.to(device), target.to(device) - output = model(image) - loss = criterion(output, target) + with torch.cuda.amp.autocast(enabled=scaler is not None): + output = model(image) + loss = criterion(output, target) optimizer.zero_grad() - loss.backward() - optimizer.step() + if scaler is not None: + scaler.scale(loss).backward() + scaler.step(optimizer) + scaler.update() + else: + loss.backward() + optimizer.step() lr_scheduler.step() @@ -82,6 +126,12 @@ def train_one_epoch(model, criterion, optimizer, data_loader, lr_scheduler, devi def main(args): + if args.backend.lower() != "pil" and not args.use_v2: + # TODO: Support tensor backend in V1? + raise ValueError("Use --use-v2 if you want to use the tv_tensor or tensor backend.") + if args.use_v2 and args.dataset != "coco": + raise ValueError("v2 is only support supported for coco dataset for now.") + if args.output_dir: utils.mkdir(args.output_dir) @@ -90,29 +140,42 @@ def main(args): device = torch.device(args.device) - dataset, num_classes = get_dataset(args.data_path, args.dataset, "train", get_transform(train=True)) - dataset_test, _ = get_dataset(args.data_path, args.dataset, "val", get_transform(train=False)) + if args.use_deterministic_algorithms: + torch.backends.cudnn.benchmark = False + torch.use_deterministic_algorithms(True) + else: + torch.backends.cudnn.benchmark = True + + dataset, num_classes = get_dataset(args, is_train=True) + dataset_test, _ = get_dataset(args, is_train=False) if args.distributed: train_sampler = torch.utils.data.distributed.DistributedSampler(dataset) - test_sampler = torch.utils.data.distributed.DistributedSampler(dataset_test) + test_sampler = torch.utils.data.distributed.DistributedSampler(dataset_test, shuffle=False) else: train_sampler = torch.utils.data.RandomSampler(dataset) test_sampler = torch.utils.data.SequentialSampler(dataset_test) data_loader = torch.utils.data.DataLoader( - dataset, batch_size=args.batch_size, - sampler=train_sampler, num_workers=args.workers, - collate_fn=utils.collate_fn, drop_last=True) + dataset, + batch_size=args.batch_size, + sampler=train_sampler, + num_workers=args.workers, + collate_fn=utils.collate_fn, + drop_last=True, + ) data_loader_test = torch.utils.data.DataLoader( - dataset_test, batch_size=1, - sampler=test_sampler, num_workers=args.workers, - collate_fn=utils.collate_fn) + dataset_test, batch_size=1, sampler=test_sampler, num_workers=args.workers, collate_fn=utils.collate_fn + ) - model = torchvision.models.segmentation.__dict__[args.model](num_classes=num_classes, - aux_loss=args.aux_loss, - pretrained=args.pretrained) + model = torchvision.models.get_model( + args.model, + weights=args.weights, + weights_backbone=args.weights_backbone, + num_classes=num_classes, + aux_loss=args.aux_loss, + ) model.to(device) if args.distributed: model = torch.nn.SyncBatchNorm.convert_sync_batchnorm(model) @@ -129,23 +192,50 @@ def main(args): if args.aux_loss: params = [p for p in model_without_ddp.aux_classifier.parameters() if p.requires_grad] params_to_optimize.append({"params": params, "lr": args.lr * 10}) - optimizer = torch.optim.SGD( - params_to_optimize, - lr=args.lr, momentum=args.momentum, weight_decay=args.weight_decay) + optimizer = torch.optim.SGD(params_to_optimize, lr=args.lr, momentum=args.momentum, weight_decay=args.weight_decay) + + scaler = torch.cuda.amp.GradScaler() if args.amp else None - lr_scheduler = torch.optim.lr_scheduler.LambdaLR( - optimizer, - lambda x: (1 - x / (len(data_loader) * args.epochs)) ** 0.9) + iters_per_epoch = len(data_loader) + main_lr_scheduler = PolynomialLR( + optimizer, total_iters=iters_per_epoch * (args.epochs - args.lr_warmup_epochs), power=0.9 + ) + + if args.lr_warmup_epochs > 0: + warmup_iters = iters_per_epoch * args.lr_warmup_epochs + args.lr_warmup_method = args.lr_warmup_method.lower() + if args.lr_warmup_method == "linear": + warmup_lr_scheduler = torch.optim.lr_scheduler.LinearLR( + optimizer, start_factor=args.lr_warmup_decay, total_iters=warmup_iters + ) + elif args.lr_warmup_method == "constant": + warmup_lr_scheduler = torch.optim.lr_scheduler.ConstantLR( + optimizer, factor=args.lr_warmup_decay, total_iters=warmup_iters + ) + else: + raise RuntimeError( + f"Invalid warmup lr method '{args.lr_warmup_method}'. Only linear and constant are supported." + ) + lr_scheduler = torch.optim.lr_scheduler.SequentialLR( + optimizer, schedulers=[warmup_lr_scheduler, main_lr_scheduler], milestones=[warmup_iters] + ) + else: + lr_scheduler = main_lr_scheduler if args.resume: - checkpoint = torch.load(args.resume, map_location='cpu') - model_without_ddp.load_state_dict(checkpoint['model'], strict=not args.test_only) + checkpoint = torch.load(args.resume, map_location="cpu", weights_only=True) + model_without_ddp.load_state_dict(checkpoint["model"], strict=not args.test_only) if not args.test_only: - optimizer.load_state_dict(checkpoint['optimizer']) - lr_scheduler.load_state_dict(checkpoint['lr_scheduler']) - args.start_epoch = checkpoint['epoch'] + 1 + optimizer.load_state_dict(checkpoint["optimizer"]) + lr_scheduler.load_state_dict(checkpoint["lr_scheduler"]) + args.start_epoch = checkpoint["epoch"] + 1 + if args.amp: + scaler.load_state_dict(checkpoint["scaler"]) if args.test_only: + # We disable the cudnn benchmarking because it can noticeably affect the accuracy + torch.backends.cudnn.benchmark = False + torch.backends.cudnn.deterministic = True confmat = evaluate(model, data_loader_test, device=device, num_classes=num_classes) print(confmat) return @@ -154,54 +244,62 @@ def main(args): for epoch in range(args.start_epoch, args.epochs): if args.distributed: train_sampler.set_epoch(epoch) - train_one_epoch(model, criterion, optimizer, data_loader, lr_scheduler, device, epoch, args.print_freq) + train_one_epoch(model, criterion, optimizer, data_loader, lr_scheduler, device, epoch, args.print_freq, scaler) confmat = evaluate(model, data_loader_test, device=device, num_classes=num_classes) print(confmat) checkpoint = { - 'model': model_without_ddp.state_dict(), - 'optimizer': optimizer.state_dict(), - 'lr_scheduler': lr_scheduler.state_dict(), - 'epoch': epoch, - 'args': args + "model": model_without_ddp.state_dict(), + "optimizer": optimizer.state_dict(), + "lr_scheduler": lr_scheduler.state_dict(), + "epoch": epoch, + "args": args, } - utils.save_on_master( - checkpoint, - os.path.join(args.output_dir, 'model_{}.pth'.format(epoch))) - utils.save_on_master( - checkpoint, - os.path.join(args.output_dir, 'checkpoint.pth')) + if args.amp: + checkpoint["scaler"] = scaler.state_dict() + utils.save_on_master(checkpoint, os.path.join(args.output_dir, f"model_{epoch}.pth")) + utils.save_on_master(checkpoint, os.path.join(args.output_dir, "checkpoint.pth")) total_time = time.time() - start_time total_time_str = str(datetime.timedelta(seconds=int(total_time))) - print('Training time {}'.format(total_time_str)) + print(f"Training time {total_time_str}") def get_args_parser(add_help=True): import argparse - parser = argparse.ArgumentParser(description='PyTorch Segmentation Training', add_help=add_help) - - parser.add_argument('--data-path', default='/datasets01/COCO/022719/', help='dataset path') - parser.add_argument('--dataset', default='coco', help='dataset name') - parser.add_argument('--model', default='fcn_resnet101', help='model') - parser.add_argument('--aux-loss', action='store_true', help='auxiliar loss') - parser.add_argument('--device', default='cuda', help='device') - parser.add_argument('-b', '--batch-size', default=8, type=int) - parser.add_argument('--epochs', default=30, type=int, metavar='N', - help='number of total epochs to run') - - parser.add_argument('-j', '--workers', default=16, type=int, metavar='N', - help='number of data loading workers (default: 16)') - parser.add_argument('--lr', default=0.01, type=float, help='initial learning rate') - parser.add_argument('--momentum', default=0.9, type=float, metavar='M', - help='momentum') - parser.add_argument('--wd', '--weight-decay', default=1e-4, type=float, - metavar='W', help='weight decay (default: 1e-4)', - dest='weight_decay') - parser.add_argument('--print-freq', default=10, type=int, help='print frequency') - parser.add_argument('--output-dir', default='.', help='path where to save') - parser.add_argument('--resume', default='', help='resume from checkpoint') - parser.add_argument('--start-epoch', default=0, type=int, metavar='N', - help='start epoch') + + parser = argparse.ArgumentParser(description="PyTorch Segmentation Training", add_help=add_help) + + parser.add_argument("--data-path", default="/datasets01/COCO/022719/", type=str, help="dataset path") + parser.add_argument("--dataset", default="coco", type=str, help="dataset name") + parser.add_argument("--model", default="fcn_resnet101", type=str, help="model name") + parser.add_argument("--aux-loss", action="store_true", help="auxiliary loss") + parser.add_argument("--device", default="cuda", type=str, help="device (Use cuda or cpu Default: cuda)") + parser.add_argument( + "-b", "--batch-size", default=8, type=int, help="images per gpu, the total batch size is $NGPU x batch_size" + ) + parser.add_argument("--epochs", default=30, type=int, metavar="N", help="number of total epochs to run") + + parser.add_argument( + "-j", "--workers", default=16, type=int, metavar="N", help="number of data loading workers (default: 16)" + ) + parser.add_argument("--lr", default=0.01, type=float, help="initial learning rate") + parser.add_argument("--momentum", default=0.9, type=float, metavar="M", help="momentum") + parser.add_argument( + "--wd", + "--weight-decay", + default=1e-4, + type=float, + metavar="W", + help="weight decay (default: 1e-4)", + dest="weight_decay", + ) + parser.add_argument("--lr-warmup-epochs", default=0, type=int, help="the number of epochs to warmup (default: 0)") + parser.add_argument("--lr-warmup-method", default="linear", type=str, help="the warmup method (default: linear)") + parser.add_argument("--lr-warmup-decay", default=0.01, type=float, help="the decay for lr") + parser.add_argument("--print-freq", default=10, type=int, help="print frequency") + parser.add_argument("--output-dir", default=".", type=str, help="path to save outputs") + parser.add_argument("--resume", default="", type=str, help="path of checkpoint") + parser.add_argument("--start-epoch", default=0, type=int, metavar="N", help="start epoch") parser.add_argument( "--test-only", dest="test_only", @@ -209,16 +307,20 @@ def get_args_parser(add_help=True): action="store_true", ) parser.add_argument( - "--pretrained", - dest="pretrained", - help="Use pre-trained models from the modelzoo", - action="store_true", + "--use-deterministic-algorithms", action="store_true", help="Forces the use of deterministic algorithms only." ) # distributed training parameters - parser.add_argument('--world-size', default=1, type=int, - help='number of distributed processes') - parser.add_argument('--dist-url', default='env://', help='url used to set up distributed training') + parser.add_argument("--world-size", default=1, type=int, help="number of distributed processes") + parser.add_argument("--dist-url", default="env://", type=str, help="url used to set up distributed training") + + parser.add_argument("--weights", default=None, type=str, help="the weights enum name to load") + parser.add_argument("--weights-backbone", default=None, type=str, help="the backbone weights enum name to load") + + # Mixed precision training parameters + parser.add_argument("--amp", action="store_true", help="Use torch.cuda.amp for mixed precision training") + parser.add_argument("--backend", default="PIL", type=str.lower, help="PIL or tensor - case insensitive") + parser.add_argument("--use-v2", action="store_true", help="Use V2 transforms") return parser diff --git a/references/segmentation/transforms.py b/references/segmentation/transforms.py index 4fe5a5ad147f490db83e5fa9c37589da50b34957..6934b9f862ea62984c4e505e6544dac39dd1ab18 100644 --- a/references/segmentation/transforms.py +++ b/references/segmentation/transforms.py @@ -1,7 +1,6 @@ -import numpy as np -from PIL import Image import random +import numpy as np import torch from torchvision import transforms as T from torchvision.transforms import functional as F @@ -17,7 +16,7 @@ def pad_if_smaller(img, size, fill=0): return img -class Compose(object): +class Compose: def __init__(self, transforms): self.transforms = transforms @@ -27,7 +26,7 @@ class Compose(object): return image, target -class RandomResize(object): +class RandomResize: def __init__(self, min_size, max_size=None): self.min_size = min_size if max_size is None: @@ -36,12 +35,12 @@ class RandomResize(object): def __call__(self, image, target): size = random.randint(self.min_size, self.max_size) - image = F.resize(image, size) - target = F.resize(target, size, interpolation=Image.NEAREST) + image = F.resize(image, size, antialias=True) + target = F.resize(target, size, interpolation=T.InterpolationMode.NEAREST) return image, target -class RandomHorizontalFlip(object): +class RandomHorizontalFlip: def __init__(self, flip_prob): self.flip_prob = flip_prob @@ -52,7 +51,7 @@ class RandomHorizontalFlip(object): return image, target -class RandomCrop(object): +class RandomCrop: def __init__(self, size): self.size = size @@ -65,7 +64,7 @@ class RandomCrop(object): return image, target -class CenterCrop(object): +class CenterCrop: def __init__(self, size): self.size = size @@ -75,14 +74,26 @@ class CenterCrop(object): return image, target -class ToTensor(object): +class PILToTensor: def __call__(self, image, target): - image = F.to_tensor(image) + image = F.pil_to_tensor(image) target = torch.as_tensor(np.array(target), dtype=torch.int64) return image, target -class Normalize(object): +class ToDtype: + def __init__(self, dtype, scale=False): + self.dtype = dtype + self.scale = scale + + def __call__(self, image, target): + if not self.scale: + return image.to(dtype=self.dtype), target + image = F.convert_image_dtype(image, self.dtype) + return image, target + + +class Normalize: def __init__(self, mean, std): self.mean = mean self.std = std diff --git a/references/segmentation/utils.py b/references/segmentation/utils.py index b67c18052fb5cf297d53640c79879300f4e9b9b1..92db18998511d7cd560de74cd8a60966d2960899 100644 --- a/references/segmentation/utils.py +++ b/references/segmentation/utils.py @@ -1,14 +1,14 @@ -from collections import defaultdict, deque import datetime +import errno +import os import time +from collections import defaultdict, deque + import torch import torch.distributed as dist -import errno -import os - -class SmoothedValue(object): +class SmoothedValue: """Track a series of values and provide access to smoothed values over a window or the global series average. """ @@ -30,11 +30,7 @@ class SmoothedValue(object): """ Warning: does not synchronize the deque! """ - if not is_dist_avail_and_initialized(): - return - t = torch.tensor([self.count, self.total], dtype=torch.float64, device='cuda') - dist.barrier() - dist.all_reduce(t) + t = reduce_across_processes([self.count, self.total]) t = t.tolist() self.count = int(t[0]) self.total = t[1] @@ -63,14 +59,11 @@ class SmoothedValue(object): def __str__(self): return self.fmt.format( - median=self.median, - avg=self.avg, - global_avg=self.global_avg, - max=self.max, - value=self.value) + median=self.median, avg=self.avg, global_avg=self.global_avg, max=self.max, value=self.value + ) -class ConfusionMatrix(object): +class ConfusionMatrix: def __init__(self, num_classes): self.num_classes = num_classes self.mat = None @@ -79,7 +72,7 @@ class ConfusionMatrix(object): n = self.num_classes if self.mat is None: self.mat = torch.zeros((n, n), dtype=torch.int64, device=a.device) - with torch.no_grad(): + with torch.inference_mode(): k = (a >= 0) & (a < n) inds = n * a[k].to(torch.int64) + b[k] self.mat += torch.bincount(inds, minlength=n**2).reshape(n, n) @@ -95,27 +88,19 @@ class ConfusionMatrix(object): return acc_global, acc, iu def reduce_from_all_processes(self): - if not torch.distributed.is_available(): - return - if not torch.distributed.is_initialized(): - return - torch.distributed.barrier() - torch.distributed.all_reduce(self.mat) + self.mat = reduce_across_processes(self.mat).to(torch.int64) def __str__(self): acc_global, acc, iu = self.compute() - return ( - 'global correct: {:.1f}\n' - 'average row correct: {}\n' - 'IoU: {}\n' - 'mean IoU: {:.1f}').format( - acc_global.item() * 100, - ['{:.1f}'.format(i) for i in (acc * 100).tolist()], - ['{:.1f}'.format(i) for i in (iu * 100).tolist()], - iu.mean().item() * 100) - - -class MetricLogger(object): + return ("global correct: {:.1f}\naverage row correct: {}\nIoU: {}\nmean IoU: {:.1f}").format( + acc_global.item() * 100, + [f"{i:.1f}" for i in (acc * 100).tolist()], + [f"{i:.1f}" for i in (iu * 100).tolist()], + iu.mean().item() * 100, + ) + + +class MetricLogger: def __init__(self, delimiter="\t"): self.meters = defaultdict(SmoothedValue) self.delimiter = delimiter @@ -124,7 +109,10 @@ class MetricLogger(object): for k, v in kwargs.items(): if isinstance(v, torch.Tensor): v = v.item() - assert isinstance(v, (float, int)) + if not isinstance(v, (float, int)): + raise TypeError( + f"This method expects the value of the input arguments to be of type float or int, instead got {type(v)}" + ) self.meters[k].update(v) def __getattr__(self, attr): @@ -132,15 +120,12 @@ class MetricLogger(object): return self.meters[attr] if attr in self.__dict__: return self.__dict__[attr] - raise AttributeError("'{}' object has no attribute '{}'".format( - type(self).__name__, attr)) + raise AttributeError(f"'{type(self).__name__}' object has no attribute '{attr}'") def __str__(self): loss_str = [] for name, meter in self.meters.items(): - loss_str.append( - "{}: {}".format(name, str(meter)) - ) + loss_str.append(f"{name}: {str(meter)}") return self.delimiter.join(loss_str) def synchronize_between_processes(self): @@ -153,31 +138,28 @@ class MetricLogger(object): def log_every(self, iterable, print_freq, header=None): i = 0 if not header: - header = '' + header = "" start_time = time.time() end = time.time() - iter_time = SmoothedValue(fmt='{avg:.4f}') - data_time = SmoothedValue(fmt='{avg:.4f}') - space_fmt = ':' + str(len(str(len(iterable)))) + 'd' + iter_time = SmoothedValue(fmt="{avg:.4f}") + data_time = SmoothedValue(fmt="{avg:.4f}") + space_fmt = ":" + str(len(str(len(iterable)))) + "d" if torch.cuda.is_available(): - log_msg = self.delimiter.join([ - header, - '[{0' + space_fmt + '}/{1}]', - 'eta: {eta}', - '{meters}', - 'time: {time}', - 'data: {data}', - 'max mem: {memory:.0f}' - ]) + log_msg = self.delimiter.join( + [ + header, + "[{0" + space_fmt + "}/{1}]", + "eta: {eta}", + "{meters}", + "time: {time}", + "data: {data}", + "max mem: {memory:.0f}", + ] + ) else: - log_msg = self.delimiter.join([ - header, - '[{0' + space_fmt + '}/{1}]', - 'eta: {eta}', - '{meters}', - 'time: {time}', - 'data: {data}' - ]) + log_msg = self.delimiter.join( + [header, "[{0" + space_fmt + "}/{1}]", "eta: {eta}", "{meters}", "time: {time}", "data: {data}"] + ) MB = 1024.0 * 1024.0 for obj in iterable: data_time.update(time.time() - end) @@ -187,21 +169,28 @@ class MetricLogger(object): eta_seconds = iter_time.global_avg * (len(iterable) - i) eta_string = str(datetime.timedelta(seconds=int(eta_seconds))) if torch.cuda.is_available(): - print(log_msg.format( - i, len(iterable), eta=eta_string, - meters=str(self), - time=str(iter_time), data=str(data_time), - memory=torch.cuda.max_memory_allocated() / MB)) + print( + log_msg.format( + i, + len(iterable), + eta=eta_string, + meters=str(self), + time=str(iter_time), + data=str(data_time), + memory=torch.cuda.max_memory_allocated() / MB, + ) + ) else: - print(log_msg.format( - i, len(iterable), eta=eta_string, - meters=str(self), - time=str(iter_time), data=str(data_time))) + print( + log_msg.format( + i, len(iterable), eta=eta_string, meters=str(self), time=str(iter_time), data=str(data_time) + ) + ) i += 1 end = time.time() total_time = time.time() - start_time total_time_str = str(datetime.timedelta(seconds=int(total_time))) - print('{} Total time: {}'.format(header, total_time_str)) + print(f"{header} Total time: {total_time_str}") def cat_list(images, fill_value=0): @@ -209,7 +198,7 @@ def cat_list(images, fill_value=0): batch_shape = (len(images),) + max_size batched_imgs = images[0].new(*batch_shape).fill_(fill_value) for img, pad_img in zip(images, batched_imgs): - pad_img[..., :img.shape[-2], :img.shape[-1]].copy_(img) + pad_img[..., : img.shape[-2], : img.shape[-1]].copy_(img) return batched_imgs @@ -233,10 +222,11 @@ def setup_for_distributed(is_master): This function disables printing when not in master process """ import builtins as __builtin__ + builtin_print = __builtin__.print def print(*args, **kwargs): - force = kwargs.pop('force', False) + force = kwargs.pop("force", False) if is_master or force: builtin_print(*args, **kwargs) @@ -273,26 +263,38 @@ def save_on_master(*args, **kwargs): def init_distributed_mode(args): - if 'RANK' in os.environ and 'WORLD_SIZE' in os.environ: + if "RANK" in os.environ and "WORLD_SIZE" in os.environ: args.rank = int(os.environ["RANK"]) - args.world_size = int(os.environ['WORLD_SIZE']) - args.gpu = int(os.environ['LOCAL_RANK']) - elif 'SLURM_PROCID' in os.environ: - args.rank = int(os.environ['SLURM_PROCID']) - args.gpu = args.rank % torch.cuda.device_count() + args.world_size = int(os.environ["WORLD_SIZE"]) + args.gpu = int(os.environ["LOCAL_RANK"]) + # elif "SLURM_PROCID" in os.environ: + # args.rank = int(os.environ["SLURM_PROCID"]) + # args.gpu = args.rank % torch.cuda.device_count() elif hasattr(args, "rank"): pass else: - print('Not using distributed mode') + print("Not using distributed mode") args.distributed = False return args.distributed = True torch.cuda.set_device(args.gpu) - args.dist_backend = 'nccl' - print('| distributed init (rank {}): {}'.format( - args.rank, args.dist_url), flush=True) - torch.distributed.init_process_group(backend=args.dist_backend, init_method=args.dist_url, - world_size=args.world_size, rank=args.rank) + args.dist_backend = "nccl" + print(f"| distributed init (rank {args.rank}): {args.dist_url}", flush=True) + torch.distributed.init_process_group( + backend=args.dist_backend, init_method=args.dist_url, world_size=args.world_size, rank=args.rank + ) + torch.distributed.barrier() setup_for_distributed(args.rank == 0) + + +def reduce_across_processes(val): + if not is_dist_avail_and_initialized(): + # nothing to sync, but we still convert to tensor for consistency with the distributed case. + return torch.tensor(val) + + t = torch.tensor(val, device="cuda") + dist.barrier() + dist.all_reduce(t) + return t diff --git a/references/segmentation/v2_extras.py b/references/segmentation/v2_extras.py new file mode 100644 index 0000000000000000000000000000000000000000..e1a8b53e02ba016a49e5c96f3ea5c70a87bb5c47 --- /dev/null +++ b/references/segmentation/v2_extras.py @@ -0,0 +1,83 @@ +"""This file only exists to be lazy-imported and avoid V2-related import warnings when just using V1.""" +import torch +from torchvision import tv_tensors +from torchvision.transforms import v2 + + +class PadIfSmaller(v2.Transform): + def __init__(self, size, fill=0): + super().__init__() + self.size = size + self.fill = v2._utils._setup_fill_arg(fill) + + def _get_params(self, sample): + _, height, width = v2._utils.query_chw(sample) + padding = [0, 0, max(self.size - width, 0), max(self.size - height, 0)] + needs_padding = any(padding) + return dict(padding=padding, needs_padding=needs_padding) + + def _transform(self, inpt, params): + if not params["needs_padding"]: + return inpt + + fill = v2._utils._get_fill(self.fill, type(inpt)) + fill = v2._utils._convert_fill_arg(fill) + + return v2.functional.pad(inpt, padding=params["padding"], fill=fill) + + +class CocoDetectionToVOCSegmentation(v2.Transform): + """Turn samples from datasets.CocoDetection into the same format as VOCSegmentation. + + This is achieved in two steps: + + 1. COCO differentiates between 91 categories while VOC only supports 21, including background for both. Fortunately, + the COCO categories are a superset of the VOC ones and thus can be mapped. Instances of the 70 categories not + present in VOC are dropped and replaced by background. + 2. COCO only offers detection masks, i.e. a (N, H, W) bool-ish tensor, where the truthy values in each individual + mask denote the instance. However, a segmentation mask is a (H, W) integer tensor (typically torch.uint8), where + the value of each pixel denotes the category it belongs to. The detection masks are merged into one segmentation + mask while pixels that belong to multiple detection masks are marked as invalid. + """ + + COCO_TO_VOC_LABEL_MAP = dict( + zip( + [0, 5, 2, 16, 9, 44, 6, 3, 17, 62, 21, 67, 18, 19, 4, 1, 64, 20, 63, 7, 72], + range(21), + ) + ) + INVALID_VALUE = 255 + + def _coco_detection_masks_to_voc_segmentation_mask(self, target): + if "masks" not in target: + return None + + instance_masks, instance_labels_coco = target["masks"], target["labels"] + + valid_labels_voc = [ + (idx, label_voc) + for idx, label_coco in enumerate(instance_labels_coco.tolist()) + if (label_voc := self.COCO_TO_VOC_LABEL_MAP.get(label_coco)) is not None + ] + + if not valid_labels_voc: + return None + + valid_voc_category_idcs, instance_labels_voc = zip(*valid_labels_voc) + + instance_masks = instance_masks[list(valid_voc_category_idcs)].to(torch.uint8) + instance_labels_voc = torch.tensor(instance_labels_voc, dtype=torch.uint8) + + # Calling `.max()` on the stacked detection masks works fine to separate background from foreground as long as + # there is at most a single instance per pixel. Overlapping instances will be filtered out in the next step. + segmentation_mask, _ = (instance_masks * instance_labels_voc.reshape(-1, 1, 1)).max(dim=0) + segmentation_mask[instance_masks.sum(dim=0) > 1] = self.INVALID_VALUE + + return segmentation_mask + + def forward(self, image, target): + segmentation_mask = self._coco_detection_masks_to_voc_segmentation_mask(target) + if segmentation_mask is None: + segmentation_mask = torch.zeros(v2.functional.get_size(image), dtype=torch.uint8) + + return image, tv_tensors.Mask(segmentation_mask) diff --git a/references/similarity/loss.py b/references/similarity/loss.py index 1fa4a89c762514c9c69f4dbda89c6be9b48394d9..971810a066332345eba970979d4b3dacb4437146 100644 --- a/references/similarity/loss.py +++ b/references/similarity/loss.py @@ -1,21 +1,21 @@ -''' +""" Pytorch adaptation of https://omoindrot.github.io/triplet-loss https://github.com/omoindrot/tensorflow-triplet-loss -''' +""" import torch import torch.nn as nn class TripletMarginLoss(nn.Module): - def __init__(self, margin=1.0, p=2., mining='batch_all'): - super(TripletMarginLoss, self).__init__() + def __init__(self, margin=1.0, p=2.0, mining="batch_all"): + super().__init__() self.margin = margin self.p = p self.mining = mining - if mining == 'batch_all': + if mining == "batch_all": self.loss_fn = batch_all_triplet_loss - if mining == 'batch_hard': + if mining == "batch_hard": self.loss_fn = batch_hard_triplet_loss def forward(self, embeddings, labels): diff --git a/references/similarity/model.py b/references/similarity/model.py index 3b39c0ec0dc28a6ea59c320d61c8c7e178b06359..f235ae11116591f6564d3ea6f41dfe58921fede3 100644 --- a/references/similarity/model.py +++ b/references/similarity/model.py @@ -4,7 +4,7 @@ import torchvision.models as models class EmbeddingNet(nn.Module): def __init__(self, backbone=None): - super(EmbeddingNet, self).__init__() + super().__init__() if backbone is None: backbone = models.resnet50(num_classes=128) diff --git a/references/similarity/sampler.py b/references/similarity/sampler.py index 0ae6d07a77c04022a4c959bef196f824f86e0ae3..fe6517418ab092f1b859bc5802268e774411c40b 100644 --- a/references/similarity/sampler.py +++ b/references/similarity/sampler.py @@ -1,7 +1,8 @@ +import random +from collections import defaultdict + import torch from torch.utils.data.sampler import Sampler -from collections import defaultdict -import random def create_groups(groups, k): @@ -46,7 +47,8 @@ class PKSampler(Sampler): self.groups = create_groups(groups, self.k) # Ensures there are enough classes to sample from - assert len(self.groups) >= p + if len(self.groups) < p: + raise ValueError("There are not enough classes to sample from") def __iter__(self): # Shuffle samples within groups diff --git a/references/similarity/test.py b/references/similarity/test.py index 8381e02e740b9af65935988e55642497e9e699d5..3b9848594b61feaa5964bb89f5b82413d1b6d32a 100644 --- a/references/similarity/test.py +++ b/references/similarity/test.py @@ -1,15 +1,14 @@ import unittest from collections import defaultdict -from torch.utils.data import DataLoader -from torchvision.datasets import FakeData +import torch import torchvision.transforms as transforms - from sampler import PKSampler +from torch.utils.data import DataLoader +from torchvision.datasets import FakeData class Tester(unittest.TestCase): - def test_pksampler(self): p, k = 16, 4 @@ -19,8 +18,13 @@ class Tester(unittest.TestCase): self.assertRaises(AssertionError, PKSampler, targets, p, k) # Ensure p, k constraints on batch - dataset = FakeData(size=1000, num_classes=100, image_size=(3, 1, 1), - transform=transforms.ToTensor()) + trans = transforms.Compose( + [ + transforms.PILToTensor(), + transforms.ConvertImageDtype(torch.float), + ] + ) + dataset = FakeData(size=1000, num_classes=100, image_size=(3, 1, 1), transform=trans) targets = [target.item() for _, target in dataset] sampler = PKSampler(targets, p, k) loader = DataLoader(dataset, batch_size=p * k, sampler=sampler) @@ -38,5 +42,5 @@ class Tester(unittest.TestCase): self.assertEqual(bins[b], k) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/references/similarity/train.py b/references/similarity/train.py index 9a166a14b385d52b13d543649b1489071c4ce247..7686729927efa5d63b6a69fa32cba9be5f673227 100644 --- a/references/similarity/train.py +++ b/references/similarity/train.py @@ -1,15 +1,13 @@ import os import torch -from torch.optim import Adam -from torch.utils.data import DataLoader - import torchvision.transforms as transforms -from torchvision.datasets import FashionMNIST - from loss import TripletMarginLoss -from sampler import PKSampler from model import EmbeddingNet +from sampler import PKSampler +from torch.optim import Adam +from torch.utils.data import DataLoader +from torchvision.datasets import FashionMNIST def train_epoch(model, optimizer, criterion, data_loader, device, epoch, print_freq): @@ -33,7 +31,7 @@ def train_epoch(model, optimizer, criterion, data_loader, device, epoch, print_f i += 1 avg_loss = running_loss / print_freq avg_trip = 100.0 * running_frac_pos_triplets / print_freq - print('[{:d}, {:d}] | loss: {:.4f} | % avg hard triplets: {:.2f}%'.format(epoch, i, avg_loss, avg_trip)) + print(f"[{epoch:d}, {i:d}] | loss: {avg_loss:.4f} | % avg hard triplets: {avg_trip:.2f}%") running_loss = 0 running_frac_pos_triplets = 0 @@ -53,7 +51,7 @@ def find_best_threshold(dists, targets, device): return best_thresh, accuracy -@torch.no_grad() +@torch.inference_mode() def evaluate(model, loader, device): model.eval() embeds, labels = [], [] @@ -79,33 +77,45 @@ def evaluate(model, loader, device): threshold, accuracy = find_best_threshold(dists, targets, device) - print('accuracy: {:.3f}%, threshold: {:.2f}'.format(accuracy, threshold)) + print(f"accuracy: {accuracy:.3f}%, threshold: {threshold:.2f}") def save(model, epoch, save_dir, file_name): - file_name = 'epoch_' + str(epoch) + '__' + file_name + file_name = "epoch_" + str(epoch) + "__" + file_name save_path = os.path.join(save_dir, file_name) torch.save(model.state_dict(), save_path) def main(args): - device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu') + device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") + + if args.use_deterministic_algorithms: + torch.backends.cudnn.benchmark = False + torch.use_deterministic_algorithms(True) + else: + torch.backends.cudnn.benchmark = True + p = args.labels_per_batch k = args.samples_per_label batch_size = p * k model = EmbeddingNet() if args.resume: - model.load_state_dict(torch.load(args.resume)) + model.load_state_dict(torch.load(args.resume, weights_only=True)) model.to(device) criterion = TripletMarginLoss(margin=args.margin) optimizer = Adam(model.parameters(), lr=args.lr) - transform = transforms.Compose([transforms.Lambda(lambda image: image.convert('RGB')), - transforms.Resize((224, 224)), - transforms.ToTensor()]) + transform = transforms.Compose( + [ + transforms.Lambda(lambda image: image.convert("RGB")), + transforms.Resize((224, 224)), + transforms.PILToTensor(), + transforms.ConvertImageDtype(torch.float), + ] + ) # Using FMNIST to demonstrate embedding learning using triplet loss. This dataset can # be replaced with any classification dataset. @@ -118,48 +128,60 @@ def main(args): # targets attribute with the same format. targets = train_dataset.targets.tolist() - train_loader = DataLoader(train_dataset, batch_size=batch_size, - sampler=PKSampler(targets, p, k), - num_workers=args.workers) - test_loader = DataLoader(test_dataset, batch_size=args.eval_batch_size, - shuffle=False, - num_workers=args.workers) + train_loader = DataLoader( + train_dataset, batch_size=batch_size, sampler=PKSampler(targets, p, k), num_workers=args.workers + ) + test_loader = DataLoader(test_dataset, batch_size=args.eval_batch_size, shuffle=False, num_workers=args.workers) + + if args.test_only: + # We disable the cudnn benchmarking because it can noticeably affect the accuracy + torch.backends.cudnn.benchmark = False + torch.backends.cudnn.deterministic = True + evaluate(model, test_loader, device) + return for epoch in range(1, args.epochs + 1): - print('Training...') + print("Training...") train_epoch(model, optimizer, criterion, train_loader, device, epoch, args.print_freq) - print('Evaluating...') + print("Evaluating...") evaluate(model, test_loader, device) - print('Saving...') - save(model, epoch, args.save_dir, 'ckpt.pth') + print("Saving...") + save(model, epoch, args.save_dir, "ckpt.pth") def parse_args(): import argparse - parser = argparse.ArgumentParser(description='PyTorch Embedding Learning') - - parser.add_argument('--dataset-dir', default='/tmp/fmnist/', - help='FashionMNIST dataset directory path') - parser.add_argument('-p', '--labels-per-batch', default=8, type=int, - help='Number of unique labels/classes per batch') - parser.add_argument('-k', '--samples-per-label', default=8, type=int, - help='Number of samples per label in a batch') - parser.add_argument('--eval-batch-size', default=512, type=int) - parser.add_argument('--epochs', default=10, type=int, metavar='N', - help='Number of training epochs to run') - parser.add_argument('-j', '--workers', default=4, type=int, metavar='N', - help='Number of data loading workers') - parser.add_argument('--lr', default=0.0001, type=float, help='Learning rate') - parser.add_argument('--margin', default=0.2, type=float, help='Triplet loss margin') - parser.add_argument('--print-freq', default=20, type=int, help='Print frequency') - parser.add_argument('--save-dir', default='.', help='Model save directory') - parser.add_argument('--resume', default='', help='Resume from checkpoint') + + parser = argparse.ArgumentParser(description="PyTorch Embedding Learning") + + parser.add_argument("--dataset-dir", default="/tmp/fmnist/", type=str, help="FashionMNIST dataset directory path") + parser.add_argument( + "-p", "--labels-per-batch", default=8, type=int, help="Number of unique labels/classes per batch" + ) + parser.add_argument("-k", "--samples-per-label", default=8, type=int, help="Number of samples per label in a batch") + parser.add_argument("--eval-batch-size", default=512, type=int, help="batch size for evaluation") + parser.add_argument("--epochs", default=10, type=int, metavar="N", help="number of total epochs to run") + parser.add_argument("-j", "--workers", default=4, type=int, metavar="N", help="number of data loading workers") + parser.add_argument("--lr", default=0.0001, type=float, help="initial learning rate") + parser.add_argument("--margin", default=0.2, type=float, help="Triplet loss margin") + parser.add_argument("--print-freq", default=20, type=int, help="print frequency") + parser.add_argument("--save-dir", default=".", type=str, help="Model save directory") + parser.add_argument("--resume", default="", type=str, help="path of checkpoint") + parser.add_argument( + "--test-only", + dest="test_only", + help="Only test the model", + action="store_true", + ) + parser.add_argument( + "--use-deterministic-algorithms", action="store_true", help="Forces the use of deterministic algorithms only." + ) return parser.parse_args() -if __name__ == '__main__': +if __name__ == "__main__": args = parse_args() main(args) diff --git a/references/video_classification/README.md b/references/video_classification/README.md index ef7db6dcd9004a08e68334ba7bf4407f0986994e..39c5d8f1bbaee7a6dcde7145f928b10b0f030616 100644 --- a/references/video_classification/README.md +++ b/references/video_classification/README.md @@ -18,11 +18,11 @@ We assume the training and validation AVI videos are stored at `/data/kinectics4 Run the training on a single node with 8 GPUs: ```bash -python -m torch.distributed.launch --nproc_per_node=8 --use_env train.py --data-path=/data/kinectics400 --train-dir=train --val-dir=val --batch-size=16 --cache-dataset --sync-bn --apex +torchrun --nproc_per_node=8 train.py --data-path=/data/kinectics400 --kinetics-version="400" --lr 0.08 --cache-dataset --sync-bn --amp ``` **Note:** all our models were trained on 8 nodes with 8 V100 GPUs each for a total of 64 GPUs. Expected training time for 64 GPUs is 24 hours, depending on the storage solution. -**Note 2:** hyperparameters for exact replication of our training can be found [here](https://github.com/pytorch/vision/blob/master/torchvision/models/video/README.md). Some hyperparameters such as learning rate are scaled linearly in proportion to the number of GPUs. +**Note 2:** hyperparameters for exact replication of our training can be found on the section below. Some hyperparameters such as learning rate must be scaled linearly in proportion to the number of GPUs. The default values assume 64 GPUs. ### Single GPU @@ -30,5 +30,96 @@ python -m torch.distributed.launch --nproc_per_node=8 --use_env train.py --data- ```bash -python train.py --data-path=/data/kinectics400 --train-dir=train --val-dir=val --batch-size=8 --cache-dataset +python train.py --data-path=/data/kinectics400 --kinetics-version="400" --batch-size=8 --cache-dataset ``` + + +### Additional Kinetics versions + +Since the original release, additional versions of Kinetics dataset became available (Kinetics 600). +Our training scripts support these versions of dataset as well by setting the `--kinetics-version` parameter to `"600"`. + +**Note:** training on Kinetics 600 requires a different set of hyperparameters for optimal performance. We do not provide Kinetics 600 pretrained models. + + +## Video classification models + +Starting with version `0.4.0` we have introduced support for basic video tasks and video classification modelling. +For more information about the available models check [here](https://pytorch.org/docs/stable/torchvision/models.html#video-classification). + +### Video ResNet models + +See reference training script [here](https://github.com/pytorch/vision/blob/main/references/video_classification/train.py): + +- input space: RGB +- resize size: [128, 171] +- crop size: [112, 112] +- mean: [0.43216, 0.394666, 0.37645] +- std: [0.22803, 0.22145, 0.216989] +- number of classes: 400 + +Input data augmentations at training time (with optional parameters): + +1. ConvertImageDtype +2. Resize (resize size value above) +3. Random horizontal flip (0.5) +4. Normalization (mean, std, see values above) +5. Random Crop (crop size value above) +6. Convert BCHW to CBHW + +Input data augmentations at validation time (with optional parameters): + +1. ConvertImageDtype +2. Resize (resize size value above) +3. Normalization (mean, std, see values above) +4. Center Crop (crop size value above) +5. Convert BCHW to CBHW + +This translates in the following set of command-line arguments. Please note that `--batch-size` parameter controls the +batch size per GPU. Moreover, note that our default `--lr` is configured for 64 GPUs which is how many we used for the +Video resnet models: +``` +# number of frames per clip +--clip_len 16 \ +--frame-rate 15 \ +# allow for temporal jittering +--clips_per_video 5 \ +--batch-size 24 \ +--epochs 45 \ +--lr 0.64 \ +# we use 10 epochs for linear warmup +--lr-warmup-epochs 10 \ +# learning rate is decayed at 20, 30, and 40 epoch by a factor of 10 +--lr-milestones 20, 30, 40 \ +--lr-gamma 0.1 \ +--train-resize-size 128 171 \ +--train-crop-size 112 112 \ +--val-resize-size 128 171 \ +--val-crop-size 112 112 +``` + +### S3D + +The S3D model was trained similarly to the above but with the following changes on the default configuration: +``` +--batch-size=12 --lr 0.2 --clip-len 64 --clips-per-video 5 --sync-bn \ +--train-resize-size 256 256 --train-crop-size 224 224 --val-resize-size 256 256 --val-crop-size 224 224 +``` + +We used 64 GPUs to train the architecture. + +To estimate the validation statistics of the model, we run the reference script with the following configuration: +``` +--batch-size=16 --test-only --clip-len 128 --clips-per-video 1 +``` + +### Additional video modelling resources + +- [Video Model Zoo](https://github.com/facebookresearch/VMZ) +- [PySlowFast](https://github.com/facebookresearch/SlowFast) + +### References + +[0] _D. Tran, H. Wang, L. Torresani, J. Ray, Y. LeCun and M. Paluri_: A Closer Look at Spatiotemporal Convolutions for Action Recognition. _CVPR 2018_ ([paper](https://research.fb.com/wp-content/uploads/2018/04/a-closer-look-at-spatiotemporal-convolutions-for-action-recognition.pdf)) + +[1] _W. Kay, J. Carreira, K. Simonyan, B. Zhang, C. Hillier, S. Vijayanarasimhan, F. Viola, T. Green, T. Back, P. Natsev, M. Suleyman, A. Zisserman_: The Kinetics Human Action Video Dataset ([paper](https://arxiv.org/abs/1705.06950)) diff --git a/references/video_classification/datasets.py b/references/video_classification/datasets.py new file mode 100644 index 0000000000000000000000000000000000000000..dec1e16b856b538fbb1eb94385913621b3700744 --- /dev/null +++ b/references/video_classification/datasets.py @@ -0,0 +1,15 @@ +from typing import Tuple + +import torchvision +from torch import Tensor + + +class KineticsWithVideoId(torchvision.datasets.Kinetics): + def __getitem__(self, idx: int) -> Tuple[Tensor, Tensor, int]: + video, audio, info, video_idx = self.video_clips.get_clip(idx) + label = self.samples[video_idx][1] + + if self.transform is not None: + video = self.transform(video) + + return video, audio, label, video_idx diff --git a/references/video_classification/presets.py b/references/video_classification/presets.py index 3ee679ad5afcaeae039de71eee46712919c460c6..f73802c9666cca56411e8b1c7b2483719c578c31 100644 --- a/references/video_classification/presets.py +++ b/references/video_classification/presets.py @@ -1,24 +1,29 @@ import torch - from torchvision.transforms import transforms -from transforms import ConvertBHWCtoBCHW, ConvertBCHWtoCBHW +from transforms import ConvertBCHWtoCBHW class VideoClassificationPresetTrain: - def __init__(self, resize_size, crop_size, mean=(0.43216, 0.394666, 0.37645), std=(0.22803, 0.22145, 0.216989), - hflip_prob=0.5): + def __init__( + self, + *, + crop_size, + resize_size, + mean=(0.43216, 0.394666, 0.37645), + std=(0.22803, 0.22145, 0.216989), + hflip_prob=0.5, + ): trans = [ - ConvertBHWCtoBCHW(), transforms.ConvertImageDtype(torch.float32), - transforms.Resize(resize_size), + # We hard-code antialias=False to preserve results after we changed + # its default from None to True (see + # https://github.com/pytorch/vision/pull/7160) + # TODO: we could re-train the video models with antialias=True? + transforms.Resize(resize_size, antialias=False), ] if hflip_prob > 0: trans.append(transforms.RandomHorizontalFlip(hflip_prob)) - trans.extend([ - transforms.Normalize(mean=mean, std=std), - transforms.RandomCrop(crop_size), - ConvertBCHWtoCBHW() - ]) + trans.extend([transforms.Normalize(mean=mean, std=std), transforms.RandomCrop(crop_size), ConvertBCHWtoCBHW()]) self.transforms = transforms.Compose(trans) def __call__(self, x): @@ -26,15 +31,20 @@ class VideoClassificationPresetTrain: class VideoClassificationPresetEval: - def __init__(self, resize_size, crop_size, mean=(0.43216, 0.394666, 0.37645), std=(0.22803, 0.22145, 0.216989)): - self.transforms = transforms.Compose([ - ConvertBHWCtoBCHW(), - transforms.ConvertImageDtype(torch.float32), - transforms.Resize(resize_size), - transforms.Normalize(mean=mean, std=std), - transforms.CenterCrop(crop_size), - ConvertBCHWtoCBHW() - ]) + def __init__(self, *, crop_size, resize_size, mean=(0.43216, 0.394666, 0.37645), std=(0.22803, 0.22145, 0.216989)): + self.transforms = transforms.Compose( + [ + transforms.ConvertImageDtype(torch.float32), + # We hard-code antialias=False to preserve results after we changed + # its default from None to True (see + # https://github.com/pytorch/vision/pull/7160) + # TODO: we could re-train the video models with antialias=True? + transforms.Resize(resize_size, antialias=False), + transforms.Normalize(mean=mean, std=std), + transforms.CenterCrop(crop_size), + ConvertBCHWtoCBHW(), + ] + ) def __call__(self, x): return self.transforms(x) diff --git a/references/video_classification/scheduler.py b/references/video_classification/scheduler.py deleted file mode 100644 index f0f862d41ad9a028a82186bb9a11b48b6e840b85..0000000000000000000000000000000000000000 --- a/references/video_classification/scheduler.py +++ /dev/null @@ -1,47 +0,0 @@ -import torch -from bisect import bisect_right - - -class WarmupMultiStepLR(torch.optim.lr_scheduler._LRScheduler): - def __init__( - self, - optimizer, - milestones, - gamma=0.1, - warmup_factor=1.0 / 3, - warmup_iters=5, - warmup_method="linear", - last_epoch=-1, - ): - if not milestones == sorted(milestones): - raise ValueError( - "Milestones should be a list of" " increasing integers. Got {}", - milestones, - ) - - if warmup_method not in ("constant", "linear"): - raise ValueError( - "Only 'constant' or 'linear' warmup_method accepted" - "got {}".format(warmup_method) - ) - self.milestones = milestones - self.gamma = gamma - self.warmup_factor = warmup_factor - self.warmup_iters = warmup_iters - self.warmup_method = warmup_method - super(WarmupMultiStepLR, self).__init__(optimizer, last_epoch) - - def get_lr(self): - warmup_factor = 1 - if self.last_epoch < self.warmup_iters: - if self.warmup_method == "constant": - warmup_factor = self.warmup_factor - elif self.warmup_method == "linear": - alpha = float(self.last_epoch) / self.warmup_iters - warmup_factor = self.warmup_factor * (1 - alpha) + alpha - return [ - base_lr * - warmup_factor * - self.gamma ** bisect_right(self.milestones, self.last_epoch) - for base_lr in self.base_lrs - ] diff --git a/references/video_classification/train.py b/references/video_classification/train.py index bcc74064344d47775792f1e6e34b0cfc576ef812..945c8c67c761b26ff02fb6b4670d5ecfbc4d5475 100644 --- a/references/video_classification/train.py +++ b/references/video_classification/train.py @@ -1,84 +1,126 @@ import datetime import os import time +import warnings + +import datasets +import presets import torch import torch.utils.data -from torch.utils.data.dataloader import default_collate -from torch import nn import torchvision import torchvision.datasets.video_utils -from torchvision.datasets.samplers import DistributedSampler, UniformClipSampler, RandomClipSampler - -import presets import utils - -from scheduler import WarmupMultiStepLR - -try: - from apex import amp -except ImportError: - amp = None +from torch import nn +from torch.utils.data.dataloader import default_collate +from torchvision.datasets.samplers import DistributedSampler, RandomClipSampler, UniformClipSampler -def train_one_epoch(model, criterion, optimizer, lr_scheduler, data_loader, device, epoch, print_freq, apex=False): +def train_one_epoch(model, criterion, optimizer, lr_scheduler, data_loader, device, epoch, print_freq, scaler=None): model.train() metric_logger = utils.MetricLogger(delimiter=" ") - metric_logger.add_meter('lr', utils.SmoothedValue(window_size=1, fmt='{value}')) - metric_logger.add_meter('clips/s', utils.SmoothedValue(window_size=10, fmt='{value:.3f}')) + metric_logger.add_meter("lr", utils.SmoothedValue(window_size=1, fmt="{value}")) + metric_logger.add_meter("clips/s", utils.SmoothedValue(window_size=10, fmt="{value:.3f}")) - header = 'Epoch: [{}]'.format(epoch) - for video, target in metric_logger.log_every(data_loader, print_freq, header): + header = f"Epoch: [{epoch}]" + for video, target, _ in metric_logger.log_every(data_loader, print_freq, header): start_time = time.time() video, target = video.to(device), target.to(device) - output = model(video) - loss = criterion(output, target) + with torch.cuda.amp.autocast(enabled=scaler is not None): + output = model(video) + loss = criterion(output, target) optimizer.zero_grad() - if apex: - with amp.scale_loss(loss, optimizer) as scaled_loss: - scaled_loss.backward() + + if scaler is not None: + scaler.scale(loss).backward() + scaler.step(optimizer) + scaler.update() else: loss.backward() - optimizer.step() + optimizer.step() acc1, acc5 = utils.accuracy(output, target, topk=(1, 5)) batch_size = video.shape[0] metric_logger.update(loss=loss.item(), lr=optimizer.param_groups[0]["lr"]) - metric_logger.meters['acc1'].update(acc1.item(), n=batch_size) - metric_logger.meters['acc5'].update(acc5.item(), n=batch_size) - metric_logger.meters['clips/s'].update(batch_size / (time.time() - start_time)) + metric_logger.meters["acc1"].update(acc1.item(), n=batch_size) + metric_logger.meters["acc5"].update(acc5.item(), n=batch_size) + metric_logger.meters["clips/s"].update(batch_size / (time.time() - start_time)) lr_scheduler.step() def evaluate(model, criterion, data_loader, device): model.eval() metric_logger = utils.MetricLogger(delimiter=" ") - header = 'Test:' - with torch.no_grad(): - for video, target in metric_logger.log_every(data_loader, 100, header): + header = "Test:" + num_processed_samples = 0 + # Group and aggregate output of a video + num_videos = len(data_loader.dataset.samples) + num_classes = len(data_loader.dataset.classes) + agg_preds = torch.zeros((num_videos, num_classes), dtype=torch.float32, device=device) + agg_targets = torch.zeros((num_videos), dtype=torch.int32, device=device) + with torch.inference_mode(): + for video, target, video_idx in metric_logger.log_every(data_loader, 100, header): video = video.to(device, non_blocking=True) target = target.to(device, non_blocking=True) output = model(video) loss = criterion(output, target) + # Use softmax to convert output into prediction probability + preds = torch.softmax(output, dim=1) + for b in range(video.size(0)): + idx = video_idx[b].item() + agg_preds[idx] += preds[b].detach() + agg_targets[idx] = target[b].detach().item() + acc1, acc5 = utils.accuracy(output, target, topk=(1, 5)) # FIXME need to take into account that the datasets # could have been padded in distributed setup batch_size = video.shape[0] metric_logger.update(loss=loss.item()) - metric_logger.meters['acc1'].update(acc1.item(), n=batch_size) - metric_logger.meters['acc5'].update(acc5.item(), n=batch_size) + metric_logger.meters["acc1"].update(acc1.item(), n=batch_size) + metric_logger.meters["acc5"].update(acc5.item(), n=batch_size) + num_processed_samples += batch_size # gather the stats from all processes + num_processed_samples = utils.reduce_across_processes(num_processed_samples) + if isinstance(data_loader.sampler, DistributedSampler): + # Get the len of UniformClipSampler inside DistributedSampler + num_data_from_sampler = len(data_loader.sampler.dataset) + else: + num_data_from_sampler = len(data_loader.sampler) + + if ( + hasattr(data_loader.dataset, "__len__") + and num_data_from_sampler != num_processed_samples + and torch.distributed.get_rank() == 0 + ): + # See FIXME above + warnings.warn( + f"It looks like the sampler has {num_data_from_sampler} samples, but {num_processed_samples} " + "samples were used for the validation, which might bias the results. " + "Try adjusting the batch size and / or the world size. " + "Setting the world size to 1 is always a safe bet." + ) + metric_logger.synchronize_between_processes() - print(' * Clip Acc@1 {top1.global_avg:.3f} Clip Acc@5 {top5.global_avg:.3f}' - .format(top1=metric_logger.acc1, top5=metric_logger.acc5)) + print( + " * Clip Acc@1 {top1.global_avg:.3f} Clip Acc@5 {top5.global_avg:.3f}".format( + top1=metric_logger.acc1, top5=metric_logger.acc5 + ) + ) + # Reduce the agg_preds and agg_targets from all gpu and show result + agg_preds = utils.reduce_across_processes(agg_preds) + agg_targets = utils.reduce_across_processes(agg_targets, op=torch.distributed.ReduceOp.MAX) + agg_acc1, agg_acc5 = utils.accuracy(agg_preds, agg_targets, topk=(1, 5)) + print(" * Video Acc@1 {acc1:.3f} Video Acc@5 {acc5:.3f}".format(acc1=agg_acc1, acc5=agg_acc5)) return metric_logger.acc1.global_avg -def _get_cache_path(filepath): +def _get_cache_path(filepath, args): import hashlib - h = hashlib.sha1(filepath.encode()).hexdigest() + + value = f"{filepath}-{args.clip_len}-{args.kinetics_version}-{args.frame_rate}" + h = hashlib.sha1(value.encode()).hexdigest() cache_path = os.path.join("~", ".torch", "vision", "datasets", "kinetics", h[:10] + ".pt") cache_path = os.path.expanduser(cache_path) return cache_path @@ -86,83 +128,100 @@ def _get_cache_path(filepath): def collate_fn(batch): # remove audio from the batch - batch = [(d[0], d[2]) for d in batch] + batch = [(d[0], d[2], d[3]) for d in batch] return default_collate(batch) def main(args): - if args.apex and amp is None: - raise RuntimeError("Failed to import apex. Please install apex from https://www.github.com/nvidia/apex " - "to enable mixed-precision training.") - if args.output_dir: utils.mkdir(args.output_dir) utils.init_distributed_mode(args) print(args) - print("torch version: ", torch.__version__) - print("torchvision version: ", torchvision.__version__) device = torch.device(args.device) - torch.backends.cudnn.benchmark = True + if args.use_deterministic_algorithms: + torch.backends.cudnn.benchmark = False + torch.use_deterministic_algorithms(True) + else: + torch.backends.cudnn.benchmark = True # Data loading code print("Loading data") - traindir = os.path.join(args.data_path, args.train_dir) - valdir = os.path.join(args.data_path, args.val_dir) + val_resize_size = tuple(args.val_resize_size) + val_crop_size = tuple(args.val_crop_size) + train_resize_size = tuple(args.train_resize_size) + train_crop_size = tuple(args.train_crop_size) + + traindir = os.path.join(args.data_path, "train") + valdir = os.path.join(args.data_path, "val") print("Loading training data") st = time.time() - cache_path = _get_cache_path(traindir) - transform_train = presets.VideoClassificationPresetTrain((128, 171), (112, 112)) + cache_path = _get_cache_path(traindir, args) + transform_train = presets.VideoClassificationPresetTrain(crop_size=train_crop_size, resize_size=train_resize_size) if args.cache_dataset and os.path.exists(cache_path): - print("Loading dataset_train from {}".format(cache_path)) - dataset, _ = torch.load(cache_path) + print(f"Loading dataset_train from {cache_path}") + dataset, _ = torch.load(cache_path, weights_only=True) dataset.transform = transform_train else: if args.distributed: - print("It is recommended to pre-compute the dataset cache " - "on a single-gpu first, as it will be faster") - dataset = torchvision.datasets.Kinetics400( - traindir, + print("It is recommended to pre-compute the dataset cache on a single-gpu first, as it will be faster") + dataset = datasets.KineticsWithVideoId( + args.data_path, frames_per_clip=args.clip_len, + num_classes=args.kinetics_version, + split="train", step_between_clips=1, transform=transform_train, - frame_rate=15, - extensions=('avi', 'mp4', ) + frame_rate=args.frame_rate, + extensions=( + "avi", + "mp4", + ), + output_format="TCHW", ) if args.cache_dataset: - print("Saving dataset_train to {}".format(cache_path)) + print(f"Saving dataset_train to {cache_path}") utils.mkdir(os.path.dirname(cache_path)) utils.save_on_master((dataset, traindir), cache_path) print("Took", time.time() - st) print("Loading validation data") - cache_path = _get_cache_path(valdir) + cache_path = _get_cache_path(valdir, args) - transform_test = presets.VideoClassificationPresetEval((128, 171), (112, 112)) + if args.weights and args.test_only: + weights = torchvision.models.get_weight(args.weights) + transform_test = weights.transforms() + else: + transform_test = presets.VideoClassificationPresetEval(crop_size=val_crop_size, resize_size=val_resize_size) if args.cache_dataset and os.path.exists(cache_path): - print("Loading dataset_test from {}".format(cache_path)) - dataset_test, _ = torch.load(cache_path) + print(f"Loading dataset_test from {cache_path}") + dataset_test, _ = torch.load(cache_path, weights_only=True) dataset_test.transform = transform_test else: if args.distributed: - print("It is recommended to pre-compute the dataset cache " - "on a single-gpu first, as it will be faster") - dataset_test = torchvision.datasets.Kinetics400( - valdir, + print("It is recommended to pre-compute the dataset cache on a single-gpu first, as it will be faster") + dataset_test = datasets.KineticsWithVideoId( + args.data_path, frames_per_clip=args.clip_len, + num_classes=args.kinetics_version, + split="val", step_between_clips=1, transform=transform_test, - frame_rate=15, - extensions=('avi', 'mp4',) + frame_rate=args.frame_rate, + extensions=( + "avi", + "mp4", + ), + output_format="TCHW", ) if args.cache_dataset: - print("Saving dataset_test to {}".format(cache_path)) + print(f"Saving dataset_test to {cache_path}") utils.mkdir(os.path.dirname(cache_path)) utils.save_on_master((dataset_test, valdir), cache_path) @@ -171,42 +230,64 @@ def main(args): test_sampler = UniformClipSampler(dataset_test.video_clips, args.clips_per_video) if args.distributed: train_sampler = DistributedSampler(train_sampler) - test_sampler = DistributedSampler(test_sampler) + test_sampler = DistributedSampler(test_sampler, shuffle=False) data_loader = torch.utils.data.DataLoader( - dataset, batch_size=args.batch_size, - sampler=train_sampler, num_workers=args.workers, - pin_memory=True, collate_fn=collate_fn) + dataset, + batch_size=args.batch_size, + sampler=train_sampler, + num_workers=args.workers, + pin_memory=True, + collate_fn=collate_fn, + ) data_loader_test = torch.utils.data.DataLoader( - dataset_test, batch_size=args.batch_size, - sampler=test_sampler, num_workers=args.workers, - pin_memory=True, collate_fn=collate_fn) + dataset_test, + batch_size=args.batch_size, + sampler=test_sampler, + num_workers=args.workers, + pin_memory=True, + collate_fn=collate_fn, + ) print("Creating model") - model = torchvision.models.video.__dict__[args.model](pretrained=args.pretrained) + model = torchvision.models.get_model(args.model, weights=args.weights) model.to(device) if args.distributed and args.sync_bn: model = torch.nn.SyncBatchNorm.convert_sync_batchnorm(model) criterion = nn.CrossEntropyLoss() - lr = args.lr * args.world_size - optimizer = torch.optim.SGD( - model.parameters(), lr=lr, momentum=args.momentum, weight_decay=args.weight_decay) - - if args.apex: - model, optimizer = amp.initialize(model, optimizer, - opt_level=args.apex_opt_level - ) + optimizer = torch.optim.SGD(model.parameters(), lr=args.lr, momentum=args.momentum, weight_decay=args.weight_decay) + scaler = torch.cuda.amp.GradScaler() if args.amp else None # convert scheduler to be per iteration, not per epoch, for warmup that lasts # between different epochs - warmup_iters = args.lr_warmup_epochs * len(data_loader) - lr_milestones = [len(data_loader) * m for m in args.lr_milestones] - lr_scheduler = WarmupMultiStepLR( - optimizer, milestones=lr_milestones, gamma=args.lr_gamma, - warmup_iters=warmup_iters, warmup_factor=1e-5) + iters_per_epoch = len(data_loader) + lr_milestones = [iters_per_epoch * (m - args.lr_warmup_epochs) for m in args.lr_milestones] + main_lr_scheduler = torch.optim.lr_scheduler.MultiStepLR(optimizer, milestones=lr_milestones, gamma=args.lr_gamma) + + if args.lr_warmup_epochs > 0: + warmup_iters = iters_per_epoch * args.lr_warmup_epochs + args.lr_warmup_method = args.lr_warmup_method.lower() + if args.lr_warmup_method == "linear": + warmup_lr_scheduler = torch.optim.lr_scheduler.LinearLR( + optimizer, start_factor=args.lr_warmup_decay, total_iters=warmup_iters + ) + elif args.lr_warmup_method == "constant": + warmup_lr_scheduler = torch.optim.lr_scheduler.ConstantLR( + optimizer, factor=args.lr_warmup_decay, total_iters=warmup_iters + ) + else: + raise RuntimeError( + f"Invalid warmup lr method '{args.lr_warmup_method}'. Only linear and constant are supported." + ) + + lr_scheduler = torch.optim.lr_scheduler.SequentialLR( + optimizer, schedulers=[warmup_lr_scheduler, main_lr_scheduler], milestones=[warmup_iters] + ) + else: + lr_scheduler = main_lr_scheduler model_without_ddp = model if args.distributed: @@ -214,13 +295,18 @@ def main(args): model_without_ddp = model.module if args.resume: - checkpoint = torch.load(args.resume, map_location='cpu') - model_without_ddp.load_state_dict(checkpoint['model']) - optimizer.load_state_dict(checkpoint['optimizer']) - lr_scheduler.load_state_dict(checkpoint['lr_scheduler']) - args.start_epoch = checkpoint['epoch'] + 1 + checkpoint = torch.load(args.resume, map_location="cpu", weights_only=True) + model_without_ddp.load_state_dict(checkpoint["model"]) + optimizer.load_state_dict(checkpoint["optimizer"]) + lr_scheduler.load_state_dict(checkpoint["lr_scheduler"]) + args.start_epoch = checkpoint["epoch"] + 1 + if args.amp: + scaler.load_state_dict(checkpoint["scaler"]) if args.test_only: + # We disable the cudnn benchmarking because it can noticeably affect the accuracy + torch.backends.cudnn.benchmark = False + torch.backends.cudnn.deterministic = True evaluate(model, criterion, data_loader_test, device=device) return @@ -229,60 +315,69 @@ def main(args): for epoch in range(args.start_epoch, args.epochs): if args.distributed: train_sampler.set_epoch(epoch) - train_one_epoch(model, criterion, optimizer, lr_scheduler, data_loader, - device, epoch, args.print_freq, args.apex) + train_one_epoch(model, criterion, optimizer, lr_scheduler, data_loader, device, epoch, args.print_freq, scaler) evaluate(model, criterion, data_loader_test, device=device) if args.output_dir: checkpoint = { - 'model': model_without_ddp.state_dict(), - 'optimizer': optimizer.state_dict(), - 'lr_scheduler': lr_scheduler.state_dict(), - 'epoch': epoch, - 'args': args} - utils.save_on_master( - checkpoint, - os.path.join(args.output_dir, 'model_{}.pth'.format(epoch))) - utils.save_on_master( - checkpoint, - os.path.join(args.output_dir, 'checkpoint.pth')) + "model": model_without_ddp.state_dict(), + "optimizer": optimizer.state_dict(), + "lr_scheduler": lr_scheduler.state_dict(), + "epoch": epoch, + "args": args, + } + if args.amp: + checkpoint["scaler"] = scaler.state_dict() + utils.save_on_master(checkpoint, os.path.join(args.output_dir, f"model_{epoch}.pth")) + utils.save_on_master(checkpoint, os.path.join(args.output_dir, "checkpoint.pth")) total_time = time.time() - start_time total_time_str = str(datetime.timedelta(seconds=int(total_time))) - print('Training time {}'.format(total_time_str)) + print(f"Training time {total_time_str}") -def parse_args(): +def get_args_parser(add_help=True): import argparse - parser = argparse.ArgumentParser(description='PyTorch Video Classification Training') - - parser.add_argument('--data-path', default='/datasets01_101/kinetics/070618/', help='dataset') - parser.add_argument('--train-dir', default='train_avi-480p', help='name of train dir') - parser.add_argument('--val-dir', default='val_avi-480p', help='name of val dir') - parser.add_argument('--model', default='r2plus1d_18', help='model') - parser.add_argument('--device', default='cuda', help='device') - parser.add_argument('--clip-len', default=16, type=int, metavar='N', - help='number of frames per clip') - parser.add_argument('--clips-per-video', default=5, type=int, metavar='N', - help='maximum number of clips per video to consider') - parser.add_argument('-b', '--batch-size', default=24, type=int) - parser.add_argument('--epochs', default=45, type=int, metavar='N', - help='number of total epochs to run') - parser.add_argument('-j', '--workers', default=10, type=int, metavar='N', - help='number of data loading workers (default: 16)') - parser.add_argument('--lr', default=0.01, type=float, help='initial learning rate') - parser.add_argument('--momentum', default=0.9, type=float, metavar='M', - help='momentum') - parser.add_argument('--wd', '--weight-decay', default=1e-4, type=float, - metavar='W', help='weight decay (default: 1e-4)', - dest='weight_decay') - parser.add_argument('--lr-milestones', nargs='+', default=[20, 30, 40], type=int, help='decrease lr on milestones') - parser.add_argument('--lr-gamma', default=0.1, type=float, help='decrease lr by a factor of lr-gamma') - parser.add_argument('--lr-warmup-epochs', default=10, type=int, help='number of warmup epochs') - parser.add_argument('--print-freq', default=10, type=int, help='print frequency') - parser.add_argument('--output-dir', default='.', help='path where to save') - parser.add_argument('--resume', default='', help='resume from checkpoint') - parser.add_argument('--start-epoch', default=0, type=int, metavar='N', - help='start epoch') + + parser = argparse.ArgumentParser(description="PyTorch Video Classification Training", add_help=add_help) + + parser.add_argument("--data-path", default="/datasets01_101/kinetics/070618/", type=str, help="dataset path") + parser.add_argument( + "--kinetics-version", default="400", type=str, choices=["400", "600"], help="Select kinetics version" + ) + parser.add_argument("--model", default="r2plus1d_18", type=str, help="model name") + parser.add_argument("--device", default="cuda", type=str, help="device (Use cuda or cpu Default: cuda)") + parser.add_argument("--clip-len", default=16, type=int, metavar="N", help="number of frames per clip") + parser.add_argument("--frame-rate", default=15, type=int, metavar="N", help="the frame rate") + parser.add_argument( + "--clips-per-video", default=5, type=int, metavar="N", help="maximum number of clips per video to consider" + ) + parser.add_argument( + "-b", "--batch-size", default=24, type=int, help="images per gpu, the total batch size is $NGPU x batch_size" + ) + parser.add_argument("--epochs", default=45, type=int, metavar="N", help="number of total epochs to run") + parser.add_argument( + "-j", "--workers", default=10, type=int, metavar="N", help="number of data loading workers (default: 10)" + ) + parser.add_argument("--lr", default=0.64, type=float, help="initial learning rate") + parser.add_argument("--momentum", default=0.9, type=float, metavar="M", help="momentum") + parser.add_argument( + "--wd", + "--weight-decay", + default=1e-4, + type=float, + metavar="W", + help="weight decay (default: 1e-4)", + dest="weight_decay", + ) + parser.add_argument("--lr-milestones", nargs="+", default=[20, 30, 40], type=int, help="decrease lr on milestones") + parser.add_argument("--lr-gamma", default=0.1, type=float, help="decrease lr by a factor of lr-gamma") + parser.add_argument("--lr-warmup-epochs", default=10, type=int, help="the number of epochs to warmup (default: 10)") + parser.add_argument("--lr-warmup-method", default="linear", type=str, help="the warmup method (default: linear)") + parser.add_argument("--lr-warmup-decay", default=0.001, type=float, help="the decay for lr") + parser.add_argument("--print-freq", default=10, type=int, help="print frequency") + parser.add_argument("--output-dir", default=".", type=str, help="path to save outputs") + parser.add_argument("--resume", default="", type=str, help="path of checkpoint") + parser.add_argument("--start-epoch", default=0, type=int, metavar="N", help="start epoch") parser.add_argument( "--cache-dataset", dest="cache_dataset", @@ -302,31 +397,50 @@ def parse_args(): action="store_true", ) parser.add_argument( - "--pretrained", - dest="pretrained", - help="Use pre-trained models from the modelzoo", - action="store_true", + "--use-deterministic-algorithms", action="store_true", help="Forces the use of deterministic algorithms only." ) - # Mixed precision training parameters - parser.add_argument('--apex', action='store_true', - help='Use apex for mixed precision training') - parser.add_argument('--apex-opt-level', default='O1', type=str, - help='For apex mixed precision training' - 'O0 for FP32 training, O1 for mixed precision training.' - 'For further detail, see https://github.com/NVIDIA/apex/tree/master/examples/imagenet' - ) - # distributed training parameters - parser.add_argument('--world-size', default=1, type=int, - help='number of distributed processes') - parser.add_argument('--dist-url', default='env://', help='url used to set up distributed training') + parser.add_argument("--world-size", default=1, type=int, help="number of distributed processes") + parser.add_argument("--dist-url", default="env://", type=str, help="url used to set up distributed training") + + parser.add_argument( + "--val-resize-size", + default=(128, 171), + nargs="+", + type=int, + help="the resize size used for validation (default: (128, 171))", + ) + parser.add_argument( + "--val-crop-size", + default=(112, 112), + nargs="+", + type=int, + help="the central crop size used for validation (default: (112, 112))", + ) + parser.add_argument( + "--train-resize-size", + default=(128, 171), + nargs="+", + type=int, + help="the resize size used for training (default: (128, 171))", + ) + parser.add_argument( + "--train-crop-size", + default=(112, 112), + nargs="+", + type=int, + help="the random crop size used for training (default: (112, 112))", + ) + + parser.add_argument("--weights", default=None, type=str, help="the weights enum name to load") - args = parser.parse_args() + # Mixed precision training parameters + parser.add_argument("--amp", action="store_true", help="Use torch.cuda.amp for mixed precision training") - return args + return parser if __name__ == "__main__": - args = parse_args() + args = get_args_parser().parse_args() main(args) diff --git a/references/video_classification/transforms.py b/references/video_classification/transforms.py index 27f6c75450a555e285a069fc10a902c3e400363e..2a7cc2a4a66a3de9a73a598671deef6c74e76e1b 100644 --- a/references/video_classification/transforms.py +++ b/references/video_classification/transforms.py @@ -2,17 +2,8 @@ import torch import torch.nn as nn -class ConvertBHWCtoBCHW(nn.Module): - """Convert tensor from (B, H, W, C) to (B, C, H, W) - """ - - def forward(self, vid: torch.Tensor) -> torch.Tensor: - return vid.permute(0, 3, 1, 2) - - class ConvertBCHWtoCBHW(nn.Module): - """Convert tensor from (B, C, H, W) to (C, B, H, W) - """ + """Convert tensor from (B, C, H, W) to (C, B, H, W)""" def forward(self, vid: torch.Tensor) -> torch.Tensor: return vid.permute(1, 0, 2, 3) diff --git a/references/video_classification/utils.py b/references/video_classification/utils.py index 3573b84d7808f656a8f601bc81de5035295d97a3..934f62f66ae0a5e936e3ccac8bf2bae9c7956d9e 100644 --- a/references/video_classification/utils.py +++ b/references/video_classification/utils.py @@ -1,14 +1,14 @@ -from collections import defaultdict, deque import datetime +import errno +import os import time +from collections import defaultdict, deque + import torch import torch.distributed as dist -import errno -import os - -class SmoothedValue(object): +class SmoothedValue: """Track a series of values and provide access to smoothed values over a window or the global series average. """ @@ -30,11 +30,7 @@ class SmoothedValue(object): """ Warning: does not synchronize the deque! """ - if not is_dist_avail_and_initialized(): - return - t = torch.tensor([self.count, self.total], dtype=torch.float64, device='cuda') - dist.barrier() - dist.all_reduce(t) + t = reduce_across_processes([self.count, self.total]) t = t.tolist() self.count = int(t[0]) self.total = t[1] @@ -63,14 +59,11 @@ class SmoothedValue(object): def __str__(self): return self.fmt.format( - median=self.median, - avg=self.avg, - global_avg=self.global_avg, - max=self.max, - value=self.value) + median=self.median, avg=self.avg, global_avg=self.global_avg, max=self.max, value=self.value + ) -class MetricLogger(object): +class MetricLogger: def __init__(self, delimiter="\t"): self.meters = defaultdict(SmoothedValue) self.delimiter = delimiter @@ -79,7 +72,10 @@ class MetricLogger(object): for k, v in kwargs.items(): if isinstance(v, torch.Tensor): v = v.item() - assert isinstance(v, (float, int)) + if not isinstance(v, (float, int)): + raise TypeError( + f"This method expects the value of the input arguments to be of type float or int, instead got {type(v)}" + ) self.meters[k].update(v) def __getattr__(self, attr): @@ -87,15 +83,12 @@ class MetricLogger(object): return self.meters[attr] if attr in self.__dict__: return self.__dict__[attr] - raise AttributeError("'{}' object has no attribute '{}'".format( - type(self).__name__, attr)) + raise AttributeError(f"'{type(self).__name__}' object has no attribute '{attr}'") def __str__(self): loss_str = [] for name, meter in self.meters.items(): - loss_str.append( - "{}: {}".format(name, str(meter)) - ) + loss_str.append(f"{name}: {str(meter)}") return self.delimiter.join(loss_str) def synchronize_between_processes(self): @@ -108,31 +101,28 @@ class MetricLogger(object): def log_every(self, iterable, print_freq, header=None): i = 0 if not header: - header = '' + header = "" start_time = time.time() end = time.time() - iter_time = SmoothedValue(fmt='{avg:.4f}') - data_time = SmoothedValue(fmt='{avg:.4f}') - space_fmt = ':' + str(len(str(len(iterable)))) + 'd' + iter_time = SmoothedValue(fmt="{avg:.4f}") + data_time = SmoothedValue(fmt="{avg:.4f}") + space_fmt = ":" + str(len(str(len(iterable)))) + "d" if torch.cuda.is_available(): - log_msg = self.delimiter.join([ - header, - '[{0' + space_fmt + '}/{1}]', - 'eta: {eta}', - '{meters}', - 'time: {time}', - 'data: {data}', - 'max mem: {memory:.0f}' - ]) + log_msg = self.delimiter.join( + [ + header, + "[{0" + space_fmt + "}/{1}]", + "eta: {eta}", + "{meters}", + "time: {time}", + "data: {data}", + "max mem: {memory:.0f}", + ] + ) else: - log_msg = self.delimiter.join([ - header, - '[{0' + space_fmt + '}/{1}]', - 'eta: {eta}', - '{meters}', - 'time: {time}', - 'data: {data}' - ]) + log_msg = self.delimiter.join( + [header, "[{0" + space_fmt + "}/{1}]", "eta: {eta}", "{meters}", "time: {time}", "data: {data}"] + ) MB = 1024.0 * 1024.0 for obj in iterable: data_time.update(time.time() - end) @@ -142,26 +132,33 @@ class MetricLogger(object): eta_seconds = iter_time.global_avg * (len(iterable) - i) eta_string = str(datetime.timedelta(seconds=int(eta_seconds))) if torch.cuda.is_available(): - print(log_msg.format( - i, len(iterable), eta=eta_string, - meters=str(self), - time=str(iter_time), data=str(data_time), - memory=torch.cuda.max_memory_allocated() / MB)) + print( + log_msg.format( + i, + len(iterable), + eta=eta_string, + meters=str(self), + time=str(iter_time), + data=str(data_time), + memory=torch.cuda.max_memory_allocated() / MB, + ) + ) else: - print(log_msg.format( - i, len(iterable), eta=eta_string, - meters=str(self), - time=str(iter_time), data=str(data_time))) + print( + log_msg.format( + i, len(iterable), eta=eta_string, meters=str(self), time=str(iter_time), data=str(data_time) + ) + ) i += 1 end = time.time() total_time = time.time() - start_time total_time_str = str(datetime.timedelta(seconds=int(total_time))) - print('{} Total time: {}'.format(header, total_time_str)) + print(f"{header} Total time: {total_time_str}") def accuracy(output, target, topk=(1,)): """Computes the accuracy over the k top predictions for the specified values of k""" - with torch.no_grad(): + with torch.inference_mode(): maxk = max(topk) batch_size = target.size(0) @@ -189,10 +186,11 @@ def setup_for_distributed(is_master): This function disables printing when not in master process """ import builtins as __builtin__ + builtin_print = __builtin__.print def print(*args, **kwargs): - force = kwargs.pop('force', False) + force = kwargs.pop("force", False) if is_master or force: builtin_print(*args, **kwargs) @@ -229,26 +227,38 @@ def save_on_master(*args, **kwargs): def init_distributed_mode(args): - if 'RANK' in os.environ and 'WORLD_SIZE' in os.environ: + if "RANK" in os.environ and "WORLD_SIZE" in os.environ: args.rank = int(os.environ["RANK"]) - args.world_size = int(os.environ['WORLD_SIZE']) - args.gpu = int(os.environ['LOCAL_RANK']) - elif 'SLURM_PROCID' in os.environ: - args.rank = int(os.environ['SLURM_PROCID']) + args.world_size = int(os.environ["WORLD_SIZE"]) + args.gpu = int(os.environ["LOCAL_RANK"]) + elif "SLURM_PROCID" in os.environ: + args.rank = int(os.environ["SLURM_PROCID"]) args.gpu = args.rank % torch.cuda.device_count() elif hasattr(args, "rank"): pass else: - print('Not using distributed mode') + print("Not using distributed mode") args.distributed = False return args.distributed = True torch.cuda.set_device(args.gpu) - args.dist_backend = 'nccl' - print('| distributed init (rank {}): {}'.format( - args.rank, args.dist_url), flush=True) - torch.distributed.init_process_group(backend=args.dist_backend, init_method=args.dist_url, - world_size=args.world_size, rank=args.rank) + args.dist_backend = "nccl" + print(f"| distributed init (rank {args.rank}): {args.dist_url}", flush=True) + torch.distributed.init_process_group( + backend=args.dist_backend, init_method=args.dist_url, world_size=args.world_size, rank=args.rank + ) + torch.distributed.barrier() setup_for_distributed(args.rank == 0) + + +def reduce_across_processes(val, op=dist.ReduceOp.SUM): + if not is_dist_avail_and_initialized(): + # nothing to sync, but we still convert to tensor for consistency with the distributed case. + return torch.tensor(val) + + t = torch.tensor(val, device="cuda") + dist.barrier() + dist.all_reduce(t, op=op) + return t diff --git a/scripts/README.rst b/scripts/README.rst new file mode 100644 index 0000000000000000000000000000000000000000..23247e34178145af8249416e9c7756d87d680a99 --- /dev/null +++ b/scripts/README.rst @@ -0,0 +1,23 @@ +Utility scripts +=============== + +* `fbcode_to_main_sync.sh` + +This shell script is used to synchronise internal changes with the main repository. + +To run this script: + +.. code:: bash + + chmod +x fbcode_to_main_sync.sh + ./fbcode_to_main_sync.sh + +where + +``commit_hash`` represents the commit hash in fbsync branch from where we should start the sync. + +``fork_name`` is the name of the remote corresponding to your fork, you can check it by doing `"git remote -v"`. + +``fork_main_branch`` (optional) is the name of the main branch on your fork(default="main"). + +This script will create PRs corresponding to the commits in fbsync. Please review these, add the [FBcode->GH] prefix on the title and publish them. Most importantly, add the [FBcode->GH] prefix at the beginning of the merge message as well. diff --git a/scripts/collect_model_urls.py b/scripts/collect_model_urls.py new file mode 100644 index 0000000000000000000000000000000000000000..2acba6cbbdaebc6989f6a28bc68431d20f4e26ab --- /dev/null +++ b/scripts/collect_model_urls.py @@ -0,0 +1,20 @@ +import pathlib +import re +import sys + +MODEL_URL_PATTERN = re.compile(r"https://download[.]pytorch[.]org/models/.+?[.]pth") + + +def main(*roots): + model_urls = set() + for root in roots: + for path in pathlib.Path(root).rglob("*.py"): + with open(path, "r") as file: + for line in file: + model_urls.update(MODEL_URL_PATTERN.findall(line)) + + print("\n".join(sorted(model_urls))) + + +if __name__ == "__main__": + main(*sys.argv[1:]) diff --git a/scripts/download_model_urls.py b/scripts/download_model_urls.py new file mode 100644 index 0000000000000000000000000000000000000000..f5f53d71e98f1c0c82d74bdb5b6cca122c4090c2 --- /dev/null +++ b/scripts/download_model_urls.py @@ -0,0 +1,41 @@ +import asyncio +import sys +from pathlib import Path +from time import perf_counter +from urllib.parse import urlsplit + +import aiofiles +import aiohttp +from torchvision import models +from tqdm.asyncio import tqdm + + +async def main(download_root): + download_root.mkdir(parents=True, exist_ok=True) + urls = {weight.url for name in models.list_models() for weight in iter(models.get_model_weights(name))} + + async with aiohttp.ClientSession(timeout=aiohttp.ClientTimeout(total=None)) as session: + await tqdm.gather(*[download(download_root, session, url) for url in urls]) + + +async def download(download_root, session, url): + response = await session.get(url, params=dict(source="ci")) + + assert response.ok + + file_name = Path(urlsplit(url).path).name + async with aiofiles.open(download_root / file_name, "wb") as f: + async for data in response.content.iter_any(): + await f.write(data) + + +if __name__ == "__main__": + download_root = ( + (Path(sys.argv[1]) if len(sys.argv) > 1 else Path("~/.cache/torch/hub/checkpoints")).expanduser().resolve() + ) + print(f"Downloading model weights to {download_root}") + start = perf_counter() + asyncio.get_event_loop().run_until_complete(main(download_root)) + stop = perf_counter() + minutes, seconds = divmod(stop - start, 60) + print(f"Download took {minutes:2.0f}m {seconds:2.0f}s") diff --git a/scripts/fbcode_to_main_sync.sh b/scripts/fbcode_to_main_sync.sh new file mode 100755 index 0000000000000000000000000000000000000000..c08d61690daedf2a50110d549fde533c28a87197 --- /dev/null +++ b/scripts/fbcode_to_main_sync.sh @@ -0,0 +1,47 @@ +#!/bin/bash + +if [ -z $1 ] +then + echo "Commit hash is required to be passed when running this script." + echo "./fbcode_to_main_sync.sh " + exit 1 +fi +commit_hash=$1 + +if [ -z $2 ] +then + echo "Fork name is required to be passed when running this script." + echo "./fbcode_to_main_sync.sh " + exit 1 +fi +fork_name=$2 + +if [ -z $3 ] +then + fork_main_branch="main" +else + fork_main_branch=$3 +fi + +from_branch="fbsync" +git stash +git checkout $from_branch +git pull +# Add random prefix in the new branch name to keep it unique per run +prefix=$RANDOM +IFS=' +' +for line in $(git log --pretty=oneline "$commit_hash"..HEAD) +do + if [[ $line != *\[fbsync\]* ]] + then + echo "Parsing $line" + hash=$(echo $line | cut -f1 -d' ') + git checkout $fork_main_branch + git checkout -B cherrypick_${prefix}_${hash} + git cherry-pick -x "$hash" + git push $fork_name cherrypick_${prefix}_${hash} + git checkout $from_branch + fi +done +echo "Please review the PRs, add [FBCode->GH] prefix in the title and publish them." diff --git a/scripts/release_notes/classify_prs.py b/scripts/release_notes/classify_prs.py new file mode 100644 index 0000000000000000000000000000000000000000..5847c9f03f57f04da3b5de2fe50f761ffa0e5a34 --- /dev/null +++ b/scripts/release_notes/classify_prs.py @@ -0,0 +1,120 @@ +# In[1]: +import pandas as pd + +# In[2]: +data_filename = "data.json" +df = pd.read_json(data_filename).T +df.tail() + +# In[3]: +all_labels = {lbl for labels in df["labels"] for lbl in labels} +all_labels + +# In[4]: +# Add one column per label +for label in all_labels: + df[label] = df["labels"].apply(lambda labels_list: label in labels_list) +df.head() + +# In[5]: +# Add a clean "module" column. It contains tuples since PRs can have more than one module. +# Maybe we should include "topics" in that column as well? + +all_modules = { # mapping: full name -> clean name + label: "".join(label.split(" ")[1:]) for label in all_labels if label.startswith("module") +} + +# We use an ugly loop, but whatever ¯\_(ツ)_/¯ +df["module"] = [[] for _ in range(len(df))] +for i, row in df.iterrows(): + for full_name, clean_name in all_modules.items(): + if full_name in row["labels"]: + row["module"].append(clean_name) +df["module"] = df.module.apply(tuple) +df.head() + +# In[6]: +mod_df = df.set_index("module").sort_index() +mod_df.tail() + +# In[7]: +# All improvement PRs +mod_df[mod_df["enhancement"]].head() + +# In[8]: +# improvement f module +# note: don't filter module name on the index as the index contain tuples with non-exclusive values +# Use the boolean column instead +mod_df[mod_df["enhancement"] & mod_df["module: transforms"]] + + +# In[9]: +def format_prs(mod_df, exclude_prototype=True): + out = [] + for idx, row in mod_df.iterrows(): + if exclude_prototype and "prototype" in row and row["prototype"]: + continue + modules = idx + # Put "documentation" and "tests" first for sorting to be dece + for last_module in ("documentation", "tests"): + if last_module in modules: + modules = [m for m in modules if m != last_module] + [last_module] + + module = f"[{', '.join(modules)}]" + module = module.replace("referencescripts", "reference scripts") + module = module.replace("code", "reference scripts") + out.append(f"{module} {row['title']}") + + return "\n".join(out) + + +# In[10]: +included_prs = pd.DataFrame() + +# If labels are accurate, this shouhld generate most of the release notes already +# We keep track of the included PRs to figure out which ones are missing +for section_title, module_idx in ( + ("Backward-incompatible changes", "bc-breaking"), + ("Deprecations", "deprecation"), + ("New Features", "new feature"), + ("Improvements", "enhancement"), + ("Bug Fixes", "bug"), + ("Code Quality", "code quality"), +): + if module_idx in mod_df: + print(f"## {section_title}") + print() + tmp_df = mod_df[mod_df[module_idx]] + included_prs = pd.concat([included_prs, tmp_df]) + print(format_prs(tmp_df)) + print() + + +# In[11]: +# Missing PRs are these ones... classify them manually +missing_prs = pd.concat([mod_df, included_prs]).drop_duplicates(subset="pr_number", keep=False) +print(format_prs(missing_prs)) + +# In[12]: +# Generate list of contributors +print() +print("## Contributors") + +previous_release = "c35d3855ccbfa6a36e6ae6337a1f2c721c1f1e78" +current_release = "5181a854d8b127cf465cd22a67c1b5aaf6ccae05" +print( + f"{{ git shortlog -s {previous_release}..{current_release} | cut -f2- & git log -s {previous_release}..{current_release} | grep Co-authored | cut -f2- -d: | cut -f1 -d\\< | sed 's/^ *//;s/ *//' ; }} | sort --ignore-case | uniq | tr '\\n' ';' | sed 's/;/, /g;s/,//' | fold -s" +) + +# In[13]: +# Utility to extract PR numbers only from multiple lines, useful to bundle all +# the docs changes for example: +import re + +s = """ + +[] Remove unnecessary dependency from macOS/Conda binaries (#8077) +[rocm] [ROCm] remove HCC references (#8070) +""" + +print(", ".join(re.findall("(#\\d+)", s))) diff --git a/scripts/release_notes/retrieve_prs_data.py b/scripts/release_notes/retrieve_prs_data.py new file mode 100644 index 0000000000000000000000000000000000000000..fb64902a6af07874622282b658b2c25c30927bb6 --- /dev/null +++ b/scripts/release_notes/retrieve_prs_data.py @@ -0,0 +1,212 @@ +import json +import locale +import os +import re +import subprocess +from collections import namedtuple +from os.path import expanduser + +import requests + + +Features = namedtuple( + "Features", + [ + "title", + "body", + "pr_number", + "files_changed", + "labels", + ], +) + + +def dict_to_features(dct): + return Features( + title=dct["title"], + body=dct["body"], + pr_number=dct["pr_number"], + files_changed=dct["files_changed"], + labels=dct["labels"], + ) + + +def features_to_dict(features): + return dict(features._asdict()) + + +def run(command): + """Returns (return-code, stdout, stderr)""" + p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) + output, err = p.communicate() + rc = p.returncode + enc = locale.getpreferredencoding() + output = output.decode(enc) + err = err.decode(enc) + return rc, output.strip(), err.strip() + + +def commit_body(commit_hash): + cmd = f"git log -n 1 --pretty=format:%b {commit_hash}" + ret, out, err = run(cmd) + return out if ret == 0 else None + + +def commit_title(commit_hash): + cmd = f"git log -n 1 --pretty=format:%s {commit_hash}" + ret, out, err = run(cmd) + return out if ret == 0 else None + + +def commit_files_changed(commit_hash): + cmd = f"git diff-tree --no-commit-id --name-only -r {commit_hash}" + ret, out, err = run(cmd) + return out.split("\n") if ret == 0 else None + + +def parse_pr_number(body, commit_hash, title): + regex = r"(#[0-9]+)" + matches = re.findall(regex, title) + if len(matches) == 0: + if "revert" not in title.lower() and "updating submodules" not in title.lower(): + print(f"[{commit_hash}: {title}] Could not parse PR number, ignoring PR") + return None + if len(matches) > 1: + print(f"[{commit_hash}: {title}] Got two PR numbers, using the last one") + return matches[-1][1:] + return matches[0][1:] + + +def get_ghstack_token(): + pattern = "github_oauth = (.*)" + with open(expanduser("~/.ghstackrc"), "r+") as f: + config = f.read() + matches = re.findall(pattern, config) + if len(matches) == 0: + raise RuntimeError("Can't find a github oauth token") + return matches[0] + + +token = get_ghstack_token() +headers = {"Authorization": f"token {token}"} + + +def run_query(query): + request = requests.post("https://api.github.com/graphql", json={"query": query}, headers=headers) + if request.status_code == 200: + return request.json() + else: + raise Exception(f"Query failed to run by returning code of {request.status_code}. {query}") + + +def gh_labels(pr_number): + query = f""" + {{ + repository(owner: "pytorch", name: "vision") {{ + pullRequest(number: {pr_number}) {{ + labels(first: 10) {{ + edges {{ + node {{ + name + }} + }} + }} + }} + }} + }} + """ + query = run_query(query) + edges = query["data"]["repository"]["pullRequest"]["labels"]["edges"] + return [edge["node"]["name"] for edge in edges] + + +def get_features(commit_hash, return_dict=False): + title, body, files_changed = ( + commit_title(commit_hash), + commit_body(commit_hash), + commit_files_changed(commit_hash), + ) + pr_number = parse_pr_number(body, commit_hash, title) + labels = [] + if pr_number is not None: + labels = gh_labels(pr_number) + result = Features(title, body, pr_number, files_changed, labels) + if return_dict: + return features_to_dict(result) + return result + + +class CommitDataCache: + def __init__(self, path="results/data.json"): + self.path = path + self.data = {} + if os.path.exists(path): + self.data = self.read_from_disk() + + def get(self, commit): + if commit not in self.data.keys(): + # Fetch and cache the data + self.data[commit] = get_features(commit) + self.write_to_disk() + return self.data[commit] + + def read_from_disk(self): + with open(self.path) as f: + data = json.load(f) + data = {commit: dict_to_features(dct) for commit, dct in data.items()} + return data + + def write_to_disk(self): + data = {commit: features._asdict() for commit, features in self.data.items()} + with open(self.path, "w") as f: + json.dump(data, f) + + +def get_commits_between(base_version, new_version): + cmd = f"git merge-base {base_version} {new_version}" + rc, merge_base, _ = run(cmd) + assert rc == 0 + + # Returns a list of something like + # b33e38ec47 Allow a higher-precision step type for Vec256::arange (#34555) + cmd = f"git log --reverse --oneline {merge_base}..{new_version}" + rc, commits, _ = run(cmd) + assert rc == 0 + + log_lines = commits.split("\n") + hashes, titles = zip(*[log_line.split(" ", 1) for log_line in log_lines]) + return hashes, titles + + +def convert_to_dataframes(feature_list): + import pandas as pd + + df = pd.DataFrame.from_records(feature_list, columns=Features._fields) + return df + + +def main(base_version, new_version): + hashes, titles = get_commits_between(base_version, new_version) + + cdc = CommitDataCache("data.json") + for idx, commit in enumerate(hashes): + if idx % 10 == 0: + print(f"{idx} / {len(hashes)}") + cdc.get(commit) + + return cdc + + +if __name__ == "__main__": + # d = get_features('2ab93592529243862ce8ad5b6acf2628ef8d0dc8') + # print(d) + # hashes, titles = get_commits_between("tags/v0.9.0", "fc852f3b39fe25dd8bf1dedee8f19ea04aa84c15") + + # Usage: change the tags below accordingly to the current release, then save the json with + # cdc.write_to_disk(). + # Then you can use classify_prs.py (as a notebook) + # to open the json and generate the release notes semi-automatically. + cdc = main("tags/v0.9.0", "fc852f3b39fe25dd8bf1dedee8f19ea04aa84c15") + from IPython import embed + + embed() diff --git a/setup.cfg b/setup.cfg index fd3b74c47de24b6348a4c3abd5f2d86224a4b748..0f4ddbfab10c11315a9de75f7dcc35cf7ddeae52 100644 --- a/setup.cfg +++ b/setup.cfg @@ -2,14 +2,21 @@ universal=1 [metadata] -license_file = LICENSE +license_files = LICENSE [pep8] max-line-length = 120 [flake8] +# note: we ignore all 501s (line too long) anyway as they're taken care of by black max-line-length = 120 -ignore = F401,E402,F403,W503,W504,F821 +ignore = E203, E402, W503, W504, F821, E501, B, C4, EXE +per-file-ignores = + __init__.py: F401, F403, F405 + ./hubconf.py: F401 + torchvision/models/mobilenet.py: F401, F403 + torchvision/models/quantization/mobilenet.py: F401, F403 + test/smoke_test.py: F401 exclude = venv [pydocstyle] diff --git a/setup.py b/setup.py index 4cc3d0698a471a15c7a7e9f8a816c2ec9bd28c47..c0c1050f7847b6d522a946d70e97b7980c746a29 100644 --- a/setup.py +++ b/setup.py @@ -1,24 +1,19 @@ -import os -import io -import sys -from setuptools import setup, find_packages -from pkg_resources import parse_version, get_distribution, DistributionNotFound -import subprocess import distutils.command.clean import distutils.spawn import glob +import os import shutil +import subprocess +import sys import torch -from torch.utils.cpp_extension import BuildExtension, CppExtension, CUDAExtension, CUDA_HOME -from torch.utils.hipify import hipify_python +from pkg_resources import DistributionNotFound, get_distribution, parse_version +from setuptools import find_packages, setup +from torch.utils.cpp_extension import BuildExtension, CppExtension, CUDA_HOME, CUDAExtension def read(*names, **kwargs): - with io.open( - os.path.join(os.path.dirname(__file__), *names), - encoding=kwargs.get("encoding", "utf8") - ) as fp: + with open(os.path.join(os.path.dirname(__file__), *names), encoding=kwargs.get("encoding", "utf8")) as fp: return fp.read() @@ -31,60 +26,61 @@ def get_dist(pkgname): cwd = os.path.dirname(os.path.abspath(__file__)) -version_txt = os.path.join(cwd, 'version.txt') -with open(version_txt, 'r') as f: +version_txt = os.path.join(cwd, "version.txt") +with open(version_txt) as f: version = f.readline().strip() -sha = 'Unknown' -package_name = 'torchvision' +sha = "Unknown" +package_name = "torchvision" try: - sha = subprocess.check_output(['git', 'rev-parse', 'HEAD'], cwd=cwd).decode('ascii').strip() + sha = subprocess.check_output(["git", "rev-parse", "HEAD"], cwd=cwd).decode("ascii").strip() except Exception: pass -if os.getenv('BUILD_VERSION'): - version = os.getenv('BUILD_VERSION') -elif sha != 'Unknown': - version += '+' + sha[:7] +if os.getenv("BUILD_VERSION"): + version = os.getenv("BUILD_VERSION") +elif sha != "Unknown": + version += "+" + sha[:7] def write_version_file(): - version_path = os.path.join(cwd, 'torchvision', 'version.py') - with open(version_path, 'w') as f: - f.write("__version__ = '{}'\n".format(version)) - f.write("git_version = {}\n".format(repr(sha))) + version_path = os.path.join(cwd, "torchvision", "version.py") + with open(version_path, "w") as f: + f.write(f"__version__ = '{version}'\n") + f.write(f"git_version = {repr(sha)}\n") f.write("from torchvision.extension import _check_cuda_version\n") f.write("if _check_cuda_version() > 0:\n") f.write(" cuda = _check_cuda_version()\n") -pytorch_dep = 'torch' -if os.getenv('PYTORCH_VERSION'): - pytorch_dep += "==" + os.getenv('PYTORCH_VERSION') +pytorch_dep = "torch" +if os.getenv("PYTORCH_VERSION"): + pytorch_dep += "==" + os.getenv("PYTORCH_VERSION") requirements = [ - 'numpy', + "numpy", pytorch_dep, ] -pillow_ver = ' >= 5.3.0' -pillow_req = 'pillow-simd' if get_dist('pillow-simd') is not None else 'pillow' +# Excluding 8.3.* because of https://github.com/pytorch/vision/issues/4934 +pillow_ver = " >= 5.3.0, !=8.3.*" +pillow_req = "pillow-simd" if get_dist("pillow-simd") is not None else "pillow" requirements.append(pillow_req + pillow_ver) def find_library(name, vision_include): this_dir = os.path.dirname(os.path.abspath(__file__)) - build_prefix = os.environ.get('BUILD_PREFIX', None) + build_prefix = os.environ.get("BUILD_PREFIX", None) is_conda_build = build_prefix is not None library_found = False conda_installed = False lib_folder = None include_folder = None - library_header = '{0}.h'.format(name) + library_header = f"{name}.h" # Lookup in TORCHVISION_INCLUDE or in the package file - package_path = [os.path.join(this_dir, 'torchvision')] + package_path = [os.path.join(this_dir, "torchvision")] for folder in vision_include + package_path: candidate_path = os.path.join(folder, library_header) library_found = os.path.exists(candidate_path) @@ -92,64 +88,89 @@ def find_library(name, vision_include): break if not library_found: - print('Running build on conda-build: {0}'.format(is_conda_build)) + print(f"Running build on conda-build: {is_conda_build}") if is_conda_build: # Add conda headers/libraries - if os.name == 'nt': - build_prefix = os.path.join(build_prefix, 'Library') - include_folder = os.path.join(build_prefix, 'include') - lib_folder = os.path.join(build_prefix, 'lib') - library_header_path = os.path.join( - include_folder, library_header) + if os.name == "nt": + build_prefix = os.path.join(build_prefix, "Library") + include_folder = os.path.join(build_prefix, "include") + lib_folder = os.path.join(build_prefix, "lib") + library_header_path = os.path.join(include_folder, library_header) library_found = os.path.isfile(library_header_path) conda_installed = library_found else: # Check if using Anaconda to produce wheels - conda = distutils.spawn.find_executable('conda') + conda = shutil.which("conda") is_conda = conda is not None - print('Running build on conda: {0}'.format(is_conda)) + print(f"Running build on conda: {is_conda}") if is_conda: python_executable = sys.executable py_folder = os.path.dirname(python_executable) - if os.name == 'nt': - env_path = os.path.join(py_folder, 'Library') + if os.name == "nt": + env_path = os.path.join(py_folder, "Library") else: env_path = os.path.dirname(py_folder) - lib_folder = os.path.join(env_path, 'lib') - include_folder = os.path.join(env_path, 'include') - library_header_path = os.path.join( - include_folder, library_header) + lib_folder = os.path.join(env_path, "lib") + include_folder = os.path.join(env_path, "include") + library_header_path = os.path.join(include_folder, library_header) library_found = os.path.isfile(library_header_path) conda_installed = library_found if not library_found: - if sys.platform == 'linux': - library_found = os.path.exists('/usr/include/{0}'.format( - library_header)) - library_found = library_found or os.path.exists( - '/usr/local/include/{0}'.format(library_header)) + if sys.platform == "linux": + library_found = os.path.exists(f"/usr/include/{library_header}") + library_found = library_found or os.path.exists(f"/usr/local/include/{library_header}") return library_found, conda_installed, include_folder, lib_folder def get_extensions(): this_dir = os.path.dirname(os.path.abspath(__file__)) - extensions_dir = os.path.join(this_dir, 'torchvision', 'csrc') + extensions_dir = os.path.join(this_dir, "torchvision", "csrc") - main_file = glob.glob(os.path.join(extensions_dir, '*.cpp')) + glob.glob(os.path.join(extensions_dir, 'ops', - '*.cpp')) + main_file = ( + glob.glob(os.path.join(extensions_dir, "*.cpp")) + + glob.glob(os.path.join(extensions_dir, "ops", "*.cpp")) + + glob.glob(os.path.join(extensions_dir, "ops", "autocast", "*.cpp")) + ) source_cpu = ( - glob.glob(os.path.join(extensions_dir, 'ops', 'autograd', '*.cpp')) + - glob.glob(os.path.join(extensions_dir, 'ops', 'cpu', '*.cpp')) + - glob.glob(os.path.join(extensions_dir, 'ops', 'quantized', 'cpu', '*.cpp')) + glob.glob(os.path.join(extensions_dir, "ops", "autograd", "*.cpp")) + + glob.glob(os.path.join(extensions_dir, "ops", "cpu", "*.cpp")) + + glob.glob(os.path.join(extensions_dir, "ops", "quantized", "cpu", "*.cpp")) ) + source_mps = glob.glob(os.path.join(extensions_dir, "ops", "mps", "*.mm")) + + print("Compiling extensions with following flags:") + force_cuda = os.getenv("FORCE_CUDA", "0") == "1" + print(f" FORCE_CUDA: {force_cuda}") + force_mps = os.getenv("FORCE_MPS", "0") == "1" + print(f" FORCE_MPS: {force_mps}") + debug_mode = os.getenv("DEBUG", "0") == "1" + print(f" DEBUG: {debug_mode}") + use_png = os.getenv("TORCHVISION_USE_PNG", "1") == "1" + print(f" TORCHVISION_USE_PNG: {use_png}") + use_jpeg = os.getenv("TORCHVISION_USE_JPEG", "1") == "1" + print(f" TORCHVISION_USE_JPEG: {use_jpeg}") + use_nvjpeg = os.getenv("TORCHVISION_USE_NVJPEG", "1") == "1" + print(f" TORCHVISION_USE_NVJPEG: {use_nvjpeg}") + use_ffmpeg = os.getenv("TORCHVISION_USE_FFMPEG", "1") == "1" + print(f" TORCHVISION_USE_FFMPEG: {use_ffmpeg}") + use_video_codec = os.getenv("TORCHVISION_USE_VIDEO_CODEC", "1") == "1" + print(f" TORCHVISION_USE_VIDEO_CODEC: {use_video_codec}") + + nvcc_flags = os.getenv("NVCC_FLAGS", "") + print(f" NVCC_FLAGS: {nvcc_flags}") is_rocm_pytorch = False - if torch.__version__ >= '1.5': + + if torch.__version__ >= "1.5": from torch.utils.cpp_extension import ROCM_HOME - is_rocm_pytorch = True if ((torch.version.hip is not None) and (ROCM_HOME is not None)) else False + + is_rocm_pytorch = (torch.version.hip is not None) and (ROCM_HOME is not None) if is_rocm_pytorch: + from torch.utils.hipify import hipify_python + hipify_python.hipify( project_directory=this_dir, output_directory=this_dir, @@ -157,68 +178,52 @@ def get_extensions(): show_detailed=True, is_pytorch_extension=True, ) - source_cuda = glob.glob(os.path.join(extensions_dir, 'ops', 'hip', '*.hip')) + source_cuda = glob.glob(os.path.join(extensions_dir, "ops", "hip", "*.hip")) # Copy over additional files for file in glob.glob(r"torchvision/csrc/ops/cuda/*.h"): shutil.copy(file, "torchvision/csrc/ops/hip") - else: - source_cuda = glob.glob(os.path.join(extensions_dir, 'ops', 'cuda', '*.cu')) - - source_cuda += glob.glob(os.path.join(extensions_dir, 'ops', 'autocast', '*.cpp')) + source_cuda = glob.glob(os.path.join(extensions_dir, "ops", "cuda", "*.cu")) sources = main_file + source_cpu extension = CppExtension - compile_cpp_tests = os.getenv('WITH_CPP_MODELS_TEST', '0') == '1' - if compile_cpp_tests: - test_dir = os.path.join(this_dir, 'test') - models_dir = os.path.join(this_dir, 'torchvision', 'csrc', 'models') - test_file = glob.glob(os.path.join(test_dir, '*.cpp')) - source_models = glob.glob(os.path.join(models_dir, '*.cpp')) - - test_file = [os.path.join(test_dir, s) for s in test_file] - source_models = [os.path.join(models_dir, s) for s in source_models] - tests = test_file + source_models - tests_include_dirs = [test_dir, models_dir] - define_macros = [] - extra_compile_args = {'cxx': []} - if (torch.cuda.is_available() and ((CUDA_HOME is not None) or is_rocm_pytorch)) \ - or os.getenv('FORCE_CUDA', '0') == '1': + extra_compile_args = {"cxx": []} + if (torch.cuda.is_available() and ((CUDA_HOME is not None) or is_rocm_pytorch)) or force_cuda: extension = CUDAExtension sources += source_cuda if not is_rocm_pytorch: - define_macros += [('WITH_CUDA', None)] - nvcc_flags = os.getenv('NVCC_FLAGS', '') - if nvcc_flags == '': + define_macros += [("WITH_CUDA", None)] + if nvcc_flags == "": nvcc_flags = [] else: - nvcc_flags = nvcc_flags.split(' ') + nvcc_flags = nvcc_flags.split(" ") else: - define_macros += [('WITH_HIP', None)] + define_macros += [("WITH_HIP", None)] nvcc_flags = [] extra_compile_args["nvcc"] = nvcc_flags + elif torch.backends.mps.is_available() or force_mps: + sources += source_mps - if sys.platform == 'win32': - define_macros += [('torchvision_EXPORTS', None)] + if sys.platform == "win32": + define_macros += [("torchvision_EXPORTS", None)] + extra_compile_args["cxx"].append("/MP") - extra_compile_args['cxx'].append('/MP') - - debug_mode = os.getenv('DEBUG', '0') == '1' if debug_mode: - print("Compile in debug mode") - extra_compile_args['cxx'].append("-g") - extra_compile_args['cxx'].append("-O0") + print("Compiling in debug mode") + extra_compile_args["cxx"].append("-g") + extra_compile_args["cxx"].append("-O0") if "nvcc" in extra_compile_args: # we have to remove "-OX" and "-g" flag if exists and append nvcc_flags = extra_compile_args["nvcc"] - extra_compile_args["nvcc"] = [ - f for f in nvcc_flags if not ("-O" in f or "-g" in f) - ] + extra_compile_args["nvcc"] = [f for f in nvcc_flags if not ("-O" in f or "-g" in f)] extra_compile_args["nvcc"].append("-O0") extra_compile_args["nvcc"].append("-g") + else: + print("Compiling with debug mode OFF") + extra_compile_args["cxx"].append("-g0") sources = [os.path.join(extensions_dir, s) for s in sources] @@ -226,31 +231,19 @@ def get_extensions(): ext_modules = [ extension( - 'torchvision._C', + "torchvision._C", sorted(sources), include_dirs=include_dirs, define_macros=define_macros, extra_compile_args=extra_compile_args, ) ] - if compile_cpp_tests: - ext_modules.append( - extension( - 'torchvision._C_tests', - tests, - include_dirs=tests_include_dirs, - define_macros=define_macros, - extra_compile_args=extra_compile_args, - ) - ) # ------------------- Torchvision extra extensions ------------------------ - vision_include = os.environ.get('TORCHVISION_INCLUDE', None) - vision_library = os.environ.get('TORCHVISION_LIBRARY', None) - vision_include = (vision_include.split(os.pathsep) - if vision_include is not None else []) - vision_library = (vision_library.split(os.pathsep) - if vision_library is not None else []) + vision_include = os.environ.get("TORCHVISION_INCLUDE", None) + vision_library = os.environ.get("TORCHVISION_LIBRARY", None) + vision_include = vision_include.split(os.pathsep) if vision_include is not None else [] + vision_library = vision_library.split(os.pathsep) if vision_library is not None else [] include_dirs += vision_include library_dirs = vision_library @@ -261,158 +254,181 @@ def get_extensions(): image_link_flags = [] # Locating libPNG - libpng = distutils.spawn.find_executable('libpng-config') - pngfix = distutils.spawn.find_executable('pngfix') + libpng = shutil.which("libpng-config") + pngfix = shutil.which("pngfix") png_found = libpng is not None or pngfix is not None - print('PNG found: {0}'.format(png_found)) - if png_found: + + use_png = use_png and png_found + if use_png: + print("Found PNG library") if libpng is not None: # Linux / Mac - png_version = subprocess.run([libpng, '--version'], - stdout=subprocess.PIPE) - png_version = png_version.stdout.strip().decode('utf-8') - print('libpng version: {0}'.format(png_version)) + min_version = "1.6.0" + png_version = subprocess.run([libpng, "--version"], stdout=subprocess.PIPE) + png_version = png_version.stdout.strip().decode("utf-8") png_version = parse_version(png_version) - if png_version >= parse_version("1.6.0"): - print('Building torchvision with PNG image support') - png_lib = subprocess.run([libpng, '--libdir'], - stdout=subprocess.PIPE) - png_lib = png_lib.stdout.strip().decode('utf-8') - if 'disabled' not in png_lib: + if png_version >= parse_version(min_version): + print("Building torchvision with PNG image support") + png_lib = subprocess.run([libpng, "--libdir"], stdout=subprocess.PIPE) + png_lib = png_lib.stdout.strip().decode("utf-8") + if "disabled" not in png_lib: image_library += [png_lib] - png_include = subprocess.run([libpng, '--I_opts'], - stdout=subprocess.PIPE) - png_include = png_include.stdout.strip().decode('utf-8') - _, png_include = png_include.split('-I') - print('libpng include path: {0}'.format(png_include)) + png_include = subprocess.run([libpng, "--I_opts"], stdout=subprocess.PIPE) + png_include = png_include.stdout.strip().decode("utf-8") + _, png_include = png_include.split("-I") image_include += [png_include] - image_link_flags.append('png') + image_link_flags.append("png") + print(f" libpng version: {png_version}") + print(f" libpng include path: {png_include}") else: - print('libpng installed version is less than 1.6.0, ' - 'disabling PNG support') - png_found = False + print("Could not add PNG image support to torchvision:") + print(f" libpng minimum version {min_version}, found {png_version}") + use_png = False else: # Windows - png_lib = os.path.join( - os.path.dirname(os.path.dirname(pngfix)), 'lib') - png_include = os.path.join(os.path.dirname( - os.path.dirname(pngfix)), 'include', 'libpng16') + png_lib = os.path.join(os.path.dirname(os.path.dirname(pngfix)), "lib") + png_include = os.path.join(os.path.dirname(os.path.dirname(pngfix)), "include", "libpng16") image_library += [png_lib] image_include += [png_include] - image_link_flags.append('libpng') + image_link_flags.append("libpng") + else: + print("Building torchvision without PNG image support") + image_macros += [("PNG_FOUND", str(int(use_png)))] # Locating libjpeg - (jpeg_found, jpeg_conda, - jpeg_include, jpeg_lib) = find_library('jpeglib', vision_include) - - print('JPEG found: {0}'.format(jpeg_found)) - image_macros += [('PNG_FOUND', str(int(png_found)))] - image_macros += [('JPEG_FOUND', str(int(jpeg_found)))] - if jpeg_found: - print('Building torchvision with JPEG image support') - image_link_flags.append('jpeg') + (jpeg_found, jpeg_conda, jpeg_include, jpeg_lib) = find_library("jpeglib", vision_include) + + use_jpeg = use_jpeg and jpeg_found + if use_jpeg: + print("Building torchvision with JPEG image support") + print(f" libjpeg include path: {jpeg_include}") + print(f" libjpeg lib path: {jpeg_lib}") + image_link_flags.append("jpeg") if jpeg_conda: image_library += [jpeg_lib] image_include += [jpeg_include] + else: + print("Building torchvision without JPEG image support") + image_macros += [("JPEG_FOUND", str(int(use_jpeg)))] # Locating nvjpeg # Should be included in CUDA_HOME for CUDA >= 10.1, which is the minimum version we have in the CI nvjpeg_found = ( - extension is CUDAExtension and - CUDA_HOME is not None and - os.path.exists(os.path.join(CUDA_HOME, 'include', 'nvjpeg.h')) + extension is CUDAExtension + and CUDA_HOME is not None + and os.path.exists(os.path.join(CUDA_HOME, "include", "nvjpeg.h")) ) - print('NVJPEG found: {0}'.format(nvjpeg_found)) - image_macros += [('NVJPEG_FOUND', str(int(nvjpeg_found)))] - if nvjpeg_found: - print('Building torchvision with NVJPEG image support') - image_link_flags.append('nvjpeg') + use_nvjpeg = use_nvjpeg and nvjpeg_found + if use_nvjpeg: + print("Building torchvision with NVJPEG image support") + image_link_flags.append("nvjpeg") + else: + print("Building torchvision without NVJPEG image support") + image_macros += [("NVJPEG_FOUND", str(int(use_nvjpeg)))] + + image_path = os.path.join(extensions_dir, "io", "image") + image_src = ( + glob.glob(os.path.join(image_path, "*.cpp")) + + glob.glob(os.path.join(image_path, "cpu", "*.cpp")) + + glob.glob(os.path.join(image_path, "cpu", "giflib", "*.c")) + ) - image_path = os.path.join(extensions_dir, 'io', 'image') - image_src = (glob.glob(os.path.join(image_path, '*.cpp')) + glob.glob(os.path.join(image_path, 'cpu', '*.cpp')) - + glob.glob(os.path.join(image_path, 'cuda', '*.cpp'))) + if is_rocm_pytorch: + image_src += glob.glob(os.path.join(image_path, "hip", "*.cpp")) + # we need to exclude this in favor of the hipified source + image_src.remove(os.path.join(image_path, "image.cpp")) + else: + image_src += glob.glob(os.path.join(image_path, "cuda", "*.cpp")) - if png_found or jpeg_found: - ext_modules.append(extension( - 'torchvision.image', + ext_modules.append( + extension( + "torchvision.image", image_src, include_dirs=image_include + include_dirs + [image_path], library_dirs=image_library + library_dirs, define_macros=image_macros, libraries=image_link_flags, - extra_compile_args=extra_compile_args - )) + extra_compile_args=extra_compile_args, + ) + ) - ffmpeg_exe = distutils.spawn.find_executable('ffmpeg') + # Locating ffmpeg + ffmpeg_exe = shutil.which("ffmpeg") has_ffmpeg = ffmpeg_exe is not None - print("FFmpeg found: {}".format(has_ffmpeg)) - + ffmpeg_version = None + # FIXME: Building torchvision with ffmpeg on MacOS or with Python 3.9 + # FIXME: causes crash. See the following GitHub issues for more details. + # FIXME: https://github.com/pytorch/pytorch/issues/65000 + # FIXME: https://github.com/pytorch/vision/issues/3367 + if sys.platform != "linux" or (sys.version_info.major == 3 and sys.version_info.minor == 9): + has_ffmpeg = False if has_ffmpeg: - ffmpeg_libraries = { - 'libavcodec', - 'libavformat', - 'libavutil', - 'libswresample', - 'libswscale' - } + try: + # This is to check if ffmpeg is installed properly. + ffmpeg_version = subprocess.check_output(["ffmpeg", "-version"]) + except subprocess.CalledProcessError: + print("Building torchvision without ffmpeg support") + print(" Error fetching ffmpeg version, ignoring ffmpeg.") + has_ffmpeg = False + + use_ffmpeg = use_ffmpeg and has_ffmpeg + + if use_ffmpeg: + ffmpeg_libraries = {"libavcodec", "libavformat", "libavutil", "libswresample", "libswscale"} ffmpeg_bin = os.path.dirname(ffmpeg_exe) ffmpeg_root = os.path.dirname(ffmpeg_bin) - ffmpeg_include_dir = os.path.join(ffmpeg_root, 'include') - ffmpeg_library_dir = os.path.join(ffmpeg_root, 'lib') + ffmpeg_include_dir = os.path.join(ffmpeg_root, "include") + ffmpeg_library_dir = os.path.join(ffmpeg_root, "lib") - gcc = distutils.spawn.find_executable('gcc') - platform_tag = subprocess.run( - [gcc, '-print-multiarch'], stdout=subprocess.PIPE) - platform_tag = platform_tag.stdout.strip().decode('utf-8') + gcc = os.environ.get("CC", shutil.which("gcc")) + platform_tag = subprocess.run([gcc, "-print-multiarch"], stdout=subprocess.PIPE) + platform_tag = platform_tag.stdout.strip().decode("utf-8") if platform_tag: # Most probably a Debian-based distribution - ffmpeg_include_dir = [ - ffmpeg_include_dir, - os.path.join(ffmpeg_include_dir, platform_tag) - ] - ffmpeg_library_dir = [ - ffmpeg_library_dir, - os.path.join(ffmpeg_library_dir, platform_tag) - ] + ffmpeg_include_dir = [ffmpeg_include_dir, os.path.join(ffmpeg_include_dir, platform_tag)] + ffmpeg_library_dir = [ffmpeg_library_dir, os.path.join(ffmpeg_library_dir, platform_tag)] else: ffmpeg_include_dir = [ffmpeg_include_dir] ffmpeg_library_dir = [ffmpeg_library_dir] - has_ffmpeg = True for library in ffmpeg_libraries: library_found = False for search_path in ffmpeg_include_dir + include_dirs: - full_path = os.path.join(search_path, library, '*.h') + full_path = os.path.join(search_path, library, "*.h") library_found |= len(glob.glob(full_path)) > 0 if not library_found: - print(f'{library} header files were not found, disabling ffmpeg support') - has_ffmpeg = False + print("Building torchvision without ffmpeg support") + print(f" {library} header files were not found, disabling ffmpeg support") + use_ffmpeg = False + else: + print("Building torchvision without ffmpeg support") - if has_ffmpeg: - print("ffmpeg include path: {}".format(ffmpeg_include_dir)) - print("ffmpeg library_dir: {}".format(ffmpeg_library_dir)) + if use_ffmpeg: + print("Building torchvision with ffmpeg support") + print(f" ffmpeg version: {ffmpeg_version}") + print(f" ffmpeg include path: {ffmpeg_include_dir}") + print(f" ffmpeg library_dir: {ffmpeg_library_dir}") # TorchVision base decoder + video reader - video_reader_src_dir = os.path.join(this_dir, 'torchvision', 'csrc', 'io', 'video_reader') + video_reader_src_dir = os.path.join(this_dir, "torchvision", "csrc", "io", "video_reader") video_reader_src = glob.glob(os.path.join(video_reader_src_dir, "*.cpp")) - base_decoder_src_dir = os.path.join(this_dir, 'torchvision', 'csrc', 'io', 'decoder') - base_decoder_src = glob.glob( - os.path.join(base_decoder_src_dir, "*.cpp")) + base_decoder_src_dir = os.path.join(this_dir, "torchvision", "csrc", "io", "decoder") + base_decoder_src = glob.glob(os.path.join(base_decoder_src_dir, "*.cpp")) # Torchvision video API - videoapi_src_dir = os.path.join(this_dir, 'torchvision', 'csrc', 'io', 'video') + videoapi_src_dir = os.path.join(this_dir, "torchvision", "csrc", "io", "video") videoapi_src = glob.glob(os.path.join(videoapi_src_dir, "*.cpp")) # exclude tests - base_decoder_src = [x for x in base_decoder_src if '_test.cpp' not in x] + base_decoder_src = [x for x in base_decoder_src if "_test.cpp" not in x] combined_src = video_reader_src + base_decoder_src + videoapi_src ext_modules.append( CppExtension( - 'torchvision.video_reader', + "torchvision.video_reader", combined_src, include_dirs=[ base_decoder_src_dir, @@ -420,29 +436,89 @@ def get_extensions(): videoapi_src_dir, extensions_dir, *ffmpeg_include_dir, - *include_dirs + *include_dirs, ], library_dirs=ffmpeg_library_dir + library_dirs, libraries=[ - 'avcodec', - 'avformat', - 'avutil', - 'swresample', - 'swscale', + "avcodec", + "avformat", + "avutil", + "swresample", + "swscale", + ], + extra_compile_args=["-std=c++17"] if os.name != "nt" else ["/std:c++17", "/MP"], + extra_link_args=["-std=c++17" if os.name != "nt" else "/std:c++17"], + ) + ) + + # Locating video codec + # CUDA_HOME should be set to the cuda root directory. + # TORCHVISION_INCLUDE and TORCHVISION_LIBRARY should include the location to + # video codec header files and libraries respectively. + video_codec_found = ( + extension is CUDAExtension + and CUDA_HOME is not None + and any([os.path.exists(os.path.join(folder, "cuviddec.h")) for folder in vision_include]) + and any([os.path.exists(os.path.join(folder, "nvcuvid.h")) for folder in vision_include]) + and any([os.path.exists(os.path.join(folder, "libnvcuvid.so")) for folder in library_dirs]) + ) + + use_video_codec = use_video_codec and video_codec_found + if ( + use_video_codec + and use_ffmpeg + and any([os.path.exists(os.path.join(folder, "libavcodec", "bsf.h")) for folder in ffmpeg_include_dir]) + ): + print("Building torchvision with video codec support") + gpu_decoder_path = os.path.join(extensions_dir, "io", "decoder", "gpu") + gpu_decoder_src = glob.glob(os.path.join(gpu_decoder_path, "*.cpp")) + cuda_libs = os.path.join(CUDA_HOME, "lib64") + cuda_inc = os.path.join(CUDA_HOME, "include") + + ext_modules.append( + extension( + "torchvision.Decoder", + gpu_decoder_src, + include_dirs=include_dirs + [gpu_decoder_path] + [cuda_inc] + ffmpeg_include_dir, + library_dirs=ffmpeg_library_dir + library_dirs + [cuda_libs], + libraries=[ + "avcodec", + "avformat", + "avutil", + "swresample", + "swscale", + "nvcuvid", + "cuda", + "cudart", + "z", + "pthread", + "dl", + "nppicc", ], - extra_compile_args=["-std=c++14"] if os.name != 'nt' else ['/std:c++14', '/MP'], - extra_link_args=["-std=c++14" if os.name != 'nt' else '/std:c++14'], + extra_compile_args=extra_compile_args, ) ) + else: + print("Building torchvision without video codec support") + if ( + use_video_codec + and use_ffmpeg + and not any([os.path.exists(os.path.join(folder, "libavcodec", "bsf.h")) for folder in ffmpeg_include_dir]) + ): + print( + " The installed version of ffmpeg is missing the header file 'bsf.h' which is " + " required for GPU video decoding. Please install the latest ffmpeg from conda-forge channel:" + " `conda install -c conda-forge ffmpeg`." + ) return ext_modules class clean(distutils.command.clean.clean): def run(self): - with open('.gitignore', 'r') as f: + with open(".gitignore") as f: ignores = f.read() - for wildcard in filter(None, ignores.split('\n')): + for wildcard in filter(None, ignores.split("\n")): for filename in glob.glob(wildcard): try: os.remove(filename) @@ -454,37 +530,37 @@ class clean(distutils.command.clean.clean): if __name__ == "__main__": - print("Building wheel {}-{}".format(package_name, version)) + print(f"Building wheel {package_name}-{version}") write_version_file() - with open('README.rst') as f: + with open("README.md") as f: readme = f.read() setup( # Metadata name=package_name, version=version, - author='PyTorch Core Team', - author_email='soumith@pytorch.org', - url='https://github.com/pytorch/vision', - description='image and video datasets and models for torch deep learning', + author="PyTorch Core Team", + author_email="soumith@pytorch.org", + url="https://github.com/pytorch/vision", + description="image and video datasets and models for torch deep learning", long_description=readme, - license='BSD', - + long_description_content_type="text/markdown", + license="BSD", # Package info - packages=find_packages(exclude=('test',)), - package_data={ - package_name: ['*.dll', '*.dylib', '*.so'] - }, + packages=find_packages(exclude=("test",)), + package_data={package_name: ["*.dll", "*.dylib", "*.so"]}, zip_safe=False, install_requires=requirements, extras_require={ + "gdown": ["gdown>=4.7.3"], "scipy": ["scipy"], }, ext_modules=get_extensions(), + python_requires=">=3.8", cmdclass={ - 'build_ext': BuildExtension.with_options(no_python_abi_suffix=True), - 'clean': clean, - } + "build_ext": BuildExtension.with_options(no_python_abi_suffix=True), + "clean": clean, + }, ) diff --git a/test/_assert_utils.py b/test/_assert_utils.py deleted file mode 100644 index e766e2df4b81dfaef6fe9671707ec07134428175..0000000000000000000000000000000000000000 --- a/test/_assert_utils.py +++ /dev/null @@ -1,11 +0,0 @@ -"""This is a temporary module and should be removed as soon as torch.testing.assert_equal is supported.""" -# TODO: remove this as soon torch.testing.assert_equal is supported - -import functools - -import torch.testing - -__all__ = ["assert_equal"] - - -assert_equal = functools.partial(torch.testing.assert_close, rtol=0, atol=0) diff --git a/test/assets/damaged_png/sigsegv.png b/test/assets/damaged_png/sigsegv.png new file mode 100644 index 0000000000000000000000000000000000000000..3ecff65ec609902e0a57d0b6134d0c05b763a9e2 Binary files /dev/null and b/test/assets/damaged_png/sigsegv.png differ diff --git a/test/assets/expected_flow.pt b/test/assets/expected_flow.pt new file mode 100644 index 0000000000000000000000000000000000000000..403784b1db170f700d0621ed6440db550c47836c Binary files /dev/null and b/test/assets/expected_flow.pt differ diff --git a/test/assets/fakedata/draw_boxes_util.png b/test/assets/fakedata/draw_boxes_util.png index d38f8be78ac72d8d9e3cfeb110bc141c78b645c6..ee5dac329e0407b8066f4295617b29e8933b3a19 100644 Binary files a/test/assets/fakedata/draw_boxes_util.png and b/test/assets/fakedata/draw_boxes_util.png differ diff --git a/test/assets/fakedata/draw_keypoint_vanilla.png b/test/assets/fakedata/draw_keypoint_vanilla.png new file mode 100644 index 0000000000000000000000000000000000000000..6cd6d943b6c02f9e439410a0a8f9a43081d216d5 Binary files /dev/null and b/test/assets/fakedata/draw_keypoint_vanilla.png differ diff --git a/test/assets/fakedata/draw_keypoints_visibility.png b/test/assets/fakedata/draw_keypoints_visibility.png new file mode 100644 index 0000000000000000000000000000000000000000..8cd34f84539c9b5a054274f21c176b0e2bd9ee60 Binary files /dev/null and b/test/assets/fakedata/draw_keypoints_visibility.png differ diff --git a/test/assets/fakedata/logos/rgb_pytorch16.png b/test/assets/fakedata/logos/rgb_pytorch16.png new file mode 100644 index 0000000000000000000000000000000000000000..b5e9e35d9899796c8e07c130365e0852398c0464 Binary files /dev/null and b/test/assets/fakedata/logos/rgb_pytorch16.png differ diff --git a/test/assets/fakedata/logos/rgbalpha_pytorch16.png b/test/assets/fakedata/logos/rgbalpha_pytorch16.png new file mode 100644 index 0000000000000000000000000000000000000000..df1db4d6354f26f9f3d0bd38c89070655a5eff7d Binary files /dev/null and b/test/assets/fakedata/logos/rgbalpha_pytorch16.png differ diff --git a/test/assets/interlaced_png/wizard_low-interlaced.png b/test/assets/interlaced_png/wizard_low-interlaced.png new file mode 100644 index 0000000000000000000000000000000000000000..3badd9264dc77f6f0b3f59cfeb1dd6e5da94b6f4 Binary files /dev/null and b/test/assets/interlaced_png/wizard_low-interlaced.png differ diff --git a/test/assets/interlaced_png/wizard_low.png b/test/assets/interlaced_png/wizard_low.png new file mode 100644 index 0000000000000000000000000000000000000000..7b1c264f030416228a999288cdae63322ad1464d Binary files /dev/null and b/test/assets/interlaced_png/wizard_low.png differ diff --git a/test/assets/labeled_image.png b/test/assets/labeled_image.png new file mode 100644 index 0000000000000000000000000000000000000000..9d163243773a824c6990aafd43acfddefc631a01 Binary files /dev/null and b/test/assets/labeled_image.png differ diff --git a/test/assets/masks.tiff b/test/assets/masks.tiff new file mode 100644 index 0000000000000000000000000000000000000000..7a8efc6dd0ee958b3ebf2733a0bfb32d39449478 Binary files /dev/null and b/test/assets/masks.tiff differ diff --git a/test/assets/toosmall_png/heapbof.png b/test/assets/toosmall_png/heapbof.png new file mode 100644 index 0000000000000000000000000000000000000000..e720d1833423d20f7df5a5bab5411956ed01a879 Binary files /dev/null and b/test/assets/toosmall_png/heapbof.png differ diff --git a/test/common_extended_utils.py b/test/common_extended_utils.py new file mode 100644 index 0000000000000000000000000000000000000000..a34e15629bba78961accaddc91be82e1ec08386c --- /dev/null +++ b/test/common_extended_utils.py @@ -0,0 +1,310 @@ +import os +from collections import defaultdict +from numbers import Number +from typing import Any, List + +import torch +from torch.utils._python_dispatch import TorchDispatchMode + +from torch.utils._pytree import tree_map + +from torchvision.models._api import Weights + +aten = torch.ops.aten +quantized = torch.ops.quantized + + +def get_shape(i): + if isinstance(i, torch.Tensor): + return i.shape + elif hasattr(i, "weight"): + return i.weight().shape + else: + raise ValueError(f"Unknown type {type(i)}") + + +def prod(x): + res = 1 + for i in x: + res *= i + return res + + +def matmul_flop(inputs: List[Any], outputs: List[Any]) -> Number: + """ + Count flops for matmul. + """ + # Inputs should be a list of length 2. + # Inputs contains the shapes of two matrices. + input_shapes = [get_shape(v) for v in inputs] + assert len(input_shapes) == 2, input_shapes + assert input_shapes[0][-1] == input_shapes[1][-2], input_shapes + flop = prod(input_shapes[0]) * input_shapes[-1][-1] + return flop + + +def addmm_flop(inputs: List[Any], outputs: List[Any]) -> Number: + """ + Count flops for fully connected layers. + """ + # Count flop for nn.Linear + # inputs is a list of length 3. + input_shapes = [get_shape(v) for v in inputs[1:3]] + # input_shapes[0]: [batch size, input feature dimension] + # input_shapes[1]: [batch size, output feature dimension] + assert len(input_shapes[0]) == 2, input_shapes[0] + assert len(input_shapes[1]) == 2, input_shapes[1] + batch_size, input_dim = input_shapes[0] + output_dim = input_shapes[1][1] + flops = batch_size * input_dim * output_dim + return flops + + +def bmm_flop(inputs: List[Any], outputs: List[Any]) -> Number: + """ + Count flops for the bmm operation. + """ + # Inputs should be a list of length 2. + # Inputs contains the shapes of two tensor. + assert len(inputs) == 2, len(inputs) + input_shapes = [get_shape(v) for v in inputs] + n, c, t = input_shapes[0] + d = input_shapes[-1][-1] + flop = n * c * t * d + return flop + + +def conv_flop_count( + x_shape: List[int], + w_shape: List[int], + out_shape: List[int], + transposed: bool = False, +) -> Number: + """ + Count flops for convolution. Note only multiplication is + counted. Computation for addition and bias is ignored. + Flops for a transposed convolution are calculated as + flops = (x_shape[2:] * prod(w_shape) * batch_size). + Args: + x_shape (list(int)): The input shape before convolution. + w_shape (list(int)): The filter shape. + out_shape (list(int)): The output shape after convolution. + transposed (bool): is the convolution transposed + Returns: + int: the number of flops + """ + batch_size = x_shape[0] + conv_shape = (x_shape if transposed else out_shape)[2:] + flop = batch_size * prod(w_shape) * prod(conv_shape) + return flop + + +def conv_flop(inputs: List[Any], outputs: List[Any]): + """ + Count flops for convolution. + """ + x, w = inputs[:2] + x_shape, w_shape, out_shape = (get_shape(x), get_shape(w), get_shape(outputs[0])) + transposed = inputs[6] + + return conv_flop_count(x_shape, w_shape, out_shape, transposed=transposed) + + +def quant_conv_flop(inputs: List[Any], outputs: List[Any]): + """ + Count flops for quantized convolution. + """ + x, w = inputs[:2] + x_shape, w_shape, out_shape = (get_shape(x), get_shape(w), get_shape(outputs[0])) + + return conv_flop_count(x_shape, w_shape, out_shape, transposed=False) + + +def transpose_shape(shape): + return [shape[1], shape[0]] + list(shape[2:]) + + +def conv_backward_flop(inputs: List[Any], outputs: List[Any]): + grad_out_shape, x_shape, w_shape = [get_shape(i) for i in inputs[:3]] + output_mask = inputs[-1] + fwd_transposed = inputs[7] + flop_count = 0 + + if output_mask[0]: + grad_input_shape = get_shape(outputs[0]) + flop_count += conv_flop_count(grad_out_shape, w_shape, grad_input_shape, not fwd_transposed) + if output_mask[1]: + grad_weight_shape = get_shape(outputs[1]) + flop_count += conv_flop_count(transpose_shape(x_shape), grad_out_shape, grad_weight_shape, fwd_transposed) + + return flop_count + + +def scaled_dot_product_flash_attention_flop(inputs: List[Any], outputs: List[Any]): + # FIXME: this needs to count the flops of this kernel + # https://github.com/pytorch/pytorch/blob/207b06d099def9d9476176a1842e88636c1f714f/aten/src/ATen/native/cpu/FlashAttentionKernel.cpp#L52-L267 + return 0 + + +flop_mapping = { + aten.mm: matmul_flop, + aten.matmul: matmul_flop, + aten.addmm: addmm_flop, + aten.bmm: bmm_flop, + aten.convolution: conv_flop, + aten._convolution: conv_flop, + aten.convolution_backward: conv_backward_flop, + quantized.conv2d: quant_conv_flop, + quantized.conv2d_relu: quant_conv_flop, + aten._scaled_dot_product_flash_attention: scaled_dot_product_flash_attention_flop, +} + +unmapped_ops = set() + + +def normalize_tuple(x): + if not isinstance(x, tuple): + return (x,) + return x + + +class FlopCounterMode(TorchDispatchMode): + def __init__(self, model=None): + self.flop_counts = defaultdict(lambda: defaultdict(int)) + self.parents = ["Global"] + # global mod + if model is not None: + for name, module in dict(model.named_children()).items(): + module.register_forward_pre_hook(self.enter_module(name)) + module.register_forward_hook(self.exit_module(name)) + + def enter_module(self, name): + def f(module, inputs): + self.parents.append(name) + inputs = normalize_tuple(inputs) + out = self.create_backwards_pop(name)(*inputs) + return out + + return f + + def exit_module(self, name): + def f(module, inputs, outputs): + assert self.parents[-1] == name + self.parents.pop() + outputs = normalize_tuple(outputs) + return self.create_backwards_push(name)(*outputs) + + return f + + def create_backwards_push(self, name): + class PushState(torch.autograd.Function): + @staticmethod + def forward(ctx, *args): + args = tree_map(lambda x: x.clone() if isinstance(x, torch.Tensor) else x, args) + if len(args) == 1: + return args[0] + return args + + @staticmethod + def backward(ctx, *grad_outs): + self.parents.append(name) + return grad_outs + + return PushState.apply + + def create_backwards_pop(self, name): + class PopState(torch.autograd.Function): + @staticmethod + def forward(ctx, *args): + args = tree_map(lambda x: x.clone() if isinstance(x, torch.Tensor) else x, args) + if len(args) == 1: + return args[0] + return args + + @staticmethod + def backward(ctx, *grad_outs): + assert self.parents[-1] == name + self.parents.pop() + return grad_outs + + return PopState.apply + + def __enter__(self): + self.flop_counts.clear() + super().__enter__() + + def __exit__(self, *args): + # print(f"Total: {sum(self.flop_counts['Global'].values()) / 1e9} GFLOPS") + # for mod in self.flop_counts.keys(): + # print(f"Module: ", mod) + # for k, v in self.flop_counts[mod].items(): + # print(f"{k}: {v / 1e9} GFLOPS") + # print() + super().__exit__(*args) + + def __torch_dispatch__(self, func, types, args=(), kwargs=None): + kwargs = kwargs if kwargs else {} + + out = func(*args, **kwargs) + func_packet = func._overloadpacket + if func_packet in flop_mapping: + flop_count = flop_mapping[func_packet](args, normalize_tuple(out)) + for par in self.parents: + self.flop_counts[par][func_packet] += flop_count + else: + unmapped_ops.add(func_packet) + + return out + + def get_flops(self): + return sum(self.flop_counts["Global"].values()) / 1e9 + + +def get_dims(module_name, height, width): + # detection models have curated input sizes + if module_name == "detection": + # we can feed a batch of 1 for detection model instead of a list of 1 image + dims = (3, height, width) + elif module_name == "video": + # hard-coding the time dimension to size 16 + dims = (1, 16, 3, height, width) + else: + dims = (1, 3, height, width) + + return dims + + +def get_ops(model: torch.nn.Module, weight: Weights, height=512, width=512): + module_name = model.__module__.split(".")[-2] + dims = get_dims(module_name=module_name, height=height, width=width) + + input_tensor = torch.randn(dims) + + # try: + preprocess = weight.transforms() + if module_name == "optical_flow": + inp = preprocess(input_tensor, input_tensor) + else: + # hack to enable mod(*inp) for optical_flow models + inp = [preprocess(input_tensor)] + + model.eval() + + flop_counter = FlopCounterMode(model) + with flop_counter: + # detection models expect a list of 3d tensors as inputs + if module_name == "detection": + model(inp) + else: + model(*inp) + + flops = flop_counter.get_flops() + + return round(flops, 3) + + +def get_file_size_mb(weight): + weights_path = os.path.join(os.getenv("HOME"), ".cache/torch/hub/checkpoints", weight.url.split("/")[-1]) + weights_size_mb = os.path.getsize(weights_path) / 1024 / 1024 + + return round(weights_size_mb, 3) diff --git a/test/common_utils.py b/test/common_utils.py index 44c4a1fca77a9d569bfdb18acf4dbde72f5327d8..99c7931587d9aa0ae0445c58bb1acf48f7dffa8c 100644 --- a/test/common_utils.py +++ b/test/common_utils.py @@ -1,34 +1,35 @@ +import contextlib +import functools +import itertools import os +import pathlib +import random +import re import shutil -import tempfile -import contextlib -import unittest -import argparse import sys -import io -import torch +import tempfile import warnings -import __main__ -import random -import inspect - -from numbers import Number -from torch._six import string_classes -from collections import OrderedDict -from _utils_internal import get_relative_path +from subprocess import CalledProcessError, check_output, STDOUT import numpy as np +import PIL.Image +import pytest +import torch +import torch.testing from PIL import Image -from _assert_utils import assert_equal +from torch.testing._comparison import BooleanPair, NonePair, not_close_error_metas, NumberPair, TensorLikePair +from torchvision import io, tv_tensors +from torchvision.transforms._functional_tensor import _max_value as get_max_value +from torchvision.transforms.v2.functional import to_image, to_pil_image -IS_PY39 = sys.version_info.major == 3 and sys.version_info.minor == 9 -PY39_SEGFAULT_SKIP_MSG = "Segmentation fault with Python 3.9, see https://github.com/pytorch/vision/issues/3367" -PY39_SKIP = unittest.skipIf(IS_PY39, PY39_SEGFAULT_SKIP_MSG) -IN_CIRCLE_CI = os.getenv("CIRCLECI", False) == 'true' + +IN_OSS_CI = any(os.getenv(var) == "true" for var in ["CIRCLECI", "GITHUB_ACTIONS"]) IN_RE_WORKER = os.environ.get("INSIDE_RE_WORKER") is not None IN_FBCODE = os.environ.get("IN_FBCODE_TORCHVISION") == "1" -CUDA_NOT_AVAILABLE_MSG = 'CUDA device not available' +CUDA_NOT_AVAILABLE_MSG = "CUDA device not available" +MPS_NOT_AVAILABLE_MSG = "MPS device not available" +OSS_CI_GPU_NO_CUDA_MSG = "We're in an OSS GPU machine, and this test doesn't need cuda." @contextlib.contextmanager @@ -46,14 +47,9 @@ def get_tmp_dir(src=None, **kwargs): def set_rng_seed(seed): torch.manual_seed(seed) random.seed(seed) - np.random.seed(seed) - -ACCEPT = os.getenv('EXPECTTEST_ACCEPT', '0') == '1' -TEST_WITH_SLOW = os.getenv('PYTORCH_TEST_WITH_SLOW', '0') == '1' - -class MapNestedTensorObjectImpl(object): +class MapNestedTensorObjectImpl: def __init__(self, tensor_map_fn): self.tensor_map_fn = tensor_map_fn @@ -90,230 +86,6 @@ def is_iterable(obj): return False -# adapted from TestCase in torch/test/common_utils to accept non-string -# inputs and set maximum binary size -class TestCase(unittest.TestCase): - precision = 1e-5 - - def _get_expected_file(self, name=None): - # NB: we take __file__ from the module that defined the test - # class, so we place the expect directory where the test script - # lives, NOT where test/common_utils.py lives. - module_id = self.__class__.__module__ - - # Determine expected file based on environment - expected_file_base = get_relative_path( - os.path.realpath(sys.modules[module_id].__file__), - "expect") - - # Note: for legacy reasons, the reference file names all had "ModelTest.test_" in their names - # We hardcode it here to avoid having to re-generate the reference files - expected_file = expected_file = os.path.join(expected_file_base, 'ModelTester.test_' + name) - expected_file += "_expect.pkl" - - if not ACCEPT and not os.path.exists(expected_file): - raise RuntimeError( - f"No expect file exists for {os.path.basename(expected_file)} in {expected_file}; " - "to accept the current output, re-run the failing test after setting the EXPECTTEST_ACCEPT " - "env variable. For example: EXPECTTEST_ACCEPT=1 pytest test/test_models.py -k alexnet" - ) - - return expected_file - - def assertExpected(self, output, name, prec=None): - r""" - Test that a python value matches the recorded contents of a file - based on a "check" name. The value must be - pickable with `torch.save`. This file - is placed in the 'expect' directory in the same directory - as the test script. You can automatically update the recorded test - output using an EXPECTTEST_ACCEPT=1 env variable. - """ - expected_file = self._get_expected_file(name) - - if ACCEPT: - filename = {os.path.basename(expected_file)} - print("Accepting updated output for {}:\n\n{}".format(filename, output)) - torch.save(output, expected_file) - MAX_PICKLE_SIZE = 50 * 1000 # 50 KB - binary_size = os.path.getsize(expected_file) - if binary_size > MAX_PICKLE_SIZE: - raise RuntimeError("The output for {}, is larger than 50kb".format(filename)) - else: - expected = torch.load(expected_file) - rtol = atol = prec or self.precision - torch.testing.assert_close(output, expected, rtol=rtol, atol=atol, check_dtype=False) - - def assertEqual(self, x, y, prec=None, message='', allow_inf=False): - """ - This is copied from pytorch/test/common_utils.py's TestCase.assertEqual - """ - if isinstance(prec, str) and message == '': - message = prec - prec = None - if prec is None: - prec = self.precision - - if isinstance(x, torch.Tensor) and isinstance(y, Number): - self.assertEqual(x.item(), y, prec=prec, message=message, - allow_inf=allow_inf) - elif isinstance(y, torch.Tensor) and isinstance(x, Number): - self.assertEqual(x, y.item(), prec=prec, message=message, - allow_inf=allow_inf) - elif isinstance(x, torch.Tensor) and isinstance(y, torch.Tensor): - def assertTensorsEqual(a, b): - super(TestCase, self).assertEqual(a.size(), b.size(), message) - if a.numel() > 0: - if (a.device.type == 'cpu' and (a.dtype == torch.float16 or a.dtype == torch.bfloat16)): - # CPU half and bfloat16 tensors don't have the methods we need below - a = a.to(torch.float32) - b = b.to(a) - - if (a.dtype == torch.bool) != (b.dtype == torch.bool): - raise TypeError("Was expecting both tensors to be bool type.") - else: - if a.dtype == torch.bool and b.dtype == torch.bool: - # we want to respect precision but as bool doesn't support substraction, - # boolean tensor has to be converted to int - a = a.to(torch.int) - b = b.to(torch.int) - - diff = a - b - if a.is_floating_point(): - # check that NaNs are in the same locations - nan_mask = torch.isnan(a) - self.assertTrue(torch.equal(nan_mask, torch.isnan(b)), message) - diff[nan_mask] = 0 - # inf check if allow_inf=True - if allow_inf: - inf_mask = torch.isinf(a) - inf_sign = inf_mask.sign() - self.assertTrue(torch.equal(inf_sign, torch.isinf(b).sign()), message) - diff[inf_mask] = 0 - # TODO: implement abs on CharTensor (int8) - if diff.is_signed() and diff.dtype != torch.int8: - diff = diff.abs() - max_err = diff.max() - tolerance = prec + prec * abs(a.max()) - self.assertLessEqual(max_err, tolerance, message) - super(TestCase, self).assertEqual(x.is_sparse, y.is_sparse, message) - super(TestCase, self).assertEqual(x.is_quantized, y.is_quantized, message) - if x.is_sparse: - x = self.safeCoalesce(x) - y = self.safeCoalesce(y) - assertTensorsEqual(x._indices(), y._indices()) - assertTensorsEqual(x._values(), y._values()) - elif x.is_quantized and y.is_quantized: - self.assertEqual(x.qscheme(), y.qscheme(), prec=prec, - message=message, allow_inf=allow_inf) - if x.qscheme() == torch.per_tensor_affine: - self.assertEqual(x.q_scale(), y.q_scale(), prec=prec, - message=message, allow_inf=allow_inf) - self.assertEqual(x.q_zero_point(), y.q_zero_point(), - prec=prec, message=message, - allow_inf=allow_inf) - elif x.qscheme() == torch.per_channel_affine: - self.assertEqual(x.q_per_channel_scales(), y.q_per_channel_scales(), prec=prec, - message=message, allow_inf=allow_inf) - self.assertEqual(x.q_per_channel_zero_points(), y.q_per_channel_zero_points(), - prec=prec, message=message, - allow_inf=allow_inf) - self.assertEqual(x.q_per_channel_axis(), y.q_per_channel_axis(), - prec=prec, message=message) - self.assertEqual(x.dtype, y.dtype) - self.assertEqual(x.int_repr().to(torch.int32), - y.int_repr().to(torch.int32), prec=prec, - message=message, allow_inf=allow_inf) - else: - assertTensorsEqual(x, y) - elif isinstance(x, string_classes) and isinstance(y, string_classes): - super(TestCase, self).assertEqual(x, y, message) - elif type(x) == set and type(y) == set: - super(TestCase, self).assertEqual(x, y, message) - elif isinstance(x, dict) and isinstance(y, dict): - if isinstance(x, OrderedDict) and isinstance(y, OrderedDict): - self.assertEqual(x.items(), y.items(), prec=prec, - message=message, allow_inf=allow_inf) - else: - self.assertEqual(set(x.keys()), set(y.keys()), prec=prec, - message=message, allow_inf=allow_inf) - key_list = list(x.keys()) - self.assertEqual([x[k] for k in key_list], - [y[k] for k in key_list], - prec=prec, message=message, - allow_inf=allow_inf) - elif is_iterable(x) and is_iterable(y): - super(TestCase, self).assertEqual(len(x), len(y), message) - for x_, y_ in zip(x, y): - self.assertEqual(x_, y_, prec=prec, message=message, - allow_inf=allow_inf) - elif isinstance(x, bool) and isinstance(y, bool): - super(TestCase, self).assertEqual(x, y, message) - elif isinstance(x, Number) and isinstance(y, Number): - inf = float("inf") - if abs(x) == inf or abs(y) == inf: - if allow_inf: - super(TestCase, self).assertEqual(x, y, message) - else: - self.fail("Expected finite numeric values - x={}, y={}".format(x, y)) - return - super(TestCase, self).assertLessEqual(abs(x - y), prec, message) - else: - super(TestCase, self).assertEqual(x, y, message) - - def check_jit_scriptable(self, nn_module, args, unwrapper=None, skip=False): - """ - Check that a nn.Module's results in TorchScript match eager and that it - can be exported - """ - if not TEST_WITH_SLOW or skip: - # TorchScript is not enabled, skip these tests - msg = "The check_jit_scriptable test for {} was skipped. " \ - "This test checks if the module's results in TorchScript " \ - "match eager and that it can be exported. To run these " \ - "tests make sure you set the environment variable " \ - "PYTORCH_TEST_WITH_SLOW=1 and that the test is not " \ - "manually skipped.".format(nn_module.__class__.__name__) - warnings.warn(msg, RuntimeWarning) - return None - - sm = torch.jit.script(nn_module) - - with freeze_rng_state(): - eager_out = nn_module(*args) - - with freeze_rng_state(): - script_out = sm(*args) - if unwrapper: - script_out = unwrapper(script_out) - - self.assertEqual(eager_out, script_out, prec=1e-4) - self.assertExportImportModule(sm, args) - - return sm - - def getExportImportCopy(self, m): - """ - Save and load a TorchScript model - """ - buffer = io.BytesIO() - torch.jit.save(m, buffer) - buffer.seek(0) - imported = torch.jit.load(buffer) - return imported - - def assertExportImportModule(self, m, args): - """ - Check that the results of a model are the same after saving and loading - """ - m_import = self.getExportImportCopy(m) - with freeze_rng_state(): - results = m(*args) - with freeze_rng_state(): - results_from_imported = m_import(*args) - self.assertEqual(results, results_from_imported, prec=3e-5) - - @contextlib.contextmanager def freeze_rng_state(): rng_state = torch.get_rng_state() @@ -325,65 +97,18 @@ def freeze_rng_state(): torch.set_rng_state(rng_state) -class TransformsTester(unittest.TestCase): - - def _create_data(self, height=3, width=3, channels=3, device="cpu"): - tensor = torch.randint(0, 256, (channels, height, width), dtype=torch.uint8, device=device) - pil_img = Image.fromarray(tensor.permute(1, 2, 0).contiguous().cpu().numpy()) - return tensor, pil_img - - def _create_data_batch(self, height=3, width=3, channels=3, num_samples=4, device="cpu"): - batch_tensor = torch.randint( - 0, 256, - (num_samples, channels, height, width), - dtype=torch.uint8, - device=device - ) - return batch_tensor - - def compareTensorToPIL(self, tensor, pil_image, msg=None): - np_pil_image = np.array(pil_image) - if np_pil_image.ndim == 2: - np_pil_image = np_pil_image[:, :, None] - pil_tensor = torch.as_tensor(np_pil_image.transpose((2, 0, 1))) - if msg is None: - msg = "tensor:\n{} \ndid not equal PIL tensor:\n{}".format(tensor, pil_tensor) - assert_equal(tensor.cpu(), pil_tensor, check_stride=False, msg=msg) - - def approxEqualTensorToPIL(self, tensor, pil_image, tol=1e-5, msg=None, agg_method="mean", - allowed_percentage_diff=None): - np_pil_image = np.array(pil_image) - if np_pil_image.ndim == 2: - np_pil_image = np_pil_image[:, :, None] - pil_tensor = torch.as_tensor(np_pil_image.transpose((2, 0, 1))).to(tensor) - - if allowed_percentage_diff is not None: - # Assert that less than a given %age of pixels are different - self.assertTrue( - (tensor != pil_tensor).to(torch.float).mean() <= allowed_percentage_diff - ) - # error value can be mean absolute error, max abs error - # Convert to float to avoid underflow when computing absolute difference - tensor = tensor.to(torch.float) - pil_tensor = pil_tensor.to(torch.float) - err = getattr(torch, agg_method)(torch.abs(tensor - pil_tensor)).item() - self.assertTrue( - err < tol, - msg="{}: err={}, tol={}: \n{}\nvs\n{}".format(msg, err, tol, tensor[0, :10, :10], pil_tensor[0, :10, :10]) - ) - - def cycle_over(objs): - for idx, obj in enumerate(objs): - yield obj, objs[:idx] + objs[idx + 1:] + for idx, obj1 in enumerate(objs): + for obj2 in objs[:idx] + objs[idx + 1 :]: + yield obj1, obj2 def int_dtypes(): - return torch.testing.integral_types() + return (torch.uint8, torch.int8, torch.int16, torch.int32, torch.int64) def float_dtypes(): - return torch.testing.floating_types() + return (torch.float32, torch.float64) @contextlib.contextmanager @@ -394,66 +119,401 @@ def disable_console_output(): yield -def call_args_to_kwargs_only(call_args, *callable_or_arg_names): - callable_or_arg_name = callable_or_arg_names[0] - if callable(callable_or_arg_name): - argspec = inspect.getfullargspec(callable_or_arg_name) - arg_names = argspec.args - if isinstance(callable_or_arg_name, type): - # remove self - arg_names.pop(0) - else: - arg_names = callable_or_arg_names +def cpu_and_cuda(): + import pytest # noqa + + return ("cpu", pytest.param("cuda", marks=pytest.mark.needs_cuda)) - args, kwargs = call_args - kwargs_only = kwargs.copy() - kwargs_only.update(dict(zip(arg_names, args))) - return kwargs_only +def cpu_and_cuda_and_mps(): + return cpu_and_cuda() + (pytest.param("mps", marks=pytest.mark.needs_mps),) -def cpu_and_gpu(): - # TODO: make this properly handle CircleCI + +def needs_cuda(test_func): import pytest # noqa - # ignore CPU tests in RE as they're already covered by another contbuild - devices = [] if IN_RE_WORKER else ['cpu'] + return pytest.mark.needs_cuda(test_func) - if torch.cuda.is_available(): - cuda_marks = () - elif IN_FBCODE: - # Dont collect cuda tests on fbcode if the machine doesnt have a GPU - # This avoids skipping the tests. More robust would be to detect if - # we're in sancastle instead of fbcode? - cuda_marks = pytest.mark.dont_collect() - else: - cuda_marks = pytest.mark.skip(reason=CUDA_NOT_AVAILABLE_MSG) - devices.append(pytest.param('cuda', marks=cuda_marks)) +def needs_mps(test_func): + import pytest # noqa - return devices + return pytest.mark.needs_mps(test_func) -def needs_cuda(test_func): - # TODO: make this properly handle CircleCI - import pytest # noqa +def _create_data(height=3, width=3, channels=3, device="cpu"): + # TODO: When all relevant tests are ported to pytest, turn this into a module-level fixture + tensor = torch.randint(0, 256, (channels, height, width), dtype=torch.uint8, device=device) + data = tensor.permute(1, 2, 0).contiguous().cpu().numpy() + mode = "RGB" + if channels == 1: + mode = "L" + data = data[..., 0] + pil_img = Image.fromarray(data, mode=mode) + return tensor, pil_img - if IN_FBCODE and not IN_RE_WORKER: - # We don't want to skip in fbcode, so we just don't collect - # TODO: slightly more robust way would be to detect if we're in a sandcastle instance - # so that the test will still be collected (and skipped) in the devvms. - return pytest.mark.dont_collect(test_func) - elif torch.cuda.is_available(): - return test_func - else: - return pytest.mark.skip(reason=CUDA_NOT_AVAILABLE_MSG)(test_func) +def _create_data_batch(height=3, width=3, channels=3, num_samples=4, device="cpu"): + # TODO: When all relevant tests are ported to pytest, turn this into a module-level fixture + batch_tensor = torch.randint(0, 256, (num_samples, channels, height, width), dtype=torch.uint8, device=device) + return batch_tensor -def cpu_only(test_func): - # TODO: make this properly handle CircleCI - import pytest # noqa - if IN_RE_WORKER: - # The assumption is that all RE workers have GPUs. - return pytest.mark.dont_collect(test_func) +def get_list_of_videos(tmpdir, num_videos=5, sizes=None, fps=None): + names = [] + for i in range(num_videos): + if sizes is None: + size = 5 * (i + 1) + else: + size = sizes[i] + if fps is None: + f = 5 + else: + f = fps[i] + data = torch.randint(0, 256, (size, 300, 400, 3), dtype=torch.uint8) + name = os.path.join(tmpdir, f"{i}.mp4") + names.append(name) + io.write_video(name, data, fps=f) + + return names + + +def _assert_equal_tensor_to_pil(tensor, pil_image, msg=None): + # FIXME: this is handled automatically by `assert_equal` below. Let's remove this in favor of it + np_pil_image = np.array(pil_image) + if np_pil_image.ndim == 2: + np_pil_image = np_pil_image[:, :, None] + pil_tensor = torch.as_tensor(np_pil_image.transpose((2, 0, 1))) + if msg is None: + msg = f"tensor:\n{tensor} \ndid not equal PIL tensor:\n{pil_tensor}" + assert_equal(tensor.cpu(), pil_tensor, msg=msg) + + +def _assert_approx_equal_tensor_to_pil( + tensor, pil_image, tol=1e-5, msg=None, agg_method="mean", allowed_percentage_diff=None +): + # FIXME: this is handled automatically by `assert_close` below. Let's remove this in favor of it + # TODO: we could just merge this into _assert_equal_tensor_to_pil + np_pil_image = np.array(pil_image) + if np_pil_image.ndim == 2: + np_pil_image = np_pil_image[:, :, None] + pil_tensor = torch.as_tensor(np_pil_image.transpose((2, 0, 1))).to(tensor) + + if allowed_percentage_diff is not None: + # Assert that less than a given %age of pixels are different + assert (tensor != pil_tensor).to(torch.float).mean() <= allowed_percentage_diff + + # error value can be mean absolute error, max abs error + # Convert to float to avoid underflow when computing absolute difference + tensor = tensor.to(torch.float) + pil_tensor = pil_tensor.to(torch.float) + err = getattr(torch, agg_method)(torch.abs(tensor - pil_tensor)).item() + assert err < tol, f"{err} vs {tol}" + + +def _test_fn_on_batch(batch_tensors, fn, scripted_fn_atol=1e-8, **fn_kwargs): + transformed_batch = fn(batch_tensors, **fn_kwargs) + for i in range(len(batch_tensors)): + img_tensor = batch_tensors[i, ...] + transformed_img = fn(img_tensor, **fn_kwargs) + torch.testing.assert_close(transformed_img, transformed_batch[i, ...], rtol=0, atol=1e-6) + + if scripted_fn_atol >= 0: + scripted_fn = torch.jit.script(fn) + # scriptable function test + s_transformed_batch = scripted_fn(batch_tensors, **fn_kwargs) + torch.testing.assert_close(transformed_batch, s_transformed_batch, rtol=1e-5, atol=scripted_fn_atol) + + +def cache(fn): + """Similar to :func:`functools.cache` (Python >= 3.8) or :func:`functools.lru_cache` with infinite cache size, + but this also caches exceptions. + """ + sentinel = object() + out_cache = {} + exc_tb_cache = {} + + @functools.wraps(fn) + def wrapper(*args, **kwargs): + key = args + tuple(kwargs.values()) + + out = out_cache.get(key, sentinel) + if out is not sentinel: + return out + + exc_tb = exc_tb_cache.get(key, sentinel) + if exc_tb is not sentinel: + raise exc_tb[0].with_traceback(exc_tb[1]) + + try: + out = fn(*args, **kwargs) + except Exception as exc: + # We need to cache the traceback here as well. Otherwise, each re-raise will add the internal pytest + # traceback frames anew, but they will only be removed once. Thus, the traceback will be ginormous hiding + # the actual information in the noise. See https://github.com/pytest-dev/pytest/issues/10363 for details. + exc_tb_cache[key] = exc, exc.__traceback__ + raise exc + + out_cache[key] = out + return out + + return wrapper + + +def combinations_grid(**kwargs): + """Creates a grid of input combinations. + + Each element in the returned sequence is a dictionary containing one possible combination as values. + + Example: + >>> combinations_grid(foo=("bar", "baz"), spam=("eggs", "ham")) + [ + {'foo': 'bar', 'spam': 'eggs'}, + {'foo': 'bar', 'spam': 'ham'}, + {'foo': 'baz', 'spam': 'eggs'}, + {'foo': 'baz', 'spam': 'ham'} + ] + """ + return [dict(zip(kwargs.keys(), values)) for values in itertools.product(*kwargs.values())] + + +class ImagePair(TensorLikePair): + def __init__( + self, + actual, + expected, + *, + mae=False, + **other_parameters, + ): + if all(isinstance(input, PIL.Image.Image) for input in [actual, expected]): + actual, expected = [to_image(input) for input in [actual, expected]] + + super().__init__(actual, expected, **other_parameters) + self.mae = mae + + def compare(self) -> None: + actual, expected = self.actual, self.expected + + self._compare_attributes(actual, expected) + actual, expected = self._equalize_attributes(actual, expected) + + if self.mae: + if actual.dtype is torch.uint8: + actual, expected = actual.to(torch.int), expected.to(torch.int) + mae = float(torch.abs(actual - expected).float().mean()) + if mae > self.atol: + self._fail( + AssertionError, + f"The MAE of the images is {mae}, but only {self.atol} is allowed.", + ) + else: + super()._compare_values(actual, expected) + + +def assert_close( + actual, + expected, + *, + allow_subclasses=True, + rtol=None, + atol=None, + equal_nan=False, + check_device=True, + check_dtype=True, + check_layout=True, + check_stride=False, + msg=None, + **kwargs, +): + """Superset of :func:`torch.testing.assert_close` with support for PIL vs. tensor image comparison""" + __tracebackhide__ = True + + error_metas = not_close_error_metas( + actual, + expected, + pair_types=( + NonePair, + BooleanPair, + NumberPair, + ImagePair, + TensorLikePair, + ), + allow_subclasses=allow_subclasses, + rtol=rtol, + atol=atol, + equal_nan=equal_nan, + check_device=check_device, + check_dtype=check_dtype, + check_layout=check_layout, + check_stride=check_stride, + **kwargs, + ) + + if error_metas: + raise error_metas[0].to_error(msg) + + +assert_equal = functools.partial(assert_close, rtol=0, atol=0) + + +DEFAULT_SIZE = (17, 11) + + +NUM_CHANNELS_MAP = { + "GRAY": 1, + "GRAY_ALPHA": 2, + "RGB": 3, + "RGBA": 4, +} + + +def make_image( + size=DEFAULT_SIZE, + *, + color_space="RGB", + batch_dims=(), + dtype=None, + device="cpu", + memory_format=torch.contiguous_format, +): + num_channels = NUM_CHANNELS_MAP[color_space] + dtype = dtype or torch.uint8 + max_value = get_max_value(dtype) + data = torch.testing.make_tensor( + (*batch_dims, num_channels, *size), + low=0, + high=max_value, + dtype=dtype, + device=device, + memory_format=memory_format, + ) + if color_space in {"GRAY_ALPHA", "RGBA"}: + data[..., -1, :, :] = max_value + + return tv_tensors.Image(data) + + +def make_image_tensor(*args, **kwargs): + return make_image(*args, **kwargs).as_subclass(torch.Tensor) + + +def make_image_pil(*args, **kwargs): + return to_pil_image(make_image(*args, **kwargs)) + + +def make_bounding_boxes( + canvas_size=DEFAULT_SIZE, + *, + format=tv_tensors.BoundingBoxFormat.XYXY, + num_boxes=1, + dtype=None, + device="cpu", +): + def sample_position(values, max_value): + # We cannot use torch.randint directly here, because it only allows integer scalars as values for low and high. + # However, if we have batch_dims, we need tensors as limits. + return torch.stack([torch.randint(max_value - v, ()) for v in values.tolist()]) + + if isinstance(format, str): + format = tv_tensors.BoundingBoxFormat[format] + + dtype = dtype or torch.float32 + + h, w = [torch.randint(1, s, (num_boxes,)) for s in canvas_size] + y = sample_position(h, canvas_size[0]) + x = sample_position(w, canvas_size[1]) + + if format is tv_tensors.BoundingBoxFormat.XYWH: + parts = (x, y, w, h) + elif format is tv_tensors.BoundingBoxFormat.XYXY: + x1, y1 = x, y + x2 = x1 + w + y2 = y1 + h + parts = (x1, y1, x2, y2) + elif format is tv_tensors.BoundingBoxFormat.CXCYWH: + cx = x + w / 2 + cy = y + h / 2 + parts = (cx, cy, w, h) else: - return test_func + raise ValueError(f"Format {format} is not supported") + + return tv_tensors.BoundingBoxes( + torch.stack(parts, dim=-1).to(dtype=dtype, device=device), format=format, canvas_size=canvas_size + ) + + +def make_detection_masks(size=DEFAULT_SIZE, *, num_masks=1, dtype=None, device="cpu"): + """Make a "detection" mask, i.e. (*, N, H, W), where each object is encoded as one of N boolean masks""" + return tv_tensors.Mask( + torch.testing.make_tensor( + (num_masks, *size), + low=0, + high=2, + dtype=dtype or torch.bool, + device=device, + ) + ) + + +def make_segmentation_mask(size=DEFAULT_SIZE, *, num_categories=10, batch_dims=(), dtype=None, device="cpu"): + """Make a "segmentation" mask, i.e. (*, H, W), where the category is encoded as pixel value""" + return tv_tensors.Mask( + torch.testing.make_tensor( + (*batch_dims, *size), + low=0, + high=num_categories, + dtype=dtype or torch.uint8, + device=device, + ) + ) + + +def make_video(size=DEFAULT_SIZE, *, num_frames=3, batch_dims=(), **kwargs): + return tv_tensors.Video(make_image(size, batch_dims=(*batch_dims, num_frames), **kwargs)) + + +def make_video_tensor(*args, **kwargs): + return make_video(*args, **kwargs).as_subclass(torch.Tensor) + + +def assert_run_python_script(source_code): + """Utility to check assertions in an independent Python subprocess. + + The script provided in the source code should return 0 and not print + anything on stderr or stdout. Modified from scikit-learn test utils. + + Args: + source_code (str): The Python source code to execute. + """ + with get_tmp_dir() as root: + path = pathlib.Path(root) / "main.py" + with open(path, "w") as file: + file.write(source_code) + + try: + out = check_output([sys.executable, str(path)], stderr=STDOUT) + except CalledProcessError as e: + raise RuntimeError(f"script errored with output:\n{e.output.decode()}") + if out != b"": + raise AssertionError(out.decode()) + + +@contextlib.contextmanager +def assert_no_warnings(): + # The name `catch_warnings` is a misnomer as the context manager does **not** catch any warnings, but rather scopes + # the warning filters. All changes that are made to the filters while in this context, will be reset upon exit. + with warnings.catch_warnings(): + warnings.simplefilter("error") + yield + + +@contextlib.contextmanager +def ignore_jit_no_profile_information_warning(): + # Calling a scripted object often triggers a warning like + # `UserWarning: operator() profile_node %$INT1 : int[] = prim::profile_ivalue($INT2) does not have profile information` + # with varying `INT1` and `INT2`. Since these are uninteresting for us and only clutter the test summary, we ignore + # them. + with warnings.catch_warnings(): + warnings.filterwarnings("ignore", message=re.escape("operator() profile_node %"), category=UserWarning) + yield diff --git a/test/conftest.py b/test/conftest.py index 6e10e4ef071417f617ecb31f2212830c61e7da3e..a9768598ded0e4f06ab80b4dd633800b60cac226 100644 --- a/test/conftest.py +++ b/test/conftest.py @@ -1,14 +1,121 @@ +import random + +import numpy as np +import pytest +import torch + +from common_utils import ( + CUDA_NOT_AVAILABLE_MSG, + IN_FBCODE, + IN_OSS_CI, + IN_RE_WORKER, + MPS_NOT_AVAILABLE_MSG, + OSS_CI_GPU_NO_CUDA_MSG, +) + + def pytest_configure(config): # register an additional marker (see pytest_collection_modifyitems) - config.addinivalue_line( - "markers", "dont_collect: marks a test that should not be collected (avoids skipping it)" - ) + config.addinivalue_line("markers", "needs_cuda: mark for tests that rely on a CUDA device") + config.addinivalue_line("markers", "needs_mps: mark for tests that rely on a MPS device") + config.addinivalue_line("markers", "dont_collect: mark for tests that should not be collected") + config.addinivalue_line("markers", "opcheck_only_one: only opcheck one parametrization") def pytest_collection_modifyitems(items): - # This hook is called by pytest after it has collected the tests (google its name!) - # We can ignore some tests as we see fit here. In particular we ignore the tests that - # we have marked with the custom 'dont_collect' mark. This avoids skipping the tests, - # since the internal fb infra doesn't like skipping tests. - to_keep = [item for item in items if item.get_closest_marker('dont_collect') is None] - items[:] = to_keep + # This hook is called by pytest after it has collected the tests (google its name to check out its doc!) + # We can ignore some tests as we see fit here, or add marks, such as a skip mark. + # + # Typically, here, we try to optimize CI time. In particular, the GPU CI instances don't need to run the + # tests that don't need CUDA, because those tests are extensively tested in the CPU CI instances already. + # This is true for both OSS CI and the fbcode internal CI. + # In the fbcode CI, we have an additional constraint: we try to avoid skipping tests. So instead of relying on + # pytest.mark.skip, in fbcode we literally just remove those tests from the `items` list, and it's as if + # these tests never existed. + + out_items = [] + for item in items: + # The needs_cuda mark will exist if the test was explicitly decorated with + # the @needs_cuda decorator. It will also exist if it was parametrized with a + # parameter that has the mark: for example if a test is parametrized with + # @pytest.mark.parametrize('device', cpu_and_cuda()) + # the "instances" of the tests where device == 'cuda' will have the 'needs_cuda' mark, + # and the ones with device == 'cpu' won't have the mark. + needs_cuda = item.get_closest_marker("needs_cuda") is not None + needs_mps = item.get_closest_marker("needs_mps") is not None + + if needs_cuda and not torch.cuda.is_available(): + # In general, we skip cuda tests on machines without a GPU + # There are special cases though, see below + item.add_marker(pytest.mark.skip(reason=CUDA_NOT_AVAILABLE_MSG)) + + if needs_mps and not torch.backends.mps.is_available(): + item.add_marker(pytest.mark.skip(reason=MPS_NOT_AVAILABLE_MSG)) + + if IN_FBCODE: + # fbcode doesn't like skipping tests, so instead we just don't collect the test + # so that they don't even "exist", hence the continue statements. + if not needs_cuda and IN_RE_WORKER: + # The RE workers are the machines with GPU, we don't want them to run CPU-only tests. + continue + if needs_cuda and not torch.cuda.is_available(): + # On the test machines without a GPU, we want to ignore the tests that need cuda. + # TODO: something more robust would be to do that only in a sandcastle instance, + # so that we can still see the test being skipped when testing locally from a devvm + continue + if needs_mps and not torch.backends.mps.is_available(): + # Same as above, but for MPS + continue + elif IN_OSS_CI: + # Here we're not in fbcode, so we can safely collect and skip tests. + if not needs_cuda and torch.cuda.is_available(): + # Similar to what happens in RE workers: we don't need the OSS CI GPU machines + # to run the CPU-only tests. + item.add_marker(pytest.mark.skip(reason=OSS_CI_GPU_NO_CUDA_MSG)) + + if item.get_closest_marker("dont_collect") is not None: + # currently, this is only used for some tests we're sure we don't want to run on fbcode + continue + + out_items.append(item) + + items[:] = out_items + + +def pytest_sessionfinish(session, exitstatus): + # This hook is called after all tests have run, and just before returning an exit status. + # We here change exit code 5 into 0. + # + # 5 is issued when no tests were actually run, e.g. if you use `pytest -k some_regex_that_is_never_matched`. + # + # Having no test being run for a given test rule is a common scenario in fbcode, and typically happens on + # the GPU test machines which don't run the CPU-only tests (see pytest_collection_modifyitems above). For + # example `test_transforms.py` doesn't contain any CUDA test at the time of + # writing, so on a GPU test machine, testpilot would invoke pytest on this file and no test would be run. + # This would result in pytest returning 5, causing testpilot to raise an error. + # To avoid this, we transform this 5 into a 0 to make testpilot happy. + if exitstatus == 5: + session.exitstatus = 0 + + +@pytest.fixture(autouse=True) +def prevent_leaking_rng(): + # Prevent each test from leaking the rng to all other test when they call + # torch.manual_seed() or random.seed() or np.random.seed(). + # Note: the numpy rngs should never leak anyway, as we never use + # np.random.seed() and instead rely on np.random.RandomState instances (see + # issue #4247). We still do it for extra precaution. + + torch_rng_state = torch.get_rng_state() + builtin_rng_state = random.getstate() + nunmpy_rng_state = np.random.get_state() + if torch.cuda.is_available(): + cuda_rng_state = torch.cuda.get_rng_state() + + yield + + torch.set_rng_state(torch_rng_state) + random.setstate(builtin_rng_state) + np.random.set_state(nunmpy_rng_state) + if torch.cuda.is_available(): + torch.cuda.set_rng_state(cuda_rng_state) diff --git a/test/cpp/test_custom_operators.cpp b/test/cpp/test_custom_operators.cpp index 499683a78af2159f50272979c34dc371aa36f5c5..e68f6c2f0293c1b6b19ce8494afcd0aa48ade6fd 100644 --- a/test/cpp/test_custom_operators.cpp +++ b/test/cpp/test_custom_operators.cpp @@ -18,7 +18,7 @@ TEST(test_custom_operators, nms) { double thresh = 0.7; torch::jit::push(stack, boxes, scores, thresh); - op->getOperation()(&stack); + op->getOperation()(stack); at::Tensor output_jit; torch::jit::pop(stack, output_jit); @@ -47,7 +47,7 @@ TEST(test_custom_operators, roi_align_visible) { bool aligned = true; torch::jit::push(stack, input, rois, spatial_scale, pooled_height, pooled_width, sampling_ratio, aligned); - op->getOperation()(&stack); + op->getOperation()(stack); at::Tensor output_jit; torch::jit::pop(stack, output_jit); diff --git a/test/datasets_utils.py b/test/datasets_utils.py index 8077a03b91062d73abb955b8f3fd8dcdcf8dcf60..43b4103646a288700e038dac38b69edffd624d44 100644 --- a/test/datasets_utils.py +++ b/test/datasets_utils.py @@ -5,20 +5,33 @@ import inspect import itertools import os import pathlib +import platform import random +import shutil import string +import struct +import tarfile import unittest import unittest.mock +import zipfile from collections import defaultdict from typing import Any, Callable, Dict, Iterator, List, Optional, Sequence, Tuple, Union +import numpy as np + import PIL import PIL.Image +import pytest import torch import torchvision.datasets import torchvision.io - -from common_utils import get_tmp_dir, disable_console_output +from common_utils import disable_console_output, get_tmp_dir +from torch.utils._pytree import tree_any +from torch.utils.data import DataLoader +from torchvision import tv_tensors +from torchvision.datasets import wrap_dataset_for_transforms_v2 +from torchvision.transforms.functional import get_dimensions +from torchvision.transforms.v2.functional import get_size __all__ = [ @@ -33,6 +46,8 @@ __all__ = [ "create_image_folder", "create_video_file", "create_video_folder", + "make_tar", + "make_zip", "create_random_string", ] @@ -55,6 +70,7 @@ class LazyImporter: "requests", "scipy.io", "scipy.sparse", + "h5py", ) def __init__(self): @@ -127,16 +143,16 @@ def test_all_configs(test): .. note:: - This will try to remove duplicate configurations. During this process it will not not preserve a potential + This will try to remove duplicate configurations. During this process it will not preserve a potential ordering of the configurations or an inner ordering of a configuration. """ def maybe_remove_duplicates(configs): try: - return [dict(config_) for config_ in set(tuple(sorted(config.items())) for config in configs)] + return [dict(config_) for config_ in {tuple(sorted(config.items())) for config in configs}] except TypeError: # A TypeError will be raised if a value of any config is not hashable, e.g. a list. In that case duplicate - # removal would be a lot more elaborate and we simply bail out. + # removal would be a lot more elaborate, and we simply bail out. return configs @functools.wraps(test) @@ -159,23 +175,6 @@ def test_all_configs(test): return wrapper -def combinations_grid(**kwargs): - """Creates a grid of input combinations. - - Each element in the returned sequence is a dictionary containing one possible combination as values. - - Example: - >>> combinations_grid(foo=("bar", "baz"), spam=("eggs", "ham")) - [ - {'foo': 'bar', 'spam': 'eggs'}, - {'foo': 'bar', 'spam': 'ham'}, - {'foo': 'baz', 'spam': 'eggs'}, - {'foo': 'baz', 'spam': 'ham'} - ] - """ - return [dict(zip(kwargs.keys(), values)) for values in itertools.product(*kwargs.values())] - - class DatasetTestCase(unittest.TestCase): """Abstract base class for all dataset testcases. @@ -287,7 +286,7 @@ class DatasetTestCase(unittest.TestCase): .. note:: The default behavior is only valid if the dataset to be tested has ``root`` as the only required parameter. - Otherwise you need to overwrite this method. + Otherwise, you need to overwrite this method. Args: tmpdir (str): Path to a temporary directory. For most cases this acts as root directory for the dataset @@ -416,7 +415,11 @@ class DatasetTestCase(unittest.TestCase): continue defaults.append( - {kwarg: default for kwarg, default in zip(argspec.args[-len(argspec.defaults):], argspec.defaults)} + { + kwarg: default + for kwarg, default in zip(argspec.args[-len(argspec.defaults) :], argspec.defaults) + if not kwarg.startswith("_") + } ) if not argspec.varkw: @@ -515,18 +518,18 @@ class DatasetTestCase(unittest.TestCase): yield mocks def test_not_found_or_corrupted(self): - with self.assertRaises((FileNotFoundError, RuntimeError)): + with pytest.raises((FileNotFoundError, RuntimeError)): with self.create_dataset(inject_fake_data=False): pass def test_smoke(self): with self.create_dataset() as (dataset, _): - self.assertIsInstance(dataset, torchvision.datasets.VisionDataset) + assert isinstance(dataset, torchvision.datasets.VisionDataset) @test_all_configs def test_str_smoke(self, config): with self.create_dataset(config) as (dataset, _): - self.assertIsInstance(str(dataset), str) + assert isinstance(str(dataset), str) @test_all_configs def test_feature_types(self, config): @@ -536,23 +539,21 @@ class DatasetTestCase(unittest.TestCase): if len(self.FEATURE_TYPES) > 1: actual = len(example) expected = len(self.FEATURE_TYPES) - self.assertEqual( - actual, - expected, - f"The number of the returned features does not match the the number of elements in FEATURE_TYPES: " - f"{actual} != {expected}", - ) + assert ( + actual == expected + ), "The number of the returned features does not match the the number of elements in FEATURE_TYPES: " + f"{actual} != {expected}" else: example = (example,) for idx, (feature, expected_feature_type) in enumerate(zip(example, self.FEATURE_TYPES)): with self.subTest(idx=idx): - self.assertIsInstance(feature, expected_feature_type) + assert isinstance(feature, expected_feature_type) @test_all_configs def test_num_examples(self, config): with self.create_dataset(config) as (dataset, info): - self.assertEqual(len(dataset), info["num_examples"]) + assert len(list(dataset)) == len(dataset) == info["num_examples"] @test_all_configs def test_transforms(self, config): @@ -569,6 +570,39 @@ class DatasetTestCase(unittest.TestCase): mock.assert_called() + @test_all_configs + def test_transforms_v2_wrapper(self, config): + try: + with self.create_dataset(config) as (dataset, info): + for target_keys in [None, "all"]: + if target_keys is not None and self.DATASET_CLASS not in { + torchvision.datasets.CocoDetection, + torchvision.datasets.VOCDetection, + torchvision.datasets.Kitti, + torchvision.datasets.WIDERFace, + }: + with self.assertRaisesRegex(ValueError, "`target_keys` is currently only supported for"): + wrap_dataset_for_transforms_v2(dataset, target_keys=target_keys) + continue + + wrapped_dataset = wrap_dataset_for_transforms_v2(dataset, target_keys=target_keys) + assert isinstance(wrapped_dataset, self.DATASET_CLASS) + assert len(wrapped_dataset) == info["num_examples"] + + wrapped_sample = wrapped_dataset[0] + assert tree_any( + lambda item: isinstance(item, (tv_tensors.TVTensor, PIL.Image.Image)), wrapped_sample + ) + except TypeError as error: + msg = f"No wrapper exists for dataset class {type(dataset).__name__}" + if str(error).startswith(msg): + pytest.skip(msg) + raise error + except RuntimeError as error: + if "currently not supported by this wrapper" in str(error): + pytest.skip("Config is currently not supported by this wrapper") + raise error + class ImageDatasetTestCase(DatasetTestCase): """Abstract base class for image dataset testcases. @@ -592,7 +626,7 @@ class ImageDatasetTestCase(DatasetTestCase): patch_checks=patch_checks, **kwargs, ) as (dataset, info): - # PIL.Image.open() only loads the image meta data upfront and keeps the file open until the first access + # PIL.Image.open() only loads the image metadata upfront and keeps the file open until the first access # to the pixel data occurs. Trying to delete such a file results in an PermissionError on Windows. Thus, we # force-load opened images. # This problem only occurs during testing since some tests, e.g. DatasetTestCase.test_feature_types open an @@ -629,27 +663,76 @@ class VideoDatasetTestCase(DatasetTestCase): FEATURE_TYPES = (torch.Tensor, torch.Tensor, int) REQUIRED_PACKAGES = ("av",) - DEFAULT_FRAMES_PER_CLIP = 1 + FRAMES_PER_CLIP = 1 def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.dataset_args = self._set_default_frames_per_clip(self.dataset_args) - def _set_default_frames_per_clip(self, inject_fake_data): + def _set_default_frames_per_clip(self, dataset_args): argspec = inspect.getfullargspec(self.DATASET_CLASS.__init__) - args_without_default = argspec.args[1:-len(argspec.defaults)] + args_without_default = argspec.args[1 : (-len(argspec.defaults) if argspec.defaults else None)] frames_per_clip_last = args_without_default[-1] == "frames_per_clip" - @functools.wraps(inject_fake_data) + @functools.wraps(dataset_args) def wrapper(tmpdir, config): - args = inject_fake_data(tmpdir, config) + args = dataset_args(tmpdir, config) if frames_per_clip_last and len(args) == len(args_without_default) - 1: - args = (*args, self.DEFAULT_FRAMES_PER_CLIP) + args = (*args, self.FRAMES_PER_CLIP) return args return wrapper + def test_output_format(self): + for output_format in ["TCHW", "THWC"]: + with self.create_dataset(output_format=output_format) as (dataset, _): + for video, *_ in dataset: + if output_format == "TCHW": + num_frames, num_channels, *_ = video.shape + else: # output_format == "THWC": + num_frames, *_, num_channels = video.shape + + assert num_frames == self.FRAMES_PER_CLIP + assert num_channels == 3 + + @test_all_configs + def test_transforms_v2_wrapper(self, config): + # `output_format == "THWC"` is not supported by the wrapper. Thus, we skip the `config` if it is set explicitly + # or use the supported `"TCHW"` + if config.setdefault("output_format", "TCHW") == "THWC": + return + + super().test_transforms_v2_wrapper.__wrapped__(self, config) + + +def _no_collate(batch): + return batch + + +def check_transforms_v2_wrapper_spawn(dataset, expected_size): + # This check ensures that the wrapped datasets can be used with multiprocessing_context="spawn" in the DataLoader. + # We also check that transforms are applied correctly as a non-regression test for + # https://github.com/pytorch/vision/issues/8066 + # Implicitly, this also checks that the wrapped datasets are pickleable. + + # To save CI/test time, we only check on Windows where "spawn" is the default + if platform.system() != "Windows": + pytest.skip("Multiprocessing spawning is only checked on macOS.") + + wrapped_dataset = wrap_dataset_for_transforms_v2(dataset) + + dataloader = DataLoader(wrapped_dataset, num_workers=2, multiprocessing_context="spawn", collate_fn=_no_collate) + + def resize_was_applied(item): + # Checking the size of the output ensures that the Resize transform was correctly applied + return isinstance(item, (tv_tensors.Image, tv_tensors.Video, PIL.Image.Image)) and get_size(item) == list( + expected_size + ) + + for wrapped_sample in dataloader: + assert tree_any(resize_was_applied, wrapped_sample) + def create_image_or_video_tensor(size: Sequence[int]) -> torch.Tensor: r"""Create a random uint8 tensor. @@ -739,6 +822,33 @@ def create_image_folder( ] +def shape_test_for_stereo( + left: PIL.Image.Image, + right: PIL.Image.Image, + disparity: Optional[np.ndarray] = None, + valid_mask: Optional[np.ndarray] = None, +): + left_dims = get_dimensions(left) + right_dims = get_dimensions(right) + c, h, w = left_dims + # check that left and right are the same size + assert left_dims == right_dims + assert c == 3 + + # check that the disparity has the same spatial dimensions + # as the input + if disparity is not None: + assert disparity.ndim == 3 + assert disparity.shape == (1, h, w) + + if valid_mask is not None: + # check that valid mask is the same size as the disparity + _, dh, dw = disparity.shape + mh, mw = valid_mask.shape + assert dh == mh + assert dw == mw + + @requires_lazy_imports("av") def create_video_file( root: Union[pathlib.Path, str], @@ -747,7 +857,7 @@ def create_video_file( fps: float = 25, **kwargs: Any, ) -> pathlib.Path: - """Create an video file from random data. + """Create a video file from random data. Args: root (Union[str, pathlib.Path]): Root directory the video file will be placed in. @@ -833,12 +943,86 @@ def create_video_folder( ] +def _split_files_or_dirs(root, *files_or_dirs): + files = set() + dirs = set() + for file_or_dir in files_or_dirs: + path = pathlib.Path(file_or_dir) + if not path.is_absolute(): + path = root / path + if path.is_file(): + files.add(path) + else: + dirs.add(path) + for sub_file_or_dir in path.glob("**/*"): + if sub_file_or_dir.is_file(): + files.add(sub_file_or_dir) + else: + dirs.add(sub_file_or_dir) + + if root in dirs: + dirs.remove(root) + + return files, dirs + + +def _make_archive(root, name, *files_or_dirs, opener, adder, remove=True): + archive = pathlib.Path(root) / name + if not files_or_dirs: + # We need to invoke `Path.with_suffix("")`, since call only applies to the last suffix if multiple suffixes are + # present. For example, `pathlib.Path("foo.tar.gz").with_suffix("")` results in `foo.tar`. + file_or_dir = archive + for _ in range(len(archive.suffixes)): + file_or_dir = file_or_dir.with_suffix("") + if file_or_dir.exists(): + files_or_dirs = (file_or_dir,) + else: + raise ValueError("No file or dir provided.") + + files, dirs = _split_files_or_dirs(root, *files_or_dirs) + + with opener(archive) as fh: + for file in sorted(files): + adder(fh, file, file.relative_to(root)) + + if remove: + for file in files: + os.remove(file) + for dir in dirs: + shutil.rmtree(dir, ignore_errors=True) + + return archive + + +def make_tar(root, name, *files_or_dirs, remove=True, compression=None): + # TODO: detect compression from name + return _make_archive( + root, + name, + *files_or_dirs, + opener=lambda archive: tarfile.open(archive, f"w:{compression}" if compression else "w"), + adder=lambda fh, file, relative_file: fh.add(file, arcname=relative_file), + remove=remove, + ) + + +def make_zip(root, name, *files_or_dirs, remove=True): + return _make_archive( + root, + name, + *files_or_dirs, + opener=lambda archive: zipfile.ZipFile(archive, "w"), + adder=lambda fh, file, relative_file: fh.write(file, arcname=relative_file), + remove=remove, + ) + + def create_random_string(length: int, *digits: str) -> str: """Create a random string. Args: length (int): Number of characters in the generated string. - *characters (str): Characters to sample from. If omitted defaults to :attr:`string.ascii_lowercase`. + *digits (str): Characters to sample from. If omitted defaults to :attr:`string.ascii_lowercase`. """ if not digits: digits = string.ascii_lowercase @@ -846,3 +1030,26 @@ def create_random_string(length: int, *digits: str) -> str: digits = "".join(itertools.chain(*digits)) return "".join(random.choice(digits) for _ in range(length)) + + +def make_fake_pfm_file(h, w, file_name): + values = list(range(3 * h * w)) + # Note: we pack everything in little endian: -1.0, and "<" + content = f"PF \n{w} {h} \n-1.0\n".encode() + struct.pack("<" + "f" * len(values), *values) + with open(file_name, "wb") as f: + f.write(content) + + +def make_fake_flo_file(h, w, file_name): + """Creates a fake flow file in .flo format.""" + # Everything needs to be in little Endian according to + # https://vision.middlebury.edu/flow/code/flow-code/README.txt + values = list(range(2 * h * w)) + content = ( + struct.pack("<4c", *(c.encode() for c in "PIEH")) + + struct.pack(" - └── widerface - ├── wider_face_split - ├── WIDER_train - ├── WIDER_val - └── WIDER_test - - The dataset consist of - 1 image for each dataset split (train, val, test) and annotation files - for each split - """ - - def _make_image(file): - PIL.Image.fromarray(np.zeros((32, 32, 3), dtype=np.uint8)).save(file) - - def _make_train_archive(root): - extracted_dir = os.path.join(root, 'WIDER_train', 'images', '0--Parade') - os.makedirs(extracted_dir) - _make_image(os.path.join(extracted_dir, '0_Parade_marchingband_1_1.jpg')) - - def _make_val_archive(root): - extracted_dir = os.path.join(root, 'WIDER_val', 'images', '0--Parade') - os.makedirs(extracted_dir) - _make_image(os.path.join(extracted_dir, '0_Parade_marchingband_1_2.jpg')) - - def _make_test_archive(root): - extracted_dir = os.path.join(root, 'WIDER_test', 'images', '0--Parade') - os.makedirs(extracted_dir) - _make_image(os.path.join(extracted_dir, '0_Parade_marchingband_1_3.jpg')) - - def _make_annotations_archive(root): - train_bbox_contents = '0--Parade/0_Parade_marchingband_1_1.jpg\n1\n449 330 122 149 0 0 0 0 0 0\n' - val_bbox_contents = '0--Parade/0_Parade_marchingband_1_2.jpg\n1\n501 160 285 443 0 0 0 0 0 0\n' - test_filelist_contents = '0--Parade/0_Parade_marchingband_1_3.jpg\n' - extracted_dir = os.path.join(root, 'wider_face_split') - os.mkdir(extracted_dir) - - # bbox training file - bbox_file = os.path.join(extracted_dir, "wider_face_train_bbx_gt.txt") - with open(bbox_file, "w") as txt_file: - txt_file.write(train_bbox_contents) - - # bbox validation file - bbox_file = os.path.join(extracted_dir, "wider_face_val_bbx_gt.txt") - with open(bbox_file, "w") as txt_file: - txt_file.write(val_bbox_contents) - - # test filelist file - filelist_file = os.path.join(extracted_dir, "wider_face_test_filelist.txt") - with open(filelist_file, "w") as txt_file: - txt_file.write(test_filelist_contents) - - with get_tmp_dir() as root: - root_base = os.path.join(root, "widerface") - os.mkdir(root_base) - _make_train_archive(root_base) - _make_val_archive(root_base) - _make_test_archive(root_base) - _make_annotations_archive(root_base) - - yield root diff --git a/test/optests_failures_dict.json b/test/optests_failures_dict.json new file mode 100644 index 0000000000000000000000000000000000000000..3bad0bbb02792af31e26adb3dfc6cec0375ae9a3 --- /dev/null +++ b/test/optests_failures_dict.json @@ -0,0 +1,5 @@ +{ + "_description": "This is a dict containing failures for tests autogenerated by generate_opcheck_tests. For more details, please see https://docs.google.com/document/d/1Pj5HRZvdOq3xpFpbEjUZp2hBovhy7Wnxw14m6lF2154/edit", + "_version": 1, + "data": {} +} diff --git a/test/preprocess-bench.py b/test/preprocess-bench.py index 4ba3ca46dbcf8ce0c00c7fa9025545ea02070281..eedc7e4bbcdc0e00abf5aacfe01b6232858c1b3d 100644 --- a/test/preprocess-bench.py +++ b/test/preprocess-bench.py @@ -1,47 +1,51 @@ import argparse import os from timeit import default_timer as timer -from torch.utils.model_zoo import tqdm + import torch import torch.utils.data import torchvision -import torchvision.transforms as transforms import torchvision.datasets as datasets +import torchvision.transforms as transforms +from torch.utils.model_zoo import tqdm -parser = argparse.ArgumentParser(description='PyTorch ImageNet Training') -parser.add_argument('--data', metavar='PATH', required=True, - help='path to dataset') -parser.add_argument('--nThreads', '-j', default=2, type=int, metavar='N', - help='number of data loading threads (default: 2)') -parser.add_argument('--batchSize', '-b', default=256, type=int, metavar='N', - help='mini-batch size (1 = pure stochastic) Default: 256') -parser.add_argument('--accimage', action='store_true', - help='use accimage') +parser = argparse.ArgumentParser(description="PyTorch ImageNet Training") +parser.add_argument("--data", metavar="PATH", required=True, help="path to dataset") +parser.add_argument( + "--nThreads", "-j", default=2, type=int, metavar="N", help="number of data loading threads (default: 2)" +) +parser.add_argument( + "--batchSize", "-b", default=256, type=int, metavar="N", help="mini-batch size (1 = pure stochastic) Default: 256" +) +parser.add_argument("--accimage", action="store_true", help="use accimage") if __name__ == "__main__": args = parser.parse_args() if args.accimage: - torchvision.set_image_backend('accimage') - print('Using {}'.format(torchvision.get_image_backend())) + torchvision.set_image_backend("accimage") + print(f"Using {torchvision.get_image_backend()}") # Data loading code - transform = transforms.Compose([ - transforms.RandomSizedCrop(224), - transforms.RandomHorizontalFlip(), - transforms.ToTensor(), - transforms.Normalize(mean=[0.485, 0.456, 0.406], - std=[0.229, 0.224, 0.225]), - ]) - - traindir = os.path.join(args.data, 'train') - valdir = os.path.join(args.data, 'val') + transform = transforms.Compose( + [ + transforms.RandomSizedCrop(224), + transforms.RandomHorizontalFlip(), + transforms.PILToTensor(), + transforms.ConvertImageDtype(torch.float), + transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]), + ] + ) + + traindir = os.path.join(args.data, "train") + valdir = os.path.join(args.data, "val") train = datasets.ImageFolder(traindir, transform) val = datasets.ImageFolder(valdir, transform) train_loader = torch.utils.data.DataLoader( - train, batch_size=args.batchSize, shuffle=True, num_workers=args.nThreads) + train, batch_size=args.batchSize, shuffle=True, num_workers=args.nThreads + ) train_iter = iter(train_loader) start_time = timer() @@ -51,9 +55,12 @@ if __name__ == "__main__": pbar.update(1) batch = next(train_iter) end_time = timer() - print("Performance: {dataset:.0f} minutes/dataset, {batch:.1f} ms/batch," - " {image:.2f} ms/image {rate:.0f} images/sec" - .format(dataset=(end_time - start_time) * (float(len(train_loader)) / batch_count / 60.0), - batch=(end_time - start_time) / float(batch_count) * 1.0e+3, - image=(end_time - start_time) / (batch_count * args.batchSize) * 1.0e+3, - rate=(batch_count * args.batchSize) / (end_time - start_time))) + print( + "Performance: {dataset:.0f} minutes/dataset, {batch:.1f} ms/batch," + " {image:.2f} ms/image {rate:.0f} images/sec".format( + dataset=(end_time - start_time) * (float(len(train_loader)) / batch_count / 60.0), + batch=(end_time - start_time) / float(batch_count) * 1.0e3, + image=(end_time - start_time) / (batch_count * args.batchSize) * 1.0e3, + rate=(batch_count * args.batchSize) / (end_time - start_time), + ) + ) diff --git a/test/sanity_checks.ipynb b/test/sanity_checks.ipynb deleted file mode 100644 index 07af724ad8d918722bed9c823f3e823eb246d535..0000000000000000000000000000000000000000 --- a/test/sanity_checks.ipynb +++ /dev/null @@ -1,529 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import torch\n", - "import torchvision.transforms as transforms\n", - "import torchvision.datasets as datasets\n", - "import matplotlib.pyplot as plt\n", - "import numpy as np\n", - "import random" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "%matplotlib inline\n", - "def show(img):\n", - " npimg = img.numpy()\n", - " plt.imshow(np.transpose(npimg, (1,2,0)), interpolation='nearest')" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "import scipy.misc" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(100, 212)\n", - "117\n", - "int64\n" - ] - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "ascent = scipy.misc.ascent()\n", - "plt.gray()\n", - "plt.imshow(ascent, interpolation='nearest')\n", - "cropped_ascent = ascent[:100, 300:]\n", - "plt.imshow(cropped_ascent, interpolation='nearest')\n", - "print(cropped_ascent.shape)\n", - "print(cropped_ascent[90,90])\n", - "print(cropped_ascent.dtype)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "torch.Size([100, 212])\n", - "117.0\n", - "\n", - " 117\n", - "[torch.DoubleTensor of size 1]\n", - "\n", - "torch.Size([1, 100, 212])\n", - "\n", - " 117\n", - " 117\n", - " 117\n", - "[torch.FloatTensor of size 3]\n", - "\n", - "torch.Size([3, 100, 212])\n" - ] - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAADACAYAAAAUT5iEAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJztvWmMXVt2Hvbte+5YRRZZJB/H4vTGfnwREgmCIkC2EFiOI7cdtZIIQltG0o4baASIHSlOZLUtINYPB5Ay2FGAQMKLpKQTyG7JtgwJiZNYUeQE+eGOulstS916E/n4HossjsUiWeOddn7cWru+s+7a59xbw731qvcHEHV5hj2dPaz1rbXXdt57JCQkJCR88lGZdgESEhISEvYHaUJPSEhIOCJIE3pCQkLCEUGa0BMSEhKOCNKEnpCQkHBEkCb0hISEhCOCPU3ozrkfdM6965z7wDn3xf0qVEJCQkLC+HC79UN3zmUA3gPwrwNYBPB7AP6C9/5b+1e8hISEhIRRsRcJ/XsAfOC9v+W9bwP4MoDP7E+xEhISEhLGRXUP714CcIf+vwjgXy164eTJk/78+fMAgFqtBgBwzoG1hH6/n/tbqVTCfX6uUhmsRVmWwTk39H6v1zPLIGlkWTZ0zXsf3peyyV/OQ1/j3977oby5Dpw+l1mu63Slnjp/udbtdgvruxtkWYZGo5FLt91um9+ByyW/ub6TRKVSyZVHl9dqQwG3ufyVbzKt3dS9Xg9bW1vh9yQxSpvp50d9dj/e+3bD4uLiY+/9S2XP7WVCHwnOuS8A+AIAnDt3Dr/0S7+ESqWCc+fODQpQrYZJqd/vhw784sULAMDc3Bw2NzcBDCaVanVQZJlw5ufnw+ScZVl479mzZ7kJBhgMCsnrxIkT4Xqn0wEAbG1tYWNjI5RFFp1Go5FbAKTcrVYLwGBxkvtbW1t4/vw5gJ1BcezYsVCvzc3N3OQNAGtra6GO9Xod9Xo9lPvYsWO5OjAajQYeP348VN/dQso7Pz+Pq1evAtj5Dh9//HGog7WwSnkAoNlshnZmWJNl7JmyMspz/X4/lKHRaKDZbIb70qYyGeoJn/sHpwEMvi/3u1En9UqlEvLb6/d48eIFbt26BQB4+vRpuD7uZFsE/g7SBizYFAkUXBb+DvpZ/a21gJMm9HL85E/+5EejPLeXCf0ugMv0/4Xtazl4798G8DYA3Lhxw7daLTSbzTBpAQi/vffhQ8/OzoZremIGkJtsLalMS+5yTybeRqMxNEir1Wq4v7a2Zkrg8rdareYmXrkuiwM/u76+Hq71er2wEHD5JC2e7GJSOZf3pZcGi3a73Q75WJN/DNbksLy8HBbOhYUFAMD58+dx9+7d8I6WXp1zaLfbIX+9ABbB+n6x+6wJSV5ybXNzM1yfm5sLdeB3rIWEyyqTeJZloR15kh63PruBvH/ixAm8+uqrAID33nsPwGDhlnId5GRopbtfmgqP8zSZ7y/2MqH/HoDXnHPXMZjIPwvgx4peyLIM8/PzaDabOalZ4L0P13kwygTY6/XC83KfBzSn1Ww2h2iOfr8fJLhGoxGkSBnQPOE/ffoUMzMzIT0tfWRZFhYVRr/fH6J1eEJoNpuhDHxNJMNOp4OVlRUAwMmTJ4cmRudcqHuWZSGty5cv46OPBou4SNL6PQs82fGi9fDhw1y9L168GMq7tLQUrksbctvxoiZllbaR9HlAc9ksuqqo3JK3XJO6r66uhn7D5WLpmfuNlFPqw+lblJlzLqTLlFlM8xgHPHHOzc0BAN58800AwM2bN4NWtp/Ulp5kiyb0cfNkyR9IUvlBYtcTuve+65z7KwD+DwAZgF/x3n9z30qWkJCQkDAW9sShe+//CYB/MurzlUoFs7OzUcmi2+0OqfKVSiXHhTJlIvdZ0hKpjNOQ++12O8eR6uf6/X5O5WZqRNM+1Wo1p0WIZMgaBUu8IvnVarWchM1/pQ3k/szMzFA79fv98Hyz2Qx5zM7O4uTJkwAQJDh5XupYZhTk9pJ6iqTeaDQgBu2trS0sLy/nys6aSb/fD/SL9z5nANfps2SotQQBl0t/05hkKd9R2gYYlmjlN/c75ua1lM7tye8fJCQP6VOvv/56aPMHDx4MUVDjImbYL3tHP6vfsdJINMvB48CNogzpCKxG648r95jOkA7MBkPmr9m4qXlT/q1pEvnNnjEyEczOzoZBJIZSYKdT1uv1HA0jeczMzJgDQ37zQiKTfKVSCTSF9x7z8/PhWW2IzLIsx7cz9XH8+PHcs0+fPh1LTbboF3nv3r174TssLCyE6zKx82Tb6/XMyZvrLmn1er1CwxovFNqoKeWzJnxgmHqamZkJC3q3283RRdoI2Ov1ctfYdiLvWPTMfoLrJmg0GnjttddCuZaWlsKzuylH7B2LOrLGFJfV+n/yYpks0tb/hISEhCOCiUrowEAy04Y+lrBE+hTph2kSdg8UY2CWZVG3NI1qtZpT9S3fY35W0uUyM+XDUiS/V+Rdw8+ztMd5yfVerzdkFGQtQ7v/SZsw7SSUieSj62nBojY6nQ4WFxcBANevXw/eL6JZPH/+3KRBer1eTvuQelteI9aeA5bwLQ+gmAGP68CuqKLFcP6WR46WLHV7sHGatYhxEPPnL0K/3w/5vv7662G8fPTRR0NS9W4lY02Jxcqh3ynbp5Bw8Jg45SLuhNbkwhOn9jcH8vwxc9qcRpGXAXfUfr9v+gvLZMiud7yQsHcNTwTs4mYNAmsh4claFjDm5rk+8g67fJYNoosXLwYue2VlZazBZVFhMjHfvXsXly8PPFavXLkCAPjwww/DxOm9H5rEdV3Ys4hhTejW/SKuXf+WZzY2NnJ7AzgvXoC4rLF2iXHOMZ6/COPSEpz+tWvXAAwowA8//BAAwjffC3R5kmfKJwOJcklISEg4IpiahM40CRs1hU6w/I+990E6tbbu6+uxMnBZ+Fq/3w8eEUzPsJ8x52+p31yemESj/dQlP0lf2sB7n9MIgPyu1UqlkjOsajU5y7IgQXc6nSBBs1eQbpdYWfn+2tpaoF9EQrxy5Qpu374NYGCMZDrJCudgfb+Yz3mRCs90R6wOrBGJ9LqxsRF24XrvTd99zkP3K5bguS90Op0h7YGlW0uC363ky+2ysLAQyii7S3W4Bq0xxHZ3WsbYsjLGQnQkTBZJQk9ISEg4Ipi4UbRareakNi2xcEgAYJgX1VI1g6VURpkLFkspIh1rCVy73mVZZvo/F3Grcs3ijSX92dnZIbsCv8/ukjp9q+6y2/XKlSuBY9WS+rhwzoUwAyKpX716NfDqi4uL4b7FcXe73SAR1+v1qFHTel8/W6RZ6O9QqVRCX+BwDMePHzf9zAXsWskusGxjEfDu3dXV1ZCv4KC4aO89Ll68mMvvgw8+CG64RW0s7+81/ySZ25ikkXjiE7oMGDaK8RZ8PQhjqqDlMx1rLIuGYRpFEItBwpM0ezbwfaZcrHIwvaHVXO3Nwvct9dzqIGV0xfHjx8OAlxAB7C8+Dvg9CVNQrVYDvXPp0qWg9luUiKY4ZAK0AkUxYpMSUxvWpBLrK7y/QMpghaRg7xqrXBzq4MyZMzh9+jSAnQ1ey8vLpZEbmQYp8+CJ1U3KLPF9nHNhEV9fXzf70qgbz8qQJvM4WIC1YkztJxLlkpCQkHBEMFEJnaWIIuOkPCvXLOOSYBQpRvKMSSFaa+C09XuWdMN0h6aTuC46Xf6/JeHzczFJ3JLsWdrjvEVyE4nyzh0OZ29rRRZVZLX5kydPgovphQsXcOnSJQCDHaaWC6O83263c9pPkf+z9e0srS32fqwOW1tb5g5lltK1hK01Lknr+fPngeaSUAz9fh/Pnj0rLK8V/38UxOoJAGfPng31eeeddwIFxAZrQXJJ3D9YxuFxIqDuBRP3cpFNJTyJFm32YcQapSzCnRX9z+Kphd+Xsgh4ISpSvQW8AMlfa5JkPpZh+VOzZ0sZYguR1OHChQsABvFOdFTFGHgiim3EuXfvHoBBO0q8+263i/v37wOwD2nQcV+0DYXrI8/oOvI1izKx6qDTXFtbA7AT96XVauVoIV4krfSlTTY3N0M7SBucOHEi5Le8vJwLOaDBkTnZtjLOJM/2gBMnTgAA3nrrLXzwwQcAdmgyTjdN6PsH3VcOmmZhJMolISEh4YhgKkZRa/fgXlAmvVg+0THvC+u6VV4tdVv1sGKFx8ofO+1F1y3m02y9y+o7U1uS19WrV4P2UraTVNMsRcbapaWl0Oa8W5XjeOs4+FI3KY/lTTSKlFpEZ/B1ltZZkxFJvdfrBeqE3+c9Aiytc7ry3UX7mZ+fD5Kyczux5nl3cMxoWtRfGWX1PXHiBN544w0AwPvvvw9gQJNZmqOVr+5rCXHENO9JIEnoCQkJCUcEUzeKTmLVtzhpqwxFZbHKG/stGIWXLno/VsZxJFaLTxfU63Vcv34dAPDuu++avuM6nVi5+P7W1lYwuOrdqgCCgRDIaxF8IhVLObvtK2UujBbk/ubmZigLBztjA77UhwOQsSbDcXRE4zh+/Hi4/+TJEwCDdilzZyyT0PUzGr1eL7hmvv766wAGfuqsNVlaQpLQx8c07RETp1zGHZwxSsFSnYvete7Jfb3xQ9IfZRAVYZz3Y5O0LqM2mu21DEIrXL9+PZxb2W63o6EXdLraACxlFIPi4uJiOHBa8lpbW8tN4kxd6GPstAeQVb9RvYli92ITv0zItVotTOoc+MpaZLMsG6Irtra2As1y5syZEHJA8PTp09yBHGV9u0xQKKsbT+xihJa46pK+7o9pMv9kIFEuCQkJCUcEE6dcxjnAWO5Zrmgxqa1MoimjVazTlHYrnezVn9i6XySFFvkkxyCGubm5uUCN3L59u1D95uuxbyftuL6+HoJ2sRTLp/3E/MuBvI+45aOty1RUrlEkeMt3uNPpDMXDZ1dYTot3IHNfEsn+0aNHYSepSOqVSiVQH1tbW4X0Xll7xa6zUVyuNZtNvPrqq+GaSOlWqIOjgHGoqrJxE2uXIieFUe7vFROd0Hu9Hl68eDG2T20ZpxuLvKg348QGg85P/lr+8TEwNVL2rB7wo2wm0b6twHB9tKeN9p6xQh1wurLxaGNjI/iOc1rWpFI2kfT7/cDNx0Ia8IEeui58jc9QLZtwYgs7T7xFHjF8rdvthk05QlE0m83cszH/dLnGZ68+ffo0l0er1cKZM2cADCZ8oV8sQUT3RSuuvEUFMUfOz0ker776aqjbnTt3woJ7lKA97GKeZfpZ/r7yTmzvCIfxiKUrOAgvmES5JCQkJBwRTMUPvUiqsowxRSudc86UJmLeLGWSHT/LftujStAchY89NiyJVOc5Srl0lMdYOgIrqqUus9yX9xcWFoZ8x7U/eJH3RcyYF9MyWFOxtAj5vltbWzmPE0lzlPYbF1wu73d8zjl6IZelqF9pDUDSePToEYBBSAYxGJ85cyZ4v1gnD+m2LQr6FaPjrDJmWYZr164BGNCZEsBtP04/mhb0XMJ9vGz/i9ZCdZtZvv5AuYPFQVNYE5/Qy7bM60Efo0ksmiXGp8Y4dGtbtaTb7XaHDmYYBbw5hrf+ch5FXirj8vUWjRG7r9uRVW6mI7z3gQKQyWdjY6NwYSyifvQzuqzWd4gNQikPhzke1RPEirBZBKuMgs3NzXC/1WoV2jK8z4eO0JPKkydPcOrUKQAIZ54CA+8XDosADPqldT4tg795UV+LCQSXL18OeUi0Rh0G4ZPArevFjkN7lEF7+miqT88ZVt/mc4I53YNEaerOucvOud91zn3LOfdN59yPb18/5Zz7befc+9t/5w+0pAkJCQkJhRhFQu8C+E+89193zh0H8DXn3G8D+EsAfsd7/7POuS8C+CKAnypLTKuMZUdXxdT33aj6RZSDTlf7E1tpWKtyTKPgFd4ynI0q8egys4Rm1ceifaznYyrm/Pxgne50Ojn1m418VlpFZdLqqqXJWOn2+/2cd4y8M6o3Qew7Wc/GVGq+JlKrc24onjqnoT1ftNdWr9cL1Fa/3895vwgtw3mNSv+xBjYuJHa+fOebN2/mvr91wPphQ1FM/TKDJBtFeTzEAtMxG2CNUWtsxbTIMnqsCKVf23u/5L3/+vbvFwD+GMAlAJ8B8KXtx74E4IfHyjkhISEhYV8xFofunLsG4DsBfAXAOe+9bC+7D+Bc5J0vAPgCMAjbKgfXagkPGA4mJYhJW9a9ImlNG8+sZ2MGVotDs8pgaQllEtUoUlcZRpXaJD/+q59hg6AY/s6ePRvCwuoTluTdIiNSDMzzZlkWXOfkO7BPNB9qzHYKicNulUnnxb+t72c9G2tbyW9jYyPHp5fZXixjndTnyZMnId2ZmZngsy6G0qLDrK3y7laClvfOnz8PYGCzuHnzJoDB0Xq7Ces7aRTVPXYvZvgvMmrGvnOMRSjDXtp05AndOXcMwD8C8BPe++eqsN45Z5bCe/82gLcB4LXXXvO3bt2Ccy6o8seOHcsNAB0/o16v59QcMYpZDdTr9XJGJOsjyIQhkwCQNyJZfsgxlZtpAY7oOOrHt4xbsY9pdQ6eeK1OpSfWItqIKSamCOTZmZmZYLh79OiReVCJZdS08tWLKU/S0o78TThqpTY48STP37RsUdFqsG4PDeub8nvS75xzoRzsI86/taGSaSOmX06fPh2MpHL/yZMnuTFg9VNu7zLnghg9o7/Z/Px8LlqjxFTn/rebBX2/YQlvAk11MvVRRB2OsreE89D0zG4X2N3EUR+JYHPO1TCYzH/Ve/8b25cfOOcubN+/AODhWDknJCQkJOwrSiV0N1gifhnAH3vv/w7d+i0AnwPws9t/f7MsLe99kMLE7axarYYY1CwZWsfG9Xq9wtPknz17FiSHXq8X8mD1XNzx5ubmgjQoUjtLmY1GIyeVSRrWlvVKpRKCL7F7n7XrdGZmxjwUmfOy6haLi82GNX2UX8x/PibVWQZWvi9HqnU6ndyRala6Op1RrmtDIzDoH/K7VqsNSbfO7QTRYsqGqZpY/kWaVBlYO5L8AOQOnrb6FecXU8Olj3G8ctFYT58+jeXlZQAD6qPIwDZO3WLPWacffepTnwqB3HjXa5F0fJjBml+MZhmVBolRseNogzq9cTAK5fJ9AP5dAH/onPvG9rW/icFE/uvOuc8D+AjAj46aKU+QzD+y2seDQSquD6DQ4Pv8nuTVaDRyByfoDUC1Wi2nellqsqDX64W0Njc3g5rMp6uz5VsWl4sXL4b3tP1AyiCoVqtBvbYWkizL8ODBAwD5GCACrmO9Xg+UScyHn/lrPXH2+/3w3qlTp0KbygIraeh0dTtK21nquUUhVavVUHemV7h88izHfeH8LGjKRy+c+pmyOnJamhZsNBo524wWWrhvOedCH+j3+4E75/gvvOFNQhJw2WKTRpHPegzcP6Scs7OzgX4RXl36v7wzrUl91HyZYrS8zmI0i/Wszl/3pdi+gTJPGx4no6J0Qvfe/78AYqn+wFi5JSQkJCQcGCa+UxTIq8a8tZslNFmZ2NiiJTv5yxIar44sPUpeTPUILC8KhqWS8e+1tbUgsVrSXpZlwVCmDXfyl+kSrqOW4pi+abfbQUJjH202tsmzx44dG1rt2RjEga9YQmeJQuq4trYWqC15p16vR33iR92dadEgrVYrGNAfPHgQvql8R6ZWut1uoO+azeaQZqDpLOs4wZjxWV/jPqF32Qo4xrlQJhyl0QotwMZ2hkjq7KcuFBiQp/oY46jsXAer7jwm9WEZrC3GyjBtKkbnX0ZXFXmmlL3D6XN7xt7RWt5uMZUJvV6vh4mNPUS2trZylAMw7H1h0RnCuzLlYjVstVrNqerym6P98ULD3heWSi7XeBu45qKlDhKro8yzRVMG1iQsaTx//jxHTWh3OW672dnZobR4ImOqgA+d4LT4/FGLLrCoJGuC0pMEtx0v3nJ/YWEBwGCSlpPrLdWXv2mn0xkSDnhCjy0+Ma+hosFtPcdpbW5u5hY+/SwLKtxeTHPJs0+ePAn35+bmQh7s/RIrj/7+o96Tulh1l3H8+uuvh+9///79HMU07YlcoCfKMhuKNeb53TL6je+Vcec8zvbSXinaYkJCQsIRwUQl9EqlgmazmYtSxyt5lmVBleNrInVZRlHvdw7N0Kuj/F+k/lqtFtKv1WpBopAysFTOarQlbegogHyfvTLkGvsmW9QIaxZ8iIJ4cLB6zlSPoNPpmOe1Sr6tVmtI4mDtiDWL2AEHUpb19fUh7WJjYyNoIfoU+zKJw5J0pL7Pnz/Hxx9/DGCwuUm2pN+9ezc8ZxkyvfehvGwIj9EoluRu3bcom5hKzffF+4VpP9335Vn+jrpcWZYFz5JKpYK5ubnwrFx/8eKFWcdxoDcO6S3p+n61Wg2HZVQqFSwuLoY67oZC4HxHpUa0L7xF38boH31d5zVq7PQYiqRy3f/29N3GejohISEh4dBiohK6uGTp7dEcuEj7UgMwd38Ker1ejjtkP2Z5VqRU9j3f2toy3YY4fXaX08iyLEhCHLTIMopWq9WcBMZagPy1JD/WSFhCkDryyfTa9Q0YSO2ikbBfPXO3s7OzIU/Ol+sjf6W+LEVy21gBpGLhHGLQknC/38edO3dCvrIVXdp8aWnJlHh51zHXRbsr6rpbZYkZugT6vlVfSX99fT0YNS2bQ0wi43aReomhFBgYvcVIKultbGyMbJAuq2dZuViyfPnll0Pdbt++Hd2hOWqZRn0+9k34Wll9yvpqzPC8G8OvtbeEr+8GEz9TVFR7blD2Ay9SXSUNYEdFbbfbZhRAawsuD3I2GAp44nXOmcH9OS2ZwPRWea2eMdXDdAbXxTpMgzcLCSqVSvD04M5uxVzudrth8rDalb1gmN6xOmW73Q4LZ5ZlQ3G6nXO5+7KIFm1WKoLlJXP37t1gVLx06VKoo0xsbPTmfOR9Di0wSmzssr7Ik15RnbSQIJ5Jspg2m81gcNY0C9OBOi3vfS5Ko9Av4hXknAuLMC9mXIdYaAD9rbTxWoMpCuccrl+/DmDQ98WQzXWM9QVdRqbvOBa85X3D31Qbl/WzZeB3uAwxP3SL6rEEBqvcsbR2g0S5JCQkJBwRTJxyYSOcRq1WG3LTiklR7HtuGad4pWTpl09v17G1tSGEjZcW1SOGLu1OKeURKmBmZqbQ6MbSkeXmx+3gnMuFSihazZvNZpDQ2QVOwC50fEKTLhswoApEI2EjrrWHYH5+PpT3xYsXuzoM15J+2+12oF+kbRcWFnLulFZ7iFTVbreDpqQN0WVSkdUPx5GkWJOSdpbv6NzOLt1Op2NKlCylcj+V3ysrK6GMQr2wVL6xsVG4y3EcamMcXL58OYx5CRegd/TqcgC2JMuSfRksemW3VI9F5YyrZU4KE53QsyzDiRMnUK1Wc+qXRTdIJ2AfcP6g0sHZx7fb7eY2bkjsCfG+aDabOb5V0pDBxHFDynisdrttHh7BnjJSL+25w2o/MJicuPPwJKk7ULvdDnXUHhE6lMHc3Fxu0hZIWrwZKMZzSv4c0mBzc3OIjhL7iOTLW/SZigGKvQ2KUK/Xw6Jy69YtAMBrr72GK1euABh8U6YYuC/INRYEYmF3NcYJBxB7hutrtS2XUdMXgB1dUvdR2ewlEOpF8hKqp0xI2k/0+/2hwzLef//9XMwbC9aEXrZdv+z9cWDZP2JpscBiUaq7LcNukCiXhISEhCOCiVMu2mDAnhzWgb9syGQ1iHcEWisoGzgFMZ9lKUu1Wg2/YwcJsKRspWV5UfDuV1aDrVU75nEhdVlbWzO9byxfatYMWAVlyVQkJe3ZImlJO2jfc112733u6DSp+0svvRS2hFuHh4wDKwzB3bt3cfXqVQAD7wpW6/U+A9Z+mJLTu5MF+ylVFaXFhtK5ublQHjkMRsMy/LK2JtEY+/1+oF/m5+dDHxItpkzKLarDqJosl+vs2bMABuPs3XffBTDYZ7AXSs7qh5PGQWg2u0WS0BMSEhKOCCbuttjtdnPSs465oflBawcksCN1McfOzzQajSFtgH9bRlM2HLLxaXZ2NnDGIhnqsKWWWxL7G7OLouaPtXQdi1MCDKSrmPHSMsYyWBMRWK5dnJ/wu6wJWa6I1Wo1nK7DbdtoNEIMepHUy4y5ul6WCyPvJJVdiVevXsW1a9cADDh2+VYsqbNLqHzTfr8/ZOeYBCzb0NraWthJze5yliQO5Hcb6v787Nmz8Jv3YMg7HE8dGJ2XtrRQro92S9Za9fz8PD71qU8BsE8/Ggf6Hf6+k+Ktd+MWeVCYOOVSr9eHjFXsW6q3FFsRFgHkBiO/w/SNGARlgFQqlVwYAfZ4kffZICnvnzx5Mvj7yn2mXHS+MqHKBCd5y19+Vv5qrxFuM67v6urqkGEYyA9+WUgajUZuy7hFd1nBtZzbOfZN1PNYuST9VqsVJkXe3s5UjHx3OcleMM5mDj05VCqVQDHUarVgIL169Spu376dKzsb1Xhi9N7nwjQIrAmG23wvUfF0XoJ2ux3Ke/z4cfMYM75mTej8HBtKpT9KbPUsy/D8+fOh95meY7Cxj50A+K/+bdWTfebffPNNvPPOOwAGh2Xos4ZjfSI2ce/G2L5XTHsSZyTKJSEhIeGIYCrhc9k42ev1cpKdlj5ZUmAJm7f78zMiabEkzBIDGxTFOCjv6MBZku7jx4/DdaEgNO3AtJFlqLFUU4a17Z7LzvW1pEQOYiaGsCzLcmq21kjW19dzUiobCcVHWoymWtXXZTl+/HjQhGJtI2507XY7HGGn3fjGoWIkL2lPDgNw/vz5oBFIcC/eScp18d6H7ypamXb31H2J+8deJTSuN1NnL168CFI1h3iO7btgqVUgv58+fRrui3R84sSJcP/FixelfbRs56zAkphj77VaLbz55psABn7qogmP0ycOE+UxbUycQ2+327kJvV6vm2ol+1ozrAHJHDtvXNITmOZumUuWd5gnZg8QmfyZU2b/eQFPnHyCPeerrfrOuahvuaQhEyzXm6karptw53rA601dzItzGfjsVi6XvMeeSbIY8+Sg66fV59OnT+cOy+DFUH9vyxef6wDkt1hLFMZqtYpz584ByMd9EfDkzm1nCRIxn+b98qgoSl/6oIQJqNVqwfOI+5Xuu/qE7Hc6AAAgAElEQVR+t9sN9Ipgbm4uHEtYrVZDtMbdQI8t7ncWBcNjUvrrG2+8EfqonNGrJ+uiDV7aPqXbYxKTvT6/YVL5ChLlkpCQkHBEMHEJXVZyUY3r9bppXLJikPd6vSDZWZIjSwOzs7M5NZXzB4YjIAKDFZWDTrHEqWOfs5ahpQaRpizKh69zu/A9fo/9wOU+H3fHkuVLL70EADmDJOfBu2+tcrMBVoxpTI2xxCHvSl3ZAMt+3ZbUlmVZ8EleWloyI2TyO0Xqt6Y+JK3FxcXcwdxSLz7MmMuojdLs+WIdqn2QYPpFe1Wxn3qv1yvdzs9pcogEYNB/xGB94sSJ8P20JK/T2g9IHev1eqhDs9nMHWkHDPpHLIBYURljht2DxjTyZEwlfG6v18ttDRfwVnQdZU7AXiryf+tYuUqlkqM8gHz0Op7Q2VXR4uOyLAsDijccaR4WGHRK67g5du+zAu8zlSTXmcu2Ikpq3ltCHVhty+EFmFph8ITO3LmAF0PNx2pvA247a9IRCuull14KVAg/p72dJE3Lw4cXCvnmGxsbIe7L9e3If1evXs1xytahErxI88Kn6apx+P7dguso5VtdXc0dlmJ5RzE1xn1Q14GPsztx4kT4lvz9y2At2LyxzIo0yO/oOEhiu5CJvVar4d69e6E+WkiyXDiLynjQmDafnyiXhISEhCOCqWz973Q6QdLl0+adc6akJOj3+0Nb8rWXBEt2lm8xGyy1UZMD62jEjrnjcki6ImVoFVDD8phgo6r3dkAlllIkjRMnTgTNgI2q0o6NRmNIu4lhdXXVPM6OtSWR9lgrsGJVs7GMJWnB7Oxs8It+9OhR6eYWluYkL8s7o1qtBh968XJ55ZVXcoG8pG11H5JrIqFzHabt38xB4ebm5gItxIedWPs2gGGNrN/vB/qFA9v1er0hhwHelGVBj1MrwBg/a2k6/I70kZdffjmM4w8//PBQbbM/jBhZQnfOZc6533fO/S/b/7/unPuKc+4D59yvOeeGw/olJCQkJEwM40joPw7gjwHMbf//5wD8Xe/9l51zvwjg8wB+oSgBcVvUBgtewbXrG3PkHIo1tsKLdMzhU9moKpIH8/VcPgFLGd1uN3CKzFmy1CbpHj9+fMgFThs6db1Z+mEeuNvtmodEcxkF7P5pSXaVSqVQMmeJVCRbTovdQPv9fpDMBb1eL6cRWd+H/3I9JK2NjY0h1zltQ7F2JjI4XymvGPlu374dAnldu3YtnKSzsbFReBxcv98PbSP9S9dhHL/p3cD67qurq8GoyTuUtRaj02A7k6S1trZmGiqtUM6xcvG1Ih/9WP+wkGVZ+GZZloWwyWxTis0lnyQUtdc4GGlCd84tAPhzAP5zAH/NDXL9UwB+bPuRLwH4GYwwobMBCshvSffe57wM5BpPkDpsgDaEWhH0LHWZJwReMHgQ84TOG3uk3IJ+vx8mBPH64Pz0wRr8nqRvTUQvXrwYonrY+MheLpwv14FVZ940pcvIhl/ecMTtxd9E/JeZ4oid0crhB6Rcln/8yspKoAAk/gvnUea5oL+pnvxXVlaCQXFhYSHQL7dv3x5aOHliZ+8nbi+L6on5ze8WbGjU1zqdTu44O+3FxBvxrLbTRnv+PpIGOyeUhQawym1N2LHFoSgdYHDsoKQli3G73TadD8aJF3QYoEMe7BajUi7/DYC/DkByOw1gxXsvIt8igEvWi865Lzjnvuqc+6oOwJ+QkJCQsH8oldCdc38ewEPv/decc//auBl4798G8DYA3Lhxw4vLGxsk2Z2OJQogLynrgFhy33Jla7VaphQgEhrTILyzKyYpa3dKvfqLRmBFyGPDHdM+lmrM0gsbJ2NGYpHMW63WEA3R7XZzJzRpqUvXQbbjs3RjxaJvNBpD2/y1EU1QppJXKjuHXn/00UdBEhYD7+zsrPl9y+C9H/oO3nvcv38fwOB7XbhwAcDgmDQJ5GWdQsXllfLVarUo/XKQYI2HabKNjY1cPHogfzyjPA/k+ztrHKzBMTUJDMZmGf3CKKJBdDTGUeosacrh4FKud999N9Ch+pDwww4eAzxX7GWH6SiUy/cB+CHn3KcBNDHg0H8ewEnnXHVbSl8AcHeUDOVjcvyWIp9V9mNut9tDEw13ylarlfMp58lM8mKOvWjSYl/rzc3NoQ6ovTfYN9gK92upzFwHnhhl0uBj3zgdbi+Z0LMsG9ooVa1WQxtsbm4WTogbGxu5kMAyoXIIAEmXjzazyqW9dnRYV+byq9Vq2Oa9vr4enpVrFy5cyMVVsTp5jELS4MGytLSU84XXcV94EWbqQtOFVl57UfU1RaE9VmL3Nzc3Q3k5bLMlrHCaHCaA+6X8ljZim5NFoxRN0NbCatmUrHT0GJL2l010lUoF77//PoB8SOtPArg9rENLdoNSysV7/ze89wve+2sAPgvg//Le/0UAvwvgR7Yf+xyA39x1KRISEhIS9oy9+KH/FIAvO+f+NoDfB/DLo77IRkIGe7SwtMfHzVk7RfngBqEC2MAqqFarud2jct/y/tCRHbWxVhskebu/plS0lGFpBnyfd4dqIx1LNM1mM0jLXF5thNR1tCS858+f58IayG8OhcDx4SWv2PFtDO2hwxJar9cLUjFfF83gwYMHYes+S5GWr3WMutLtCwz6kuQLIATykna6d++e2U4CNpTWarUc5VRkFI15dVjvjPKs/M6yLJRHvJRarVaOMonRdlJvy0tK+gHXUUuUwPDhyGWa1Diwvp+U+8yZM6EPvvvuu7kont+OGGtC997/MwD/bPv3LQDfs/9FSkhISEjYDaZyBJ0+NJkDQGnplXlPjrViGa+cczlfaO2uKHyglEVgxcGoVCqBk9vY2DClC5EWWq3W0HFvnG8sHo1lnPLeBwmduWhLIm02mya/zPynJZWxj79c5zp674d8+CuVSojNXavVwrOW77l2VbSkJSnDkydP8OTJk5CHbufnz5+H73bu3LkhAymnrY18Atb6uD4ifd67dy/YdDiQl5SLQ6KyncLaSWppnjHNoUyKjEm6VloMqVev1wvfjCV4y31VG0+1RshHMloOBVqzGBW6DqNK1tyHZR/DW2+9FU4/Wl5eNsfdfrqUHkZM/IALMZKxoUx8vK1zAJ1zoSNa0eW839niL3SLQKv6ltqswc+K9TzmKcDGRyvmOv/lvPWAci4fH5q3++sy8qTHni0ceIzbVupgtW21Wg3UxtraWs6P2TJWycApm2i0sU1gtffHH38cDcQmdZCJtVarDRlky8qiwROQ5Le+vh7ol2vXrgEArly5kgvkpcvG37/X6+XqoBfWGI1SNrnoxUpfj9FN7JFj+alro7zOg+mXmEAgY44puZgAo797bBG2UGYk5sVndnYWN27cAAC88847od9Y+R5VpOBcCQkJCUcEE5fQxXWQVTmWWPVqzsYnXq35OVHJWXplSUmkDaZ6vPe57cNcPimXDgTG+bIRjCkIa2s/ayR8ne9L2Z49e5ZrjyLj0smTJ3Ptoaklll74PYtW0uXSklCtVgsaUKfTGYr5rtO3JChuO9Ec7t+/XyqhSVoPHz4M7cQU16gqPrcFUyPOuWBMW1xcBDCQ1C9fvgxgQGGIJmNpEXonqQ4KF6MUiiRPfd/KV0v7WuJn7bbRaARayfo2gO0KrP8Cg+8v/d/a4ahddEd1NbUoJG0QLXJr7PV6oe+/9tproWwcA9+q41HCVCZ09nJhqsDiuNhbpd1uB95SBg13pGazmTtTVBCLAqgnOO93IgpubW0FKsjaCFGr1ULn0ZNL0WDQ8dv5OjDwULC8GJg+El60Xq/nNnvoBYx9x63BEot7zRQQR/ZjeqeIzuL32fuG70uM62fPnpV6ykja3W43+KfLBpNms2l6s1jfTJfRWoBETa9WqyE0wMsvv4ybN28C2DnblSkbfp/pKqY4rIUvdq1okrb61yhptdvtsCBLuarVahBadIREa3OcNflbGwRZMPPe5+wOuoxcxzL6rGwS5gl/dnYWn/rUpwAgfLulpSWz7Y4SEuWSkJCQcEQwFaOoliYsq7tIC5ubmzkpQsBeLiIpN5tN08uAYUkRLE3wiTcWXcFhCE6ePAkgvu3dkqAszaBSqQTVmKPeWfDeh3y11CTvSXkksqXc03XY2NjIRa9kyVLvdj158mT4Ts1ms9TgzB4RGr1eL5xSNI6kVKlUQnkfPXoEADh79mzO08eS1i06g/9vUQwPHz4M7Xjp0qUQ8e/DDz8MdeD25Fjiur/yaVExKdSSyvl67P9lkOd7vR6Wl5dDeYDBN5Xxsrq6GjXCSrksWoVpNEmXdzjHaJKYQXdUeiZWV25H6RevvfZaKKO15+EoYSpH0PG2+l6vl+Mf9bFxfI4oQzpSo9EIW531wNRbzhmcpjXpbW1tmbEtJP1arRaoFh2LQU9mmkfWdgCeqHgzkbXNvFKphKPCeGu39z7nlilpWQNL/nJURX1ffkuatVot5MUTaExNZ1sEewMBA5cymVzKFuAYJCQun0/KA5rrw+Wy1HvNp8v9Bw8ehPsS92VhYQEAQuwXna/3w5tumFdnlHm57BYW/cILEHvkiC2k2WzmFiVNk+jj7ATszinf99ixY7mxJ3YatlnFFtmi+ujvZ9WXoTcpvvzyy6G8i4uLpi1hVHvMYUWiXBISEhKOCKZiFGVoWkAgK+b6+nrOy0VLP7VazTxqzjISstrIm4mYarACY1mSSbPZzHmTMCyjaFGQJOdczvec72uDbqvVChoJS11ZlgWjl0j72igqafBBFpy+pbWINsASWEyitdrLotHu3r0bvEY46NM4kqqku7y8HL7DqVOnxkqrSL13buc4xPv374c8xA/+4sWLuHv3bnjWivUuZWFvKabnygyd+w2tGbJBvNFo5GgUS1KNGcDlr9Tz2LFjIV5+o9EIGp0YtCflYaK1gCzLwuHTrVYrHJZhbSz8pNIxSUJPSEhIOCKYqIQuPugsLeqj3ASyanLoWnaBYj6XOWteYTn8qfy1QtZy/rwrtYgXbzQaOV7d4p/5HebopG6iWfDRelw3bie5xr7nHKyMeW3WYqwySGgB9ifWkrRcZ5dMzkN/B22/sAxoIhHeu3fPdGUbBVZfET/jLMuCRmGlvdu82u12MKZJuc+dOxfamQN5cfhk/uas/Wh7zH5Lg9YYYO2UJXHRlLzfCWltGe5jdiBLA+RQzK1WK3wTGVtPnz6Nxi3XWp7OV4/povjn1m5nKaPsMQAGhm75Ppam9UmS1qdiFOVg+tZWfmBnQt/a2srFotZqf7PZNNVYPuOSP2zRMWy87d4qE6fFsdf7/f7QINX1jrUHMJhgpVxZlpkeAPLssWPHhg6qAAaThI4eyR243+/nokfKOzww2fdcJnKhGngwldWH8+VvJkbGFy9e5Caa3QwYbhdpjwcPHoRJSf4Co50/qidXfU3aTDYeNRqNYChdX18PG5M4DStiKC90+gxQebdo4RmHSuJJPNYvJS+mX5rN5lDMJO31Yo1bptrkbNherxdilwsNU6lUglGcBbqYn7rOR8NyaiiDcy7sM6hWqyGmOhuMY2U4zEiUS0JCQsIRwcSNorKKilTFpxABO6shB+xiyH1R/2M7BZk2YEmpyOe90+nk/LJZctAukEX5arWR6R0AQ+VaXV2NGmCl/uwiyfSM5TvOsdtZQmetB4i78Xnvc66gwDC1pcFtpKVuKZfQFqNI+2Xg9/j7yQ7US5cuRY3WXGYpj+XCaBmnxV3yzp07IVgZsKPJbG5umi5/3Ef4EGcgfzrWfkqDse+rn5H7vAtW6sNlZQpJl1eXm49vlDzEoHz8+PGQ1srKimmULKNkrHayfOcZ2ideynXx4sUwJiVaI7tY7laLnAamMqEDyPmeW1uo2TOAB7+Oy6InGh4kesMP0w5WaAD2y2ZOkJ+ViU5sAVynWF17vZ65AUjy2tjYiE5wsnCdPn063OdOyZOWPiuUPVN6vV6gBfg5i69nH3v2IdebiRjsiw/k/ZNFvZbNQLv1PS9DpbJzPunDhw9DKFxrC75ehIsmOysGzMrKinlknxURVKetD1Qpao/d8LgWr122UHBf4KMAeWKPxZMB8kKLnjhlERScOnUqbI6rVCoh3ALbrSZBc3Ae58+fD+UBgPfffz8cFPJJmcyBRLkkJCQkHBlMjXJhCZ1XQFHx+IAFtsrLs2L0YimU07HUWFajLKMH0z8stfFvkcR0uS1VkA1LlteHSC462JVl1LI8avg6UypMk8h9jhhoHXDBEhp7tvAOVYYlQVnSVbVaDcZQDqx2UBKYlHNlZSXUQ7Qbq6z6d8zoxpqKXBNJnKNHWv2Kd9nqo9qAgYYmkrAOu6Clw1HUf+s7jGNMlTLF6sB1j/V7SYvH4crKSnhGJPS5ublw/+nTp0Na5qQMkpLvmTNnAAzGzre+9S0AA0pU7yQ9rFL7xCd0ID/Bcedgno47DNMROsIhT3C8Fd4KV8vqMNM3MtFsbm6aXh+SNjAcglff5w5sgRcoi6/n8na73bA1W6gXvTBIvszT8kLEz+uDJHiiYpdOyZOf1dADmb1z+JzXdrsdeO1JDtJKpRIWEsn31KlTJqesuVcLRQO43+/n3N50pErOS0clBAb9j+m7/ZosrMWAr2tenMslfYUXKkuwEujvz2XgPgYMBBm5durUqdzBKewdo9PlOliLlbYZFAkhuvy6L5w4cQLf8R3fASB/WIY1dg7T5J4ol4SEhIQjgon7ocuxaNaZoByIy7qfZVmQVK0Ie9bGA05LR0+UlZXzlHT5DEXvdzZdWIdpsFTFZbB87Z3b2bzE/uCxSHZihLVoEg7G1W63hyRN3szy7Nkz0wuADcdWMDNuZwss7Ul+rN3cuXMnF0hL7u9VqrGkIy2BSX3FGFur1UIseb1xrChdK1+WYll6ZTop5tNu5SV9ZGtrayjIGr+3n9LgKJqSPLO2thY0t1qtZgbM4/QsDZv7NRscxfvl5MmT4RmR1NlPfVxY30EwiiODjL0bN27g3XffBbDTlw6TVM5IEnpCQkLCEcFIErpz7iSAXwLwLwHwAP4ygHcB/BqAawBuA/hR7/3TsrTEIMpubQy9BZevsUQpXLY2OFmBuiwu05Im6vV61OVLAl/xlmPWAqz3tHuaPCe8JNfV4gF527SO3S7vWacfcf5SBtnuz/fZ6NrpdHJx1nVQsBiXHgvUJeneuXMnZzzk53YD1sakXJxvrB2AgXQlGge7YbK2xZohf2udL5clZhAU8Hfi/mG5tbI212g0hvrrXqRV/a4VB17/5npLH2q1WjljPJCXpHX4A71Nn/u4SOrAgE8XDcoylAIYkvZjfD2nYWkisbpzPlK3ZrMZTj+SZ+/fv1/oxjstjEq5/DyA/917/yPOuTqAGQB/E8DveO9/1jn3RQBfBPBTRYmIAZSNQMBOI3F0QOvQCO+9SbnEDE76o8c+vlAgWZaZ/uIAwoTOsPJlVd8y0FQqO+d4xjoUe5toA5tzO7G1q9VqbrHTqFarOcOrHoT6G4ihud/v57yILMQMbsBgkRWPhkePHu3J73wcT42y++vr6+FgjQsXLpTSSbsZqDxxWiErLGMa9xkApoBipT9KWQTWO+MsDlzGra2tnBeLlJnzs8IeCLThmL1fePORQBtKJT9dz1h9d/sdGTIeZGLPsiwY3WPRKaeBUsrFOXcCwPcD+GUA8N63vfcrAD4D4Evbj30JwA8fVCETEhISEsoxioR+HcAjAP+Dc+5fBvA1AD8O4Jz3fmn7mfsAzlkvO+e+AOALwGCLraiXWooB7JWU6YhKpRIMRuzqKKt9lmWmGh07nYi30Mv7/JvLo6MLskrGEodzbii8ABsJmQaxXCsrlUq4PzMzMyTFc1qcl35G/uotzLE6cF4cbGxU6O3z4qq4ubkZJOG9SkqjSOgxukDui3b0+PHjsJPUKps2II+qHXBf429nSayWGyDnE4ujHmtHq4zsMrgXKZK1zH6/n9NqgYFWFqMYtYTe7/fN/Q3Pnz8PdRBJ/cSJE+Has2fPcm0i4H5ruWTuB3hvBzA41k5+37lzxwyLMA3D6SijtgrguwD8Ve/9V5xzP48BvRLgvffOObO3eO/fBvA2ALz11lteT6IMK34DDwYOWavpEyDfOXhi5E1K/I6+rnli5tatrfnWB2OfZH5Ont3Y2Aj3LU6Z1fPZ2VmzU0pHYr96S+3rdrs5P2IBdzhJv9VqhUHKXhbWJMDfRNNLwIAXlQldL4xlGJX35PqUDVzrOy0vL4d2lM0kZe8UldmisbjPyDdnOw2/wxM2Uy7yTVhQiU3c1kRi2Yx2C/422huNN6Pp76HHFXv1aJuQ0C+S18mTJ4MdyTmXi9Ioz1nhPCxqSi/2RbRM0bvAYIzIWaVZluGjjz4CkPeeKop0eVAYxctlEcCi9/4r2///hxhM8A+ccxcAYPvvw4MpYkJCQkLCKCiV0L33951zd5xzb3jv3wXwAwC+tf3vcwB+dvvvb46QFjqdTqGkxWq7vMMGGB0PnVUrlnRYKrKkE5ZouAy881JgGc+Y+tB10LtVOa+NjY2h93gF73Q6OWlHl5E9UPShu1oi4Fjylsrtvc95C+mDNzjfMgqi3++Hdrp7924IBBbzjolBS+gxKYrLxc+OQ9HIwRjVajV4+HBelnQbk37lGabtpD159/DW1taQkbhIGuSDXoA8NTaOlDmOMdVCzINE+gX7qfN5B7oc+n1NazK9IhD6ZX5+fshP3fKHt8o+yjUuT1lbcXu+8sorYcy8//77OQcG/exBY1Si9K8C+NVtD5dbAP59DKT7X3fOfR7ARwB+9GCKmJCQkJAwCkaa0L333wDw3catHxgnM+G7eLXikLaxlVSkZj6diCV4lo44DZFgWWLm2NnynnVyDBtba7XaEE+n/a/ZyGtJXBwbQ/t4a7dGy0VSoI+aKzqCS8em0VKkdovj3Y4aLHVZUjdrAPfv3z8QNy7m4y33Uv4OZfkzj/vw4cOc3ULSL4vbYV2z3Ol4z0K32x3ag6EDwfF30lw1B/KK8emx+u4F3Ee5boJerxf81I8fPx7c/La2tqIaMjDsp677KIfePXXqVC5MMZDfAc1aBKc7CiyjdBm4XnL6kXMON2/eBGBrD+NokLvBRLf+ez/YLs3+3jxYWDWxzpzkLfL8ATgwlkCoHWDHYCNhB4D4yeNMbVgqJsPaxKTrK2myMbhIBa3X67nDLDQajUYupIDVQdgYXDTBee9zgbhkEFoRAy2KhZFlWRh8Dx8+HHkw6fKP2sn3w5OAaRDxKV5YWACQ70u8kFh91Uozdo2PChTMzs4G7w3eoMPB12QC44igZcbr/cQoFAUvOtKH6/V6EKxi1FiRIRzYmdS99+EYO/FTd84FeobbZr/bQ9ffov+AwVml8s0++OADAIP2mJTnS9r6n5CQkHBEMJXwubHdmHxoseWKxqor71Bjwx6HprXCxXL6RSfPt9ttk/rglZa1BIsK4GsioddqtRw9A+TpjFarFaQb1jL4ZCJR5Vit5K3sovpyHS0qiMvS7XYDncOGV6mDDpLE14HBSU7iqri2thbKG5OUuG0sysTqB7F+o9McBVoblO8jwZcuXLhQ6A4Zk7SKjJQCLXXzodx8ZFuv1xva/8DvtdvtqMG+qIwxV9Sy+7EdxvIO05nSB2dmZsL4tI5GZG2dQ0DLNQ7t8fz589Ae4so4NzcX0lpeXs4dtq5damPhdLkvlEnQVjvpfin7G+TZ9957L3e830G6M0482qJzLtewPNFoLhHIezEwrx3jTXmiYQ5T0uKYKNakw3SGFYnQmtCFSpJ0defodrs5f2I94NgL4tixY2ansWwGXG62RXAUR257fhYYLB7sE1+2ecXy/ZZybWxs4O7du+HaqJPrODTLfiLmASLqe61WC6fVW9x8EeWivz8PYiC/GQcY9DXxhT927Figf3SMH2AwWVrxe3ivRFkZyxbD3X4P7tcyHtbX10PUQulfbL/S+ekxqxd5+T7SnqdOnQqTO5D3fin7Zvy7LC5L2eLA5Zdn5Vi7arUazipdX18/0P6eKJeEhISEI4KJUy7iaaINRUBebYv5oWvDn3MuqJ0c5Y0PtWUvF6Y5LAOrpnTkfb0VXq/QLPlrLSN29J2lrjYajVy5dHt0Op2h0AJAflehtbXf8lCoVqvBGKfDDFi+tCydaA+hjz76KOziY42jjJqYhnSuYRnonjx5Euo2Pz8/RAGNUm7uw0X7AYAd7yUJjwEMvIWk33G/1J4vkleZIVpLl1pzYGiJlfu1JV0z7cj9udvthnALfPoWG0qL+oL2rpFnOHooH2cnWF5ezo27WLnld5kxNUbXWNBpnT59Gm+++SaA/OHTZZrUbjAVDp3VEq6M3roP5CkXq+I6joqljlr58uLA78hv8fiQdPUEFjtj0fowW1tbuUGkn+10OoGv997nQhIwrw3k3d64I/b7/TA5W5Mp/2Ze1jqYARjuwMzRs5eGvPPw4cNofhZi/GWZx8NBg/uEUB/1ej3nDSQoW7SssAi678tzDx8ONlo3Go3gadPpdMIiaW0sYwpxc3NzqI/qsL0WJcP1Lmtzi27khcqiTph+kUl4bm4ulFHHvtG8tHZl1JPls2fPwm8Ov+ucC/RLUbgRXV5BLLSEVcdRwlAIpZZlWaBfxHtHe5XtZXJPlEtCQkLCEcHEJXRZhZkK4O32enXSGw+0MY6t/BwFzlKvNB3C1AOXjdO3yi9/5bfePKFpIaZ/WIVkacPyVohF4bOoGpbQy4xeon202+0gebIEbtWFKSr+Jux7vpu45zEpcVJ+uzE4t+NNdO/evSA1c8x4/g5lWoZFXQlYG3DOhU0qCwsL4ZtKO1er1dBXmH7r9XpD319vELPG1jjtG6PfLMToF2AgqYtGWq/XzQiV/D7nZUnAIvk7t3OcnRhiAYQDnjUFY5VXoPMp0hxHieooz5w8eRI3btwAMPB+AYCVlZV900iThABm61UAAB3tSURBVJ6QkJBwRDAVDp2Nk3rV1dIrS8L6mCtgIIUwp1i2CluSrnWN+UeGJYXGAleJxMTultbz1WrV3PWXZVnO1Uv+svQqv9vt9pDUpOtrSVXsummly+/q49EA4NatWwCA1dVVM2SABe3Cp3lTKcM0wZzz1tZW4LhFUteumTFpHBg2hOr7nNejR49CO166dAnXr18HsLPrcH19PZcuc9HMp0v6HNbC6qcxQ+FeY4lb/U7AGm2r1crtlSgy4rMrIp+BIJK/Ps5OtE955/Hjx+aYnqS9xnuPEydOANg5/ei9994LgeL2Grd+4hO6nmR4suPfTK1YE5SO6QIMJvyiOOndbjd0cDbiSAMWbc+3DLeSV7fbNVVPfZYm58W/m82muVAwHcVUkj6WTu5bnhhcR5mEJa16vZ5rxyJLv94PIIvVnTt3htrlqIDbQzw17t+/D2Cw8ajMd3lU6MWSY8lfunQJwE6skJs3b+bOouUyaIcAjuxoeVfp37pMjNg741Bj/CxvjhNDZqVSKQwTYI0dnhP6/X4uSqN4v3B8Hom3zo4Kk4YOSXLjxo2wYMteDmB3Qs3RG4UJCQkJ36aY+tZ/dh8E8m5jQD5ConbD0u/oFdxSfa046oIiKZUlewFLRFweNlRJHS2p2ToRidNin3QOY8BtEDO8AsMun1IH0USOHz+eo7gsoxf7v7NbnEiq4ho2jkGUpUW9U1hjr6r/foDLJRJgo9HA2bNnAQzHZBdYfalM0uV+ubS0FAzYYuy7cuVK0IqYguA2ZeO1aFKNRsPUKCyfdGvsjFKHMrAkzVrz+vo6gAH9UhQmoFqt5rRiuW8dQclRGvngabm/vLxc6ERwkND5zczM4I033gj35CDz3fT9qXm5hALQJhS+bnFd1qYdpk74vEG+zryc5ZlgbcvWeVmDk/2xOQ8dNtOK1sd5aR9wqwNbPDOAXIwI9gbS4HJJvo1GI8qbWm3D1/jILUl/N+CFBJie/3kZ9Pd79OhRoKtkwpD7e5kg2Ctka2srTN7yzV566aXQ5nIPsD2ivN85U9Y5l4sHxHXRv8sm7LI6xmw3MZsV2734cBdgOL5LkQcXCyJMk0l7njx5Mni/9Pv94ONfdq7xOOCF0bIDWHn0+zuHw7z++uvhvY8//njsvpQol4SEhIQjgqlI6BwYSxtItW94v9/PScJ82IW8I5I5e3owfWIdrWaplZ1OxwxDYPloa6nekta5DpYEJOXRYQW4nKw+A/kIfGwI43eYkpHfHIhLfIBjEoRFC/HzL168CJTLbnzPJQ/+q8thURh6R90kocurd3eK4c2S9kaRsvgZDk8hPtaiEVWrVZw7dw7AoL+Kes5p8L4OywtKxg5LkzGUhQmw+nVZfXW/k+fZsM+RTjnMh86LwTtnWfMXmqzX64V46nNzc6HvPn36NKfd7wZldR9Vs6hWq7nDp1kLGwVTibbonBuKUQHkP4h+B8h7eFiTnuXhwohZ+mWi4/vM3fPzfJ4nq1Y8sWnvFl4cuLx88gzXW9Qvbg+dv+RjqXcW9VKr1UKn5QFdZn/ga9LmDx8+DFSPlHW/J9jYgD0sYKpgaWkpeKPwBjGL3hsHXF+hD+7cuYNr164BGLhQyjd+8ODBUB5sc/LeD1GBrVYryvnrOEiWGyu/w1RqbEMc18t6Dxjeps8eYLyoWPYenYeOg8RujfPz82HRYPqFw27spk9z25UtdrH0ZZwx/TIqEuWSkJCQcEQwFcqFN8zwCmv5nGpVVMdDB2Bu99eGVyC+dZi9NzhfVmFl1Yx5ArDkHqML5H3WAnQbsKWe/eq1xAQMjGa88lvSi0iMfH6oFSc9ZhTja9LOi4uLUW+g/YLVhns1OO435Jusrq6G7eWvvPJKOOawjHKJ3bcke3n2yZMnoa9du3Yt+KdvbW0FH2vuV+zVJdQF/+XxVERpcFks6dXq6/o9XW8rXwG3IZ8jauUb09y0c0ClUjHDBIgfPLATJoA9iEZB0TiIOR7EwOP4lVdeGbkMQJLQExISEo4MprJTVLvxsaFJB9/y3udWLOadgYGUwT7a1qoa25KuJWXJQ+7J9Xq9PmSc1GD/WB1oi6Vy3lVq8Wk6rK/FkfPRZQyLO2cD2TiHWut61mq1YIB79uzZkCF3XJQZN2NawmFEtVoNkt2xY8dw+vRpAHk3WkvqLqtPTBKWvGq1WpDQr1y5EvhfkUL1NnLdPzY3N4M9pdFoFBp0yzhl7eY7qr2jjG9vt9u5QHzcn6Wcsfe03YnHpfZT1+GR+Tg7KafUTTCqdrpbLXY3GulEJ3ShFoomFIuOEGRZZsYHZ6Mmp1XUGM7tbD+2GjxmuI1t9+frsuhYMWq896Y/MBt7rQmbB1jsvq4vU0XtdjscABBrFyvONucrW9K1N1AZitTzowL5vouLi+GaxOyI0YoCfa2M+uADMDjuixhLJb6OXlDY60rS4mfKjiDke2U0ShFiNJqVRr/fz52Rq8/51YbeonR5851zO8fZee+D94vQL1mWhU1zGxsbU+uz4y4GI1Euzrn/2Dn3TefcHznn/r5zrumcu+6c+4pz7gPn3K8554bjvyYkJCQkTAylErpz7hKA/wjADe/9hnPu1wF8FsCnAfxd7/2XnXO/CODzAH6hJC0456KuOCwZ8krKRkut6vMKrd20NMXANIqlFsYMNFweNlJap7XwdatclpbB5bJOK2d473MUk+XLyqqmpFWv14foKu0fb0Gk9tXV1eB7Pq5Ll6ZXjnIgr36/HwIsST2PHz8eNfLq9/l6rC8yJSc0WLPZDKfiSETIDz/80Owr1v4IfapWUXm1G65cG9X4q/ttUZRN7tebm5shXz5RjMMACNi9l90peS6R51dXV0O6YihttVq5w+U5mNhewNr4Qbjhjkq5VAG0nHMdADMAlgD8KQA/tn3/SwB+BiUTOrDjxVHk2cK/2Ypdq9VyAwfIe5X0er3cJoQiHlY/y2kC+dCkWZYFDw/m1Th93rzEeej71lFuzuWPmitqG20zsDb+cDRFUam1qqrTZ2ivG2AQBU5U31H483FU8KME53bi68gCWK/Xc/76sTbnNORazANGfsv3/fjjj8O3kkmp3W6HDUnAcGhqFmq898GzhEPacv+z/MFjdYiVOVbXGFgAdM4FP3Xpg7yBqGyCZL6exzGws/lI0pifny88zm63fXpcYWhclIpK3vu7AP4rAB9jMJE/A/A1ACvee2mVRQCXrPedc19wzn3VOfdVaZSEhISEhP3HKJTLPIDPALgOYAXAPwDwg6Nm4L1/G8DbAPDWW295raqxfyxHTqP3w2pYr9fDb1GBeMemll6KVBtW9ZiCYIu4ZdHWkSJjaXF5+B0diEunxaEOLEmGD/lgA6mVFr+nd9xJXkwFWVSPSCRLS0u7kkp4x944HgJltMNhBfc7iSJ47949XL58GcAw/QYMe3KV1ZnbRp5dW1vD7du3AQCvvvoqAODcuXOhL927dy86ToB8X9ja2goanWWwZC3D0qr1t7X+z1oCQ4/VWJ+Rtm02m7mxY40HrqtVH35HdpM68lOfmZkJ741z8HQMU5XQAfxpAB967x957zsAfgPA9wE46ZyTmWMBwN1YAgkJCQkJB49ROPSPAXyvc24GwAaAHwDwVQC/C+BHAHwZwOcA/GZZQs451Gq1qJ+qFY+cdzhyuFdtDJX0BcxlWzsyOQ63JbFIOeW9Ij9U3sFqgY1I7Gcu77N/bbvdHgqZy79Z4uXycpvysWSSLreHVS4t7Usacnjx48ePdxWIyzKAxnhk672DlGYOCtr+sLq6Gtrx/PnzQzYIy8hYBItjr1QquXgvwGDX6sWLFwEM+oIEE7O0H86ffb/ZxdaSfq0xNA5GMQxafUA0j/X19bCTVAeoi2kXGlaobX2cnQ7ru7y8vGc+/SBQOqF777/inPuHAL4OoAvg9zGgUP5XAF92zv3t7Wu/XJaWTOjcObiTWOdusu8p0wLse84fw4r1zaom+4vrzqi9Tdi4yUF7LHBoAD1gWA3nOrLvuZSRI+RxGuxRw361Fv3CvudyDJfeZKLrqyHPiscGb5gaZZIt6uSWR44ujzUYPymw6i6bgVqtVvB5tigQYHS6SRvQ+fAGYCAoCNWzsLAQ+rDc1xM6UyZ8LqmUu8j7atxJLUbPWOkVeQD1er1grD927FjooywYFeUfy7ff74fNR865MI54Yt8P+mW/MZKXi/f+bwH4W+ryLQDfs+8lSkhISEjYFSa+9Z+NQsBw+FxL1WaXPpEyrJC37HuuQ+EKiugMDoMbO46On7X8crWBS67F3BIBOxSwvMe0jkDei/ndCyqVSs5f16qPJVlxECPxc2b3sHFhSWMxl9Iyye2TAG1AZw3t0aNHoS/IdnOua2y3c0xqt+gXefbBgweB3uGdpFKulZUVc3coh+YQt8hKpZLT0OQ99tVmbXFU18TYOIrBag/5rekXraHH6B02pjI1yu0keYh21Wq1wrVpHmenMZUzRTnWeLfbzcUz143O29ezLAsNF7PYS0ezGtZ7b25CYEinZSqn0+kUxlTRscitWNIWj2/x1zE1mH3PrfrygBIVsNVqhfs8SPWiIXXhAf3o0SMAO3FB6vX6vk3o0+70+42yyYvvb21thUVS+O2ZmZmo10hZetYkyt5dkle9Xsf58+cBIEzsH3zwQfA9r1Qquclde1qtr6/n6Jci33KG5XetPXmsfmEtVDoNjX6/H7xfZmZmwrwhY4vPxdX56/bXZRY/dQHHf8myLFBqHAF1GvH7j96WvYSEhIRvU0wl2iJLntoXmlU4YKA68RZ+vcOLV3CWWC2KgLUBS72vVqs5q76lObCkLWXlE9V5VebIkZYkzUfBac1DoCV3LWlb6qq8w3QLPyt56EOoWfqXIFOWZjGKhD0qzaJV7k8imGZjqo79zFnDkp284vly6dKl3Gn3MR9tQUy6tegIyXdxcTFonxIN8sqVK7h58yaAvGRpHd/Y7/dDua0jGRnaE8uS0Iv+P+o9SZvrbUWSZOcDPX/oNATsJcNnFHA8dTGUtlqt4LO+vLwcDRg2CUyFctGdz3KHk/u8cYC36zO1Ih2mVquZm4msD27x9XrxYGjvi36/n6OCLE5P/rLHjXM72/ylw+lDMSzOntuIBzzbEnToYX2GquXlwr+lTVdWVvD48WMA+c1Tu0FMZbbK8EmFNZkyuA24X8rk8PjxY5w9exZAnru1EJscy/j2zc3N4M4o33R+fj6E3/3www/N6KCWbYi56ti5ueOgjFYqei62OHS73UC/iODE4XOtwzJiZWAhTOYPpmBOnTqVi2QqY0cWQF3Og+zziXJJSEhIOCKYCuUC5NVJKzIa0xIiBXA8Y6FGgPyhzLGj7fQ1ywum0WjkNinx0XbWoRQsobN0I1oEUzIC9hdm67vlM2tFn4x579RqtbAZgqUnpmEs7xtLKuMofVYYgXEwisr8SQd7sViGfW3s0/1yZWUl9KUzZ86U0lxMwxUZF/X7euNRvV4P9Eun08HHH3+cSx/YGZusDfb7/Zz3izwX8yYZddOUpc3FvGdGkdalHOIkkGVZbsxyfXS6Rd9Q6sSbj0RC73Q6YezwXGIF9SsyJO8WSUJPSEhIOCKYih86r1jdbjcnVfNqDOT9SZ1zQfpkntpa6azwAtYJQPIsMMzXs3HDkjIs6dWSIrSUwa6RUhZOn4/ZslwjdT0FUl8OrFQk0bBNoVqtBgnu3r17R861cL8R63fA6BIWu6QK79poNHKHFmtprshXO2Z01veF/11cXAwc+rlz54JGeu/evaE8tDYg/UbcHnXwNy6vHtMxHFSf4zABzKdbrsJlu3d5PHGYANbKZXyzU8VuMa4GO9EJXToFR1jUfttsDAXy53lmWRboi5i12gpyzz61vC1e0zccCZEHDvvdst82G0qsCZ19wAWNRiOoZ9aHZpW93++b2+25o0i+GxsboR6xLfpWHbiMEr97bW1tz2eGCsqMop9kWMbLcepqeaMsLS2Ftmf/9Fg0xnEoCE3VPXnyJOR1+fJlXLo0iIDd6XRCeACuq46RzuXa3NwMwpaOsz7OAreffUW3DRtK+bwDAEOhPXRZ9LfWThVC61j7ULSDxjiT9LjtkSiXhISEhCOCiUvocgiy5bfLftHsD84GJwEba6xQAparkZbe5f+SV7PZzD1z7NixoXwtlYxdzSwjI/vXs2+4rOp6J6rlo88HVnMdpewbGxvhUGLLddNyK2NpodPphEOgd4tRfc8n5cI1DrQkrIO+We6jAitan1yXtItikTPa7XaIiriwsGBGZozlMar7H38n0cqq1WoI5HX16tVAvwg9o11z9ZjSuzRj+Vlg7bZsd2VRHbkNrPj+rAmtrq4GaouD41nfKeZrz9eZvtGUapZl5hkHMZSNnyJMnEPXHZ89QIAdukAH2Jffems/h67VnV1zWJrzljTkw/JkauXFaekPag1ojivDap/wjvI+b6u3LO7ynuTPdZdOU6vVQluW+UJb5V5eXg4TyTihXItU/k8irMlhlEE4CuUxSr6VSiVE+bt//z4uXLgQrgPx/jFOuSweeGlpKfSfs2fPBm791q1bAHZ85qUsemFjmxNz1ZyfVa5YO3MZiybX2L1YNFVBu90OdZqdnR0SGscROvR40mnosL7W94vlMa7AkyiXhISEhCOCqUVbFElcb4sXSYTVliI1iGkDpiN4i7Vck2A68r6syiJN6NWQ1TAdXS62bZ5VLo6RzpK0gNVDSy3ksrOExhSQSEWNRsPc1WlJOlb6i4uLuYOuy2CpxjEPAY3DQrMwmPYbF+wtxLAiZJblzxLr06dPg9R85swZAHltT0uGo0ruFu3TbreDH3q1Wg1b2a9evQpgIKlbcb9ZUufxYHlnxTSeIqpOx/HXz2ptsoiu0J5t4kvvvQ/0KjtdjHqcnQ4ToOuuz0Cw9oPs15hIEnpCQkLCEcFUYrkA+dWLpVCORwwMGzosv1w2AloGI5GYq9VqbrW0dn9a7ocsJVinKmneTEv8XIdYrA4r9owlzXMdq9VqkKpbrdaQMdRytdIQQ9b9+/dLpdMiKeIwSt37hd3aB8bh4GOQMMbSh+fm5swAc1Z+o5Sb+7hIrHfu3Al9QQztly9fDodQW5Irj81+v5/zT9eao+bFdfmLMI6mM2o6zKeLPY01YYsZ0O3OdddlZJfPcbS23WAqW//5XE0Gb83l5y0jXSzWOL+nJ+Esy3KTnvYT14uBpdZZfuhsXOLwAfyOXGOqhi3flvcEG3mtjUd6sSuDnuhrtVqIqri6ujoy3WB1WiBugPukG0zHMRJb7zEFMW5bCKUm3ij1ej1n/C6bJMtgCTMvXrwI9MvLL78MYED5SFnu3LlTOGHyQsMBqtjJIBbewGqnmMAlGHXBjB0eAuy0M8f/Z5rVool4fmGnhqKAdpazxX5GZ0yUS0JCQsIRwVTcFvUKHTOAyPMCXhWZLrFUTD6BxdqSXGRc4jTkmrX7y6oDn7DEbpO8amspRKtsLClzgDD5K+l3Op3g1152RJxFt3jvg4R+ULSC9U0/CdgP6dei0caF9DExSD548CDs6ORvvhsXSX5PS6xyALIcEn7lyhW89NJLAAb9Tk5C4vzZfViud7vdoUBeRX3V0oYs6nK338OiVDktPhxb/Om1o4KG3h9TRNUwO2HRw1wupmpGxcQ3FhUdEce8lXW2p8U/dbvd3CTNapK2MmtrctHioTuowIpLzrSP5SESC2+g45VbYA8gSYtpH+H8Yp4WAvZfljSfPHkSjs4qUkctFPn46uc07/hJoGCY7hp3UAn2Y0IXSBlevHgR9guIjzpgf7Oib1L0DAswwuHzxqMLFy6ECU4O6dBpspCmox6yvUeXu6id9oO+s7zjeMFmqohDf/CY0+/r9PUcxmMrZn+ITe7j1jdRLgkJCQlHBFOR0GMrj6XWsPGRV2g++NU62Nla9WP+rwLtM8uWaesoOAGfXsQSieWNwFqKbhtdJosmybIseKbwCUuxeOfWlmO5v7S0FAwyluZRBMvab2E/pdRJgr//Xumo/QC3s9AhjUYjnEIPDO8DKMufx5beJa3x4MGDYIy9cOFCoH2EEnz69GlubBSN2c3NzZAWj4Xd+GNbkq3UoayPWpoKl5v97qW8vFO8TNOxggJa4Ut4PmQD6W40w4lO6KKO6Am9SOXij8y0gWUZ1zFdYi5GnLY8q9PnDsETOn+EmGeKYNQJgb1kut1u+PgcEoAXO7k2OzubqwNz61Z5NB9bFLuljI46LIh923HeY1gc627zOChIX3n06FGYEOfm5swJ2So7T/yxWDDW2JCDMWq1WjgYQ2iYra2tEH6ZYW0M1Ic9xMLuFiFGFVnPxL5fEV3IZdnY2AjPysTO8ZfKyqU94vg6kBdEOQ1+b1QkyiUhISHhiMBN0gPBOfcIwBqAxxPLdDycweEtG3C4y3eYywYc7vId5rIBh7t83y5lu+q9f6nsoYlO6ADgnPuq9/67J5rpiDjMZQMOd/kOc9mAw12+w1w24HCXL5Utj0S5JCQkJBwRpAk9ISEh4YhgGhP621PIc1Qc5rIBh7t8h7lswOEu32EuG3C4y5fKRpg4h56QkJCQcDBIlEtCQkLCEUGa0BMSEhKOCCY2oTvnftA5965z7gPn3BcnlW+kLJedc7/rnPuWc+6bzrkf377+M865u865b2z/+/QUy3jbOfeH2+X46va1U86533bOvb/9d34K5XqD2ucbzrnnzrmfmGbbOed+xTn30Dn3R3TNbCs3wH+73Q//hXPuu6ZUvv/SOffOdhn+sXPu5Pb1a865DWrHX5xC2aLf0jn3N7bb7l3n3L9xkGUrKN+vUdluO+e+sX190m0Xm0em1/dka/1B/gOQAbgJ4GUAdQB/AODGJPKOlOcCgO/a/n0cwHsAbgD4GQD/6bTKpcp4G8AZde2/APDF7d9fBPBzUy5jBuA+gKvTbDsA3w/guwD8UVlbAfg0gP8NgAPwvQC+MqXy/RkA1e3fP0flu8bPTals5rfcHiN/AKAB4Pr2mM4mXT51/78G8J9Nqe1i88jU+t6kJPTvAfCB9/6W974N4MsAPjOhvIfgvV/y3n99+/cLAH8M4NK0yjMGPgPgS9u/vwTgh6dYFgD4AQA3vfcfTbMQ3vv/B8Cyuhxrq88A+J/8AP8cwEnn3AUcIKzyee//qfdegpr8cwALB1mGGCJtF8NnAHzZe7/lvf8QwAcYjO0DQ1H53CDQyY8C+PsHWYYYCuaRqfW9SU3olwDcof8v4pBMoM65awC+E8BXti/9lW116FemQWkQPIB/6pz7mnPuC9vXznnvl7Z/3wdwbjpFC/gs8oPpsLQdEG+rw9gX/zIGkpvgunPu951z/7dz7k9OqUzWtzxsbfcnATzw3r9P16bSdmoemVrf+7Y2ijrnjgH4RwB+wnv/HMAvAHgFwL8CYAkDdW5a+BPe++8C8GcB/IfOue/nm36gw03N59Q5VwfwQwD+wfalw9R2OUy7rYrgnPtpAF0Av7p9aQnAFe/9dwL4awD+nnNubsLFOrTfUuEvIC9QTKXtjHkkYNJ9b1IT+l0Al+n/C9vXpgbnXA2Dj/Cr3vvfAADv/QPvfc973wfw3+OA1ckieO/vbv99COAfb5flgaho238fTqt8GCw0X/fePwAOV9ttI9ZWh6YvOuf+EoA/D+Avbg98bNMZT7Z/fw0Dnvr1SZar4FseprarAvi3AfyaXJtG21nzCKbY9yY1of8egNecc9e3JbvPAvitCeU9hG3u7ZcB/LH3/u/Qdeaz/i0Af6TfnQScc7POuePyGwMD2h9h0Gaf237scwB+cxrl20ZOOjosbUeItdVvAfj3tj0OvhfAM1KPJwbn3A8C+OsAfsh7v07XX3LOZdu/XwbwGoBbEy5b7Fv+FoDPOucazrnr22X7/yZZNsKfBvCO935RLky67WLzCKbZ9yZoEf40BlbgmwB+elL5RsryJzBQg/4FgG9s//s0gP8ZwB9uX/8tABemVL6XMfAm+AMA35T2AnAawO8AeB/A/wng1JTKNwvgCYATdG1qbYfBwrIEoIMBL/n5WFth4GHw3233wz8E8N1TKt8HGPCp0v9+cfvZf2f7m38DwNcB/JtTKFv0WwL46e22exfAn51G221f/x8B/Afq2Um3XWwemVrfS1v/ExISEo4Ivq2NogkJCQlHCWlCT0hISDgiSBN6QkJCwhFBmtATEhISjgjShJ6QkJBwRJAm9ISEhIQjgjShJyQkJBwR/P/ibQBFvEkRtAAAAABJRU5ErkJggg==\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "img = torch.from_numpy(cropped_ascent.astype(float))\n", - "print(img.size())\n", - "print(img[90,90])\n", - "img = img.clone().view(1,100,212)\n", - "print(img[:,90,90])\n", - "print(img.size())\n", - "img = torch.cat((img, img, img), 0).float()\n", - "show(img)\n", - "print(img[:,90,90])\n", - "img.div_(255);\n", - "print(img.size())" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAW0AAAC+CAYAAAD+3F4XAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJztvVuspNl13/ff51p1+vRtejjNy4gzIq0RKQYSZSNGEMmW\nZRGGoQCikAdChhFIVgIEiBU7cZDo8mL4IYBlwDCchzzEl4AxHFiyDIeEESSKJFimYkgkFcoWSQ2v\nIufGvnefe52qU/XloXrt/n3/WnW6yeGc4SH3Ahqn+qv6vm/f91r/9V9rl67r1KRJkyZNzoesvNkF\naNKkSZMmTy5t0W7SpEmTcyRt0W7SpEmTcyRt0W7SpEmTcyRt0W7SpEmTcyRt0W7SpEmTcySva9Eu\npfzFUsqLpZTPl1J+/ptVqCZNmjRpkkv5RnnapZQVSZ+X9GOSXpP0CUk/1XXdi9+84jVp0qRJE8rr\n0bT/tKQvdF331a7rJpL+maQPfnOK1aRJkyZNMnk9i/Y7JL2M/7/y8FqTJk2aNHmDZO2NfkEppcXJ\nN2nSpMk3IF3XFb/2ehbtVyW9E/9/9uG1BXnuuef0rne9S9PpVM8//7ze/e53azQaSZJWV1fr76bT\nqSRpNpvV613XaTab1evxN35bStHKytxgODw8rM8ppdTvB4PBvLJra/W3a2vzqm9tbdV3ra2t1fvi\n+5WVlfp5dXVV4QMopWhjY2OhrvHbyWRSP8c94/G4/u74+LiWZXV1tdYn7on//6t/9a/0kz/5kzo5\nOZGk+k62wfr6en1HtFFcj/fHb1dWVupn3hPPPTk5qc+IdpnNZrWsXdf12iCE793c3KzPyr5nG3u9\nWa74LsrNseLPpW/m5OREq6ur+uhHP6qf+ImfqHW5du2aJOny5cu1vjE2VlZWeu0VZYx3Rv1dVlZW\naj0nk4mked/u7+9Lku7cuaM7d+5Ikl566SVJ0oMHD2p5T05O6rNLKbXtYqwMBoNaBo71qPfKykp9\n1urqam98xzM4b+JZ6+vrtdzZOPqd3/kd/fk//+drfeIZHN8cv2z7uMY+4fjx9j44OKj9sbKy0qtb\nSPTHyclJb9zFd8fHx/X/W1tbtQ05rkLi2ng8XijXyclJHROsYymlrllx/9HRUe2vyWRS2+FjH/uY\nfviHf1jT6bTWcW1tTZcuXZIkvf3tb++tL/H8T3/60/rMZz6j4+Nj7e7u6rd/+7cXyi69vkX7E5L+\n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\npZT/7+G/v4jvWts9lFLKs6WU3yqlfKaU8oellL/28PrZjb2gsX2z/2m+IXxR0nOS1iX9gaT3vFHv\n+3b4J+nLkq7atV+W9D88/Pzzkv72m13Ob4V/kn5Y0vsl/fvHtZWk75P0Kc0prs8/HJflza7Dt1jb\n/U1JfyP57Xtb2/Xa462S3v/w87akz0l6z1mOvTdS0/7Tkr7Qdd1Xu66bSPpnkj74Br7v20GKFq2f\nD0r68MPPH5b0k2daom9R6brudyTdt8vL2uonJP2zrutOuq77iqQvaD4+vyNlSdtJ8/Hn8kG1tqvS\ndd2Nruv+4OHnfUl/JOlZneHYeyMX7XdIehn/f+XhtSbLpZP0/5RSPlFK+S8eXrvedd1NaT5gJD3z\nppXuW1+eWdJWPhZfVRuLmfxcKeUPSin/EOZ9a7slUkp5XnOL5Xe1fJ5+09uvOSK/teSHuq77k5J+\nXNJfLaX8Gc0XckrjaD65tLZ6cvmfJb2r67r3S7oh6e++yeX5lpZSyrakX5P01x9q3Gc2T9/IRftV\nSe/E/599eK3JEum67msP/96W9H9obkbdLKVcl6RSylsl3XrzSvgtL8va6lVJ34XftbFo0nXd7e4h\nCCvpH+iRCd/azqSUsqb5gv1Puq77yMPLZzb23shF+xOS/kQp5blSyoakn5L00TfwfedaSilbD3dv\nlVIuSPoLkv5Q8zb7mYc/+2lJH0kf8J0pRX0cdllbfVTST5VSNkop3y3pT0j6Tk892Wu7hwtNyH8q\n6dMPP7e2W5R/LOmzXdf9fVw7s7H3hiWM6rpuWkr5OUm/rvnm8I+6rvujN+p93wZyXdK/fBj2vybp\nn3Zd9+ullE9K+tVSys9K+qqkD72ZhfxWkVLK/y7pz0m6Vkp5SXP2w9+W9M+9rbqu+2wp5VclfVbS\nRNJ/Ba3yO06WtN2PllLeL2km6SuS/kuptZ1LKeWHJP1lSX9YSvmU5jDIL2nOHlmYp29E+7Uw9iZN\nmjQ5R9IckU2aNGlyjqQt2k2aNGlyjqQt2k2aNGlyjqQt2k2aNGlyjqQt2k2aNGlyjqQt2k2aNGly\njqQt2k2aNGlyjqQt2k2aNGlyjuT/B5o356YoiwKpAAAAAElFTkSuQmCC\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "show(transforms.Compose([\n", - " transforms.ToPILImage(),\n", - " transforms.ToTensor(),\n", - "])(img))" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "torch.Size([3, 256, 542])\n" - ] - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAC/CAYAAADuOyeQAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsvV2sbdlV5zfWPmeffT7uvVU2pGyE7TISDaaRWs6LeWgE\nNmnlQ2o1ch6sTkcRxEoUgVpCCg+N+wUlikSIlEYhUktRhyA6ogUkkEB4aLktxEcLAt1RghK5Gyyb\ncuGyq1xVt87n3vt8rjzc+1/nt//nP9c+dlE5t50zpa2991przjnmmGP8x5hjfqyu7/u6T/fpPt2n\n+/SvfprcNQH36T7dp/t0n/5i0j2g36f7dJ/u0zdIugf0+3Sf7tN9+gZJ94B+n+7TfbpP3yDpHtDv\n0326T/fpGyTdA/p9uk/36T59g6R3DNC7rvu3u677l13X/WnXdX/nnarnPt2n+3Sf7tOT1L0T69C7\nrptU1Z9W1b9RVV+uqn9WVX+z7/t/+Rde2X26T/fpPt2nqnrnPPSPVNXn+r7/Yt/351X1S1X1g+9Q\nXffpPt2n+3Sf6p0D9G+tqj/H/y89vXaf7tN9uk/36R1K95Oi9+k+3af79A2SNt+hcl+pqg/g//ue\nXhtS13X3h8jcp/t0n+7T15H6vu/S9XcK0P9ZVX1713UvVtVXqupvVtW/5w999KMfrR/4gR+oq6ur\n6vu+uq6ri4uLurq6qq7rquue0Hx1dTU8M5lMquu66vt++OgefzP/crkcytC1rutqNpvVZDKpjY2N\n6rpu+L2xsTHc07WquvFs13W1sbFRk8mkNLmsa8qjtLGxUX3f16/92q/Vxz/+8SHP5eVlXV5eVlUN\nbWc5ao/yez3Ku7n5pCtVZtd1K9dYLq/rI56Sl2rzZDKpy8vLlbqZ2B9+X/X+5m/+Zn384x9fuea/\n1Wdqt/imxD5WUj9MJquDTbbN+aJnu66r6XRa29vb9fDhw9ra2qrZbFbT6bQ2NzeHvtWHckUZ8KT7\nl5eX9bM/+7P1Iz/yI3V+fl6Xl5e1WCzq7Oys9vf3a39/vxaLRb322mu1XC7r5ORkoPny8nKFTsnU\n+fl5bWxs1HQ6Hernh7ojesmjyWRSV1dXdXFxMfBfekVZVn+z7Syn67o6OztbkU/p2GQyqd/7vd+r\nj370owNPLi4uhrxciJFo3dzcrIuLizo7Oxv+U8ao27quvnUZuLy8HORla2trkOUkM2wDy9a1ra2t\nAaPIc/Hh93//9+t7v/d76/T0tLa2tmK79RG/Nzc3a2trqx49elTf9E3fNPCb5fd9X+fn53V2dlaP\nHz+uH//xH78hc0rvCKD3fX/Zdd3frqpP15Owzs/1ff8v3om67tN9uk/36T49Se+Uh1593//jqvrO\nd6r8+3Sf7tN9uk+r6U4nRT/4wQ/eZfV3kj70oQ/dNQl3kr7jO77jrkm4k/SRj3zkrkm4k/SBD3xg\n/UPfYOnFF1+8axLuFtC/7du+7S6rv5N0D+j//0rf8z3fc9ck3El6FsDt/+v0LLT5HQu53CZxworf\n/ruqVial+AwnvvhcmiThhAzzagKKkySceNPEXGtXrU8IpglCTjJy8lHXOBHj32kSUhNgyscJ38QX\n/vaJz9bEXuKFl6f2Om0+2ao8aTLKyydtbFeijxPniXanl5Oq7AtNnvEjOp2XXm6ajCMdnFjU5OZ0\nOq3pdFoXFxc1m80GGdTEuNcvPnDiUs/wOZc3p8vbnnRCtCfZIy18riVrSbeVOLnc6h+1jfpC3iZ+\n32b3O9vhbUg67DLr9ZAe6jNlPpVJ+V0ulyuTopTN5XJZy+WyHj9+PNquZwrQ072qm8pLwPKZbwGd\nl9kyBGnmnECf6GmBlZetejmLzw50QSSNrTazTAJ6AtiWkqldTpPT4O1KtDiPHdBdIR0oyMdUvhtr\n1sP2clWIJy+PdUppCOoqj4Y88SrJaEtuucpEKxs2NzeH31oNkeSHBlirrLxfyG/S6zS1+jwZ+dRH\nLI9laVVMC9xbNDgt7uis0+mxvhnDFfJrDNDHZM77Wb99RYvnVdsI6AJtX2l0fn5eFxcXdXx8XMvl\nst58880bbWK6c0CnZ+WCWHUTYNz6uUDrOu+3Ovfi4qImk0lNp9MbAksB0hIv1e2CwyV2LcFS+RQQ\npyt5t0xjXgm9NQqPL9dUOxLI+e9Uj/932glebsxIZ6uPRDPLdD6zTO8r0ui0pT6T0pyenlbf9wPI\n6p63K/XLWF3ihWRDsjabzWpvb68mk0mdnp7WZDKpxWIxGBbxiv3Ydd2wfJX9Tf7Ru3XD731Dfrh8\nsG/YFk+6zxFF4hWXPNKh4LJYtrVqdWScljKz/0k7607LnL2fWIY/R93xUTT712WA3+p/r5vOznK5\nrPPz8xUHY7FY1MnJSZ2fn9fx8XGdnp7W0dHRjT5gulNArxoPs7jlXFeOe70JpNgZEqK0npgKQsWm\n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\nNeivAAAAAElFTkSuQmCC\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "img2 = transforms.Compose([\n", - " transforms.ToPILImage(),\n", - " transforms.Scale(256),\n", - " transforms.ToTensor(),\n", - "])(img)\n", - "print(img2.size())\n", - "show(img2)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Files already downloaded and verified\n" - ] - } - ], - "source": [ - "import torch\n", - "import torchvision.datasets as dset\n", - "import torchvision.transforms as transforms\n", - "cifar = dset.CIFAR10(root=\"abc/def/ghi\", download=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "trans = transforms.Compose([\n", - " transforms.RandomCrop(32, padding=4),\n", - " transforms.RandomHorizontalFlip(),\n", - " transforms.ToTensor(),\n", - " # transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))\n", - " ])" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "import torchvision.utils as tutils" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(0.3371489570090489, 0.24515368371385993, 0.0, 1.0)\n", - "(0.44256409261470253, 0.2971765334316165, 0.0, 0.9960784316062927)\n", - "(0.4061938378436025, 0.32892546338681194, 0.0, 1.0)\n", - "(0.2704159075874486, 0.18337201969836966, 0.0, 0.9176470637321472)\n", - "(0.34992724462032737, 0.2732488478952251, 0.0, 0.9960784316062927)\n", - "(0.3060087387730164, 0.25710693466354395, 0.0, 0.9725490212440491)\n", - "(0.41604116667743557, 0.2388433838705675, 0.0, 0.9764705896377563)\n", - "(0.4606604996988608, 0.24625605326498523, 0.0, 0.9725490212440491)\n", - "(0.4938623460972546, 0.3129965597088279, 0.0, 0.9882352948188782)\n", - "(0.2621004459118315, 0.2239845061390575, 0.0, 0.8549019694328308)\n", - "(0.26454759721430793, 0.11071022852775213, 0.0, 0.5098039507865906)\n", - "(0.4611264388361936, 0.32001783467012906, 0.0, 0.9960784316062927)\n", - "(0.4666066774840753, 0.30674951653607474, 0.0, 0.9843137264251709)\n", - "(0.21249872842918194, 0.2636358923863605, 0.0, 0.9372549057006836)\n", - "(0.2946678490996722, 0.21798154353121305, 0.0, 1.0)\n", - "(0.4658573437985372, 0.28209593857100396, 0.0, 1.0)\n", - "(0.5015995290223145, 0.31443273237117386, 0.0, 1.0)\n", - "(0.3317019086171058, 0.19920514503802628, 0.0, 0.8823529481887817)\n", - "(0.3885838012647582, 0.27673680696400277, 0.0, 0.9254902005195618)\n", - "(0.38839997841690393, 0.22913308841635177, 0.0, 0.9490196108818054)\n" - ] - }, - { - "data": { - "image/png": "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\n2KXJ2d3tc3Fzk0bPYqCH2j1832Nzc4vtYcqGa9vOK5BhQJ6bulLEjCf4gSJJJjRcaztBhJY+nLsz\nc3KlcZoAACAASURBVNqt9sDDj9Gas4vyzOVLLMQ9ltqGx1ftglzxDE888yQijPjnv2Whv6+99BXm\nF2f5m7/6X3Dq2BESV37qozEOh5/S606yMZvbG8RRg7KwWHGaDNlNBb/7ha/gucX7wh9+gfUrZ/nl\n//y/AmDGqbk/utTm7FZGWkHmWnbTIgNTsleUbLo2dulpolKDLDF6SpNg1cdLI2gAzSlLoSnxtKSQ\nkpE7BQfJgLXrlyn31nnysJ1DK0tdqnSC5yuCnt1g1S1yc17TRhSHjsyxvp3w1ZfeIOra+9+OIq5v\nruF1cgrPerBnL2iuvlXy8e85QkPZe6QnAdqMWDpaceFMQOWaWfwg48hSg+TagCvnLE4/F0Vcv7hG\nM+zRTu1c+trnf49HPvIkC0tPETk2wLysiPz9lnvPjdtUgqMPzjF3dIZKuo7bwyvcuLxLqzOHcuV9\nhc5JKTHGELmD0VCSlTlahchKMjtr54j0Q0rl01ueIXPUsIW2uLqlobCHi9aaOArxvADpaKSr8o/h\naX+nTB61k6g5bjIY93nxS59xvJY2GTBKBhgK2q6Ursgrtje3UEaTO3L+Q4tzNCMfr8hpNTv4Lvkx\n3t2myEre/OofsLNuZXvb3Rl2N7fw8VBTXuMyp27xu0v7/T/8Kj3XkWmqEa9+9Q85duQI844I6drV\nNUpd0ZjtkTsF7fWrV/jRj30fH3rqcSZZinQ1zBcuX+L0mXO88ear9FyU8HN/7mf5xOMPERjJkWUb\n1uVO0VsbQzGFUbyKsLevw5dlU15ny8frHfCqjTEoIwiDoN7Iq6qy1TNqf3EJIax6uBDkZYFydaPK\nKKQSlu/BJUylsN8Rx3F9YGRJguf5YEzNIXyrTZynLdF0Gy2KsmLiEloPnDzFmYtniJohC055/dSh\nFsPRBO3FRL0pjWkJElpzLYLdiIlTBhFxiO8FaClRrn7Z9xXjyYAwboCDhnb29hind/ZcbmfHDh+l\ncDBQJxA02xKvlHTcIRiHHlpr3nj9NX7nM78FQDP22Ni5xv/6a3+fv/ZXfoXALbyW8tCmJHd8ywCb\nO+vs9HdQSjF24hlFXvHOtW3mj5zkP/1P/ioAf0dWfONrL9bjariKqR8+vsJRlfDylXWuOUFpTyn2\n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\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "transformed_images = []\n", - "for i in range(20):\n", - " transformed_images += [trans(cifar[i][0])]\n", - " print(transformed_images[i].mean(),transformed_images[i].std(), \n", - " transformed_images[i].min(), transformed_images[i].max())\n", - "show(tutils.make_grid(transformed_images))" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(-0.3257020916595745, 0.49030737107138356, -1.0, 1.0)\n", - "(-0.1148718173111168, 0.5943530690757043, -1.0, 0.9921568632125854)\n", - "(-0.1876123301917687, 0.6578509306606333, -1.0, 1.0)\n", - "(-0.45916819203800213, 0.36674404239797703, -1.0, 0.8352941274642944)\n", - "(-0.3001455154347544, 0.5464976989913715, -1.0, 0.9921568632125854)\n", - "(-0.3879825306551841, 0.5142138738794487, -1.0, 0.9450980424880981)\n", - "(-0.16791767110892883, 0.4776867721654128, -1.0, 0.9529411792755127)\n", - "(-0.07867900658554088, 0.49251211342491164, -1.0, 0.9450980424880981)\n", - "(-0.012275311339180917, 0.6259931231081871, -1.0, 0.9764705896377563)\n", - "(-0.47579912012831, 0.44796901896179764, -1.0, 0.7098039388656616)\n", - "(-0.4709048134003145, 0.22142046144980368, -1.0, 0.019607901573181152)\n", - "(-0.07774712605169043, 0.6400356728895145, -1.0, 0.9921568632125854)\n", - "(-0.06678664839516084, 0.6134990363534119, -1.0, 0.9686274528503418)\n", - "(-0.5750025513892373, 0.5272717873515015, -1.0, 0.8745098114013672)\n", - "(-0.410664308796792, 0.43596309108907383, -1.0, 1.0)\n", - "(-0.06828531355131418, 0.5641918783797807, -1.0, 1.0)\n", - "(0.003199054510332644, 0.6288654684816006, -1.0, 1.0)\n", - "(-0.33659619160850224, 0.39841029565502767, -1.0, 0.7647058963775635)\n", - "(-0.2228324031845356, 0.5534736178810422, -1.0, 0.8509804010391235)\n", - "(-0.22320004721404985, 0.4582661803925075, -1.0, 0.8980392217636108)\n" - ] - }, - { - "data": { - "image/png": "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\n0gYo8gUxLtEnTiMbfAAAAABJRU5ErkJggg==\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "for i in range(20):\n", - " transformed_images[i] = transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))(transformed_images[i])\n", - " print(transformed_images[i].mean(),transformed_images[i].std(), \n", - " transformed_images[i].min(), transformed_images[i].max())\n", - "show(tutils.make_grid(transformed_images))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Random Affine transform" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "from PIL import Image" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "img = scipy.misc.ascent()\n", - "pil_img = Image.fromarray(img.astype(np.uint8))\n", - "pil_img" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "transformed_images = [None]*5\n", - "to_tensor = transforms.ToTensor()\n", - "for i in range(5):\n", - " t = transforms.RandomAffine(degrees=(-45, 45), fillcolor=128)\n", - " transformed_images[i] = to_tensor(t(pil_img))\n", - "plt.figure(figsize=(16, 16))\n", - "show(tutils.make_grid(transformed_images))" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "transformed_images = [None]*5\n", - "to_tensor = transforms.ToTensor()\n", - "for i in range(5):\n", - " t = transforms.RandomAffine(degrees=0, translate=(0.2, 0.2), fillcolor=255)\n", - " transformed_images[i] = to_tensor(t(pil_img))\n", - "plt.figure(figsize=(16, 16))\n", - "show(tutils.make_grid(transformed_images))" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "transformed_images = [None]*5\n", - "to_tensor = transforms.ToTensor()\n", - "for i in range(5):\n", - " t = transforms.RandomAffine(degrees=0, scale=(0.5, 1.5), fillcolor=255)\n", - " transformed_images[i] = to_tensor(t(pil_img))\n", - "plt.figure(figsize=(16, 16))\n", - "show(tutils.make_grid(transformed_images))" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "transformed_images = [None]*5\n", - "to_tensor = transforms.ToTensor()\n", - "for i in range(5):\n", - " t = transforms.RandomAffine(degrees=0, shear=10, fillcolor=255)\n", - " transformed_images[i] = to_tensor(t(pil_img))\n", - "plt.figure(figsize=(16, 16))\n", - "show(tutils.make_grid(transformed_images))" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "transformed_images = [None]*5\n", - "to_tensor = transforms.ToTensor()\n", - "for i in range(5):\n", - " t = transforms.RandomAffine(degrees=45, translate=(0.2, 0.2), scale=(0.7, 1.2), shear=10, fillcolor=255)\n", - " transformed_images[i] = to_tensor(t(pil_img))\n", - "plt.figure(figsize=(16, 16))\n", - "show(tutils.make_grid(transformed_images))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.5.2" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/test/smoke_test.py b/test/smoke_test.py index c3a4bdd19d6431250591c8376bf1d2c785c2cb10..464fabee93568aacdea0bd547dc55cd9cba65a19 100644 --- a/test/smoke_test.py +++ b/test/smoke_test.py @@ -1,4 +1,103 @@ +"""Run smoke tests""" + +import sys +from pathlib import Path + import torch import torchvision -import torchvision.datasets as dset -import torchvision.transforms +from torchvision.io import decode_jpeg, read_file, read_image +from torchvision.models import resnet50, ResNet50_Weights + +SCRIPT_DIR = Path(__file__).parent + + +def smoke_test_torchvision() -> None: + print( + "Is torchvision usable?", + all(x is not None for x in [torch.ops.image.decode_png, torch.ops.torchvision.roi_align]), + ) + + +def smoke_test_torchvision_read_decode() -> None: + img_jpg = read_image(str(SCRIPT_DIR / "assets" / "encode_jpeg" / "grace_hopper_517x606.jpg")) + if img_jpg.shape != (3, 606, 517): + raise RuntimeError(f"Unexpected shape of img_jpg: {img_jpg.shape}") + img_png = read_image(str(SCRIPT_DIR / "assets" / "interlaced_png" / "wizard_low.png")) + if img_png.shape != (4, 471, 354): + raise RuntimeError(f"Unexpected shape of img_png: {img_png.shape}") + + +def smoke_test_torchvision_decode_jpeg(device: str = "cpu"): + img_jpg_data = read_file(str(SCRIPT_DIR / "assets" / "encode_jpeg" / "grace_hopper_517x606.jpg")) + img_jpg = decode_jpeg(img_jpg_data, device=device) + if img_jpg.shape != (3, 606, 517): + raise RuntimeError(f"Unexpected shape of img_jpg: {img_jpg.shape}") + + +def smoke_test_compile() -> None: + try: + model = resnet50().cuda() + model = torch.compile(model) + x = torch.randn(1, 3, 224, 224, device="cuda") + out = model(x) + print(f"torch.compile model output: {out.shape}") + except RuntimeError: + if sys.platform == "win32": + print("Successfully caught torch.compile RuntimeError on win") + else: + raise + + +def smoke_test_torchvision_resnet50_classify(device: str = "cpu") -> None: + img = read_image(str(SCRIPT_DIR / ".." / "gallery" / "assets" / "dog2.jpg")).to(device) + + # Step 1: Initialize model with the best available weights + weights = ResNet50_Weights.DEFAULT + model = resnet50(weights=weights, progress=False).to(device) + model.eval() + + # Step 2: Initialize the inference transforms + preprocess = weights.transforms(antialias=(device != "mps")) # antialias not supported on MPS + + # Step 3: Apply inference preprocessing transforms + batch = preprocess(img).unsqueeze(0) + + # Step 4: Use the model and print the predicted category + prediction = model(batch).squeeze(0).softmax(0) + class_id = prediction.argmax().item() + score = prediction[class_id].item() + category_name = weights.meta["categories"][class_id] + expected_category = "German shepherd" + print(f"{category_name} ({device}): {100 * score:.1f}%") + if category_name != expected_category: + raise RuntimeError(f"Failed ResNet50 classify {category_name} Expected: {expected_category}") + + +def main() -> None: + print(f"torchvision: {torchvision.__version__}") + print(f"torch.cuda.is_available: {torch.cuda.is_available()}") + + # Turn 1.11.0aHASH into 1.11 (major.minor only) + version = ".".join(torchvision.__version__.split(".")[:2]) + if version >= "0.16": + print(f"{torch.ops.image._jpeg_version() = }") + assert torch.ops.image._is_compiled_against_turbo() + + smoke_test_torchvision() + smoke_test_torchvision_read_decode() + smoke_test_torchvision_resnet50_classify() + smoke_test_torchvision_decode_jpeg() + if torch.cuda.is_available(): + smoke_test_torchvision_decode_jpeg("cuda") + smoke_test_torchvision_resnet50_classify("cuda") + + # TODO: remove once pytorch/pytorch#110436 is resolved + if sys.version_info < (3, 12, 0): + smoke_test_compile() + + if torch.backends.mps.is_available(): + smoke_test_torchvision_resnet50_classify("mps") + + +if __name__ == "__main__": + main() diff --git a/test/test_architecture_ops.py b/test/test_architecture_ops.py new file mode 100644 index 0000000000000000000000000000000000000000..32ad1a32f897e11a3c1e05050f1c1f691b7a6936 --- /dev/null +++ b/test/test_architecture_ops.py @@ -0,0 +1,46 @@ +import unittest + +import pytest +import torch + +from torchvision.models.maxvit import SwapAxes, WindowDepartition, WindowPartition + + +class MaxvitTester(unittest.TestCase): + def test_maxvit_window_partition(self): + input_shape = (1, 3, 224, 224) + partition_size = 7 + n_partitions = input_shape[3] // partition_size + + x = torch.randn(input_shape) + + partition = WindowPartition() + departition = WindowDepartition() + + x_hat = partition(x, partition_size) + x_hat = departition(x_hat, partition_size, n_partitions, n_partitions) + + torch.testing.assert_close(x, x_hat) + + def test_maxvit_grid_partition(self): + input_shape = (1, 3, 224, 224) + partition_size = 7 + n_partitions = input_shape[3] // partition_size + + x = torch.randn(input_shape) + pre_swap = SwapAxes(-2, -3) + post_swap = SwapAxes(-2, -3) + + partition = WindowPartition() + departition = WindowDepartition() + + x_hat = partition(x, n_partitions) + x_hat = pre_swap(x_hat) + x_hat = post_swap(x_hat) + x_hat = departition(x_hat, n_partitions, partition_size, partition_size) + + torch.testing.assert_close(x, x_hat) + + +if __name__ == "__main__": + pytest.main([__file__]) diff --git a/test/test_backbone_utils.py b/test/test_backbone_utils.py index 7ee1aed1459ba37f12fcc64b30f97de38a3d2ce3..befceca020e0b8d0d9b8608ca161c114c7b762ba 100644 --- a/test/test_backbone_utils.py +++ b/test/test_backbone_utils.py @@ -1,25 +1,324 @@ -import unittest - +import random +from itertools import chain +from typing import Mapping, Sequence +import pytest import torch -from torchvision.models.detection.backbone_utils import resnet_fpn_backbone - - -class ResnetFPNBackboneTester(unittest.TestCase): - @classmethod - def setUpClass(cls): - cls.dtype = torch.float32 - - def test_resnet18_fpn_backbone(self): - device = torch.device('cpu') - x = torch.rand(1, 3, 300, 300, dtype=self.dtype, device=device) - resnet18_fpn = resnet_fpn_backbone(backbone_name='resnet18', pretrained=False) - y = resnet18_fpn(x) - self.assertEqual(list(y.keys()), ['0', '1', '2', '3', 'pool']) - - def test_resnet50_fpn_backbone(self): - device = torch.device('cpu') - x = torch.rand(1, 3, 300, 300, dtype=self.dtype, device=device) - resnet50_fpn = resnet_fpn_backbone(backbone_name='resnet50', pretrained=False) - y = resnet50_fpn(x) - self.assertEqual(list(y.keys()), ['0', '1', '2', '3', 'pool']) +from common_utils import set_rng_seed +from torchvision import models +from torchvision.models._utils import IntermediateLayerGetter +from torchvision.models.detection.backbone_utils import BackboneWithFPN, mobilenet_backbone, resnet_fpn_backbone +from torchvision.models.feature_extraction import create_feature_extractor, get_graph_node_names + + +@pytest.mark.parametrize("backbone_name", ("resnet18", "resnet50")) +def test_resnet_fpn_backbone(backbone_name): + x = torch.rand(1, 3, 300, 300, dtype=torch.float32, device="cpu") + model = resnet_fpn_backbone(backbone_name=backbone_name, weights=None) + assert isinstance(model, BackboneWithFPN) + y = model(x) + assert list(y.keys()) == ["0", "1", "2", "3", "pool"] + + with pytest.raises(ValueError, match=r"Trainable layers should be in the range"): + resnet_fpn_backbone(backbone_name=backbone_name, weights=None, trainable_layers=6) + with pytest.raises(ValueError, match=r"Each returned layer should be in the range"): + resnet_fpn_backbone(backbone_name=backbone_name, weights=None, returned_layers=[0, 1, 2, 3]) + with pytest.raises(ValueError, match=r"Each returned layer should be in the range"): + resnet_fpn_backbone(backbone_name=backbone_name, weights=None, returned_layers=[2, 3, 4, 5]) + + +@pytest.mark.parametrize("backbone_name", ("mobilenet_v2", "mobilenet_v3_large", "mobilenet_v3_small")) +def test_mobilenet_backbone(backbone_name): + with pytest.raises(ValueError, match=r"Trainable layers should be in the range"): + mobilenet_backbone(backbone_name=backbone_name, weights=None, fpn=False, trainable_layers=-1) + with pytest.raises(ValueError, match=r"Each returned layer should be in the range"): + mobilenet_backbone(backbone_name=backbone_name, weights=None, fpn=True, returned_layers=[-1, 0, 1, 2]) + with pytest.raises(ValueError, match=r"Each returned layer should be in the range"): + mobilenet_backbone(backbone_name=backbone_name, weights=None, fpn=True, returned_layers=[3, 4, 5, 6]) + model_fpn = mobilenet_backbone(backbone_name=backbone_name, weights=None, fpn=True) + assert isinstance(model_fpn, BackboneWithFPN) + model = mobilenet_backbone(backbone_name=backbone_name, weights=None, fpn=False) + assert isinstance(model, torch.nn.Sequential) + + +# Needed by TestFxFeatureExtraction.test_leaf_module_and_function +def leaf_function(x): + return int(x) + + +# Needed by TestFXFeatureExtraction. Checking that node naming conventions +# are respected. Particularly the index postfix of repeated node names +class TestSubModule(torch.nn.Module): + def __init__(self): + super().__init__() + self.relu = torch.nn.ReLU() + + def forward(self, x): + x = x + 1 + x = x + 1 + x = self.relu(x) + x = self.relu(x) + return x + + +class TestModule(torch.nn.Module): + def __init__(self): + super().__init__() + self.submodule = TestSubModule() + self.relu = torch.nn.ReLU() + + def forward(self, x): + x = self.submodule(x) + x = x + 1 + x = x + 1 + x = self.relu(x) + x = self.relu(x) + return x + + +test_module_nodes = [ + "x", + "submodule.add", + "submodule.add_1", + "submodule.relu", + "submodule.relu_1", + "add", + "add_1", + "relu", + "relu_1", +] + + +class TestFxFeatureExtraction: + inp = torch.rand(1, 3, 224, 224, dtype=torch.float32, device="cpu") + model_defaults = {"num_classes": 1} + leaf_modules = [] + + def _create_feature_extractor(self, *args, **kwargs): + """ + Apply leaf modules + """ + tracer_kwargs = {} + if "tracer_kwargs" not in kwargs: + tracer_kwargs = {"leaf_modules": self.leaf_modules} + else: + tracer_kwargs = kwargs.pop("tracer_kwargs") + return create_feature_extractor(*args, **kwargs, tracer_kwargs=tracer_kwargs, suppress_diff_warning=True) + + def _get_return_nodes(self, model): + set_rng_seed(0) + exclude_nodes_filter = [ + "getitem", + "floordiv", + "size", + "chunk", + "_assert", + "eq", + "dim", + "getattr", + ] + train_nodes, eval_nodes = get_graph_node_names( + model, tracer_kwargs={"leaf_modules": self.leaf_modules}, suppress_diff_warning=True + ) + # Get rid of any nodes that don't return tensors as they cause issues + # when testing backward pass. + train_nodes = [n for n in train_nodes if not any(x in n for x in exclude_nodes_filter)] + eval_nodes = [n for n in eval_nodes if not any(x in n for x in exclude_nodes_filter)] + return random.sample(train_nodes, 10), random.sample(eval_nodes, 10) + + @pytest.mark.parametrize("model_name", models.list_models(models)) + def test_build_fx_feature_extractor(self, model_name): + set_rng_seed(0) + model = models.get_model(model_name, **self.model_defaults).eval() + train_return_nodes, eval_return_nodes = self._get_return_nodes(model) + # Check that it works with both a list and dict for return nodes + self._create_feature_extractor( + model, train_return_nodes={v: v for v in train_return_nodes}, eval_return_nodes=eval_return_nodes + ) + self._create_feature_extractor( + model, train_return_nodes=train_return_nodes, eval_return_nodes=eval_return_nodes + ) + # Check must specify return nodes + with pytest.raises(ValueError): + self._create_feature_extractor(model) + # Check return_nodes and train_return_nodes / eval_return nodes + # mutual exclusivity + with pytest.raises(ValueError): + self._create_feature_extractor( + model, return_nodes=train_return_nodes, train_return_nodes=train_return_nodes + ) + # Check train_return_nodes / eval_return nodes must both be specified + with pytest.raises(ValueError): + self._create_feature_extractor(model, train_return_nodes=train_return_nodes) + # Check invalid node name raises ValueError + with pytest.raises(ValueError): + # First just double check that this node really doesn't exist + if not any(n.startswith("l") or n.startswith("l.") for n in chain(train_return_nodes, eval_return_nodes)): + self._create_feature_extractor(model, train_return_nodes=["l"], eval_return_nodes=["l"]) + else: # otherwise skip this check + raise ValueError + + def test_node_name_conventions(self): + model = TestModule() + train_nodes, _ = get_graph_node_names(model) + assert all(a == b for a, b in zip(train_nodes, test_module_nodes)) + + @pytest.mark.parametrize("model_name", models.list_models(models)) + def test_forward_backward(self, model_name): + model = models.get_model(model_name, **self.model_defaults).train() + train_return_nodes, eval_return_nodes = self._get_return_nodes(model) + model = self._create_feature_extractor( + model, train_return_nodes=train_return_nodes, eval_return_nodes=eval_return_nodes + ) + out = model(self.inp) + out_agg = 0 + for node_out in out.values(): + if isinstance(node_out, Sequence): + out_agg += sum(o.float().mean() for o in node_out if o is not None) + elif isinstance(node_out, Mapping): + out_agg += sum(o.float().mean() for o in node_out.values() if o is not None) + else: + # Assume that the only other alternative at this point is a Tensor + out_agg += node_out.float().mean() + out_agg.backward() + + def test_feature_extraction_methods_equivalence(self): + model = models.resnet18(**self.model_defaults).eval() + return_layers = {"layer1": "layer1", "layer2": "layer2", "layer3": "layer3", "layer4": "layer4"} + + ilg_model = IntermediateLayerGetter(model, return_layers).eval() + fx_model = self._create_feature_extractor(model, return_layers) + + # Check that we have same parameters + for (n1, p1), (n2, p2) in zip(ilg_model.named_parameters(), fx_model.named_parameters()): + assert n1 == n2 + assert p1.equal(p2) + + # And that outputs match + with torch.no_grad(): + ilg_out = ilg_model(self.inp) + fgn_out = fx_model(self.inp) + assert all(k1 == k2 for k1, k2 in zip(ilg_out.keys(), fgn_out.keys())) + for k in ilg_out.keys(): + assert ilg_out[k].equal(fgn_out[k]) + + @pytest.mark.parametrize("model_name", models.list_models(models)) + def test_jit_forward_backward(self, model_name): + set_rng_seed(0) + model = models.get_model(model_name, **self.model_defaults).train() + train_return_nodes, eval_return_nodes = self._get_return_nodes(model) + model = self._create_feature_extractor( + model, train_return_nodes=train_return_nodes, eval_return_nodes=eval_return_nodes + ) + model = torch.jit.script(model) + fgn_out = model(self.inp) + out_agg = 0 + for node_out in fgn_out.values(): + if isinstance(node_out, Sequence): + out_agg += sum(o.float().mean() for o in node_out if o is not None) + elif isinstance(node_out, Mapping): + out_agg += sum(o.float().mean() for o in node_out.values() if o is not None) + else: + # Assume that the only other alternative at this point is a Tensor + out_agg += node_out.float().mean() + out_agg.backward() + + def test_train_eval(self): + class TestModel(torch.nn.Module): + def __init__(self): + super().__init__() + self.dropout = torch.nn.Dropout(p=1.0) + + def forward(self, x): + x = x.float().mean() + x = self.dropout(x) # dropout + if self.training: + x += 100 # add + else: + x *= 0 # mul + x -= 0 # sub + return x + + model = TestModel() + + train_return_nodes = ["dropout", "add", "sub"] + eval_return_nodes = ["dropout", "mul", "sub"] + + def checks(model, mode): + with torch.no_grad(): + out = model(torch.ones(10, 10)) + if mode == "train": + # Check that dropout is respected + assert out["dropout"].item() == 0 + # Check that control flow dependent on training_mode is respected + assert out["sub"].item() == 100 + assert "add" in out + assert "mul" not in out + elif mode == "eval": + # Check that dropout is respected + assert out["dropout"].item() == 1 + # Check that control flow dependent on training_mode is respected + assert out["sub"].item() == 0 + assert "mul" in out + assert "add" not in out + + # Starting from train mode + model.train() + fx_model = self._create_feature_extractor( + model, train_return_nodes=train_return_nodes, eval_return_nodes=eval_return_nodes + ) + # Check that the models stay in their original training state + assert model.training + assert fx_model.training + # Check outputs + checks(fx_model, "train") + # Check outputs after switching to eval mode + fx_model.eval() + checks(fx_model, "eval") + + # Starting from eval mode + model.eval() + fx_model = self._create_feature_extractor( + model, train_return_nodes=train_return_nodes, eval_return_nodes=eval_return_nodes + ) + # Check that the models stay in their original training state + assert not model.training + assert not fx_model.training + # Check outputs + checks(fx_model, "eval") + # Check outputs after switching to train mode + fx_model.train() + checks(fx_model, "train") + + def test_leaf_module_and_function(self): + class LeafModule(torch.nn.Module): + def forward(self, x): + # This would raise a TypeError if it were not in a leaf module + int(x.shape[0]) + return torch.nn.functional.relu(x + 4) + + class TestModule(torch.nn.Module): + def __init__(self): + super().__init__() + self.conv = torch.nn.Conv2d(3, 1, 3) + self.leaf_module = LeafModule() + + def forward(self, x): + leaf_function(x.shape[0]) + x = self.conv(x) + return self.leaf_module(x) + + model = self._create_feature_extractor( + TestModule(), + return_nodes=["leaf_module"], + tracer_kwargs={"leaf_modules": [LeafModule], "autowrap_functions": [leaf_function]}, + ).train() + + # Check that LeafModule is not in the list of nodes + assert "relu" not in [str(n) for n in model.graph.nodes] + assert "leaf_module" in [str(n) for n in model.graph.nodes] + + # Check forward + out = model(self.inp) + # And backward + out["leaf_module"].float().mean().backward() diff --git a/test/test_cpp_models.py b/test/test_cpp_models.py deleted file mode 100644 index 6deb5d79739a31636865f5bdb783427584a5b54c..0000000000000000000000000000000000000000 --- a/test/test_cpp_models.py +++ /dev/null @@ -1,152 +0,0 @@ -import torch -import os -import unittest -from torchvision import models, transforms -import sys - -from PIL import Image -import torchvision.transforms.functional as F - -try: - from torchvision import _C_tests -except ImportError: - _C_tests = None - - -def process_model(model, tensor, func, name): - model.eval() - traced_script_module = torch.jit.trace(model, tensor) - traced_script_module.save("model.pt") - - py_output = model.forward(tensor) - cpp_output = func("model.pt", tensor) - - assert torch.allclose(py_output, cpp_output), 'Output mismatch of ' + name + ' models' - - -def read_image1(): - image_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'assets', 'encode_jpeg', - 'grace_hopper_517x606.jpg') - image = Image.open(image_path) - image = image.resize((224, 224)) - x = F.to_tensor(image) - return x.view(1, 3, 224, 224) - - -def read_image2(): - image_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'assets', 'encode_jpeg', - 'grace_hopper_517x606.jpg') - image = Image.open(image_path) - image = image.resize((299, 299)) - x = F.to_tensor(image) - x = x.view(1, 3, 299, 299) - return torch.cat([x, x], 0) - - -@unittest.skipIf( - sys.platform == "darwin" or True, - "C++ models are broken on OS X at the moment, and there's a BC breakage on master; " - "see https://github.com/pytorch/vision/issues/1191") -class Tester(unittest.TestCase): - pretrained = False - image = read_image1() - - def test_alexnet(self): - process_model(models.alexnet(self.pretrained), self.image, _C_tests.forward_alexnet, 'Alexnet') - - def test_vgg11(self): - process_model(models.vgg11(self.pretrained), self.image, _C_tests.forward_vgg11, 'VGG11') - - def test_vgg13(self): - process_model(models.vgg13(self.pretrained), self.image, _C_tests.forward_vgg13, 'VGG13') - - def test_vgg16(self): - process_model(models.vgg16(self.pretrained), self.image, _C_tests.forward_vgg16, 'VGG16') - - def test_vgg19(self): - process_model(models.vgg19(self.pretrained), self.image, _C_tests.forward_vgg19, 'VGG19') - - def test_vgg11_bn(self): - process_model(models.vgg11_bn(self.pretrained), self.image, _C_tests.forward_vgg11bn, 'VGG11BN') - - def test_vgg13_bn(self): - process_model(models.vgg13_bn(self.pretrained), self.image, _C_tests.forward_vgg13bn, 'VGG13BN') - - def test_vgg16_bn(self): - process_model(models.vgg16_bn(self.pretrained), self.image, _C_tests.forward_vgg16bn, 'VGG16BN') - - def test_vgg19_bn(self): - process_model(models.vgg19_bn(self.pretrained), self.image, _C_tests.forward_vgg19bn, 'VGG19BN') - - def test_resnet18(self): - process_model(models.resnet18(self.pretrained), self.image, _C_tests.forward_resnet18, 'Resnet18') - - def test_resnet34(self): - process_model(models.resnet34(self.pretrained), self.image, _C_tests.forward_resnet34, 'Resnet34') - - def test_resnet50(self): - process_model(models.resnet50(self.pretrained), self.image, _C_tests.forward_resnet50, 'Resnet50') - - def test_resnet101(self): - process_model(models.resnet101(self.pretrained), self.image, _C_tests.forward_resnet101, 'Resnet101') - - def test_resnet152(self): - process_model(models.resnet152(self.pretrained), self.image, _C_tests.forward_resnet152, 'Resnet152') - - def test_resnext50_32x4d(self): - process_model(models.resnext50_32x4d(), self.image, _C_tests.forward_resnext50_32x4d, 'ResNext50_32x4d') - - def test_resnext101_32x8d(self): - process_model(models.resnext101_32x8d(), self.image, _C_tests.forward_resnext101_32x8d, 'ResNext101_32x8d') - - def test_wide_resnet50_2(self): - process_model(models.wide_resnet50_2(), self.image, _C_tests.forward_wide_resnet50_2, 'WideResNet50_2') - - def test_wide_resnet101_2(self): - process_model(models.wide_resnet101_2(), self.image, _C_tests.forward_wide_resnet101_2, 'WideResNet101_2') - - def test_squeezenet1_0(self): - process_model(models.squeezenet1_0(self.pretrained), self.image, - _C_tests.forward_squeezenet1_0, 'Squeezenet1.0') - - def test_squeezenet1_1(self): - process_model(models.squeezenet1_1(self.pretrained), self.image, - _C_tests.forward_squeezenet1_1, 'Squeezenet1.1') - - def test_densenet121(self): - process_model(models.densenet121(self.pretrained), self.image, _C_tests.forward_densenet121, 'Densenet121') - - def test_densenet169(self): - process_model(models.densenet169(self.pretrained), self.image, _C_tests.forward_densenet169, 'Densenet169') - - def test_densenet201(self): - process_model(models.densenet201(self.pretrained), self.image, _C_tests.forward_densenet201, 'Densenet201') - - def test_densenet161(self): - process_model(models.densenet161(self.pretrained), self.image, _C_tests.forward_densenet161, 'Densenet161') - - def test_mobilenet_v2(self): - process_model(models.mobilenet_v2(self.pretrained), self.image, _C_tests.forward_mobilenetv2, 'MobileNet') - - def test_googlenet(self): - process_model(models.googlenet(self.pretrained), self.image, _C_tests.forward_googlenet, 'GoogLeNet') - - def test_mnasnet0_5(self): - process_model(models.mnasnet0_5(self.pretrained), self.image, _C_tests.forward_mnasnet0_5, 'MNASNet0_5') - - def test_mnasnet0_75(self): - process_model(models.mnasnet0_75(self.pretrained), self.image, _C_tests.forward_mnasnet0_75, 'MNASNet0_75') - - def test_mnasnet1_0(self): - process_model(models.mnasnet1_0(self.pretrained), self.image, _C_tests.forward_mnasnet1_0, 'MNASNet1_0') - - def test_mnasnet1_3(self): - process_model(models.mnasnet1_3(self.pretrained), self.image, _C_tests.forward_mnasnet1_3, 'MNASNet1_3') - - def test_inception_v3(self): - self.image = read_image2() - process_model(models.inception_v3(self.pretrained), self.image, _C_tests.forward_inceptionv3, 'Inceptionv3') - - -if __name__ == '__main__': - unittest.main() diff --git a/test/test_datasets.py b/test/test_datasets.py index a076b843fa86239349824a839c2308cfb889a54b..f37cf2918290b0b7d2b4a9d34aa394aaf3d1e3d1 100644 --- a/test/test_datasets.py +++ b/test/test_datasets.py @@ -1,30 +1,35 @@ import bz2 import contextlib +import csv import io import itertools +import json import os import pathlib import pickle -import json import random +import re import shutil import string import unittest import xml.etree.ElementTree as ET import zipfile +from typing import Callable, Tuple, Union -import PIL import datasets_utils import numpy as np +import PIL +import pytest import torch import torch.nn.functional as F +from common_utils import combinations_grid from torchvision import datasets +from torchvision.transforms import v2 class STL10TestCase(datasets_utils.ImageDatasetTestCase): DATASET_CLASS = datasets.STL10 - ADDITIONAL_CONFIGS = datasets_utils.combinations_grid( - split=("train", "test", "unlabeled", "train+unlabeled")) + ADDITIONAL_CONFIGS = combinations_grid(split=("train", "test", "unlabeled", "train+unlabeled")) @staticmethod def _make_binary_file(num_elements, root, name): @@ -88,20 +93,20 @@ class STL10TestCase(datasets_utils.ImageDatasetTestCase): def test_folds(self): for fold in range(10): with self.create_dataset(split="train", folds=fold) as (dataset, _): - self.assertEqual(len(dataset), fold + 1) + assert len(dataset) == fold + 1 def test_unlabeled(self): with self.create_dataset(split="unlabeled") as (dataset, _): labels = [dataset[idx][1] for idx in range(len(dataset))] - self.assertTrue(all(label == -1 for label in labels)) + assert all(label == -1 for label in labels) def test_invalid_folds1(self): - with self.assertRaises(ValueError): + with pytest.raises(ValueError): with self.create_dataset(folds=10): pass def test_invalid_folds2(self): - with self.assertRaises(ValueError): + with pytest.raises(ValueError): with self.create_dataset(folds="0"): pass @@ -110,9 +115,7 @@ class Caltech101TestCase(datasets_utils.ImageDatasetTestCase): DATASET_CLASS = datasets.Caltech101 FEATURE_TYPES = (PIL.Image.Image, (int, np.ndarray, tuple)) - ADDITIONAL_CONFIGS = datasets_utils.combinations_grid( - target_type=("category", "annotation", ["category", "annotation"]) - ) + ADDITIONAL_CONFIGS = combinations_grid(target_type=("category", "annotation", ["category", "annotation"])) REQUIRED_PACKAGES = ("scipy",) def inject_fake_data(self, tmpdir, config): @@ -167,23 +170,24 @@ class Caltech101TestCase(datasets_utils.ImageDatasetTestCase): actual = len(individual_targets) expected = len(combined_targets) - self.assertEqual( - actual, - expected, - f"The number of the returned combined targets does not match the the number targets if requested " - f"individually: {actual} != {expected}", - ) + assert ( + actual == expected + ), "The number of the returned combined targets does not match the the number targets if requested " + f"individually: {actual} != {expected}", for target_type, combined_target, individual_target in zip(target_types, combined_targets, individual_targets): with self.subTest(target_type=target_type): actual = type(combined_target) expected = type(individual_target) - self.assertIs( - actual, - expected, - f"Type of the combined target does not match the type of the corresponding individual target: " - f"{actual} is not {expected}", - ) + assert ( + actual is expected + ), "Type of the combined target does not match the type of the corresponding individual target: " + f"{actual} is not {expected}", + + def test_transforms_v2_wrapper_spawn(self): + expected_size = (123, 321) + with self.create_dataset(target_type="category", transform=v2.Resize(size=expected_size)) as (dataset, _): + datasets_utils.check_transforms_v2_wrapper_spawn(dataset, expected_size=expected_size) class Caltech256TestCase(datasets_utils.ImageDatasetTestCase): @@ -192,7 +196,7 @@ class Caltech256TestCase(datasets_utils.ImageDatasetTestCase): def inject_fake_data(self, tmpdir, config): tmpdir = pathlib.Path(tmpdir) / "caltech256" / "256_ObjectCategories" - categories = ((1, "ak47"), (127, "laptop-101"), (257, "clutter")) + categories = ((1, "ak47"), (2, "american-flag"), (3, "backpack")) num_images_per_category = 2 for idx, category in categories: @@ -209,11 +213,11 @@ class Caltech256TestCase(datasets_utils.ImageDatasetTestCase): class WIDERFaceTestCase(datasets_utils.ImageDatasetTestCase): DATASET_CLASS = datasets.WIDERFace FEATURE_TYPES = (PIL.Image.Image, (dict, type(None))) # test split returns None as target - ADDITIONAL_CONFIGS = datasets_utils.combinations_grid(split=('train', 'val', 'test')) + ADDITIONAL_CONFIGS = combinations_grid(split=("train", "val", "test")) def inject_fake_data(self, tmpdir, config): - widerface_dir = pathlib.Path(tmpdir) / 'widerface' - annotations_dir = widerface_dir / 'wider_face_split' + widerface_dir = pathlib.Path(tmpdir) / "widerface" + annotations_dir = widerface_dir / "wider_face_split" os.makedirs(annotations_dir) split_to_idx = split_to_num_examples = { @@ -223,21 +227,21 @@ class WIDERFaceTestCase(datasets_utils.ImageDatasetTestCase): } # We need to create all folders regardless of the split in config - for split in ('train', 'val', 'test'): + for split in ("train", "val", "test"): split_idx = split_to_idx[split] num_examples = split_to_num_examples[split] datasets_utils.create_image_folder( root=tmpdir, - name=widerface_dir / f'WIDER_{split}' / 'images' / '0--Parade', + name=widerface_dir / f"WIDER_{split}" / "images" / "0--Parade", file_name_fn=lambda image_idx: f"0_Parade_marchingband_1_{split_idx + image_idx}.jpg", num_examples=num_examples, ) annotation_file_name = { - 'train': annotations_dir / 'wider_face_train_bbx_gt.txt', - 'val': annotations_dir / 'wider_face_val_bbx_gt.txt', - 'test': annotations_dir / 'wider_face_test_filelist.txt', + "train": annotations_dir / "wider_face_train_bbx_gt.txt", + "val": annotations_dir / "wider_face_val_bbx_gt.txt", + "test": annotations_dir / "wider_face_test_filelist.txt", }[split] annotation_content = { @@ -260,6 +264,11 @@ class WIDERFaceTestCase(datasets_utils.ImageDatasetTestCase): return split_to_num_examples[config["split"]] + def test_transforms_v2_wrapper_spawn(self): + expected_size = (123, 321) + with self.create_dataset(transform=v2.Resize(size=expected_size)) as (dataset, _): + datasets_utils.check_transforms_v2_wrapper_spawn(dataset, expected_size=expected_size) + class CityScapesTestCase(datasets_utils.ImageDatasetTestCase): DATASET_CLASS = datasets.Cityscapes @@ -270,10 +279,8 @@ class CityScapesTestCase(datasets_utils.ImageDatasetTestCase): "color", ) ADDITIONAL_CONFIGS = ( - *datasets_utils.combinations_grid( - mode=("fine",), split=("train", "test", "val"), target_type=TARGET_TYPES - ), - *datasets_utils.combinations_grid( + *combinations_grid(mode=("fine",), split=("train", "test", "val"), target_type=TARGET_TYPES), + *combinations_grid( mode=("coarse",), split=("train", "train_extra", "val"), target_type=TARGET_TYPES, @@ -327,6 +334,7 @@ class CityScapesTestCase(datasets_utils.ImageDatasetTestCase): gt_dir = tmpdir / f"gt{mode}" for split in mode_to_splits[mode]: for city in cities: + def make_image(name, size=10): datasets_utils.create_image_folder( root=gt_dir / split, @@ -335,6 +343,7 @@ class CityScapesTestCase(datasets_utils.ImageDatasetTestCase): size=size, num_examples=1, ) + make_image(f"{city}_000000_000000_gt{mode}_instanceIds.png") make_image(f"{city}_000000_000000_gt{mode}_labelIds.png") make_image(f"{city}_000000_000000_gt{mode}_color.png", size=(4, 10, 10)) @@ -344,7 +353,7 @@ class CityScapesTestCase(datasets_utils.ImageDatasetTestCase): json.dump(polygon_target, outfile) # Create leftImg8bit folder - for split in ['test', 'train_extra', 'train', 'val']: + for split in ["test", "train_extra", "train", "val"]: for city in cities: datasets_utils.create_image_folder( root=tmpdir / "leftImg8bit" / split, @@ -353,52 +362,58 @@ class CityScapesTestCase(datasets_utils.ImageDatasetTestCase): num_examples=1, ) - info = {'num_examples': len(cities)} - if config['target_type'] == 'polygon': - info['expected_polygon_target'] = polygon_target + info = {"num_examples": len(cities)} + if config["target_type"] == "polygon": + info["expected_polygon_target"] = polygon_target return info def test_combined_targets(self): - target_types = ['semantic', 'polygon', 'color'] + target_types = ["semantic", "polygon", "color"] with self.create_dataset(target_type=target_types) as (dataset, _): output = dataset[0] - self.assertTrue(isinstance(output, tuple)) - self.assertTrue(len(output) == 2) - self.assertTrue(isinstance(output[0], PIL.Image.Image)) - self.assertTrue(isinstance(output[1], tuple)) - self.assertTrue(len(output[1]) == 3) - self.assertTrue(isinstance(output[1][0], PIL.Image.Image)) # semantic - self.assertTrue(isinstance(output[1][1], dict)) # polygon - self.assertTrue(isinstance(output[1][2], PIL.Image.Image)) # color + assert isinstance(output, tuple) + assert len(output) == 2 + assert isinstance(output[0], PIL.Image.Image) + assert isinstance(output[1], tuple) + assert len(output[1]) == 3 + assert isinstance(output[1][0], PIL.Image.Image) # semantic + assert isinstance(output[1][1], dict) # polygon + assert isinstance(output[1][2], PIL.Image.Image) # color def test_feature_types_target_color(self): - with self.create_dataset(target_type='color') as (dataset, _): + with self.create_dataset(target_type="color") as (dataset, _): color_img, color_target = dataset[0] - self.assertTrue(isinstance(color_img, PIL.Image.Image)) - self.assertTrue(np.array(color_target).shape[2] == 4) + assert isinstance(color_img, PIL.Image.Image) + assert np.array(color_target).shape[2] == 4 def test_feature_types_target_polygon(self): - with self.create_dataset(target_type='polygon') as (dataset, info): + with self.create_dataset(target_type="polygon") as (dataset, info): polygon_img, polygon_target = dataset[0] - self.assertTrue(isinstance(polygon_img, PIL.Image.Image)) - self.assertEqual(polygon_target, info['expected_polygon_target']) + assert isinstance(polygon_img, PIL.Image.Image) + (polygon_target, info["expected_polygon_target"]) + + def test_transforms_v2_wrapper_spawn(self): + expected_size = (123, 321) + for target_type in ["instance", "semantic", ["instance", "semantic"]]: + with self.create_dataset(target_type=target_type, transform=v2.Resize(size=expected_size)) as (dataset, _): + datasets_utils.check_transforms_v2_wrapper_spawn(dataset, expected_size=expected_size) class ImageNetTestCase(datasets_utils.ImageDatasetTestCase): DATASET_CLASS = datasets.ImageNet - REQUIRED_PACKAGES = ('scipy',) - ADDITIONAL_CONFIGS = datasets_utils.combinations_grid(split=('train', 'val')) + REQUIRED_PACKAGES = ("scipy",) + ADDITIONAL_CONFIGS = combinations_grid(split=("train", "val")) def inject_fake_data(self, tmpdir, config): tmpdir = pathlib.Path(tmpdir) - wnid = 'n01234567' - if config['split'] == 'train': + wnid = "n01234567" + if config["split"] == "train": num_examples = 3 datasets_utils.create_image_folder( root=tmpdir, - name=tmpdir / 'train' / wnid / wnid, + name=tmpdir / "train" / wnid / wnid, file_name_fn=lambda image_idx: f"{wnid}_{image_idx}.JPEG", num_examples=num_examples, ) @@ -406,19 +421,24 @@ class ImageNetTestCase(datasets_utils.ImageDatasetTestCase): num_examples = 1 datasets_utils.create_image_folder( root=tmpdir, - name=tmpdir / 'val' / wnid, + name=tmpdir / "val" / wnid, file_name_fn=lambda image_ifx: "ILSVRC2012_val_0000000{image_idx}.JPEG", num_examples=num_examples, ) wnid_to_classes = {wnid: [1]} - torch.save((wnid_to_classes, None), tmpdir / 'meta.bin') + torch.save((wnid_to_classes, None), tmpdir / "meta.bin") return num_examples + def test_transforms_v2_wrapper_spawn(self): + expected_size = (123, 321) + with self.create_dataset(transform=v2.Resize(size=expected_size)) as (dataset, _): + datasets_utils.check_transforms_v2_wrapper_spawn(dataset, expected_size=expected_size) + class CIFAR10TestCase(datasets_utils.ImageDatasetTestCase): DATASET_CLASS = datasets.CIFAR10 - ADDITIONAL_CONFIGS = datasets_utils.combinations_grid(train=(True, False)) + ADDITIONAL_CONFIGS = combinations_grid(train=(True, False)) _VERSION_CONFIG = dict( base_folder="cifar-10-batches-py", @@ -447,8 +467,9 @@ class CIFAR10TestCase(datasets_utils.ImageDatasetTestCase): ) def _create_batch_file(self, root, name, num_images): + np_rng = np.random.RandomState(0) data = datasets_utils.create_image_or_video_tensor((num_images, 32 * 32 * 3)) - labels = np.random.randint(0, self._VERSION_CONFIG["num_categories"], size=num_images).tolist() + labels = np_rng.randint(0, self._VERSION_CONFIG["num_categories"], size=num_images).tolist() self._create_binary_file(root, name, {"data": data, self._VERSION_CONFIG["labels_key"]: labels}) def _create_meta_file(self, root): @@ -469,7 +490,7 @@ class CIFAR10TestCase(datasets_utils.ImageDatasetTestCase): with self.create_dataset() as (dataset, info): expected = {category: label for label, category in enumerate(info["categories"])} actual = dataset.class_to_idx - self.assertEqual(actual, expected) + assert actual == expected class CIFAR100(CIFAR10TestCase): @@ -490,7 +511,7 @@ class CelebATestCase(datasets_utils.ImageDatasetTestCase): DATASET_CLASS = datasets.CelebA FEATURE_TYPES = (PIL.Image.Image, (torch.Tensor, int, tuple, type(None))) - ADDITIONAL_CONFIGS = datasets_utils.combinations_grid( + ADDITIONAL_CONFIGS = combinations_grid( split=("train", "valid", "test", "all"), target_type=("attr", "identity", "bbox", "landmarks", ["attr", "identity"]), ) @@ -514,7 +535,7 @@ class CelebATestCase(datasets_utils.ImageDatasetTestCase): return dict(num_examples=num_images_per_split[config["split"]], attr_names=attr_names) def _create_split_txt(self, root): - num_images_per_split = dict(train=3, valid=2, test=1) + num_images_per_split = dict(train=4, valid=3, test=2) data = [ [self._SPLIT_TO_IDX[split]] for split, num_images in num_images_per_split.items() for _ in range(num_images) @@ -573,33 +594,46 @@ class CelebATestCase(datasets_utils.ImageDatasetTestCase): actual = len(individual_targets) expected = len(combined_targets) - self.assertEqual( - actual, - expected, - f"The number of the returned combined targets does not match the the number targets if requested " - f"individually: {actual} != {expected}", - ) + assert ( + actual == expected + ), "The number of the returned combined targets does not match the the number targets if requested " + f"individually: {actual} != {expected}", for target_type, combined_target, individual_target in zip(target_types, combined_targets, individual_targets): with self.subTest(target_type=target_type): actual = type(combined_target) expected = type(individual_target) - self.assertIs( - actual, - expected, - f"Type of the combined target does not match the type of the corresponding individual target: " - f"{actual} is not {expected}", - ) + assert ( + actual is expected + ), "Type of the combined target does not match the type of the corresponding individual target: " + f"{actual} is not {expected}", def test_no_target(self): with self.create_dataset(target_type=[]) as (dataset, _): _, target = dataset[0] - self.assertIsNone(target) + assert target is None def test_attr_names(self): with self.create_dataset() as (dataset, info): - self.assertEqual(tuple(dataset.attr_names), info["attr_names"]) + assert tuple(dataset.attr_names) == info["attr_names"] + + def test_images_names_split(self): + with self.create_dataset(split="all") as (dataset, _): + all_imgs_names = set(dataset.filename) + + merged_imgs_names = set() + for split in ["train", "valid", "test"]: + with self.create_dataset(split=split) as (dataset, _): + merged_imgs_names.update(dataset.filename) + + assert merged_imgs_names == all_imgs_names + + def test_transforms_v2_wrapper_spawn(self): + expected_size = (123, 321) + for target_type in ["identity", "bbox", ["identity", "bbox"]]: + with self.create_dataset(target_type=target_type, transform=v2.Resize(size=expected_size)) as (dataset, _): + datasets_utils.check_transforms_v2_wrapper_spawn(dataset, expected_size=expected_size) class VOCSegmentationTestCase(datasets_utils.ImageDatasetTestCase): @@ -607,19 +641,12 @@ class VOCSegmentationTestCase(datasets_utils.ImageDatasetTestCase): FEATURE_TYPES = (PIL.Image.Image, PIL.Image.Image) ADDITIONAL_CONFIGS = ( - *datasets_utils.combinations_grid( - year=[f"20{year:02d}" for year in range(7, 13)], image_set=("train", "val", "trainval") - ), + *combinations_grid(year=[f"20{year:02d}" for year in range(7, 13)], image_set=("train", "val", "trainval")), dict(year="2007", image_set="test"), - dict(year="2007-test", image_set="test"), ) def inject_fake_data(self, tmpdir, config): - year, is_test_set = ( - ("2007", True) - if config["year"] == "2007-test" or config["image_set"] == "test" - else (config["year"], False) - ) + year, is_test_set = config["year"], config["image_set"] == "test" image_set = config["image_set"] base_dir = pathlib.Path(tmpdir) @@ -650,7 +677,7 @@ class VOCSegmentationTestCase(datasets_utils.ImageDatasetTestCase): shutil.copytree(src, root / "Segmentation") num_images = max(itertools.chain(*idcs.values())) + 1 - num_images_per_image_set = dict([(image_set, len(idcs_)) for image_set, idcs_ in idcs.items()]) + num_images_per_image_set = {image_set: len(idcs_) for image_set, idcs_ in idcs.items()} return num_images, num_images_per_image_set def _create_image_set_file(self, root, image_set, idcs): @@ -695,6 +722,11 @@ class VOCSegmentationTestCase(datasets_utils.ImageDatasetTestCase): return data + def test_transforms_v2_wrapper_spawn(self): + expected_size = (123, 321) + with self.create_dataset(transform=v2.Resize(size=expected_size)) as (dataset, _): + datasets_utils.check_transforms_v2_wrapper_spawn(dataset, expected_size=expected_size) + class VOCDetectionTestCase(VOCSegmentationTestCase): DATASET_CLASS = datasets.VOCDetection @@ -704,16 +736,21 @@ class VOCDetectionTestCase(VOCSegmentationTestCase): with self.create_dataset() as (dataset, info): _, target = dataset[0] - self.assertIn("annotation", target) + assert "annotation" in target annotation = target["annotation"] - self.assertIn("object", annotation) + assert "object" in annotation objects = annotation["object"] - self.assertEqual(len(objects), 1) + assert len(objects) == 1 object = objects[0] - self.assertEqual(object, info["annotation"]) + assert object == info["annotation"] + + def test_transforms_v2_wrapper_spawn(self): + expected_size = (123, 321) + with self.create_dataset(transform=v2.Resize(size=expected_size)) as (dataset, _): + datasets_utils.check_transforms_v2_wrapper_spawn(dataset, expected_size=expected_size) class CocoDetectionTestCase(datasets_utils.ImageDatasetTestCase): @@ -745,28 +782,52 @@ class CocoDetectionTestCase(datasets_utils.ImageDatasetTestCase): annotation_folder = tmpdir / self._ANNOTATIONS_FOLDER os.makedirs(annotation_folder) + + segmentation_kind = config.pop("segmentation_kind", "list") info = self._create_annotation_file( - annotation_folder, self._ANNOTATIONS_FILE, file_names, num_annotations_per_image + annotation_folder, + self._ANNOTATIONS_FILE, + file_names, + num_annotations_per_image, + segmentation_kind=segmentation_kind, ) info["num_examples"] = num_images return info - def _create_annotation_file(self, root, name, file_names, num_annotations_per_image): + def _create_annotation_file(self, root, name, file_names, num_annotations_per_image, segmentation_kind="list"): image_ids = [int(file_name.stem) for file_name in file_names] images = [dict(file_name=str(file_name), id=id) for file_name, id in zip(file_names, image_ids)] - annotations, info = self._create_annotations(image_ids, num_annotations_per_image) + annotations, info = self._create_annotations(image_ids, num_annotations_per_image, segmentation_kind) self._create_json(root, name, dict(images=images, annotations=annotations)) return info - def _create_annotations(self, image_ids, num_annotations_per_image): - annotations = datasets_utils.combinations_grid( - image_id=image_ids, bbox=([1.0, 2.0, 3.0, 4.0],) * num_annotations_per_image - ) - for id, annotation in enumerate(annotations): - annotation["id"] = id + def _create_annotations(self, image_ids, num_annotations_per_image, segmentation_kind="list"): + annotations = [] + annotion_id = 0 + + for image_id in itertools.islice(itertools.cycle(image_ids), len(image_ids) * num_annotations_per_image): + segmentation = { + "list": [torch.rand(8).tolist()], + "rle": {"size": [10, 10], "counts": [1]}, + "rle_encoded": {"size": [2400, 2400], "counts": "PQRQ2[1\\Y2f0gNVNRhMg2"}, + "bad": 123, + }[segmentation_kind] + + annotations.append( + dict( + image_id=image_id, + id=annotion_id, + bbox=torch.rand(4).tolist(), + segmentation=segmentation, + category_id=int(torch.randint(91, ())), + area=float(torch.rand(1)), + iscrowd=int(torch.randint(2, size=(1,))), + ) + ) + annotion_id += 1 return annotations, dict() def _create_json(self, root, name, content): @@ -775,13 +836,39 @@ class CocoDetectionTestCase(datasets_utils.ImageDatasetTestCase): json.dump(content, fh) return file + def test_transforms_v2_wrapper_spawn(self): + expected_size = (123, 321) + with self.create_dataset(transform=v2.Resize(size=expected_size)) as (dataset, _): + datasets_utils.check_transforms_v2_wrapper_spawn(dataset, expected_size=expected_size) + + def test_slice_error(self): + with self.create_dataset() as (dataset, _): + with pytest.raises(ValueError, match="Index must be of type integer"): + dataset[:2] + + def test_segmentation_kind(self): + if isinstance(self, CocoCaptionsTestCase): + return + + for segmentation_kind in ("list", "rle", "rle_encoded"): + config = {"segmentation_kind": segmentation_kind} + with self.create_dataset(config) as (dataset, _): + dataset = datasets.wrap_dataset_for_transforms_v2(dataset, target_keys="all") + list(dataset) + + config = {"segmentation_kind": "bad"} + with self.create_dataset(config) as (dataset, _): + dataset = datasets.wrap_dataset_for_transforms_v2(dataset, target_keys="all") + with pytest.raises(ValueError, match="COCO segmentation expected to be a dict or a list"): + list(dataset) + class CocoCaptionsTestCase(CocoDetectionTestCase): DATASET_CLASS = datasets.CocoCaptions - def _create_annotations(self, image_ids, num_annotations_per_image): + def _create_annotations(self, image_ids, num_annotations_per_image, segmentation_kind="list"): captions = [str(idx) for idx in range(num_annotations_per_image)] - annotations = datasets_utils.combinations_grid(image_id=image_ids, caption=captions) + annotations = combinations_grid(image_id=image_ids, caption=captions) for id, annotation in enumerate(annotations): annotation["id"] = id return annotations, dict(captions=captions) @@ -789,13 +876,18 @@ class CocoCaptionsTestCase(CocoDetectionTestCase): def test_captions(self): with self.create_dataset() as (dataset, info): _, captions = dataset[0] - self.assertEqual(tuple(captions), tuple(info["captions"])) + assert tuple(captions) == tuple(info["captions"]) + + def test_transforms_v2_wrapper_spawn(self): + # We need to define this method, because otherwise the test from the super class will + # be run + pytest.skip("CocoCaptions is currently not supported by the v2 wrapper.") class UCF101TestCase(datasets_utils.VideoDatasetTestCase): DATASET_CLASS = datasets.UCF101 - ADDITIONAL_CONFIGS = datasets_utils.combinations_grid(fold=(1, 2, 3), train=(True, False)) + ADDITIONAL_CONFIGS = combinations_grid(fold=(1, 2, 3), train=(True, False)) _VIDEO_FOLDER = "videos" _ANNOTATIONS_FOLDER = "annotations" @@ -849,16 +941,14 @@ class UCF101TestCase(datasets_utils.VideoDatasetTestCase): def _create_annotation_file(self, root, name, video_files): with open(pathlib.Path(root) / name, "w") as fh: - fh.writelines(f"{file}\n" for file in sorted(video_files)) + fh.writelines(f"{str(file).replace(os.sep, '/')}\n" for file in sorted(video_files)) class LSUNTestCase(datasets_utils.ImageDatasetTestCase): DATASET_CLASS = datasets.LSUN REQUIRED_PACKAGES = ("lmdb",) - ADDITIONAL_CONFIGS = datasets_utils.combinations_grid( - classes=("train", "test", "val", ["bedroom_train", "church_outdoor_train"]) - ) + ADDITIONAL_CONFIGS = combinations_grid(classes=("train", "test", "val", ["bedroom_train", "church_outdoor_train"])) _CATEGORIES = ( "bedroom", @@ -883,10 +973,7 @@ class LSUNTestCase(datasets_utils.ImageDatasetTestCase): return num_images @contextlib.contextmanager - def create_dataset( - self, - *args, **kwargs - ): + def create_dataset(self, *args, **kwargs): with super().create_dataset(*args, **kwargs) as output: yield output # Currently datasets.LSUN caches the keys in the current directory rather than in the root directory. Thus, @@ -940,33 +1027,39 @@ class LSUNTestCase(datasets_utils.ImageDatasetTestCase): def test_not_found_or_corrupted(self): # LSUN does not raise built-in exception, but a custom one. It is expressive enough to not 'cast' it to # RuntimeError or FileNotFoundError that are normally checked by this test. - with self.assertRaises(datasets_utils.lazy_importer.lmdb.Error): + with pytest.raises(datasets_utils.lazy_importer.lmdb.Error): super().test_not_found_or_corrupted() -class Kinetics400TestCase(datasets_utils.VideoDatasetTestCase): - DATASET_CLASS = datasets.Kinetics400 +class KineticsTestCase(datasets_utils.VideoDatasetTestCase): + DATASET_CLASS = datasets.Kinetics + ADDITIONAL_CONFIGS = combinations_grid(split=("train", "val"), num_classes=("400", "600", "700")) def inject_fake_data(self, tmpdir, config): classes = ("Abseiling", "Zumba") num_videos_per_class = 2 - + tmpdir = pathlib.Path(tmpdir) / config["split"] digits = string.ascii_letters + string.digits + "-_" for cls in classes: datasets_utils.create_video_folder( tmpdir, cls, - lambda _: f"{datasets_utils.create_random_string(11, digits)}.avi", + lambda _: f"{datasets_utils.create_random_string(11, digits)}.mp4", num_videos_per_class, ) - return num_videos_per_class * len(classes) + @pytest.mark.xfail(reason="FIXME") + def test_transforms_v2_wrapper_spawn(self): + expected_size = (123, 321) + with self.create_dataset(output_format="TCHW", transform=v2.Resize(size=expected_size)) as (dataset, _): + datasets_utils.check_transforms_v2_wrapper_spawn(dataset, expected_size=expected_size) + class HMDB51TestCase(datasets_utils.VideoDatasetTestCase): DATASET_CLASS = datasets.HMDB51 - ADDITIONAL_CONFIGS = datasets_utils.combinations_grid(fold=(1, 2, 3), train=(True, False)) + ADDITIONAL_CONFIGS = combinations_grid(fold=(1, 2, 3), train=(True, False)) _VIDEO_FOLDER = "videos" _SPLITS_FOLDER = "splits" @@ -1026,7 +1119,7 @@ class HMDB51TestCase(datasets_utils.VideoDatasetTestCase): class OmniglotTestCase(datasets_utils.ImageDatasetTestCase): DATASET_CLASS = datasets.Omniglot - ADDITIONAL_CONFIGS = datasets_utils.combinations_grid(background=(True, False)) + ADDITIONAL_CONFIGS = combinations_grid(background=(True, False)) def inject_fake_data(self, tmpdir, config): target_folder = ( @@ -1106,7 +1199,7 @@ class SEMEIONTestCase(datasets_utils.ImageDatasetTestCase): class USPSTestCase(datasets_utils.ImageDatasetTestCase): DATASET_CLASS = datasets.USPS - ADDITIONAL_CONFIGS = datasets_utils.combinations_grid(train=(True, False)) + ADDITIONAL_CONFIGS = combinations_grid(train=(True, False)) def inject_fake_data(self, tmpdir, config): num_images = 2 if config["train"] else 1 @@ -1128,7 +1221,7 @@ class SBDatasetTestCase(datasets_utils.ImageDatasetTestCase): REQUIRED_PACKAGES = ("scipy.io", "scipy.sparse") - ADDITIONAL_CONFIGS = datasets_utils.combinations_grid( + ADDITIONAL_CONFIGS = combinations_grid( image_set=("train", "val", "train_noval"), mode=("boundaries", "segmentation") ) @@ -1154,7 +1247,7 @@ class SBDatasetTestCase(datasets_utils.ImageDatasetTestCase): self._create_split_file(root, split, idcs) num_images = max(itertools.chain(*splits.values())) + 1 - num_images_per_split = dict([(split, len(idcs)) for split, idcs in splits.items()]) + num_images_per_split = {split: len(idcs) for split, idcs in splits.items()} return num_images, num_images_per_split def _create_split_file(self, root, name, idcs): @@ -1189,6 +1282,11 @@ class SBDatasetTestCase(datasets_utils.ImageDatasetTestCase): def _file_stem(self, idx): return f"2008_{idx:06d}" + def test_transforms_v2_wrapper_spawn(self): + expected_size = (123, 321) + with self.create_dataset(mode="segmentation", transforms=v2.Resize(size=expected_size)) as (dataset, _): + datasets_utils.check_transforms_v2_wrapper_spawn(dataset, expected_size=expected_size) + class FakeDataTestCase(datasets_utils.ImageDatasetTestCase): DATASET_CLASS = datasets.FakeData @@ -1214,7 +1312,7 @@ class PhotoTourTestCase(datasets_utils.ImageDatasetTestCase): _TRAIN_FEATURE_TYPES = (torch.Tensor,) _TEST_FEATURE_TYPES = (torch.Tensor, torch.Tensor, torch.Tensor) - datasets_utils.combinations_grid(train=(True, False)) + combinations_grid(train=(True, False)) _NAME = "liberty" @@ -1348,7 +1446,8 @@ class Flickr8kTestCase(datasets_utils.ImageDatasetTestCase): def test_captions(self): with self.create_dataset() as (dataset, info): _, captions = dataset[0] - self.assertSequenceEqual(captions, info["captions"]) + assert len(captions) == len(info["captions"]) + assert all([a == b for a, b in zip(captions, info["captions"])]) class Flickr30kTestCase(Flickr8kTestCase): @@ -1372,7 +1471,7 @@ class Flickr30kTestCase(Flickr8kTestCase): class MNISTTestCase(datasets_utils.ImageDatasetTestCase): DATASET_CLASS = datasets.MNIST - ADDITIONAL_CONFIGS = datasets_utils.combinations_grid(train=(True, False)) + ADDITIONAL_CONFIGS = combinations_grid(train=(True, False)) _MAGIC_DTYPES = { torch.uint8: 8, @@ -1442,7 +1541,7 @@ class EMNISTTestCase(MNISTTestCase): DATASET_CLASS = datasets.EMNIST DEFAULT_CONFIG = dict(split="byclass") - ADDITIONAL_CONFIGS = datasets_utils.combinations_grid( + ADDITIONAL_CONFIGS = combinations_grid( split=("byclass", "bymerge", "balanced", "letters", "digits", "mnist"), train=(True, False) ) @@ -1453,7 +1552,7 @@ class EMNISTTestCase(MNISTTestCase): class QMNISTTestCase(MNISTTestCase): DATASET_CLASS = datasets.QMNIST - ADDITIONAL_CONFIGS = datasets_utils.combinations_grid(what=("train", "test", "test10k", "nist")) + ADDITIONAL_CONFIGS = combinations_grid(what=("train", "test", "test10k", "nist")) _LABELS_SIZE = (8,) _LABELS_DTYPE = torch.int32 @@ -1492,33 +1591,54 @@ class QMNISTTestCase(MNISTTestCase): with self.create_dataset(what="test50k") as (dataset, info): # Since the split 'test50k' selects all images beginning from the index 10000, we subtract the number of # created examples by this. - self.assertEqual(len(dataset), info["num_examples"] - 10000) + assert len(dataset) == info["num_examples"] - 10000 + + +class MovingMNISTTestCase(datasets_utils.DatasetTestCase): + DATASET_CLASS = datasets.MovingMNIST + FEATURE_TYPES = (torch.Tensor,) + + ADDITIONAL_CONFIGS = combinations_grid(split=(None, "train", "test"), split_ratio=(10, 1, 19)) + + _NUM_FRAMES = 20 + + def inject_fake_data(self, tmpdir, config): + base_folder = os.path.join(tmpdir, self.DATASET_CLASS.__name__) + os.makedirs(base_folder, exist_ok=True) + num_samples = 5 + data = np.concatenate( + [ + np.zeros((config["split_ratio"], num_samples, 64, 64)), + np.ones((self._NUM_FRAMES - config["split_ratio"], num_samples, 64, 64)), + ] + ) + np.save(os.path.join(base_folder, "mnist_test_seq.npy"), data) + return num_samples + + @datasets_utils.test_all_configs + def test_split(self, config): + with self.create_dataset(config) as (dataset, _): + if config["split"] == "train": + assert (dataset.data == 0).all() + elif config["split"] == "test": + assert (dataset.data == 1).all() + else: + assert dataset.data.size()[1] == self._NUM_FRAMES class DatasetFolderTestCase(datasets_utils.ImageDatasetTestCase): DATASET_CLASS = datasets.DatasetFolder - # The dataset has no fixed return type since it is defined by the loader parameter. For testing, we use a loader - # that simply returns the path as type 'str' instead of loading anything. See the 'dataset_args()' method. - FEATURE_TYPES = (str, int) - - _IMAGE_EXTENSIONS = ("jpg", "png") - _VIDEO_EXTENSIONS = ("avi", "mp4") - _EXTENSIONS = (*_IMAGE_EXTENSIONS, *_VIDEO_EXTENSIONS) + _EXTENSIONS = ("jpg", "png") # DatasetFolder has two mutually exclusive parameters: 'extensions' and 'is_valid_file'. One of both is required. # We only iterate over different 'extensions' here and handle the tests for 'is_valid_file' in the # 'test_is_valid_file()' method. DEFAULT_CONFIG = dict(extensions=_EXTENSIONS) - ADDITIONAL_CONFIGS = ( - *datasets_utils.combinations_grid(extensions=[(ext,) for ext in _IMAGE_EXTENSIONS]), - dict(extensions=_IMAGE_EXTENSIONS), - *datasets_utils.combinations_grid(extensions=[(ext,) for ext in _VIDEO_EXTENSIONS]), - dict(extensions=_VIDEO_EXTENSIONS), - ) + ADDITIONAL_CONFIGS = combinations_grid(extensions=[(ext,) for ext in _EXTENSIONS]) def dataset_args(self, tmpdir, config): - return tmpdir, lambda x: x + return tmpdir, datasets.folder.pil_loader def inject_fake_data(self, tmpdir, config): extensions = config["extensions"] or self._is_valid_file_to_extensions(config["is_valid_file"]) @@ -1529,18 +1649,16 @@ class DatasetFolderTestCase(datasets_utils.ImageDatasetTestCase): if ext not in extensions: continue - create_example_folder = ( - datasets_utils.create_image_folder - if ext in self._IMAGE_EXTENSIONS - else datasets_utils.create_video_folder - ) - num_examples = torch.randint(1, 3, size=()).item() - create_example_folder(tmpdir, cls, lambda idx: self._file_name_fn(cls, ext, idx), num_examples) + datasets_utils.create_image_folder(tmpdir, cls, lambda idx: self._file_name_fn(cls, ext, idx), num_examples) num_examples_total += num_examples classes.append(cls) + if config.pop("make_empty_class", False): + os.makedirs(pathlib.Path(tmpdir) / "empty_class") + classes.append("empty_class") + return dict(num_examples=num_examples_total, classes=classes) def _file_name_fn(self, cls, ext, idx): @@ -1555,14 +1673,32 @@ class DatasetFolderTestCase(datasets_utils.ImageDatasetTestCase): # We need to explicitly pass extensions=None here or otherwise it would be filled by the value from the # DEFAULT_CONFIG. with self.create_dataset( - config, extensions=None, is_valid_file=lambda file: pathlib.Path(file).suffix[1:] in extensions + config, extensions=None, is_valid_file=lambda file: pathlib.Path(file).suffix[1:] in extensions ) as (dataset, info): - self.assertEqual(len(dataset), info["num_examples"]) + assert len(dataset) == info["num_examples"] @datasets_utils.test_all_configs def test_classes(self, config): with self.create_dataset(config) as (dataset, info): - self.assertSequenceEqual(dataset.classes, info["classes"]) + assert len(dataset.classes) == len(info["classes"]) + assert all([a == b for a, b in zip(dataset.classes, info["classes"])]) + + def test_allow_empty(self): + config = { + "extensions": self._EXTENSIONS, + "make_empty_class": True, + } + + config["allow_empty"] = True + with self.create_dataset(config) as (dataset, info): + assert "empty_class" in dataset.classes + assert len(dataset.classes) == len(info["classes"]) + assert all([a == b for a, b in zip(dataset.classes, info["classes"])]) + + config["allow_empty"] = False + with pytest.raises(FileNotFoundError, match="Found no valid file"): + with self.create_dataset(config) as (dataset, info): + pass class ImageFolderTestCase(datasets_utils.ImageDatasetTestCase): @@ -1582,13 +1718,14 @@ class ImageFolderTestCase(datasets_utils.ImageDatasetTestCase): @datasets_utils.test_all_configs def test_classes(self, config): with self.create_dataset(config) as (dataset, info): - self.assertSequenceEqual(dataset.classes, info["classes"]) + assert len(dataset.classes) == len(info["classes"]) + assert all([a == b for a, b in zip(dataset.classes, info["classes"])]) class KittiTestCase(datasets_utils.ImageDatasetTestCase): DATASET_CLASS = datasets.Kitti FEATURE_TYPES = (PIL.Image.Image, (list, type(None))) # test split returns None as target - ADDITIONAL_CONFIGS = datasets_utils.combinations_grid(train=(True, False)) + ADDITIONAL_CONFIGS = combinations_grid(train=(True, False)) def inject_fake_data(self, tmpdir, config): kitti_dir = os.path.join(tmpdir, "Kitti", "raw") @@ -1620,11 +1757,16 @@ class KittiTestCase(datasets_utils.ImageDatasetTestCase): return split_to_num_examples[config["train"]] + def test_transforms_v2_wrapper_spawn(self): + expected_size = (123, 321) + with self.create_dataset(transform=v2.Resize(size=expected_size)) as (dataset, _): + datasets_utils.check_transforms_v2_wrapper_spawn(dataset, expected_size=expected_size) + class SvhnTestCase(datasets_utils.ImageDatasetTestCase): DATASET_CLASS = datasets.SVHN REQUIRED_PACKAGES = ("scipy",) - ADDITIONAL_CONFIGS = datasets_utils.combinations_grid(split=("train", "test", "extra")) + ADDITIONAL_CONFIGS = combinations_grid(split=("train", "test", "extra")) def inject_fake_data(self, tmpdir, config): import scipy.io as sio @@ -1639,13 +1781,13 @@ class SvhnTestCase(datasets_utils.ImageDatasetTestCase): file = f"{split}_32x32.mat" images = np.zeros((32, 32, 3, num_examples), dtype=np.uint8) targets = np.zeros((num_examples,), dtype=np.uint8) - sio.savemat(os.path.join(tmpdir, file), {'X': images, 'y': targets}) + sio.savemat(os.path.join(tmpdir, file), {"X": images, "y": targets}) return num_examples class Places365TestCase(datasets_utils.ImageDatasetTestCase): DATASET_CLASS = datasets.Places365 - ADDITIONAL_CONFIGS = datasets_utils.combinations_grid( + ADDITIONAL_CONFIGS = combinations_grid( split=("train-standard", "train-challenge", "val"), small=(False, True), ) @@ -1674,8 +1816,7 @@ class Places365TestCase(datasets_utils.ImageDatasetTestCase): # (file, idx) _FILE_LIST_CONTENT = ( ("Places365_val_00000001.png", 0), - *((f"{category}/Places365_train_00000001.png", idx) - for category, idx in _CATEGORIES_CONTENT), + *((f"{category}/Places365_train_00000001.png", idx) for category, idx in _CATEGORIES_CONTENT), ) @staticmethod @@ -1715,24 +1856,1699 @@ class Places365TestCase(datasets_utils.ImageDatasetTestCase): return [(os.path.join(root, folder_name, image), idx) for image, idx in zip(images, idcs)] def inject_fake_data(self, tmpdir, config): - self._make_devkit_archive(tmpdir, config['split']) - return len(self._make_images_archive(tmpdir, config['split'], config['small'])) + self._make_devkit_archive(tmpdir, config["split"]) + return len(self._make_images_archive(tmpdir, config["split"], config["small"])) def test_classes(self): classes = list(map(lambda x: x[0], self._CATEGORIES_CONTENT)) with self.create_dataset() as (dataset, _): - self.assertEqual(dataset.classes, classes) + assert dataset.classes == classes def test_class_to_idx(self): class_to_idx = dict(self._CATEGORIES_CONTENT) with self.create_dataset() as (dataset, _): - self.assertEqual(dataset.class_to_idx, class_to_idx) + assert dataset.class_to_idx == class_to_idx def test_images_download_preexisting(self): - with self.assertRaises(RuntimeError): - with self.create_dataset({'download': True}): + with pytest.raises(RuntimeError): + with self.create_dataset({"download": True}): + pass + + +class INaturalistTestCase(datasets_utils.ImageDatasetTestCase): + DATASET_CLASS = datasets.INaturalist + FEATURE_TYPES = (PIL.Image.Image, (int, tuple)) + + ADDITIONAL_CONFIGS = combinations_grid( + target_type=("kingdom", "full", "genus", ["kingdom", "phylum", "class", "order", "family", "genus", "full"]), + version=("2021_train",), + ) + + def inject_fake_data(self, tmpdir, config): + categories = [ + "00000_Akingdom_0phylum_Aclass_Aorder_Afamily_Agenus_Aspecies", + "00001_Akingdom_1phylum_Aclass_Border_Afamily_Bgenus_Aspecies", + "00002_Akingdom_2phylum_Cclass_Corder_Cfamily_Cgenus_Cspecies", + ] + + num_images_per_category = 3 + for category in categories: + datasets_utils.create_image_folder( + root=os.path.join(tmpdir, config["version"]), + name=category, + file_name_fn=lambda idx: f"image_{idx + 1:04d}.jpg", + num_examples=num_images_per_category, + ) + + return num_images_per_category * len(categories) + + def test_targets(self): + target_types = ["kingdom", "phylum", "class", "order", "family", "genus", "full"] + + with self.create_dataset(target_type=target_types, version="2021_valid") as (dataset, _): + items = [d[1] for d in dataset] + for i, item in enumerate(items): + assert dataset.category_name("kingdom", item[0]) == "Akingdom" + assert dataset.category_name("phylum", item[1]) == f"{i // 3}phylum" + assert item[6] == i // 3 + + +class LFWPeopleTestCase(datasets_utils.DatasetTestCase): + DATASET_CLASS = datasets.LFWPeople + FEATURE_TYPES = (PIL.Image.Image, int) + ADDITIONAL_CONFIGS = combinations_grid( + split=("10fold", "train", "test"), image_set=("original", "funneled", "deepfunneled") + ) + _IMAGES_DIR = {"original": "lfw", "funneled": "lfw_funneled", "deepfunneled": "lfw-deepfunneled"} + _file_id = {"10fold": "", "train": "DevTrain", "test": "DevTest"} + + def inject_fake_data(self, tmpdir, config): + tmpdir = pathlib.Path(tmpdir) / "lfw-py" + os.makedirs(tmpdir, exist_ok=True) + return dict( + num_examples=self._create_images_dir(tmpdir, self._IMAGES_DIR[config["image_set"]], config["split"]), + split=config["split"], + ) + + def _create_images_dir(self, root, idir, split): + idir = os.path.join(root, idir) + os.makedirs(idir, exist_ok=True) + n, flines = (10, ["10\n"]) if split == "10fold" else (1, []) + num_examples = 0 + names = [] + for _ in range(n): + num_people = random.randint(2, 5) + flines.append(f"{num_people}\n") + for i in range(num_people): + name = self._create_random_id() + no = random.randint(1, 10) + flines.append(f"{name}\t{no}\n") + names.append(f"{name}\t{no}\n") + datasets_utils.create_image_folder(idir, name, lambda n: f"{name}_{n+1:04d}.jpg", no, 250) + num_examples += no + with open(pathlib.Path(root) / f"people{self._file_id[split]}.txt", "w") as f: + f.writelines(flines) + with open(pathlib.Path(root) / "lfw-names.txt", "w") as f: + f.writelines(sorted(names)) + + return num_examples + + def _create_random_id(self): + part1 = datasets_utils.create_random_string(random.randint(5, 7)) + part2 = datasets_utils.create_random_string(random.randint(4, 7)) + return f"{part1}_{part2}" + + +class LFWPairsTestCase(LFWPeopleTestCase): + DATASET_CLASS = datasets.LFWPairs + FEATURE_TYPES = (PIL.Image.Image, PIL.Image.Image, int) + + def _create_images_dir(self, root, idir, split): + idir = os.path.join(root, idir) + os.makedirs(idir, exist_ok=True) + num_pairs = 7 # effectively 7*2*n = 14*n + n, self.flines = (10, [f"10\t{num_pairs}"]) if split == "10fold" else (1, [str(num_pairs)]) + for _ in range(n): + self._inject_pairs(idir, num_pairs, True) + self._inject_pairs(idir, num_pairs, False) + with open(pathlib.Path(root) / f"pairs{self._file_id[split]}.txt", "w") as f: + f.writelines(self.flines) + + return num_pairs * 2 * n + + def _inject_pairs(self, root, num_pairs, same): + for i in range(num_pairs): + name1 = self._create_random_id() + name2 = name1 if same else self._create_random_id() + no1, no2 = random.randint(1, 100), random.randint(1, 100) + if same: + self.flines.append(f"\n{name1}\t{no1}\t{no2}") + else: + self.flines.append(f"\n{name1}\t{no1}\t{name2}\t{no2}") + + datasets_utils.create_image_folder(root, name1, lambda _: f"{name1}_{no1:04d}.jpg", 1, 250) + datasets_utils.create_image_folder(root, name2, lambda _: f"{name2}_{no2:04d}.jpg", 1, 250) + + +class SintelTestCase(datasets_utils.ImageDatasetTestCase): + DATASET_CLASS = datasets.Sintel + ADDITIONAL_CONFIGS = combinations_grid(split=("train", "test"), pass_name=("clean", "final", "both")) + FEATURE_TYPES = (PIL.Image.Image, PIL.Image.Image, (np.ndarray, type(None))) + + FLOW_H, FLOW_W = 3, 4 + + def inject_fake_data(self, tmpdir, config): + root = pathlib.Path(tmpdir) / "Sintel" + + num_images_per_scene = 3 if config["split"] == "train" else 4 + num_scenes = 2 + + for split_dir in ("training", "test"): + for pass_name in ("clean", "final"): + image_root = root / split_dir / pass_name + + for scene_id in range(num_scenes): + scene_dir = image_root / f"scene_{scene_id}" + datasets_utils.create_image_folder( + image_root, + name=str(scene_dir), + file_name_fn=lambda image_idx: f"frame_000{image_idx}.png", + num_examples=num_images_per_scene, + ) + + flow_root = root / "training" / "flow" + for scene_id in range(num_scenes): + scene_dir = flow_root / f"scene_{scene_id}" + os.makedirs(scene_dir) + for i in range(num_images_per_scene - 1): + file_name = str(scene_dir / f"frame_000{i}.flo") + datasets_utils.make_fake_flo_file(h=self.FLOW_H, w=self.FLOW_W, file_name=file_name) + + # with e.g. num_images_per_scene = 3, for a single scene with have 3 images + # which are frame_0000, frame_0001 and frame_0002 + # They will be consecutively paired as (frame_0000, frame_0001), (frame_0001, frame_0002), + # that is 3 - 1 = 2 examples. Hence the formula below + num_passes = 2 if config["pass_name"] == "both" else 1 + num_examples = (num_images_per_scene - 1) * num_scenes * num_passes + return num_examples + + def test_flow(self): + # Make sure flow exists for train split, and make sure there are as many flow values as (pairs of) images + h, w = self.FLOW_H, self.FLOW_W + expected_flow = np.arange(2 * h * w).reshape(h, w, 2).transpose(2, 0, 1) + with self.create_dataset(split="train") as (dataset, _): + assert dataset._flow_list and len(dataset._flow_list) == len(dataset._image_list) + for _, _, flow in dataset: + assert flow.shape == (2, h, w) + np.testing.assert_allclose(flow, expected_flow) + + # Make sure flow is always None for test split + with self.create_dataset(split="test") as (dataset, _): + assert dataset._image_list and not dataset._flow_list + for _, _, flow in dataset: + assert flow is None + + def test_bad_input(self): + with pytest.raises(ValueError, match="Unknown value 'bad' for argument split"): + with self.create_dataset(split="bad"): + pass + + with pytest.raises(ValueError, match="Unknown value 'bad' for argument pass_name"): + with self.create_dataset(pass_name="bad"): + pass + + +class KittiFlowTestCase(datasets_utils.ImageDatasetTestCase): + DATASET_CLASS = datasets.KittiFlow + ADDITIONAL_CONFIGS = combinations_grid(split=("train", "test")) + FEATURE_TYPES = (PIL.Image.Image, PIL.Image.Image, (np.ndarray, type(None)), (np.ndarray, type(None))) + + def inject_fake_data(self, tmpdir, config): + root = pathlib.Path(tmpdir) / "KittiFlow" + + num_examples = 2 if config["split"] == "train" else 3 + for split_dir in ("training", "testing"): + + datasets_utils.create_image_folder( + root / split_dir, + name="image_2", + file_name_fn=lambda image_idx: f"{image_idx}_10.png", + num_examples=num_examples, + ) + datasets_utils.create_image_folder( + root / split_dir, + name="image_2", + file_name_fn=lambda image_idx: f"{image_idx}_11.png", + num_examples=num_examples, + ) + + # For kitti the ground truth flows are encoded as 16-bits pngs. + # create_image_folder() will actually create 8-bits pngs, but it doesn't + # matter much: the flow reader will still be able to read the files, it + # will just be garbage flow value - but we don't care about that here. + datasets_utils.create_image_folder( + root / "training", + name="flow_occ", + file_name_fn=lambda image_idx: f"{image_idx}_10.png", + num_examples=num_examples, + ) + + return num_examples + + def test_flow_and_valid(self): + # Make sure flow exists for train split, and make sure there are as many flow values as (pairs of) images + # Also assert flow and valid are of the expected shape + with self.create_dataset(split="train") as (dataset, _): + assert dataset._flow_list and len(dataset._flow_list) == len(dataset._image_list) + for _, _, flow, valid in dataset: + two, h, w = flow.shape + assert two == 2 + assert valid.shape == (h, w) + + # Make sure flow and valid are always None for test split + with self.create_dataset(split="test") as (dataset, _): + assert dataset._image_list and not dataset._flow_list + for _, _, flow, valid in dataset: + assert flow is None + assert valid is None + + def test_bad_input(self): + with pytest.raises(ValueError, match="Unknown value 'bad' for argument split"): + with self.create_dataset(split="bad"): + pass + + +class FlyingChairsTestCase(datasets_utils.ImageDatasetTestCase): + DATASET_CLASS = datasets.FlyingChairs + ADDITIONAL_CONFIGS = combinations_grid(split=("train", "val")) + FEATURE_TYPES = (PIL.Image.Image, PIL.Image.Image, (np.ndarray, type(None))) + + FLOW_H, FLOW_W = 3, 4 + + def _make_split_file(self, root, num_examples): + # We create a fake split file here, but users are asked to download the real one from the authors website + split_ids = [1] * num_examples["train"] + [2] * num_examples["val"] + random.shuffle(split_ids) + with open(str(root / "FlyingChairs_train_val.txt"), "w+") as split_file: + for split_id in split_ids: + split_file.write(f"{split_id}\n") + + def inject_fake_data(self, tmpdir, config): + root = pathlib.Path(tmpdir) / "FlyingChairs" + + num_examples = {"train": 5, "val": 3} + num_examples_total = sum(num_examples.values()) + + datasets_utils.create_image_folder( # img1 + root, + name="data", + file_name_fn=lambda image_idx: f"00{image_idx}_img1.ppm", + num_examples=num_examples_total, + ) + datasets_utils.create_image_folder( # img2 + root, + name="data", + file_name_fn=lambda image_idx: f"00{image_idx}_img2.ppm", + num_examples=num_examples_total, + ) + for i in range(num_examples_total): + file_name = str(root / "data" / f"00{i}_flow.flo") + datasets_utils.make_fake_flo_file(h=self.FLOW_H, w=self.FLOW_W, file_name=file_name) + + self._make_split_file(root, num_examples) + + return num_examples[config["split"]] + + @datasets_utils.test_all_configs + def test_flow(self, config): + # Make sure flow always exists, and make sure there are as many flow values as (pairs of) images + # Also make sure the flow is properly decoded + + h, w = self.FLOW_H, self.FLOW_W + expected_flow = np.arange(2 * h * w).reshape(h, w, 2).transpose(2, 0, 1) + with self.create_dataset(config=config) as (dataset, _): + assert dataset._flow_list and len(dataset._flow_list) == len(dataset._image_list) + for _, _, flow in dataset: + assert flow.shape == (2, h, w) + np.testing.assert_allclose(flow, expected_flow) + + +class FlyingThings3DTestCase(datasets_utils.ImageDatasetTestCase): + DATASET_CLASS = datasets.FlyingThings3D + ADDITIONAL_CONFIGS = combinations_grid( + split=("train", "test"), pass_name=("clean", "final", "both"), camera=("left", "right", "both") + ) + FEATURE_TYPES = (PIL.Image.Image, PIL.Image.Image, (np.ndarray, type(None))) + + FLOW_H, FLOW_W = 3, 4 + + def inject_fake_data(self, tmpdir, config): + root = pathlib.Path(tmpdir) / "FlyingThings3D" + + num_images_per_camera = 3 if config["split"] == "train" else 4 + passes = ("frames_cleanpass", "frames_finalpass") + splits = ("TRAIN", "TEST") + letters = ("A", "B", "C") + subfolders = ("0000", "0001") + cameras = ("left", "right") + for pass_name, split, letter, subfolder, camera in itertools.product( + passes, splits, letters, subfolders, cameras + ): + current_folder = root / pass_name / split / letter / subfolder + datasets_utils.create_image_folder( + current_folder, + name=camera, + file_name_fn=lambda image_idx: f"00{image_idx}.png", + num_examples=num_images_per_camera, + ) + + directions = ("into_future", "into_past") + for split, letter, subfolder, direction, camera in itertools.product( + splits, letters, subfolders, directions, cameras + ): + current_folder = root / "optical_flow" / split / letter / subfolder / direction / camera + os.makedirs(str(current_folder), exist_ok=True) + for i in range(num_images_per_camera): + datasets_utils.make_fake_pfm_file(self.FLOW_H, self.FLOW_W, file_name=str(current_folder / f"{i}.pfm")) + + num_cameras = 2 if config["camera"] == "both" else 1 + num_passes = 2 if config["pass_name"] == "both" else 1 + num_examples = ( + (num_images_per_camera - 1) * num_cameras * len(subfolders) * len(letters) * len(splits) * num_passes + ) + return num_examples + + @datasets_utils.test_all_configs + def test_flow(self, config): + h, w = self.FLOW_H, self.FLOW_W + expected_flow = np.arange(3 * h * w).reshape(h, w, 3).transpose(2, 0, 1) + expected_flow = np.flip(expected_flow, axis=1) + expected_flow = expected_flow[:2, :, :] + + with self.create_dataset(config=config) as (dataset, _): + assert dataset._flow_list and len(dataset._flow_list) == len(dataset._image_list) + for _, _, flow in dataset: + assert flow.shape == (2, self.FLOW_H, self.FLOW_W) + np.testing.assert_allclose(flow, expected_flow) + + def test_bad_input(self): + with pytest.raises(ValueError, match="Unknown value 'bad' for argument split"): + with self.create_dataset(split="bad"): + pass + + with pytest.raises(ValueError, match="Unknown value 'bad' for argument pass_name"): + with self.create_dataset(pass_name="bad"): + pass + + with pytest.raises(ValueError, match="Unknown value 'bad' for argument camera"): + with self.create_dataset(camera="bad"): pass +class HD1KTestCase(KittiFlowTestCase): + DATASET_CLASS = datasets.HD1K + + def inject_fake_data(self, tmpdir, config): + root = pathlib.Path(tmpdir) / "hd1k" + + num_sequences = 4 if config["split"] == "train" else 3 + num_examples_per_train_sequence = 3 + + for seq_idx in range(num_sequences): + # Training data + datasets_utils.create_image_folder( + root / "hd1k_input", + name="image_2", + file_name_fn=lambda image_idx: f"{seq_idx:06d}_{image_idx}.png", + num_examples=num_examples_per_train_sequence, + ) + datasets_utils.create_image_folder( + root / "hd1k_flow_gt", + name="flow_occ", + file_name_fn=lambda image_idx: f"{seq_idx:06d}_{image_idx}.png", + num_examples=num_examples_per_train_sequence, + ) + + # Test data + datasets_utils.create_image_folder( + root / "hd1k_challenge", + name="image_2", + file_name_fn=lambda _: f"{seq_idx:06d}_10.png", + num_examples=1, + ) + datasets_utils.create_image_folder( + root / "hd1k_challenge", + name="image_2", + file_name_fn=lambda _: f"{seq_idx:06d}_11.png", + num_examples=1, + ) + + num_examples_per_sequence = num_examples_per_train_sequence if config["split"] == "train" else 2 + return num_sequences * (num_examples_per_sequence - 1) + + +class EuroSATTestCase(datasets_utils.ImageDatasetTestCase): + DATASET_CLASS = datasets.EuroSAT + FEATURE_TYPES = (PIL.Image.Image, int) + + def inject_fake_data(self, tmpdir, config): + data_folder = os.path.join(tmpdir, "eurosat", "2750") + os.makedirs(data_folder) + + num_examples_per_class = 3 + classes = ("AnnualCrop", "Forest") + for cls in classes: + datasets_utils.create_image_folder( + root=data_folder, + name=cls, + file_name_fn=lambda idx: f"{cls}_{idx}.jpg", + num_examples=num_examples_per_class, + ) + + return len(classes) * num_examples_per_class + + +class Food101TestCase(datasets_utils.ImageDatasetTestCase): + DATASET_CLASS = datasets.Food101 + FEATURE_TYPES = (PIL.Image.Image, int) + + ADDITIONAL_CONFIGS = combinations_grid(split=("train", "test")) + + def inject_fake_data(self, tmpdir: str, config): + root_folder = pathlib.Path(tmpdir) / "food-101" + image_folder = root_folder / "images" + meta_folder = root_folder / "meta" + + image_folder.mkdir(parents=True) + meta_folder.mkdir() + + num_images_per_class = 5 + + metadata = {} + n_samples_per_class = 3 if config["split"] == "train" else 2 + sampled_classes = ("apple_pie", "crab_cakes", "gyoza") + for cls in sampled_classes: + im_fnames = datasets_utils.create_image_folder( + image_folder, + cls, + file_name_fn=lambda idx: f"{idx}.jpg", + num_examples=num_images_per_class, + ) + metadata[cls] = [ + "/".join(fname.relative_to(image_folder).with_suffix("").parts) + for fname in random.choices(im_fnames, k=n_samples_per_class) + ] + + with open(meta_folder / f"{config['split']}.json", "w") as file: + file.write(json.dumps(metadata)) + + return len(sampled_classes * n_samples_per_class) + + +class FGVCAircraftTestCase(datasets_utils.ImageDatasetTestCase): + DATASET_CLASS = datasets.FGVCAircraft + ADDITIONAL_CONFIGS = combinations_grid( + split=("train", "val", "trainval", "test"), annotation_level=("variant", "family", "manufacturer") + ) + + def inject_fake_data(self, tmpdir: str, config): + split = config["split"] + annotation_level = config["annotation_level"] + annotation_level_to_file = { + "variant": "variants.txt", + "family": "families.txt", + "manufacturer": "manufacturers.txt", + } + + root_folder = pathlib.Path(tmpdir) / "fgvc-aircraft-2013b" + data_folder = root_folder / "data" + + classes = ["707-320", "Hawk T1", "Tornado"] + num_images_per_class = 5 + + datasets_utils.create_image_folder( + data_folder, + "images", + file_name_fn=lambda idx: f"{idx}.jpg", + num_examples=num_images_per_class * len(classes), + ) + + annotation_file = data_folder / annotation_level_to_file[annotation_level] + with open(annotation_file, "w") as file: + file.write("\n".join(classes)) + + num_samples_per_class = 4 if split == "trainval" else 2 + images_classes = [] + for i in range(len(classes)): + images_classes.extend( + [ + f"{idx} {classes[i]}" + for idx in random.sample( + range(i * num_images_per_class, (i + 1) * num_images_per_class), num_samples_per_class + ) + ] + ) + + images_annotation_file = data_folder / f"images_{annotation_level}_{split}.txt" + with open(images_annotation_file, "w") as file: + file.write("\n".join(images_classes)) + + return len(classes * num_samples_per_class) + + +class SUN397TestCase(datasets_utils.ImageDatasetTestCase): + DATASET_CLASS = datasets.SUN397 + + def inject_fake_data(self, tmpdir: str, config): + data_dir = pathlib.Path(tmpdir) / "SUN397" + data_dir.mkdir() + + num_images_per_class = 5 + sampled_classes = ("abbey", "airplane_cabin", "airport_terminal") + im_paths = [] + + for cls in sampled_classes: + image_folder = data_dir / cls[0] + im_paths.extend( + datasets_utils.create_image_folder( + image_folder, + image_folder / cls, + file_name_fn=lambda idx: f"sun_{idx}.jpg", + num_examples=num_images_per_class, + ) + ) + + with open(data_dir / "ClassName.txt", "w") as file: + file.writelines("\n".join(f"/{cls[0]}/{cls}" for cls in sampled_classes)) + + num_samples = len(im_paths) + + return num_samples + + +class DTDTestCase(datasets_utils.ImageDatasetTestCase): + DATASET_CLASS = datasets.DTD + FEATURE_TYPES = (PIL.Image.Image, int) + + ADDITIONAL_CONFIGS = combinations_grid( + split=("train", "test", "val"), + # There is no need to test the whole matrix here, since each fold is treated exactly the same + partition=(1, 5, 10), + ) + + def inject_fake_data(self, tmpdir: str, config): + data_folder = pathlib.Path(tmpdir) / "dtd" / "dtd" + + num_images_per_class = 3 + image_folder = data_folder / "images" + image_files = [] + for cls in ("banded", "marbled", "zigzagged"): + image_files.extend( + datasets_utils.create_image_folder( + image_folder, + cls, + file_name_fn=lambda idx: f"{cls}_{idx:04d}.jpg", + num_examples=num_images_per_class, + ) + ) + + meta_folder = data_folder / "labels" + meta_folder.mkdir() + image_ids = [str(path.relative_to(path.parents[1])).replace(os.sep, "/") for path in image_files] + image_ids_in_config = random.choices(image_ids, k=len(image_files) // 2) + with open(meta_folder / f"{config['split']}{config['partition']}.txt", "w") as file: + file.write("\n".join(image_ids_in_config) + "\n") + + return len(image_ids_in_config) + + +class FER2013TestCase(datasets_utils.ImageDatasetTestCase): + DATASET_CLASS = datasets.FER2013 + ADDITIONAL_CONFIGS = combinations_grid(split=("train", "test")) + + FEATURE_TYPES = (PIL.Image.Image, (int, type(None))) + + def inject_fake_data(self, tmpdir, config): + base_folder = os.path.join(tmpdir, "fer2013") + os.makedirs(base_folder) + + use_icml = config.pop("use_icml", False) + use_fer = config.pop("use_fer", False) + + num_samples = 5 + + if use_icml or use_fer: + pixels_key, usage_key = (" pixels", " Usage") if use_icml else ("pixels", "Usage") + fieldnames = ("emotion", usage_key, pixels_key) if use_icml else ("emotion", pixels_key, usage_key) + filename = "icml_face_data.csv" if use_icml else "fer2013.csv" + with open(os.path.join(base_folder, filename), "w", newline="") as file: + writer = csv.DictWriter( + file, + fieldnames=fieldnames, + quoting=csv.QUOTE_NONNUMERIC, + quotechar='"', + ) + writer.writeheader() + for i in range(num_samples): + row = { + "emotion": str(int(torch.randint(0, 7, ()))), + usage_key: "Training" if i % 2 else "PublicTest", + pixels_key: " ".join( + str(pixel) + for pixel in datasets_utils.create_image_or_video_tensor((48, 48)).view(-1).tolist() + ), + } + + writer.writerow(row) + else: + with open(os.path.join(base_folder, f"{config['split']}.csv"), "w", newline="") as file: + writer = csv.DictWriter( + file, + fieldnames=("emotion", "pixels") if config["split"] == "train" else ("pixels",), + quoting=csv.QUOTE_NONNUMERIC, + quotechar='"', + ) + writer.writeheader() + for _ in range(num_samples): + row = dict( + pixels=" ".join( + str(pixel) + for pixel in datasets_utils.create_image_or_video_tensor((48, 48)).view(-1).tolist() + ) + ) + if config["split"] == "train": + row["emotion"] = str(int(torch.randint(0, 7, ()))) + + writer.writerow(row) + + return num_samples + + def test_icml_file(self): + config = {"split": "test"} + with self.create_dataset(config=config) as (dataset, _): + assert all(s[1] is None for s in dataset) + + for split in ("train", "test"): + for d in ({"use_icml": True}, {"use_fer": True}): + config = {"split": split, **d} + with self.create_dataset(config=config) as (dataset, _): + assert all(s[1] is not None for s in dataset) + + +class GTSRBTestCase(datasets_utils.ImageDatasetTestCase): + DATASET_CLASS = datasets.GTSRB + FEATURE_TYPES = (PIL.Image.Image, int) + + ADDITIONAL_CONFIGS = combinations_grid(split=("train", "test")) + + def inject_fake_data(self, tmpdir: str, config): + root_folder = os.path.join(tmpdir, "gtsrb") + os.makedirs(root_folder, exist_ok=True) + + # Train data + train_folder = os.path.join(root_folder, "GTSRB", "Training") + os.makedirs(train_folder, exist_ok=True) + + num_examples = 3 if config["split"] == "train" else 4 + classes = ("00000", "00042", "00012") + for class_idx in classes: + datasets_utils.create_image_folder( + train_folder, + name=class_idx, + file_name_fn=lambda image_idx: f"{class_idx}_{image_idx:05d}.ppm", + num_examples=num_examples, + ) + + total_number_of_examples = num_examples * len(classes) + # Test data + test_folder = os.path.join(root_folder, "GTSRB", "Final_Test", "Images") + os.makedirs(test_folder, exist_ok=True) + + with open(os.path.join(root_folder, "GT-final_test.csv"), "w") as csv_file: + csv_file.write("Filename;Width;Height;Roi.X1;Roi.Y1;Roi.X2;Roi.Y2;ClassId\n") + + for _ in range(total_number_of_examples): + image_file = datasets_utils.create_random_string(5, string.digits) + ".ppm" + datasets_utils.create_image_file(test_folder, image_file) + row = [ + image_file, + torch.randint(1, 100, size=()).item(), + torch.randint(1, 100, size=()).item(), + torch.randint(1, 100, size=()).item(), + torch.randint(1, 100, size=()).item(), + torch.randint(1, 100, size=()).item(), + torch.randint(1, 100, size=()).item(), + torch.randint(0, 43, size=()).item(), + ] + csv_file.write(";".join(map(str, row)) + "\n") + + return total_number_of_examples + + +class CLEVRClassificationTestCase(datasets_utils.ImageDatasetTestCase): + DATASET_CLASS = datasets.CLEVRClassification + FEATURE_TYPES = (PIL.Image.Image, (int, type(None))) + + ADDITIONAL_CONFIGS = combinations_grid(split=("train", "val", "test")) + + def inject_fake_data(self, tmpdir, config): + data_folder = pathlib.Path(tmpdir) / "clevr" / "CLEVR_v1.0" + + images_folder = data_folder / "images" + image_files = datasets_utils.create_image_folder( + images_folder, config["split"], lambda idx: f"CLEVR_{config['split']}_{idx:06d}.png", num_examples=5 + ) + + scenes_folder = data_folder / "scenes" + scenes_folder.mkdir() + if config["split"] != "test": + with open(scenes_folder / f"CLEVR_{config['split']}_scenes.json", "w") as file: + json.dump( + dict( + info=dict(), + scenes=[ + dict(image_filename=image_file.name, objects=[dict()] * int(torch.randint(10, ()))) + for image_file in image_files + ], + ), + file, + ) + + return len(image_files) + + +class OxfordIIITPetTestCase(datasets_utils.ImageDatasetTestCase): + DATASET_CLASS = datasets.OxfordIIITPet + FEATURE_TYPES = (PIL.Image.Image, (int, PIL.Image.Image, tuple, type(None))) + + ADDITIONAL_CONFIGS = combinations_grid( + split=("trainval", "test"), + target_types=("category", "binary-category", "segmentation", ["category", "segmentation"], []), + ) + + def inject_fake_data(self, tmpdir, config): + base_folder = os.path.join(tmpdir, "oxford-iiit-pet") + + classification_anns_meta = ( + dict(cls="Abyssinian", label=0, species="cat"), + dict(cls="Keeshond", label=18, species="dog"), + dict(cls="Yorkshire Terrier", label=37, species="dog"), + ) + split_and_classification_anns = [ + self._meta_to_split_and_classification_ann(meta, idx) + for meta, idx in itertools.product(classification_anns_meta, (1, 2, 10)) + ] + image_ids, *_ = zip(*split_and_classification_anns) + + image_files = datasets_utils.create_image_folder( + base_folder, "images", file_name_fn=lambda idx: f"{image_ids[idx]}.jpg", num_examples=len(image_ids) + ) + + anns_folder = os.path.join(base_folder, "annotations") + os.makedirs(anns_folder) + split_and_classification_anns_in_split = random.choices(split_and_classification_anns, k=len(image_ids) // 2) + with open(os.path.join(anns_folder, f"{config['split']}.txt"), "w", newline="") as file: + writer = csv.writer(file, delimiter=" ") + for split_and_classification_ann in split_and_classification_anns_in_split: + writer.writerow(split_and_classification_ann) + + segmentation_files = datasets_utils.create_image_folder( + anns_folder, "trimaps", file_name_fn=lambda idx: f"{image_ids[idx]}.png", num_examples=len(image_ids) + ) + + # The dataset has some rogue files + for path in image_files[:2]: + path.with_suffix(".mat").touch() + for path in segmentation_files: + path.with_name(f".{path.name}").touch() + + return len(split_and_classification_anns_in_split) + + def _meta_to_split_and_classification_ann(self, meta, idx): + image_id = "_".join( + [ + *[(str.title if meta["species"] == "cat" else str.lower)(part) for part in meta["cls"].split()], + str(idx), + ] + ) + class_id = str(meta["label"] + 1) + species = "1" if meta["species"] == "cat" else "2" + breed_id = "-1" + return (image_id, class_id, species, breed_id) + + def test_transforms_v2_wrapper_spawn(self): + expected_size = (123, 321) + with self.create_dataset(transform=v2.Resize(size=expected_size)) as (dataset, _): + datasets_utils.check_transforms_v2_wrapper_spawn(dataset, expected_size=expected_size) + + +class StanfordCarsTestCase(datasets_utils.ImageDatasetTestCase): + DATASET_CLASS = datasets.StanfordCars + REQUIRED_PACKAGES = ("scipy",) + ADDITIONAL_CONFIGS = combinations_grid(split=("train", "test")) + + def inject_fake_data(self, tmpdir, config): + import scipy.io as io + from numpy.core.records import fromarrays + + num_examples = {"train": 5, "test": 7}[config["split"]] + num_classes = 3 + base_folder = pathlib.Path(tmpdir) / "stanford_cars" + + devkit = base_folder / "devkit" + devkit.mkdir(parents=True) + + if config["split"] == "train": + images_folder_name = "cars_train" + annotations_mat_path = devkit / "cars_train_annos.mat" + else: + images_folder_name = "cars_test" + annotations_mat_path = base_folder / "cars_test_annos_withlabels.mat" + + datasets_utils.create_image_folder( + root=base_folder, + name=images_folder_name, + file_name_fn=lambda image_index: f"{image_index:5d}.jpg", + num_examples=num_examples, + ) + + classes = np.random.randint(1, num_classes + 1, num_examples, dtype=np.uint8) + fnames = [f"{i:5d}.jpg" for i in range(num_examples)] + rec_array = fromarrays( + [classes, fnames], + names=["class", "fname"], + ) + io.savemat(annotations_mat_path, {"annotations": rec_array}) + + random_class_names = ["random_name"] * num_classes + io.savemat(devkit / "cars_meta.mat", {"class_names": random_class_names}) + + return num_examples + + +class Country211TestCase(datasets_utils.ImageDatasetTestCase): + DATASET_CLASS = datasets.Country211 + + ADDITIONAL_CONFIGS = combinations_grid(split=("train", "valid", "test")) + + def inject_fake_data(self, tmpdir: str, config): + split_folder = pathlib.Path(tmpdir) / "country211" / config["split"] + split_folder.mkdir(parents=True, exist_ok=True) + + num_examples = { + "train": 3, + "valid": 4, + "test": 5, + }[config["split"]] + + classes = ("AD", "BS", "GR") + for cls in classes: + datasets_utils.create_image_folder( + split_folder, + name=cls, + file_name_fn=lambda idx: f"{idx}.jpg", + num_examples=num_examples, + ) + + return num_examples * len(classes) + + +class Flowers102TestCase(datasets_utils.ImageDatasetTestCase): + DATASET_CLASS = datasets.Flowers102 + + ADDITIONAL_CONFIGS = combinations_grid(split=("train", "val", "test")) + REQUIRED_PACKAGES = ("scipy",) + + def inject_fake_data(self, tmpdir: str, config): + base_folder = pathlib.Path(tmpdir) / "flowers-102" + + num_classes = 3 + num_images_per_split = dict(train=5, val=4, test=3) + num_images_total = sum(num_images_per_split.values()) + datasets_utils.create_image_folder( + base_folder, + "jpg", + file_name_fn=lambda idx: f"image_{idx + 1:05d}.jpg", + num_examples=num_images_total, + ) + + label_dict = dict( + labels=np.random.randint(1, num_classes + 1, size=(1, num_images_total), dtype=np.uint8), + ) + datasets_utils.lazy_importer.scipy.io.savemat(str(base_folder / "imagelabels.mat"), label_dict) + + setid_mat = np.arange(1, num_images_total + 1, dtype=np.uint16) + np.random.shuffle(setid_mat) + setid_dict = dict( + trnid=setid_mat[: num_images_per_split["train"]].reshape(1, -1), + valid=setid_mat[num_images_per_split["train"] : -num_images_per_split["test"]].reshape(1, -1), + tstid=setid_mat[-num_images_per_split["test"] :].reshape(1, -1), + ) + datasets_utils.lazy_importer.scipy.io.savemat(str(base_folder / "setid.mat"), setid_dict) + + return num_images_per_split[config["split"]] + + +class PCAMTestCase(datasets_utils.ImageDatasetTestCase): + DATASET_CLASS = datasets.PCAM + + ADDITIONAL_CONFIGS = combinations_grid(split=("train", "val", "test")) + REQUIRED_PACKAGES = ("h5py",) + + def inject_fake_data(self, tmpdir: str, config): + base_folder = pathlib.Path(tmpdir) / "pcam" + base_folder.mkdir() + + num_images = {"train": 2, "test": 3, "val": 4}[config["split"]] + + images_file = datasets.PCAM._FILES[config["split"]]["images"][0] + with datasets_utils.lazy_importer.h5py.File(str(base_folder / images_file), "w") as f: + f["x"] = np.random.randint(0, 256, size=(num_images, 10, 10, 3), dtype=np.uint8) + + targets_file = datasets.PCAM._FILES[config["split"]]["targets"][0] + with datasets_utils.lazy_importer.h5py.File(str(base_folder / targets_file), "w") as f: + f["y"] = np.random.randint(0, 2, size=(num_images, 1, 1, 1), dtype=np.uint8) + + return num_images + + +class RenderedSST2TestCase(datasets_utils.ImageDatasetTestCase): + DATASET_CLASS = datasets.RenderedSST2 + ADDITIONAL_CONFIGS = combinations_grid(split=("train", "val", "test")) + SPLIT_TO_FOLDER = {"train": "train", "val": "valid", "test": "test"} + + def inject_fake_data(self, tmpdir: str, config): + root_folder = pathlib.Path(tmpdir) / "rendered-sst2" + image_folder = root_folder / self.SPLIT_TO_FOLDER[config["split"]] + + num_images_per_class = {"train": 5, "test": 6, "val": 7} + sampled_classes = ["positive", "negative"] + for cls in sampled_classes: + datasets_utils.create_image_folder( + image_folder, + cls, + file_name_fn=lambda idx: f"{idx}.png", + num_examples=num_images_per_class[config["split"]], + ) + + return len(sampled_classes) * num_images_per_class[config["split"]] + + +class Kitti2012StereoTestCase(datasets_utils.ImageDatasetTestCase): + DATASET_CLASS = datasets.Kitti2012Stereo + ADDITIONAL_CONFIGS = combinations_grid(split=("train", "test")) + FEATURE_TYPES = (PIL.Image.Image, PIL.Image.Image, (np.ndarray, type(None)), (np.ndarray, type(None))) + + def inject_fake_data(self, tmpdir, config): + kitti_dir = pathlib.Path(tmpdir) / "Kitti2012" + os.makedirs(kitti_dir, exist_ok=True) + + split_dir = kitti_dir / (config["split"] + "ing") + os.makedirs(split_dir, exist_ok=True) + + num_examples = {"train": 4, "test": 3}.get(config["split"], 0) + + datasets_utils.create_image_folder( + root=split_dir, + name="colored_0", + file_name_fn=lambda i: f"{i:06d}_10.png", + num_examples=num_examples, + size=(3, 100, 200), + ) + datasets_utils.create_image_folder( + root=split_dir, + name="colored_1", + file_name_fn=lambda i: f"{i:06d}_10.png", + num_examples=num_examples, + size=(3, 100, 200), + ) + + if config["split"] == "train": + datasets_utils.create_image_folder( + root=split_dir, + name="disp_noc", + file_name_fn=lambda i: f"{i:06d}.png", + num_examples=num_examples, + # Kitti2012 uses a single channel image for disparities + size=(1, 100, 200), + ) + + return num_examples + + def test_train_splits(self): + for split in ["train"]: + with self.create_dataset(split=split) as (dataset, _): + for left, right, disparity, mask in dataset: + assert mask is None + datasets_utils.shape_test_for_stereo(left, right, disparity) + + def test_test_split(self): + for split in ["test"]: + with self.create_dataset(split=split) as (dataset, _): + for left, right, disparity, mask in dataset: + assert mask is None + assert disparity is None + datasets_utils.shape_test_for_stereo(left, right) + + def test_bad_input(self): + with pytest.raises(ValueError, match="Unknown value 'bad' for argument split"): + with self.create_dataset(split="bad"): + pass + + +class Kitti2015StereoTestCase(datasets_utils.ImageDatasetTestCase): + DATASET_CLASS = datasets.Kitti2015Stereo + ADDITIONAL_CONFIGS = combinations_grid(split=("train", "test")) + FEATURE_TYPES = (PIL.Image.Image, PIL.Image.Image, (np.ndarray, type(None)), (np.ndarray, type(None))) + + def inject_fake_data(self, tmpdir, config): + kitti_dir = pathlib.Path(tmpdir) / "Kitti2015" + os.makedirs(kitti_dir, exist_ok=True) + + split_dir = kitti_dir / (config["split"] + "ing") + os.makedirs(split_dir, exist_ok=True) + + num_examples = {"train": 4, "test": 6}.get(config["split"], 0) + + datasets_utils.create_image_folder( + root=split_dir, + name="image_2", + file_name_fn=lambda i: f"{i:06d}_10.png", + num_examples=num_examples, + size=(3, 100, 200), + ) + datasets_utils.create_image_folder( + root=split_dir, + name="image_3", + file_name_fn=lambda i: f"{i:06d}_10.png", + num_examples=num_examples, + size=(3, 100, 200), + ) + + if config["split"] == "train": + datasets_utils.create_image_folder( + root=split_dir, + name="disp_occ_0", + file_name_fn=lambda i: f"{i:06d}.png", + num_examples=num_examples, + # Kitti2015 uses a single channel image for disparities + size=(1, 100, 200), + ) + + datasets_utils.create_image_folder( + root=split_dir, + name="disp_occ_1", + file_name_fn=lambda i: f"{i:06d}.png", + num_examples=num_examples, + # Kitti2015 uses a single channel image for disparities + size=(1, 100, 200), + ) + + return num_examples + + def test_train_splits(self): + for split in ["train"]: + with self.create_dataset(split=split) as (dataset, _): + for left, right, disparity, mask in dataset: + assert mask is None + datasets_utils.shape_test_for_stereo(left, right, disparity) + + def test_test_split(self): + for split in ["test"]: + with self.create_dataset(split=split) as (dataset, _): + for left, right, disparity, mask in dataset: + assert mask is None + assert disparity is None + datasets_utils.shape_test_for_stereo(left, right) + + def test_bad_input(self): + with pytest.raises(ValueError, match="Unknown value 'bad' for argument split"): + with self.create_dataset(split="bad"): + pass + + +class CarlaStereoTestCase(datasets_utils.ImageDatasetTestCase): + DATASET_CLASS = datasets.CarlaStereo + FEATURE_TYPES = (PIL.Image.Image, PIL.Image.Image, (np.ndarray, None)) + + @staticmethod + def _create_scene_folders(num_examples: int, root_dir: Union[str, pathlib.Path]): + # make the root_dir if it does not exits + os.makedirs(root_dir, exist_ok=True) + + for i in range(num_examples): + scene_dir = pathlib.Path(root_dir) / f"scene_{i}" + os.makedirs(scene_dir, exist_ok=True) + # populate with left right images + datasets_utils.create_image_file(root=scene_dir, name="im0.png", size=(100, 100)) + datasets_utils.create_image_file(root=scene_dir, name="im1.png", size=(100, 100)) + datasets_utils.make_fake_pfm_file(100, 100, file_name=str(scene_dir / "disp0GT.pfm")) + datasets_utils.make_fake_pfm_file(100, 100, file_name=str(scene_dir / "disp1GT.pfm")) + + def inject_fake_data(self, tmpdir, config): + carla_dir = pathlib.Path(tmpdir) / "carla-highres" + os.makedirs(carla_dir, exist_ok=True) + + split_dir = pathlib.Path(carla_dir) / "trainingF" + os.makedirs(split_dir, exist_ok=True) + + num_examples = 6 + self._create_scene_folders(num_examples=num_examples, root_dir=split_dir) + + return num_examples + + def test_train_splits(self): + with self.create_dataset() as (dataset, _): + for left, right, disparity in dataset: + datasets_utils.shape_test_for_stereo(left, right, disparity) + + +class CREStereoTestCase(datasets_utils.ImageDatasetTestCase): + DATASET_CLASS = datasets.CREStereo + FEATURE_TYPES = (PIL.Image.Image, PIL.Image.Image, np.ndarray, type(None)) + + def inject_fake_data(self, tmpdir, config): + crestereo_dir = pathlib.Path(tmpdir) / "CREStereo" + os.makedirs(crestereo_dir, exist_ok=True) + + examples = {"tree": 2, "shapenet": 3, "reflective": 6, "hole": 5} + + for category_name in ["shapenet", "reflective", "tree", "hole"]: + split_dir = crestereo_dir / category_name + os.makedirs(split_dir, exist_ok=True) + num_examples = examples[category_name] + + for idx in range(num_examples): + datasets_utils.create_image_file(root=split_dir, name=f"{idx}_left.jpg", size=(100, 100)) + datasets_utils.create_image_file(root=split_dir, name=f"{idx}_right.jpg", size=(100, 100)) + # these are going to end up being gray scale images + datasets_utils.create_image_file(root=split_dir, name=f"{idx}_left.disp.png", size=(1, 100, 100)) + datasets_utils.create_image_file(root=split_dir, name=f"{idx}_right.disp.png", size=(1, 100, 100)) + + return sum(examples.values()) + + def test_splits(self): + with self.create_dataset() as (dataset, _): + for left, right, disparity, mask in dataset: + assert mask is None + datasets_utils.shape_test_for_stereo(left, right, disparity) + + +class FallingThingsStereoTestCase(datasets_utils.ImageDatasetTestCase): + DATASET_CLASS = datasets.FallingThingsStereo + ADDITIONAL_CONFIGS = combinations_grid(variant=("single", "mixed", "both")) + FEATURE_TYPES = (PIL.Image.Image, PIL.Image.Image, (np.ndarray, type(None))) + + @staticmethod + def _make_dummy_depth_map(root: str, name: str, size: Tuple[int, int]): + file = pathlib.Path(root) / name + image = np.ones((size[0], size[1]), dtype=np.uint8) + PIL.Image.fromarray(image).save(file) + + @staticmethod + def _make_scene_folder(root: str, scene_name: str, size: Tuple[int, int]) -> None: + root = pathlib.Path(root) / scene_name + os.makedirs(root, exist_ok=True) + # jpg images + datasets_utils.create_image_file(root, "image1.left.jpg", size=(3, size[1], size[0])) + datasets_utils.create_image_file(root, "image1.right.jpg", size=(3, size[1], size[0])) + # single channel depth maps + FallingThingsStereoTestCase._make_dummy_depth_map(root, "image1.left.depth.png", size=(size[0], size[1])) + FallingThingsStereoTestCase._make_dummy_depth_map(root, "image1.right.depth.png", size=(size[0], size[1])) + # camera settings json. Minimal example for _read_disparity function testing + settings_json = {"camera_settings": [{"intrinsic_settings": {"fx": 1}}]} + with open(root / "_camera_settings.json", "w") as f: + json.dump(settings_json, f) + + def inject_fake_data(self, tmpdir, config): + fallingthings_dir = pathlib.Path(tmpdir) / "FallingThings" + os.makedirs(fallingthings_dir, exist_ok=True) + + num_examples = {"single": 2, "mixed": 3, "both": 4}.get(config["variant"], 0) + + variants = { + "single": ["single"], + "mixed": ["mixed"], + "both": ["single", "mixed"], + }.get(config["variant"], []) + + variant_dir_prefixes = { + "single": 1, + "mixed": 0, + } + + for variant_name in variants: + variant_dir = pathlib.Path(fallingthings_dir) / variant_name + os.makedirs(variant_dir, exist_ok=True) + + for i in range(variant_dir_prefixes[variant_name]): + variant_dir = variant_dir / f"{i:02d}" + os.makedirs(variant_dir, exist_ok=True) + + for i in range(num_examples): + self._make_scene_folder( + root=variant_dir, + scene_name=f"scene_{i:06d}", + size=(100, 200), + ) + + if config["variant"] == "both": + num_examples *= 2 + return num_examples + + def test_splits(self): + for variant_name in ["single", "mixed"]: + with self.create_dataset(variant=variant_name) as (dataset, _): + for left, right, disparity in dataset: + datasets_utils.shape_test_for_stereo(left, right, disparity) + + def test_bad_input(self): + with pytest.raises(ValueError, match="Unknown value 'bad' for argument variant"): + with self.create_dataset(variant="bad"): + pass + + +class SceneFlowStereoTestCase(datasets_utils.ImageDatasetTestCase): + DATASET_CLASS = datasets.SceneFlowStereo + ADDITIONAL_CONFIGS = combinations_grid( + variant=("FlyingThings3D", "Driving", "Monkaa"), pass_name=("clean", "final", "both") + ) + FEATURE_TYPES = (PIL.Image.Image, PIL.Image.Image, (np.ndarray, type(None))) + + @staticmethod + def _create_pfm_folder( + root: str, name: str, file_name_fn: Callable[..., str], num_examples: int, size: Tuple[int, int] + ) -> None: + root = pathlib.Path(root) / name + os.makedirs(root, exist_ok=True) + + for i in range(num_examples): + datasets_utils.make_fake_pfm_file(size[0], size[1], root / file_name_fn(i)) + + def inject_fake_data(self, tmpdir, config): + scene_flow_dir = pathlib.Path(tmpdir) / "SceneFlow" + os.makedirs(scene_flow_dir, exist_ok=True) + + variant_dir = scene_flow_dir / config["variant"] + variant_dir_prefixes = { + "Monkaa": 0, + "Driving": 2, + "FlyingThings3D": 2, + } + os.makedirs(variant_dir, exist_ok=True) + + num_examples = {"FlyingThings3D": 4, "Driving": 6, "Monkaa": 5}.get(config["variant"], 0) + + passes = { + "clean": ["frames_cleanpass"], + "final": ["frames_finalpass"], + "both": ["frames_cleanpass", "frames_finalpass"], + }.get(config["pass_name"], []) + + for pass_dir_name in passes: + # create pass directories + pass_dir = variant_dir / pass_dir_name + disp_dir = variant_dir / "disparity" + os.makedirs(pass_dir, exist_ok=True) + os.makedirs(disp_dir, exist_ok=True) + + for i in range(variant_dir_prefixes.get(config["variant"], 0)): + pass_dir = pass_dir / str(i) + disp_dir = disp_dir / str(i) + os.makedirs(pass_dir, exist_ok=True) + os.makedirs(disp_dir, exist_ok=True) + + for direction in ["left", "right"]: + for scene_idx in range(num_examples): + os.makedirs(pass_dir / f"scene_{scene_idx:06d}", exist_ok=True) + datasets_utils.create_image_folder( + root=pass_dir / f"scene_{scene_idx:06d}", + name=direction, + file_name_fn=lambda i: f"{i:06d}.png", + num_examples=1, + size=(3, 200, 100), + ) + + os.makedirs(disp_dir / f"scene_{scene_idx:06d}", exist_ok=True) + self._create_pfm_folder( + root=disp_dir / f"scene_{scene_idx:06d}", + name=direction, + file_name_fn=lambda i: f"{i:06d}.pfm", + num_examples=1, + size=(100, 200), + ) + + if config["pass_name"] == "both": + num_examples *= 2 + return num_examples + + def test_splits(self): + for variant_name, pass_name in itertools.product(["FlyingThings3D", "Driving", "Monkaa"], ["clean", "final"]): + with self.create_dataset(variant=variant_name, pass_name=pass_name) as (dataset, _): + for left, right, disparity in dataset: + datasets_utils.shape_test_for_stereo(left, right, disparity) + + def test_bad_input(self): + with pytest.raises(ValueError, match="Unknown value 'bad' for argument variant"): + with self.create_dataset(variant="bad"): + pass + + +class InStereo2k(datasets_utils.ImageDatasetTestCase): + DATASET_CLASS = datasets.InStereo2k + FEATURE_TYPES = (PIL.Image.Image, PIL.Image.Image, (np.ndarray, type(None))) + ADDITIONAL_CONFIGS = combinations_grid(split=("train", "test")) + + @staticmethod + def _make_scene_folder(root: str, name: str, size: Tuple[int, int]): + root = pathlib.Path(root) / name + os.makedirs(root, exist_ok=True) + + datasets_utils.create_image_file(root=root, name="left.png", size=(3, size[0], size[1])) + datasets_utils.create_image_file(root=root, name="right.png", size=(3, size[0], size[1])) + datasets_utils.create_image_file(root=root, name="left_disp.png", size=(1, size[0], size[1])) + datasets_utils.create_image_file(root=root, name="right_disp.png", size=(1, size[0], size[1])) + + def inject_fake_data(self, tmpdir, config): + in_stereo_dir = pathlib.Path(tmpdir) / "InStereo2k" + os.makedirs(in_stereo_dir, exist_ok=True) + + split_dir = pathlib.Path(in_stereo_dir) / config["split"] + os.makedirs(split_dir, exist_ok=True) + + num_examples = {"train": 4, "test": 5}.get(config["split"], 0) + + for i in range(num_examples): + self._make_scene_folder(split_dir, f"scene_{i:06d}", (100, 200)) + + return num_examples + + def test_splits(self): + for split_name in ["train", "test"]: + with self.create_dataset(split=split_name) as (dataset, _): + for left, right, disparity in dataset: + datasets_utils.shape_test_for_stereo(left, right, disparity) + + def test_bad_input(self): + with pytest.raises( + ValueError, match="Unknown value 'bad' for argument split. Valid values are {'train', 'test'}." + ): + with self.create_dataset(split="bad"): + pass + + +class SintelStereoTestCase(datasets_utils.ImageDatasetTestCase): + DATASET_CLASS = datasets.SintelStereo + ADDITIONAL_CONFIGS = combinations_grid(pass_name=("final", "clean", "both")) + FEATURE_TYPES = (PIL.Image.Image, PIL.Image.Image, (np.ndarray, type(None)), (np.ndarray, type(None))) + + def inject_fake_data(self, tmpdir, config): + sintel_dir = pathlib.Path(tmpdir) / "Sintel" + os.makedirs(sintel_dir, exist_ok=True) + + split_dir = pathlib.Path(sintel_dir) / "training" + os.makedirs(split_dir, exist_ok=True) + + # a single setting, since there are no splits + num_examples = {"final": 2, "clean": 3} + pass_names = { + "final": ["final"], + "clean": ["clean"], + "both": ["final", "clean"], + }.get(config["pass_name"], []) + + for p in pass_names: + for view in [f"{p}_left", f"{p}_right"]: + root = split_dir / view + os.makedirs(root, exist_ok=True) + + datasets_utils.create_image_folder( + root=root, + name="scene1", + file_name_fn=lambda i: f"{i:06d}.png", + num_examples=num_examples[p], + size=(3, 100, 200), + ) + + datasets_utils.create_image_folder( + root=split_dir / "occlusions", + name="scene1", + file_name_fn=lambda i: f"{i:06d}.png", + num_examples=max(num_examples.values()), + size=(1, 100, 200), + ) + + datasets_utils.create_image_folder( + root=split_dir / "outofframe", + name="scene1", + file_name_fn=lambda i: f"{i:06d}.png", + num_examples=max(num_examples.values()), + size=(1, 100, 200), + ) + + datasets_utils.create_image_folder( + root=split_dir / "disparities", + name="scene1", + file_name_fn=lambda i: f"{i:06d}.png", + num_examples=max(num_examples.values()), + size=(3, 100, 200), + ) + + if config["pass_name"] == "both": + num_examples = sum(num_examples.values()) + else: + num_examples = num_examples.get(config["pass_name"], 0) + + return num_examples + + def test_splits(self): + for pass_name in ["final", "clean", "both"]: + with self.create_dataset(pass_name=pass_name) as (dataset, _): + for left, right, disparity, valid_mask in dataset: + datasets_utils.shape_test_for_stereo(left, right, disparity, valid_mask) + + def test_bad_input(self): + with pytest.raises(ValueError, match="Unknown value 'bad' for argument pass_name"): + with self.create_dataset(pass_name="bad"): + pass + + +class ETH3DStereoestCase(datasets_utils.ImageDatasetTestCase): + DATASET_CLASS = datasets.ETH3DStereo + ADDITIONAL_CONFIGS = combinations_grid(split=("train", "test")) + FEATURE_TYPES = (PIL.Image.Image, PIL.Image.Image, (np.ndarray, type(None)), (np.ndarray, type(None))) + + @staticmethod + def _create_scene_folder(num_examples: int, root_dir: str): + # make the root_dir if it does not exits + root_dir = pathlib.Path(root_dir) + os.makedirs(root_dir, exist_ok=True) + + for i in range(num_examples): + scene_dir = root_dir / f"scene_{i}" + os.makedirs(scene_dir, exist_ok=True) + # populate with left right images + datasets_utils.create_image_file(root=scene_dir, name="im0.png", size=(100, 100)) + datasets_utils.create_image_file(root=scene_dir, name="im1.png", size=(100, 100)) + + @staticmethod + def _create_annotation_folder(num_examples: int, root_dir: str): + # make the root_dir if it does not exits + root_dir = pathlib.Path(root_dir) + os.makedirs(root_dir, exist_ok=True) + + # create scene directories + for i in range(num_examples): + scene_dir = root_dir / f"scene_{i}" + os.makedirs(scene_dir, exist_ok=True) + # populate with a random png file for occlusion mask, and a pfm file for disparity + datasets_utils.create_image_file(root=scene_dir, name="mask0nocc.png", size=(1, 100, 100)) + + pfm_path = scene_dir / "disp0GT.pfm" + datasets_utils.make_fake_pfm_file(h=100, w=100, file_name=pfm_path) + + def inject_fake_data(self, tmpdir, config): + eth3d_dir = pathlib.Path(tmpdir) / "ETH3D" + + num_examples = 2 if config["split"] == "train" else 3 + + split_name = "two_view_training" if config["split"] == "train" else "two_view_test" + split_dir = eth3d_dir / split_name + self._create_scene_folder(num_examples, split_dir) + + if config["split"] == "train": + annot_dir = eth3d_dir / "two_view_training_gt" + self._create_annotation_folder(num_examples, annot_dir) + + return num_examples + + def test_training_splits(self): + with self.create_dataset(split="train") as (dataset, _): + for left, right, disparity, valid_mask in dataset: + datasets_utils.shape_test_for_stereo(left, right, disparity, valid_mask) + + def test_testing_splits(self): + with self.create_dataset(split="test") as (dataset, _): + assert all(d == (None, None) for d in dataset._disparities) + for left, right, disparity, valid_mask in dataset: + assert valid_mask is None + datasets_utils.shape_test_for_stereo(left, right, disparity) + + def test_bad_input(self): + with pytest.raises(ValueError, match="Unknown value 'bad' for argument split"): + with self.create_dataset(split="bad"): + pass + + +class Middlebury2014StereoTestCase(datasets_utils.ImageDatasetTestCase): + DATASET_CLASS = datasets.Middlebury2014Stereo + ADDITIONAL_CONFIGS = combinations_grid( + split=("train", "additional"), + calibration=("perfect", "imperfect", "both"), + use_ambient_views=(True, False), + ) + FEATURE_TYPES = (PIL.Image.Image, PIL.Image.Image, (np.ndarray, type(None)), (np.ndarray, type(None))) + + @staticmethod + def _make_scene_folder(root_dir: str, scene_name: str, split: str) -> None: + calibrations = [None] if split == "test" else ["-perfect", "-imperfect"] + root_dir = pathlib.Path(root_dir) + + for c in calibrations: + scene_dir = root_dir / f"{scene_name}{c}" + os.makedirs(scene_dir, exist_ok=True) + # make normal images first + datasets_utils.create_image_file(root=scene_dir, name="im0.png", size=(3, 100, 100)) + datasets_utils.create_image_file(root=scene_dir, name="im1.png", size=(3, 100, 100)) + datasets_utils.create_image_file(root=scene_dir, name="im1E.png", size=(3, 100, 100)) + datasets_utils.create_image_file(root=scene_dir, name="im1L.png", size=(3, 100, 100)) + # these are going to end up being gray scale images + datasets_utils.make_fake_pfm_file(h=100, w=100, file_name=scene_dir / "disp0.pfm") + datasets_utils.make_fake_pfm_file(h=100, w=100, file_name=scene_dir / "disp1.pfm") + + def inject_fake_data(self, tmpdir, config): + split_scene_map = { + "train": ["Adirondack", "Jadeplant", "Motorcycle", "Piano"], + "additional": ["Backpack", "Bicycle1", "Cable", "Classroom1"], + "test": ["Plants", "Classroom2E", "Classroom2", "Australia"], + } + + middlebury_dir = pathlib.Path(tmpdir, "Middlebury2014") + os.makedirs(middlebury_dir, exist_ok=True) + + split_dir = middlebury_dir / config["split"] + os.makedirs(split_dir, exist_ok=True) + + num_examples = {"train": 2, "additional": 3, "test": 4}.get(config["split"], 0) + for idx in range(num_examples): + scene_name = split_scene_map[config["split"]][idx] + self._make_scene_folder(root_dir=split_dir, scene_name=scene_name, split=config["split"]) + + if config["calibration"] == "both": + num_examples *= 2 + return num_examples + + def test_train_splits(self): + for split, calibration in itertools.product(["train", "additional"], ["perfect", "imperfect", "both"]): + with self.create_dataset(split=split, calibration=calibration) as (dataset, _): + for left, right, disparity, mask in dataset: + datasets_utils.shape_test_for_stereo(left, right, disparity, mask) + + def test_test_split(self): + for split in ["test"]: + with self.create_dataset(split=split, calibration=None) as (dataset, _): + for left, right, disparity, mask in dataset: + datasets_utils.shape_test_for_stereo(left, right) + + def test_augmented_view_usage(self): + with self.create_dataset(split="train", use_ambient_views=True) as (dataset, _): + for left, right, disparity, mask in dataset: + datasets_utils.shape_test_for_stereo(left, right, disparity, mask) + + def test_value_err_train(self): + # train set invalid + split = "train" + calibration = None + with pytest.raises( + ValueError, + match=f"Split '{split}' has calibration settings, however None was provided as an argument." + f"\nSetting calibration to 'perfect' for split '{split}'. Available calibration settings are: 'perfect', 'imperfect', 'both'.", + ): + with self.create_dataset(split=split, calibration=calibration): + pass + + def test_value_err_test(self): + # test set invalid + split = "test" + calibration = "perfect" + with pytest.raises( + ValueError, match="Split 'test' has only no calibration settings, please set `calibration=None`." + ): + with self.create_dataset(split=split, calibration=calibration): + pass + + def test_bad_input(self): + with pytest.raises(ValueError, match="Unknown value 'bad' for argument split"): + with self.create_dataset(split="bad"): + pass + + +class ImagenetteTestCase(datasets_utils.ImageDatasetTestCase): + DATASET_CLASS = datasets.Imagenette + ADDITIONAL_CONFIGS = combinations_grid(split=["train", "val"], size=["full", "320px", "160px"]) + + _WNIDS = [ + "n01440764", + "n02102040", + "n02979186", + "n03000684", + "n03028079", + "n03394916", + "n03417042", + "n03425413", + "n03445777", + "n03888257", + ] + + def inject_fake_data(self, tmpdir, config): + archive_root = "imagenette2" + if config["size"] != "full": + archive_root += f"-{config['size'].replace('px', '')}" + image_root = pathlib.Path(tmpdir) / archive_root / config["split"] + + num_images_per_class = 3 + for wnid in self._WNIDS: + datasets_utils.create_image_folder( + root=image_root, + name=wnid, + file_name_fn=lambda idx: f"{wnid}_{idx}.JPEG", + num_examples=num_images_per_class, + ) + + return num_images_per_class * len(self._WNIDS) + + +class TestDatasetWrapper: + def test_unknown_type(self): + unknown_object = object() + with pytest.raises( + TypeError, match=re.escape("is meant for subclasses of `torchvision.datasets.VisionDataset`") + ): + datasets.wrap_dataset_for_transforms_v2(unknown_object) + + def test_unknown_dataset(self): + class MyVisionDataset(datasets.VisionDataset): + pass + + dataset = MyVisionDataset("root") + + with pytest.raises(TypeError, match="No wrapper exist"): + datasets.wrap_dataset_for_transforms_v2(dataset) + + def test_missing_wrapper(self): + dataset = datasets.FakeData() + + with pytest.raises(TypeError, match="please open an issue"): + datasets.wrap_dataset_for_transforms_v2(dataset) + + def test_subclass(self, mocker): + from torchvision import tv_tensors + + sentinel = object() + mocker.patch.dict( + tv_tensors._dataset_wrapper.WRAPPER_FACTORIES, + clear=False, + values={datasets.FakeData: lambda dataset, target_keys: lambda idx, sample: sentinel}, + ) + + class MyFakeData(datasets.FakeData): + pass + + dataset = MyFakeData() + wrapped_dataset = datasets.wrap_dataset_for_transforms_v2(dataset) + + assert wrapped_dataset[0] is sentinel + + if __name__ == "__main__": unittest.main() diff --git a/test/test_datasets_download.py b/test/test_datasets_download.py index 0066b76ccbe4364e32651ccaadbb5646f2003295..856a02b9d44efda6838492f1616915aca13b4323 100644 --- a/test/test_datasets_download.py +++ b/test/test_datasets_download.py @@ -1,28 +1,20 @@ import contextlib import itertools +import shutil +import tempfile import time +import traceback import unittest.mock +import warnings from datetime import datetime -from distutils import dir_util from os import path from urllib.error import HTTPError, URLError from urllib.parse import urlparse -from urllib.request import urlopen, Request -import tempfile -import warnings +from urllib.request import Request, urlopen import pytest - from torchvision import datasets -from torchvision.datasets.utils import ( - download_url, - check_integrity, - download_file_from_google_drive, - _get_redirect_url, - USER_AGENT, -) - -from common_utils import get_tmp_dir +from torchvision.datasets.utils import _get_redirect_url, USER_AGENT def limit_requests_per_time(min_secs_between_requests=2.0): @@ -86,63 +78,65 @@ urlopen = resolve_redirects()(urlopen) @contextlib.contextmanager def log_download_attempts( - urls_and_md5s=None, - file="utils", - patch=True, - mock_auxiliaries=None, + urls, + *, + dataset_module, ): - def add_mock(stack, name, file, **kwargs): + def maybe_add_mock(*, module, name, stack, lst=None): + patcher = unittest.mock.patch(f"torchvision.datasets.{module}.{name}") + try: - return stack.enter_context(unittest.mock.patch(f"torchvision.datasets.{file}.{name}", **kwargs)) - except AttributeError as error: - if file != "utils": - return add_mock(stack, name, "utils", **kwargs) - else: - raise pytest.UsageError from error - - if urls_and_md5s is None: - urls_and_md5s = set() - if mock_auxiliaries is None: - mock_auxiliaries = patch + mock = stack.enter_context(patcher) + except AttributeError: + return - with contextlib.ExitStack() as stack: - url_mock = add_mock(stack, "download_url", file, wraps=None if patch else download_url) - google_drive_mock = add_mock( - stack, "download_file_from_google_drive", file, wraps=None if patch else download_file_from_google_drive - ) + if lst is not None: + lst.append(mock) - if mock_auxiliaries: - add_mock(stack, "extract_archive", file) + with contextlib.ExitStack() as stack: + download_url_mocks = [] + download_file_from_google_drive_mocks = [] + for module in [dataset_module, "utils"]: + maybe_add_mock(module=module, name="download_url", stack=stack, lst=download_url_mocks) + maybe_add_mock( + module=module, + name="download_file_from_google_drive", + stack=stack, + lst=download_file_from_google_drive_mocks, + ) + maybe_add_mock(module=module, name="extract_archive", stack=stack) try: - yield urls_and_md5s + yield finally: - for args, kwargs in url_mock.call_args_list: - url = args[0] - md5 = args[-1] if len(args) == 4 else kwargs.get("md5") - urls_and_md5s.add((url, md5)) + for download_url_mock in download_url_mocks: + for args, kwargs in download_url_mock.call_args_list: + urls.append(args[0] if args else kwargs["url"]) - for args, kwargs in google_drive_mock.call_args_list: - id = args[0] - url = f"https://drive.google.com/file/d/{id}" - md5 = args[3] if len(args) == 4 else kwargs.get("md5") - urls_and_md5s.add((url, md5)) + for download_file_from_google_drive_mock in download_file_from_google_drive_mocks: + for args, kwargs in download_file_from_google_drive_mock.call_args_list: + file_id = args[0] if args else kwargs["file_id"] + urls.append(f"https://drive.google.com/file/d/{file_id}") def retry(fn, times=1, wait=5.0): - msgs = [] + tbs = [] for _ in range(times + 1): try: return fn() except AssertionError as error: - msgs.append(str(error)) + tbs.append("".join(traceback.format_exception(type(error), error, error.__traceback__))) time.sleep(wait) else: raise AssertionError( "\n".join( ( - f"Assertion failed {times + 1} times with {wait:.1f} seconds intermediate wait time.\n", - *(f"{idx}: {error}" for idx, error in enumerate(msgs, 1)), + "\n", + *[f"{'_' * 40} {idx:2d} {'_' * 40}\n\n{tb}" for idx, tb in enumerate(tbs, 1)], + ( + f"Assertion failed {times + 1} times with {wait:.1f} seconds intermediate wait time. " + f"You can find the the full tracebacks above." + ), ) ) ) @@ -152,10 +146,12 @@ def retry(fn, times=1, wait=5.0): def assert_server_response_ok(): try: yield - except URLError as error: - raise AssertionError("The request timed out.") from error except HTTPError as error: raise AssertionError(f"The server returned {error.code}: {error.reason}.") from error + except URLError as error: + raise AssertionError( + "Connection not possible due to SSL." if "SSL" in str(error) else "The request timed out." + ) from error except RecursionError as error: raise AssertionError(str(error)) from error @@ -166,46 +162,14 @@ def assert_url_is_accessible(url, timeout=5.0): urlopen(request, timeout=timeout) -def assert_file_downloads_correctly(url, md5, timeout=5.0): - with get_tmp_dir() as root: - file = path.join(root, path.basename(url)) - with assert_server_response_ok(): - with open(file, "wb") as fh: - request = Request(url, headers={"User-Agent": USER_AGENT}) - response = urlopen(request, timeout=timeout) - fh.write(response.read()) - - assert check_integrity(file, md5=md5), "The MD5 checksums mismatch" - - -class DownloadConfig: - def __init__(self, url, md5=None, id=None): - self.url = url - self.md5 = md5 - self.id = id or url - - def __repr__(self): - return self.id - - -def make_download_configs(urls_and_md5s, name=None): - return [ - DownloadConfig(url, md5=md5, id=f"{name}, {url}" if name is not None else None) for url, md5 in urls_and_md5s - ] - - -def collect_download_configs(dataset_loader, name=None, **kwargs): - urls_and_md5s = set() - try: - with log_download_attempts(urls_and_md5s=urls_and_md5s, **kwargs): - dataset = dataset_loader() - except Exception: - dataset = None - - if name is None and dataset is not None: - name = type(dataset).__name__ +def collect_urls(dataset_cls, *args, **kwargs): + urls = [] + with contextlib.suppress(Exception), log_download_attempts( + urls, dataset_module=dataset_cls.__module__.split(".")[-1] + ): + dataset_cls(*args, **kwargs) - return make_download_configs(urls_and_md5s, name) + return [(url, f"{dataset_cls.__name__}, {url}") for url in urls] # This is a workaround since fixtures, such as the built-in tmp_dir, can only be used within a test but not within a @@ -216,16 +180,18 @@ ROOT = tempfile.mkdtemp() @pytest.fixture(scope="module", autouse=True) def root(): yield ROOT - dir_util.remove_tree(ROOT) + shutil.rmtree(ROOT) def places365(): - return itertools.chain( - *[ - collect_download_configs( - lambda: datasets.Places365(ROOT, split=split, small=small, download=True), - name=f"Places365, {split}, {'small' if small else 'large'}", - file="places365", + return itertools.chain.from_iterable( + [ + collect_urls( + datasets.Places365, + ROOT, + split=split, + small=small, + download=True, ) for split, small in itertools.product(("train-standard", "train-challenge", "val"), (False, True)) ] @@ -233,85 +199,69 @@ def places365(): def caltech101(): - return collect_download_configs(lambda: datasets.Caltech101(ROOT, download=True), name="Caltech101") + return collect_urls(datasets.Caltech101, ROOT, download=True) def caltech256(): - return collect_download_configs(lambda: datasets.Caltech256(ROOT, download=True), name="Caltech256") + return collect_urls(datasets.Caltech256, ROOT, download=True) def cifar10(): - return collect_download_configs(lambda: datasets.CIFAR10(ROOT, download=True), name="CIFAR10") + return collect_urls(datasets.CIFAR10, ROOT, download=True) def cifar100(): - return collect_download_configs(lambda: datasets.CIFAR100(ROOT, download=True), name="CIFAR100") + return collect_urls(datasets.CIFAR100, ROOT, download=True) def voc(): - return itertools.chain( - *[ - collect_download_configs( - lambda: datasets.VOCSegmentation(ROOT, year=year, download=True), - name=f"VOC, {year}", - file="voc", - ) - for year in ("2007", "2007-test", "2008", "2009", "2010", "2011", "2012") + # TODO: Also test the "2007-test" key + return itertools.chain.from_iterable( + [ + collect_urls(datasets.VOCSegmentation, ROOT, year=year, download=True) + for year in ("2007", "2008", "2009", "2010", "2011", "2012") ] ) def mnist(): with unittest.mock.patch.object(datasets.MNIST, "mirrors", datasets.MNIST.mirrors[-1:]): - return collect_download_configs(lambda: datasets.MNIST(ROOT, download=True), name="MNIST") + return collect_urls(datasets.MNIST, ROOT, download=True) def fashion_mnist(): - return collect_download_configs(lambda: datasets.FashionMNIST(ROOT, download=True), name="FashionMNIST") + return collect_urls(datasets.FashionMNIST, ROOT, download=True) def kmnist(): - return collect_download_configs(lambda: datasets.KMNIST(ROOT, download=True), name="KMNIST") + return collect_urls(datasets.KMNIST, ROOT, download=True) def emnist(): # the 'split' argument can be any valid one, since everything is downloaded anyway - return collect_download_configs(lambda: datasets.EMNIST(ROOT, split="byclass", download=True), name="EMNIST") + return collect_urls(datasets.EMNIST, ROOT, split="byclass", download=True) def qmnist(): - return itertools.chain( - *[ - collect_download_configs( - lambda: datasets.QMNIST(ROOT, what=what, download=True), - name=f"QMNIST, {what}", - file="mnist", - ) - for what in ("train", "test", "nist") - ] + return itertools.chain.from_iterable( + [collect_urls(datasets.QMNIST, ROOT, what=what, download=True) for what in ("train", "test", "nist")] ) +def moving_mnist(): + return collect_urls(datasets.MovingMNIST, ROOT, download=True) + + def omniglot(): - return itertools.chain( - *[ - collect_download_configs( - lambda: datasets.Omniglot(ROOT, background=background, download=True), - name=f"Omniglot, {'background' if background else 'evaluation'}", - ) - for background in (True, False) - ] + return itertools.chain.from_iterable( + [collect_urls(datasets.Omniglot, ROOT, background=background, download=True) for background in (True, False)] ) def phototour(): - return itertools.chain( - *[ - collect_download_configs( - lambda: datasets.PhotoTour(ROOT, name=name, download=True), - name=f"PhotoTour, {name}", - file="phototour", - ) + return itertools.chain.from_iterable( + [ + collect_urls(datasets.PhotoTour, ROOT, name=name, download=True) # The names postfixed with '_harris' point to the domain 'matthewalunbrown.com'. For some reason all # requests timeout from within CI. They are disabled until this is resolved. for name in ("notredame", "yosemite", "liberty") # "notredame_harris", "yosemite_harris", "liberty_harris" @@ -320,134 +270,119 @@ def phototour(): def sbdataset(): - return collect_download_configs( - lambda: datasets.SBDataset(ROOT, download=True), - name="SBDataset", - file="voc", - ) + return collect_urls(datasets.SBDataset, ROOT, download=True) def sbu(): - return collect_download_configs( - lambda: datasets.SBU(ROOT, download=True), - name="SBU", - file="sbu", - ) + return collect_urls(datasets.SBU, ROOT, download=True) def semeion(): - return collect_download_configs( - lambda: datasets.SEMEION(ROOT, download=True), - name="SEMEION", - file="semeion", - ) + return collect_urls(datasets.SEMEION, ROOT, download=True) def stl10(): - return collect_download_configs( - lambda: datasets.STL10(ROOT, download=True), - name="STL10", - ) + return collect_urls(datasets.STL10, ROOT, download=True) def svhn(): - return itertools.chain( - *[ - collect_download_configs( - lambda: datasets.SVHN(ROOT, split=split, download=True), - name=f"SVHN, {split}", - file="svhn", - ) - for split in ("train", "test", "extra") - ] + return itertools.chain.from_iterable( + [collect_urls(datasets.SVHN, ROOT, split=split, download=True) for split in ("train", "test", "extra")] ) def usps(): - return itertools.chain( - *[ - collect_download_configs( - lambda: datasets.USPS(ROOT, train=train, download=True), - name=f"USPS, {'train' if train else 'test'}", - file="usps", - ) - for train in (True, False) - ] + return itertools.chain.from_iterable( + [collect_urls(datasets.USPS, ROOT, train=train, download=True) for train in (True, False)] ) def celeba(): - return collect_download_configs( - lambda: datasets.CelebA(ROOT, download=True), - name="CelebA", - file="celeba", - ) + return collect_urls(datasets.CelebA, ROOT, download=True) def widerface(): - return collect_download_configs( - lambda: datasets.WIDERFace(ROOT, download=True), - name="WIDERFace", - file="widerface", + return collect_urls(datasets.WIDERFace, ROOT, download=True) + + +def kinetics(): + return itertools.chain.from_iterable( + [ + collect_urls( + datasets.Kinetics, + path.join(ROOT, f"Kinetics{num_classes}"), + frames_per_clip=1, + num_classes=num_classes, + split=split, + download=True, + ) + for num_classes, split in itertools.product(("400", "600", "700"), ("train", "val")) + ] ) def kitti(): - return itertools.chain( - *[ - collect_download_configs( - lambda train=train: datasets.Kitti(ROOT, train=train, download=True), - name=f"Kitti, {'train' if train else 'test'}", - file="kitti", - ) - for train in (True, False) - ] + return itertools.chain.from_iterable( + [collect_urls(datasets.Kitti, ROOT, train=train, download=True) for train in (True, False)] ) -def make_parametrize_kwargs(download_configs): - argvalues = [] - ids = [] - for config in download_configs: - argvalues.append((config.url, config.md5)) - ids.append(config.id) - - return dict(argnames=("url", "md5"), argvalues=argvalues, ids=ids) - - -@pytest.mark.parametrize( - **make_parametrize_kwargs( - itertools.chain( - places365(), - caltech101(), - caltech256(), - cifar10(), - cifar100(), - # The VOC download server is unstable. See https://github.com/pytorch/vision/issues/2953 for details. - # voc(), - mnist(), - fashion_mnist(), - kmnist(), - emnist(), - qmnist(), - omniglot(), - phototour(), - sbdataset(), - sbu(), - semeion(), - stl10(), - svhn(), - usps(), - celeba(), - widerface(), - kitti(), - ) +def url_parametrization(*dataset_urls_and_ids_fns): + return pytest.mark.parametrize( + "url", + [ + pytest.param(url, id=id) + for dataset_urls_and_ids_fn in dataset_urls_and_ids_fns + for url, id in sorted(set(dataset_urls_and_ids_fn())) + ], ) + + +@url_parametrization( + caltech101, + caltech256, + cifar10, + cifar100, + # The VOC download server is unstable. See https://github.com/pytorch/vision/issues/2953 for details. + # voc, + mnist, + fashion_mnist, + kmnist, + emnist, + qmnist, + omniglot, + phototour, + sbdataset, + semeion, + stl10, + svhn, + usps, + celeba, + widerface, + kinetics, + kitti, + places365, + sbu, ) -def test_url_is_accessible(url, md5): +def test_url_is_accessible(url): + """ + If you see this test failing, find the offending dataset in the parametrization and move it to + ``test_url_is_not_accessible`` and link an issue detailing the problem. + """ retry(lambda: assert_url_is_accessible(url)) -@pytest.mark.parametrize(**make_parametrize_kwargs(itertools.chain())) -def test_file_downloads_correctly(url, md5): - retry(lambda: assert_file_downloads_correctly(url, md5)) +# TODO: if e.g. caltech101 starts failing, remove the pytest.mark.parametrize below and use +# @url_parametrization(caltech101) +@pytest.mark.parametrize("url", ("http://url_that_doesnt_exist.com",)) # here until we actually have a failing dataset +@pytest.mark.xfail +def test_url_is_not_accessible(url): + """ + As the name implies, this test is the 'inverse' of ``test_url_is_accessible``. Since the download servers are + beyond our control, some files might not be accessible for longer stretches of time. Still, we want to know if they + come back up, or if we need to remove the download functionality of the dataset for good. + + If you see this test failing, find the offending dataset in the parametrization and move it to + ``test_url_is_accessible``. + """ + assert_url_is_accessible(url) diff --git a/test/test_datasets_samplers.py b/test/test_datasets_samplers.py index 10d8704dbb1ae9cd302f7ef68318f837d6b02a0c..9e3826b2c13205aad14c70d329cd3c9eb034e8ed 100644 --- a/test/test_datasets_samplers.py +++ b/test/test_datasets_samplers.py @@ -1,118 +1,86 @@ -import contextlib -import sys -import os +import pytest import torch -import unittest - +from common_utils import assert_equal, get_list_of_videos from torchvision import io -from torchvision.datasets.samplers import ( - DistributedSampler, - RandomClipSampler, - UniformClipSampler, -) -from torchvision.datasets.video_utils import VideoClips, unfold -from torchvision import get_video_backend - -from common_utils import get_tmp_dir -from _assert_utils import assert_equal - - -@contextlib.contextmanager -def get_list_of_videos(num_videos=5, sizes=None, fps=None): - with get_tmp_dir() as tmp_dir: - names = [] - for i in range(num_videos): - if sizes is None: - size = 5 * (i + 1) - else: - size = sizes[i] - if fps is None: - f = 5 - else: - f = fps[i] - data = torch.randint(0, 256, (size, 300, 400, 3), dtype=torch.uint8) - name = os.path.join(tmp_dir, "{}.mp4".format(i)) - names.append(name) - io.write_video(name, data, fps=f) - - yield names +from torchvision.datasets.samplers import DistributedSampler, RandomClipSampler, UniformClipSampler +from torchvision.datasets.video_utils import VideoClips -@unittest.skipIf(not io.video._av_available(), "this test requires av") -class Tester(unittest.TestCase): - def test_random_clip_sampler(self): - with get_list_of_videos(num_videos=3, sizes=[25, 25, 25]) as video_list: - video_clips = VideoClips(video_list, 5, 5) - sampler = RandomClipSampler(video_clips, 3) - self.assertEqual(len(sampler), 3 * 3) - indices = torch.tensor(list(iter(sampler))) - videos = torch.div(indices, 5, rounding_mode='floor') - v_idxs, count = torch.unique(videos, return_counts=True) - assert_equal(v_idxs, torch.tensor([0, 1, 2])) - assert_equal(count, torch.tensor([3, 3, 3])) +@pytest.mark.skipif(not io.video._av_available(), reason="this test requires av") +class TestDatasetsSamplers: + def test_random_clip_sampler(self, tmpdir): + video_list = get_list_of_videos(tmpdir, num_videos=3, sizes=[25, 25, 25]) + video_clips = VideoClips(video_list, 5, 5) + sampler = RandomClipSampler(video_clips, 3) + assert len(sampler) == 3 * 3 + indices = torch.tensor(list(iter(sampler))) + videos = torch.div(indices, 5, rounding_mode="floor") + v_idxs, count = torch.unique(videos, return_counts=True) + assert_equal(v_idxs, torch.tensor([0, 1, 2])) + assert_equal(count, torch.tensor([3, 3, 3])) - def test_random_clip_sampler_unequal(self): - with get_list_of_videos(num_videos=3, sizes=[10, 25, 25]) as video_list: - video_clips = VideoClips(video_list, 5, 5) - sampler = RandomClipSampler(video_clips, 3) - self.assertEqual(len(sampler), 2 + 3 + 3) - indices = list(iter(sampler)) - self.assertIn(0, indices) - self.assertIn(1, indices) - # remove elements of the first video, to simplify testing - indices.remove(0) - indices.remove(1) - indices = torch.tensor(indices) - 2 - videos = torch.div(indices, 5, rounding_mode='floor') - v_idxs, count = torch.unique(videos, return_counts=True) - assert_equal(v_idxs, torch.tensor([0, 1])) - assert_equal(count, torch.tensor([3, 3])) + def test_random_clip_sampler_unequal(self, tmpdir): + video_list = get_list_of_videos(tmpdir, num_videos=3, sizes=[10, 25, 25]) + video_clips = VideoClips(video_list, 5, 5) + sampler = RandomClipSampler(video_clips, 3) + assert len(sampler) == 2 + 3 + 3 + indices = list(iter(sampler)) + assert 0 in indices + assert 1 in indices + # remove elements of the first video, to simplify testing + indices.remove(0) + indices.remove(1) + indices = torch.tensor(indices) - 2 + videos = torch.div(indices, 5, rounding_mode="floor") + v_idxs, count = torch.unique(videos, return_counts=True) + assert_equal(v_idxs, torch.tensor([0, 1])) + assert_equal(count, torch.tensor([3, 3])) - def test_uniform_clip_sampler(self): - with get_list_of_videos(num_videos=3, sizes=[25, 25, 25]) as video_list: - video_clips = VideoClips(video_list, 5, 5) - sampler = UniformClipSampler(video_clips, 3) - self.assertEqual(len(sampler), 3 * 3) - indices = torch.tensor(list(iter(sampler))) - videos = torch.div(indices, 5, rounding_mode='floor') - v_idxs, count = torch.unique(videos, return_counts=True) - assert_equal(v_idxs, torch.tensor([0, 1, 2])) - assert_equal(count, torch.tensor([3, 3, 3])) - assert_equal(indices, torch.tensor([0, 2, 4, 5, 7, 9, 10, 12, 14])) + def test_uniform_clip_sampler(self, tmpdir): + video_list = get_list_of_videos(tmpdir, num_videos=3, sizes=[25, 25, 25]) + video_clips = VideoClips(video_list, 5, 5) + sampler = UniformClipSampler(video_clips, 3) + assert len(sampler) == 3 * 3 + indices = torch.tensor(list(iter(sampler))) + videos = torch.div(indices, 5, rounding_mode="floor") + v_idxs, count = torch.unique(videos, return_counts=True) + assert_equal(v_idxs, torch.tensor([0, 1, 2])) + assert_equal(count, torch.tensor([3, 3, 3])) + assert_equal(indices, torch.tensor([0, 2, 4, 5, 7, 9, 10, 12, 14])) - def test_uniform_clip_sampler_insufficient_clips(self): - with get_list_of_videos(num_videos=3, sizes=[10, 25, 25]) as video_list: - video_clips = VideoClips(video_list, 5, 5) - sampler = UniformClipSampler(video_clips, 3) - self.assertEqual(len(sampler), 3 * 3) - indices = torch.tensor(list(iter(sampler))) - assert_equal(indices, torch.tensor([0, 0, 1, 2, 4, 6, 7, 9, 11])) + def test_uniform_clip_sampler_insufficient_clips(self, tmpdir): + video_list = get_list_of_videos(tmpdir, num_videos=3, sizes=[10, 25, 25]) + video_clips = VideoClips(video_list, 5, 5) + sampler = UniformClipSampler(video_clips, 3) + assert len(sampler) == 3 * 3 + indices = torch.tensor(list(iter(sampler))) + assert_equal(indices, torch.tensor([0, 0, 1, 2, 4, 6, 7, 9, 11])) - def test_distributed_sampler_and_uniform_clip_sampler(self): - with get_list_of_videos(num_videos=3, sizes=[25, 25, 25]) as video_list: - video_clips = VideoClips(video_list, 5, 5) - clip_sampler = UniformClipSampler(video_clips, 3) + def test_distributed_sampler_and_uniform_clip_sampler(self, tmpdir): + video_list = get_list_of_videos(tmpdir, num_videos=3, sizes=[25, 25, 25]) + video_clips = VideoClips(video_list, 5, 5) + clip_sampler = UniformClipSampler(video_clips, 3) - distributed_sampler_rank0 = DistributedSampler( - clip_sampler, - num_replicas=2, - rank=0, - group_size=3, - ) - indices = torch.tensor(list(iter(distributed_sampler_rank0))) - self.assertEqual(len(distributed_sampler_rank0), 6) - assert_equal(indices, torch.tensor([0, 2, 4, 10, 12, 14])) + distributed_sampler_rank0 = DistributedSampler( + clip_sampler, + num_replicas=2, + rank=0, + group_size=3, + ) + indices = torch.tensor(list(iter(distributed_sampler_rank0))) + assert len(distributed_sampler_rank0) == 6 + assert_equal(indices, torch.tensor([0, 2, 4, 10, 12, 14])) - distributed_sampler_rank1 = DistributedSampler( - clip_sampler, - num_replicas=2, - rank=1, - group_size=3, - ) - indices = torch.tensor(list(iter(distributed_sampler_rank1))) - self.assertEqual(len(distributed_sampler_rank1), 6) - assert_equal(indices, torch.tensor([5, 7, 9, 0, 2, 4])) + distributed_sampler_rank1 = DistributedSampler( + clip_sampler, + num_replicas=2, + rank=1, + group_size=3, + ) + indices = torch.tensor(list(iter(distributed_sampler_rank1))) + assert len(distributed_sampler_rank1) == 6 + assert_equal(indices, torch.tensor([5, 7, 9, 0, 2, 4])) -if __name__ == '__main__': - unittest.main() +if __name__ == "__main__": + pytest.main([__file__]) diff --git a/test/test_datasets_utils.py b/test/test_datasets_utils.py index 949026d31cb46013e901204a32f17c2f3da0928e..461688405d7b162195aef9a9a6a5d3c293ac57a1 100644 --- a/test/test_datasets_utils.py +++ b/test/test_datasets_utils.py @@ -1,45 +1,86 @@ +import contextlib +import gzip import os -import torchvision.datasets.utils as utils -import unittest -import unittest.mock -import zipfile +import pathlib +import re import tarfile -import gzip -import warnings +import zipfile + +import pytest +import torch +import torchvision.datasets.utils as utils +from common_utils import assert_equal from torch._utils_internal import get_file_path_2 -from urllib.error import URLError -import itertools -import lzma +from torchvision.datasets.folder import make_dataset +from torchvision.datasets.utils import _COMPRESSED_FILE_OPENERS -from common_utils import get_tmp_dir, call_args_to_kwargs_only +TEST_FILE = get_file_path_2( + os.path.dirname(os.path.abspath(__file__)), "assets", "encode_jpeg", "grace_hopper_517x606.jpg" +) -TEST_FILE = get_file_path_2( - os.path.dirname(os.path.abspath(__file__)), 'assets', 'encode_jpeg', 'grace_hopper_517x606.jpg') +def patch_url_redirection(mocker, redirect_url): + class Response: + def __init__(self, url): + self.url = url + + @contextlib.contextmanager + def patched_opener(*args, **kwargs): + yield Response(redirect_url) + + return mocker.patch("torchvision.datasets.utils.urllib.request.urlopen", side_effect=patched_opener) + + +class TestDatasetsUtils: + def test_get_redirect_url(self, mocker): + url = "https://url.org" + expected_redirect_url = "https://redirect.url.org" + + mock = patch_url_redirection(mocker, expected_redirect_url) + actual = utils._get_redirect_url(url) + assert actual == expected_redirect_url -class Tester(unittest.TestCase): + assert mock.call_count == 2 + call_args_1, call_args_2 = mock.call_args_list + assert call_args_1[0][0].full_url == url + assert call_args_2[0][0].full_url == expected_redirect_url - def test_check_md5(self): + def test_get_redirect_url_max_hops_exceeded(self, mocker): + url = "https://url.org" + redirect_url = "https://redirect.url.org" + + mock = patch_url_redirection(mocker, redirect_url) + + with pytest.raises(RecursionError): + utils._get_redirect_url(url, max_hops=0) + + assert mock.call_count == 1 + assert mock.call_args[0][0].full_url == url + + @pytest.mark.parametrize("use_pathlib", (True, False)) + def test_check_md5(self, use_pathlib): fpath = TEST_FILE - correct_md5 = '9c0bb82894bb3af7f7675ef2b3b6dcdc' - false_md5 = '' - self.assertTrue(utils.check_md5(fpath, correct_md5)) - self.assertFalse(utils.check_md5(fpath, false_md5)) + if use_pathlib: + fpath = pathlib.Path(fpath) + correct_md5 = "9c0bb82894bb3af7f7675ef2b3b6dcdc" + false_md5 = "" + assert utils.check_md5(fpath, correct_md5) + assert not utils.check_md5(fpath, false_md5) def test_check_integrity(self): existing_fpath = TEST_FILE - nonexisting_fpath = '' - correct_md5 = '9c0bb82894bb3af7f7675ef2b3b6dcdc' - false_md5 = '' - self.assertTrue(utils.check_integrity(existing_fpath, correct_md5)) - self.assertFalse(utils.check_integrity(existing_fpath, false_md5)) - self.assertTrue(utils.check_integrity(existing_fpath)) - self.assertFalse(utils.check_integrity(nonexisting_fpath)) + nonexisting_fpath = "" + correct_md5 = "9c0bb82894bb3af7f7675ef2b3b6dcdc" + false_md5 = "" + assert utils.check_integrity(existing_fpath, correct_md5) + assert not utils.check_integrity(existing_fpath, false_md5) + assert utils.check_integrity(existing_fpath) + assert not utils.check_integrity(nonexisting_fpath) def test_get_google_drive_file_id(self): - url = "https://drive.google.com/file/d/1hbzc_P1FuxMkcabkgn9ZKinBwW683j45/view" - expected = "1hbzc_P1FuxMkcabkgn9ZKinBwW683j45" + url = "https://drive.google.com/file/d/1GO-BHUYRuvzr1Gtp2_fqXRsr9TIeYbhV/view" + expected = "1GO-BHUYRuvzr1Gtp2_fqXRsr9TIeYbhV" actual = utils._get_google_drive_file_id(url) assert actual == expected @@ -49,84 +90,64 @@ class Tester(unittest.TestCase): assert utils._get_google_drive_file_id(url) is None - def test_detect_file_type(self): - for file, expected in [ + @pytest.mark.parametrize( + "file, expected", + [ + ("foo.tar.bz2", (".tar.bz2", ".tar", ".bz2")), ("foo.tar.xz", (".tar.xz", ".tar", ".xz")), ("foo.tar", (".tar", ".tar", None)), ("foo.tar.gz", (".tar.gz", ".tar", ".gz")), + ("foo.tbz", (".tbz", ".tar", ".bz2")), + ("foo.tbz2", (".tbz2", ".tar", ".bz2")), ("foo.tgz", (".tgz", ".tar", ".gz")), + ("foo.bz2", (".bz2", None, ".bz2")), ("foo.gz", (".gz", None, ".gz")), ("foo.zip", (".zip", ".zip", None)), ("foo.xz", (".xz", None, ".xz")), - ]: - with self.subTest(file=file): - self.assertSequenceEqual(utils._detect_file_type(file), expected) - - def test_detect_file_type_no_ext(self): - with self.assertRaises(RuntimeError): - utils._detect_file_type("foo") - - def test_detect_file_type_to_many_exts(self): - with self.assertRaises(RuntimeError): - utils._detect_file_type("foo.bar.tar.gz") - - def test_detect_file_type_unknown_archive_type(self): - with self.assertRaises(RuntimeError): - utils._detect_file_type("foo.bar.gz") - - def test_detect_file_type_unknown_compression(self): - with self.assertRaises(RuntimeError): - utils._detect_file_type("foo.tar.baz") - - def test_detect_file_type_unknown_partial_ext(self): - with self.assertRaises(RuntimeError): - utils._detect_file_type("foo.bar") - - def test_decompress_gzip(self): - def create_compressed(root, content="this is the content"): - file = os.path.join(root, "file") - compressed = f"{file}.gz" - - with gzip.open(compressed, "wb") as fh: - fh.write(content.encode()) - - return compressed, file, content - - with get_tmp_dir() as temp_dir: - compressed, file, content = create_compressed(temp_dir) - - utils._decompress(compressed) - - self.assertTrue(os.path.exists(file)) - - with open(file, "r") as fh: - self.assertEqual(fh.read(), content) - - def test_decompress_lzma(self): + ("foo.bar.tar.gz", (".tar.gz", ".tar", ".gz")), + ("foo.bar.gz", (".gz", None, ".gz")), + ("foo.bar.zip", (".zip", ".zip", None)), + ], + ) + def test_detect_file_type(self, file, expected): + assert utils._detect_file_type(file) == expected + + @pytest.mark.parametrize("file", ["foo", "foo.tar.baz", "foo.bar"]) + def test_detect_file_type_incompatible(self, file): + # tests detect file type for no extension, unknown compression and unknown partial extension + with pytest.raises(RuntimeError): + utils._detect_file_type(file) + + @pytest.mark.parametrize("extension", [".bz2", ".gz", ".xz"]) + @pytest.mark.parametrize("use_pathlib", (True, False)) + def test_decompress(self, extension, tmpdir, use_pathlib): def create_compressed(root, content="this is the content"): file = os.path.join(root, "file") - compressed = f"{file}.xz" + compressed = f"{file}{extension}" + compressed_file_opener = _COMPRESSED_FILE_OPENERS[extension] - with lzma.open(compressed, "wb") as fh: + with compressed_file_opener(compressed, "wb") as fh: fh.write(content.encode()) return compressed, file, content - with get_tmp_dir() as temp_dir: - compressed, file, content = create_compressed(temp_dir) + compressed, file, content = create_compressed(tmpdir) + if use_pathlib: + compressed = pathlib.Path(compressed) - utils.extract_archive(compressed, temp_dir) + utils._decompress(compressed) - self.assertTrue(os.path.exists(file)) + assert os.path.exists(file) - with open(file, "r") as fh: - self.assertEqual(fh.read(), content) + with open(file) as fh: + assert fh.read() == content def test_decompress_no_compression(self): - with self.assertRaises(RuntimeError): + with pytest.raises(RuntimeError): utils._decompress("foo.tar") - def test_decompress_remove_finished(self): + @pytest.mark.parametrize("use_pathlib", (True, False)) + def test_decompress_remove_finished(self, tmpdir, use_pathlib): def create_compressed(root, content="this is the content"): file = os.path.join(root, "file") compressed = f"{file}.gz" @@ -136,28 +157,35 @@ class Tester(unittest.TestCase): return compressed, file, content - with get_tmp_dir() as temp_dir: - compressed, file, content = create_compressed(temp_dir) + compressed, file, content = create_compressed(tmpdir) + print(f"{type(compressed)=}") + if use_pathlib: + compressed = pathlib.Path(compressed) + tmpdir = pathlib.Path(tmpdir) + + extracted_dir = utils.extract_archive(compressed, tmpdir, remove_finished=True) + + assert not os.path.exists(compressed) + if use_pathlib: + assert isinstance(extracted_dir, pathlib.Path) + assert isinstance(compressed, pathlib.Path) + else: + assert isinstance(extracted_dir, str) + assert isinstance(compressed, str) + + @pytest.mark.parametrize("extension", [".gz", ".xz"]) + @pytest.mark.parametrize("remove_finished", [True, False]) + def test_extract_archive_defer_to_decompress(self, extension, remove_finished, mocker): + filename = "foo" + file = f"{filename}{extension}" - utils.extract_archive(compressed, temp_dir, remove_finished=True) + mocked = mocker.patch("torchvision.datasets.utils._decompress") + utils.extract_archive(file, remove_finished=remove_finished) - self.assertFalse(os.path.exists(compressed)) + mocked.assert_called_once_with(file, filename, remove_finished=remove_finished) - def test_extract_archive_defer_to_decompress(self): - filename = "foo" - for ext, remove_finished in itertools.product((".gz", ".xz"), (True, False)): - with self.subTest(ext=ext, remove_finished=remove_finished): - with unittest.mock.patch("torchvision.datasets.utils._decompress") as mock: - file = f"{filename}{ext}" - utils.extract_archive(file, remove_finished=remove_finished) - - mock.assert_called_once() - self.assertEqual( - call_args_to_kwargs_only(mock.call_args, utils._decompress), - dict(from_path=file, to_path=filename, remove_finished=remove_finished), - ) - - def test_extract_zip(self): + @pytest.mark.parametrize("use_pathlib", (True, False)) + def test_extract_zip(self, tmpdir, use_pathlib): def create_archive(root, content="this is the content"): file = os.path.join(root, "dst.txt") archive = os.path.join(root, "archive.zip") @@ -167,46 +195,26 @@ class Tester(unittest.TestCase): return archive, file, content - with get_tmp_dir() as temp_dir: - archive, file, content = create_archive(temp_dir) - - utils.extract_archive(archive, temp_dir) - - self.assertTrue(os.path.exists(file)) - - with open(file, "r") as fh: - self.assertEqual(fh.read(), content) + if use_pathlib: + tmpdir = pathlib.Path(tmpdir) + archive, file, content = create_archive(tmpdir) - def test_extract_tar(self): - def create_archive(root, ext, mode, content="this is the content"): - src = os.path.join(root, "src.txt") - dst = os.path.join(root, "dst.txt") - archive = os.path.join(root, f"archive{ext}") - - with open(src, "w") as fh: - fh.write(content) - - with tarfile.open(archive, mode=mode) as fh: - fh.add(src, arcname=os.path.basename(dst)) - - return archive, dst, content - - for ext, mode in zip(['.tar', '.tar.gz', '.tgz'], ['w', 'w:gz', 'w:gz']): - with get_tmp_dir() as temp_dir: - archive, file, content = create_archive(temp_dir, ext, mode) + utils.extract_archive(archive, tmpdir) - utils.extract_archive(archive, temp_dir) + assert os.path.exists(file) - self.assertTrue(os.path.exists(file)) + with open(file) as fh: + assert fh.read() == content - with open(file, "r") as fh: - self.assertEqual(fh.read(), content) - - def test_extract_tar_xz(self): - def create_archive(root, ext, mode, content="this is the content"): + @pytest.mark.parametrize( + "extension, mode", [(".tar", "w"), (".tar.gz", "w:gz"), (".tgz", "w:gz"), (".tar.xz", "w:xz")] + ) + @pytest.mark.parametrize("use_pathlib", (True, False)) + def test_extract_tar(self, extension, mode, tmpdir, use_pathlib): + def create_archive(root, extension, mode, content="this is the content"): src = os.path.join(root, "src.txt") dst = os.path.join(root, "dst.txt") - archive = os.path.join(root, f"archive{ext}") + archive = os.path.join(root, f"archive{extension}") with open(src, "w") as fh: fh.write(content) @@ -216,22 +224,64 @@ class Tester(unittest.TestCase): return archive, dst, content - for ext, mode in zip(['.tar.xz'], ['w:xz']): - with get_tmp_dir() as temp_dir: - archive, file, content = create_archive(temp_dir, ext, mode) + if use_pathlib: + tmpdir = pathlib.Path(tmpdir) + archive, file, content = create_archive(tmpdir, extension, mode) - utils.extract_archive(archive, temp_dir) + utils.extract_archive(archive, tmpdir) - self.assertTrue(os.path.exists(file)) + assert os.path.exists(file) - with open(file, "r") as fh: - self.assertEqual(fh.read(), content) + with open(file) as fh: + assert fh.read() == content def test_verify_str_arg(self): - self.assertEqual("a", utils.verify_str_arg("a", "arg", ("a",))) - self.assertRaises(ValueError, utils.verify_str_arg, 0, ("a",), "arg") - self.assertRaises(ValueError, utils.verify_str_arg, "b", ("a",), "arg") - - -if __name__ == '__main__': - unittest.main() + assert "a" == utils.verify_str_arg("a", "arg", ("a",)) + pytest.raises(ValueError, utils.verify_str_arg, 0, ("a",), "arg") + pytest.raises(ValueError, utils.verify_str_arg, "b", ("a",), "arg") + + @pytest.mark.parametrize( + ("dtype", "actual_hex", "expected_hex"), + [ + (torch.uint8, "01 23 45 67 89 AB CD EF", "01 23 45 67 89 AB CD EF"), + (torch.float16, "01 23 45 67 89 AB CD EF", "23 01 67 45 AB 89 EF CD"), + (torch.int32, "01 23 45 67 89 AB CD EF", "67 45 23 01 EF CD AB 89"), + (torch.float64, "01 23 45 67 89 AB CD EF", "EF CD AB 89 67 45 23 01"), + ], + ) + def test_flip_byte_order(self, dtype, actual_hex, expected_hex): + def to_tensor(hex): + return torch.frombuffer(bytes.fromhex(hex), dtype=dtype) + + assert_equal( + utils._flip_byte_order(to_tensor(actual_hex)), + to_tensor(expected_hex), + ) + + +@pytest.mark.parametrize( + ("kwargs", "expected_error_msg"), + [ + (dict(is_valid_file=lambda path: pathlib.Path(path).suffix in {".png", ".jpeg"}), "classes c"), + (dict(extensions=".png"), re.escape("classes b, c. Supported extensions are: .png")), + (dict(extensions=(".png", ".jpeg")), re.escape("classes c. Supported extensions are: .png, .jpeg")), + ], +) +def test_make_dataset_no_valid_files(tmpdir, kwargs, expected_error_msg): + tmpdir = pathlib.Path(tmpdir) + + (tmpdir / "a").mkdir() + (tmpdir / "a" / "a.png").touch() + + (tmpdir / "b").mkdir() + (tmpdir / "b" / "b.jpeg").touch() + + (tmpdir / "c").mkdir() + (tmpdir / "c" / "c.unknown").touch() + + with pytest.raises(FileNotFoundError, match=expected_error_msg): + make_dataset(str(tmpdir), **kwargs) + + +if __name__ == "__main__": + pytest.main([__file__]) diff --git a/test/test_datasets_video_utils.py b/test/test_datasets_video_utils.py index 0a9d3bdfc36c14e9af6df08b65adf389af93e526..51330911e509ba6201ca2d1be4e2a85858d53020 100644 --- a/test/test_datasets_video_utils.py +++ b/test/test_datasets_video_utils.py @@ -1,98 +1,71 @@ -import contextlib -import os +import pytest import torch -import unittest - +from common_utils import assert_equal, get_list_of_videos from torchvision import io -from torchvision.datasets.video_utils import VideoClips, unfold - -from common_utils import get_tmp_dir -from _assert_utils import assert_equal - - -@contextlib.contextmanager -def get_list_of_videos(num_videos=5, sizes=None, fps=None): - with get_tmp_dir() as tmp_dir: - names = [] - for i in range(num_videos): - if sizes is None: - size = 5 * (i + 1) - else: - size = sizes[i] - if fps is None: - f = 5 - else: - f = fps[i] - data = torch.randint(0, 256, (size, 300, 400, 3), dtype=torch.uint8) - name = os.path.join(tmp_dir, "{}.mp4".format(i)) - names.append(name) - io.write_video(name, data, fps=f) - - yield names - +from torchvision.datasets.video_utils import unfold, VideoClips -class Tester(unittest.TestCase): +class TestVideo: def test_unfold(self): a = torch.arange(7) r = unfold(a, 3, 3, 1) - expected = torch.tensor([ - [0, 1, 2], - [3, 4, 5], - ]) - assert_equal(r, expected, check_stride=False) + expected = torch.tensor( + [ + [0, 1, 2], + [3, 4, 5], + ] + ) + assert_equal(r, expected) r = unfold(a, 3, 2, 1) - expected = torch.tensor([ - [0, 1, 2], - [2, 3, 4], - [4, 5, 6] - ]) - assert_equal(r, expected, check_stride=False) + expected = torch.tensor([[0, 1, 2], [2, 3, 4], [4, 5, 6]]) + assert_equal(r, expected) r = unfold(a, 3, 2, 2) - expected = torch.tensor([ - [0, 2, 4], - [2, 4, 6], - ]) - assert_equal(r, expected, check_stride=False) - - @unittest.skipIf(not io.video._av_available(), "this test requires av") - def test_video_clips(self): - with get_list_of_videos(num_videos=3) as video_list: - video_clips = VideoClips(video_list, 5, 5, num_workers=2) - assert video_clips.num_clips() == 1 + 2 + 3 - for i, (v_idx, c_idx) in enumerate([(0, 0), (1, 0), (1, 1), (2, 0), (2, 1), (2, 2)]): - video_idx, clip_idx = video_clips.get_clip_location(i) - assert video_idx == v_idx - assert clip_idx == c_idx - - video_clips = VideoClips(video_list, 6, 6) - assert video_clips.num_clips() == 0 + 1 + 2 - for i, (v_idx, c_idx) in enumerate([(1, 0), (2, 0), (2, 1)]): - video_idx, clip_idx = video_clips.get_clip_location(i) - assert video_idx == v_idx - assert clip_idx == c_idx - - video_clips = VideoClips(video_list, 6, 1) - assert video_clips.num_clips() == 0 + (10 - 6 + 1) + (15 - 6 + 1) - for i, v_idx, c_idx in [(0, 1, 0), (4, 1, 4), (5, 2, 0), (6, 2, 1)]: - video_idx, clip_idx = video_clips.get_clip_location(i) - assert video_idx == v_idx - assert clip_idx == c_idx - - @unittest.skipIf(not io.video._av_available(), "this test requires av") - def test_video_clips_custom_fps(self): - with get_list_of_videos(num_videos=3, sizes=[12, 12, 12], fps=[3, 4, 6]) as video_list: - num_frames = 4 - for fps in [1, 3, 4, 10]: - video_clips = VideoClips(video_list, num_frames, num_frames, fps, num_workers=2) - for i in range(video_clips.num_clips()): - video, audio, info, video_idx = video_clips.get_clip(i) - assert video.shape[0] == num_frames - assert info["video_fps"] == fps - # TODO add tests checking that the content is right + expected = torch.tensor( + [ + [0, 2, 4], + [2, 4, 6], + ] + ) + assert_equal(r, expected) + + @pytest.mark.skipif(not io.video._av_available(), reason="this test requires av") + def test_video_clips(self, tmpdir): + video_list = get_list_of_videos(tmpdir, num_videos=3) + video_clips = VideoClips(video_list, 5, 5, num_workers=2) + assert video_clips.num_clips() == 1 + 2 + 3 + for i, (v_idx, c_idx) in enumerate([(0, 0), (1, 0), (1, 1), (2, 0), (2, 1), (2, 2)]): + video_idx, clip_idx = video_clips.get_clip_location(i) + assert video_idx == v_idx + assert clip_idx == c_idx + + video_clips = VideoClips(video_list, 6, 6) + assert video_clips.num_clips() == 0 + 1 + 2 + for i, (v_idx, c_idx) in enumerate([(1, 0), (2, 0), (2, 1)]): + video_idx, clip_idx = video_clips.get_clip_location(i) + assert video_idx == v_idx + assert clip_idx == c_idx + + video_clips = VideoClips(video_list, 6, 1) + assert video_clips.num_clips() == 0 + (10 - 6 + 1) + (15 - 6 + 1) + for i, v_idx, c_idx in [(0, 1, 0), (4, 1, 4), (5, 2, 0), (6, 2, 1)]: + video_idx, clip_idx = video_clips.get_clip_location(i) + assert video_idx == v_idx + assert clip_idx == c_idx + + @pytest.mark.skipif(not io.video._av_available(), reason="this test requires av") + def test_video_clips_custom_fps(self, tmpdir): + video_list = get_list_of_videos(tmpdir, num_videos=3, sizes=[12, 12, 12], fps=[3, 4, 6]) + num_frames = 4 + for fps in [1, 3, 4, 10]: + video_clips = VideoClips(video_list, num_frames, num_frames, fps) + for i in range(video_clips.num_clips()): + video, audio, info, video_idx = video_clips.get_clip(i) + assert video.shape[0] == num_frames + assert info["video_fps"] == fps + # TODO add tests checking that the content is right def test_compute_clips_for_video(self): video_pts = torch.arange(30) @@ -101,8 +74,7 @@ class Tester(unittest.TestCase): orig_fps = 30 duration = float(len(video_pts)) / orig_fps new_fps = 13 - clips, idxs = VideoClips.compute_clips_for_video(video_pts, num_frames, num_frames, - orig_fps, new_fps) + clips, idxs = VideoClips.compute_clips_for_video(video_pts, num_frames, num_frames, orig_fps, new_fps) resampled_idxs = VideoClips._resample_video_idx(int(duration * new_fps), orig_fps, new_fps) assert len(clips) == 1 assert_equal(clips, idxs) @@ -113,8 +85,7 @@ class Tester(unittest.TestCase): orig_fps = 30 duration = float(len(video_pts)) / orig_fps new_fps = 12 - clips, idxs = VideoClips.compute_clips_for_video(video_pts, num_frames, num_frames, - orig_fps, new_fps) + clips, idxs = VideoClips.compute_clips_for_video(video_pts, num_frames, num_frames, orig_fps, new_fps) resampled_idxs = VideoClips._resample_video_idx(int(duration * new_fps), orig_fps, new_fps) assert len(clips) == 3 assert_equal(clips, idxs) @@ -124,12 +95,11 @@ class Tester(unittest.TestCase): num_frames = 32 orig_fps = 30 new_fps = 13 - with self.assertWarns(UserWarning): - clips, idxs = VideoClips.compute_clips_for_video(video_pts, num_frames, num_frames, - orig_fps, new_fps) + with pytest.warns(UserWarning): + clips, idxs = VideoClips.compute_clips_for_video(video_pts, num_frames, num_frames, orig_fps, new_fps) assert len(clips) == 0 assert len(idxs) == 0 -if __name__ == '__main__': - unittest.main() +if __name__ == "__main__": + pytest.main([__file__]) diff --git a/test/test_datasets_video_utils_opt.py b/test/test_datasets_video_utils_opt.py index 8075c701ed90a8f51723034c9950dffc24739d97..5e6b19bfb955b80e08b9ab2016cdad31f634fc21 100644 --- a/test/test_datasets_video_utils_opt.py +++ b/test/test_datasets_video_utils_opt.py @@ -1,11 +1,12 @@ import unittest -from torchvision import set_video_backend + import test_datasets_video_utils +from torchvision import set_video_backend # noqa: 401 # Disabling the video backend switching temporarily # set_video_backend('video_reader') -if __name__ == '__main__': +if __name__ == "__main__": suite = unittest.TestLoader().loadTestsFromModule(test_datasets_video_utils) unittest.TextTestRunner(verbosity=1).run(suite) diff --git a/test/test_extended_models.py b/test/test_extended_models.py new file mode 100644 index 0000000000000000000000000000000000000000..0c918c0afd1a64c3762e6d816b991d5a4f726f88 --- /dev/null +++ b/test/test_extended_models.py @@ -0,0 +1,503 @@ +import copy +import os +import pickle + +import pytest +import test_models as TM +import torch +from common_extended_utils import get_file_size_mb, get_ops +from torchvision import models +from torchvision.models import get_model_weights, Weights, WeightsEnum +from torchvision.models._utils import handle_legacy_interface +from torchvision.models.detection.backbone_utils import mobilenet_backbone, resnet_fpn_backbone + +run_if_test_with_extended = pytest.mark.skipif( + os.getenv("PYTORCH_TEST_WITH_EXTENDED", "0") != "1", + reason="Extended tests are disabled by default. Set PYTORCH_TEST_WITH_EXTENDED=1 to run them.", +) + + +@pytest.mark.parametrize( + "name, model_class", + [ + ("resnet50", models.ResNet), + ("retinanet_resnet50_fpn_v2", models.detection.RetinaNet), + ("raft_large", models.optical_flow.RAFT), + ("quantized_resnet50", models.quantization.QuantizableResNet), + ("lraspp_mobilenet_v3_large", models.segmentation.LRASPP), + ("mvit_v1_b", models.video.MViT), + ], +) +def test_get_model(name, model_class): + assert isinstance(models.get_model(name), model_class) + + +@pytest.mark.parametrize( + "name, model_fn", + [ + ("resnet50", models.resnet50), + ("retinanet_resnet50_fpn_v2", models.detection.retinanet_resnet50_fpn_v2), + ("raft_large", models.optical_flow.raft_large), + ("quantized_resnet50", models.quantization.resnet50), + ("lraspp_mobilenet_v3_large", models.segmentation.lraspp_mobilenet_v3_large), + ("mvit_v1_b", models.video.mvit_v1_b), + ], +) +def test_get_model_builder(name, model_fn): + assert models.get_model_builder(name) == model_fn + + +@pytest.mark.parametrize( + "name, weight", + [ + ("resnet50", models.ResNet50_Weights), + ("retinanet_resnet50_fpn_v2", models.detection.RetinaNet_ResNet50_FPN_V2_Weights), + ("raft_large", models.optical_flow.Raft_Large_Weights), + ("quantized_resnet50", models.quantization.ResNet50_QuantizedWeights), + ("lraspp_mobilenet_v3_large", models.segmentation.LRASPP_MobileNet_V3_Large_Weights), + ("mvit_v1_b", models.video.MViT_V1_B_Weights), + ], +) +def test_get_model_weights(name, weight): + assert models.get_model_weights(name) == weight + + +@pytest.mark.parametrize("copy_fn", [copy.copy, copy.deepcopy]) +@pytest.mark.parametrize( + "name", + [ + "resnet50", + "retinanet_resnet50_fpn_v2", + "raft_large", + "quantized_resnet50", + "lraspp_mobilenet_v3_large", + "mvit_v1_b", + ], +) +def test_weights_copyable(copy_fn, name): + for weights in list(models.get_model_weights(name)): + # It is somewhat surprising that (deep-)copying is an identity operation here, but this is the default behavior + # of enums: https://docs.python.org/3/howto/enum.html#enum-members-aka-instances + # Checking for equality, i.e. `==`, is sufficient (and even preferable) for our use case, should we need to drop + # support for the identity operation in the future. + assert copy_fn(weights) is weights + + +@pytest.mark.parametrize( + "name", + [ + "resnet50", + "retinanet_resnet50_fpn_v2", + "raft_large", + "quantized_resnet50", + "lraspp_mobilenet_v3_large", + "mvit_v1_b", + ], +) +def test_weights_deserializable(name): + for weights in list(models.get_model_weights(name)): + # It is somewhat surprising that deserialization is an identity operation here, but this is the default behavior + # of enums: https://docs.python.org/3/howto/enum.html#enum-members-aka-instances + # Checking for equality, i.e. `==`, is sufficient (and even preferable) for our use case, should we need to drop + # support for the identity operation in the future. + assert pickle.loads(pickle.dumps(weights)) is weights + + +def get_models_from_module(module): + return [ + v.__name__ + for k, v in module.__dict__.items() + if callable(v) and k[0].islower() and k[0] != "_" and k not in models._api.__all__ + ] + + +@pytest.mark.parametrize( + "module", [models, models.detection, models.quantization, models.segmentation, models.video, models.optical_flow] +) +def test_list_models(module): + a = set(get_models_from_module(module)) + b = set(x.replace("quantized_", "") for x in models.list_models(module)) + + assert len(b) > 0 + assert a == b + + +@pytest.mark.parametrize( + "include_filters", + [ + None, + [], + (), + "", + "*resnet*", + ["*alexnet*"], + "*not-existing-model-for-test?", + ["*resnet*", "*alexnet*"], + ["*resnet*", "*alexnet*", "*not-existing-model-for-test?"], + ("*resnet*", "*alexnet*"), + set(["*resnet*", "*alexnet*"]), + ], +) +@pytest.mark.parametrize( + "exclude_filters", + [ + None, + [], + (), + "", + "*resnet*", + ["*alexnet*"], + ["*not-existing-model-for-test?"], + ["resnet34", "*not-existing-model-for-test?"], + ["resnet34", "*resnet1*"], + ("resnet34", "*resnet1*"), + set(["resnet34", "*resnet1*"]), + ], +) +def test_list_models_filters(include_filters, exclude_filters): + actual = set(models.list_models(models, include=include_filters, exclude=exclude_filters)) + classification_models = set(get_models_from_module(models)) + + if isinstance(include_filters, str): + include_filters = [include_filters] + if isinstance(exclude_filters, str): + exclude_filters = [exclude_filters] + + if include_filters: + expected = set() + for include_f in include_filters: + include_f = include_f.strip("*?") + expected = expected | set(x for x in classification_models if include_f in x) + else: + expected = classification_models + + if exclude_filters: + for exclude_f in exclude_filters: + exclude_f = exclude_f.strip("*?") + if exclude_f != "": + a_exclude = set(x for x in classification_models if exclude_f in x) + expected = expected - a_exclude + + assert expected == actual + + +@pytest.mark.parametrize( + "name, weight", + [ + ("ResNet50_Weights.IMAGENET1K_V1", models.ResNet50_Weights.IMAGENET1K_V1), + ("ResNet50_Weights.DEFAULT", models.ResNet50_Weights.IMAGENET1K_V2), + ( + "ResNet50_QuantizedWeights.DEFAULT", + models.quantization.ResNet50_QuantizedWeights.IMAGENET1K_FBGEMM_V2, + ), + ( + "ResNet50_QuantizedWeights.IMAGENET1K_FBGEMM_V1", + models.quantization.ResNet50_QuantizedWeights.IMAGENET1K_FBGEMM_V1, + ), + ], +) +def test_get_weight(name, weight): + assert models.get_weight(name) == weight + + +@pytest.mark.parametrize( + "model_fn", + TM.list_model_fns(models) + + TM.list_model_fns(models.detection) + + TM.list_model_fns(models.quantization) + + TM.list_model_fns(models.segmentation) + + TM.list_model_fns(models.video) + + TM.list_model_fns(models.optical_flow), +) +def test_naming_conventions(model_fn): + weights_enum = get_model_weights(model_fn) + assert weights_enum is not None + assert len(weights_enum) == 0 or hasattr(weights_enum, "DEFAULT") + + +detection_models_input_dims = { + "fasterrcnn_mobilenet_v3_large_320_fpn": (320, 320), + "fasterrcnn_mobilenet_v3_large_fpn": (800, 800), + "fasterrcnn_resnet50_fpn": (800, 800), + "fasterrcnn_resnet50_fpn_v2": (800, 800), + "fcos_resnet50_fpn": (800, 800), + "keypointrcnn_resnet50_fpn": (1333, 1333), + "maskrcnn_resnet50_fpn": (800, 800), + "maskrcnn_resnet50_fpn_v2": (800, 800), + "retinanet_resnet50_fpn": (800, 800), + "retinanet_resnet50_fpn_v2": (800, 800), + "ssd300_vgg16": (300, 300), + "ssdlite320_mobilenet_v3_large": (320, 320), +} + + +@pytest.mark.parametrize( + "model_fn", + TM.list_model_fns(models) + + TM.list_model_fns(models.detection) + + TM.list_model_fns(models.quantization) + + TM.list_model_fns(models.segmentation) + + TM.list_model_fns(models.video) + + TM.list_model_fns(models.optical_flow), +) +@run_if_test_with_extended +def test_schema_meta_validation(model_fn): + if model_fn.__name__ == "maskrcnn_resnet50_fpn_v2": + pytest.skip(reason="FIXME https://github.com/pytorch/vision/issues/7349") + + # list of all possible supported high-level fields for weights meta-data + permitted_fields = { + "backend", + "categories", + "keypoint_names", + "license", + "_metrics", + "min_size", + "min_temporal_size", + "num_params", + "recipe", + "unquantized", + "_docs", + "_ops", + "_file_size", + } + # mandatory fields for each computer vision task + classification_fields = {"categories", ("_metrics", "ImageNet-1K", "acc@1"), ("_metrics", "ImageNet-1K", "acc@5")} + defaults = { + "all": {"_metrics", "min_size", "num_params", "recipe", "_docs", "_file_size", "_ops"}, + "models": classification_fields, + "detection": {"categories", ("_metrics", "COCO-val2017", "box_map")}, + "quantization": classification_fields | {"backend", "unquantized"}, + "segmentation": { + "categories", + ("_metrics", "COCO-val2017-VOC-labels", "miou"), + ("_metrics", "COCO-val2017-VOC-labels", "pixel_acc"), + }, + "video": {"categories", ("_metrics", "Kinetics-400", "acc@1"), ("_metrics", "Kinetics-400", "acc@5")}, + "optical_flow": set(), + } + model_name = model_fn.__name__ + module_name = model_fn.__module__.split(".")[-2] + expected_fields = defaults["all"] | defaults[module_name] + + weights_enum = get_model_weights(model_fn) + if len(weights_enum) == 0: + pytest.skip(f"Model '{model_name}' doesn't have any pre-trained weights.") + + problematic_weights = {} + incorrect_meta = [] + bad_names = [] + for w in weights_enum: + actual_fields = set(w.meta.keys()) + actual_fields |= set( + ("_metrics", dataset, metric_key) + for dataset in w.meta.get("_metrics", {}).keys() + for metric_key in w.meta.get("_metrics", {}).get(dataset, {}).keys() + ) + missing_fields = expected_fields - actual_fields + unsupported_fields = set(w.meta.keys()) - permitted_fields + if missing_fields or unsupported_fields: + problematic_weights[w] = {"missing": missing_fields, "unsupported": unsupported_fields} + + if w == weights_enum.DEFAULT or any(w.meta[k] != weights_enum.DEFAULT.meta[k] for k in ["num_params", "_ops"]): + if module_name == "quantization": + # parameters() count doesn't work well with quantization, so we check against the non-quantized + unquantized_w = w.meta.get("unquantized") + if unquantized_w is not None: + if w.meta.get("num_params") != unquantized_w.meta.get("num_params"): + incorrect_meta.append((w, "num_params")) + + # the methodology for quantized ops count doesn't work as well, so we take unquantized FLOPs + # instead + if w.meta["_ops"] != unquantized_w.meta.get("_ops"): + incorrect_meta.append((w, "_ops")) + + else: + # loading the model and using it for parameter and ops verification + model = model_fn(weights=w) + + if w.meta.get("num_params") != sum(p.numel() for p in model.parameters()): + incorrect_meta.append((w, "num_params")) + + kwargs = {} + if model_name in detection_models_input_dims: + # detection models have non default height and width + height, width = detection_models_input_dims[model_name] + kwargs = {"height": height, "width": width} + + if not model_fn.__name__.startswith("vit"): + # FIXME: https://github.com/pytorch/vision/issues/7871 + calculated_ops = get_ops(model=model, weight=w, **kwargs) + if calculated_ops != w.meta["_ops"]: + incorrect_meta.append((w, "_ops")) + + if not w.name.isupper(): + bad_names.append(w) + + if get_file_size_mb(w) != w.meta.get("_file_size"): + incorrect_meta.append((w, "_file_size")) + + assert not problematic_weights + assert not incorrect_meta + assert not bad_names + + +@pytest.mark.parametrize( + "model_fn", + TM.list_model_fns(models) + + TM.list_model_fns(models.detection) + + TM.list_model_fns(models.quantization) + + TM.list_model_fns(models.segmentation) + + TM.list_model_fns(models.video) + + TM.list_model_fns(models.optical_flow), +) +@run_if_test_with_extended +def test_transforms_jit(model_fn): + model_name = model_fn.__name__ + weights_enum = get_model_weights(model_fn) + if len(weights_enum) == 0: + pytest.skip(f"Model '{model_name}' doesn't have any pre-trained weights.") + + defaults = { + "models": { + "input_shape": (1, 3, 224, 224), + }, + "detection": { + "input_shape": (3, 300, 300), + }, + "quantization": { + "input_shape": (1, 3, 224, 224), + }, + "segmentation": { + "input_shape": (1, 3, 520, 520), + }, + "video": { + "input_shape": (1, 3, 4, 112, 112), + }, + "optical_flow": { + "input_shape": (1, 3, 128, 128), + }, + } + module_name = model_fn.__module__.split(".")[-2] + + kwargs = {**defaults[module_name], **TM._model_params.get(model_name, {})} + input_shape = kwargs.pop("input_shape") + x = torch.rand(input_shape) + if module_name == "optical_flow": + args = (x, x) + else: + if module_name == "video": + x = x.permute(0, 2, 1, 3, 4) + args = (x,) + + problematic_weights = [] + for w in weights_enum: + transforms = w.transforms() + try: + TM._check_jit_scriptable(transforms, args) + except Exception: + problematic_weights.append(w) + + assert not problematic_weights + + +# With this filter, every unexpected warning will be turned into an error +@pytest.mark.filterwarnings("error") +class TestHandleLegacyInterface: + class ModelWeights(WeightsEnum): + Sentinel = Weights(url="https://pytorch.org", transforms=lambda x: x, meta=dict()) + + @pytest.mark.parametrize( + "kwargs", + [ + pytest.param(dict(), id="empty"), + pytest.param(dict(weights=None), id="None"), + pytest.param(dict(weights=ModelWeights.Sentinel), id="Weights"), + ], + ) + def test_no_warn(self, kwargs): + @handle_legacy_interface(weights=("pretrained", self.ModelWeights.Sentinel)) + def builder(*, weights=None): + pass + + builder(**kwargs) + + @pytest.mark.parametrize("pretrained", (True, False)) + def test_pretrained_pos(self, pretrained): + @handle_legacy_interface(weights=("pretrained", self.ModelWeights.Sentinel)) + def builder(*, weights=None): + pass + + with pytest.warns(UserWarning, match="positional"): + builder(pretrained) + + @pytest.mark.parametrize("pretrained", (True, False)) + def test_pretrained_kw(self, pretrained): + @handle_legacy_interface(weights=("pretrained", self.ModelWeights.Sentinel)) + def builder(*, weights=None): + pass + + with pytest.warns(UserWarning, match="deprecated"): + builder(pretrained) + + @pytest.mark.parametrize("pretrained", (True, False)) + @pytest.mark.parametrize("positional", (True, False)) + def test_equivalent_behavior_weights(self, pretrained, positional): + @handle_legacy_interface(weights=("pretrained", self.ModelWeights.Sentinel)) + def builder(*, weights=None): + pass + + args, kwargs = ((pretrained,), dict()) if positional else ((), dict(pretrained=pretrained)) + with pytest.warns(UserWarning, match=f"weights={self.ModelWeights.Sentinel if pretrained else None}"): + builder(*args, **kwargs) + + def test_multi_params(self): + weights_params = ("weights", "weights_other") + pretrained_params = [param.replace("weights", "pretrained") for param in weights_params] + + @handle_legacy_interface( + **{ + weights_param: (pretrained_param, self.ModelWeights.Sentinel) + for weights_param, pretrained_param in zip(weights_params, pretrained_params) + } + ) + def builder(*, weights=None, weights_other=None): + pass + + for pretrained_param in pretrained_params: + with pytest.warns(UserWarning, match="deprecated"): + builder(**{pretrained_param: True}) + + def test_default_callable(self): + @handle_legacy_interface( + weights=( + "pretrained", + lambda kwargs: self.ModelWeights.Sentinel if kwargs["flag"] else None, + ) + ) + def builder(*, weights=None, flag): + pass + + with pytest.warns(UserWarning, match="deprecated"): + builder(pretrained=True, flag=True) + + with pytest.raises(ValueError, match="weights"): + builder(pretrained=True, flag=False) + + @pytest.mark.parametrize( + "model_fn", + [fn for fn in TM.list_model_fns(models) if fn.__name__ not in {"vit_h_14", "regnet_y_128gf"}] + + TM.list_model_fns(models.detection) + + TM.list_model_fns(models.quantization) + + TM.list_model_fns(models.segmentation) + + TM.list_model_fns(models.video) + + TM.list_model_fns(models.optical_flow) + + [ + lambda pretrained: resnet_fpn_backbone(backbone_name="resnet50", pretrained=pretrained), + lambda pretrained: mobilenet_backbone(backbone_name="mobilenet_v2", fpn=False, pretrained=pretrained), + ], + ) + @run_if_test_with_extended + def test_pretrained_deprecation(self, model_fn): + with pytest.warns(UserWarning, match="deprecated"): + model_fn(pretrained=True) diff --git a/test/test_functional_tensor.py b/test/test_functional_tensor.py index 12a8d41914bd354815853de7653be81d955fb833..b5352f18f21de0519cc6e672047f9e7bb92b1fea 100644 --- a/test/test_functional_tensor.py +++ b/test/test_functional_tensor.py @@ -1,707 +1,352 @@ -import itertools -import os -import unittest import colorsys +import itertools import math +import os +from functools import partial +from typing import Sequence import numpy as np +import PIL.Image import pytest - import torch -import torchvision.transforms.functional_tensor as F_t -import torchvision.transforms.functional_pil as F_pil -import torchvision.transforms.functional as F import torchvision.transforms as T +import torchvision.transforms._functional_pil as F_pil +import torchvision.transforms._functional_tensor as F_t +import torchvision.transforms.functional as F +from common_utils import ( + _assert_approx_equal_tensor_to_pil, + _assert_equal_tensor_to_pil, + _create_data, + _create_data_batch, + _test_fn_on_batch, + assert_equal, + cpu_and_cuda, + needs_cuda, +) from torchvision.transforms import InterpolationMode -from common_utils import TransformsTester, cpu_and_gpu, needs_cuda -from _assert_utils import assert_equal - -from typing import Dict, List, Sequence, Tuple - - -NEAREST, BILINEAR, BICUBIC = InterpolationMode.NEAREST, InterpolationMode.BILINEAR, InterpolationMode.BICUBIC - - -@pytest.fixture(scope='module') -def tester(): - # instanciation of the Tester class used for equality assertions and other utilities - # TODO: remove this eventually when we don't need the class anymore - return Tester() - - -class Tester(TransformsTester): - - def setUp(self): - self.device = "cpu" - - def _test_fn_on_batch(self, batch_tensors, fn, scripted_fn_atol=1e-8, **fn_kwargs): - transformed_batch = fn(batch_tensors, **fn_kwargs) - for i in range(len(batch_tensors)): - img_tensor = batch_tensors[i, ...] - transformed_img = fn(img_tensor, **fn_kwargs) - assert_equal(transformed_img, transformed_batch[i, ...]) - - if scripted_fn_atol >= 0: - scripted_fn = torch.jit.script(fn) - # scriptable function test - s_transformed_batch = scripted_fn(batch_tensors, **fn_kwargs) - torch.testing.assert_close(transformed_batch, s_transformed_batch, rtol=1e-5, atol=scripted_fn_atol) - - def test_assert_image_tensor(self): - shape = (100,) - tensor = torch.rand(*shape, dtype=torch.float, device=self.device) - - list_of_methods = [(F_t._get_image_size, (tensor, )), (F_t.vflip, (tensor, )), - (F_t.hflip, (tensor, )), (F_t.crop, (tensor, 1, 2, 4, 5)), - (F_t.adjust_brightness, (tensor, 0.)), (F_t.adjust_contrast, (tensor, 1.)), - (F_t.adjust_hue, (tensor, -0.5)), (F_t.adjust_saturation, (tensor, 2.)), - (F_t.center_crop, (tensor, [10, 11])), (F_t.five_crop, (tensor, [10, 11])), - (F_t.ten_crop, (tensor, [10, 11])), (F_t.pad, (tensor, [2, ], 2, "constant")), - (F_t.resize, (tensor, [10, 11])), (F_t.perspective, (tensor, [0.2, ])), - (F_t.gaussian_blur, (tensor, (2, 2), (0.7, 0.5))), - (F_t.invert, (tensor, )), (F_t.posterize, (tensor, 0)), - (F_t.solarize, (tensor, 0.3)), (F_t.adjust_sharpness, (tensor, 0.3)), - (F_t.autocontrast, (tensor, )), (F_t.equalize, (tensor, ))] - - for func, args in list_of_methods: - with self.assertRaises(Exception) as context: - func(*args) - - self.assertTrue('Tensor is not a torch image.' in str(context.exception)) - - def test_vflip(self): - script_vflip = torch.jit.script(F.vflip) - - img_tensor, pil_img = self._create_data(16, 18, device=self.device) - vflipped_img = F.vflip(img_tensor) - vflipped_pil_img = F.vflip(pil_img) - self.compareTensorToPIL(vflipped_img, vflipped_pil_img) - - # scriptable function test - vflipped_img_script = script_vflip(img_tensor) - assert_equal(vflipped_img, vflipped_img_script) - - batch_tensors = self._create_data_batch(16, 18, num_samples=4, device=self.device) - self._test_fn_on_batch(batch_tensors, F.vflip) - - def test_hflip(self): - script_hflip = torch.jit.script(F.hflip) - - img_tensor, pil_img = self._create_data(16, 18, device=self.device) - hflipped_img = F.hflip(img_tensor) - hflipped_pil_img = F.hflip(pil_img) - self.compareTensorToPIL(hflipped_img, hflipped_pil_img) - - # scriptable function test - hflipped_img_script = script_hflip(img_tensor) - assert_equal(hflipped_img, hflipped_img_script) - - batch_tensors = self._create_data_batch(16, 18, num_samples=4, device=self.device) - self._test_fn_on_batch(batch_tensors, F.hflip) +NEAREST, NEAREST_EXACT, BILINEAR, BICUBIC = ( + InterpolationMode.NEAREST, + InterpolationMode.NEAREST_EXACT, + InterpolationMode.BILINEAR, + InterpolationMode.BICUBIC, +) - def test_crop(self): - script_crop = torch.jit.script(F.crop) - img_tensor, pil_img = self._create_data(16, 18, device=self.device) +@pytest.mark.parametrize("device", cpu_and_cuda()) +@pytest.mark.parametrize("fn", [F.get_image_size, F.get_image_num_channels, F.get_dimensions]) +def test_image_sizes(device, fn): + script_F = torch.jit.script(fn) - test_configs = [ - (1, 2, 4, 5), # crop inside top-left corner - (2, 12, 3, 4), # crop inside top-right corner - (8, 3, 5, 6), # crop inside bottom-left corner - (8, 11, 4, 3), # crop inside bottom-right corner - ] - - for top, left, height, width in test_configs: - pil_img_cropped = F.crop(pil_img, top, left, height, width) - - img_tensor_cropped = F.crop(img_tensor, top, left, height, width) - self.compareTensorToPIL(img_tensor_cropped, pil_img_cropped) - - img_tensor_cropped = script_crop(img_tensor, top, left, height, width) - self.compareTensorToPIL(img_tensor_cropped, pil_img_cropped) - - batch_tensors = self._create_data_batch(16, 18, num_samples=4, device=self.device) - self._test_fn_on_batch(batch_tensors, F.crop, top=top, left=left, height=height, width=width) - - def test_hsv2rgb(self): - scripted_fn = torch.jit.script(F_t._hsv2rgb) - shape = (3, 100, 150) - for _ in range(10): - hsv_img = torch.rand(*shape, dtype=torch.float, device=self.device) - rgb_img = F_t._hsv2rgb(hsv_img) - ft_img = rgb_img.permute(1, 2, 0).flatten(0, 1) - - h, s, v, = hsv_img.unbind(0) - h = h.flatten().cpu().numpy() - s = s.flatten().cpu().numpy() - v = v.flatten().cpu().numpy() - - rgb = [] - for h1, s1, v1 in zip(h, s, v): - rgb.append(colorsys.hsv_to_rgb(h1, s1, v1)) - colorsys_img = torch.tensor(rgb, dtype=torch.float32, device=self.device) - torch.testing.assert_close(ft_img, colorsys_img, rtol=0.0, atol=1e-5) - - s_rgb_img = scripted_fn(hsv_img) - torch.testing.assert_close(rgb_img, s_rgb_img) - - batch_tensors = self._create_data_batch(120, 100, num_samples=4, device=self.device).float() - self._test_fn_on_batch(batch_tensors, F_t._hsv2rgb) - - def test_rgb2hsv(self): - scripted_fn = torch.jit.script(F_t._rgb2hsv) - shape = (3, 150, 100) - for _ in range(10): - rgb_img = torch.rand(*shape, dtype=torch.float, device=self.device) - hsv_img = F_t._rgb2hsv(rgb_img) - ft_hsv_img = hsv_img.permute(1, 2, 0).flatten(0, 1) - - r, g, b, = rgb_img.unbind(dim=-3) - r = r.flatten().cpu().numpy() - g = g.flatten().cpu().numpy() - b = b.flatten().cpu().numpy() - - hsv = [] - for r1, g1, b1 in zip(r, g, b): - hsv.append(colorsys.rgb_to_hsv(r1, g1, b1)) - - colorsys_img = torch.tensor(hsv, dtype=torch.float32, device=self.device) - - ft_hsv_img_h, ft_hsv_img_sv = torch.split(ft_hsv_img, [1, 2], dim=1) - colorsys_img_h, colorsys_img_sv = torch.split(colorsys_img, [1, 2], dim=1) + img_tensor, pil_img = _create_data(16, 18, 3, device=device) + value_img = fn(img_tensor) + value_pil_img = fn(pil_img) + assert value_img == value_pil_img - max_diff_h = ((colorsys_img_h * 2 * math.pi).sin() - (ft_hsv_img_h * 2 * math.pi).sin()).abs().max() - max_diff_sv = (colorsys_img_sv - ft_hsv_img_sv).abs().max() - max_diff = max(max_diff_h, max_diff_sv) - self.assertLess(max_diff, 1e-5) + value_img_script = script_F(img_tensor) + assert value_img == value_img_script - s_hsv_img = scripted_fn(rgb_img) - torch.testing.assert_close(hsv_img, s_hsv_img, rtol=1e-5, atol=1e-7) + batch_tensors = _create_data_batch(16, 18, 3, num_samples=4, device=device) + value_img_batch = fn(batch_tensors) + assert value_img == value_img_batch - batch_tensors = self._create_data_batch(120, 100, num_samples=4, device=self.device).float() - self._test_fn_on_batch(batch_tensors, F_t._rgb2hsv) - def test_rgb_to_grayscale(self): - script_rgb_to_grayscale = torch.jit.script(F.rgb_to_grayscale) - - img_tensor, pil_img = self._create_data(32, 34, device=self.device) - - for num_output_channels in (3, 1): - gray_pil_image = F.rgb_to_grayscale(pil_img, num_output_channels=num_output_channels) - gray_tensor = F.rgb_to_grayscale(img_tensor, num_output_channels=num_output_channels) - - self.approxEqualTensorToPIL(gray_tensor.float(), gray_pil_image, tol=1.0 + 1e-10, agg_method="max") - - s_gray_tensor = script_rgb_to_grayscale(img_tensor, num_output_channels=num_output_channels) - assert_equal(s_gray_tensor, gray_tensor) - - batch_tensors = self._create_data_batch(16, 18, num_samples=4, device=self.device) - self._test_fn_on_batch(batch_tensors, F.rgb_to_grayscale, num_output_channels=num_output_channels) - - def test_center_crop(self): - script_center_crop = torch.jit.script(F.center_crop) - - img_tensor, pil_img = self._create_data(32, 34, device=self.device) - - cropped_pil_image = F.center_crop(pil_img, [10, 11]) - - cropped_tensor = F.center_crop(img_tensor, [10, 11]) - self.compareTensorToPIL(cropped_tensor, cropped_pil_image) - - cropped_tensor = script_center_crop(img_tensor, [10, 11]) - self.compareTensorToPIL(cropped_tensor, cropped_pil_image) - - batch_tensors = self._create_data_batch(16, 18, num_samples=4, device=self.device) - self._test_fn_on_batch(batch_tensors, F.center_crop, output_size=[10, 11]) +@needs_cuda +def test_scale_channel(): + """Make sure that _scale_channel gives the same results on CPU and GPU as + histc or bincount are used depending on the device. + """ + # TODO: when # https://github.com/pytorch/pytorch/issues/53194 is fixed, + # only use bincount and remove that test. + size = (1_000,) + img_chan = torch.randint(0, 256, size=size).to("cpu") + scaled_cpu = F_t._scale_channel(img_chan) + scaled_cuda = F_t._scale_channel(img_chan.to("cuda")) + assert_equal(scaled_cpu, scaled_cuda.to("cpu")) + + +class TestRotate: + + ALL_DTYPES = [None, torch.float32, torch.float64, torch.float16] + scripted_rotate = torch.jit.script(F.rotate) + IMG_W = 26 + + @pytest.mark.parametrize("device", cpu_and_cuda()) + @pytest.mark.parametrize("height, width", [(7, 33), (26, IMG_W), (32, IMG_W)]) + @pytest.mark.parametrize( + "center", + [ + None, + (int(IMG_W * 0.3), int(IMG_W * 0.4)), + [int(IMG_W * 0.5), int(IMG_W * 0.6)], + ], + ) + @pytest.mark.parametrize("dt", ALL_DTYPES) + @pytest.mark.parametrize("angle", range(-180, 180, 34)) + @pytest.mark.parametrize("expand", [True, False]) + @pytest.mark.parametrize( + "fill", + [ + None, + [0, 0, 0], + (1, 2, 3), + [255, 255, 255], + [ + 1, + ], + (2.0,), + ], + ) + @pytest.mark.parametrize("fn", [F.rotate, scripted_rotate]) + def test_rotate(self, device, height, width, center, dt, angle, expand, fill, fn): + tensor, pil_img = _create_data(height, width, device=device) - def test_five_crop(self): - script_five_crop = torch.jit.script(F.five_crop) + if dt == torch.float16 and torch.device(device).type == "cpu": + # skip float16 on CPU case + return - img_tensor, pil_img = self._create_data(32, 34, device=self.device) + if dt is not None: + tensor = tensor.to(dtype=dt) - cropped_pil_images = F.five_crop(pil_img, [10, 11]) + f_pil = int(fill[0]) if fill is not None and len(fill) == 1 else fill + out_pil_img = F.rotate(pil_img, angle=angle, interpolation=NEAREST, expand=expand, center=center, fill=f_pil) + out_pil_tensor = torch.from_numpy(np.array(out_pil_img).transpose((2, 0, 1))) - cropped_tensors = F.five_crop(img_tensor, [10, 11]) - for i in range(5): - self.compareTensorToPIL(cropped_tensors[i], cropped_pil_images[i]) + out_tensor = fn(tensor, angle=angle, interpolation=NEAREST, expand=expand, center=center, fill=fill).cpu() - cropped_tensors = script_five_crop(img_tensor, [10, 11]) - for i in range(5): - self.compareTensorToPIL(cropped_tensors[i], cropped_pil_images[i]) + if out_tensor.dtype != torch.uint8: + out_tensor = out_tensor.to(torch.uint8) - batch_tensors = self._create_data_batch(16, 18, num_samples=4, device=self.device) - tuple_transformed_batches = F.five_crop(batch_tensors, [10, 11]) - for i in range(len(batch_tensors)): - img_tensor = batch_tensors[i, ...] - tuple_transformed_imgs = F.five_crop(img_tensor, [10, 11]) - self.assertEqual(len(tuple_transformed_imgs), len(tuple_transformed_batches)) + assert ( + out_tensor.shape == out_pil_tensor.shape + ), f"{(height, width, NEAREST, dt, angle, expand, center)}: {out_tensor.shape} vs {out_pil_tensor.shape}" - for j in range(len(tuple_transformed_imgs)): - true_transformed_img = tuple_transformed_imgs[j] - transformed_img = tuple_transformed_batches[j][i, ...] - assert_equal(true_transformed_img, transformed_img) + num_diff_pixels = (out_tensor != out_pil_tensor).sum().item() / 3.0 + ratio_diff_pixels = num_diff_pixels / out_tensor.shape[-1] / out_tensor.shape[-2] + # Tolerance : less than 3% of different pixels + assert ratio_diff_pixels < 0.03, ( + f"{(height, width, NEAREST, dt, angle, expand, center, fill)}: " + f"{ratio_diff_pixels}\n{out_tensor[0, :7, :7]} vs \n" + f"{out_pil_tensor[0, :7, :7]}" + ) - # scriptable function test - s_tuple_transformed_batches = script_five_crop(batch_tensors, [10, 11]) - for transformed_batch, s_transformed_batch in zip(tuple_transformed_batches, s_tuple_transformed_batches): - assert_equal(transformed_batch, s_transformed_batch) - - def test_ten_crop(self): - script_ten_crop = torch.jit.script(F.ten_crop) - - img_tensor, pil_img = self._create_data(32, 34, device=self.device) + @pytest.mark.parametrize("device", cpu_and_cuda()) + @pytest.mark.parametrize("dt", ALL_DTYPES) + def test_rotate_batch(self, device, dt): + if dt == torch.float16 and device == "cpu": + # skip float16 on CPU case + return - cropped_pil_images = F.ten_crop(pil_img, [10, 11]) + batch_tensors = _create_data_batch(26, 36, num_samples=4, device=device) + if dt is not None: + batch_tensors = batch_tensors.to(dtype=dt) - cropped_tensors = F.ten_crop(img_tensor, [10, 11]) - for i in range(10): - self.compareTensorToPIL(cropped_tensors[i], cropped_pil_images[i]) + center = (20, 22) + _test_fn_on_batch(batch_tensors, F.rotate, angle=32, interpolation=NEAREST, expand=True, center=center) - cropped_tensors = script_ten_crop(img_tensor, [10, 11]) - for i in range(10): - self.compareTensorToPIL(cropped_tensors[i], cropped_pil_images[i]) + def test_rotate_interpolation_type(self): + tensor, _ = _create_data(26, 26) + res1 = F.rotate(tensor, 45, interpolation=PIL.Image.BILINEAR) + res2 = F.rotate(tensor, 45, interpolation=BILINEAR) + assert_equal(res1, res2) - batch_tensors = self._create_data_batch(16, 18, num_samples=4, device=self.device) - tuple_transformed_batches = F.ten_crop(batch_tensors, [10, 11]) - for i in range(len(batch_tensors)): - img_tensor = batch_tensors[i, ...] - tuple_transformed_imgs = F.ten_crop(img_tensor, [10, 11]) - self.assertEqual(len(tuple_transformed_imgs), len(tuple_transformed_batches)) - for j in range(len(tuple_transformed_imgs)): - true_transformed_img = tuple_transformed_imgs[j] - transformed_img = tuple_transformed_batches[j][i, ...] - assert_equal(true_transformed_img, transformed_img) +class TestAffine: - # scriptable function test - s_tuple_transformed_batches = script_ten_crop(batch_tensors, [10, 11]) - for transformed_batch, s_transformed_batch in zip(tuple_transformed_batches, s_tuple_transformed_batches): - assert_equal(transformed_batch, s_transformed_batch) + ALL_DTYPES = [None, torch.float32, torch.float64, torch.float16] + scripted_affine = torch.jit.script(F.affine) - def test_pad(self): - script_fn = torch.jit.script(F.pad) - tensor, pil_img = self._create_data(7, 8, device=self.device) - batch_tensors = self._create_data_batch(16, 18, num_samples=4, device=self.device) + @pytest.mark.parametrize("device", cpu_and_cuda()) + @pytest.mark.parametrize("height, width", [(26, 26), (32, 26)]) + @pytest.mark.parametrize("dt", ALL_DTYPES) + def test_identity_map(self, device, height, width, dt): + # Tests on square and rectangular images + tensor, pil_img = _create_data(height, width, device=device) - for dt in [None, torch.float32, torch.float64, torch.float16]: - - if dt == torch.float16 and torch.device(self.device).type == "cpu": - # skip float16 on CPU case - continue - - if dt is not None: - # This is a trivial cast to float of uint8 data to test all cases - tensor = tensor.to(dt) - batch_tensors = batch_tensors.to(dt) - - for pad in [2, [3, ], [0, 3], (3, 3), [4, 2, 4, 3]]: - configs = [ - {"padding_mode": "constant", "fill": 0}, - {"padding_mode": "constant", "fill": 10}, - {"padding_mode": "constant", "fill": 20}, - {"padding_mode": "edge"}, - {"padding_mode": "reflect"}, - {"padding_mode": "symmetric"}, - ] - for kwargs in configs: - pad_tensor = F_t.pad(tensor, pad, **kwargs) - pad_pil_img = F_pil.pad(pil_img, pad, **kwargs) - - pad_tensor_8b = pad_tensor - # we need to cast to uint8 to compare with PIL image - if pad_tensor_8b.dtype != torch.uint8: - pad_tensor_8b = pad_tensor_8b.to(torch.uint8) - - self.compareTensorToPIL(pad_tensor_8b, pad_pil_img, msg="{}, {}".format(pad, kwargs)) - - if isinstance(pad, int): - script_pad = [pad, ] - else: - script_pad = pad - pad_tensor_script = script_fn(tensor, script_pad, **kwargs) - assert_equal(pad_tensor, pad_tensor_script, msg="{}, {}".format(pad, kwargs)) - - self._test_fn_on_batch(batch_tensors, F.pad, padding=script_pad, **kwargs) - - def test_resized_crop(self): - # test values of F.resized_crop in several cases: - # 1) resize to the same size, crop to the same size => should be identity - tensor, _ = self._create_data(26, 36, device=self.device) - - for mode in [NEAREST, BILINEAR, BICUBIC]: - out_tensor = F.resized_crop(tensor, top=0, left=0, height=26, width=36, size=[26, 36], interpolation=mode) - assert_equal(tensor, out_tensor, msg="{} vs {}".format(out_tensor[0, :5, :5], tensor[0, :5, :5])) - - # 2) resize by half and crop a TL corner - tensor, _ = self._create_data(26, 36, device=self.device) - out_tensor = F.resized_crop(tensor, top=0, left=0, height=20, width=30, size=[10, 15], interpolation=NEAREST) - expected_out_tensor = tensor[:, :20:2, :30:2] - assert_equal( - expected_out_tensor, - out_tensor, - check_stride=False, - msg="{} vs {}".format(expected_out_tensor[0, :10, :10], out_tensor[0, :10, :10]), - ) + if dt == torch.float16 and device == "cpu": + # skip float16 on CPU case + return - batch_tensors = self._create_data_batch(26, 36, num_samples=4, device=self.device) - self._test_fn_on_batch( - batch_tensors, F.resized_crop, top=1, left=2, height=20, width=30, size=[10, 15], interpolation=NEAREST - ) + if dt is not None: + tensor = tensor.to(dtype=dt) - def _test_affine_identity_map(self, tensor, scripted_affine): # 1) identity map out_tensor = F.affine(tensor, angle=0, translate=[0, 0], scale=1.0, shear=[0.0, 0.0], interpolation=NEAREST) - assert_equal(tensor, out_tensor, msg="{} vs {}".format(out_tensor[0, :5, :5], tensor[0, :5, :5])) - out_tensor = scripted_affine( + assert_equal(tensor, out_tensor, msg=f"{out_tensor[0, :5, :5]} vs {tensor[0, :5, :5]}") + out_tensor = self.scripted_affine( tensor, angle=0, translate=[0, 0], scale=1.0, shear=[0.0, 0.0], interpolation=NEAREST ) - assert_equal(tensor, out_tensor, msg="{} vs {}".format(out_tensor[0, :5, :5], tensor[0, :5, :5])) - - def _test_affine_square_rotations(self, tensor, pil_img, scripted_affine): - # 2) Test rotation - test_configs = [ - (90, torch.rot90(tensor, k=1, dims=(-1, -2))), + assert_equal(tensor, out_tensor, msg=f"{out_tensor[0, :5, :5]} vs {tensor[0, :5, :5]}") + + @pytest.mark.parametrize("device", cpu_and_cuda()) + @pytest.mark.parametrize("height, width", [(26, 26)]) + @pytest.mark.parametrize("dt", ALL_DTYPES) + @pytest.mark.parametrize( + "angle, config", + [ + (90, {"k": 1, "dims": (-1, -2)}), (45, None), (30, None), (-30, None), (-45, None), - (-90, torch.rot90(tensor, k=-1, dims=(-1, -2))), - (180, torch.rot90(tensor, k=2, dims=(-1, -2))), - ] - for a, true_tensor in test_configs: - out_pil_img = F.affine( - pil_img, angle=a, translate=[0, 0], scale=1.0, shear=[0.0, 0.0], interpolation=NEAREST - ) - out_pil_tensor = torch.from_numpy(np.array(out_pil_img).transpose((2, 0, 1))).to(self.device) - - for fn in [F.affine, scripted_affine]: - out_tensor = fn( - tensor, angle=a, translate=[0, 0], scale=1.0, shear=[0.0, 0.0], interpolation=NEAREST - ) - if true_tensor is not None: - assert_equal( - true_tensor, - out_tensor, - msg="{}\n{} vs \n{}".format(a, out_tensor[0, :5, :5], true_tensor[0, :5, :5]), - check_stride=False, - ) - - if out_tensor.dtype != torch.uint8: - out_tensor = out_tensor.to(torch.uint8) - - num_diff_pixels = (out_tensor != out_pil_tensor).sum().item() / 3.0 - ratio_diff_pixels = num_diff_pixels / out_tensor.shape[-1] / out_tensor.shape[-2] - # Tolerance : less than 6% of different pixels - self.assertLess( - ratio_diff_pixels, - 0.06, - msg="{}\n{} vs \n{}".format( - ratio_diff_pixels, out_tensor[0, :7, :7], out_pil_tensor[0, :7, :7] - ) - ) - - def _test_affine_rect_rotations(self, tensor, pil_img, scripted_affine): - test_configs = [ - 90, 45, 15, -30, -60, -120 - ] - for a in test_configs: + (-90, {"k": -1, "dims": (-1, -2)}), + (180, {"k": 2, "dims": (-1, -2)}), + ], + ) + @pytest.mark.parametrize("fn", [F.affine, scripted_affine]) + def test_square_rotations(self, device, height, width, dt, angle, config, fn): + # 2) Test rotation + tensor, pil_img = _create_data(height, width, device=device) - out_pil_img = F.affine( - pil_img, angle=a, translate=[0, 0], scale=1.0, shear=[0.0, 0.0], interpolation=NEAREST - ) - out_pil_tensor = torch.from_numpy(np.array(out_pil_img).transpose((2, 0, 1))) - - for fn in [F.affine, scripted_affine]: - out_tensor = fn( - tensor, angle=a, translate=[0, 0], scale=1.0, shear=[0.0, 0.0], interpolation=NEAREST - ).cpu() - - if out_tensor.dtype != torch.uint8: - out_tensor = out_tensor.to(torch.uint8) - - num_diff_pixels = (out_tensor != out_pil_tensor).sum().item() / 3.0 - ratio_diff_pixels = num_diff_pixels / out_tensor.shape[-1] / out_tensor.shape[-2] - # Tolerance : less than 3% of different pixels - self.assertLess( - ratio_diff_pixels, - 0.03, - msg="{}: {}\n{} vs \n{}".format( - a, ratio_diff_pixels, out_tensor[0, :7, :7], out_pil_tensor[0, :7, :7] - ) - ) - - def _test_affine_translations(self, tensor, pil_img, scripted_affine): + if dt == torch.float16 and device == "cpu": + # skip float16 on CPU case + return + + if dt is not None: + tensor = tensor.to(dtype=dt) + + out_pil_img = F.affine( + pil_img, angle=angle, translate=[0, 0], scale=1.0, shear=[0.0, 0.0], interpolation=NEAREST + ) + out_pil_tensor = torch.from_numpy(np.array(out_pil_img).transpose((2, 0, 1))).to(device) + + out_tensor = fn(tensor, angle=angle, translate=[0, 0], scale=1.0, shear=[0.0, 0.0], interpolation=NEAREST) + if config is not None: + assert_equal(torch.rot90(tensor, **config), out_tensor) + + if out_tensor.dtype != torch.uint8: + out_tensor = out_tensor.to(torch.uint8) + + num_diff_pixels = (out_tensor != out_pil_tensor).sum().item() / 3.0 + ratio_diff_pixels = num_diff_pixels / out_tensor.shape[-1] / out_tensor.shape[-2] + # Tolerance : less than 6% of different pixels + assert ratio_diff_pixels < 0.06 + + @pytest.mark.parametrize("device", cpu_and_cuda()) + @pytest.mark.parametrize("height, width", [(32, 26)]) + @pytest.mark.parametrize("dt", ALL_DTYPES) + @pytest.mark.parametrize("angle", [90, 45, 15, -30, -60, -120]) + @pytest.mark.parametrize("fn", [F.affine, scripted_affine]) + @pytest.mark.parametrize("center", [None, [0, 0]]) + def test_rect_rotations(self, device, height, width, dt, angle, fn, center): + # Tests on rectangular images + tensor, pil_img = _create_data(height, width, device=device) + + if dt == torch.float16 and device == "cpu": + # skip float16 on CPU case + return + + if dt is not None: + tensor = tensor.to(dtype=dt) + + out_pil_img = F.affine( + pil_img, angle=angle, translate=[0, 0], scale=1.0, shear=[0.0, 0.0], interpolation=NEAREST, center=center + ) + out_pil_tensor = torch.from_numpy(np.array(out_pil_img).transpose((2, 0, 1))) + + out_tensor = fn( + tensor, angle=angle, translate=[0, 0], scale=1.0, shear=[0.0, 0.0], interpolation=NEAREST, center=center + ).cpu() + + if out_tensor.dtype != torch.uint8: + out_tensor = out_tensor.to(torch.uint8) + + num_diff_pixels = (out_tensor != out_pil_tensor).sum().item() / 3.0 + ratio_diff_pixels = num_diff_pixels / out_tensor.shape[-1] / out_tensor.shape[-2] + # Tolerance : less than 3% of different pixels + assert ratio_diff_pixels < 0.03 + + @pytest.mark.parametrize("device", cpu_and_cuda()) + @pytest.mark.parametrize("height, width", [(26, 26), (32, 26)]) + @pytest.mark.parametrize("dt", ALL_DTYPES) + @pytest.mark.parametrize("t", [[10, 12], (-12, -13)]) + @pytest.mark.parametrize("fn", [F.affine, scripted_affine]) + def test_translations(self, device, height, width, dt, t, fn): # 3) Test translation - test_configs = [ - [10, 12], (-12, -13) - ] - for t in test_configs: + tensor, pil_img = _create_data(height, width, device=device) + + if dt == torch.float16 and device == "cpu": + # skip float16 on CPU case + return + + if dt is not None: + tensor = tensor.to(dtype=dt) - out_pil_img = F.affine(pil_img, angle=0, translate=t, scale=1.0, shear=[0.0, 0.0], interpolation=NEAREST) + out_pil_img = F.affine(pil_img, angle=0, translate=t, scale=1.0, shear=[0.0, 0.0], interpolation=NEAREST) - for fn in [F.affine, scripted_affine]: - out_tensor = fn(tensor, angle=0, translate=t, scale=1.0, shear=[0.0, 0.0], interpolation=NEAREST) + out_tensor = fn(tensor, angle=0, translate=t, scale=1.0, shear=[0.0, 0.0], interpolation=NEAREST) - if out_tensor.dtype != torch.uint8: - out_tensor = out_tensor.to(torch.uint8) + if out_tensor.dtype != torch.uint8: + out_tensor = out_tensor.to(torch.uint8) - self.compareTensorToPIL(out_tensor, out_pil_img) + _assert_equal_tensor_to_pil(out_tensor, out_pil_img) - def _test_affine_all_ops(self, tensor, pil_img, scripted_affine): - # 4) Test rotation + translation + scale + share - test_configs = [ + @pytest.mark.parametrize("device", cpu_and_cuda()) + @pytest.mark.parametrize("height, width", [(26, 26), (32, 26)]) + @pytest.mark.parametrize("dt", ALL_DTYPES) + @pytest.mark.parametrize( + "a, t, s, sh, f", + [ (45.5, [5, 6], 1.0, [0.0, 0.0], None), (33, (5, -4), 1.0, [0.0, 0.0], [0, 0, 0]), (45, [-5, 4], 1.2, [0.0, 0.0], (1, 2, 3)), (33, (-4, -8), 2.0, [0.0, 0.0], [255, 255, 255]), - (85, (10, -10), 0.7, [0.0, 0.0], [1, ]), - (0, [0, 0], 1.0, [35.0, ], (2.0, )), + (85, (10, -10), 0.7, [0.0, 0.0], [1]), + (0, [0, 0], 1.0, [35.0], (2.0,)), (-25, [0, 0], 1.2, [0.0, 15.0], None), (-45, [-10, 0], 0.7, [2.0, 5.0], None), (-45, [-10, -10], 1.2, [4.0, 5.0], None), (-90, [0, 0], 1.0, [0.0, 0.0], None), - ] - for r in [NEAREST, ]: - for a, t, s, sh, f in test_configs: - f_pil = int(f[0]) if f is not None and len(f) == 1 else f - out_pil_img = F.affine(pil_img, angle=a, translate=t, scale=s, shear=sh, interpolation=r, fill=f_pil) - out_pil_tensor = torch.from_numpy(np.array(out_pil_img).transpose((2, 0, 1))) - - for fn in [F.affine, scripted_affine]: - out_tensor = fn(tensor, angle=a, translate=t, scale=s, shear=sh, interpolation=r, fill=f).cpu() - - if out_tensor.dtype != torch.uint8: - out_tensor = out_tensor.to(torch.uint8) - - num_diff_pixels = (out_tensor != out_pil_tensor).sum().item() / 3.0 - ratio_diff_pixels = num_diff_pixels / out_tensor.shape[-1] / out_tensor.shape[-2] - # Tolerance : less than 5% (cpu), 6% (cuda) of different pixels - tol = 0.06 if self.device == "cuda" else 0.05 - self.assertLess( - ratio_diff_pixels, - tol, - msg="{}: {}\n{} vs \n{}".format( - (r, a, t, s, sh, f), ratio_diff_pixels, out_tensor[0, :7, :7], out_pil_tensor[0, :7, :7] - ) - ) - - def test_affine(self): - # Tests on square and rectangular images - scripted_affine = torch.jit.script(F.affine) - - data = [self._create_data(26, 26, device=self.device), self._create_data(32, 26, device=self.device)] - for tensor, pil_img in data: - - for dt in [None, torch.float32, torch.float64, torch.float16]: - - if dt == torch.float16 and torch.device(self.device).type == "cpu": - # skip float16 on CPU case - continue - - if dt is not None: - tensor = tensor.to(dtype=dt) - - self._test_affine_identity_map(tensor, scripted_affine) - if pil_img.size[0] == pil_img.size[1]: - self._test_affine_square_rotations(tensor, pil_img, scripted_affine) - else: - self._test_affine_rect_rotations(tensor, pil_img, scripted_affine) - self._test_affine_translations(tensor, pil_img, scripted_affine) - self._test_affine_all_ops(tensor, pil_img, scripted_affine) - - batch_tensors = self._create_data_batch(26, 36, num_samples=4, device=self.device) - if dt is not None: - batch_tensors = batch_tensors.to(dtype=dt) - - self._test_fn_on_batch( - batch_tensors, F.affine, angle=-43, translate=[-3, 4], scale=1.2, shear=[4.0, 5.0] - ) - - tensor, pil_img = data[0] - # assert deprecation warning and non-BC - with self.assertWarnsRegex(UserWarning, r"Argument resample is deprecated and will be removed"): - res1 = F.affine(tensor, 45, translate=[0, 0], scale=1.0, shear=[0.0, 0.0], resample=2) - res2 = F.affine(tensor, 45, translate=[0, 0], scale=1.0, shear=[0.0, 0.0], interpolation=BILINEAR) - assert_equal(res1, res2) - - # assert changed type warning - with self.assertWarnsRegex(UserWarning, r"Argument interpolation should be of type InterpolationMode"): - res1 = F.affine(tensor, 45, translate=[0, 0], scale=1.0, shear=[0.0, 0.0], interpolation=2) - res2 = F.affine(tensor, 45, translate=[0, 0], scale=1.0, shear=[0.0, 0.0], interpolation=BILINEAR) - assert_equal(res1, res2) - - with self.assertWarnsRegex(UserWarning, r"Argument fillcolor is deprecated and will be removed"): - res1 = F.affine(pil_img, 45, translate=[0, 0], scale=1.0, shear=[0.0, 0.0], fillcolor=10) - res2 = F.affine(pil_img, 45, translate=[0, 0], scale=1.0, shear=[0.0, 0.0], fill=10) - # we convert the PIL images to numpy as assert_equal doesn't work on PIL images. - assert_equal(np.asarray(res1), np.asarray(res2)) - - def _test_rotate_all_options(self, tensor, pil_img, scripted_rotate, centers): - img_size = pil_img.size - dt = tensor.dtype - for r in [NEAREST, ]: - for a in range(-180, 180, 17): - for e in [True, False]: - for c in centers: - for f in [None, [0, 0, 0], (1, 2, 3), [255, 255, 255], [1, ], (2.0, )]: - f_pil = int(f[0]) if f is not None and len(f) == 1 else f - out_pil_img = F.rotate(pil_img, angle=a, interpolation=r, expand=e, center=c, fill=f_pil) - out_pil_tensor = torch.from_numpy(np.array(out_pil_img).transpose((2, 0, 1))) - for fn in [F.rotate, scripted_rotate]: - out_tensor = fn(tensor, angle=a, interpolation=r, expand=e, center=c, fill=f).cpu() - - if out_tensor.dtype != torch.uint8: - out_tensor = out_tensor.to(torch.uint8) - - self.assertEqual( - out_tensor.shape, - out_pil_tensor.shape, - msg="{}: {} vs {}".format( - (img_size, r, dt, a, e, c), out_tensor.shape, out_pil_tensor.shape - )) - - num_diff_pixels = (out_tensor != out_pil_tensor).sum().item() / 3.0 - ratio_diff_pixels = num_diff_pixels / out_tensor.shape[-1] / out_tensor.shape[-2] - # Tolerance : less than 3% of different pixels - self.assertLess( - ratio_diff_pixels, - 0.03, - msg="{}: {}\n{} vs \n{}".format( - (img_size, r, dt, a, e, c, f), - ratio_diff_pixels, - out_tensor[0, :7, :7], - out_pil_tensor[0, :7, :7] - ) - ) - - def test_rotate(self): - # Tests on square image - scripted_rotate = torch.jit.script(F.rotate) - - data = [self._create_data(26, 26, device=self.device), self._create_data(32, 26, device=self.device)] - for tensor, pil_img in data: - - img_size = pil_img.size - centers = [ - None, - (int(img_size[0] * 0.3), int(img_size[0] * 0.4)), - [int(img_size[0] * 0.5), int(img_size[0] * 0.6)] - ] - - for dt in [None, torch.float32, torch.float64, torch.float16]: - - if dt == torch.float16 and torch.device(self.device).type == "cpu": - # skip float16 on CPU case - continue - - if dt is not None: - tensor = tensor.to(dtype=dt) - - self._test_rotate_all_options(tensor, pil_img, scripted_rotate, centers) - - batch_tensors = self._create_data_batch(26, 36, num_samples=4, device=self.device) - if dt is not None: - batch_tensors = batch_tensors.to(dtype=dt) - - center = (20, 22) - self._test_fn_on_batch( - batch_tensors, F.rotate, angle=32, interpolation=NEAREST, expand=True, center=center - ) - tensor, pil_img = data[0] - # assert deprecation warning and non-BC - with self.assertWarnsRegex(UserWarning, r"Argument resample is deprecated and will be removed"): - res1 = F.rotate(tensor, 45, resample=2) - res2 = F.rotate(tensor, 45, interpolation=BILINEAR) - assert_equal(res1, res2) - - # assert changed type warning - with self.assertWarnsRegex(UserWarning, r"Argument interpolation should be of type InterpolationMode"): - res1 = F.rotate(tensor, 45, interpolation=2) - res2 = F.rotate(tensor, 45, interpolation=BILINEAR) - assert_equal(res1, res2) - - def test_gaussian_blur(self): - small_image_tensor = torch.from_numpy( - np.arange(3 * 10 * 12, dtype="uint8").reshape((10, 12, 3)) - ).permute(2, 0, 1).to(self.device) - - large_image_tensor = torch.from_numpy( - np.arange(26 * 28, dtype="uint8").reshape((1, 26, 28)) - ).to(self.device) - - scripted_transform = torch.jit.script(F.gaussian_blur) - - # true_cv2_results = { - # # np_img = np.arange(3 * 10 * 12, dtype="uint8").reshape((10, 12, 3)) - # # cv2.GaussianBlur(np_img, ksize=(3, 3), sigmaX=0.8) - # "3_3_0.8": ... - # # cv2.GaussianBlur(np_img, ksize=(3, 3), sigmaX=0.5) - # "3_3_0.5": ... - # # cv2.GaussianBlur(np_img, ksize=(3, 5), sigmaX=0.8) - # "3_5_0.8": ... - # # cv2.GaussianBlur(np_img, ksize=(3, 5), sigmaX=0.5) - # "3_5_0.5": ... - # # np_img2 = np.arange(26 * 28, dtype="uint8").reshape((26, 28)) - # # cv2.GaussianBlur(np_img2, ksize=(23, 23), sigmaX=1.7) - # "23_23_1.7": ... - # } - p = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'assets', 'gaussian_blur_opencv_results.pt') - true_cv2_results = torch.load(p) - - for tensor in [small_image_tensor, large_image_tensor]: - - for dt in [None, torch.float32, torch.float64, torch.float16]: - if dt == torch.float16 and torch.device(self.device).type == "cpu": - # skip float16 on CPU case - continue - - if dt is not None: - tensor = tensor.to(dtype=dt) - - for ksize in [(3, 3), [3, 5], (23, 23)]: - for sigma in [[0.5, 0.5], (0.5, 0.5), (0.8, 0.8), (1.7, 1.7)]: - - _ksize = (ksize, ksize) if isinstance(ksize, int) else ksize - _sigma = sigma[0] if sigma is not None else None - shape = tensor.shape - gt_key = "{}_{}_{}__{}_{}_{}".format( - shape[-2], shape[-1], shape[-3], - _ksize[0], _ksize[1], _sigma - ) - if gt_key not in true_cv2_results: - continue - - true_out = torch.tensor( - true_cv2_results[gt_key] - ).reshape(shape[-2], shape[-1], shape[-3]).permute(2, 0, 1).to(tensor) - - for fn in [F.gaussian_blur, scripted_transform]: - out = fn(tensor, kernel_size=ksize, sigma=sigma) - torch.testing.assert_close( - out, true_out, rtol=0.0, atol=1.0, check_stride=False, - msg="{}, {}".format(ksize, sigma) - ) - - -@unittest.skipIf(not torch.cuda.is_available(), reason="Skip if no CUDA device") -class CUDATester(Tester): - - def setUp(self): - self.device = "cuda" - - def test_scale_channel(self): - """Make sure that _scale_channel gives the same results on CPU and GPU as - histc or bincount are used depending on the device. - """ - # TODO: when # https://github.com/pytorch/pytorch/issues/53194 is fixed, - # only use bincount and remove that test. - size = (1_000,) - img_chan = torch.randint(0, 256, size=size).to('cpu') - scaled_cpu = F_t._scale_channel(img_chan) - scaled_cuda = F_t._scale_channel(img_chan.to('cuda')) - assert_equal(scaled_cpu, scaled_cuda.to('cpu')) + ], + ) + @pytest.mark.parametrize("fn", [F.affine, scripted_affine]) + def test_all_ops(self, device, height, width, dt, a, t, s, sh, f, fn): + # 4) Test rotation + translation + scale + shear + tensor, pil_img = _create_data(height, width, device=device) + + if dt == torch.float16 and device == "cpu": + # skip float16 on CPU case + return + + if dt is not None: + tensor = tensor.to(dtype=dt) + + f_pil = int(f[0]) if f is not None and len(f) == 1 else f + out_pil_img = F.affine(pil_img, angle=a, translate=t, scale=s, shear=sh, interpolation=NEAREST, fill=f_pil) + out_pil_tensor = torch.from_numpy(np.array(out_pil_img).transpose((2, 0, 1))) + + out_tensor = fn(tensor, angle=a, translate=t, scale=s, shear=sh, interpolation=NEAREST, fill=f).cpu() + + if out_tensor.dtype != torch.uint8: + out_tensor = out_tensor.to(torch.uint8) + + num_diff_pixels = (out_tensor != out_pil_tensor).sum().item() / 3.0 + ratio_diff_pixels = num_diff_pixels / out_tensor.shape[-1] / out_tensor.shape[-2] + # Tolerance : less than 5% (cpu), 6% (cuda) of different pixels + tol = 0.06 if device == "cuda" else 0.05 + assert ratio_diff_pixels < tol + + @pytest.mark.parametrize("device", cpu_and_cuda()) + @pytest.mark.parametrize("dt", ALL_DTYPES) + def test_batches(self, device, dt): + if dt == torch.float16 and device == "cpu": + # skip float16 on CPU case + return + + batch_tensors = _create_data_batch(26, 36, num_samples=4, device=device) + if dt is not None: + batch_tensors = batch_tensors.to(dtype=dt) + + _test_fn_on_batch(batch_tensors, F.affine, angle=-43, translate=[-3, 4], scale=1.2, shear=[4.0, 5.0]) + + @pytest.mark.parametrize("device", cpu_and_cuda()) + def test_interpolation_type(self, device): + tensor, pil_img = _create_data(26, 26, device=device) + + res1 = F.affine(tensor, 45, translate=[0, 0], scale=1.0, shear=[0.0, 0.0], interpolation=PIL.Image.BILINEAR) + res2 = F.affine(tensor, 45, translate=[0, 0], scale=1.0, shear=[0.0, 0.0], interpolation=BILINEAR) + assert_equal(res1, res2) def _get_data_dims_and_points_for_perspective(): @@ -723,19 +368,16 @@ def _get_data_dims_and_points_for_perspective(): n = 10 for dim in data_dims: - points += [ - (dim, T.RandomPerspective.get_params(dim[1], dim[0], i / n)) - for i in range(n) - ] + points += [(dim, T.RandomPerspective.get_params(dim[1], dim[0], i / n)) for i in range(n)] return dims_and_points -@pytest.mark.parametrize('device', cpu_and_gpu()) -@pytest.mark.parametrize('dims_and_points', _get_data_dims_and_points_for_perspective()) -@pytest.mark.parametrize('dt', [None, torch.float32, torch.float64, torch.float16]) -@pytest.mark.parametrize('fill', (None, [0, 0, 0], [1, 2, 3], [255, 255, 255], [1, ], (2.0, ))) -@pytest.mark.parametrize('fn', [F.perspective, torch.jit.script(F.perspective)]) -def test_perspective_pil_vs_tensor(device, dims_and_points, dt, fill, fn, tester): +@pytest.mark.parametrize("device", cpu_and_cuda()) +@pytest.mark.parametrize("dims_and_points", _get_data_dims_and_points_for_perspective()) +@pytest.mark.parametrize("dt", [None, torch.float32, torch.float64, torch.float16]) +@pytest.mark.parametrize("fill", (None, [0, 0, 0], [1, 2, 3], [255, 255, 255], [1], (2.0,))) +@pytest.mark.parametrize("fn", [F.perspective, torch.jit.script(F.perspective)]) +def test_perspective_pil_vs_tensor(device, dims_and_points, dt, fill, fn): if dt == torch.float16 and device == "cpu": # skip float16 on CPU case @@ -743,14 +385,15 @@ def test_perspective_pil_vs_tensor(device, dims_and_points, dt, fill, fn, tester data_dims, (spoints, epoints) = dims_and_points - tensor, pil_img = tester._create_data(*data_dims, device=device) + tensor, pil_img = _create_data(*data_dims, device=device) if dt is not None: tensor = tensor.to(dtype=dt) interpolation = NEAREST fill_pil = int(fill[0]) if fill is not None and len(fill) == 1 else fill - out_pil_img = F.perspective(pil_img, startpoints=spoints, endpoints=epoints, interpolation=interpolation, - fill=fill_pil) + out_pil_img = F.perspective( + pil_img, startpoints=spoints, endpoints=epoints, interpolation=interpolation, fill=fill_pil + ) out_pil_tensor = torch.from_numpy(np.array(out_pil_img).transpose((2, 0, 1))) out_tensor = fn(tensor, startpoints=spoints, endpoints=epoints, interpolation=interpolation, fill=fill).cpu() @@ -763,10 +406,10 @@ def test_perspective_pil_vs_tensor(device, dims_and_points, dt, fill, fn, tester assert ratio_diff_pixels < 0.05 -@pytest.mark.parametrize('device', cpu_and_gpu()) -@pytest.mark.parametrize('dims_and_points', _get_data_dims_and_points_for_perspective()) -@pytest.mark.parametrize('dt', [None, torch.float32, torch.float64, torch.float16]) -def test_perspective_batch(device, dims_and_points, dt, tester): +@pytest.mark.parametrize("device", cpu_and_cuda()) +@pytest.mark.parametrize("dims_and_points", _get_data_dims_and_points_for_perspective()) +@pytest.mark.parametrize("dt", [None, torch.float32, torch.float64, torch.float16]) +def test_perspective_batch(device, dims_and_points, dt): if dt == torch.float16 and device == "cpu": # skip float16 on CPU case @@ -774,36 +417,39 @@ def test_perspective_batch(device, dims_and_points, dt, tester): data_dims, (spoints, epoints) = dims_and_points - batch_tensors = tester._create_data_batch(*data_dims, num_samples=4, device=device) + batch_tensors = _create_data_batch(*data_dims, num_samples=4, device=device) if dt is not None: batch_tensors = batch_tensors.to(dtype=dt) # Ignore the equivalence between scripted and regular function on float16 cuda. The pixels at # the border may be entirely different due to small rounding errors. scripted_fn_atol = -1 if (dt == torch.float16 and device == "cuda") else 1e-8 - tester._test_fn_on_batch( - batch_tensors, F.perspective, scripted_fn_atol=scripted_fn_atol, - startpoints=spoints, endpoints=epoints, interpolation=NEAREST + _test_fn_on_batch( + batch_tensors, + F.perspective, + scripted_fn_atol=scripted_fn_atol, + startpoints=spoints, + endpoints=epoints, + interpolation=NEAREST, ) -def test_perspective_interpolation_warning(tester): - # assert changed type warning +def test_perspective_interpolation_type(): spoints = [[0, 0], [33, 0], [33, 25], [0, 25]] epoints = [[3, 2], [32, 3], [30, 24], [2, 25]] tensor = torch.randint(0, 256, (3, 26, 26)) - with tester.assertWarnsRegex(UserWarning, r"Argument interpolation should be of type InterpolationMode"): - res1 = F.perspective(tensor, startpoints=spoints, endpoints=epoints, interpolation=2) - res2 = F.perspective(tensor, startpoints=spoints, endpoints=epoints, interpolation=BILINEAR) - tester.assertTrue(res1.equal(res2)) + + res1 = F.perspective(tensor, startpoints=spoints, endpoints=epoints, interpolation=PIL.Image.BILINEAR) + res2 = F.perspective(tensor, startpoints=spoints, endpoints=epoints, interpolation=BILINEAR) + assert_equal(res1, res2) -@pytest.mark.parametrize('device', cpu_and_gpu()) -@pytest.mark.parametrize('dt', [None, torch.float32, torch.float64, torch.float16]) -@pytest.mark.parametrize('size', [32, 26, [32, ], [32, 32], (32, 32), [26, 35]]) -@pytest.mark.parametrize('max_size', [None, 34, 40, 1000]) -@pytest.mark.parametrize('interpolation', [BILINEAR, BICUBIC, NEAREST]) -def test_resize(device, dt, size, max_size, interpolation, tester): +@pytest.mark.parametrize("device", cpu_and_cuda()) +@pytest.mark.parametrize("dt", [None, torch.float32, torch.float64, torch.float16]) +@pytest.mark.parametrize("size", [32, 26, [32], [32, 32], (32, 32), [26, 35]]) +@pytest.mark.parametrize("max_size", [None, 34, 40, 1000]) +@pytest.mark.parametrize("interpolation", [BILINEAR, BICUBIC, NEAREST, NEAREST_EXACT]) +def test_resize(device, dt, size, max_size, interpolation): if dt == torch.float16 and device == "cpu": # skip float16 on CPU case @@ -814,20 +460,20 @@ def test_resize(device, dt, size, max_size, interpolation, tester): torch.manual_seed(12) script_fn = torch.jit.script(F.resize) - tensor, pil_img = tester._create_data(26, 36, device=device) - batch_tensors = tester._create_data_batch(16, 18, num_samples=4, device=device) + tensor, pil_img = _create_data(26, 36, device=device) + batch_tensors = _create_data_batch(16, 18, num_samples=4, device=device) if dt is not None: # This is a trivial cast to float of uint8 data to test all cases tensor = tensor.to(dt) batch_tensors = batch_tensors.to(dt) - resized_tensor = F.resize(tensor, size=size, interpolation=interpolation, max_size=max_size) - resized_pil_img = F.resize(pil_img, size=size, interpolation=interpolation, max_size=max_size) + resized_tensor = F.resize(tensor, size=size, interpolation=interpolation, max_size=max_size, antialias=True) + resized_pil_img = F.resize(pil_img, size=size, interpolation=interpolation, max_size=max_size, antialias=True) assert resized_tensor.size()[1:] == resized_pil_img.size[::-1] - if interpolation not in [NEAREST, ]: + if interpolation != NEAREST: # We can not check values if mode = NEAREST, as results are different # E.g. resized_tensor = [[a, a, b, c, d, d, e, ...]] # E.g. resized_pil_img = [[a, b, c, c, d, e, f, ...]] @@ -837,32 +483,27 @@ def test_resize(device, dt, size, max_size, interpolation, tester): resized_tensor_f = resized_tensor_f.to(torch.float) # Pay attention to high tolerance for MAE - tester.approxEqualTensorToPIL(resized_tensor_f, resized_pil_img, tol=8.0) + _assert_approx_equal_tensor_to_pil(resized_tensor_f, resized_pil_img, tol=3.0) if isinstance(size, int): - script_size = [size, ] + script_size = [size] else: script_size = size - resize_result = script_fn( - tensor, size=script_size, interpolation=interpolation, max_size=max_size - ) + resize_result = script_fn(tensor, size=script_size, interpolation=interpolation, max_size=max_size, antialias=True) assert_equal(resized_tensor, resize_result) - tester._test_fn_on_batch( - batch_tensors, F.resize, size=script_size, interpolation=interpolation, max_size=max_size + _test_fn_on_batch( + batch_tensors, F.resize, size=script_size, interpolation=interpolation, max_size=max_size, antialias=True ) -@pytest.mark.parametrize('device', cpu_and_gpu()) -def test_resize_asserts(device, tester): - - tensor, pil_img = tester._create_data(26, 36, device=device) +@pytest.mark.parametrize("device", cpu_and_cuda()) +def test_resize_asserts(device): - # assert changed type warning - with pytest.warns(UserWarning, match=r"Argument interpolation should be of type InterpolationMode"): - res1 = F.resize(tensor, size=32, interpolation=2) + tensor, pil_img = _create_data(26, 36, device=device) + res1 = F.resize(tensor, size=32, interpolation=PIL.Image.BILINEAR) res2 = F.resize(tensor, size=32, interpolation=BILINEAR) assert_equal(res1, res2) @@ -874,11 +515,11 @@ def test_resize_asserts(device, tester): F.resize(img, size=32, max_size=32) -@pytest.mark.parametrize('device', cpu_and_gpu()) -@pytest.mark.parametrize('dt', [None, torch.float32, torch.float64, torch.float16]) -@pytest.mark.parametrize('size', [[96, 72], [96, 420], [420, 72]]) -@pytest.mark.parametrize('interpolation', [BILINEAR, BICUBIC]) -def test_resize_antialias(device, dt, size, interpolation, tester): +@pytest.mark.parametrize("device", cpu_and_cuda()) +@pytest.mark.parametrize("dt", [None, torch.float32, torch.float64, torch.float16]) +@pytest.mark.parametrize("size", [[96, 72], [96, 420], [420, 72]]) +@pytest.mark.parametrize("interpolation", [BILINEAR, BICUBIC]) +def test_resize_antialias(device, dt, size, interpolation): if dt == torch.float16 and device == "cpu": # skip float16 on CPU case @@ -886,28 +527,23 @@ def test_resize_antialias(device, dt, size, interpolation, tester): torch.manual_seed(12) script_fn = torch.jit.script(F.resize) - tensor, pil_img = tester._create_data(320, 290, device=device) + tensor, pil_img = _create_data(320, 290, device=device) if dt is not None: # This is a trivial cast to float of uint8 data to test all cases tensor = tensor.to(dt) resized_tensor = F.resize(tensor, size=size, interpolation=interpolation, antialias=True) - resized_pil_img = F.resize(pil_img, size=size, interpolation=interpolation) + resized_pil_img = F.resize(pil_img, size=size, interpolation=interpolation, antialias=True) - tester.assertEqual( - resized_tensor.size()[1:], resized_pil_img.size[::-1], - msg=f"{size}, {interpolation}, {dt}" - ) + assert resized_tensor.size()[1:] == resized_pil_img.size[::-1] resized_tensor_f = resized_tensor # we need to cast to uint8 to compare with PIL image if resized_tensor_f.dtype == torch.uint8: resized_tensor_f = resized_tensor_f.to(torch.float) - tester.approxEqualTensorToPIL( - resized_tensor_f, resized_pil_img, tol=0.5, msg=f"{size}, {interpolation}, {dt}" - ) + _assert_approx_equal_tensor_to_pil(resized_tensor_f, resized_pil_img, tol=0.5, msg=f"{size}, {interpolation}, {dt}") accepted_tol = 1.0 + 1e-5 if interpolation == BICUBIC: @@ -917,41 +553,29 @@ def test_resize_antialias(device, dt, size, interpolation, tester): # match PIL implementation. accepted_tol = 15.0 - tester.approxEqualTensorToPIL( - resized_tensor_f, resized_pil_img, tol=accepted_tol, agg_method="max", - msg=f"{size}, {interpolation}, {dt}" + _assert_approx_equal_tensor_to_pil( + resized_tensor_f, resized_pil_img, tol=accepted_tol, agg_method="max", msg=f"{size}, {interpolation}, {dt}" ) if isinstance(size, int): - script_size = [size, ] + script_size = [ + size, + ] else: script_size = size resize_result = script_fn(tensor, size=script_size, interpolation=interpolation, antialias=True) - tester.assertTrue(resized_tensor.equal(resize_result), msg=f"{size}, {interpolation}, {dt}") - - -@needs_cuda -@pytest.mark.parametrize('interpolation', [BILINEAR, BICUBIC]) -def test_assert_resize_antialias(interpolation, tester): - - # Checks implementation on very large scales - # and catch TORCH_CHECK inside interpolate_aa_kernels.cu - torch.manual_seed(12) - tensor, pil_img = tester._create_data(1000, 1000, device="cuda") - - with pytest.raises(RuntimeError, match=r"Max supported scale factor is"): - F.resize(tensor, size=(5, 5), interpolation=interpolation, antialias=True) - + assert_equal(resized_tensor, resize_result) -def check_functional_vs_PIL_vs_scripted(fn, fn_pil, fn_t, config, device, dtype, tol=2.0 + 1e-10, agg_method="max"): - tester = Tester() +def check_functional_vs_PIL_vs_scripted( + fn, fn_pil, fn_t, config, device, dtype, channels=3, tol=2.0 + 1e-10, agg_method="max" +): script_fn = torch.jit.script(fn) torch.manual_seed(15) - tensor, pil_img = tester._create_data(26, 34, device=device) - batch_tensors = tester._create_data_batch(16, 18, num_samples=4, device=device) + tensor, pil_img = _create_data(26, 34, channels=channels, device=device) + batch_tensors = _create_data_batch(16, 18, num_samples=4, channels=channels, device=device) if dtype is not None: tensor = F.convert_image_dtype(tensor, dtype) @@ -970,7 +594,7 @@ def check_functional_vs_PIL_vs_scripted(fn, fn_pil, fn_t, config, device, dtype, # Check that max difference does not exceed 2 in [0, 255] range # Exact matching is not possible due to incompatibility convert_image_dtype and PIL results - tester.approxEqualTensorToPIL(rbg_tensor.float(), out_pil, tol=tol, agg_method=agg_method) + _assert_approx_equal_tensor_to_pil(rbg_tensor.float(), out_pil, tol=tol, agg_method=agg_method) atol = 1e-6 if out_fn_t.dtype == torch.uint8 and "cuda" in torch.device(device).type: @@ -978,13 +602,14 @@ def check_functional_vs_PIL_vs_scripted(fn, fn_pil, fn_t, config, device, dtype, assert out_fn_t.allclose(out_scripted, atol=atol) # FIXME: fn will be scripted again in _test_fn_on_batch. We could avoid that. - tester._test_fn_on_batch(batch_tensors, fn, scripted_fn_atol=atol, **config) + _test_fn_on_batch(batch_tensors, fn, scripted_fn_atol=atol, **config) -@pytest.mark.parametrize('device', cpu_and_gpu()) -@pytest.mark.parametrize('dtype', (None, torch.float32, torch.float64)) -@pytest.mark.parametrize('config', [{"brightness_factor": f} for f in (0.1, 0.5, 1.0, 1.34, 2.5)]) -def test_adjust_brightness(device, dtype, config): +@pytest.mark.parametrize("device", cpu_and_cuda()) +@pytest.mark.parametrize("dtype", (None, torch.float32, torch.float64)) +@pytest.mark.parametrize("config", [{"brightness_factor": f} for f in (0.1, 0.5, 1.0, 1.34, 2.5)]) +@pytest.mark.parametrize("channels", [1, 3]) +def test_adjust_brightness(device, dtype, config, channels): check_functional_vs_PIL_vs_scripted( F.adjust_brightness, F_pil.adjust_brightness, @@ -992,27 +617,23 @@ def test_adjust_brightness(device, dtype, config): config, device, dtype, + channels, ) -@pytest.mark.parametrize('device', cpu_and_gpu()) -@pytest.mark.parametrize('dtype', (None, torch.float32, torch.float64)) -def test_invert(device, dtype): +@pytest.mark.parametrize("device", cpu_and_cuda()) +@pytest.mark.parametrize("dtype", (None, torch.float32, torch.float64)) +@pytest.mark.parametrize("channels", [1, 3]) +def test_invert(device, dtype, channels): check_functional_vs_PIL_vs_scripted( - F.invert, - F_pil.invert, - F_t.invert, - {}, - device, - dtype, - tol=1.0, - agg_method="max" + F.invert, F_pil.invert, F_t.invert, {}, device, dtype, channels, tol=1.0, agg_method="max" ) -@pytest.mark.parametrize('device', cpu_and_gpu()) -@pytest.mark.parametrize('config', [{"bits": bits} for bits in range(0, 8)]) -def test_posterize(device, config): +@pytest.mark.parametrize("device", cpu_and_cuda()) +@pytest.mark.parametrize("config", [{"bits": bits} for bits in range(0, 8)]) +@pytest.mark.parametrize("channels", [1, 3]) +def test_posterize(device, config, channels): check_functional_vs_PIL_vs_scripted( F.posterize, F_pil.posterize, @@ -1020,14 +641,16 @@ def test_posterize(device, config): config, device, dtype=None, + channels=channels, tol=1.0, agg_method="max", ) -@pytest.mark.parametrize('device', cpu_and_gpu()) -@pytest.mark.parametrize('config', [{"threshold": threshold} for threshold in [0, 64, 128, 192, 255]]) -def test_solarize1(device, config): +@pytest.mark.parametrize("device", cpu_and_cuda()) +@pytest.mark.parametrize("config", [{"threshold": threshold} for threshold in [0, 64, 128, 192, 255]]) +@pytest.mark.parametrize("channels", [1, 3]) +def test_solarize1(device, config, channels): check_functional_vs_PIL_vs_scripted( F.solarize, F_pil.solarize, @@ -1035,15 +658,17 @@ def test_solarize1(device, config): config, device, dtype=None, + channels=channels, tol=1.0, agg_method="max", ) -@pytest.mark.parametrize('device', cpu_and_gpu()) -@pytest.mark.parametrize('dtype', (torch.float32, torch.float64)) -@pytest.mark.parametrize('config', [{"threshold": threshold} for threshold in [0.0, 0.25, 0.5, 0.75, 1.0]]) -def test_solarize2(device, dtype, config): +@pytest.mark.parametrize("device", cpu_and_cuda()) +@pytest.mark.parametrize("dtype", (torch.float32, torch.float64)) +@pytest.mark.parametrize("config", [{"threshold": threshold} for threshold in [0.0, 0.25, 0.5, 0.75, 1.0]]) +@pytest.mark.parametrize("channels", [1, 3]) +def test_solarize2(device, dtype, config, channels): check_functional_vs_PIL_vs_scripted( F.solarize, lambda img, threshold: F_pil.solarize(img, 255 * threshold), @@ -1051,15 +676,55 @@ def test_solarize2(device, dtype, config): config, device, dtype, + channels, tol=1.0, agg_method="max", ) -@pytest.mark.parametrize('device', cpu_and_gpu()) -@pytest.mark.parametrize('dtype', (None, torch.float32, torch.float64)) -@pytest.mark.parametrize('config', [{"sharpness_factor": f} for f in [0.2, 0.5, 1.0, 1.5, 2.0]]) -def test_adjust_sharpness(device, dtype, config): +@pytest.mark.parametrize( + ("dtype", "threshold"), + [ + *[ + (dtype, threshold) + for dtype, threshold in itertools.product( + [torch.float32, torch.float16], + [0.0, 0.25, 0.5, 0.75, 1.0], + ) + ], + *[(torch.uint8, threshold) for threshold in [0, 64, 128, 192, 255]], + *[(torch.int64, threshold) for threshold in [0, 2**32, 2**63 - 1]], + ], +) +@pytest.mark.parametrize("device", cpu_and_cuda()) +def test_solarize_threshold_within_bound(threshold, dtype, device): + make_img = torch.rand if dtype.is_floating_point else partial(torch.randint, 0, torch.iinfo(dtype).max) + img = make_img((3, 12, 23), dtype=dtype, device=device) + F_t.solarize(img, threshold) + + +@pytest.mark.parametrize( + ("dtype", "threshold"), + [ + (torch.float32, 1.5), + (torch.float16, 1.5), + (torch.uint8, 260), + (torch.int64, 2**64), + ], +) +@pytest.mark.parametrize("device", cpu_and_cuda()) +def test_solarize_threshold_above_bound(threshold, dtype, device): + make_img = torch.rand if dtype.is_floating_point else partial(torch.randint, 0, torch.iinfo(dtype).max) + img = make_img((3, 12, 23), dtype=dtype, device=device) + with pytest.raises(TypeError, match="Threshold should be less than bound of img."): + F_t.solarize(img, threshold) + + +@pytest.mark.parametrize("device", cpu_and_cuda()) +@pytest.mark.parametrize("dtype", (None, torch.float32, torch.float64)) +@pytest.mark.parametrize("config", [{"sharpness_factor": f} for f in [0.2, 0.5, 1.0, 1.5, 2.0]]) +@pytest.mark.parametrize("channels", [1, 3]) +def test_adjust_sharpness(device, dtype, config, channels): check_functional_vs_PIL_vs_scripted( F.adjust_sharpness, F_pil.adjust_sharpness, @@ -1067,27 +732,35 @@ def test_adjust_sharpness(device, dtype, config): config, device, dtype, + channels, ) -@pytest.mark.parametrize('device', cpu_and_gpu()) -@pytest.mark.parametrize('dtype', (None, torch.float32, torch.float64)) -def test_autocontrast(device, dtype): +@pytest.mark.parametrize("device", cpu_and_cuda()) +@pytest.mark.parametrize("dtype", (None, torch.float32, torch.float64)) +@pytest.mark.parametrize("channels", [1, 3]) +def test_autocontrast(device, dtype, channels): check_functional_vs_PIL_vs_scripted( - F.autocontrast, - F_pil.autocontrast, - F_t.autocontrast, - {}, - device, - dtype, - tol=1.0, - agg_method="max" + F.autocontrast, F_pil.autocontrast, F_t.autocontrast, {}, device, dtype, channels, tol=1.0, agg_method="max" ) -@pytest.mark.parametrize('device', cpu_and_gpu()) -def test_equalize(device): - torch.set_deterministic(False) +@pytest.mark.parametrize("device", cpu_and_cuda()) +@pytest.mark.parametrize("dtype", (None, torch.float32, torch.float64)) +@pytest.mark.parametrize("channels", [1, 3]) +def test_autocontrast_equal_minmax(device, dtype, channels): + a = _create_data_batch(32, 32, num_samples=1, channels=channels, device=device) + a = a / 2.0 + 0.3 + assert (F.autocontrast(a)[0] == F.autocontrast(a[0])).all() + + a[0, 0] = 0.7 + assert (F.autocontrast(a)[0] == F.autocontrast(a[0])).all() + + +@pytest.mark.parametrize("device", cpu_and_cuda()) +@pytest.mark.parametrize("channels", [1, 3]) +def test_equalize(device, channels): + torch.use_deterministic_algorithms(False) check_functional_vs_PIL_vs_scripted( F.equalize, F_pil.equalize, @@ -1095,59 +768,47 @@ def test_equalize(device): {}, device, dtype=None, + channels=channels, tol=1.0, agg_method="max", ) -@pytest.mark.parametrize('device', cpu_and_gpu()) -@pytest.mark.parametrize('dtype', (None, torch.float32, torch.float64)) -@pytest.mark.parametrize('config', [{"contrast_factor": f} for f in [0.2, 0.5, 1.0, 1.5, 2.0]]) -def test_adjust_contrast(device, dtype, config): +@pytest.mark.parametrize("device", cpu_and_cuda()) +@pytest.mark.parametrize("dtype", (None, torch.float32, torch.float64)) +@pytest.mark.parametrize("config", [{"contrast_factor": f} for f in [0.2, 0.5, 1.0, 1.5, 2.0]]) +@pytest.mark.parametrize("channels", [1, 3]) +def test_adjust_contrast(device, dtype, config, channels): check_functional_vs_PIL_vs_scripted( - F.adjust_contrast, - F_pil.adjust_contrast, - F_t.adjust_contrast, - config, - device, - dtype + F.adjust_contrast, F_pil.adjust_contrast, F_t.adjust_contrast, config, device, dtype, channels ) -@pytest.mark.parametrize('device', cpu_and_gpu()) -@pytest.mark.parametrize('dtype', (None, torch.float32, torch.float64)) -@pytest.mark.parametrize('config', [{"saturation_factor": f} for f in [0.5, 0.75, 1.0, 1.5, 2.0]]) -def test_adjust_saturation(device, dtype, config): +@pytest.mark.parametrize("device", cpu_and_cuda()) +@pytest.mark.parametrize("dtype", (None, torch.float32, torch.float64)) +@pytest.mark.parametrize("config", [{"saturation_factor": f} for f in [0.5, 0.75, 1.0, 1.5, 2.0]]) +@pytest.mark.parametrize("channels", [1, 3]) +def test_adjust_saturation(device, dtype, config, channels): check_functional_vs_PIL_vs_scripted( - F.adjust_saturation, - F_pil.adjust_saturation, - F_t.adjust_saturation, - config, - device, - dtype + F.adjust_saturation, F_pil.adjust_saturation, F_t.adjust_saturation, config, device, dtype, channels ) -@pytest.mark.parametrize('device', cpu_and_gpu()) -@pytest.mark.parametrize('dtype', (None, torch.float32, torch.float64)) -@pytest.mark.parametrize('config', [{"hue_factor": f} for f in [-0.45, -0.25, 0.0, 0.25, 0.45]]) -def test_adjust_hue(device, dtype, config): +@pytest.mark.parametrize("device", cpu_and_cuda()) +@pytest.mark.parametrize("dtype", (None, torch.float32, torch.float64)) +@pytest.mark.parametrize("config", [{"hue_factor": f} for f in [-0.45, -0.25, 0.0, 0.25, 0.45]]) +@pytest.mark.parametrize("channels", [1, 3]) +def test_adjust_hue(device, dtype, config, channels): check_functional_vs_PIL_vs_scripted( - F.adjust_hue, - F_pil.adjust_hue, - F_t.adjust_hue, - config, - device, - dtype, - tol=16.1, - agg_method="max" + F.adjust_hue, F_pil.adjust_hue, F_t.adjust_hue, config, device, dtype, channels, tol=16.1, agg_method="max" ) -@pytest.mark.parametrize('device', cpu_and_gpu()) -@pytest.mark.parametrize('dtype', (None, torch.float32, torch.float64)) -@pytest.mark.parametrize('config', [{"gamma": g1, "gain": g2} for g1, g2 in zip([0.8, 1.0, 1.2], [0.7, 1.0, 1.3])]) -def test_adjust_gamma(device, dtype, config): +@pytest.mark.parametrize("device", cpu_and_cuda()) +@pytest.mark.parametrize("dtype", (None, torch.float32, torch.float64)) +@pytest.mark.parametrize("config", [{"gamma": g1, "gain": g2} for g1, g2 in zip([0.8, 1.0, 1.2], [0.7, 1.0, 1.3])]) +@pytest.mark.parametrize("channels", [1, 3]) +def test_adjust_gamma(device, dtype, config, channels): check_functional_vs_PIL_vs_scripted( F.adjust_gamma, F_pil.adjust_gamma, @@ -1155,8 +816,467 @@ def test_adjust_gamma(device, dtype, config): config, device, dtype, + channels, + ) + + +@pytest.mark.parametrize("device", cpu_and_cuda()) +@pytest.mark.parametrize("dt", [None, torch.float32, torch.float64, torch.float16]) +@pytest.mark.parametrize("pad", [2, [3], [0, 3], (3, 3), [4, 2, 4, 3]]) +@pytest.mark.parametrize( + "config", + [ + {"padding_mode": "constant", "fill": 0}, + {"padding_mode": "constant", "fill": 10}, + {"padding_mode": "constant", "fill": 20.2}, + {"padding_mode": "edge"}, + {"padding_mode": "reflect"}, + {"padding_mode": "symmetric"}, + ], +) +def test_pad(device, dt, pad, config): + script_fn = torch.jit.script(F.pad) + tensor, pil_img = _create_data(7, 8, device=device) + batch_tensors = _create_data_batch(16, 18, num_samples=4, device=device) + + if dt == torch.float16 and device == "cpu": + # skip float16 on CPU case + return + + if dt is not None: + # This is a trivial cast to float of uint8 data to test all cases + tensor = tensor.to(dt) + batch_tensors = batch_tensors.to(dt) + + pad_tensor = F_t.pad(tensor, pad, **config) + pad_pil_img = F_pil.pad(pil_img, pad, **config) + + pad_tensor_8b = pad_tensor + # we need to cast to uint8 to compare with PIL image + if pad_tensor_8b.dtype != torch.uint8: + pad_tensor_8b = pad_tensor_8b.to(torch.uint8) + + _assert_equal_tensor_to_pil(pad_tensor_8b, pad_pil_img, msg=f"{pad}, {config}") + + if isinstance(pad, int): + script_pad = [ + pad, + ] + else: + script_pad = pad + pad_tensor_script = script_fn(tensor, script_pad, **config) + assert_equal(pad_tensor, pad_tensor_script, msg=f"{pad}, {config}") + + _test_fn_on_batch(batch_tensors, F.pad, padding=script_pad, **config) + + +@pytest.mark.parametrize("device", cpu_and_cuda()) +@pytest.mark.parametrize("mode", [NEAREST, NEAREST_EXACT, BILINEAR, BICUBIC]) +def test_resized_crop(device, mode): + # test values of F.resized_crop in several cases: + # 1) resize to the same size, crop to the same size => should be identity + tensor, _ = _create_data(26, 36, device=device) + + out_tensor = F.resized_crop( + tensor, top=0, left=0, height=26, width=36, size=[26, 36], interpolation=mode, antialias=True ) + assert_equal(tensor, out_tensor, msg=f"{out_tensor[0, :5, :5]} vs {tensor[0, :5, :5]}") + + # 2) resize by half and crop a TL corner + tensor, _ = _create_data(26, 36, device=device) + out_tensor = F.resized_crop(tensor, top=0, left=0, height=20, width=30, size=[10, 15], interpolation=NEAREST) + expected_out_tensor = tensor[:, :20:2, :30:2] + assert_equal( + expected_out_tensor, + out_tensor, + msg=f"{expected_out_tensor[0, :10, :10]} vs {out_tensor[0, :10, :10]}", + ) + + batch_tensors = _create_data_batch(26, 36, num_samples=4, device=device) + _test_fn_on_batch( + batch_tensors, + F.resized_crop, + top=1, + left=2, + height=20, + width=30, + size=[10, 15], + interpolation=NEAREST, + ) + + +@pytest.mark.parametrize("device", cpu_and_cuda()) +@pytest.mark.parametrize( + "func, args", + [ + (F_t.get_dimensions, ()), + (F_t.get_image_size, ()), + (F_t.get_image_num_channels, ()), + (F_t.vflip, ()), + (F_t.hflip, ()), + (F_t.crop, (1, 2, 4, 5)), + (F_t.adjust_brightness, (0.0,)), + (F_t.adjust_contrast, (1.0,)), + (F_t.adjust_hue, (-0.5,)), + (F_t.adjust_saturation, (2.0,)), + (F_t.pad, ([2], 2, "constant")), + (F_t.resize, ([10, 11],)), + (F_t.perspective, ([0.2])), + (F_t.gaussian_blur, ((2, 2), (0.7, 0.5))), + (F_t.invert, ()), + (F_t.posterize, (0,)), + (F_t.solarize, (0.3,)), + (F_t.adjust_sharpness, (0.3,)), + (F_t.autocontrast, ()), + (F_t.equalize, ()), + ], +) +def test_assert_image_tensor(device, func, args): + shape = (100,) + tensor = torch.rand(*shape, dtype=torch.float, device=device) + with pytest.raises(Exception, match=r"Tensor is not a torch image."): + func(tensor, *args) + + +@pytest.mark.parametrize("device", cpu_and_cuda()) +def test_vflip(device): + script_vflip = torch.jit.script(F.vflip) + + img_tensor, pil_img = _create_data(16, 18, device=device) + vflipped_img = F.vflip(img_tensor) + vflipped_pil_img = F.vflip(pil_img) + _assert_equal_tensor_to_pil(vflipped_img, vflipped_pil_img) + + # scriptable function test + vflipped_img_script = script_vflip(img_tensor) + assert_equal(vflipped_img, vflipped_img_script) + + batch_tensors = _create_data_batch(16, 18, num_samples=4, device=device) + _test_fn_on_batch(batch_tensors, F.vflip) + + +@pytest.mark.parametrize("device", cpu_and_cuda()) +def test_hflip(device): + script_hflip = torch.jit.script(F.hflip) + + img_tensor, pil_img = _create_data(16, 18, device=device) + hflipped_img = F.hflip(img_tensor) + hflipped_pil_img = F.hflip(pil_img) + _assert_equal_tensor_to_pil(hflipped_img, hflipped_pil_img) + + # scriptable function test + hflipped_img_script = script_hflip(img_tensor) + assert_equal(hflipped_img, hflipped_img_script) + + batch_tensors = _create_data_batch(16, 18, num_samples=4, device=device) + _test_fn_on_batch(batch_tensors, F.hflip) + + +@pytest.mark.parametrize("device", cpu_and_cuda()) +@pytest.mark.parametrize( + "top, left, height, width", + [ + (1, 2, 4, 5), # crop inside top-left corner + (2, 12, 3, 4), # crop inside top-right corner + (8, 3, 5, 6), # crop inside bottom-left corner + (8, 11, 4, 3), # crop inside bottom-right corner + (50, 50, 10, 10), # crop outside the image + (-50, -50, 10, 10), # crop outside the image + ], +) +def test_crop(device, top, left, height, width): + script_crop = torch.jit.script(F.crop) + + img_tensor, pil_img = _create_data(16, 18, device=device) + + pil_img_cropped = F.crop(pil_img, top, left, height, width) + + img_tensor_cropped = F.crop(img_tensor, top, left, height, width) + _assert_equal_tensor_to_pil(img_tensor_cropped, pil_img_cropped) + + img_tensor_cropped = script_crop(img_tensor, top, left, height, width) + _assert_equal_tensor_to_pil(img_tensor_cropped, pil_img_cropped) + + batch_tensors = _create_data_batch(16, 18, num_samples=4, device=device) + _test_fn_on_batch(batch_tensors, F.crop, top=top, left=left, height=height, width=width) + + +@pytest.mark.parametrize("device", cpu_and_cuda()) +@pytest.mark.parametrize("image_size", ("small", "large")) +@pytest.mark.parametrize("dt", [None, torch.float32, torch.float64, torch.float16]) +@pytest.mark.parametrize("ksize", [(3, 3), [3, 5], (23, 23)]) +@pytest.mark.parametrize("sigma", [[0.5, 0.5], (0.5, 0.5), (0.8, 0.8), (1.7, 1.7)]) +@pytest.mark.parametrize("fn", [F.gaussian_blur, torch.jit.script(F.gaussian_blur)]) +def test_gaussian_blur(device, image_size, dt, ksize, sigma, fn): + + # true_cv2_results = { + # # np_img = np.arange(3 * 10 * 12, dtype="uint8").reshape((10, 12, 3)) + # # cv2.GaussianBlur(np_img, ksize=(3, 3), sigmaX=0.8) + # "3_3_0.8": ... + # # cv2.GaussianBlur(np_img, ksize=(3, 3), sigmaX=0.5) + # "3_3_0.5": ... + # # cv2.GaussianBlur(np_img, ksize=(3, 5), sigmaX=0.8) + # "3_5_0.8": ... + # # cv2.GaussianBlur(np_img, ksize=(3, 5), sigmaX=0.5) + # "3_5_0.5": ... + # # np_img2 = np.arange(26 * 28, dtype="uint8").reshape((26, 28)) + # # cv2.GaussianBlur(np_img2, ksize=(23, 23), sigmaX=1.7) + # "23_23_1.7": ... + # } + p = os.path.join(os.path.dirname(os.path.abspath(__file__)), "assets", "gaussian_blur_opencv_results.pt") + + true_cv2_results = torch.load(p, weights_only=False) + + if image_size == "small": + tensor = ( + torch.from_numpy(np.arange(3 * 10 * 12, dtype="uint8").reshape((10, 12, 3))).permute(2, 0, 1).to(device) + ) + else: + tensor = torch.from_numpy(np.arange(26 * 28, dtype="uint8").reshape((1, 26, 28))).to(device) + + if dt == torch.float16 and device == "cpu": + # skip float16 on CPU case + return + + if dt is not None: + tensor = tensor.to(dtype=dt) + + _ksize = (ksize, ksize) if isinstance(ksize, int) else ksize + _sigma = sigma[0] if sigma is not None else None + shape = tensor.shape + gt_key = f"{shape[-2]}_{shape[-1]}_{shape[-3]}__{_ksize[0]}_{_ksize[1]}_{_sigma}" + if gt_key not in true_cv2_results: + return + + true_out = ( + torch.tensor(true_cv2_results[gt_key]).reshape(shape[-2], shape[-1], shape[-3]).permute(2, 0, 1).to(tensor) + ) + + out = fn(tensor, kernel_size=ksize, sigma=sigma) + torch.testing.assert_close(out, true_out, rtol=0.0, atol=1.0, msg=f"{ksize}, {sigma}") + + +@pytest.mark.parametrize("device", cpu_and_cuda()) +def test_hsv2rgb(device): + scripted_fn = torch.jit.script(F_t._hsv2rgb) + shape = (3, 100, 150) + for _ in range(10): + hsv_img = torch.rand(*shape, dtype=torch.float, device=device) + rgb_img = F_t._hsv2rgb(hsv_img) + ft_img = rgb_img.permute(1, 2, 0).flatten(0, 1) + + ( + h, + s, + v, + ) = hsv_img.unbind(0) + h = h.flatten().cpu().numpy() + s = s.flatten().cpu().numpy() + v = v.flatten().cpu().numpy() + + rgb = [] + for h1, s1, v1 in zip(h, s, v): + rgb.append(colorsys.hsv_to_rgb(h1, s1, v1)) + colorsys_img = torch.tensor(rgb, dtype=torch.float32, device=device) + torch.testing.assert_close(ft_img, colorsys_img, rtol=0.0, atol=1e-5) + + s_rgb_img = scripted_fn(hsv_img) + torch.testing.assert_close(rgb_img, s_rgb_img) + + batch_tensors = _create_data_batch(120, 100, num_samples=4, device=device).float() + _test_fn_on_batch(batch_tensors, F_t._hsv2rgb) + + +@pytest.mark.parametrize("device", cpu_and_cuda()) +def test_rgb2hsv(device): + scripted_fn = torch.jit.script(F_t._rgb2hsv) + shape = (3, 150, 100) + for _ in range(10): + rgb_img = torch.rand(*shape, dtype=torch.float, device=device) + hsv_img = F_t._rgb2hsv(rgb_img) + ft_hsv_img = hsv_img.permute(1, 2, 0).flatten(0, 1) + + ( + r, + g, + b, + ) = rgb_img.unbind(dim=-3) + r = r.flatten().cpu().numpy() + g = g.flatten().cpu().numpy() + b = b.flatten().cpu().numpy() + + hsv = [] + for r1, g1, b1 in zip(r, g, b): + hsv.append(colorsys.rgb_to_hsv(r1, g1, b1)) + + colorsys_img = torch.tensor(hsv, dtype=torch.float32, device=device) + + ft_hsv_img_h, ft_hsv_img_sv = torch.split(ft_hsv_img, [1, 2], dim=1) + colorsys_img_h, colorsys_img_sv = torch.split(colorsys_img, [1, 2], dim=1) + + max_diff_h = ((colorsys_img_h * 2 * math.pi).sin() - (ft_hsv_img_h * 2 * math.pi).sin()).abs().max() + max_diff_sv = (colorsys_img_sv - ft_hsv_img_sv).abs().max() + max_diff = max(max_diff_h, max_diff_sv) + assert max_diff < 1e-5 + + s_hsv_img = scripted_fn(rgb_img) + torch.testing.assert_close(hsv_img, s_hsv_img, rtol=1e-5, atol=1e-7) + + batch_tensors = _create_data_batch(120, 100, num_samples=4, device=device).float() + _test_fn_on_batch(batch_tensors, F_t._rgb2hsv) + + +@pytest.mark.parametrize("device", cpu_and_cuda()) +@pytest.mark.parametrize("num_output_channels", (3, 1)) +def test_rgb_to_grayscale(device, num_output_channels): + script_rgb_to_grayscale = torch.jit.script(F.rgb_to_grayscale) + + img_tensor, pil_img = _create_data(32, 34, device=device) + + gray_pil_image = F.rgb_to_grayscale(pil_img, num_output_channels=num_output_channels) + gray_tensor = F.rgb_to_grayscale(img_tensor, num_output_channels=num_output_channels) + + _assert_approx_equal_tensor_to_pil(gray_tensor.float(), gray_pil_image, tol=1.0 + 1e-10, agg_method="max") + + s_gray_tensor = script_rgb_to_grayscale(img_tensor, num_output_channels=num_output_channels) + assert_equal(s_gray_tensor, gray_tensor) + + batch_tensors = _create_data_batch(16, 18, num_samples=4, device=device) + _test_fn_on_batch(batch_tensors, F.rgb_to_grayscale, num_output_channels=num_output_channels) + + +@pytest.mark.parametrize("device", cpu_and_cuda()) +def test_center_crop(device): + script_center_crop = torch.jit.script(F.center_crop) + + img_tensor, pil_img = _create_data(32, 34, device=device) + + cropped_pil_image = F.center_crop(pil_img, [10, 11]) + + cropped_tensor = F.center_crop(img_tensor, [10, 11]) + _assert_equal_tensor_to_pil(cropped_tensor, cropped_pil_image) + + cropped_tensor = script_center_crop(img_tensor, [10, 11]) + _assert_equal_tensor_to_pil(cropped_tensor, cropped_pil_image) + + batch_tensors = _create_data_batch(16, 18, num_samples=4, device=device) + _test_fn_on_batch(batch_tensors, F.center_crop, output_size=[10, 11]) + + +@pytest.mark.parametrize("device", cpu_and_cuda()) +def test_five_crop(device): + script_five_crop = torch.jit.script(F.five_crop) + + img_tensor, pil_img = _create_data(32, 34, device=device) + + cropped_pil_images = F.five_crop(pil_img, [10, 11]) + + cropped_tensors = F.five_crop(img_tensor, [10, 11]) + for i in range(5): + _assert_equal_tensor_to_pil(cropped_tensors[i], cropped_pil_images[i]) + + cropped_tensors = script_five_crop(img_tensor, [10, 11]) + for i in range(5): + _assert_equal_tensor_to_pil(cropped_tensors[i], cropped_pil_images[i]) + + batch_tensors = _create_data_batch(16, 18, num_samples=4, device=device) + tuple_transformed_batches = F.five_crop(batch_tensors, [10, 11]) + for i in range(len(batch_tensors)): + img_tensor = batch_tensors[i, ...] + tuple_transformed_imgs = F.five_crop(img_tensor, [10, 11]) + assert len(tuple_transformed_imgs) == len(tuple_transformed_batches) + + for j in range(len(tuple_transformed_imgs)): + true_transformed_img = tuple_transformed_imgs[j] + transformed_img = tuple_transformed_batches[j][i, ...] + assert_equal(true_transformed_img, transformed_img) + + # scriptable function test + s_tuple_transformed_batches = script_five_crop(batch_tensors, [10, 11]) + for transformed_batch, s_transformed_batch in zip(tuple_transformed_batches, s_tuple_transformed_batches): + assert_equal(transformed_batch, s_transformed_batch) + + +@pytest.mark.parametrize("device", cpu_and_cuda()) +def test_ten_crop(device): + script_ten_crop = torch.jit.script(F.ten_crop) + + img_tensor, pil_img = _create_data(32, 34, device=device) + + cropped_pil_images = F.ten_crop(pil_img, [10, 11]) + + cropped_tensors = F.ten_crop(img_tensor, [10, 11]) + for i in range(10): + _assert_equal_tensor_to_pil(cropped_tensors[i], cropped_pil_images[i]) + + cropped_tensors = script_ten_crop(img_tensor, [10, 11]) + for i in range(10): + _assert_equal_tensor_to_pil(cropped_tensors[i], cropped_pil_images[i]) + + batch_tensors = _create_data_batch(16, 18, num_samples=4, device=device) + tuple_transformed_batches = F.ten_crop(batch_tensors, [10, 11]) + for i in range(len(batch_tensors)): + img_tensor = batch_tensors[i, ...] + tuple_transformed_imgs = F.ten_crop(img_tensor, [10, 11]) + assert len(tuple_transformed_imgs) == len(tuple_transformed_batches) + + for j in range(len(tuple_transformed_imgs)): + true_transformed_img = tuple_transformed_imgs[j] + transformed_img = tuple_transformed_batches[j][i, ...] + assert_equal(true_transformed_img, transformed_img) + + # scriptable function test + s_tuple_transformed_batches = script_ten_crop(batch_tensors, [10, 11]) + for transformed_batch, s_transformed_batch in zip(tuple_transformed_batches, s_tuple_transformed_batches): + assert_equal(transformed_batch, s_transformed_batch) + + +def test_elastic_transform_asserts(): + with pytest.raises(TypeError, match="Argument displacement should be a Tensor"): + _ = F.elastic_transform("abc", displacement=None) + + with pytest.raises(TypeError, match="img should be PIL Image or Tensor"): + _ = F.elastic_transform("abc", displacement=torch.rand(1)) + + img_tensor = torch.rand(1, 3, 32, 24) + with pytest.raises(ValueError, match="Argument displacement shape should"): + _ = F.elastic_transform(img_tensor, displacement=torch.rand(1, 2)) + + +@pytest.mark.parametrize("device", cpu_and_cuda()) +@pytest.mark.parametrize("interpolation", [NEAREST, BILINEAR, BICUBIC]) +@pytest.mark.parametrize("dt", [None, torch.float32, torch.float64, torch.float16]) +@pytest.mark.parametrize( + "fill", + [None, [255, 255, 255], (2.0,)], +) +def test_elastic_transform_consistency(device, interpolation, dt, fill): + script_elastic_transform = torch.jit.script(F.elastic_transform) + img_tensor, _ = _create_data(32, 34, device=device) + # As there is no PIL implementation for elastic_transform, + # thus we do not run tests tensor vs pillow + + if dt is not None: + img_tensor = img_tensor.to(dt) + + displacement = T.ElasticTransform.get_params([1.5, 1.5], [2.0, 2.0], [32, 34]) + kwargs = dict( + displacement=displacement, + interpolation=interpolation, + fill=fill, + ) + + out_tensor1 = F.elastic_transform(img_tensor, **kwargs) + out_tensor2 = script_elastic_transform(img_tensor, **kwargs) + assert_equal(out_tensor1, out_tensor2) + + batch_tensors = _create_data_batch(16, 18, num_samples=4, device=device) + displacement = T.ElasticTransform.get_params([1.5, 1.5], [2.0, 2.0], [16, 18]) + kwargs["displacement"] = displacement + if dt is not None: + batch_tensors = batch_tensors.to(dt) + _test_fn_on_batch(batch_tensors, F.elastic_transform, **kwargs) -if __name__ == '__main__': - unittest.main() +if __name__ == "__main__": + pytest.main([__file__]) diff --git a/test/test_hub.py b/test/test_hub.py deleted file mode 100644 index 29ae90014d1cd9cf4c404d81fc05e487929ff21b..0000000000000000000000000000000000000000 --- a/test/test_hub.py +++ /dev/null @@ -1,58 +0,0 @@ -import torch.hub as hub -import tempfile -import shutil -import os -import sys -import unittest - - -def sum_of_model_parameters(model): - s = 0 - for p in model.parameters(): - s += p.sum() - return s - - -SUM_OF_PRETRAINED_RESNET18_PARAMS = -12703.9931640625 - - -@unittest.skipIf('torchvision' in sys.modules, - 'TestHub must start without torchvision imported') -class TestHub(unittest.TestCase): - # Only run this check ONCE before all tests start. - # - If torchvision is imported before all tests start, e.g. we might find _C.so - # which doesn't exist in downloaded zip but in the installed wheel. - # - After the first test is run, torchvision is already in sys.modules due to - # Python cache as we run all hub tests in the same python process. - - def test_load_from_github(self): - hub_model = hub.load( - 'pytorch/vision', - 'resnet18', - pretrained=True, - progress=False) - self.assertAlmostEqual(sum_of_model_parameters(hub_model).item(), - SUM_OF_PRETRAINED_RESNET18_PARAMS, - places=2) - - def test_set_dir(self): - temp_dir = tempfile.gettempdir() - hub.set_dir(temp_dir) - hub_model = hub.load( - 'pytorch/vision', - 'resnet18', - pretrained=True, - progress=False) - self.assertAlmostEqual(sum_of_model_parameters(hub_model).item(), - SUM_OF_PRETRAINED_RESNET18_PARAMS, - places=2) - self.assertTrue(os.path.exists(temp_dir + '/pytorch_vision_master')) - shutil.rmtree(temp_dir + '/pytorch_vision_master') - - def test_list_entrypoints(self): - entry_lists = hub.list('pytorch/vision', force_reload=True) - self.assertIn('resnet18', entry_lists) - - -if __name__ == "__main__": - unittest.main() diff --git a/test/test_image.py b/test/test_image.py index eae4a1473c533ea8d7cc18f30f9309962cc9aac4..86018dccc42c8bc737b764d3712d89d420ed4fd4 100644 --- a/test/test_image.py +++ b/test/test_image.py @@ -1,28 +1,45 @@ +import concurrent.futures import glob import io import os +import re import sys -import unittest from pathlib import Path -import pytest import numpy as np +import pytest +import requests import torch -from PIL import Image import torchvision.transforms.functional as F -from common_utils import get_tmp_dir, needs_cuda, cpu_only -from _assert_utils import assert_equal - +from common_utils import assert_equal, cpu_and_cuda, IN_OSS_CI, needs_cuda +from PIL import __version__ as PILLOW_VERSION, Image, ImageOps, ImageSequence from torchvision.io.image import ( - decode_png, decode_jpeg, encode_jpeg, write_jpeg, decode_image, read_file, - encode_png, write_png, write_file, ImageReadMode, read_image) + _read_png_16, + decode_gif, + decode_image, + decode_jpeg, + decode_png, + encode_jpeg, + encode_png, + ImageReadMode, + read_file, + read_image, + write_file, + write_jpeg, + write_png, +) IMAGE_ROOT = os.path.join(os.path.dirname(os.path.abspath(__file__)), "assets") FAKEDATA_DIR = os.path.join(IMAGE_ROOT, "fakedata") IMAGE_DIR = os.path.join(FAKEDATA_DIR, "imagefolder") -DAMAGED_JPEG = os.path.join(IMAGE_ROOT, 'damaged_jpeg') +DAMAGED_JPEG = os.path.join(IMAGE_ROOT, "damaged_jpeg") +DAMAGED_PNG = os.path.join(IMAGE_ROOT, "damaged_png") ENCODE_JPEG = os.path.join(IMAGE_ROOT, "encode_jpeg") -IS_WINDOWS = sys.platform in ('win32', 'cygwin') +INTERLACED_PNG = os.path.join(IMAGE_ROOT, "interlaced_png") +TOOSMALL_PNG = os.path.join(IMAGE_ROOT, "toosmall_png") +IS_WINDOWS = sys.platform in ("win32", "cygwin") +IS_MACOS = sys.platform == "darwin" +PILLOW_VERSION = tuple(int(x) for x in PILLOW_VERSION.split(".")) def _get_safe_image_name(name): @@ -35,9 +52,9 @@ def _get_safe_image_name(name): def get_images(directory, img_ext): assert os.path.isdir(directory) - image_paths = glob.glob(directory + f'/**/*{img_ext}', recursive=True) + image_paths = glob.glob(directory + f"/**/*{img_ext}", recursive=True) for path in image_paths: - if path.split(os.sep)[-2] not in ['damaged_jpeg', 'jpeg_write']: + if path.split(os.sep)[-2] not in ["damaged_jpeg", "jpeg_write"]: yield path @@ -54,203 +71,386 @@ def normalize_dimensions(img_pil): return img_pil -class ImageTester(unittest.TestCase): - def test_decode_jpeg(self): - conversion = [(None, ImageReadMode.UNCHANGED), ("L", ImageReadMode.GRAY), ("RGB", ImageReadMode.RGB)] - for img_path in get_images(IMAGE_ROOT, ".jpg"): - for pil_mode, mode in conversion: - with Image.open(img_path) as img: - is_cmyk = img.mode == "CMYK" - if pil_mode is not None: - if is_cmyk: - # libjpeg does not support the conversion - continue - img = img.convert(pil_mode) - img_pil = torch.from_numpy(np.array(img)) - if is_cmyk: - # flip the colors to match libjpeg - img_pil = 255 - img_pil - - img_pil = normalize_dimensions(img_pil) - data = read_file(img_path) - img_ljpeg = decode_image(data, mode=mode) - - # Permit a small variation on pixel values to account for implementation - # differences between Pillow and LibJPEG. - abs_mean_diff = (img_ljpeg.type(torch.float32) - img_pil).abs().mean().item() - self.assertTrue(abs_mean_diff < 2) - - with self.assertRaisesRegex(RuntimeError, "Expected a non empty 1-dimensional tensor"): - decode_jpeg(torch.empty((100, 1), dtype=torch.uint8)) - - with self.assertRaisesRegex(RuntimeError, "Expected a torch.uint8 tensor"): - decode_jpeg(torch.empty((100,), dtype=torch.float16)) - - with self.assertRaises(RuntimeError): - decode_jpeg(torch.empty((100), dtype=torch.uint8)) - - def test_damaged_images(self): - # Test image with bad Huffman encoding (should not raise) - bad_huff = read_file(os.path.join(DAMAGED_JPEG, 'bad_huffman.jpg')) - try: - _ = decode_jpeg(bad_huff) - except RuntimeError: - self.assertTrue(False) - - # Truncated images should raise an exception - truncated_images = glob.glob( - os.path.join(DAMAGED_JPEG, 'corrupt*.jpg')) - for image_path in truncated_images: - data = read_file(image_path) - with self.assertRaises(RuntimeError): - decode_jpeg(data) - - def test_decode_png(self): - conversion = [(None, ImageReadMode.UNCHANGED), ("L", ImageReadMode.GRAY), ("LA", ImageReadMode.GRAY_ALPHA), - ("RGB", ImageReadMode.RGB), ("RGBA", ImageReadMode.RGB_ALPHA)] - for img_path in get_images(FAKEDATA_DIR, ".png"): - for pil_mode, mode in conversion: - with Image.open(img_path) as img: - if pil_mode is not None: - img = img.convert(pil_mode) - img_pil = torch.from_numpy(np.array(img)) - - img_pil = normalize_dimensions(img_pil) - data = read_file(img_path) - img_lpng = decode_image(data, mode=mode) - - tol = 0 if conversion is None else 1 - self.assertTrue(img_lpng.allclose(img_pil, atol=tol)) - - with self.assertRaises(RuntimeError): - decode_png(torch.empty((), dtype=torch.uint8)) - with self.assertRaises(RuntimeError): - decode_png(torch.randint(3, 5, (300,), dtype=torch.uint8)) - - def test_encode_png(self): - for img_path in get_images(IMAGE_DIR, '.png'): - pil_image = Image.open(img_path) - img_pil = torch.from_numpy(np.array(pil_image)) - img_pil = img_pil.permute(2, 0, 1) - png_buf = encode_png(img_pil, compression_level=6) - - rec_img = Image.open(io.BytesIO(bytes(png_buf.tolist()))) - rec_img = torch.from_numpy(np.array(rec_img)) - rec_img = rec_img.permute(2, 0, 1) - - assert_equal(img_pil, rec_img) - - with self.assertRaisesRegex( - RuntimeError, "Input tensor dtype should be uint8"): - encode_png(torch.empty((3, 100, 100), dtype=torch.float32)) - - with self.assertRaisesRegex( - RuntimeError, "Compression level should be between 0 and 9"): - encode_png(torch.empty((3, 100, 100), dtype=torch.uint8), - compression_level=-1) - - with self.assertRaisesRegex( - RuntimeError, "Compression level should be between 0 and 9"): - encode_png(torch.empty((3, 100, 100), dtype=torch.uint8), - compression_level=10) - - with self.assertRaisesRegex( - RuntimeError, "The number of channels should be 1 or 3, got: 5"): - encode_png(torch.empty((5, 100, 100), dtype=torch.uint8)) - - def test_write_png(self): - with get_tmp_dir() as d: - for img_path in get_images(IMAGE_DIR, '.png'): - pil_image = Image.open(img_path) - img_pil = torch.from_numpy(np.array(pil_image)) - img_pil = img_pil.permute(2, 0, 1) - - filename, _ = os.path.splitext(os.path.basename(img_path)) - torch_png = os.path.join(d, '{0}_torch.png'.format(filename)) - write_png(img_pil, torch_png, compression_level=6) - saved_image = torch.from_numpy(np.array(Image.open(torch_png))) - saved_image = saved_image.permute(2, 0, 1) - - assert_equal(img_pil, saved_image) - - def test_read_file(self): - with get_tmp_dir() as d: - fname, content = 'test1.bin', b'TorchVision\211\n' - fpath = os.path.join(d, fname) - with open(fpath, 'wb') as f: - f.write(content) - - data = read_file(fpath) - expected = torch.tensor(list(content), dtype=torch.uint8) - assert_equal(data, expected) - os.unlink(fpath) - - with self.assertRaisesRegex( - RuntimeError, "No such file or directory: 'tst'"): - read_file('tst') - - def test_read_file_non_ascii(self): - with get_tmp_dir() as d: - fname, content = '日本語(Japanese).bin', b'TorchVision\211\n' - fpath = os.path.join(d, fname) - with open(fpath, 'wb') as f: - f.write(content) - - data = read_file(fpath) - expected = torch.tensor(list(content), dtype=torch.uint8) - assert_equal(data, expected) - os.unlink(fpath) - - def test_write_file(self): - with get_tmp_dir() as d: - fname, content = 'test1.bin', b'TorchVision\211\n' - fpath = os.path.join(d, fname) - content_tensor = torch.tensor(list(content), dtype=torch.uint8) - write_file(fpath, content_tensor) - - with open(fpath, 'rb') as f: - saved_content = f.read() - self.assertEqual(content, saved_content) - os.unlink(fpath) - - def test_write_file_non_ascii(self): - with get_tmp_dir() as d: - fname, content = '日本語(Japanese).bin', b'TorchVision\211\n' - fpath = os.path.join(d, fname) - content_tensor = torch.tensor(list(content), dtype=torch.uint8) - write_file(fpath, content_tensor) - - with open(fpath, 'rb') as f: - saved_content = f.read() - self.assertEqual(content, saved_content) - os.unlink(fpath) +@pytest.mark.parametrize( + "img_path", + [pytest.param(jpeg_path, id=_get_safe_image_name(jpeg_path)) for jpeg_path in get_images(IMAGE_ROOT, ".jpg")], +) +@pytest.mark.parametrize( + "pil_mode, mode", + [ + (None, ImageReadMode.UNCHANGED), + ("L", ImageReadMode.GRAY), + ("RGB", ImageReadMode.RGB), + ], +) +@pytest.mark.parametrize("scripted", (False, True)) +@pytest.mark.parametrize("decode_fun", (decode_jpeg, decode_image)) +def test_decode_jpeg(img_path, pil_mode, mode, scripted, decode_fun): + + with Image.open(img_path) as img: + is_cmyk = img.mode == "CMYK" + if pil_mode is not None: + img = img.convert(pil_mode) + img_pil = torch.from_numpy(np.array(img)) + if is_cmyk and mode == ImageReadMode.UNCHANGED: + # flip the colors to match libjpeg + img_pil = 255 - img_pil + + img_pil = normalize_dimensions(img_pil) + data = read_file(img_path) + if scripted: + decode_fun = torch.jit.script(decode_fun) + img_ljpeg = decode_fun(data, mode=mode) + + # Permit a small variation on pixel values to account for implementation + # differences between Pillow and LibJPEG. + abs_mean_diff = (img_ljpeg.type(torch.float32) - img_pil).abs().mean().item() + assert abs_mean_diff < 2 + + +@pytest.mark.parametrize("codec", ["png", "jpeg"]) +@pytest.mark.parametrize("orientation", [1, 2, 3, 4, 5, 6, 7, 8, 0]) +def test_decode_with_exif_orientation(tmpdir, codec, orientation): + fp = os.path.join(tmpdir, f"exif_oriented_{orientation}.{codec}") + t = torch.randint(0, 256, size=(3, 256, 257), dtype=torch.uint8) + im = F.to_pil_image(t) + exif = im.getexif() + exif[0x0112] = orientation # set exif orientation + im.save(fp, codec.upper(), exif=exif.tobytes()) + + data = read_file(fp) + output = decode_image(data, apply_exif_orientation=True) + + pimg = Image.open(fp) + pimg = ImageOps.exif_transpose(pimg) + + expected = F.pil_to_tensor(pimg) + torch.testing.assert_close(expected, output) + + +@pytest.mark.parametrize("size", [65533, 1, 7, 10, 23, 33]) +def test_invalid_exif(tmpdir, size): + # Inspired from a PIL test: + # https://github.com/python-pillow/Pillow/blob/8f63748e50378424628155994efd7e0739a4d1d1/Tests/test_file_jpeg.py#L299 + fp = os.path.join(tmpdir, "invalid_exif.jpg") + t = torch.randint(0, 256, size=(3, 256, 257), dtype=torch.uint8) + im = F.to_pil_image(t) + im.save(fp, "JPEG", exif=b"1" * size) + + data = read_file(fp) + output = decode_image(data, apply_exif_orientation=True) + + pimg = Image.open(fp) + pimg = ImageOps.exif_transpose(pimg) + + expected = F.pil_to_tensor(pimg) + torch.testing.assert_close(expected, output) + + +def test_decode_jpeg_errors(): + with pytest.raises(RuntimeError, match="Expected a non empty 1-dimensional tensor"): + decode_jpeg(torch.empty((100, 1), dtype=torch.uint8)) + + with pytest.raises(RuntimeError, match="Expected a torch.uint8 tensor"): + decode_jpeg(torch.empty((100,), dtype=torch.float16)) + + with pytest.raises(RuntimeError, match="Not a JPEG file"): + decode_jpeg(torch.empty((100), dtype=torch.uint8)) + + +def test_decode_bad_huffman_images(): + # sanity check: make sure we can decode the bad Huffman encoding + bad_huff = read_file(os.path.join(DAMAGED_JPEG, "bad_huffman.jpg")) + decode_jpeg(bad_huff) + + +@pytest.mark.parametrize( + "img_path", + [ + pytest.param(truncated_image, id=_get_safe_image_name(truncated_image)) + for truncated_image in glob.glob(os.path.join(DAMAGED_JPEG, "corrupt*.jpg")) + ], +) +def test_damaged_corrupt_images(img_path): + # Truncated images should raise an exception + data = read_file(img_path) + if "corrupt34" in img_path: + match_message = "Image is incomplete or truncated" + else: + match_message = "Unsupported marker type" + with pytest.raises(RuntimeError, match=match_message): + decode_jpeg(data) + + +@pytest.mark.parametrize( + "img_path", + [pytest.param(png_path, id=_get_safe_image_name(png_path)) for png_path in get_images(FAKEDATA_DIR, ".png")], +) +@pytest.mark.parametrize( + "pil_mode, mode", + [ + (None, ImageReadMode.UNCHANGED), + ("L", ImageReadMode.GRAY), + ("LA", ImageReadMode.GRAY_ALPHA), + ("RGB", ImageReadMode.RGB), + ("RGBA", ImageReadMode.RGB_ALPHA), + ], +) +@pytest.mark.parametrize("scripted", (False, True)) +@pytest.mark.parametrize("decode_fun", (decode_png, decode_image)) +def test_decode_png(img_path, pil_mode, mode, scripted, decode_fun): + + if scripted: + decode_fun = torch.jit.script(decode_fun) + + with Image.open(img_path) as img: + if pil_mode is not None: + img = img.convert(pil_mode) + img_pil = torch.from_numpy(np.array(img)) + + img_pil = normalize_dimensions(img_pil) + + if img_path.endswith("16.png"): + # 16 bits image decoding is supported, but only as a private API + # FIXME: see https://github.com/pytorch/vision/issues/4731 for potential solutions to making it public + with pytest.raises(RuntimeError, match="At most 8-bit PNG images are supported"): + data = read_file(img_path) + img_lpng = decode_fun(data, mode=mode) + + img_lpng = _read_png_16(img_path, mode=mode) + assert img_lpng.dtype == torch.int32 + # PIL converts 16 bits pngs in uint8 + img_lpng = torch.round(img_lpng / (2**16 - 1) * 255).to(torch.uint8) + else: + data = read_file(img_path) + img_lpng = decode_fun(data, mode=mode) + + tol = 0 if pil_mode is None else 1 + + if PILLOW_VERSION >= (8, 3) and pil_mode == "LA": + # Avoid checking the transparency channel until + # https://github.com/python-pillow/Pillow/issues/5593#issuecomment-878244910 + # is fixed. + # TODO: remove once fix is released in PIL. Should be > 8.3.1. + img_lpng, img_pil = img_lpng[0], img_pil[0] + + torch.testing.assert_close(img_lpng, img_pil, atol=tol, rtol=0) + + +def test_decode_png_errors(): + with pytest.raises(RuntimeError, match="Expected a non empty 1-dimensional tensor"): + decode_png(torch.empty((), dtype=torch.uint8)) + with pytest.raises(RuntimeError, match="Content is not png"): + decode_png(torch.randint(3, 5, (300,), dtype=torch.uint8)) + with pytest.raises(RuntimeError, match="Out of bound read in decode_png"): + decode_png(read_file(os.path.join(DAMAGED_PNG, "sigsegv.png"))) + with pytest.raises(RuntimeError, match="Content is too small for png"): + decode_png(read_file(os.path.join(TOOSMALL_PNG, "heapbof.png"))) + + +@pytest.mark.parametrize( + "img_path", + [pytest.param(png_path, id=_get_safe_image_name(png_path)) for png_path in get_images(IMAGE_DIR, ".png")], +) +@pytest.mark.parametrize("scripted", (True, False)) +def test_encode_png(img_path, scripted): + pil_image = Image.open(img_path) + img_pil = torch.from_numpy(np.array(pil_image)) + img_pil = img_pil.permute(2, 0, 1) + encode = torch.jit.script(encode_png) if scripted else encode_png + png_buf = encode(img_pil, compression_level=6) + + rec_img = Image.open(io.BytesIO(bytes(png_buf.tolist()))) + rec_img = torch.from_numpy(np.array(rec_img)) + rec_img = rec_img.permute(2, 0, 1) + + assert_equal(img_pil, rec_img) + + +def test_encode_png_errors(): + with pytest.raises(RuntimeError, match="Input tensor dtype should be uint8"): + encode_png(torch.empty((3, 100, 100), dtype=torch.float32)) + + with pytest.raises(RuntimeError, match="Compression level should be between 0 and 9"): + encode_png(torch.empty((3, 100, 100), dtype=torch.uint8), compression_level=-1) + + with pytest.raises(RuntimeError, match="Compression level should be between 0 and 9"): + encode_png(torch.empty((3, 100, 100), dtype=torch.uint8), compression_level=10) + + with pytest.raises(RuntimeError, match="The number of channels should be 1 or 3, got: 5"): + encode_png(torch.empty((5, 100, 100), dtype=torch.uint8)) + + +@pytest.mark.parametrize( + "img_path", + [pytest.param(png_path, id=_get_safe_image_name(png_path)) for png_path in get_images(IMAGE_DIR, ".png")], +) +@pytest.mark.parametrize("scripted", (True, False)) +def test_write_png(img_path, tmpdir, scripted): + pil_image = Image.open(img_path) + img_pil = torch.from_numpy(np.array(pil_image)) + img_pil = img_pil.permute(2, 0, 1) + + filename, _ = os.path.splitext(os.path.basename(img_path)) + torch_png = os.path.join(tmpdir, f"{filename}_torch.png") + write = torch.jit.script(write_png) if scripted else write_png + write(img_pil, torch_png, compression_level=6) + saved_image = torch.from_numpy(np.array(Image.open(torch_png))) + saved_image = saved_image.permute(2, 0, 1) + + assert_equal(img_pil, saved_image) + + +def test_read_image(): + # Just testing torchcsript, the functionality is somewhat tested already in other tests. + path = next(get_images(IMAGE_ROOT, ".jpg")) + out = read_image(path) + out_scripted = torch.jit.script(read_image)(path) + torch.testing.assert_close(out, out_scripted, atol=0, rtol=0) + + +@pytest.mark.parametrize("scripted", (True, False)) +def test_read_file(tmpdir, scripted): + fname, content = "test1.bin", b"TorchVision\211\n" + fpath = os.path.join(tmpdir, fname) + with open(fpath, "wb") as f: + f.write(content) + + fun = torch.jit.script(read_file) if scripted else read_file + data = fun(fpath) + expected = torch.tensor(list(content), dtype=torch.uint8) + os.unlink(fpath) + assert_equal(data, expected) + + with pytest.raises(RuntimeError, match="No such file or directory: 'tst'"): + read_file("tst") + + +def test_read_file_non_ascii(tmpdir): + fname, content = "日本語(Japanese).bin", b"TorchVision\211\n" + fpath = os.path.join(tmpdir, fname) + with open(fpath, "wb") as f: + f.write(content) + + data = read_file(fpath) + expected = torch.tensor(list(content), dtype=torch.uint8) + os.unlink(fpath) + assert_equal(data, expected) + + +@pytest.mark.parametrize("scripted", (True, False)) +def test_write_file(tmpdir, scripted): + fname, content = "test1.bin", b"TorchVision\211\n" + fpath = os.path.join(tmpdir, fname) + content_tensor = torch.tensor(list(content), dtype=torch.uint8) + write = torch.jit.script(write_file) if scripted else write_file + write(fpath, content_tensor) + + with open(fpath, "rb") as f: + saved_content = f.read() + os.unlink(fpath) + assert content == saved_content + + +def test_write_file_non_ascii(tmpdir): + fname, content = "日本語(Japanese).bin", b"TorchVision\211\n" + fpath = os.path.join(tmpdir, fname) + content_tensor = torch.tensor(list(content), dtype=torch.uint8) + write_file(fpath, content_tensor) + + with open(fpath, "rb") as f: + saved_content = f.read() + os.unlink(fpath) + assert content == saved_content + + +@pytest.mark.parametrize( + "shape", + [ + (27, 27), + (60, 60), + (105, 105), + ], +) +def test_read_1_bit_png(shape, tmpdir): + np_rng = np.random.RandomState(0) + image_path = os.path.join(tmpdir, f"test_{shape}.png") + pixels = np_rng.rand(*shape) > 0.5 + img = Image.fromarray(pixels) + img.save(image_path) + img1 = read_image(image_path) + img2 = normalize_dimensions(torch.as_tensor(pixels * 255, dtype=torch.uint8)) + assert_equal(img1, img2) + + +@pytest.mark.parametrize( + "shape", + [ + (27, 27), + (60, 60), + (105, 105), + ], +) +@pytest.mark.parametrize( + "mode", + [ + ImageReadMode.UNCHANGED, + ImageReadMode.GRAY, + ], +) +def test_read_1_bit_png_consistency(shape, mode, tmpdir): + np_rng = np.random.RandomState(0) + image_path = os.path.join(tmpdir, f"test_{shape}.png") + pixels = np_rng.rand(*shape) > 0.5 + img = Image.fromarray(pixels) + img.save(image_path) + img1 = read_image(image_path, mode) + img2 = read_image(image_path, mode) + assert_equal(img1, img2) + + +def test_read_interlaced_png(): + imgs = list(get_images(INTERLACED_PNG, ".png")) + with Image.open(imgs[0]) as im1, Image.open(imgs[1]) as im2: + assert not (im1.info.get("interlace") is im2.info.get("interlace")) + img1 = read_image(imgs[0]) + img2 = read_image(imgs[1]) + assert_equal(img1, img2) @needs_cuda -@pytest.mark.parametrize('img_path', [ - pytest.param(jpeg_path, id=_get_safe_image_name(jpeg_path)) - for jpeg_path in get_images(IMAGE_ROOT, ".jpg") -]) -@pytest.mark.parametrize('mode', [ImageReadMode.UNCHANGED, ImageReadMode.GRAY, ImageReadMode.RGB]) -@pytest.mark.parametrize('scripted', (False, True)) +@pytest.mark.parametrize( + "img_path", + [pytest.param(jpeg_path, id=_get_safe_image_name(jpeg_path)) for jpeg_path in get_images(IMAGE_ROOT, ".jpg")], +) +@pytest.mark.parametrize("mode", [ImageReadMode.UNCHANGED, ImageReadMode.GRAY, ImageReadMode.RGB]) +@pytest.mark.parametrize("scripted", (False, True)) def test_decode_jpeg_cuda(mode, img_path, scripted): - if 'cmyk' in img_path: + if "cmyk" in img_path: pytest.xfail("Decoding a CMYK jpeg isn't supported") - tester = ImageTester() + data = read_file(img_path) img = decode_image(data, mode=mode) f = torch.jit.script(decode_jpeg) if scripted else decode_jpeg - img_nvjpeg = f(data, mode=mode, device='cuda') + img_nvjpeg = f(data, mode=mode, device="cuda") # Some difference expected between jpeg implementations - tester.assertTrue((img.float() - img_nvjpeg.cpu().float()).abs().mean() < 2) + assert (img.float() - img_nvjpeg.cpu().float()).abs().mean() < 2 + + +@needs_cuda +def test_decode_image_cuda_raises(): + data = torch.randint(0, 127, size=(255,), device="cuda", dtype=torch.uint8) + with pytest.raises(RuntimeError): + decode_image(data) @needs_cuda -@pytest.mark.parametrize('cuda_device', ('cuda', 'cuda:0', torch.device('cuda'))) +@pytest.mark.parametrize("cuda_device", ("cuda", "cuda:0", torch.device("cuda"))) def test_decode_jpeg_cuda_device_param(cuda_device): """Make sure we can pass a string or a torch.device as device param""" - data = read_file(next(get_images(IMAGE_ROOT, ".jpg"))) + path = next(path for path in get_images(IMAGE_ROOT, ".jpg") if "cmyk" not in path) + data = read_file(path) decode_jpeg(data, device=cuda_device) @@ -258,27 +458,24 @@ def test_decode_jpeg_cuda_device_param(cuda_device): def test_decode_jpeg_cuda_errors(): data = read_file(next(get_images(IMAGE_ROOT, ".jpg"))) with pytest.raises(RuntimeError, match="Expected a non empty 1-dimensional tensor"): - decode_jpeg(data.reshape(-1, 1), device='cuda') + decode_jpeg(data.reshape(-1, 1), device="cuda") with pytest.raises(RuntimeError, match="input tensor must be on CPU"): - decode_jpeg(data.to('cuda'), device='cuda') + decode_jpeg(data.to("cuda"), device="cuda") with pytest.raises(RuntimeError, match="Expected a torch.uint8 tensor"): - decode_jpeg(data.to(torch.float), device='cuda') + decode_jpeg(data.to(torch.float), device="cuda") with pytest.raises(RuntimeError, match="Expected a cuda device"): - torch.ops.image.decode_jpeg_cuda(data, ImageReadMode.UNCHANGED.value, 'cpu') + torch.ops.image.decode_jpeg_cuda(data, ImageReadMode.UNCHANGED.value, "cpu") -@cpu_only def test_encode_jpeg_errors(): with pytest.raises(RuntimeError, match="Input tensor dtype should be uint8"): encode_jpeg(torch.empty((3, 100, 100), dtype=torch.float32)) - with pytest.raises(ValueError, match="Image quality should be a positive number " - "between 1 and 100"): + with pytest.raises(ValueError, match="Image quality should be a positive number between 1 and 100"): encode_jpeg(torch.empty((3, 100, 100), dtype=torch.uint8), quality=-1) - with pytest.raises(ValueError, match="Image quality should be a positive number " - "between 1 and 100"): + with pytest.raises(ValueError, match="Image quality should be a positive number between 1 and 100"): encode_jpeg(torch.empty((3, 100, 100), dtype=torch.uint8), quality=101) with pytest.raises(RuntimeError, match="The number of channels should be 1 or 3, got: 5"): @@ -291,122 +488,319 @@ def test_encode_jpeg_errors(): encode_jpeg(torch.empty((100, 100), dtype=torch.uint8)) -def _collect_if(cond): - # TODO: remove this once test_encode_jpeg_windows and test_write_jpeg_windows - # are removed - def _inner(test_func): - if cond: - return test_func +@pytest.mark.skipif(IS_MACOS, reason="https://github.com/pytorch/vision/issues/8031") +@pytest.mark.parametrize( + "img_path", + [pytest.param(jpeg_path, id=_get_safe_image_name(jpeg_path)) for jpeg_path in get_images(ENCODE_JPEG, ".jpg")], +) +@pytest.mark.parametrize("scripted", (True, False)) +def test_encode_jpeg(img_path, scripted): + img = read_image(img_path) + + pil_img = F.to_pil_image(img) + buf = io.BytesIO() + pil_img.save(buf, format="JPEG", quality=75) + + encoded_jpeg_pil = torch.frombuffer(buf.getvalue(), dtype=torch.uint8) + + encode = torch.jit.script(encode_jpeg) if scripted else encode_jpeg + for src_img in [img, img.contiguous()]: + encoded_jpeg_torch = encode(src_img, quality=75) + assert_equal(encoded_jpeg_torch, encoded_jpeg_pil) + + +@needs_cuda +def test_encode_jpeg_cuda_device_param(): + path = next(path for path in get_images(IMAGE_ROOT, ".jpg") if "cmyk" not in path) + + data = read_image(path) + + current_device = torch.cuda.current_device() + current_stream = torch.cuda.current_stream() + num_devices = torch.cuda.device_count() + devices = ["cuda", torch.device("cuda")] + [torch.device(f"cuda:{i}") for i in range(num_devices)] + results = [] + for device in devices: + print(f"python: device: {device}") + results.append(encode_jpeg(data.to(device=device))) + assert len(results) == len(devices) + for result in results: + assert torch.all(result.cpu() == results[0].cpu()) + + assert current_device == torch.cuda.current_device() + assert current_stream == torch.cuda.current_stream() + + +@needs_cuda +@pytest.mark.parametrize( + "img_path", + [pytest.param(jpeg_path, id=_get_safe_image_name(jpeg_path)) for jpeg_path in get_images(IMAGE_ROOT, ".jpg")], +) +@pytest.mark.parametrize("scripted", (False, True)) +@pytest.mark.parametrize("contiguous", (False, True)) +def test_encode_jpeg_cuda(img_path, scripted, contiguous): + decoded_image_tv = read_image(img_path) + encode_fn = torch.jit.script(encode_jpeg) if scripted else encode_jpeg + + if "cmyk" in img_path: + pytest.xfail("Encoding a CMYK jpeg isn't supported") + if decoded_image_tv.shape[0] == 1: + pytest.xfail("Decoding a grayscale jpeg isn't supported") + # For more detail as to why check out: https://github.com/NVIDIA/cuda-samples/issues/23#issuecomment-559283013 + if contiguous: + decoded_image_tv = decoded_image_tv[None].contiguous(memory_format=torch.contiguous_format)[0] + else: + decoded_image_tv = decoded_image_tv[None].contiguous(memory_format=torch.channels_last)[0] + encoded_jpeg_cuda_tv = encode_fn(decoded_image_tv.cuda(), quality=75) + decoded_jpeg_cuda_tv = decode_jpeg(encoded_jpeg_cuda_tv.cpu()) + + # the actual encoded bytestreams from libnvjpeg and libjpeg-turbo differ for the same quality + # instead, we re-decode the encoded image and compare to the original + abs_mean_diff = (decoded_jpeg_cuda_tv.float() - decoded_image_tv.float()).abs().mean().item() + assert abs_mean_diff < 3 + + +@pytest.mark.parametrize("device", cpu_and_cuda()) +@pytest.mark.parametrize("scripted", (True, False)) +@pytest.mark.parametrize("contiguous", (True, False)) +def test_encode_jpegs_batch(scripted, contiguous, device): + if device == "cpu" and IS_MACOS: + pytest.skip("https://github.com/pytorch/vision/issues/8031") + decoded_images_tv = [] + for jpeg_path in get_images(IMAGE_ROOT, ".jpg"): + if "cmyk" in jpeg_path: + continue + decoded_image = read_image(jpeg_path) + if decoded_image.shape[0] == 1: + continue + if contiguous: + decoded_image = decoded_image[None].contiguous(memory_format=torch.contiguous_format)[0] else: - return pytest.mark.dont_collect(test_func) - return _inner - - -@cpu_only -@_collect_if(cond=IS_WINDOWS) -def test_encode_jpeg_windows(): - # This test is *wrong*. - # It compares a torchvision-encoded jpeg with a PIL-encoded jpeg, but it - # starts encoding the torchvision version from an image that comes from - # decode_jpeg, which can yield different results from pil.decode (see - # test_decode... which uses a high tolerance). - # Instead, we should start encoding from the exact same decoded image, for a - # valid comparison. This is done in test_encode_jpeg, but unfortunately - # these more correct tests fail on windows (probably because of a difference - # in libjpeg) between torchvision and PIL. - # FIXME: make the correct tests pass on windows and remove this. - for img_path in get_images(ENCODE_JPEG, ".jpg"): - dirname = os.path.dirname(img_path) - filename, _ = os.path.splitext(os.path.basename(img_path)) - write_folder = os.path.join(dirname, 'jpeg_write') - expected_file = os.path.join( - write_folder, '{0}_pil.jpg'.format(filename)) - img = decode_jpeg(read_file(img_path)) - - with open(expected_file, 'rb') as f: - pil_bytes = f.read() - pil_bytes = torch.as_tensor(list(pil_bytes), dtype=torch.uint8) - for src_img in [img, img.contiguous()]: - # PIL sets jpeg quality to 75 by default - jpeg_bytes = encode_jpeg(src_img, quality=75) - assert_equal(jpeg_bytes, pil_bytes) - - -@cpu_only -@_collect_if(cond=IS_WINDOWS) -def test_write_jpeg_windows(): - # FIXME: Remove this eventually, see test_encode_jpeg_windows - with get_tmp_dir() as d: - for img_path in get_images(ENCODE_JPEG, ".jpg"): - data = read_file(img_path) - img = decode_jpeg(data) + decoded_image = decoded_image[None].contiguous(memory_format=torch.channels_last)[0] + decoded_images_tv.append(decoded_image) + + encode_fn = torch.jit.script(encode_jpeg) if scripted else encode_jpeg + + decoded_images_tv_device = [img.to(device=device) for img in decoded_images_tv] + encoded_jpegs_tv_device = encode_fn(decoded_images_tv_device, quality=75) + encoded_jpegs_tv_device = [decode_jpeg(img.cpu()) for img in encoded_jpegs_tv_device] + + for original, encoded_decoded in zip(decoded_images_tv, encoded_jpegs_tv_device): + c, h, w = original.shape + abs_mean_diff = (original.float() - encoded_decoded.float()).abs().mean().item() + assert abs_mean_diff < 3 + + # test multithreaded decoding + # in the current version we prevent this by using a lock but we still want to test it + num_workers = 10 + with concurrent.futures.ThreadPoolExecutor(max_workers=num_workers) as executor: + futures = [executor.submit(encode_fn, decoded_images_tv_device) for _ in range(num_workers)] + encoded_images_threaded = [future.result() for future in futures] + assert len(encoded_images_threaded) == num_workers + for encoded_images in encoded_images_threaded: + assert len(decoded_images_tv_device) == len(encoded_images) + for i, (encoded_image_cuda, decoded_image_tv) in enumerate(zip(encoded_images, decoded_images_tv_device)): + # make sure all the threads produce identical outputs + assert torch.all(encoded_image_cuda == encoded_images_threaded[0][i]) + + # make sure the outputs are identical or close enough to baseline + decoded_cuda_encoded_image = decode_jpeg(encoded_image_cuda.cpu()) + assert decoded_cuda_encoded_image.shape == decoded_image_tv.shape + assert decoded_cuda_encoded_image.dtype == decoded_image_tv.dtype + assert (decoded_cuda_encoded_image.cpu().float() - decoded_image_tv.cpu().float()).abs().mean() < 3 - basedir = os.path.dirname(img_path) - filename, _ = os.path.splitext(os.path.basename(img_path)) - torch_jpeg = os.path.join( - d, '{0}_torch.jpg'.format(filename)) - pil_jpeg = os.path.join( - basedir, 'jpeg_write', '{0}_pil.jpg'.format(filename)) - write_jpeg(img, torch_jpeg, quality=75) +@needs_cuda +def test_single_encode_jpeg_cuda_errors(): + with pytest.raises(RuntimeError, match="Input tensor dtype should be uint8"): + encode_jpeg(torch.empty((3, 100, 100), dtype=torch.float32, device="cuda")) - with open(torch_jpeg, 'rb') as f: - torch_bytes = f.read() + with pytest.raises(RuntimeError, match="The number of channels should be 3, got: 5"): + encode_jpeg(torch.empty((5, 100, 100), dtype=torch.uint8, device="cuda")) - with open(pil_jpeg, 'rb') as f: - pil_bytes = f.read() + with pytest.raises(RuntimeError, match="The number of channels should be 3, got: 1"): + encode_jpeg(torch.empty((1, 100, 100), dtype=torch.uint8, device="cuda")) - assert_equal(torch_bytes, pil_bytes) + with pytest.raises(RuntimeError, match="Input data should be a 3-dimensional tensor"): + encode_jpeg(torch.empty((1, 3, 100, 100), dtype=torch.uint8, device="cuda")) + with pytest.raises(RuntimeError, match="Input data should be a 3-dimensional tensor"): + encode_jpeg(torch.empty((100, 100), dtype=torch.uint8, device="cuda")) -@cpu_only -@_collect_if(cond=not IS_WINDOWS) -@pytest.mark.parametrize('img_path', [ - pytest.param(jpeg_path, id=_get_safe_image_name(jpeg_path)) - for jpeg_path in get_images(ENCODE_JPEG, ".jpg") -]) -def test_encode_jpeg(img_path): - img = read_image(img_path) +@needs_cuda +def test_batch_encode_jpegs_cuda_errors(): + with pytest.raises(RuntimeError, match="Input tensor dtype should be uint8"): + encode_jpeg( + [ + torch.empty((3, 100, 100), dtype=torch.uint8, device="cuda"), + torch.empty((3, 100, 100), dtype=torch.float32, device="cuda"), + ] + ) + + with pytest.raises(RuntimeError, match="The number of channels should be 3, got: 5"): + encode_jpeg( + [ + torch.empty((3, 100, 100), dtype=torch.uint8, device="cuda"), + torch.empty((5, 100, 100), dtype=torch.uint8, device="cuda"), + ] + ) + + with pytest.raises(RuntimeError, match="The number of channels should be 3, got: 1"): + encode_jpeg( + [ + torch.empty((3, 100, 100), dtype=torch.uint8, device="cuda"), + torch.empty((1, 100, 100), dtype=torch.uint8, device="cuda"), + ] + ) + + with pytest.raises(RuntimeError, match="Input data should be a 3-dimensional tensor"): + encode_jpeg( + [ + torch.empty((3, 100, 100), dtype=torch.uint8, device="cuda"), + torch.empty((1, 3, 100, 100), dtype=torch.uint8, device="cuda"), + ] + ) + + with pytest.raises(RuntimeError, match="Input data should be a 3-dimensional tensor"): + encode_jpeg( + [ + torch.empty((3, 100, 100), dtype=torch.uint8, device="cuda"), + torch.empty((100, 100), dtype=torch.uint8, device="cuda"), + ] + ) + + with pytest.raises(RuntimeError, match="Input tensor should be on CPU"): + encode_jpeg( + [ + torch.empty((3, 100, 100), dtype=torch.uint8, device="cpu"), + torch.empty((3, 100, 100), dtype=torch.uint8, device="cuda"), + ] + ) + + with pytest.raises( + RuntimeError, match="All input tensors must be on the same CUDA device when encoding with nvjpeg" + ): + encode_jpeg( + [ + torch.empty((3, 100, 100), dtype=torch.uint8, device="cuda"), + torch.empty((3, 100, 100), dtype=torch.uint8, device="cpu"), + ] + ) + + if torch.cuda.device_count() >= 2: + with pytest.raises( + RuntimeError, match="All input tensors must be on the same CUDA device when encoding with nvjpeg" + ): + encode_jpeg( + [ + torch.empty((3, 100, 100), dtype=torch.uint8, device="cuda:0"), + torch.empty((3, 100, 100), dtype=torch.uint8, device="cuda:1"), + ] + ) + + with pytest.raises(ValueError, match="encode_jpeg requires at least one input tensor when a list is passed"): + encode_jpeg([]) + + +@pytest.mark.skipif(IS_MACOS, reason="https://github.com/pytorch/vision/issues/8031") +@pytest.mark.parametrize( + "img_path", + [pytest.param(jpeg_path, id=_get_safe_image_name(jpeg_path)) for jpeg_path in get_images(ENCODE_JPEG, ".jpg")], +) +@pytest.mark.parametrize("scripted", (True, False)) +def test_write_jpeg(img_path, tmpdir, scripted): + tmpdir = Path(tmpdir) + img = read_image(img_path) pil_img = F.to_pil_image(img) - buf = io.BytesIO() - pil_img.save(buf, format='JPEG', quality=75) - # pytorch can't read from raw bytes so we go through numpy - pil_bytes = np.frombuffer(buf.getvalue(), dtype=np.uint8) - encoded_jpeg_pil = torch.as_tensor(pil_bytes) + torch_jpeg = str(tmpdir / "torch.jpg") + pil_jpeg = str(tmpdir / "pil.jpg") - for src_img in [img, img.contiguous()]: - encoded_jpeg_torch = encode_jpeg(src_img, quality=75) - assert_equal(encoded_jpeg_torch, encoded_jpeg_pil) + write = torch.jit.script(write_jpeg) if scripted else write_jpeg + write(img, torch_jpeg, quality=75) + pil_img.save(pil_jpeg, quality=75) + with open(torch_jpeg, "rb") as f: + torch_bytes = f.read() + + with open(pil_jpeg, "rb") as f: + pil_bytes = f.read() + + assert_equal(torch_bytes, pil_bytes) + + +def test_pathlib_support(tmpdir): + # Just make sure pathlib.Path is supported where relevant + + jpeg_path = Path(next(get_images(ENCODE_JPEG, ".jpg"))) + + read_file(jpeg_path) + read_image(jpeg_path) + + write_path = Path(tmpdir) / "whatever" + img = torch.randint(0, 10, size=(3, 4, 4), dtype=torch.uint8) + + write_file(write_path, data=img.flatten()) + write_jpeg(img, write_path) + write_png(img, write_path) + + +@pytest.mark.parametrize( + "name", ("gifgrid", "fire", "porsche", "treescap", "treescap-interlaced", "solid2", "x-trans", "earth") +) +@pytest.mark.parametrize("scripted", (True, False)) +def test_decode_gif(tmpdir, name, scripted): + # Using test images from GIFLIB + # https://sourceforge.net/p/giflib/code/ci/master/tree/pic/, we assert PIL + # and torchvision decoded outputs are equal. + # We're not testing against "welcome2" because PIL and GIFLIB disagee on what + # the background color should be (likely a difference in the way they handle + # transparency?) + # 'earth' image is from wikipedia, licensed under CC BY-SA 3.0 + # https://creativecommons.org/licenses/by-sa/3.0/ + # it allows to properly test for transparency, TOP-LEFT offsets, and + # disposal modes. + + path = tmpdir / f"{name}.gif" + if name == "earth": + if IN_OSS_CI: + # TODO: Fix this... one day. + pytest.skip("Skipping 'earth' test as it's flaky on OSS CI") + url = "https://upload.wikimedia.org/wikipedia/commons/2/2c/Rotating_earth_%28large%29.gif" + else: + url = f"https://sourceforge.net/p/giflib/code/ci/master/tree/pic/{name}.gif?format=raw" + with open(path, "wb") as f: + f.write(requests.get(url).content) -@cpu_only -@_collect_if(cond=not IS_WINDOWS) -@pytest.mark.parametrize('img_path', [ - pytest.param(jpeg_path, id=_get_safe_image_name(jpeg_path)) - for jpeg_path in get_images(ENCODE_JPEG, ".jpg") -]) -def test_write_jpeg(img_path): - with get_tmp_dir() as d: - d = Path(d) - img = read_image(img_path) - pil_img = F.to_pil_image(img) + encoded_bytes = read_file(path) + f = torch.jit.script(decode_gif) if scripted else decode_gif + tv_out = f(encoded_bytes) + if tv_out.ndim == 3: + tv_out = tv_out[None] - torch_jpeg = str(d / 'torch.jpg') - pil_jpeg = str(d / 'pil.jpg') + assert tv_out.is_contiguous(memory_format=torch.channels_last) - write_jpeg(img, torch_jpeg, quality=75) - pil_img.save(pil_jpeg, quality=75) + # For some reason, not using Image.open() as a CM causes "ResourceWarning: unclosed file" + with Image.open(path) as pil_img: + pil_seq = ImageSequence.Iterator(pil_img) - with open(torch_jpeg, 'rb') as f: - torch_bytes = f.read() + for pil_frame, tv_frame in zip(pil_seq, tv_out): + pil_frame = F.pil_to_tensor(pil_frame.convert("RGB")) + torch.testing.assert_close(tv_frame, pil_frame, atol=0, rtol=0) - with open(pil_jpeg, 'rb') as f: - pil_bytes = f.read() - assert_equal(torch_bytes, pil_bytes) +def test_decode_gif_errors(): + encoded_data = torch.randint(0, 256, (100,), dtype=torch.uint8) + with pytest.raises(RuntimeError, match="Input tensor must be 1-dimensional"): + decode_gif(encoded_data[None]) + with pytest.raises(RuntimeError, match="Input tensor must have uint8 data type"): + decode_gif(encoded_data.float()) + with pytest.raises(RuntimeError, match="Input tensor must be contiguous"): + decode_gif(encoded_data[::2]) + with pytest.raises(RuntimeError, match=re.escape("DGifOpenFileName() failed - 103")): + decode_gif(encoded_data) -if __name__ == '__main__': - unittest.main() +if __name__ == "__main__": + pytest.main([__file__]) diff --git a/test/test_internal_utils.py b/test/test_internal_utils.py new file mode 100644 index 0000000000000000000000000000000000000000..f5f8a040db93372c6b4542af5d9441433dc38c6c --- /dev/null +++ b/test/test_internal_utils.py @@ -0,0 +1,17 @@ +import pytest +from torchvision._utils import sequence_to_str + + +@pytest.mark.parametrize( + ("seq", "separate_last", "expected"), + [ + ([], "", ""), + (["foo"], "", "'foo'"), + (["foo", "bar"], "", "'foo', 'bar'"), + (["foo", "bar"], "and ", "'foo' and 'bar'"), + (["foo", "bar", "baz"], "", "'foo', 'bar', 'baz'"), + (["foo", "bar", "baz"], "and ", "'foo', 'bar', and 'baz'"), + ], +) +def test_sequence_to_str(seq, separate_last, expected): + assert sequence_to_str(seq, separate_last=separate_last) == expected diff --git a/test/test_internet.py b/test/test_internet.py index 05496752c7f88054162f5b8f1bfc939dedd26a8f..34fc3d4aa084462aab63490b5df13f7a29c39e4b 100644 --- a/test/test_internet.py +++ b/test/test_internet.py @@ -6,66 +6,59 @@ cleanly ignored in FB internal test infra. """ import os -import unittest -import unittest.mock -import warnings +import pathlib from urllib.error import URLError +import pytest import torchvision.datasets.utils as utils -from common_utils import get_tmp_dir -class DatasetUtilsTester(unittest.TestCase): +class TestDatasetUtils: + @pytest.mark.parametrize("use_pathlib", (True, False)) + def test_download_url(self, tmpdir, use_pathlib): + if use_pathlib: + tmpdir = pathlib.Path(tmpdir) + url = "http://github.com/pytorch/vision/archive/master.zip" + try: + utils.download_url(url, tmpdir) + assert len(os.listdir(tmpdir)) != 0 + except URLError: + pytest.skip(f"could not download test file '{url}'") - def test_get_redirect_url(self): - url = "http://www.vision.caltech.edu/visipedia-data/CUB-200-2011/CUB_200_2011.tgz" - expected = "https://drive.google.com/file/d/1hbzc_P1FuxMkcabkgn9ZKinBwW683j45/view" + @pytest.mark.parametrize("use_pathlib", (True, False)) + def test_download_url_retry_http(self, tmpdir, use_pathlib): + if use_pathlib: + tmpdir = pathlib.Path(tmpdir) + url = "https://github.com/pytorch/vision/archive/master.zip" + try: + utils.download_url(url, tmpdir) + assert len(os.listdir(tmpdir)) != 0 + except URLError: + pytest.skip(f"could not download test file '{url}'") - actual = utils._get_redirect_url(url) - assert actual == expected + @pytest.mark.parametrize("use_pathlib", (True, False)) + def test_download_url_dont_exist(self, tmpdir, use_pathlib): + if use_pathlib: + tmpdir = pathlib.Path(tmpdir) + url = "http://github.com/pytorch/vision/archive/this_doesnt_exist.zip" + with pytest.raises(URLError): + utils.download_url(url, tmpdir) - def test_get_redirect_url_max_hops_exceeded(self): - url = "http://www.vision.caltech.edu/visipedia-data/CUB-200-2011/CUB_200_2011.tgz" - with self.assertRaises(RecursionError): - utils._get_redirect_url(url, max_hops=0) + @pytest.mark.parametrize("use_pathlib", (True, False)) + def test_download_url_dispatch_download_from_google_drive(self, mocker, tmpdir, use_pathlib): + if use_pathlib: + tmpdir = pathlib.Path(tmpdir) + url = "https://drive.google.com/file/d/1GO-BHUYRuvzr1Gtp2_fqXRsr9TIeYbhV/view" - def test_download_url(self): - with get_tmp_dir() as temp_dir: - url = "http://github.com/pytorch/vision/archive/master.zip" - try: - utils.download_url(url, temp_dir) - self.assertFalse(len(os.listdir(temp_dir)) == 0) - except URLError: - msg = "could not download test file '{}'".format(url) - warnings.warn(msg, RuntimeWarning) - raise unittest.SkipTest(msg) - - def test_download_url_retry_http(self): - with get_tmp_dir() as temp_dir: - url = "https://github.com/pytorch/vision/archive/master.zip" - try: - utils.download_url(url, temp_dir) - self.assertFalse(len(os.listdir(temp_dir)) == 0) - except URLError: - msg = "could not download test file '{}'".format(url) - warnings.warn(msg, RuntimeWarning) - raise unittest.SkipTest(msg) - - def test_download_url_dont_exist(self): - with get_tmp_dir() as temp_dir: - url = "http://github.com/pytorch/vision/archive/this_doesnt_exist.zip" - with self.assertRaises(URLError): - utils.download_url(url, temp_dir) - - @unittest.mock.patch("torchvision.datasets.utils.download_file_from_google_drive") - def test_download_url_dispatch_download_from_google_drive(self, mock): - url = "https://drive.google.com/file/d/1hbzc_P1FuxMkcabkgn9ZKinBwW683j45/view" - - id = "1hbzc_P1FuxMkcabkgn9ZKinBwW683j45" + id = "1GO-BHUYRuvzr1Gtp2_fqXRsr9TIeYbhV" filename = "filename" md5 = "md5" - with get_tmp_dir() as root: - utils.download_url(url, root, filename, md5) + mocked = mocker.patch("torchvision.datasets.utils.download_file_from_google_drive") + utils.download_url(url, tmpdir, filename, md5) + + mocked.assert_called_once_with(id, os.path.expanduser(tmpdir), filename, md5) + - mock.assert_called_once_with(id, root, filename, md5) +if __name__ == "__main__": + pytest.main([__file__]) diff --git a/test/test_io.py b/test/test_io.py index e86ea9e84fc7202532584ad58de9186914cc43f1..c45180571f0a3aa043b9fc073a7f1f5ed5f116c6 100644 --- a/test/test_io.py +++ b/test/test_io.py @@ -1,20 +1,18 @@ -import os import contextlib +import os import sys import tempfile + +import pytest import torch import torchvision.io as io +from common_utils import assert_equal from torchvision import get_video_backend -import unittest -import warnings -from urllib.error import URLError - -from common_utils import get_tmp_dir -from _assert_utils import assert_equal try: import av + # Do a version test too io.video._check_av_available() except ImportError: @@ -25,7 +23,7 @@ VIDEO_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), "assets", " def _create_video_frames(num_frames, height, width): - y, x = torch.meshgrid(torch.linspace(-2, 2, height), torch.linspace(-2, 2, width)) + y, x = torch.meshgrid(torch.linspace(-2, 2, height), torch.linspace(-2, 2, width), indexing="ij") data = [] for i in range(num_frames): xc = float(i) / num_frames @@ -43,31 +41,32 @@ def temp_video(num_frames, height, width, fps, lossless=False, video_codec=None, raise ValueError("video_codec can't be specified together with lossless") if options is not None: raise ValueError("options can't be specified together with lossless") - video_codec = 'libx264rgb' - options = {'crf': '0'} + video_codec = "libx264rgb" + options = {"crf": "0"} if video_codec is None: if get_video_backend() == "pyav": - video_codec = 'libx264' + video_codec = "libx264" else: # when video_codec is not set, we assume it is libx264rgb which accepts # RGB pixel formats as input instead of YUV - video_codec = 'libx264rgb' + video_codec = "libx264rgb" if options is None: options = {} data = _create_video_frames(num_frames, height, width) - with tempfile.NamedTemporaryFile(suffix='.mp4') as f: + with tempfile.NamedTemporaryFile(suffix=".mp4") as f: f.close() io.write_video(f.name, data, fps=fps, video_codec=video_codec, options=options) yield f.name, data os.unlink(f.name) -@unittest.skipIf(get_video_backend() != "pyav" and not io._HAS_VIDEO_OPT, - "video_reader backend not available") -@unittest.skipIf(av is None, "PyAV unavailable") -class TestIO(unittest.TestCase): +@pytest.mark.skipif( + get_video_backend() != "pyav" and not io._HAS_VIDEO_OPT, reason="video_reader backend not available" +) +@pytest.mark.skipif(av is None, reason="PyAV unavailable") +class TestVideo: # compression adds artifacts, thus we add a tolerance of # 6 in 0-255 range TOLERANCE = 6 @@ -76,23 +75,23 @@ class TestIO(unittest.TestCase): with temp_video(10, 300, 300, 5, lossless=True) as (f_name, data): lv, _, info = io.read_video(f_name) assert_equal(data, lv) - self.assertEqual(info["video_fps"], 5) + assert info["video_fps"] == 5 - @unittest.skipIf(not io._HAS_VIDEO_OPT, "video_reader backend is not chosen") + @pytest.mark.skipif(not io._HAS_VIDEO_OPT, reason="video_reader backend is not chosen") def test_probe_video_from_file(self): with temp_video(10, 300, 300, 5) as (f_name, data): video_info = io._probe_video_from_file(f_name) - self.assertAlmostEqual(video_info.video_duration, 2, delta=0.1) - self.assertAlmostEqual(video_info.video_fps, 5, delta=0.1) + assert pytest.approx(2, rel=0.0, abs=0.1) == video_info.video_duration + assert pytest.approx(5, rel=0.0, abs=0.1) == video_info.video_fps - @unittest.skipIf(not io._HAS_VIDEO_OPT, "video_reader backend is not chosen") + @pytest.mark.skipif(not io._HAS_VIDEO_OPT, reason="video_reader backend is not chosen") def test_probe_video_from_memory(self): with temp_video(10, 300, 300, 5) as (f_name, data): with open(f_name, "rb") as fp: filebuffer = fp.read() video_info = io._probe_video_from_memory(filebuffer) - self.assertAlmostEqual(video_info.video_duration, 2, delta=0.1) - self.assertAlmostEqual(video_info.video_fps, 5, delta=0.1) + assert pytest.approx(2, rel=0.0, abs=0.1) == video_info.video_duration + assert pytest.approx(5, rel=0.0, abs=0.1) == video_info.video_fps def test_read_timestamps(self): with temp_video(10, 300, 300, 5) as (f_name, data): @@ -100,51 +99,52 @@ class TestIO(unittest.TestCase): # note: not all formats/codecs provide accurate information for computing the # timestamps. For the format that we use here, this information is available, # so we use it as a baseline - container = av.open(f_name) - stream = container.streams[0] - pts_step = int(round(float(1 / (stream.average_rate * stream.time_base)))) - num_frames = int(round(float(stream.average_rate * stream.time_base * stream.duration))) - expected_pts = [i * pts_step for i in range(num_frames)] + with av.open(f_name) as container: + stream = container.streams[0] + pts_step = int(round(float(1 / (stream.average_rate * stream.time_base)))) + num_frames = int(round(float(stream.average_rate * stream.time_base * stream.duration))) + expected_pts = [i * pts_step for i in range(num_frames)] - self.assertEqual(pts, expected_pts) - container.close() + assert pts == expected_pts - def test_read_partial_video(self): + @pytest.mark.parametrize("start", range(5)) + @pytest.mark.parametrize("offset", range(1, 4)) + def test_read_partial_video(self, start, offset): with temp_video(10, 300, 300, 5, lossless=True) as (f_name, data): pts, _ = io.read_video_timestamps(f_name) - for start in range(5): - for offset in range(1, 4): - lv, _, _ = io.read_video(f_name, pts[start], pts[start + offset - 1]) - s_data = data[start:(start + offset)] - self.assertEqual(len(lv), offset) - assert_equal(s_data, lv) + + lv, _, _ = io.read_video(f_name, pts[start], pts[start + offset - 1]) + s_data = data[start : (start + offset)] + assert len(lv) == offset + assert_equal(s_data, lv) if get_video_backend() == "pyav": # for "video_reader" backend, we don't decode the closest early frame # when the given start pts is not matching any frame pts lv, _, _ = io.read_video(f_name, pts[4] + 1, pts[7]) - self.assertEqual(len(lv), 4) + assert len(lv) == 4 assert_equal(data[4:8], lv) - def test_read_partial_video_bframes(self): + @pytest.mark.parametrize("start", range(0, 80, 20)) + @pytest.mark.parametrize("offset", range(1, 4)) + def test_read_partial_video_bframes(self, start, offset): # do not use lossless encoding, to test the presence of B-frames - options = {'bframes': '16', 'keyint': '10', 'min-keyint': '4'} + options = {"bframes": "16", "keyint": "10", "min-keyint": "4"} with temp_video(100, 300, 300, 5, options=options) as (f_name, data): pts, _ = io.read_video_timestamps(f_name) - for start in range(0, 80, 20): - for offset in range(1, 4): - lv, _, _ = io.read_video(f_name, pts[start], pts[start + offset - 1]) - s_data = data[start:(start + offset)] - self.assertEqual(len(lv), offset) - assert_equal(s_data, lv, rtol=0.0, atol=self.TOLERANCE) + + lv, _, _ = io.read_video(f_name, pts[start], pts[start + offset - 1]) + s_data = data[start : (start + offset)] + assert len(lv) == offset + assert_equal(s_data, lv, rtol=0.0, atol=self.TOLERANCE) lv, _, _ = io.read_video(f_name, pts[4] + 1, pts[7]) # TODO fix this - if get_video_backend() == 'pyav': - self.assertEqual(len(lv), 4) + if get_video_backend() == "pyav": + assert len(lv) == 4 assert_equal(data[4:8], lv, rtol=0.0, atol=self.TOLERANCE) else: - self.assertEqual(len(lv), 3) + assert len(lv) == 3 assert_equal(data[5:8], lv, rtol=0.0, atol=self.TOLERANCE) def test_read_packed_b_frames_divx_file(self): @@ -152,146 +152,140 @@ class TestIO(unittest.TestCase): f_name = os.path.join(VIDEO_DIR, name) pts, fps = io.read_video_timestamps(f_name) - self.assertEqual(pts, sorted(pts)) - self.assertEqual(fps, 30) + assert pts == sorted(pts) + assert fps == 30 def test_read_timestamps_from_packet(self): - with temp_video(10, 300, 300, 5, video_codec='mpeg4') as (f_name, data): + with temp_video(10, 300, 300, 5, video_codec="mpeg4") as (f_name, data): pts, _ = io.read_video_timestamps(f_name) # note: not all formats/codecs provide accurate information for computing the # timestamps. For the format that we use here, this information is available, # so we use it as a baseline - container = av.open(f_name) - stream = container.streams[0] - # make sure we went through the optimized codepath - self.assertIn(b'Lavc', stream.codec_context.extradata) - pts_step = int(round(float(1 / (stream.average_rate * stream.time_base)))) - num_frames = int(round(float(stream.average_rate * stream.time_base * stream.duration))) - expected_pts = [i * pts_step for i in range(num_frames)] + with av.open(f_name) as container: + stream = container.streams[0] + # make sure we went through the optimized codepath + assert b"Lavc" in stream.codec_context.extradata + pts_step = int(round(float(1 / (stream.average_rate * stream.time_base)))) + num_frames = int(round(float(stream.average_rate * stream.time_base * stream.duration))) + expected_pts = [i * pts_step for i in range(num_frames)] - self.assertEqual(pts, expected_pts) - container.close() + assert pts == expected_pts def test_read_video_pts_unit_sec(self): with temp_video(10, 300, 300, 5, lossless=True) as (f_name, data): - lv, _, info = io.read_video(f_name, pts_unit='sec') + lv, _, info = io.read_video(f_name, pts_unit="sec") assert_equal(data, lv) - self.assertEqual(info["video_fps"], 5) - self.assertEqual(info, {"video_fps": 5}) + assert info["video_fps"] == 5 + assert info == {"video_fps": 5} def test_read_timestamps_pts_unit_sec(self): with temp_video(10, 300, 300, 5) as (f_name, data): - pts, _ = io.read_video_timestamps(f_name, pts_unit='sec') + pts, _ = io.read_video_timestamps(f_name, pts_unit="sec") - container = av.open(f_name) - stream = container.streams[0] - pts_step = int(round(float(1 / (stream.average_rate * stream.time_base)))) - num_frames = int(round(float(stream.average_rate * stream.time_base * stream.duration))) - expected_pts = [i * pts_step * stream.time_base for i in range(num_frames)] + with av.open(f_name) as container: + stream = container.streams[0] + pts_step = int(round(float(1 / (stream.average_rate * stream.time_base)))) + num_frames = int(round(float(stream.average_rate * stream.time_base * stream.duration))) + expected_pts = [i * pts_step * stream.time_base for i in range(num_frames)] - self.assertEqual(pts, expected_pts) - container.close() + assert pts == expected_pts - def test_read_partial_video_pts_unit_sec(self): + @pytest.mark.parametrize("start", range(5)) + @pytest.mark.parametrize("offset", range(1, 4)) + def test_read_partial_video_pts_unit_sec(self, start, offset): with temp_video(10, 300, 300, 5, lossless=True) as (f_name, data): - pts, _ = io.read_video_timestamps(f_name, pts_unit='sec') - - for start in range(5): - for offset in range(1, 4): - lv, _, _ = io.read_video(f_name, pts[start], pts[start + offset - 1], pts_unit='sec') - s_data = data[start:(start + offset)] - self.assertEqual(len(lv), offset) - assert_equal(s_data, lv) - - container = av.open(f_name) - stream = container.streams[0] - lv, _, _ = io.read_video(f_name, - int(pts[4] * (1.0 / stream.time_base) + 1) * stream.time_base, pts[7], - pts_unit='sec') + pts, _ = io.read_video_timestamps(f_name, pts_unit="sec") + + lv, _, _ = io.read_video(f_name, pts[start], pts[start + offset - 1], pts_unit="sec") + s_data = data[start : (start + offset)] + assert len(lv) == offset + assert_equal(s_data, lv) + + with av.open(f_name) as container: + stream = container.streams[0] + lv, _, _ = io.read_video( + f_name, int(pts[4] * (1.0 / stream.time_base) + 1) * stream.time_base, pts[7], pts_unit="sec" + ) if get_video_backend() == "pyav": # for "video_reader" backend, we don't decode the closest early frame # when the given start pts is not matching any frame pts - self.assertEqual(len(lv), 4) + assert len(lv) == 4 assert_equal(data[4:8], lv) - container.close() def test_read_video_corrupted_file(self): - with tempfile.NamedTemporaryFile(suffix='.mp4') as f: - f.write(b'This is not an mpg4 file') + with tempfile.NamedTemporaryFile(suffix=".mp4") as f: + f.write(b"This is not an mpg4 file") video, audio, info = io.read_video(f.name) - self.assertIsInstance(video, torch.Tensor) - self.assertIsInstance(audio, torch.Tensor) - self.assertEqual(video.numel(), 0) - self.assertEqual(audio.numel(), 0) - self.assertEqual(info, {}) + assert isinstance(video, torch.Tensor) + assert isinstance(audio, torch.Tensor) + assert video.numel() == 0 + assert audio.numel() == 0 + assert info == {} def test_read_video_timestamps_corrupted_file(self): - with tempfile.NamedTemporaryFile(suffix='.mp4') as f: - f.write(b'This is not an mpg4 file') + with tempfile.NamedTemporaryFile(suffix=".mp4") as f: + f.write(b"This is not an mpg4 file") video_pts, video_fps = io.read_video_timestamps(f.name) - self.assertEqual(video_pts, []) - self.assertIs(video_fps, None) + assert video_pts == [] + assert video_fps is None - @unittest.skip("Temporarily disabled due to new pyav") + @pytest.mark.skip(reason="Temporarily disabled due to new pyav") def test_read_video_partially_corrupted_file(self): with temp_video(5, 4, 4, 5, lossless=True) as (f_name, data): - with open(f_name, 'r+b') as f: + with open(f_name, "r+b") as f: size = os.path.getsize(f_name) bytes_to_overwrite = size // 10 # seek to the middle of the file f.seek(5 * bytes_to_overwrite) # corrupt 10% of the file from the middle - f.write(b'\xff' * bytes_to_overwrite) + f.write(b"\xff" * bytes_to_overwrite) # this exercises the container.decode assertion check - video, audio, info = io.read_video(f.name, pts_unit='sec') + video, audio, info = io.read_video(f.name, pts_unit="sec") # check that size is not equal to 5, but 3 # TODO fix this - if get_video_backend() == 'pyav': - self.assertEqual(len(video), 3) + if get_video_backend() == "pyav": + assert len(video) == 3 else: - self.assertEqual(len(video), 4) + assert len(video) == 4 # but the valid decoded content is still correct assert_equal(video[:3], data[:3]) # and the last few frames are wrong - with self.assertRaises(AssertionError): + with pytest.raises(AssertionError): assert_equal(video, data) - @unittest.skipIf(sys.platform == 'win32', 'temporarily disabled on Windows') - def test_write_video_with_audio(self): + @pytest.mark.skipif(sys.platform == "win32", reason="temporarily disabled on Windows") + def test_write_video_with_audio(self, tmpdir): f_name = os.path.join(VIDEO_DIR, "R6llTwEh07w.mp4") video_tensor, audio_tensor, info = io.read_video(f_name, pts_unit="sec") - with get_tmp_dir() as tmpdir: - out_f_name = os.path.join(tmpdir, "testing.mp4") - io.video.write_video( - out_f_name, - video_tensor, - round(info["video_fps"]), - video_codec="libx264rgb", - options={'crf': '0'}, - audio_array=audio_tensor, - audio_fps=info["audio_fps"], - audio_codec="aac", - ) - - out_video_tensor, out_audio_tensor, out_info = io.read_video( - out_f_name, pts_unit="sec" - ) - - self.assertEqual(info["video_fps"], out_info["video_fps"]) - assert_equal(video_tensor, out_video_tensor) - - audio_stream = av.open(f_name).streams.audio[0] - out_audio_stream = av.open(out_f_name).streams.audio[0] - - self.assertEqual(info["audio_fps"], out_info["audio_fps"]) - self.assertEqual(audio_stream.rate, out_audio_stream.rate) - self.assertAlmostEqual(audio_stream.frames, out_audio_stream.frames, delta=1) - self.assertEqual(audio_stream.frame_size, out_audio_stream.frame_size) + out_f_name = os.path.join(tmpdir, "testing.mp4") + io.video.write_video( + out_f_name, + video_tensor, + round(info["video_fps"]), + video_codec="libx264rgb", + options={"crf": "0"}, + audio_array=audio_tensor, + audio_fps=info["audio_fps"], + audio_codec="aac", + ) + + out_video_tensor, out_audio_tensor, out_info = io.read_video(out_f_name, pts_unit="sec") + + assert info["video_fps"] == out_info["video_fps"] + assert_equal(video_tensor, out_video_tensor) + + audio_stream = av.open(f_name).streams.audio[0] + out_audio_stream = av.open(out_f_name).streams.audio[0] + + assert info["audio_fps"] == out_info["audio_fps"] + assert audio_stream.rate == out_audio_stream.rate + assert pytest.approx(out_audio_stream.frames, rel=0.0, abs=1) == audio_stream.frames + assert audio_stream.frame_size == out_audio_stream.frame_size # TODO add tests for audio -if __name__ == '__main__': - unittest.main() +if __name__ == "__main__": + pytest.main(__file__) diff --git a/test/test_io_opt.py b/test/test_io_opt.py index 87698b346249c842d114982f6a3c5919317a4ed4..f4e3d3052950f0d5697adb6e6cc0604a1e76417d 100644 --- a/test/test_io_opt.py +++ b/test/test_io_opt.py @@ -1,12 +1,13 @@ import unittest -from torchvision import set_video_backend + import test_io +from torchvision import set_video_backend # noqa: 401 # Disabling the video backend switching temporarily # set_video_backend('video_reader') -if __name__ == '__main__': +if __name__ == "__main__": suite = unittest.TestLoader().loadTestsFromModule(test_io) unittest.TextTestRunner(verbosity=1).run(suite) diff --git a/test/test_models.cpp b/test/test_models.cpp deleted file mode 100644 index 092fc567ac2070abde0773bc53accde1eab8a4b6..0000000000000000000000000000000000000000 --- a/test/test_models.cpp +++ /dev/null @@ -1,209 +0,0 @@ -#include -#include -#include - -#include "../torchvision/csrc/models/models.h" - -using namespace vision::models; - -template -torch::Tensor forward_model(const std::string& input_path, torch::Tensor x) { - Model network; - torch::load(network, input_path); - network->eval(); - return network->forward(x); -} - -torch::Tensor forward_alexnet(const std::string& input_path, torch::Tensor x) { - return forward_model(input_path, x); -} - -torch::Tensor forward_vgg11(const std::string& input_path, torch::Tensor x) { - return forward_model(input_path, x); -} -torch::Tensor forward_vgg13(const std::string& input_path, torch::Tensor x) { - return forward_model(input_path, x); -} -torch::Tensor forward_vgg16(const std::string& input_path, torch::Tensor x) { - return forward_model(input_path, x); -} -torch::Tensor forward_vgg19(const std::string& input_path, torch::Tensor x) { - return forward_model(input_path, x); -} - -torch::Tensor forward_vgg11bn(const std::string& input_path, torch::Tensor x) { - return forward_model(input_path, x); -} -torch::Tensor forward_vgg13bn(const std::string& input_path, torch::Tensor x) { - return forward_model(input_path, x); -} -torch::Tensor forward_vgg16bn(const std::string& input_path, torch::Tensor x) { - return forward_model(input_path, x); -} -torch::Tensor forward_vgg19bn(const std::string& input_path, torch::Tensor x) { - return forward_model(input_path, x); -} - -torch::Tensor forward_resnet18(const std::string& input_path, torch::Tensor x) { - return forward_model(input_path, x); -} -torch::Tensor forward_resnet34(const std::string& input_path, torch::Tensor x) { - return forward_model(input_path, x); -} -torch::Tensor forward_resnet50(const std::string& input_path, torch::Tensor x) { - return forward_model(input_path, x); -} -torch::Tensor forward_resnet101( - const std::string& input_path, - torch::Tensor x) { - return forward_model(input_path, x); -} -torch::Tensor forward_resnet152( - const std::string& input_path, - torch::Tensor x) { - return forward_model(input_path, x); -} -torch::Tensor forward_resnext50_32x4d( - const std::string& input_path, - torch::Tensor x) { - return forward_model(input_path, x); -} -torch::Tensor forward_resnext101_32x8d( - const std::string& input_path, - torch::Tensor x) { - return forward_model(input_path, x); -} -torch::Tensor forward_wide_resnet50_2( - const std::string& input_path, - torch::Tensor x) { - return forward_model(input_path, x); -} -torch::Tensor forward_wide_resnet101_2( - const std::string& input_path, - torch::Tensor x) { - return forward_model(input_path, x); -} - -torch::Tensor forward_squeezenet1_0( - const std::string& input_path, - torch::Tensor x) { - return forward_model(input_path, x); -} -torch::Tensor forward_squeezenet1_1( - const std::string& input_path, - torch::Tensor x) { - return forward_model(input_path, x); -} - -torch::Tensor forward_densenet121( - const std::string& input_path, - torch::Tensor x) { - return forward_model(input_path, x); -} -torch::Tensor forward_densenet169( - const std::string& input_path, - torch::Tensor x) { - return forward_model(input_path, x); -} -torch::Tensor forward_densenet201( - const std::string& input_path, - torch::Tensor x) { - return forward_model(input_path, x); -} -torch::Tensor forward_densenet161( - const std::string& input_path, - torch::Tensor x) { - return forward_model(input_path, x); -} - -torch::Tensor forward_mobilenetv2( - const std::string& input_path, - torch::Tensor x) { - return forward_model(input_path, x); -} - -torch::Tensor forward_googlenet( - const std::string& input_path, - torch::Tensor x) { - GoogLeNet network; - torch::load(network, input_path); - network->eval(); - return network->forward(x).output; -} -torch::Tensor forward_inceptionv3( - const std::string& input_path, - torch::Tensor x) { - InceptionV3 network; - torch::load(network, input_path); - network->eval(); - return network->forward(x).output; -} - -torch::Tensor forward_mnasnet0_5(const std::string& input_path, torch::Tensor x) { - return forward_model(input_path, x); -} -torch::Tensor forward_mnasnet0_75(const std::string& input_path, torch::Tensor x) { - return forward_model(input_path, x); -} -torch::Tensor forward_mnasnet1_0(const std::string& input_path, torch::Tensor x) { - return forward_model(input_path, x); -} -torch::Tensor forward_mnasnet1_3(const std::string& input_path, torch::Tensor x) { - return forward_model(input_path, x); -} - -PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { - m.def("forward_alexnet", &forward_alexnet, "forward_alexnet"); - - m.def("forward_vgg11", &forward_vgg11, "forward_vgg11"); - m.def("forward_vgg13", &forward_vgg13, "forward_vgg13"); - m.def("forward_vgg16", &forward_vgg16, "forward_vgg16"); - m.def("forward_vgg19", &forward_vgg19, "forward_vgg19"); - - m.def("forward_vgg11bn", &forward_vgg11bn, "forward_vgg11bn"); - m.def("forward_vgg13bn", &forward_vgg13bn, "forward_vgg13bn"); - m.def("forward_vgg16bn", &forward_vgg16bn, "forward_vgg16bn"); - m.def("forward_vgg19bn", &forward_vgg19bn, "forward_vgg19bn"); - - m.def("forward_resnet18", &forward_resnet18, "forward_resnet18"); - m.def("forward_resnet34", &forward_resnet34, "forward_resnet34"); - m.def("forward_resnet50", &forward_resnet50, "forward_resnet50"); - m.def("forward_resnet101", &forward_resnet101, "forward_resnet101"); - m.def("forward_resnet152", &forward_resnet152, "forward_resnet152"); - m.def( - "forward_resnext50_32x4d", - &forward_resnext50_32x4d, - "forward_resnext50_32x4d"); - m.def( - "forward_resnext101_32x8d", - &forward_resnext101_32x8d, - "forward_resnext101_32x8d"); - m.def( - "forward_wide_resnet50_2", - &forward_wide_resnet50_2, - "forward_wide_resnet50_2"); - m.def( - "forward_wide_resnet101_2", - &forward_wide_resnet101_2, - "forward_wide_resnet101_2"); - - m.def( - "forward_squeezenet1_0", &forward_squeezenet1_0, "forward_squeezenet1_0"); - m.def( - "forward_squeezenet1_1", &forward_squeezenet1_1, "forward_squeezenet1_1"); - - m.def("forward_densenet121", &forward_densenet121, "forward_densenet121"); - m.def("forward_densenet169", &forward_densenet169, "forward_densenet169"); - m.def("forward_densenet201", &forward_densenet201, "forward_densenet201"); - m.def("forward_densenet161", &forward_densenet161, "forward_densenet161"); - - m.def("forward_mobilenetv2", &forward_mobilenetv2, "forward_mobilenetv2"); - - m.def("forward_googlenet", &forward_googlenet, "forward_googlenet"); - m.def("forward_inceptionv3", &forward_inceptionv3, "forward_inceptionv3"); - - m.def("forward_mnasnet0_5", &forward_mnasnet0_5, "forward_mnasnet0_5"); - m.def("forward_mnasnet0_75", &forward_mnasnet0_75, "forward_mnasnet0_75"); - m.def("forward_mnasnet1_0", &forward_mnasnet1_0, "forward_mnasnet1_0"); - m.def("forward_mnasnet1_3", &forward_mnasnet1_3, "forward_mnasnet1_3"); -} diff --git a/test/test_models.py b/test/test_models.py index 180bbcd032db170a0965835da1ec0dc0ac8ec9a6..202bbdbd0cd4192ebe6955a9576a9dd53c06f213 100644 --- a/test/test_models.py +++ b/test/test_models.py @@ -1,52 +1,250 @@ -import sys -from common_utils import TestCase, map_nested_tensor_object, freeze_rng_state, set_rng_seed, IN_CIRCLE_CI -from collections import OrderedDict -from itertools import product +import contextlib import functools import operator -import torch -import torch.nn as nn -from torchvision import models -import unittest +import os +import pkgutil +import platform +import sys import warnings +from collections import OrderedDict +from tempfile import TemporaryDirectory +from typing import Any import pytest - - -def get_available_classification_models(): - # TODO add a registration mechanism to torchvision.models - return [k for k, v in models.__dict__.items() if callable(v) and k[0].lower() == k[0] and k[0] != "_"] - - -def get_available_segmentation_models(): - # TODO add a registration mechanism to torchvision.models - return [k for k, v in models.segmentation.__dict__.items() if callable(v) and k[0].lower() == k[0] and k[0] != "_"] - - -def get_available_detection_models(): - # TODO add a registration mechanism to torchvision.models - return [k for k, v in models.detection.__dict__.items() if callable(v) and k[0].lower() == k[0] and k[0] != "_"] - - -def get_available_video_models(): - # TODO add a registration mechanism to torchvision.models - return [k for k, v in models.video.__dict__.items() if callable(v) and k[0].lower() == k[0] and k[0] != "_"] +import torch +import torch.fx +import torch.nn as nn +from _utils_internal import get_relative_path +from common_utils import cpu_and_cuda, freeze_rng_state, map_nested_tensor_object, needs_cuda, set_rng_seed +from PIL import Image +from torchvision import models, transforms +from torchvision.models import get_model_builder, list_models + + +ACCEPT = os.getenv("EXPECTTEST_ACCEPT", "0") == "1" +SKIP_BIG_MODEL = os.getenv("SKIP_BIG_MODEL", "1") == "1" + + +def list_model_fns(module): + return [get_model_builder(name) for name in list_models(module)] + + +def _get_image(input_shape, real_image, device, dtype=None): + """This routine loads a real or random image based on `real_image` argument. + Currently, the real image is utilized for the following list of models: + - `retinanet_resnet50_fpn`, + - `retinanet_resnet50_fpn_v2`, + - `keypointrcnn_resnet50_fpn`, + - `fasterrcnn_resnet50_fpn`, + - `fasterrcnn_resnet50_fpn_v2`, + - `fcos_resnet50_fpn`, + - `maskrcnn_resnet50_fpn`, + - `maskrcnn_resnet50_fpn_v2`, + in `test_classification_model` and `test_detection_model`. + To do so, a keyword argument `real_image` was added to the abovelisted models in `_model_params` + """ + if real_image: + # TODO: Maybe unify file discovery logic with test_image.py + GRACE_HOPPER = os.path.join( + os.path.dirname(os.path.abspath(__file__)), "assets", "encode_jpeg", "grace_hopper_517x606.jpg" + ) + + img = Image.open(GRACE_HOPPER) + + original_width, original_height = img.size + + # make the image square + img = img.crop((0, 0, original_width, original_width)) + img = img.resize(input_shape[1:3]) + + convert_tensor = transforms.ToTensor() + image = convert_tensor(img) + assert tuple(image.size()) == input_shape + return image.to(device=device, dtype=dtype) + + # RNG always on CPU, to ensure x in cuda tests is bitwise identical to x in cpu tests + return torch.rand(input_shape).to(device=device, dtype=dtype) + + +@pytest.fixture +def disable_weight_loading(mocker): + """When testing models, the two slowest operations are the downloading of the weights to a file and loading them + into the model. Unless, you want to test against specific weights, these steps can be disabled without any + drawbacks. + + Including this fixture into the signature of your test, i.e. `test_foo(disable_weight_loading)`, will recurse + through all models in `torchvision.models` and will patch all occurrences of the function + `download_state_dict_from_url` as well as the method `load_state_dict` on all subclasses of `nn.Module` to be + no-ops. + + .. warning: + + Loaded models are still executable as normal, but will always have random weights. Make sure to not use this + fixture if you want to compare the model output against reference values. + + """ + starting_point = models + function_name = "load_state_dict_from_url" + method_name = "load_state_dict" + + module_names = {info.name for info in pkgutil.walk_packages(starting_point.__path__, f"{starting_point.__name__}.")} + targets = {f"torchvision._internally_replaced_utils.{function_name}", f"torch.nn.Module.{method_name}"} + for name in module_names: + module = sys.modules.get(name) + if not module: + continue + + if function_name in module.__dict__: + targets.add(f"{module.__name__}.{function_name}") + + targets.update( + { + f"{module.__name__}.{obj.__name__}.{method_name}" + for obj in module.__dict__.values() + if isinstance(obj, type) and issubclass(obj, nn.Module) and method_name in obj.__dict__ + } + ) + + for target in targets: + # See https://github.com/pytorch/vision/pull/4867#discussion_r743677802 for details + with contextlib.suppress(AttributeError): + mocker.patch(target) + + +def _get_expected_file(name=None): + # Determine expected file based on environment + expected_file_base = get_relative_path(os.path.realpath(__file__), "expect") + + # Note: for legacy reasons, the reference file names all had "ModelTest.test_" in their names + # We hardcode it here to avoid having to re-generate the reference files + expected_file = os.path.join(expected_file_base, "ModelTester.test_" + name) + expected_file += "_expect.pkl" + + if not ACCEPT and not os.path.exists(expected_file): + raise RuntimeError( + f"No expect file exists for {os.path.basename(expected_file)} in {expected_file}; " + "to accept the current output, re-run the failing test after setting the EXPECTTEST_ACCEPT " + "env variable. For example: EXPECTTEST_ACCEPT=1 pytest test/test_models.py -k alexnet" + ) + + return expected_file + + +def _assert_expected(output, name, prec=None, atol=None, rtol=None): + """Test that a python value matches the recorded contents of a file + based on a "check" name. The value must be + pickable with `torch.save`. This file + is placed in the 'expect' directory in the same directory + as the test script. You can automatically update the recorded test + output using an EXPECTTEST_ACCEPT=1 env variable. + """ + expected_file = _get_expected_file(name) + + if ACCEPT: + filename = {os.path.basename(expected_file)} + print(f"Accepting updated output for {filename}:\n\n{output}") + torch.save(output, expected_file) + MAX_PICKLE_SIZE = 50 * 1000 # 50 KB + binary_size = os.path.getsize(expected_file) + if binary_size > MAX_PICKLE_SIZE: + raise RuntimeError(f"The output for {filename}, is larger than 50kb - got {binary_size}kb") + else: + expected = torch.load(expected_file, weights_only=True) + rtol = rtol or prec # keeping prec param for legacy reason, but could be removed ideally + atol = atol or prec + torch.testing.assert_close(output, expected, rtol=rtol, atol=atol, check_dtype=False, check_device=False) + + +def _check_jit_scriptable(nn_module, args, unwrapper=None, eager_out=None): + """Check that a nn.Module's results in TorchScript match eager and that it can be exported""" + + def get_export_import_copy(m): + """Save and load a TorchScript model""" + with TemporaryDirectory() as dir: + path = os.path.join(dir, "script.pt") + m.save(path) + imported = torch.jit.load(path) + return imported + + sm = torch.jit.script(nn_module) + sm.eval() + + if eager_out is None: + with torch.no_grad(), freeze_rng_state(): + eager_out = nn_module(*args) + + with torch.no_grad(), freeze_rng_state(): + script_out = sm(*args) + if unwrapper: + script_out = unwrapper(script_out) + + torch.testing.assert_close(eager_out, script_out, atol=1e-4, rtol=1e-4) + + m_import = get_export_import_copy(sm) + with torch.no_grad(), freeze_rng_state(): + imported_script_out = m_import(*args) + if unwrapper: + imported_script_out = unwrapper(imported_script_out) + + torch.testing.assert_close(script_out, imported_script_out, atol=3e-4, rtol=3e-4) + + +def _check_fx_compatible(model, inputs, eager_out=None): + model_fx = torch.fx.symbolic_trace(model) + if eager_out is None: + eager_out = model(inputs) + with torch.no_grad(), freeze_rng_state(): + fx_out = model_fx(inputs) + torch.testing.assert_close(eager_out, fx_out) + + +def _check_input_backprop(model, inputs): + if isinstance(inputs, list): + requires_grad = list() + for inp in inputs: + requires_grad.append(inp.requires_grad) + inp.requires_grad_(True) + else: + requires_grad = inputs.requires_grad + inputs.requires_grad_(True) + + out = model(inputs) + + if isinstance(out, dict): + out["out"].sum().backward() + else: + if isinstance(out[0], dict): + out[0]["scores"].sum().backward() + else: + out[0].sum().backward() + + if isinstance(inputs, list): + for i, inp in enumerate(inputs): + assert inputs[i].grad is not None + inp.requires_grad_(requires_grad[i]) + else: + assert inputs.grad is not None + inputs.requires_grad_(requires_grad) # If 'unwrapper' is provided it will be called with the script model outputs # before they are compared to the eager model outputs. This is useful if the # model outputs are different between TorchScript / Eager mode script_model_unwrapper = { - 'googlenet': lambda x: x.logits, - 'inception_v3': lambda x: x.logits, + "googlenet": lambda x: x.logits, + "inception_v3": lambda x: x.logits, "fasterrcnn_resnet50_fpn": lambda x: x[1], + "fasterrcnn_resnet50_fpn_v2": lambda x: x[1], "fasterrcnn_mobilenet_v3_large_fpn": lambda x: x[1], "fasterrcnn_mobilenet_v3_large_320_fpn": lambda x: x[1], "maskrcnn_resnet50_fpn": lambda x: x[1], + "maskrcnn_resnet50_fpn_v2": lambda x: x[1], "keypointrcnn_resnet50_fpn": lambda x: x[1], "retinanet_resnet50_fpn": lambda x: x[1], + "retinanet_resnet50_fpn_v2": lambda x: x[1], "ssd300_vgg16": lambda x: x[1], "ssdlite320_mobilenet_v3_large": lambda x: x[1], + "fcos_resnet50_fpn": lambda x: x[1], } @@ -71,396 +269,783 @@ autocast_flaky_numerics = ( "fcn_resnet101", "lraspp_mobilenet_v3_large", "maskrcnn_resnet50_fpn", + "maskrcnn_resnet50_fpn_v2", + "keypointrcnn_resnet50_fpn", ) +# The tests for the following quantized models are flaky possibly due to inconsistent +# rounding errors in different platforms. For this reason the input/output consistency +# tests under test_quantized_classification_model will be skipped for the following models. +quantized_flaky_models = ("inception_v3", "resnet50") + +# The tests for the following detection models are flaky. +# We run those tests on float64 to avoid floating point errors. +# FIXME: we shouldn't have to do that :'/ +detection_flaky_models = ("keypointrcnn_resnet50_fpn", "maskrcnn_resnet50_fpn", "maskrcnn_resnet50_fpn_v2") + + +# The following contains configuration parameters for all models which are used by +# the _test_*_model methods. +_model_params = { + "inception_v3": {"input_shape": (1, 3, 299, 299), "init_weights": True}, + "retinanet_resnet50_fpn": { + "num_classes": 20, + "score_thresh": 0.01, + "min_size": 224, + "max_size": 224, + "input_shape": (3, 224, 224), + "real_image": True, + }, + "retinanet_resnet50_fpn_v2": { + "num_classes": 20, + "score_thresh": 0.01, + "min_size": 224, + "max_size": 224, + "input_shape": (3, 224, 224), + "real_image": True, + }, + "keypointrcnn_resnet50_fpn": { + "num_classes": 2, + "min_size": 224, + "max_size": 224, + "box_score_thresh": 0.17, + "input_shape": (3, 224, 224), + "real_image": True, + }, + "fasterrcnn_resnet50_fpn": { + "num_classes": 20, + "min_size": 224, + "max_size": 224, + "input_shape": (3, 224, 224), + "real_image": True, + }, + "fasterrcnn_resnet50_fpn_v2": { + "num_classes": 20, + "min_size": 224, + "max_size": 224, + "input_shape": (3, 224, 224), + "real_image": True, + }, + "fcos_resnet50_fpn": { + "num_classes": 2, + "score_thresh": 0.05, + "min_size": 224, + "max_size": 224, + "input_shape": (3, 224, 224), + "real_image": True, + }, + "maskrcnn_resnet50_fpn": { + "num_classes": 10, + "min_size": 224, + "max_size": 224, + "input_shape": (3, 224, 224), + "real_image": True, + }, + "maskrcnn_resnet50_fpn_v2": { + "num_classes": 10, + "min_size": 224, + "max_size": 224, + "input_shape": (3, 224, 224), + "real_image": True, + }, + "fasterrcnn_mobilenet_v3_large_fpn": { + "box_score_thresh": 0.02076, + }, + "fasterrcnn_mobilenet_v3_large_320_fpn": { + "box_score_thresh": 0.02076, + "rpn_pre_nms_top_n_test": 1000, + "rpn_post_nms_top_n_test": 1000, + }, + "vit_h_14": { + "image_size": 56, + "input_shape": (1, 3, 56, 56), + }, + "mvit_v1_b": { + "input_shape": (1, 3, 16, 224, 224), + }, + "mvit_v2_s": { + "input_shape": (1, 3, 16, 224, 224), + }, + "s3d": { + "input_shape": (1, 3, 16, 224, 224), + }, + "googlenet": {"init_weights": True}, +} +# speeding up slow models: +slow_models = [ + "convnext_base", + "convnext_large", + "resnext101_32x8d", + "resnext101_64x4d", + "wide_resnet101_2", + "efficientnet_b6", + "efficientnet_b7", + "efficientnet_v2_m", + "efficientnet_v2_l", + "regnet_y_16gf", + "regnet_y_32gf", + "regnet_y_128gf", + "regnet_x_16gf", + "regnet_x_32gf", + "swin_t", + "swin_s", + "swin_b", + "swin_v2_t", + "swin_v2_s", + "swin_v2_b", +] +for m in slow_models: + _model_params[m] = {"input_shape": (1, 3, 64, 64)} + + +# skip big models to reduce memory usage on CI test. We can exclude combinations of (platform-system, device). +skipped_big_models = { + "vit_h_14": {("Windows", "cpu"), ("Windows", "cuda")}, + "regnet_y_128gf": {("Windows", "cpu"), ("Windows", "cuda")}, + "mvit_v1_b": {("Windows", "cuda"), ("Linux", "cuda")}, + "mvit_v2_s": {("Windows", "cuda"), ("Linux", "cuda")}, +} -class ModelTester(TestCase): - def _test_classification_model(self, name, input_shape, dev): - set_rng_seed(0) - # passing num_class equal to a number other than 1000 helps in making the test - # more enforcing in nature - model = models.__dict__[name](num_classes=50) - model.eval().to(device=dev) - # RNG always on CPU, to ensure x in cuda tests is bitwise identical to x in cpu tests - x = torch.rand(input_shape).to(device=dev) - out = model(x) - self.assertExpected(out.cpu(), name, prec=0.1) - self.assertEqual(out.shape[-1], 50) - self.check_jit_scriptable(model, (x,), unwrapper=script_model_unwrapper.get(name, None)) - - if dev == torch.device("cuda"): - with torch.cuda.amp.autocast(): - out = model(x) - # See autocast_flaky_numerics comment at top of file. - if name not in autocast_flaky_numerics: - self.assertExpected(out.cpu(), name, prec=0.1) - self.assertEqual(out.shape[-1], 50) - - def _test_segmentation_model(self, name, dev): - set_rng_seed(0) - # passing num_classes equal to a number other than 21 helps in making the test's - # expected file size smaller - model = models.segmentation.__dict__[name](num_classes=10, pretrained_backbone=False) - model.eval().to(device=dev) - input_shape = (1, 3, 32, 32) - # RNG always on CPU, to ensure x in cuda tests is bitwise identical to x in cpu tests - x = torch.rand(input_shape).to(device=dev) - out = model(x)["out"] - - def check_out(out): - prec = 0.01 - try: - # We first try to assert the entire output if possible. This is not - # only the best way to assert results but also handles the cases - # where we need to create a new expected result. - self.assertExpected(out.cpu(), name, prec=prec) - except AssertionError: - # Unfortunately some segmentation models are flaky with autocast - # so instead of validating the probability scores, check that the class - # predictions match. - expected_file = self._get_expected_file(name) - expected = torch.load(expected_file) - torch.testing.assert_close(out.argmax(dim=1), expected.argmax(dim=1), rtol=prec, atol=prec) - return False # Partial validation performed - - return True # Full validation performed - - full_validation = check_out(out) - - self.check_jit_scriptable(model, (x,), unwrapper=script_model_unwrapper.get(name, None)) - - if dev == torch.device("cuda"): - with torch.cuda.amp.autocast(): - out = model(x)["out"] - # See autocast_flaky_numerics comment at top of file. - if name not in autocast_flaky_numerics: - full_validation &= check_out(out) - - if not full_validation: - msg = "The output of {} could only be partially validated. " \ - "This is likely due to unit-test flakiness, but you may " \ - "want to do additional manual checks if you made " \ - "significant changes to the codebase.".format(self._testMethodName) - warnings.warn(msg, RuntimeWarning) - raise unittest.SkipTest(msg) - - def _test_detection_model(self, name, dev): - set_rng_seed(0) - kwargs = {} - if "retinanet" in name: - # Reduce the default threshold to ensure the returned boxes are not empty. - kwargs["score_thresh"] = 0.01 - elif "fasterrcnn_mobilenet_v3_large" in name: - kwargs["box_score_thresh"] = 0.02076 - if "fasterrcnn_mobilenet_v3_large_320_fpn" in name: - kwargs["rpn_pre_nms_top_n_test"] = 1000 - kwargs["rpn_post_nms_top_n_test"] = 1000 - model = models.detection.__dict__[name](num_classes=50, pretrained_backbone=False, **kwargs) - model.eval().to(device=dev) - input_shape = (3, 300, 300) - # RNG always on CPU, to ensure x in cuda tests is bitwise identical to x in cpu tests - x = torch.rand(input_shape).to(device=dev) - model_input = [x] - out = model(model_input) - self.assertIs(model_input[0], x) - - def check_out(out): - self.assertEqual(len(out), 1) - - def compact(tensor): - size = tensor.size() - elements_per_sample = functools.reduce(operator.mul, size[1:], 1) - if elements_per_sample > 30: - return compute_mean_std(tensor) - else: - return subsample_tensor(tensor) - - def subsample_tensor(tensor): - num_elems = tensor.size(0) - num_samples = 20 - if num_elems <= num_samples: - return tensor - - ith_index = num_elems // num_samples - return tensor[ith_index - 1::ith_index] - - def compute_mean_std(tensor): - # can't compute mean of integral tensor - tensor = tensor.to(torch.double) - mean = torch.mean(tensor) - std = torch.std(tensor) - return {"mean": mean, "std": std} - - output = map_nested_tensor_object(out, tensor_map_fn=compact) - prec = 0.01 - try: - # We first try to assert the entire output if possible. This is not - # only the best way to assert results but also handles the cases - # where we need to create a new expected result. - self.assertExpected(output, name, prec=prec) - except AssertionError: - # Unfortunately detection models are flaky due to the unstable sort - # in NMS. If matching across all outputs fails, use the same approach - # as in NMSTester.test_nms_cuda to see if this is caused by duplicate - # scores. - expected_file = self._get_expected_file(name) - expected = torch.load(expected_file) - torch.testing.assert_close(output[0]["scores"], expected[0]["scores"], rtol=prec, atol=prec, - check_device=False, check_dtype=False) - - # Note: Fmassa proposed turning off NMS by adapting the threshold - # and then using the Hungarian algorithm as in DETR to find the - # best match between output and expected boxes and eliminate some - # of the flakiness. Worth exploring. - return False # Partial validation performed - - return True # Full validation performed - - full_validation = check_out(out) - self.check_jit_scriptable(model, ([x],), unwrapper=script_model_unwrapper.get(name, None)) - - if dev == torch.device("cuda"): - with torch.cuda.amp.autocast(): - out = model(model_input) - # See autocast_flaky_numerics comment at top of file. - if name not in autocast_flaky_numerics: - full_validation &= check_out(out) - - if not full_validation: - msg = "The output of {} could only be partially validated. " \ - "This is likely due to unit-test flakiness, but you may " \ - "want to do additional manual checks if you made " \ - "significant changes to the codebase.".format(self._testMethodName) - warnings.warn(msg, RuntimeWarning) - raise unittest.SkipTest(msg) - - def _test_detection_model_validation(self, name): - set_rng_seed(0) - model = models.detection.__dict__[name](num_classes=50, pretrained_backbone=False) - input_shape = (3, 300, 300) - x = [torch.rand(input_shape)] - - # validate that targets are present in training - self.assertRaises(ValueError, model, x) - - # validate type - targets = [{'boxes': 0.}] - self.assertRaises(ValueError, model, x, targets=targets) - - # validate boxes shape - for boxes in (torch.rand((4,)), torch.rand((1, 5))): - targets = [{'boxes': boxes}] - self.assertRaises(ValueError, model, x, targets=targets) - - # validate that no degenerate boxes are present - boxes = torch.tensor([[1, 3, 1, 4], [2, 4, 3, 4]]) - targets = [{'boxes': boxes}] - self.assertRaises(ValueError, model, x, targets=targets) - - def _test_video_model(self, name, dev): - # the default input shape is - # bs * num_channels * clip_len * h *w - input_shape = (1, 3, 4, 112, 112) - # test both basicblock and Bottleneck - model = models.video.__dict__[name](num_classes=50) - model.eval().to(device=dev) - # RNG always on CPU, to ensure x in cuda tests is bitwise identical to x in cpu tests - x = torch.rand(input_shape).to(device=dev) - out = model(x) - self.check_jit_scriptable(model, (x,), unwrapper=script_model_unwrapper.get(name, None)) - self.assertEqual(out.shape[-1], 50) - - if dev == torch.device("cuda"): - with torch.cuda.amp.autocast(): - out = model(x) - self.assertEqual(out.shape[-1], 50) - - def _make_sliced_model(self, model, stop_layer): - layers = OrderedDict() - for name, layer in model.named_children(): - layers[name] = layer - if name == stop_layer: - break - new_model = torch.nn.Sequential(layers) - return new_model - - def test_memory_efficient_densenet(self): - input_shape = (1, 3, 300, 300) - x = torch.rand(input_shape) - - for name in ['densenet121', 'densenet169', 'densenet201', 'densenet161']: - model1 = models.__dict__[name](num_classes=50, memory_efficient=True) - params = model1.state_dict() - num_params = sum([x.numel() for x in model1.parameters()]) - model1.eval() - out1 = model1(x) - out1.sum().backward() - num_grad = sum([x.grad.numel() for x in model1.parameters() if x.grad is not None]) - - model2 = models.__dict__[name](num_classes=50, memory_efficient=False) - model2.load_state_dict(params) - model2.eval() - out2 = model2(x) - - self.assertTrue(num_params == num_grad) - torch.testing.assert_close(out1, out2, rtol=0.0, atol=1e-5) - - def test_resnet_dilation(self): - # TODO improve tests to also check that each layer has the right dimensionality - for i in product([False, True], [False, True], [False, True]): - model = models.__dict__["resnet50"](replace_stride_with_dilation=i) - model = self._make_sliced_model(model, stop_layer="layer4") - model.eval() - x = torch.rand(1, 3, 224, 224) - out = model(x) - f = 2 ** sum(i) - self.assertEqual(out.shape, (1, 2048, 7 * f, 7 * f)) - - def test_mobilenet_v2_residual_setting(self): - model = models.__dict__["mobilenet_v2"](inverted_residual_setting=[[1, 16, 1, 1], [6, 24, 2, 2]]) - model.eval() - x = torch.rand(1, 3, 224, 224) - out = model(x) - self.assertEqual(out.shape[-1], 1000) - - def test_mobilenet_norm_layer(self): - for name in ["mobilenet_v2", "mobilenet_v3_large", "mobilenet_v3_small"]: - model = models.__dict__[name]() - self.assertTrue(any(isinstance(x, nn.BatchNorm2d) for x in model.modules())) - - def get_gn(num_channels): - return nn.GroupNorm(32, num_channels) - - model = models.__dict__[name](norm_layer=get_gn) - self.assertFalse(any(isinstance(x, nn.BatchNorm2d) for x in model.modules())) - self.assertTrue(any(isinstance(x, nn.GroupNorm) for x in model.modules())) - - def test_inception_v3_eval(self): - # replacement for models.inception_v3(pretrained=True) that does not download weights - kwargs = {} - kwargs['transform_input'] = True - kwargs['aux_logits'] = True - kwargs['init_weights'] = False - name = "inception_v3" - model = models.Inception3(**kwargs) - model.aux_logits = False - model.AuxLogits = None - model = model.eval() - x = torch.rand(1, 3, 299, 299) - self.check_jit_scriptable(model, (x,), unwrapper=script_model_unwrapper.get(name, None)) - - def test_fasterrcnn_double(self): - model = models.detection.fasterrcnn_resnet50_fpn(num_classes=50, pretrained_backbone=False) - model.double() - model.eval() - input_shape = (3, 300, 300) - x = torch.rand(input_shape, dtype=torch.float64) - model_input = [x] - out = model(model_input) - self.assertIs(model_input[0], x) - self.assertEqual(len(out), 1) - self.assertTrue("boxes" in out[0]) - self.assertTrue("scores" in out[0]) - self.assertTrue("labels" in out[0]) - - def test_googlenet_eval(self): - # replacement for models.googlenet(pretrained=True) that does not download weights - kwargs = {} - kwargs['transform_input'] = True - kwargs['aux_logits'] = True - kwargs['init_weights'] = False - name = "googlenet" - model = models.GoogLeNet(**kwargs) - model.aux_logits = False - model.aux1 = None - model.aux2 = None - model = model.eval() - x = torch.rand(1, 3, 224, 224) - self.check_jit_scriptable(model, (x,), unwrapper=script_model_unwrapper.get(name, None)) - - @unittest.skipIf(not torch.cuda.is_available(), 'needs GPU') - def test_fasterrcnn_switch_devices(self): - def checkOut(out): - self.assertEqual(len(out), 1) - self.assertTrue("boxes" in out[0]) - self.assertTrue("scores" in out[0]) - self.assertTrue("labels" in out[0]) - - model = models.detection.fasterrcnn_resnet50_fpn(num_classes=50, pretrained_backbone=False) - model.cuda() - model.eval() - input_shape = (3, 300, 300) - x = torch.rand(input_shape, device='cuda') - model_input = [x] - out = model(model_input) - self.assertIs(model_input[0], x) - - checkOut(out) - - with torch.cuda.amp.autocast(): - out = model(model_input) - checkOut(out) +def is_skippable(model_name, device): + if model_name not in skipped_big_models: + return False + + platform_system = platform.system() + device_name = str(device).split(":")[0] + + return (platform_system, device_name) in skipped_big_models[model_name] + + +# The following contains configuration and expected values to be used tests that are model specific +_model_tests_values = { + "retinanet_resnet50_fpn": { + "max_trainable": 5, + "n_trn_params_per_layer": [36, 46, 65, 78, 88, 89], + }, + "retinanet_resnet50_fpn_v2": { + "max_trainable": 5, + "n_trn_params_per_layer": [44, 74, 131, 170, 200, 203], + }, + "keypointrcnn_resnet50_fpn": { + "max_trainable": 5, + "n_trn_params_per_layer": [48, 58, 77, 90, 100, 101], + }, + "fasterrcnn_resnet50_fpn": { + "max_trainable": 5, + "n_trn_params_per_layer": [30, 40, 59, 72, 82, 83], + }, + "fasterrcnn_resnet50_fpn_v2": { + "max_trainable": 5, + "n_trn_params_per_layer": [50, 80, 137, 176, 206, 209], + }, + "maskrcnn_resnet50_fpn": { + "max_trainable": 5, + "n_trn_params_per_layer": [42, 52, 71, 84, 94, 95], + }, + "maskrcnn_resnet50_fpn_v2": { + "max_trainable": 5, + "n_trn_params_per_layer": [66, 96, 153, 192, 222, 225], + }, + "fasterrcnn_mobilenet_v3_large_fpn": { + "max_trainable": 6, + "n_trn_params_per_layer": [22, 23, 44, 70, 91, 97, 100], + }, + "fasterrcnn_mobilenet_v3_large_320_fpn": { + "max_trainable": 6, + "n_trn_params_per_layer": [22, 23, 44, 70, 91, 97, 100], + }, + "ssd300_vgg16": { + "max_trainable": 5, + "n_trn_params_per_layer": [45, 51, 57, 63, 67, 71], + }, + "ssdlite320_mobilenet_v3_large": { + "max_trainable": 6, + "n_trn_params_per_layer": [96, 99, 138, 200, 239, 257, 266], + }, + "fcos_resnet50_fpn": { + "max_trainable": 5, + "n_trn_params_per_layer": [54, 64, 83, 96, 106, 107], + }, +} - # now switch to cpu and make sure it works - model.cpu() - x = x.cpu() - out_cpu = model([x]) - checkOut(out_cpu) +def _make_sliced_model(model, stop_layer): + layers = OrderedDict() + for name, layer in model.named_children(): + layers[name] = layer + if name == stop_layer: + break + new_model = torch.nn.Sequential(layers) + return new_model + + +@pytest.mark.parametrize("model_fn", [models.densenet121, models.densenet169, models.densenet201, models.densenet161]) +def test_memory_efficient_densenet(model_fn): + input_shape = (1, 3, 300, 300) + x = torch.rand(input_shape) + + model1 = model_fn(num_classes=50, memory_efficient=True) + params = model1.state_dict() + num_params = sum(x.numel() for x in model1.parameters()) + model1.eval() + out1 = model1(x) + out1.sum().backward() + num_grad = sum(x.grad.numel() for x in model1.parameters() if x.grad is not None) + + model2 = model_fn(num_classes=50, memory_efficient=False) + model2.load_state_dict(params) + model2.eval() + out2 = model2(x) + + assert num_params == num_grad + torch.testing.assert_close(out1, out2, rtol=0.0, atol=1e-5) + + _check_input_backprop(model1, x) + _check_input_backprop(model2, x) + + +@pytest.mark.parametrize("dilate_layer_2", (True, False)) +@pytest.mark.parametrize("dilate_layer_3", (True, False)) +@pytest.mark.parametrize("dilate_layer_4", (True, False)) +def test_resnet_dilation(dilate_layer_2, dilate_layer_3, dilate_layer_4): + # TODO improve tests to also check that each layer has the right dimensionality + model = models.resnet50(replace_stride_with_dilation=(dilate_layer_2, dilate_layer_3, dilate_layer_4)) + model = _make_sliced_model(model, stop_layer="layer4") + model.eval() + x = torch.rand(1, 3, 224, 224) + out = model(x) + f = 2 ** sum((dilate_layer_2, dilate_layer_3, dilate_layer_4)) + assert out.shape == (1, 2048, 7 * f, 7 * f) + + +def test_mobilenet_v2_residual_setting(): + model = models.mobilenet_v2(inverted_residual_setting=[[1, 16, 1, 1], [6, 24, 2, 2]]) + model.eval() + x = torch.rand(1, 3, 224, 224) + out = model(x) + assert out.shape[-1] == 1000 + + +@pytest.mark.parametrize("model_fn", [models.mobilenet_v2, models.mobilenet_v3_large, models.mobilenet_v3_small]) +def test_mobilenet_norm_layer(model_fn): + model = model_fn() + assert any(isinstance(x, nn.BatchNorm2d) for x in model.modules()) + + def get_gn(num_channels): + return nn.GroupNorm(1, num_channels) + + model = model_fn(norm_layer=get_gn) + assert not (any(isinstance(x, nn.BatchNorm2d) for x in model.modules())) + assert any(isinstance(x, nn.GroupNorm) for x in model.modules()) + + +def test_inception_v3_eval(): + kwargs = {} + kwargs["transform_input"] = True + kwargs["aux_logits"] = True + kwargs["init_weights"] = False + name = "inception_v3" + model = models.Inception3(**kwargs) + model.aux_logits = False + model.AuxLogits = None + model = model.eval() + x = torch.rand(1, 3, 299, 299) + _check_jit_scriptable(model, (x,), unwrapper=script_model_unwrapper.get(name, None)) + _check_input_backprop(model, x) + + +def test_fasterrcnn_double(): + model = models.detection.fasterrcnn_resnet50_fpn(num_classes=50, weights=None, weights_backbone=None) + model.double() + model.eval() + input_shape = (3, 300, 300) + x = torch.rand(input_shape, dtype=torch.float64) + model_input = [x] + out = model(model_input) + assert model_input[0] is x + assert len(out) == 1 + assert "boxes" in out[0] + assert "scores" in out[0] + assert "labels" in out[0] + _check_input_backprop(model, model_input) + + +def test_googlenet_eval(): + kwargs = {} + kwargs["transform_input"] = True + kwargs["aux_logits"] = True + kwargs["init_weights"] = False + name = "googlenet" + model = models.GoogLeNet(**kwargs) + model.aux_logits = False + model.aux1 = None + model.aux2 = None + model = model.eval() + x = torch.rand(1, 3, 224, 224) + _check_jit_scriptable(model, (x,), unwrapper=script_model_unwrapper.get(name, None)) + _check_input_backprop(model, x) + + +@needs_cuda +def test_fasterrcnn_switch_devices(): + def checkOut(out): + assert len(out) == 1 + assert "boxes" in out[0] + assert "scores" in out[0] + assert "labels" in out[0] + + model = models.detection.fasterrcnn_resnet50_fpn(num_classes=50, weights=None, weights_backbone=None) + model.cuda() + model.eval() + input_shape = (3, 300, 300) + x = torch.rand(input_shape, device="cuda") + model_input = [x] + out = model(model_input) + assert model_input[0] is x + + checkOut(out) + + with torch.cuda.amp.autocast(): + out = model(model_input) - def test_generalizedrcnn_transform_repr(self): + checkOut(out) + + _check_input_backprop(model, model_input) + + # now switch to cpu and make sure it works + model.cpu() + x = x.cpu() + out_cpu = model([x]) + + checkOut(out_cpu) + + _check_input_backprop(model, [x]) + + +def test_generalizedrcnn_transform_repr(): + + min_size, max_size = 224, 299 + image_mean = [0.485, 0.456, 0.406] + image_std = [0.229, 0.224, 0.225] + + t = models.detection.transform.GeneralizedRCNNTransform( + min_size=min_size, max_size=max_size, image_mean=image_mean, image_std=image_std + ) + + # Check integrity of object __repr__ attribute + expected_string = "GeneralizedRCNNTransform(" + _indent = "\n " + expected_string += f"{_indent}Normalize(mean={image_mean}, std={image_std})" + expected_string += f"{_indent}Resize(min_size=({min_size},), max_size={max_size}, " + expected_string += "mode='bilinear')\n)" + assert t.__repr__() == expected_string + + +test_vit_conv_stem_configs = [ + models.vision_transformer.ConvStemConfig(kernel_size=3, stride=2, out_channels=64), + models.vision_transformer.ConvStemConfig(kernel_size=3, stride=2, out_channels=128), + models.vision_transformer.ConvStemConfig(kernel_size=3, stride=1, out_channels=128), + models.vision_transformer.ConvStemConfig(kernel_size=3, stride=2, out_channels=256), + models.vision_transformer.ConvStemConfig(kernel_size=3, stride=1, out_channels=256), + models.vision_transformer.ConvStemConfig(kernel_size=3, stride=2, out_channels=512), +] + + +def vitc_b_16(**kwargs: Any): + return models.VisionTransformer( + image_size=224, + patch_size=16, + num_layers=12, + num_heads=12, + hidden_dim=768, + mlp_dim=3072, + conv_stem_configs=test_vit_conv_stem_configs, + **kwargs, + ) + + +@pytest.mark.parametrize("model_fn", [vitc_b_16]) +@pytest.mark.parametrize("dev", cpu_and_cuda()) +def test_vitc_models(model_fn, dev): + test_classification_model(model_fn, dev) + + +@torch.backends.cudnn.flags(allow_tf32=False) # see: https://github.com/pytorch/vision/issues/7618 +@pytest.mark.parametrize("model_fn", list_model_fns(models)) +@pytest.mark.parametrize("dev", cpu_and_cuda()) +def test_classification_model(model_fn, dev): + set_rng_seed(0) + defaults = { + "num_classes": 50, + "input_shape": (1, 3, 224, 224), + } + model_name = model_fn.__name__ + if SKIP_BIG_MODEL and is_skippable(model_name, dev): + pytest.skip("Skipped to reduce memory usage. Set env var SKIP_BIG_MODEL=0 to enable test for this model") + kwargs = {**defaults, **_model_params.get(model_name, {})} + num_classes = kwargs.get("num_classes") + input_shape = kwargs.pop("input_shape") + real_image = kwargs.pop("real_image", False) + + model = model_fn(**kwargs) + model.eval().to(device=dev) + x = _get_image(input_shape=input_shape, real_image=real_image, device=dev) + out = model(x) + # FIXME: this if/else is nasty and only here to please our CI prior to the + # release. We rethink these tests altogether. + if model_name == "resnet101": + prec = 0.2 + else: + # FIXME: this is probably still way too high. + prec = 0.1 + _assert_expected(out.cpu(), model_name, prec=prec) + assert out.shape[-1] == num_classes + _check_jit_scriptable(model, (x,), unwrapper=script_model_unwrapper.get(model_name, None), eager_out=out) + _check_fx_compatible(model, x, eager_out=out) + + if dev == "cuda": + with torch.cuda.amp.autocast(): + out = model(x) + # See autocast_flaky_numerics comment at top of file. + if model_name not in autocast_flaky_numerics: + _assert_expected(out.cpu(), model_name, prec=0.1) + assert out.shape[-1] == 50 + + _check_input_backprop(model, x) + + +@pytest.mark.parametrize("model_fn", list_model_fns(models.segmentation)) +@pytest.mark.parametrize("dev", cpu_and_cuda()) +def test_segmentation_model(model_fn, dev): + set_rng_seed(0) + defaults = { + "num_classes": 10, + "weights_backbone": None, + "input_shape": (1, 3, 32, 32), + } + model_name = model_fn.__name__ + kwargs = {**defaults, **_model_params.get(model_name, {})} + input_shape = kwargs.pop("input_shape") + + model = model_fn(**kwargs) + model.eval().to(device=dev) + # RNG always on CPU, to ensure x in cuda tests is bitwise identical to x in cpu tests + x = torch.rand(input_shape).to(device=dev) + with torch.no_grad(), freeze_rng_state(): + out = model(x) - min_size, max_size = 224, 299 - image_mean = [0.485, 0.456, 0.406] - image_std = [0.229, 0.224, 0.225] + def check_out(out): + prec = 0.01 + try: + # We first try to assert the entire output if possible. This is not + # only the best way to assert results but also handles the cases + # where we need to create a new expected result. + _assert_expected(out.cpu(), model_name, prec=prec) + except AssertionError: + # Unfortunately some segmentation models are flaky with autocast + # so instead of validating the probability scores, check that the class + # predictions match. + expected_file = _get_expected_file(model_name) + expected = torch.load(expected_file, weights_only=True) + torch.testing.assert_close( + out.argmax(dim=1), expected.argmax(dim=1), rtol=prec, atol=prec, check_device=False + ) + return False # Partial validation performed + + return True # Full validation performed + + full_validation = check_out(out["out"]) + + _check_jit_scriptable(model, (x,), unwrapper=script_model_unwrapper.get(model_name, None), eager_out=out) + _check_fx_compatible(model, x, eager_out=out) + + if dev == "cuda": + with torch.cuda.amp.autocast(), torch.no_grad(), freeze_rng_state(): + out = model(x) + # See autocast_flaky_numerics comment at top of file. + if model_name not in autocast_flaky_numerics: + full_validation &= check_out(out["out"]) + + if not full_validation: + msg = ( + f"The output of {test_segmentation_model.__name__} could only be partially validated. " + "This is likely due to unit-test flakiness, but you may " + "want to do additional manual checks if you made " + "significant changes to the codebase." + ) + warnings.warn(msg, RuntimeWarning) + pytest.skip(msg) + + _check_input_backprop(model, x) + + +@pytest.mark.parametrize("model_fn", list_model_fns(models.detection)) +@pytest.mark.parametrize("dev", cpu_and_cuda()) +def test_detection_model(model_fn, dev): + set_rng_seed(0) + defaults = { + "num_classes": 50, + "weights_backbone": None, + "input_shape": (3, 300, 300), + } + model_name = model_fn.__name__ + if model_name in detection_flaky_models: + dtype = torch.float64 + else: + dtype = torch.get_default_dtype() + kwargs = {**defaults, **_model_params.get(model_name, {})} + input_shape = kwargs.pop("input_shape") + real_image = kwargs.pop("real_image", False) + + model = model_fn(**kwargs) + model.eval().to(device=dev, dtype=dtype) + x = _get_image(input_shape=input_shape, real_image=real_image, device=dev, dtype=dtype) + model_input = [x] + with torch.no_grad(), freeze_rng_state(): + out = model(model_input) + assert model_input[0] is x + + def check_out(out): + assert len(out) == 1 + + def compact(tensor): + tensor = tensor.cpu() + size = tensor.size() + elements_per_sample = functools.reduce(operator.mul, size[1:], 1) + if elements_per_sample > 30: + return compute_mean_std(tensor) + else: + return subsample_tensor(tensor) + + def subsample_tensor(tensor): + num_elems = tensor.size(0) + num_samples = 20 + if num_elems <= num_samples: + return tensor + + ith_index = num_elems // num_samples + return tensor[ith_index - 1 :: ith_index] + + def compute_mean_std(tensor): + # can't compute mean of integral tensor + tensor = tensor.to(torch.double) + mean = torch.mean(tensor) + std = torch.std(tensor) + return {"mean": mean, "std": std} + + output = map_nested_tensor_object(out, tensor_map_fn=compact) + prec = 0.01 + try: + # We first try to assert the entire output if possible. This is not + # only the best way to assert results but also handles the cases + # where we need to create a new expected result. + _assert_expected(output, model_name, prec=prec) + except AssertionError: + # Unfortunately detection models are flaky due to the unstable sort + # in NMS. If matching across all outputs fails, use the same approach + # as in NMSTester.test_nms_cuda to see if this is caused by duplicate + # scores. + expected_file = _get_expected_file(model_name) + expected = torch.load(expected_file, weights_only=True) + torch.testing.assert_close( + output[0]["scores"], expected[0]["scores"], rtol=prec, atol=prec, check_device=False, check_dtype=False + ) + + # Note: Fmassa proposed turning off NMS by adapting the threshold + # and then using the Hungarian algorithm as in DETR to find the + # best match between output and expected boxes and eliminate some + # of the flakiness. Worth exploring. + return False # Partial validation performed + + return True # Full validation performed + + full_validation = check_out(out) + _check_jit_scriptable(model, ([x],), unwrapper=script_model_unwrapper.get(model_name, None), eager_out=out) + + if dev == "cuda": + with torch.cuda.amp.autocast(), torch.no_grad(), freeze_rng_state(): + out = model(model_input) + # See autocast_flaky_numerics comment at top of file. + if model_name not in autocast_flaky_numerics: + full_validation &= check_out(out) + + if not full_validation: + msg = ( + f"The output of {test_detection_model.__name__} could only be partially validated. " + "This is likely due to unit-test flakiness, but you may " + "want to do additional manual checks if you made " + "significant changes to the codebase." + ) + warnings.warn(msg, RuntimeWarning) + pytest.skip(msg) + + _check_input_backprop(model, model_input) + + +@pytest.mark.parametrize("model_fn", list_model_fns(models.detection)) +def test_detection_model_validation(model_fn): + set_rng_seed(0) + model = model_fn(num_classes=50, weights=None, weights_backbone=None) + input_shape = (3, 300, 300) + x = [torch.rand(input_shape)] + + # validate that targets are present in training + with pytest.raises(AssertionError): + model(x) + + # validate type + targets = [{"boxes": 0.0}] + with pytest.raises(AssertionError): + model(x, targets=targets) + + # validate boxes shape + for boxes in (torch.rand((4,)), torch.rand((1, 5))): + targets = [{"boxes": boxes}] + with pytest.raises(AssertionError): + model(x, targets=targets) + + # validate that no degenerate boxes are present + boxes = torch.tensor([[1, 3, 1, 4], [2, 4, 3, 4]]) + targets = [{"boxes": boxes}] + with pytest.raises(AssertionError): + model(x, targets=targets) + + +@pytest.mark.parametrize("model_fn", list_model_fns(models.video)) +@pytest.mark.parametrize("dev", cpu_and_cuda()) +def test_video_model(model_fn, dev): + set_rng_seed(0) + # the default input shape is + # bs * num_channels * clip_len * h *w + defaults = { + "input_shape": (1, 3, 4, 112, 112), + "num_classes": 50, + } + model_name = model_fn.__name__ + if SKIP_BIG_MODEL and is_skippable(model_name, dev): + pytest.skip("Skipped to reduce memory usage. Set env var SKIP_BIG_MODEL=0 to enable test for this model") + kwargs = {**defaults, **_model_params.get(model_name, {})} + num_classes = kwargs.get("num_classes") + input_shape = kwargs.pop("input_shape") + # test both basicblock and Bottleneck + model = model_fn(**kwargs) + model.eval().to(device=dev) + # RNG always on CPU, to ensure x in cuda tests is bitwise identical to x in cpu tests + x = torch.rand(input_shape).to(device=dev) + out = model(x) + _assert_expected(out.cpu(), model_name, prec=0.1) + assert out.shape[-1] == num_classes + _check_jit_scriptable(model, (x,), unwrapper=script_model_unwrapper.get(model_name, None), eager_out=out) + _check_fx_compatible(model, x, eager_out=out) + assert out.shape[-1] == num_classes + + if dev == "cuda": + with torch.cuda.amp.autocast(): + out = model(x) + # See autocast_flaky_numerics comment at top of file. + if model_name not in autocast_flaky_numerics: + _assert_expected(out.cpu(), model_name, prec=0.1) + assert out.shape[-1] == num_classes - t = models.detection.transform.GeneralizedRCNNTransform(min_size=min_size, - max_size=max_size, - image_mean=image_mean, - image_std=image_std) + _check_input_backprop(model, x) - # Check integrity of object __repr__ attribute - expected_string = 'GeneralizedRCNNTransform(' - _indent = '\n ' - expected_string += '{0}Normalize(mean={1}, std={2})'.format(_indent, image_mean, image_std) - expected_string += '{0}Resize(min_size=({1},), max_size={2}, '.format(_indent, min_size, max_size) - expected_string += "mode='bilinear')\n)" - self.assertEqual(t.__repr__(), expected_string) +@pytest.mark.skipif( + not ( + "fbgemm" in torch.backends.quantized.supported_engines + and "qnnpack" in torch.backends.quantized.supported_engines + ), + reason="This Pytorch Build has not been built with fbgemm and qnnpack", +) +@pytest.mark.parametrize("model_fn", list_model_fns(models.quantization)) +def test_quantized_classification_model(model_fn): + set_rng_seed(0) + defaults = { + "num_classes": 5, + "input_shape": (1, 3, 224, 224), + "quantize": True, + } + model_name = model_fn.__name__ + kwargs = {**defaults, **_model_params.get(model_name, {})} + input_shape = kwargs.pop("input_shape") + + # First check if quantize=True provides models that can run with input data + model = model_fn(**kwargs) + model.eval() + x = torch.rand(input_shape) + out = model(x) + + if model_name not in quantized_flaky_models: + _assert_expected(out.cpu(), model_name + "_quantized", prec=2e-2) + assert out.shape[-1] == 5 + _check_jit_scriptable(model, (x,), unwrapper=script_model_unwrapper.get(model_name, None), eager_out=out) + _check_fx_compatible(model, x, eager_out=out) + else: + try: + torch.jit.script(model) + except Exception as e: + raise AssertionError("model cannot be scripted.") from e + + kwargs["quantize"] = False + for eval_mode in [True, False]: + model = model_fn(**kwargs) + if eval_mode: + model.eval() + model.qconfig = torch.ao.quantization.default_qconfig + else: + model.train() + model.qconfig = torch.ao.quantization.default_qat_qconfig + + model.fuse_model(is_qat=not eval_mode) + if eval_mode: + torch.ao.quantization.prepare(model, inplace=True) + else: + torch.ao.quantization.prepare_qat(model, inplace=True) + model.eval() -_devs = [torch.device("cpu"), torch.device("cuda")] if torch.cuda.is_available() else [torch.device("cpu")] + torch.ao.quantization.convert(model, inplace=True) -@pytest.mark.parametrize('model_name', get_available_classification_models()) -@pytest.mark.parametrize('dev', _devs) -def test_classification_model(model_name, dev): - input_shape = (1, 3, 299, 299) if model_name == 'inception_v3' else (1, 3, 224, 224) - ModelTester()._test_classification_model(model_name, input_shape, dev) +@pytest.mark.parametrize("model_fn", list_model_fns(models.detection)) +def test_detection_model_trainable_backbone_layers(model_fn, disable_weight_loading): + model_name = model_fn.__name__ + max_trainable = _model_tests_values[model_name]["max_trainable"] + n_trainable_params = [] + for trainable_layers in range(0, max_trainable + 1): + model = model_fn(weights=None, weights_backbone="DEFAULT", trainable_backbone_layers=trainable_layers) + n_trainable_params.append(len([p for p in model.parameters() if p.requires_grad])) + assert n_trainable_params == _model_tests_values[model_name]["n_trn_params_per_layer"] -@pytest.mark.parametrize('model_name', get_available_segmentation_models()) -@pytest.mark.parametrize('dev', _devs) -def test_segmentation_model(model_name, dev): - ModelTester()._test_segmentation_model(model_name, dev) +@needs_cuda +@pytest.mark.parametrize("model_fn", list_model_fns(models.optical_flow)) +@pytest.mark.parametrize("scripted", (False, True)) +def test_raft(model_fn, scripted): -@pytest.mark.parametrize('model_name', get_available_detection_models()) -@pytest.mark.parametrize('dev', _devs) -def test_detection_model(model_name, dev): - ModelTester()._test_detection_model(model_name, dev) + torch.manual_seed(0) + # We need very small images, otherwise the pickle size would exceed the 50KB + # As a result we need to override the correlation pyramid to not downsample + # too much, otherwise we would get nan values (effective H and W would be + # reduced to 1) + corr_block = models.optical_flow.raft.CorrBlock(num_levels=2, radius=2) -@pytest.mark.parametrize('model_name', get_available_detection_models()) -def test_detection_model_validation(model_name): - ModelTester()._test_detection_model_validation(model_name) + model = model_fn(corr_block=corr_block).eval().to("cuda") + if scripted: + model = torch.jit.script(model) + bs = 1 + img1 = torch.rand(bs, 3, 80, 72).cuda() + img2 = torch.rand(bs, 3, 80, 72).cuda() -@pytest.mark.parametrize('model_name', get_available_video_models()) -@pytest.mark.parametrize('dev', _devs) -def test_video_model(model_name, dev): - ModelTester()._test_video_model(model_name, dev) + preds = model(img1, img2) + flow_pred = preds[-1] + # Tolerance is fairly high, but there are 2 * H * W outputs to check + # The .pkl were generated on the AWS cluter, on the CI it looks like the results are slightly different + _assert_expected(flow_pred.cpu(), name=model_fn.__name__, atol=1e-2, rtol=1) -if __name__ == '__main__': +if __name__ == "__main__": pytest.main([__file__]) diff --git a/test/test_models_detection_anchor_utils.py b/test/test_models_detection_anchor_utils.py index 13c399a0c32605d8de5e278b4db4d3dcf7d9986c..645d4624d6473b2b7ba36d4446f013881fff08aa 100644 --- a/test/test_models_detection_anchor_utils.py +++ b/test/test_models_detection_anchor_utils.py @@ -1,19 +1,22 @@ +import pytest import torch -from common_utils import TestCase -from _assert_utils import assert_equal +from common_utils import assert_equal from torchvision.models.detection.anchor_utils import AnchorGenerator, DefaultBoxGenerator from torchvision.models.detection.image_list import ImageList -class Tester(TestCase): +class Tester: def test_incorrect_anchors(self): - incorrect_sizes = ((2, 4, 8), (32, 8), ) + incorrect_sizes = ( + (2, 4, 8), + (32, 8), + ) incorrect_aspects = (0.5, 1.0) anc = AnchorGenerator(incorrect_sizes, incorrect_aspects) image1 = torch.randn(3, 800, 800) image_list = ImageList(image1, [(800, 800)]) feature_maps = [torch.randn(1, 50)] - self.assertRaises(ValueError, anc, image_list, feature_maps) + pytest.raises(AssertionError, anc, image_list, feature_maps) def _init_test_anchor_generator(self): anchor_sizes = ((10,),) @@ -49,20 +52,24 @@ class Tester(TestCase): for sizes, num_anchors_per_loc in zip(grid_sizes, model.num_anchors_per_location()): num_anchors_estimated += sizes[0] * sizes[1] * num_anchors_per_loc - anchors_output = torch.tensor([[-5., -5., 5., 5.], - [0., -5., 10., 5.], - [5., -5., 15., 5.], - [-5., 0., 5., 10.], - [0., 0., 10., 10.], - [5., 0., 15., 10.], - [-5., 5., 5., 15.], - [0., 5., 10., 15.], - [5., 5., 15., 15.]]) - - self.assertEqual(num_anchors_estimated, 9) - self.assertEqual(len(anchors), 2) - self.assertEqual(tuple(anchors[0].shape), (9, 4)) - self.assertEqual(tuple(anchors[1].shape), (9, 4)) + anchors_output = torch.tensor( + [ + [-5.0, -5.0, 5.0, 5.0], + [0.0, -5.0, 10.0, 5.0], + [5.0, -5.0, 15.0, 5.0], + [-5.0, 0.0, 5.0, 10.0], + [0.0, 0.0, 10.0, 10.0], + [5.0, 0.0, 15.0, 10.0], + [-5.0, 5.0, 5.0, 15.0], + [0.0, 5.0, 10.0, 15.0], + [5.0, 5.0, 15.0, 15.0], + ] + ) + + assert num_anchors_estimated == 9 + assert len(anchors) == 2 + assert tuple(anchors[0].shape) == (9, 4) + assert tuple(anchors[1].shape) == (9, 4) assert_equal(anchors[0], anchors_output) assert_equal(anchors[1], anchors_output) @@ -76,15 +83,17 @@ class Tester(TestCase): model.eval() dboxes = model(images, features) - dboxes_output = torch.tensor([ - [6.3750, 6.3750, 8.6250, 8.6250], - [4.7443, 4.7443, 10.2557, 10.2557], - [5.9090, 6.7045, 9.0910, 8.2955], - [6.7045, 5.9090, 8.2955, 9.0910] - ]) - - self.assertEqual(len(dboxes), 2) - self.assertEqual(tuple(dboxes[0].shape), (4, 4)) - self.assertEqual(tuple(dboxes[1].shape), (4, 4)) + dboxes_output = torch.tensor( + [ + [6.3750, 6.3750, 8.6250, 8.6250], + [4.7443, 4.7443, 10.2557, 10.2557], + [5.9090, 6.7045, 9.0910, 8.2955], + [6.7045, 5.9090, 8.2955, 9.0910], + ] + ) + + assert len(dboxes) == 2 + assert tuple(dboxes[0].shape) == (4, 4) + assert tuple(dboxes[1].shape) == (4, 4) torch.testing.assert_close(dboxes[0], dboxes_output, rtol=1e-5, atol=1e-8) torch.testing.assert_close(dboxes[1], dboxes_output, rtol=1e-5, atol=1e-8) diff --git a/test/test_models_detection_negative_samples.py b/test/test_models_detection_negative_samples.py index 83ccc58ade5c9498ab3a3fd210d035444e2d15b4..c91cfdf20a77e4cc5d32630370ff47edc4f8e15f 100644 --- a/test/test_models_detection_negative_samples.py +++ b/test/test_models_detection_negative_samples.py @@ -1,24 +1,24 @@ +import pytest import torch - import torchvision.models -from torchvision.ops import MultiScaleRoIAlign -from torchvision.models.detection.rpn import AnchorGenerator, RPNHead, RegionProposalNetwork -from torchvision.models.detection.roi_heads import RoIHeads +from common_utils import assert_equal from torchvision.models.detection.faster_rcnn import FastRCNNPredictor, TwoMLPHead +from torchvision.models.detection.roi_heads import RoIHeads +from torchvision.models.detection.rpn import AnchorGenerator, RegionProposalNetwork, RPNHead +from torchvision.ops import MultiScaleRoIAlign -import unittest - - -class Tester(unittest.TestCase): +class TestModelsDetectionNegativeSamples: def _make_empty_sample(self, add_masks=False, add_keypoints=False): images = [torch.rand((3, 100, 100), dtype=torch.float32)] boxes = torch.zeros((0, 4), dtype=torch.float32) - negative_target = {"boxes": boxes, - "labels": torch.zeros(0, dtype=torch.int64), - "image_id": 4, - "area": (boxes[:, 3] - boxes[:, 1]) * (boxes[:, 2] - boxes[:, 0]), - "iscrowd": torch.zeros((0,), dtype=torch.int64)} + negative_target = { + "boxes": boxes, + "labels": torch.zeros(0, dtype=torch.int64), + "image_id": 4, + "area": (boxes[:, 3] - boxes[:, 1]) * (boxes[:, 2] - boxes[:, 0]), + "iscrowd": torch.zeros((0,), dtype=torch.int64), + } if add_masks: negative_target["masks"] = torch.zeros(0, 100, 100, dtype=torch.uint8) @@ -35,26 +35,20 @@ class Tester(unittest.TestCase): anchor_sizes = ((32,), (64,), (128,), (256,), (512,)) aspect_ratios = ((0.5, 1.0, 2.0),) * len(anchor_sizes) - rpn_anchor_generator = AnchorGenerator( - anchor_sizes, aspect_ratios - ) + rpn_anchor_generator = AnchorGenerator(anchor_sizes, aspect_ratios) rpn_head = RPNHead(4, rpn_anchor_generator.num_anchors_per_location()[0]) - head = RegionProposalNetwork( - rpn_anchor_generator, rpn_head, - 0.5, 0.3, - 256, 0.5, - 2000, 2000, 0.7, 0.05) + head = RegionProposalNetwork(rpn_anchor_generator, rpn_head, 0.5, 0.3, 256, 0.5, 2000, 2000, 0.7, 0.05) labels, matched_gt_boxes = head.assign_targets_to_anchors(anchors, targets) - self.assertEqual(labels[0].sum(), 0) - self.assertEqual(labels[0].shape, torch.Size([anchors[0].shape[0]])) - self.assertEqual(labels[0].dtype, torch.float32) + assert labels[0].sum() == 0 + assert labels[0].shape == torch.Size([anchors[0].shape[0]]) + assert labels[0].dtype == torch.float32 - self.assertEqual(matched_gt_boxes[0].sum(), 0) - self.assertEqual(matched_gt_boxes[0].shape, anchors[0].shape) - self.assertEqual(matched_gt_boxes[0].dtype, torch.float32) + assert matched_gt_boxes[0].sum() == 0 + assert matched_gt_boxes[0].shape == anchors[0].shape + assert matched_gt_boxes[0].dtype == torch.float32 def test_assign_targets_to_proposals(self): @@ -62,92 +56,112 @@ class Tester(unittest.TestCase): gt_boxes = [torch.zeros((0, 4), dtype=torch.float32)] gt_labels = [torch.tensor([[0]], dtype=torch.int64)] - box_roi_pool = MultiScaleRoIAlign( - featmap_names=['0', '1', '2', '3'], - output_size=7, - sampling_ratio=2) + box_roi_pool = MultiScaleRoIAlign(featmap_names=["0", "1", "2", "3"], output_size=7, sampling_ratio=2) resolution = box_roi_pool.output_size[0] representation_size = 1024 - box_head = TwoMLPHead( - 4 * resolution ** 2, - representation_size) + box_head = TwoMLPHead(4 * resolution**2, representation_size) representation_size = 1024 - box_predictor = FastRCNNPredictor( - representation_size, - 2) + box_predictor = FastRCNNPredictor(representation_size, 2) roi_heads = RoIHeads( # Box - box_roi_pool, box_head, box_predictor, - 0.5, 0.5, - 512, 0.25, + box_roi_pool, + box_head, + box_predictor, + 0.5, + 0.5, + 512, + 0.25, None, - 0.05, 0.5, 100) + 0.05, + 0.5, + 100, + ) matched_idxs, labels = roi_heads.assign_targets_to_proposals(proposals, gt_boxes, gt_labels) - self.assertEqual(matched_idxs[0].sum(), 0) - self.assertEqual(matched_idxs[0].shape, torch.Size([proposals[0].shape[0]])) - self.assertEqual(matched_idxs[0].dtype, torch.int64) - - self.assertEqual(labels[0].sum(), 0) - self.assertEqual(labels[0].shape, torch.Size([proposals[0].shape[0]])) - self.assertEqual(labels[0].dtype, torch.int64) - - def test_forward_negative_sample_frcnn(self): - for name in ["fasterrcnn_resnet50_fpn", "fasterrcnn_mobilenet_v3_large_fpn", - "fasterrcnn_mobilenet_v3_large_320_fpn"]: - model = torchvision.models.detection.__dict__[name]( - num_classes=2, min_size=100, max_size=100) + assert matched_idxs[0].sum() == 0 + assert matched_idxs[0].shape == torch.Size([proposals[0].shape[0]]) + assert matched_idxs[0].dtype == torch.int64 + + assert labels[0].sum() == 0 + assert labels[0].shape == torch.Size([proposals[0].shape[0]]) + assert labels[0].dtype == torch.int64 + + @pytest.mark.parametrize( + "name", + [ + "fasterrcnn_resnet50_fpn", + "fasterrcnn_mobilenet_v3_large_fpn", + "fasterrcnn_mobilenet_v3_large_320_fpn", + ], + ) + def test_forward_negative_sample_frcnn(self, name): + model = torchvision.models.get_model( + name, weights=None, weights_backbone=None, num_classes=2, min_size=100, max_size=100 + ) - images, targets = self._make_empty_sample() - loss_dict = model(images, targets) + images, targets = self._make_empty_sample() + loss_dict = model(images, targets) - self.assertEqual(loss_dict["loss_box_reg"], torch.tensor(0.)) - self.assertEqual(loss_dict["loss_rpn_box_reg"], torch.tensor(0.)) + assert_equal(loss_dict["loss_box_reg"], torch.tensor(0.0)) + assert_equal(loss_dict["loss_rpn_box_reg"], torch.tensor(0.0)) def test_forward_negative_sample_mrcnn(self): model = torchvision.models.detection.maskrcnn_resnet50_fpn( - num_classes=2, min_size=100, max_size=100) + weights=None, weights_backbone=None, num_classes=2, min_size=100, max_size=100 + ) images, targets = self._make_empty_sample(add_masks=True) loss_dict = model(images, targets) - self.assertEqual(loss_dict["loss_box_reg"], torch.tensor(0.)) - self.assertEqual(loss_dict["loss_rpn_box_reg"], torch.tensor(0.)) - self.assertEqual(loss_dict["loss_mask"], torch.tensor(0.)) + assert_equal(loss_dict["loss_box_reg"], torch.tensor(0.0)) + assert_equal(loss_dict["loss_rpn_box_reg"], torch.tensor(0.0)) + assert_equal(loss_dict["loss_mask"], torch.tensor(0.0)) def test_forward_negative_sample_krcnn(self): model = torchvision.models.detection.keypointrcnn_resnet50_fpn( - num_classes=2, min_size=100, max_size=100) + weights=None, weights_backbone=None, num_classes=2, min_size=100, max_size=100 + ) images, targets = self._make_empty_sample(add_keypoints=True) loss_dict = model(images, targets) - self.assertEqual(loss_dict["loss_box_reg"], torch.tensor(0.)) - self.assertEqual(loss_dict["loss_rpn_box_reg"], torch.tensor(0.)) - self.assertEqual(loss_dict["loss_keypoint"], torch.tensor(0.)) + assert_equal(loss_dict["loss_box_reg"], torch.tensor(0.0)) + assert_equal(loss_dict["loss_rpn_box_reg"], torch.tensor(0.0)) + assert_equal(loss_dict["loss_keypoint"], torch.tensor(0.0)) def test_forward_negative_sample_retinanet(self): model = torchvision.models.detection.retinanet_resnet50_fpn( - num_classes=2, min_size=100, max_size=100, pretrained_backbone=False) + weights=None, weights_backbone=None, num_classes=2, min_size=100, max_size=100 + ) + + images, targets = self._make_empty_sample() + loss_dict = model(images, targets) + + assert_equal(loss_dict["bbox_regression"], torch.tensor(0.0)) + + def test_forward_negative_sample_fcos(self): + model = torchvision.models.detection.fcos_resnet50_fpn( + weights=None, weights_backbone=None, num_classes=2, min_size=100, max_size=100 + ) images, targets = self._make_empty_sample() loss_dict = model(images, targets) - self.assertEqual(loss_dict["bbox_regression"], torch.tensor(0.)) + assert_equal(loss_dict["bbox_regression"], torch.tensor(0.0)) + assert_equal(loss_dict["bbox_ctrness"], torch.tensor(0.0)) def test_forward_negative_sample_ssd(self): - model = torchvision.models.detection.ssd300_vgg16( - num_classes=2, pretrained_backbone=False) + model = torchvision.models.detection.ssd300_vgg16(weights=None, weights_backbone=None, num_classes=2) images, targets = self._make_empty_sample() loss_dict = model(images, targets) - self.assertEqual(loss_dict["bbox_regression"], torch.tensor(0.)) + assert_equal(loss_dict["bbox_regression"], torch.tensor(0.0)) -if __name__ == '__main__': - unittest.main() +if __name__ == "__main__": + pytest.main([__file__]) diff --git a/test/test_models_detection_utils.py b/test/test_models_detection_utils.py index a20e0abc965638d5a41b40df0befc2afe4374ddb..69703ab5817cd2e10067f3d4c4bdc5653874fe25 100644 --- a/test/test_models_detection_utils.py +++ b/test/test_models_detection_utils.py @@ -1,13 +1,13 @@ import copy + +import pytest import torch -from torchvision.models.detection import _utils +from common_utils import assert_equal +from torchvision.models.detection import _utils, backbone_utils from torchvision.models.detection.transform import GeneralizedRCNNTransform -import unittest -from torchvision.models.detection import backbone_utils -from _assert_utils import assert_equal -class Tester(unittest.TestCase): +class TestModelsDetectionUtils: def test_balanced_positive_negative_sampler(self): sampler = _utils.BalancedPositiveNegativeSampler(4, 0.25) # keep all 6 negatives first, then add 3 positives, last two are ignore @@ -16,56 +16,70 @@ class Tester(unittest.TestCase): # we know the number of elements that should be sampled for the positive (1) # and the negative (3), and their location. Let's make sure that they are # there - self.assertEqual(pos[0].sum(), 1) - self.assertEqual(pos[0][6:9].sum(), 1) - self.assertEqual(neg[0].sum(), 3) - self.assertEqual(neg[0][0:6].sum(), 3) + assert pos[0].sum() == 1 + assert pos[0][6:9].sum() == 1 + assert neg[0].sum() == 3 + assert neg[0][0:6].sum() == 3 + + def test_box_linear_coder(self): + box_coder = _utils.BoxLinearCoder(normalize_by_size=True) + # Generate a random 10x4 boxes tensor, with coordinates < 50. + boxes = torch.rand(10, 4) * 50 + boxes.clamp_(min=1.0) # tiny boxes cause numerical instability in box regression + boxes[:, 2:] += boxes[:, :2] + + proposals = torch.tensor([0, 0, 101, 101] * 10).reshape(10, 4).float() + + rel_codes = box_coder.encode(boxes, proposals) + pred_boxes = box_coder.decode(rel_codes, boxes) + torch.allclose(proposals, pred_boxes) - def test_resnet_fpn_backbone_frozen_layers(self): + @pytest.mark.parametrize("train_layers, exp_froz_params", [(0, 53), (1, 43), (2, 24), (3, 11), (4, 1), (5, 0)]) + def test_resnet_fpn_backbone_frozen_layers(self, train_layers, exp_froz_params): # we know how many initial layers and parameters of the network should # be frozen for each trainable_backbone_layers parameter value - # i.e all 53 params are frozen if trainable_backbone_layers=0 + # i.e. all 53 params are frozen if trainable_backbone_layers=0 # ad first 24 params are frozen if trainable_backbone_layers=2 - expected_frozen_params = {0: 53, 1: 43, 2: 24, 3: 11, 4: 1, 5: 0} - for train_layers, exp_froz_params in expected_frozen_params.items(): - model = backbone_utils.resnet_fpn_backbone( - 'resnet50', pretrained=False, trainable_layers=train_layers) - # boolean list that is true if the param at that index is frozen - is_frozen = [not parameter.requires_grad for _, parameter in model.named_parameters()] - # check that expected initial number of layers are frozen - self.assertTrue(all(is_frozen[:exp_froz_params])) + model = backbone_utils.resnet_fpn_backbone("resnet50", weights=None, trainable_layers=train_layers) + # boolean list that is true if the param at that index is frozen + is_frozen = [not parameter.requires_grad for _, parameter in model.named_parameters()] + # check that expected initial number of layers are frozen + assert all(is_frozen[:exp_froz_params]) def test_validate_resnet_inputs_detection(self): # default number of backbone layers to train ret = backbone_utils._validate_trainable_layers( - pretrained=True, trainable_backbone_layers=None, max_value=5, default_value=3) - self.assertEqual(ret, 3) + is_trained=True, trainable_backbone_layers=None, max_value=5, default_value=3 + ) + assert ret == 3 # can't go beyond 5 - with self.assertRaises(AssertionError): + with pytest.raises(ValueError, match=r"Trainable backbone layers should be in the range"): ret = backbone_utils._validate_trainable_layers( - pretrained=True, trainable_backbone_layers=6, max_value=5, default_value=3) - # if not pretrained, should use all trainable layers and warn - with self.assertWarns(UserWarning): + is_trained=True, trainable_backbone_layers=6, max_value=5, default_value=3 + ) + # if not trained, should use all trainable layers and warn + with pytest.warns(UserWarning): ret = backbone_utils._validate_trainable_layers( - pretrained=False, trainable_backbone_layers=0, max_value=5, default_value=3) - self.assertEqual(ret, 5) + is_trained=False, trainable_backbone_layers=0, max_value=5, default_value=3 + ) + assert ret == 5 def test_transform_copy_targets(self): transform = GeneralizedRCNNTransform(300, 500, torch.zeros(3), torch.ones(3)) image = [torch.rand(3, 200, 300), torch.rand(3, 200, 200)] - targets = [{'boxes': torch.rand(3, 4)}, {'boxes': torch.rand(2, 4)}] + targets = [{"boxes": torch.rand(3, 4)}, {"boxes": torch.rand(2, 4)}] targets_copy = copy.deepcopy(targets) out = transform(image, targets) # noqa: F841 - assert_equal(targets[0]['boxes'], targets_copy[0]['boxes']) - assert_equal(targets[1]['boxes'], targets_copy[1]['boxes']) + assert_equal(targets[0]["boxes"], targets_copy[0]["boxes"]) + assert_equal(targets[1]["boxes"], targets_copy[1]["boxes"]) def test_not_float_normalize(self): transform = GeneralizedRCNNTransform(300, 500, torch.zeros(3), torch.ones(3)) image = [torch.randint(0, 255, (3, 200, 300), dtype=torch.uint8)] - targets = [{'boxes': torch.rand(3, 4)}] - with self.assertRaises(TypeError): + targets = [{"boxes": torch.rand(3, 4)}] + with pytest.raises(TypeError): out = transform(image, targets) # noqa: F841 -if __name__ == '__main__': - unittest.main() +if __name__ == "__main__": + pytest.main([__file__]) diff --git a/test/test_onnx.py b/test/test_onnx.py index d0140c79dfc83779bc0387a16cc6fb4ab22b7570..0350c817ff8ee4fff55ca0bc605e6b5447c3e443 100644 --- a/test/test_onnx.py +++ b/test/test_onnx.py @@ -1,39 +1,41 @@ -# onnxruntime requires python 3.5 or above -try: - # This import should be before that of torch - # see https://github.com/onnx/onnx/issues/2394#issuecomment-581638840 - import onnxruntime -except ImportError: - onnxruntime = None - -from common_utils import set_rng_seed -from _assert_utils import assert_equal import io +from collections import OrderedDict +from typing import List, Optional, Tuple + +import pytest import torch -from torchvision import ops -from torchvision import models +from common_utils import assert_equal, set_rng_seed +from torchvision import models, ops +from torchvision.models.detection.faster_rcnn import FastRCNNPredictor, TwoMLPHead from torchvision.models.detection.image_list import ImageList -from torchvision.models.detection.transform import GeneralizedRCNNTransform -from torchvision.models.detection.rpn import AnchorGenerator, RPNHead, RegionProposalNetwork -from torchvision.models.detection.backbone_utils import resnet_fpn_backbone from torchvision.models.detection.roi_heads import RoIHeads -from torchvision.models.detection.faster_rcnn import FastRCNNPredictor, TwoMLPHead -from torchvision.models.detection.mask_rcnn import MaskRCNNHeads, MaskRCNNPredictor - -from collections import OrderedDict +from torchvision.models.detection.rpn import AnchorGenerator, RegionProposalNetwork, RPNHead +from torchvision.models.detection.transform import GeneralizedRCNNTransform +from torchvision.ops import _register_onnx_ops -import unittest -from torchvision.ops._register_onnx_ops import _onnx_opset_version +# In environments without onnxruntime we prefer to +# invoke all tests in the repo and have this one skipped rather than fail. +onnxruntime = pytest.importorskip("onnxruntime") -@unittest.skipIf(onnxruntime is None, 'ONNX Runtime unavailable') -class ONNXExporterTester(unittest.TestCase): +class TestONNXExporter: @classmethod - def setUpClass(cls): + def setup_class(cls): torch.manual_seed(123) - def run_model(self, model, inputs_list, tolerate_small_mismatch=False, do_constant_folding=True, dynamic_axes=None, - output_names=None, input_names=None): + def run_model( + self, + model, + inputs_list, + do_constant_folding=True, + dynamic_axes=None, + output_names=None, + input_names=None, + opset_version: Optional[int] = None, + ): + if opset_version is None: + opset_version = _register_onnx_ops.BASE_ONNX_OPSET_VERSION + model.eval() onnx_io = io.BytesIO() @@ -42,21 +44,28 @@ class ONNXExporterTester(unittest.TestCase): else: torch_onnx_input = inputs_list[0] # export to onnx with the first input - torch.onnx.export(model, torch_onnx_input, onnx_io, - do_constant_folding=do_constant_folding, opset_version=_onnx_opset_version, - dynamic_axes=dynamic_axes, input_names=input_names, output_names=output_names) + torch.onnx.export( + model, + torch_onnx_input, + onnx_io, + do_constant_folding=do_constant_folding, + opset_version=opset_version, + dynamic_axes=dynamic_axes, + input_names=input_names, + output_names=output_names, + verbose=True, + ) # validate the exported model with onnx runtime for test_inputs in inputs_list: with torch.no_grad(): - if isinstance(test_inputs, torch.Tensor) or \ - isinstance(test_inputs, list): + if isinstance(test_inputs, torch.Tensor) or isinstance(test_inputs, list): test_inputs = (test_inputs,) test_ouputs = model(*test_inputs) if isinstance(test_ouputs, torch.Tensor): test_ouputs = (test_ouputs,) - self.ort_validate(onnx_io, test_inputs, test_ouputs, tolerate_small_mismatch) + self.ort_validate(onnx_io, test_inputs, test_ouputs) - def ort_validate(self, onnx_io, inputs, outputs, tolerate_small_mismatch=False): + def ort_validate(self, onnx_io, inputs, outputs): inputs, _ = torch.jit._flatten(inputs) outputs, _ = torch.jit._flatten(outputs) @@ -70,19 +79,13 @@ class ONNXExporterTester(unittest.TestCase): inputs = list(map(to_numpy, inputs)) outputs = list(map(to_numpy, outputs)) - ort_session = onnxruntime.InferenceSession(onnx_io.getvalue()) + ort_session = onnxruntime.InferenceSession(onnx_io.getvalue(), providers=onnxruntime.get_available_providers()) # compute onnxruntime output prediction - ort_inputs = dict((ort_session.get_inputs()[i].name, inpt) for i, inpt in enumerate(inputs)) + ort_inputs = {ort_session.get_inputs()[i].name: inpt for i, inpt in enumerate(inputs)} ort_outs = ort_session.run(None, ort_inputs) for i in range(0, len(outputs)): - try: - torch.testing.assert_allclose(outputs[i], ort_outs[i], rtol=1e-03, atol=1e-05) - except AssertionError as error: - if tolerate_small_mismatch: - self.assertIn("(0.00%)", str(error), str(error)) - else: - raise + torch.testing.assert_close(outputs[i], ort_outs[i], rtol=1e-03, atol=1e-05) def test_nms(self): num_boxes = 100 @@ -120,9 +123,9 @@ class ONNXExporterTester(unittest.TestCase): def forward(self, boxes, size): return ops.boxes.clip_boxes_to_image(boxes, size.shape) - self.run_model(Module(), [(boxes, size), (boxes, size_2)], - input_names=["boxes", "size"], - dynamic_axes={"size": [0, 1]}) + self.run_model( + Module(), [(boxes, size), (boxes, size_2)], input_names=["boxes", "size"], dynamic_axes={"size": [0, 1]} + ) def test_roi_align(self): x = torch.rand(1, 1, 10, 10, dtype=torch.float32) @@ -136,37 +139,38 @@ class ONNXExporterTester(unittest.TestCase): self.run_model(model, [(x, single_roi)]) def test_roi_align_aligned(self): + supported_onnx_version = _register_onnx_ops._ONNX_OPSET_VERSION_16 x = torch.rand(1, 1, 10, 10, dtype=torch.float32) single_roi = torch.tensor([[0, 1.5, 1.5, 3, 3]], dtype=torch.float32) model = ops.RoIAlign((5, 5), 1, 2, aligned=True) - self.run_model(model, [(x, single_roi)]) + self.run_model(model, [(x, single_roi)], opset_version=supported_onnx_version) x = torch.rand(1, 1, 10, 10, dtype=torch.float32) single_roi = torch.tensor([[0, 0.2, 0.3, 4.5, 3.5]], dtype=torch.float32) model = ops.RoIAlign((5, 5), 0.5, 3, aligned=True) - self.run_model(model, [(x, single_roi)]) + self.run_model(model, [(x, single_roi)], opset_version=supported_onnx_version) x = torch.rand(1, 1, 10, 10, dtype=torch.float32) single_roi = torch.tensor([[0, 0.2, 0.3, 4.5, 3.5]], dtype=torch.float32) model = ops.RoIAlign((5, 5), 1.8, 2, aligned=True) - self.run_model(model, [(x, single_roi)]) + self.run_model(model, [(x, single_roi)], opset_version=supported_onnx_version) x = torch.rand(1, 1, 10, 10, dtype=torch.float32) single_roi = torch.tensor([[0, 0.2, 0.3, 4.5, 3.5]], dtype=torch.float32) model = ops.RoIAlign((2, 2), 2.5, 0, aligned=True) - self.run_model(model, [(x, single_roi)]) + self.run_model(model, [(x, single_roi)], opset_version=supported_onnx_version) x = torch.rand(1, 1, 10, 10, dtype=torch.float32) single_roi = torch.tensor([[0, 0.2, 0.3, 4.5, 3.5]], dtype=torch.float32) model = ops.RoIAlign((2, 2), 2.5, -1, aligned=True) - self.run_model(model, [(x, single_roi)]) + self.run_model(model, [(x, single_roi)], opset_version=supported_onnx_version) - @unittest.skip # Issue in exporting ROIAlign with aligned = True for malformed boxes def test_roi_align_malformed_boxes(self): + supported_onnx_version = _register_onnx_ops._ONNX_OPSET_VERSION_16 x = torch.randn(1, 1, 10, 10, dtype=torch.float32) single_roi = torch.tensor([[0, 2, 0.3, 1.5, 1.5]], dtype=torch.float32) model = ops.RoIAlign((5, 5), 1, 1, aligned=True) - self.run_model(model, [(x, single_roi)]) + self.run_model(model, [(x, single_roi)], opset_version=supported_onnx_version) def test_roi_pool(self): x = torch.rand(1, 1, 10, 10, dtype=torch.float32) @@ -179,7 +183,7 @@ class ONNXExporterTester(unittest.TestCase): def test_resize_images(self): class TransformModule(torch.nn.Module): def __init__(self_module): - super(TransformModule, self_module).__init__() + super().__init__() self_module.transform = self._init_test_generalized_rcnn_transform() def forward(self_module, images): @@ -187,14 +191,14 @@ class ONNXExporterTester(unittest.TestCase): input = torch.rand(3, 10, 20) input_test = torch.rand(3, 100, 150) - self.run_model(TransformModule(), [(input,), (input_test,)], - input_names=["input1"], dynamic_axes={"input1": [0, 1, 2]}) + self.run_model( + TransformModule(), [(input,), (input_test,)], input_names=["input1"], dynamic_axes={"input1": [0, 1, 2]} + ) def test_transform_images(self): - class TransformModule(torch.nn.Module): def __init__(self_module): - super(TransformModule, self_module).__init__() + super().__init__() self_module.transform = self._init_test_generalized_rcnn_transform() def forward(self_module, images): @@ -228,11 +232,17 @@ class ONNXExporterTester(unittest.TestCase): rpn_score_thresh = 0.0 rpn = RegionProposalNetwork( - rpn_anchor_generator, rpn_head, - rpn_fg_iou_thresh, rpn_bg_iou_thresh, - rpn_batch_size_per_image, rpn_positive_fraction, - rpn_pre_nms_top_n, rpn_post_nms_top_n, rpn_nms_thresh, - score_thresh=rpn_score_thresh) + rpn_anchor_generator, + rpn_head, + rpn_fg_iou_thresh, + rpn_bg_iou_thresh, + rpn_batch_size_per_image, + rpn_positive_fraction, + rpn_pre_nms_top_n, + rpn_post_nms_top_n, + rpn_nms_thresh, + score_thresh=rpn_score_thresh, + ) return rpn def _init_test_roi_heads_faster_rcnn(self): @@ -248,38 +258,38 @@ class ONNXExporterTester(unittest.TestCase): box_nms_thresh = 0.5 box_detections_per_img = 100 - box_roi_pool = ops.MultiScaleRoIAlign( - featmap_names=['0', '1', '2', '3'], - output_size=7, - sampling_ratio=2) + box_roi_pool = ops.MultiScaleRoIAlign(featmap_names=["0", "1", "2", "3"], output_size=7, sampling_ratio=2) resolution = box_roi_pool.output_size[0] representation_size = 1024 - box_head = TwoMLPHead( - out_channels * resolution ** 2, - representation_size) + box_head = TwoMLPHead(out_channels * resolution**2, representation_size) representation_size = 1024 - box_predictor = FastRCNNPredictor( - representation_size, - num_classes) + box_predictor = FastRCNNPredictor(representation_size, num_classes) roi_heads = RoIHeads( - box_roi_pool, box_head, box_predictor, - box_fg_iou_thresh, box_bg_iou_thresh, - box_batch_size_per_image, box_positive_fraction, + box_roi_pool, + box_head, + box_predictor, + box_fg_iou_thresh, + box_bg_iou_thresh, + box_batch_size_per_image, + box_positive_fraction, bbox_reg_weights, - box_score_thresh, box_nms_thresh, box_detections_per_img) + box_score_thresh, + box_nms_thresh, + box_detections_per_img, + ) return roi_heads def get_features(self, images): s0, s1 = images.shape[-2:] features = [ - ('0', torch.rand(2, 256, s0 // 4, s1 // 4)), - ('1', torch.rand(2, 256, s0 // 8, s1 // 8)), - ('2', torch.rand(2, 256, s0 // 16, s1 // 16)), - ('3', torch.rand(2, 256, s0 // 32, s1 // 32)), - ('4', torch.rand(2, 256, s0 // 64, s1 // 64)), + ("0", torch.rand(2, 256, s0 // 4, s1 // 4)), + ("1", torch.rand(2, 256, s0 // 8, s1 // 8)), + ("2", torch.rand(2, 256, s0 // 16, s1 // 16)), + ("3", torch.rand(2, 256, s0 // 32, s1 // 32)), + ("4", torch.rand(2, 256, s0 // 64, s1 // 64)), ] features = OrderedDict(features) return features @@ -289,7 +299,7 @@ class ONNXExporterTester(unittest.TestCase): class RPNModule(torch.nn.Module): def __init__(self_module): - super(RPNModule, self_module).__init__() + super().__init__() self_module.rpn = self._init_test_rpn() def forward(self_module, images, features): @@ -305,41 +315,60 @@ class ONNXExporterTester(unittest.TestCase): model.eval() model(images, features) - self.run_model(model, [(images, features), (images2, test_features)], tolerate_small_mismatch=True, - input_names=["input1", "input2", "input3", "input4", "input5", "input6"], - dynamic_axes={"input1": [0, 1, 2, 3], "input2": [0, 1, 2, 3], - "input3": [0, 1, 2, 3], "input4": [0, 1, 2, 3], - "input5": [0, 1, 2, 3], "input6": [0, 1, 2, 3]}) + self.run_model( + model, + [(images, features), (images2, test_features)], + input_names=["input1", "input2", "input3", "input4", "input5", "input6"], + dynamic_axes={ + "input1": [0, 1, 2, 3], + "input2": [0, 1, 2, 3], + "input3": [0, 1, 2, 3], + "input4": [0, 1, 2, 3], + "input5": [0, 1, 2, 3], + "input6": [0, 1, 2, 3], + }, + ) def test_multi_scale_roi_align(self): - class TransformModule(torch.nn.Module): def __init__(self): - super(TransformModule, self).__init__() - self.model = ops.MultiScaleRoIAlign(['feat1', 'feat2'], 3, 2) + super().__init__() + self.model = ops.MultiScaleRoIAlign(["feat1", "feat2"], 3, 2) self.image_sizes = [(512, 512)] def forward(self, input, boxes): return self.model(input, boxes, self.image_sizes) i = OrderedDict() - i['feat1'] = torch.rand(1, 5, 64, 64) - i['feat2'] = torch.rand(1, 5, 16, 16) + i["feat1"] = torch.rand(1, 5, 64, 64) + i["feat2"] = torch.rand(1, 5, 16, 16) boxes = torch.rand(6, 4) * 256 boxes[:, 2:] += boxes[:, :2] i1 = OrderedDict() - i1['feat1'] = torch.rand(1, 5, 64, 64) - i1['feat2'] = torch.rand(1, 5, 16, 16) + i1["feat1"] = torch.rand(1, 5, 64, 64) + i1["feat2"] = torch.rand(1, 5, 16, 16) boxes1 = torch.rand(6, 4) * 256 boxes1[:, 2:] += boxes1[:, :2] - self.run_model(TransformModule(), [(i, [boxes],), (i1, [boxes1],)]) + self.run_model( + TransformModule(), + [ + ( + i, + [boxes], + ), + ( + i1, + [boxes1], + ), + ], + ) def test_roi_heads(self): class RoiHeadsModule(torch.nn.Module): def __init__(self_module): - super(RoiHeadsModule, self_module).__init__() + super().__init__() self_module.transform = self._init_test_generalized_rcnn_transform() self_module.rpn = self._init_test_rpn() self_module.roi_heads = self._init_test_roi_heads_faster_rcnn() @@ -349,9 +378,7 @@ class ONNXExporterTester(unittest.TestCase): images = ImageList(images, [i.shape[-2:] for i in images]) proposals, _ = self_module.rpn(images, features) detections, _ = self_module.roi_heads(features, proposals, images.image_sizes) - detections = self_module.transform.postprocess(detections, - images.image_sizes, - original_image_sizes) + detections = self_module.transform.postprocess(detections, images.image_sizes, original_image_sizes) return detections images = torch.rand(2, 3, 100, 100) @@ -363,74 +390,78 @@ class ONNXExporterTester(unittest.TestCase): model.eval() model(images, features) - self.run_model(model, [(images, features), (images2, test_features)], tolerate_small_mismatch=True, - input_names=["input1", "input2", "input3", "input4", "input5", "input6"], - dynamic_axes={"input1": [0, 1, 2, 3], "input2": [0, 1, 2, 3], "input3": [0, 1, 2, 3], - "input4": [0, 1, 2, 3], "input5": [0, 1, 2, 3], "input6": [0, 1, 2, 3]}) + self.run_model( + model, + [(images, features), (images2, test_features)], + input_names=["input1", "input2", "input3", "input4", "input5", "input6"], + dynamic_axes={ + "input1": [0, 1, 2, 3], + "input2": [0, 1, 2, 3], + "input3": [0, 1, 2, 3], + "input4": [0, 1, 2, 3], + "input5": [0, 1, 2, 3], + "input6": [0, 1, 2, 3], + }, + ) + + def get_image(self, rel_path: str, size: Tuple[int, int]) -> torch.Tensor: + import os - def get_image_from_url(self, url, size=None): - import requests from PIL import Image - from io import BytesIO - from torchvision import transforms - - data = requests.get(url) - image = Image.open(BytesIO(data.content)).convert("RGB") - - if size is None: - size = (300, 200) - image = image.resize(size, Image.BILINEAR) - - to_tensor = transforms.ToTensor() - return to_tensor(image) + from torchvision.transforms import functional as F - def get_test_images(self): - image_url = "http://farm3.staticflickr.com/2469/3915380994_2e611b1779_z.jpg" - image = self.get_image_from_url(url=image_url, size=(100, 320)) + data_dir = os.path.join(os.path.dirname(__file__), "assets") + path = os.path.join(data_dir, *rel_path.split("/")) + image = Image.open(path).convert("RGB").resize(size, Image.BILINEAR) - image_url2 = "https://pytorch.org/tutorials/_static/img/tv_tutorial/tv_image05.png" - image2 = self.get_image_from_url(url=image_url2, size=(250, 380)) + return F.convert_image_dtype(F.pil_to_tensor(image)) - images = [image] - test_images = [image2] - return images, test_images + def get_test_images(self) -> Tuple[List[torch.Tensor], List[torch.Tensor]]: + return ( + [self.get_image("encode_jpeg/grace_hopper_517x606.jpg", (100, 320))], + [self.get_image("fakedata/logos/rgb_pytorch.png", (250, 380))], + ) def test_faster_rcnn(self): images, test_images = self.get_test_images() dummy_image = [torch.ones(3, 100, 100) * 0.3] - model = models.detection.faster_rcnn.fasterrcnn_resnet50_fpn(pretrained=True, min_size=200, max_size=300) + model = models.detection.faster_rcnn.fasterrcnn_resnet50_fpn( + weights=models.detection.faster_rcnn.FasterRCNN_ResNet50_FPN_Weights.DEFAULT, min_size=200, max_size=300 + ) model.eval() model(images) # Test exported model on images of different size, or dummy input - self.run_model(model, [(images,), (test_images,), (dummy_image,)], input_names=["images_tensors"], - output_names=["outputs"], - dynamic_axes={"images_tensors": [0, 1, 2], "outputs": [0, 1, 2]}, - tolerate_small_mismatch=True) + self.run_model( + model, + [(images,), (test_images,), (dummy_image,)], + input_names=["images_tensors"], + output_names=["outputs"], + dynamic_axes={"images_tensors": [0, 1, 2], "outputs": [0, 1, 2]}, + ) # Test exported model for an image with no detections on other images - self.run_model(model, [(dummy_image,), (images,)], input_names=["images_tensors"], - output_names=["outputs"], - dynamic_axes={"images_tensors": [0, 1, 2], "outputs": [0, 1, 2]}, - tolerate_small_mismatch=True) + self.run_model( + model, + [(dummy_image,), (images,)], + input_names=["images_tensors"], + output_names=["outputs"], + dynamic_axes={"images_tensors": [0, 1, 2], "outputs": [0, 1, 2]}, + ) # Verify that paste_mask_in_image beahves the same in tracing. # This test also compares both paste_masks_in_image and _onnx_paste_masks_in_image # (since jit_trace witll call _onnx_paste_masks_in_image). def test_paste_mask_in_image(self): - # disable profiling - torch._C._jit_set_profiling_executor(False) - torch._C._jit_set_profiling_mode(False) - masks = torch.rand(10, 1, 26, 26) boxes = torch.rand(10, 4) boxes[:, 2:] += torch.rand(10, 2) boxes *= 50 o_im_s = (100, 100) from torchvision.models.detection.roi_heads import paste_masks_in_image + out = paste_masks_in_image(masks, boxes, o_im_s) - jit_trace = torch.jit.trace(paste_masks_in_image, - (masks, boxes, - [torch.tensor(o_im_s[0]), - torch.tensor(o_im_s[1])])) + jit_trace = torch.jit.trace( + paste_masks_in_image, (masks, boxes, [torch.tensor(o_im_s[0]), torch.tensor(o_im_s[1])]) + ) out_trace = jit_trace(masks, boxes, [torch.tensor(o_im_s[0]), torch.tensor(o_im_s[1])]) assert torch.all(out.eq(out_trace)) @@ -441,6 +472,7 @@ class ONNXExporterTester(unittest.TestCase): boxes2 *= 100 o_im_s2 = (200, 200) from torchvision.models.detection.roi_heads import paste_masks_in_image + out2 = paste_masks_in_image(masks2, boxes2, o_im_s2) out_trace2 = jit_trace(masks2, boxes2, [torch.tensor(o_im_s2[0]), torch.tensor(o_im_s2[1])]) @@ -449,37 +481,48 @@ class ONNXExporterTester(unittest.TestCase): def test_mask_rcnn(self): images, test_images = self.get_test_images() dummy_image = [torch.ones(3, 100, 100) * 0.3] - model = models.detection.mask_rcnn.maskrcnn_resnet50_fpn(pretrained=True, min_size=200, max_size=300) + model = models.detection.mask_rcnn.maskrcnn_resnet50_fpn( + weights=models.detection.mask_rcnn.MaskRCNN_ResNet50_FPN_Weights.DEFAULT, min_size=200, max_size=300 + ) model.eval() model(images) # Test exported model on images of different size, or dummy input - self.run_model(model, [(images,), (test_images,), (dummy_image,)], - input_names=["images_tensors"], - output_names=["boxes", "labels", "scores", "masks"], - dynamic_axes={"images_tensors": [0, 1, 2], "boxes": [0, 1], "labels": [0], - "scores": [0], "masks": [0, 1, 2]}, - tolerate_small_mismatch=True) - # TODO: enable this test once dynamic model export is fixed + self.run_model( + model, + [(images,), (test_images,), (dummy_image,)], + input_names=["images_tensors"], + output_names=["boxes", "labels", "scores", "masks"], + dynamic_axes={ + "images_tensors": [0, 1, 2], + "boxes": [0, 1], + "labels": [0], + "scores": [0], + "masks": [0, 1, 2], + }, + ) # Test exported model for an image with no detections on other images - self.run_model(model, [(dummy_image,), (images,)], - input_names=["images_tensors"], - output_names=["boxes", "labels", "scores", "masks"], - dynamic_axes={"images_tensors": [0, 1, 2], "boxes": [0, 1], "labels": [0], - "scores": [0], "masks": [0, 1, 2]}, - tolerate_small_mismatch=True) + self.run_model( + model, + [(dummy_image,), (images,)], + input_names=["images_tensors"], + output_names=["boxes", "labels", "scores", "masks"], + dynamic_axes={ + "images_tensors": [0, 1, 2], + "boxes": [0, 1], + "labels": [0], + "scores": [0], + "masks": [0, 1, 2], + }, + ) # Verify that heatmaps_to_keypoints behaves the same in tracing. # This test also compares both heatmaps_to_keypoints and _onnx_heatmaps_to_keypoints # (since jit_trace witll call _heatmaps_to_keypoints). - # @unittest.skip("Disable test until Resize bug fixed in ORT") def test_heatmaps_to_keypoints(self): - # disable profiling - torch._C._jit_set_profiling_executor(False) - torch._C._jit_set_profiling_mode(False) - maps = torch.rand(10, 1, 26, 26) rois = torch.rand(10, 4) from torchvision.models.detection.roi_heads import heatmaps_to_keypoints + out = heatmaps_to_keypoints(maps, rois) jit_trace = torch.jit.trace(heatmaps_to_keypoints, (maps, rois)) out_trace = jit_trace(maps, rois) @@ -490,6 +533,7 @@ class ONNXExporterTester(unittest.TestCase): maps2 = torch.rand(20, 2, 21, 21) rois2 = torch.rand(20, 4) from torchvision.models.detection.roi_heads import heatmaps_to_keypoints + out2 = heatmaps_to_keypoints(maps2, rois2) out_trace2 = jit_trace(maps2, rois2) @@ -499,32 +543,40 @@ class ONNXExporterTester(unittest.TestCase): def test_keypoint_rcnn(self): images, test_images = self.get_test_images() dummy_images = [torch.ones(3, 100, 100) * 0.3] - model = models.detection.keypoint_rcnn.keypointrcnn_resnet50_fpn(pretrained=True, min_size=200, max_size=300) + model = models.detection.keypoint_rcnn.keypointrcnn_resnet50_fpn( + weights=models.detection.keypoint_rcnn.KeypointRCNN_ResNet50_FPN_Weights.DEFAULT, min_size=200, max_size=300 + ) model.eval() model(images) - self.run_model(model, [(images,), (test_images,), (dummy_images,)], - input_names=["images_tensors"], - output_names=["outputs1", "outputs2", "outputs3", "outputs4"], - dynamic_axes={"images_tensors": [0, 1, 2]}, - tolerate_small_mismatch=True) - - self.run_model(model, [(dummy_images,), (test_images,)], - input_names=["images_tensors"], - output_names=["outputs1", "outputs2", "outputs3", "outputs4"], - dynamic_axes={"images_tensors": [0, 1, 2]}, - tolerate_small_mismatch=True) + self.run_model( + model, + [(images,), (test_images,), (dummy_images,)], + input_names=["images_tensors"], + output_names=["outputs1", "outputs2", "outputs3", "outputs4"], + dynamic_axes={"images_tensors": [0, 1, 2]}, + ) + + self.run_model( + model, + [(dummy_images,), (test_images,)], + input_names=["images_tensors"], + output_names=["outputs1", "outputs2", "outputs3", "outputs4"], + dynamic_axes={"images_tensors": [0, 1, 2]}, + ) def test_shufflenet_v2_dynamic_axes(self): - model = models.shufflenet_v2_x0_5(pretrained=True) + model = models.shufflenet_v2_x0_5(weights=models.ShuffleNet_V2_X0_5_Weights.DEFAULT) dummy_input = torch.randn(1, 3, 224, 224, requires_grad=True) test_inputs = torch.cat([dummy_input, dummy_input, dummy_input], 0) - self.run_model(model, [(dummy_input,), (test_inputs,)], - input_names=["input_images"], - output_names=["output"], - dynamic_axes={"input_images": {0: 'batch_size'}, "output": {0: 'batch_size'}}, - tolerate_small_mismatch=True) + self.run_model( + model, + [(dummy_input,), (test_inputs,)], + input_names=["input_images"], + output_names=["output"], + dynamic_axes={"input_images": {0: "batch_size"}, "output": {0: "batch_size"}}, + ) -if __name__ == '__main__': - unittest.main() +if __name__ == "__main__": + pytest.main([__file__]) diff --git a/test/test_ops.py b/test/test_ops.py index 964199edc6673856ae9e3ea2baaf7d41327b967e..99b259f73f5be28147682c8f7c235556fd081394 100644 --- a/test/test_ops.py +++ b/test/test_ops.py @@ -1,147 +1,293 @@ -from common_utils import needs_cuda, cpu_only -from _assert_utils import assert_equal import math -import unittest -import pytest +import os +from abc import ABC, abstractmethod +from functools import lru_cache +from itertools import product +from typing import Callable, List, Tuple import numpy as np - +import pytest import torch -from functools import lru_cache -from torch import Tensor +import torch.fx +import torch.nn.functional as F +import torch.testing._internal.optests as optests +from common_utils import assert_equal, cpu_and_cuda, cpu_and_cuda_and_mps, needs_cuda, needs_mps +from PIL import Image +from torch import nn, Tensor +from torch._dynamo.utils import is_compile_supported from torch.autograd import gradcheck from torch.nn.modules.utils import _pair -from torchvision import ops -from typing import Tuple +from torchvision import models, ops +from torchvision.models.feature_extraction import get_graph_node_names -class OpTester(object): - @classmethod - def setUpClass(cls): - cls.dtype = torch.float64 +OPTESTS = [ + "test_schema", + "test_autograd_registration", + "test_faketensor", + "test_aot_dispatch_dynamic", +] - def test_forward_cpu_contiguous(self): - self._test_forward(device=torch.device('cpu'), contiguous=True) - def test_forward_cpu_non_contiguous(self): - self._test_forward(device=torch.device('cpu'), contiguous=False) +# Context manager for setting deterministic flag and automatically +# resetting it to its original value +class DeterministicGuard: + def __init__(self, deterministic, *, warn_only=False): + self.deterministic = deterministic + self.warn_only = warn_only - def test_backward_cpu_contiguous(self): - self._test_backward(device=torch.device('cpu'), contiguous=True) + def __enter__(self): + self.deterministic_restore = torch.are_deterministic_algorithms_enabled() + self.warn_only_restore = torch.is_deterministic_algorithms_warn_only_enabled() + torch.use_deterministic_algorithms(self.deterministic, warn_only=self.warn_only) - def test_backward_cpu_non_contiguous(self): - self._test_backward(device=torch.device('cpu'), contiguous=False) + def __exit__(self, exception_type, exception_value, traceback): + torch.use_deterministic_algorithms(self.deterministic_restore, warn_only=self.warn_only_restore) - @unittest.skipIf(not torch.cuda.is_available(), "CUDA unavailable") - def test_forward_cuda_contiguous(self): - self._test_forward(device=torch.device('cuda'), contiguous=True) - @unittest.skipIf(not torch.cuda.is_available(), "CUDA unavailable") - def test_forward_cuda_non_contiguous(self): - self._test_forward(device=torch.device('cuda'), contiguous=False) +class RoIOpTesterModuleWrapper(nn.Module): + def __init__(self, obj): + super().__init__() + self.layer = obj + self.n_inputs = 2 - @unittest.skipIf(not torch.cuda.is_available(), "CUDA unavailable") - def test_backward_cuda_contiguous(self): - self._test_backward(device=torch.device('cuda'), contiguous=True) + def forward(self, a, b): + self.layer(a, b) - @unittest.skipIf(not torch.cuda.is_available(), "CUDA unavailable") - def test_backward_cuda_non_contiguous(self): - self._test_backward(device=torch.device('cuda'), contiguous=False) - def _test_forward(self, device, contiguous): - pass +class MultiScaleRoIAlignModuleWrapper(nn.Module): + def __init__(self, obj): + super().__init__() + self.layer = obj + self.n_inputs = 3 - def _test_backward(self, device, contiguous): - pass + def forward(self, a, b, c): + self.layer(a, b, c) + + +class DeformConvModuleWrapper(nn.Module): + def __init__(self, obj): + super().__init__() + self.layer = obj + self.n_inputs = 3 + + def forward(self, a, b, c): + self.layer(a, b, c) + + +class StochasticDepthWrapper(nn.Module): + def __init__(self, obj): + super().__init__() + self.layer = obj + self.n_inputs = 1 + + def forward(self, a): + self.layer(a) + + +class DropBlockWrapper(nn.Module): + def __init__(self, obj): + super().__init__() + self.layer = obj + self.n_inputs = 1 + + def forward(self, a): + self.layer(a) + + +class PoolWrapper(nn.Module): + def __init__(self, pool: nn.Module): + super().__init__() + self.pool = pool + + def forward(self, imgs: Tensor, boxes: List[Tensor]) -> Tensor: + return self.pool(imgs, boxes) -class RoIOpTester(OpTester): - def _test_forward(self, device, contiguous, x_dtype=None, rois_dtype=None, **kwargs): - x_dtype = self.dtype if x_dtype is None else x_dtype - rois_dtype = self.dtype if rois_dtype is None else rois_dtype +class RoIOpTester(ABC): + dtype = torch.float64 + mps_dtype = torch.float32 + mps_backward_atol = 2e-2 + + @pytest.mark.parametrize("device", cpu_and_cuda_and_mps()) + @pytest.mark.parametrize("contiguous", (True, False)) + @pytest.mark.parametrize( + "x_dtype", + ( + torch.float16, + torch.float32, + torch.float64, + ), + ids=str, + ) + def test_forward(self, device, contiguous, x_dtype, rois_dtype=None, deterministic=False, **kwargs): + if device == "mps" and x_dtype is torch.float64: + pytest.skip("MPS does not support float64") + + rois_dtype = x_dtype if rois_dtype is None else rois_dtype + + tol = 1e-5 + if x_dtype is torch.half: + if device == "mps": + tol = 5e-3 + else: + tol = 4e-3 + elif x_dtype == torch.bfloat16: + tol = 5e-3 + pool_size = 5 - # n_channels % (pool_size ** 2) == 0 required for PS opeartions. - n_channels = 2 * (pool_size ** 2) + # n_channels % (pool_size ** 2) == 0 required for PS operations. + n_channels = 2 * (pool_size**2) x = torch.rand(2, n_channels, 10, 10, dtype=x_dtype, device=device) if not contiguous: x = x.permute(0, 1, 3, 2) - rois = torch.tensor([[0, 0, 0, 9, 9], # format is (xyxy) - [0, 0, 5, 4, 9], - [0, 5, 5, 9, 9], - [1, 0, 0, 9, 9]], - dtype=rois_dtype, device=device) + rois = torch.tensor( + [[0, 0, 0, 9, 9], [0, 0, 5, 4, 9], [0, 5, 5, 9, 9], [1, 0, 0, 9, 9]], # format is (xyxy) + dtype=rois_dtype, + device=device, + ) pool_h, pool_w = pool_size, pool_size - y = self.fn(x, rois, pool_h, pool_w, spatial_scale=1, sampling_ratio=-1, **kwargs) + with DeterministicGuard(deterministic): + y = self.fn(x, rois, pool_h, pool_w, spatial_scale=1, sampling_ratio=-1, **kwargs) # the following should be true whether we're running an autocast test or not. - self.assertTrue(y.dtype == x.dtype) - gt_y = self.expected_fn(x, rois, pool_h, pool_w, spatial_scale=1, - sampling_ratio=-1, device=device, dtype=self.dtype, **kwargs) + assert y.dtype == x.dtype + gt_y = self.expected_fn( + x, rois, pool_h, pool_w, spatial_scale=1, sampling_ratio=-1, device=device, dtype=x_dtype, **kwargs + ) - tol = 1e-3 if (x_dtype is torch.half or rois_dtype is torch.half) else 1e-5 torch.testing.assert_close(gt_y.to(y), y, rtol=tol, atol=tol) - def _test_backward(self, device, contiguous): + @pytest.mark.parametrize("device", cpu_and_cuda()) + def test_is_leaf_node(self, device): + op_obj = self.make_obj(wrap=True).to(device=device) + graph_node_names = get_graph_node_names(op_obj) + + assert len(graph_node_names) == 2 + assert len(graph_node_names[0]) == len(graph_node_names[1]) + assert len(graph_node_names[0]) == 1 + op_obj.n_inputs + + @pytest.mark.parametrize("device", cpu_and_cuda()) + def test_torch_fx_trace(self, device, x_dtype=torch.float, rois_dtype=torch.float): + op_obj = self.make_obj().to(device=device) + graph_module = torch.fx.symbolic_trace(op_obj) + pool_size = 5 + n_channels = 2 * (pool_size**2) + x = torch.rand(2, n_channels, 5, 5, dtype=x_dtype, device=device) + rois = torch.tensor( + [[0, 0, 0, 9, 9], [0, 0, 5, 4, 9], [0, 5, 5, 9, 9], [1, 0, 0, 9, 9]], # format is (xyxy) + dtype=rois_dtype, + device=device, + ) + output_gt = op_obj(x, rois) + assert output_gt.dtype == x.dtype + output_fx = graph_module(x, rois) + assert output_fx.dtype == x.dtype + tol = 1e-5 + torch.testing.assert_close(output_gt, output_fx, rtol=tol, atol=tol) + + @pytest.mark.parametrize("seed", range(10)) + @pytest.mark.parametrize("device", cpu_and_cuda_and_mps()) + @pytest.mark.parametrize("contiguous", (True, False)) + def test_backward(self, seed, device, contiguous, deterministic=False): + atol = self.mps_backward_atol if device == "mps" else 1e-05 + dtype = self.mps_dtype if device == "mps" else self.dtype + + torch.random.manual_seed(seed) pool_size = 2 - x = torch.rand(1, 2 * (pool_size ** 2), 5, 5, dtype=self.dtype, device=device, requires_grad=True) + x = torch.rand(1, 2 * (pool_size**2), 5, 5, dtype=dtype, device=device, requires_grad=True) if not contiguous: x = x.permute(0, 1, 3, 2) - rois = torch.tensor([[0, 0, 0, 4, 4], # format is (xyxy) - [0, 0, 2, 3, 4], - [0, 2, 2, 4, 4]], - dtype=self.dtype, device=device) + rois = torch.tensor( + [[0, 0, 0, 4, 4], [0, 0, 2, 3, 4], [0, 2, 2, 4, 4]], dtype=dtype, device=device # format is (xyxy) + ) def func(z): return self.fn(z, rois, pool_size, pool_size, spatial_scale=1, sampling_ratio=1) script_func = self.get_script_fn(rois, pool_size) - self.assertTrue(gradcheck(func, (x,))) - self.assertTrue(gradcheck(script_func, (x,))) + with DeterministicGuard(deterministic): + gradcheck(func, (x,), atol=atol) - def test_boxes_shape(self): - self._test_boxes_shape() + gradcheck(script_func, (x,), atol=atol) + + @needs_mps + def test_mps_error_inputs(self): + pool_size = 2 + x = torch.rand(1, 2 * (pool_size**2), 5, 5, dtype=torch.float16, device="mps", requires_grad=True) + rois = torch.tensor( + [[0, 0, 0, 4, 4], [0, 0, 2, 3, 4], [0, 2, 2, 4, 4]], dtype=torch.float16, device="mps" # format is (xyxy) + ) + + def func(z): + return self.fn(z, rois, pool_size, pool_size, spatial_scale=1, sampling_ratio=1) + + with pytest.raises( + RuntimeError, match="MPS does not support (?:ps_)?roi_(?:align|pool)? backward with float16 inputs." + ): + gradcheck(func, (x,)) + + @needs_cuda + @pytest.mark.parametrize("x_dtype", (torch.float, torch.half)) + @pytest.mark.parametrize("rois_dtype", (torch.float, torch.half)) + def test_autocast(self, x_dtype, rois_dtype): + with torch.cuda.amp.autocast(): + self.test_forward(torch.device("cuda"), contiguous=False, x_dtype=x_dtype, rois_dtype=rois_dtype) def _helper_boxes_shape(self, func): # test boxes as Tensor[N, 5] - with self.assertRaises(AssertionError): + with pytest.raises(AssertionError): a = torch.linspace(1, 8 * 8, 8 * 8).reshape(1, 1, 8, 8) boxes = torch.tensor([[0, 0, 3, 3]], dtype=a.dtype) func(a, boxes, output_size=(2, 2)) # test boxes as List[Tensor[N, 4]] - with self.assertRaises(AssertionError): + with pytest.raises(AssertionError): a = torch.linspace(1, 8 * 8, 8 * 8).reshape(1, 1, 8, 8) boxes = torch.tensor([[0, 0, 3]], dtype=a.dtype) ops.roi_pool(a, [boxes], output_size=(2, 2)) + def _helper_jit_boxes_list(self, model): + x = torch.rand(2, 1, 10, 10) + roi = torch.tensor([[0, 0, 0, 9, 9], [0, 0, 5, 4, 9], [0, 5, 5, 9, 9], [1, 0, 0, 9, 9]], dtype=torch.float).t() + rois = [roi, roi] + scriped = torch.jit.script(model) + y = scriped(x, rois) + assert y.shape == (10, 1, 3, 3) + + @abstractmethod def fn(*args, **kwargs): pass + @abstractmethod + def make_obj(*args, **kwargs): + pass + + @abstractmethod def get_script_fn(*args, **kwargs): pass + @abstractmethod def expected_fn(*args, **kwargs): pass - @unittest.skipIf(not torch.cuda.is_available(), "CUDA unavailable") - def test_autocast(self): - for x_dtype in (torch.float, torch.half): - for rois_dtype in (torch.float, torch.half): - with torch.cuda.amp.autocast(): - self._test_forward(torch.device("cuda"), contiguous=False, x_dtype=x_dtype, rois_dtype=rois_dtype) - -class RoIPoolTester(RoIOpTester, unittest.TestCase): +class TestRoiPool(RoIOpTester): def fn(self, x, rois, pool_h, pool_w, spatial_scale=1, sampling_ratio=-1, **kwargs): return ops.RoIPool((pool_h, pool_w), spatial_scale)(x, rois) + def make_obj(self, pool_h=5, pool_w=5, spatial_scale=1, wrap=False): + obj = ops.RoIPool((pool_h, pool_w), spatial_scale) + return RoIOpTesterModuleWrapper(obj) if wrap else obj + def get_script_fn(self, rois, pool_size): scriped = torch.jit.script(ops.roi_pool) return lambda x: scriped(x, rois, pool_size) - def expected_fn(self, x, rois, pool_h, pool_w, spatial_scale=1, sampling_ratio=-1, - device=None, dtype=torch.float64): + def expected_fn( + self, x, rois, pool_h, pool_w, spatial_scale=1, sampling_ratio=-1, device=None, dtype=torch.float64 + ): if device is None: device = torch.device("cpu") @@ -154,7 +300,7 @@ class RoIPoolTester(RoIOpTester, unittest.TestCase): for roi_idx, roi in enumerate(rois): batch_idx = int(roi[0]) j_begin, i_begin, j_end, i_end = (int(round(x.item() * spatial_scale)) for x in roi[1:]) - roi_x = x[batch_idx, :, i_begin:i_end + 1, j_begin:j_end + 1] + roi_x = x[batch_idx, :, i_begin : i_end + 1, j_begin : j_end + 1] roi_h, roi_w = roi_x.shape[-2:] bin_h = roi_h / pool_h @@ -167,24 +313,35 @@ class RoIPoolTester(RoIOpTester, unittest.TestCase): y[roi_idx, :, i, j] = bin_x.reshape(n_channels, -1).max(dim=1)[0] return y - def _test_boxes_shape(self): + def test_boxes_shape(self): self._helper_boxes_shape(ops.roi_pool) + def test_jit_boxes_list(self): + model = PoolWrapper(ops.RoIPool(output_size=[3, 3], spatial_scale=1.0)) + self._helper_jit_boxes_list(model) + + +class TestPSRoIPool(RoIOpTester): + mps_backward_atol = 5e-2 -class PSRoIPoolTester(RoIOpTester, unittest.TestCase): def fn(self, x, rois, pool_h, pool_w, spatial_scale=1, sampling_ratio=-1, **kwargs): return ops.PSRoIPool((pool_h, pool_w), 1)(x, rois) + def make_obj(self, pool_h=5, pool_w=5, spatial_scale=1, wrap=False): + obj = ops.PSRoIPool((pool_h, pool_w), spatial_scale) + return RoIOpTesterModuleWrapper(obj) if wrap else obj + def get_script_fn(self, rois, pool_size): scriped = torch.jit.script(ops.ps_roi_pool) return lambda x: scriped(x, rois, pool_size) - def expected_fn(self, x, rois, pool_h, pool_w, spatial_scale=1, sampling_ratio=-1, - device=None, dtype=torch.float64): + def expected_fn( + self, x, rois, pool_h, pool_w, spatial_scale=1, sampling_ratio=-1, device=None, dtype=torch.float64 + ): if device is None: device = torch.device("cpu") n_input_channels = x.size(1) - self.assertEqual(n_input_channels % (pool_h * pool_w), 0, "input channels must be divisible by ph * pw") + assert n_input_channels % (pool_h * pool_w) == 0, "input channels must be divisible by ph * pw" n_output_channels = int(n_input_channels / (pool_h * pool_w)) y = torch.zeros(rois.size(0), n_output_channels, pool_h, pool_w, dtype=dtype, device=device) @@ -194,7 +351,7 @@ class PSRoIPoolTester(RoIOpTester, unittest.TestCase): for roi_idx, roi in enumerate(rois): batch_idx = int(roi[0]) j_begin, i_begin, j_end, i_end = (int(round(x.item() * spatial_scale)) for x in roi[1:]) - roi_x = x[batch_idx, :, i_begin:i_end + 1, j_begin:j_end + 1] + roi_x = x[batch_idx, :, i_begin : i_end + 1, j_begin : j_end + 1] roi_height = max(i_end - i_begin, 1) roi_width = max(j_end - j_begin, 1) @@ -211,7 +368,7 @@ class PSRoIPoolTester(RoIOpTester, unittest.TestCase): y[roi_idx, c_out, i, j] = t / area return y - def _test_boxes_shape(self): + def test_boxes_shape(self): self._helper_boxes_shape(ops.ps_roi_pool) @@ -247,23 +404,42 @@ def bilinear_interpolate(data, y, x, snap_border=False): return val -class RoIAlignTester(RoIOpTester, unittest.TestCase): +class TestRoIAlign(RoIOpTester): + mps_backward_atol = 6e-2 + def fn(self, x, rois, pool_h, pool_w, spatial_scale=1, sampling_ratio=-1, aligned=False, **kwargs): - return ops.RoIAlign((pool_h, pool_w), spatial_scale=spatial_scale, - sampling_ratio=sampling_ratio, aligned=aligned)(x, rois) + return ops.RoIAlign( + (pool_h, pool_w), spatial_scale=spatial_scale, sampling_ratio=sampling_ratio, aligned=aligned + )(x, rois) + + def make_obj(self, pool_h=5, pool_w=5, spatial_scale=1, sampling_ratio=-1, aligned=False, wrap=False): + obj = ops.RoIAlign( + (pool_h, pool_w), spatial_scale=spatial_scale, sampling_ratio=sampling_ratio, aligned=aligned + ) + return RoIOpTesterModuleWrapper(obj) if wrap else obj def get_script_fn(self, rois, pool_size): scriped = torch.jit.script(ops.roi_align) return lambda x: scriped(x, rois, pool_size) - def expected_fn(self, in_data, rois, pool_h, pool_w, spatial_scale=1, sampling_ratio=-1, aligned=False, - device=None, dtype=torch.float64): + def expected_fn( + self, + in_data, + rois, + pool_h, + pool_w, + spatial_scale=1, + sampling_ratio=-1, + aligned=False, + device=None, + dtype=torch.float64, + ): if device is None: device = torch.device("cpu") n_channels = in_data.size(1) out_data = torch.zeros(rois.size(0), n_channels, pool_h, pool_w, dtype=dtype, device=device) - offset = 0.5 if aligned else 0. + offset = 0.5 if aligned else 0.0 for r, roi in enumerate(rois): batch_idx = int(roi[0]) @@ -282,7 +458,6 @@ class RoIAlignTester(RoIOpTester, unittest.TestCase): grid_w = sampling_ratio if sampling_ratio > 0 else int(np.ceil(bin_w)) for channel in range(0, n_channels): - val = 0 for iy in range(0, grid_h): y = start_h + (iy + 0.5) * bin_h / grid_h @@ -294,14 +469,84 @@ class RoIAlignTester(RoIOpTester, unittest.TestCase): out_data[r, channel, i, j] = val return out_data - def _test_boxes_shape(self): + def test_boxes_shape(self): self._helper_boxes_shape(ops.roi_align) - def _test_forward(self, device, contiguous, x_dtype=None, rois_dtype=None, **kwargs): - for aligned in (True, False): - super()._test_forward(device, contiguous, x_dtype, rois_dtype, aligned=aligned) + @pytest.mark.parametrize("aligned", (True, False)) + @pytest.mark.parametrize("device", cpu_and_cuda_and_mps()) + @pytest.mark.parametrize("x_dtype", (torch.float16, torch.float32, torch.float64)) # , ids=str) + @pytest.mark.parametrize("contiguous", (True, False)) + @pytest.mark.parametrize("deterministic", (True, False)) + @pytest.mark.opcheck_only_one() + def test_forward(self, device, contiguous, deterministic, aligned, x_dtype, rois_dtype=None): + if deterministic and device == "cpu": + pytest.skip("cpu is always deterministic, don't retest") + super().test_forward( + device=device, + contiguous=contiguous, + deterministic=deterministic, + x_dtype=x_dtype, + rois_dtype=rois_dtype, + aligned=aligned, + ) - def test_qroialign(self): + @needs_cuda + @pytest.mark.parametrize("aligned", (True, False)) + @pytest.mark.parametrize("deterministic", (True, False)) + @pytest.mark.parametrize("x_dtype", (torch.float, torch.half)) + @pytest.mark.parametrize("rois_dtype", (torch.float, torch.half)) + @pytest.mark.opcheck_only_one() + def test_autocast(self, aligned, deterministic, x_dtype, rois_dtype): + with torch.cuda.amp.autocast(): + self.test_forward( + torch.device("cuda"), + contiguous=False, + deterministic=deterministic, + aligned=aligned, + x_dtype=x_dtype, + rois_dtype=rois_dtype, + ) + + @pytest.mark.parametrize("aligned", (True, False)) + @pytest.mark.parametrize("deterministic", (True, False)) + @pytest.mark.parametrize("x_dtype", (torch.float, torch.bfloat16)) + @pytest.mark.parametrize("rois_dtype", (torch.float, torch.bfloat16)) + def test_autocast_cpu(self, aligned, deterministic, x_dtype, rois_dtype): + with torch.cpu.amp.autocast(): + self.test_forward( + torch.device("cpu"), + contiguous=False, + deterministic=deterministic, + aligned=aligned, + x_dtype=x_dtype, + rois_dtype=rois_dtype, + ) + + @pytest.mark.parametrize("seed", range(10)) + @pytest.mark.parametrize("device", cpu_and_cuda_and_mps()) + @pytest.mark.parametrize("contiguous", (True, False)) + @pytest.mark.parametrize("deterministic", (True, False)) + @pytest.mark.opcheck_only_one() + def test_backward(self, seed, device, contiguous, deterministic): + if deterministic and device == "cpu": + pytest.skip("cpu is always deterministic, don't retest") + if deterministic and device == "mps": + pytest.skip("no deterministic implementation for mps") + if deterministic and not is_compile_supported(device): + pytest.skip("deterministic implementation only if torch.compile supported") + super().test_backward(seed, device, contiguous, deterministic) + + def _make_rois(self, img_size, num_imgs, dtype, num_rois=1000): + rois = torch.randint(0, img_size // 2, size=(num_rois, 5)).to(dtype) + rois[:, 0] = torch.randint(0, num_imgs, size=(num_rois,)) # set batch index + rois[:, 3:] += rois[:, 1:3] # make sure boxes aren't degenerate + return rois + + @pytest.mark.parametrize("aligned", (True, False)) + @pytest.mark.parametrize("scale, zero_point", ((1, 0), (2, 10), (0.1, 50))) + @pytest.mark.parametrize("qdtype", (torch.qint8, torch.quint8, torch.qint32)) + @pytest.mark.opcheck_only_one() + def test_qroialign(self, aligned, scale, zero_point, qdtype): """Make sure quantized version of RoIAlign is close to float version""" pool_size = 5 img_size = 10 @@ -309,86 +554,88 @@ class RoIAlignTester(RoIOpTester, unittest.TestCase): num_imgs = 1 dtype = torch.float - def make_rois(num_rois=1000): - rois = torch.randint(0, img_size // 2, size=(num_rois, 5)).to(dtype) - rois[:, 0] = torch.randint(0, num_imgs, size=(num_rois,)) # set batch index - rois[:, 3:] += rois[:, 1:3] # make sure boxes aren't degenerate - return rois - - for aligned in (True, False): - for scale, zero_point in ((1, 0), (2, 10), (0.1, 50)): - for qdtype in (torch.qint8, torch.quint8, torch.qint32): - - x = torch.randint(50, 100, size=(num_imgs, n_channels, img_size, img_size)).to(dtype) - qx = torch.quantize_per_tensor(x, scale=scale, zero_point=zero_point, dtype=qdtype) - - rois = make_rois() - qrois = torch.quantize_per_tensor(rois, scale=scale, zero_point=zero_point, dtype=qdtype) - - x, rois = qx.dequantize(), qrois.dequantize() # we want to pass the same inputs - - y = ops.roi_align( - x, - rois, - output_size=pool_size, - spatial_scale=1, - sampling_ratio=-1, - aligned=aligned, - ) - qy = ops.roi_align( - qx, - qrois, - output_size=pool_size, - spatial_scale=1, - sampling_ratio=-1, - aligned=aligned, - ) - - # The output qy is itself a quantized tensor and there might have been a loss of info when it was - # quantized. For a fair comparison we need to quantize y as well - quantized_float_y = torch.quantize_per_tensor(y, scale=scale, zero_point=zero_point, dtype=qdtype) - - try: - # Ideally, we would assert this, which passes with (scale, zero) == (1, 0) - self.assertTrue((qy == quantized_float_y).all()) - except AssertionError: - # But because the computation aren't exactly the same between the 2 RoIAlign procedures, some - # rounding error may lead to a difference of 2 in the output. - # For example with (scale, zero) = (2, 10), 45.00000... will be quantized to 44 - # but 45.00000001 will be rounded to 46. We make sure below that: - # - such discrepancies between qy and quantized_float_y are very rare (less then 5%) - # - any difference between qy and quantized_float_y is == scale - diff_idx = torch.where(qy != quantized_float_y) - num_diff = diff_idx[0].numel() - self.assertTrue(num_diff / qy.numel() < .05) - - abs_diff = torch.abs(qy[diff_idx].dequantize() - quantized_float_y[diff_idx].dequantize()) - t_scale = torch.full_like(abs_diff, fill_value=scale) - torch.testing.assert_close(abs_diff, t_scale, rtol=1e-5, atol=1e-5) + x = torch.randint(50, 100, size=(num_imgs, n_channels, img_size, img_size)).to(dtype) + qx = torch.quantize_per_tensor(x, scale=scale, zero_point=zero_point, dtype=qdtype) + + rois = self._make_rois(img_size, num_imgs, dtype) + qrois = torch.quantize_per_tensor(rois, scale=scale, zero_point=zero_point, dtype=qdtype) + + x, rois = qx.dequantize(), qrois.dequantize() # we want to pass the same inputs + + y = ops.roi_align( + x, + rois, + output_size=pool_size, + spatial_scale=1, + sampling_ratio=-1, + aligned=aligned, + ) + qy = ops.roi_align( + qx, + qrois, + output_size=pool_size, + spatial_scale=1, + sampling_ratio=-1, + aligned=aligned, + ) + # The output qy is itself a quantized tensor and there might have been a loss of info when it was + # quantized. For a fair comparison we need to quantize y as well + quantized_float_y = torch.quantize_per_tensor(y, scale=scale, zero_point=zero_point, dtype=qdtype) + + try: + # Ideally, we would assert this, which passes with (scale, zero) == (1, 0) + assert (qy == quantized_float_y).all() + except AssertionError: + # But because the computation aren't exactly the same between the 2 RoIAlign procedures, some + # rounding error may lead to a difference of 2 in the output. + # For example with (scale, zero) = (2, 10), 45.00000... will be quantized to 44 + # but 45.00000001 will be rounded to 46. We make sure below that: + # - such discrepancies between qy and quantized_float_y are very rare (less then 5%) + # - any difference between qy and quantized_float_y is == scale + diff_idx = torch.where(qy != quantized_float_y) + num_diff = diff_idx[0].numel() + assert num_diff / qy.numel() < 0.05 + + abs_diff = torch.abs(qy[diff_idx].dequantize() - quantized_float_y[diff_idx].dequantize()) + t_scale = torch.full_like(abs_diff, fill_value=scale) + torch.testing.assert_close(abs_diff, t_scale, rtol=1e-5, atol=1e-5) + + def test_qroi_align_multiple_images(self): + dtype = torch.float x = torch.randint(50, 100, size=(2, 3, 10, 10)).to(dtype) qx = torch.quantize_per_tensor(x, scale=1, zero_point=0, dtype=torch.qint8) - rois = make_rois(10) + rois = self._make_rois(img_size=10, num_imgs=2, dtype=dtype, num_rois=10) qrois = torch.quantize_per_tensor(rois, scale=1, zero_point=0, dtype=torch.qint8) - with self.assertRaisesRegex(RuntimeError, "Only one image per batch is allowed"): - ops.roi_align(qx, qrois, output_size=pool_size) + with pytest.raises(RuntimeError, match="Only one image per batch is allowed"): + ops.roi_align(qx, qrois, output_size=5) + + def test_jit_boxes_list(self): + model = PoolWrapper(ops.RoIAlign(output_size=[3, 3], spatial_scale=1.0, sampling_ratio=-1)) + self._helper_jit_boxes_list(model) + +class TestPSRoIAlign(RoIOpTester): + mps_backward_atol = 5e-2 -class PSRoIAlignTester(RoIOpTester, unittest.TestCase): def fn(self, x, rois, pool_h, pool_w, spatial_scale=1, sampling_ratio=-1, **kwargs): - return ops.PSRoIAlign((pool_h, pool_w), spatial_scale=spatial_scale, - sampling_ratio=sampling_ratio)(x, rois) + return ops.PSRoIAlign((pool_h, pool_w), spatial_scale=spatial_scale, sampling_ratio=sampling_ratio)(x, rois) + + def make_obj(self, pool_h=5, pool_w=5, spatial_scale=1, sampling_ratio=-1, wrap=False): + obj = ops.PSRoIAlign((pool_h, pool_w), spatial_scale=spatial_scale, sampling_ratio=sampling_ratio) + return RoIOpTesterModuleWrapper(obj) if wrap else obj def get_script_fn(self, rois, pool_size): scriped = torch.jit.script(ops.ps_roi_align) return lambda x: scriped(x, rois, pool_size) - def expected_fn(self, in_data, rois, pool_h, pool_w, device, spatial_scale=1, - sampling_ratio=-1, dtype=torch.float64): + def expected_fn( + self, in_data, rois, pool_h, pool_w, device, spatial_scale=1, sampling_ratio=-1, dtype=torch.float64 + ): if device is None: device = torch.device("cpu") n_input_channels = in_data.size(1) - self.assertEqual(n_input_channels % (pool_h * pool_w), 0, "input channels must be divisible by ph * pw") + assert n_input_channels % (pool_h * pool_w) == 0, "input channels must be divisible by ph * pw" n_output_channels = int(n_input_channels / (pool_h * pool_w)) out_data = torch.zeros(rois.size(0), n_output_channels, pool_h, pool_w, dtype=dtype, device=device) @@ -421,30 +668,85 @@ class PSRoIAlignTester(RoIOpTester, unittest.TestCase): out_data[r, c_out, i, j] = val return out_data - def _test_boxes_shape(self): + def test_boxes_shape(self): self._helper_boxes_shape(ops.ps_roi_align) -class MultiScaleRoIAlignTester(unittest.TestCase): +@pytest.mark.parametrize( + "op", + ( + torch.ops.torchvision.roi_pool, + torch.ops.torchvision.ps_roi_pool, + torch.ops.torchvision.roi_align, + torch.ops.torchvision.ps_roi_align, + ), +) +@pytest.mark.parametrize("dtype", (torch.float16, torch.float32, torch.float64)) +@pytest.mark.parametrize("device", cpu_and_cuda()) +@pytest.mark.parametrize("requires_grad", (True, False)) +def test_roi_opcheck(op, dtype, device, requires_grad): + # This manually calls opcheck() on the roi ops. We do that instead of + # relying on opcheck.generate_opcheck_tests() as e.g. done for nms, because + # pytest and generate_opcheck_tests() don't interact very well when it comes + # to skipping tests - and these ops need to skip the MPS tests since MPS we + # don't support dynamic shapes yet for MPS. + rois = torch.tensor( + [[0, 0, 0, 9, 9], [0, 0, 5, 4, 9], [0, 5, 5, 9, 9], [1, 0, 0, 9, 9]], + dtype=dtype, + device=device, + requires_grad=requires_grad, + ) + pool_size = 5 + num_channels = 2 * (pool_size**2) + x = torch.rand(2, num_channels, 10, 10, dtype=dtype, device=device) + + kwargs = dict(rois=rois, spatial_scale=1, pooled_height=pool_size, pooled_width=pool_size) + if op in (torch.ops.torchvision.roi_align, torch.ops.torchvision.ps_roi_align): + kwargs["sampling_ratio"] = -1 + if op is torch.ops.torchvision.roi_align: + kwargs["aligned"] = True + + optests.opcheck(op, args=(x,), kwargs=kwargs) + + +class TestMultiScaleRoIAlign: + def make_obj(self, fmap_names=None, output_size=(7, 7), sampling_ratio=2, wrap=False): + if fmap_names is None: + fmap_names = ["0"] + obj = ops.poolers.MultiScaleRoIAlign(fmap_names, output_size, sampling_ratio) + return MultiScaleRoIAlignModuleWrapper(obj) if wrap else obj + def test_msroialign_repr(self): - fmap_names = ['0'] + fmap_names = ["0"] output_size = (7, 7) sampling_ratio = 2 # Pass mock feature map names - t = ops.poolers.MultiScaleRoIAlign(fmap_names, output_size, sampling_ratio) + t = self.make_obj(fmap_names, output_size, sampling_ratio, wrap=False) # Check integrity of object __repr__ attribute - expected_string = (f"MultiScaleRoIAlign(featmap_names={fmap_names}, output_size={output_size}, " - f"sampling_ratio={sampling_ratio})") - self.assertEqual(t.__repr__(), expected_string) + expected_string = ( + f"MultiScaleRoIAlign(featmap_names={fmap_names}, output_size={output_size}, " + f"sampling_ratio={sampling_ratio})" + ) + assert repr(t) == expected_string + + @pytest.mark.parametrize("device", cpu_and_cuda()) + def test_is_leaf_node(self, device): + op_obj = self.make_obj(wrap=True).to(device=device) + graph_node_names = get_graph_node_names(op_obj) + + assert len(graph_node_names) == 2 + assert len(graph_node_names[0]) == len(graph_node_names[1]) + assert len(graph_node_names[0]) == 1 + op_obj.n_inputs class TestNMS: def _reference_nms(self, boxes, scores, iou_threshold): """ Args: - box_scores (N, 5): boxes in corner-form and probabilities. - iou_threshold: intersection over union threshold. + boxes: boxes in corner-form + scores: probabilities + iou_threshold: intersection over union threshold Returns: picked: a list of indexes of the kept boxes """ @@ -480,16 +782,17 @@ class TestNMS: scores = torch.rand(N) return boxes, scores - @cpu_only - @pytest.mark.parametrize("iou", (.2, .5, .8)) - def test_nms_ref(self, iou): - err_msg = 'NMS incompatible between CPU and reference implementation for IoU={}' + @pytest.mark.parametrize("iou", (0.2, 0.5, 0.8)) + @pytest.mark.parametrize("seed", range(10)) + @pytest.mark.opcheck_only_one() + def test_nms_ref(self, iou, seed): + torch.random.manual_seed(seed) + err_msg = "NMS incompatible between CPU and reference implementation for IoU={}" boxes, scores = self._create_tensors_with_iou(1000, iou) keep_ref = self._reference_nms(boxes, scores, iou) keep = ops.nms(boxes, scores, iou) - assert torch.allclose(keep, keep_ref), err_msg.format(iou) + torch.testing.assert_close(keep, keep_ref, msg=err_msg.format(iou)) - @cpu_only def test_nms_input_errors(self): with pytest.raises(RuntimeError): ops.nms(torch.rand(4), torch.rand(3), 0.5) @@ -500,16 +803,16 @@ class TestNMS: with pytest.raises(RuntimeError): ops.nms(torch.rand(3, 4), torch.rand(4), 0.5) - @cpu_only - @pytest.mark.parametrize("iou", (.2, .5, .8)) + @pytest.mark.parametrize("iou", (0.2, 0.5, 0.8)) @pytest.mark.parametrize("scale, zero_point", ((1, 0), (2, 50), (3, 10))) + @pytest.mark.opcheck_only_one() def test_qnms(self, iou, scale, zero_point): # Note: we compare qnms vs nms instead of qnms vs reference implementation. - # This is because with the int convertion, the trick used in _create_tensors_with_iou + # This is because with the int conversion, the trick used in _create_tensors_with_iou # doesn't really work (in fact, nms vs reference implem will also fail with ints) - err_msg = 'NMS and QNMS give different results for IoU={}' + err_msg = "NMS and QNMS give different results for IoU={}" boxes, scores = self._create_tensors_with_iou(1000, iou) - scores *= 100 # otherwise most scores would be 0 or 1 after int convertion + scores *= 100 # otherwise most scores would be 0 or 1 after int conversion qboxes = torch.quantize_per_tensor(boxes, scale=scale, zero_point=zero_point, dtype=torch.quint8) qscores = torch.quantize_per_tensor(scores, scale=scale, zero_point=zero_point, dtype=torch.quint8) @@ -520,50 +823,81 @@ class TestNMS: keep = ops.nms(boxes, scores, iou) qkeep = ops.nms(qboxes, qscores, iou) - assert torch.allclose(qkeep, keep), err_msg.format(iou) - - @needs_cuda - @pytest.mark.parametrize("iou", (.2, .5, .8)) - def test_nms_cuda(self, iou, dtype=torch.float64): + torch.testing.assert_close(qkeep, keep, msg=err_msg.format(iou)) + + @pytest.mark.parametrize( + "device", + ( + pytest.param("cuda", marks=pytest.mark.needs_cuda), + pytest.param("mps", marks=pytest.mark.needs_mps), + ), + ) + @pytest.mark.parametrize("iou", (0.2, 0.5, 0.8)) + @pytest.mark.opcheck_only_one() + def test_nms_gpu(self, iou, device, dtype=torch.float64): + dtype = torch.float32 if device == "mps" else dtype tol = 1e-3 if dtype is torch.half else 1e-5 - err_msg = 'NMS incompatible between CPU and CUDA for IoU={}' + err_msg = "NMS incompatible between CPU and CUDA for IoU={}" boxes, scores = self._create_tensors_with_iou(1000, iou) r_cpu = ops.nms(boxes, scores, iou) - r_cuda = ops.nms(boxes.cuda(), scores.cuda(), iou) + r_gpu = ops.nms(boxes.to(device), scores.to(device), iou) - is_eq = torch.allclose(r_cpu, r_cuda.cpu()) + is_eq = torch.allclose(r_cpu, r_gpu.cpu()) if not is_eq: # if the indices are not the same, ensure that it's because the scores # are duplicate - is_eq = torch.allclose(scores[r_cpu], scores[r_cuda.cpu()], rtol=tol, atol=tol) + is_eq = torch.allclose(scores[r_cpu], scores[r_gpu.cpu()], rtol=tol, atol=tol) assert is_eq, err_msg.format(iou) @needs_cuda - @pytest.mark.parametrize("iou", (.2, .5, .8)) + @pytest.mark.parametrize("iou", (0.2, 0.5, 0.8)) @pytest.mark.parametrize("dtype", (torch.float, torch.half)) + @pytest.mark.opcheck_only_one() def test_autocast(self, iou, dtype): with torch.cuda.amp.autocast(): - self.test_nms_cuda(iou=iou, dtype=dtype) + self.test_nms_gpu(iou=iou, dtype=dtype, device="cuda") - @needs_cuda - def test_nms_cuda_float16(self): - boxes = torch.tensor([[285.3538, 185.5758, 1193.5110, 851.4551], - [285.1472, 188.7374, 1192.4984, 851.0669], - [279.2440, 197.9812, 1189.4746, 849.2019]]).cuda() - scores = torch.tensor([0.6370, 0.7569, 0.3966]).cuda() + @pytest.mark.parametrize("iou", (0.2, 0.5, 0.8)) + @pytest.mark.parametrize("dtype", (torch.float, torch.bfloat16)) + def test_autocast_cpu(self, iou, dtype): + boxes, scores = self._create_tensors_with_iou(1000, iou) + with torch.cpu.amp.autocast(): + keep_ref_float = ops.nms(boxes.to(dtype).float(), scores.to(dtype).float(), iou) + keep_dtype = ops.nms(boxes.to(dtype), scores.to(dtype), iou) + torch.testing.assert_close(keep_ref_float, keep_dtype) + + @pytest.mark.parametrize( + "device", + ( + pytest.param("cuda", marks=pytest.mark.needs_cuda), + pytest.param("mps", marks=pytest.mark.needs_mps), + ), + ) + @pytest.mark.opcheck_only_one() + def test_nms_float16(self, device): + boxes = torch.tensor( + [ + [285.3538, 185.5758, 1193.5110, 851.4551], + [285.1472, 188.7374, 1192.4984, 851.0669], + [279.2440, 197.9812, 1189.4746, 849.2019], + ] + ).to(device) + scores = torch.tensor([0.6370, 0.7569, 0.3966]).to(device) iou_thres = 0.2 keep32 = ops.nms(boxes, scores, iou_thres) keep16 = ops.nms(boxes.to(torch.float16), scores.to(torch.float16), iou_thres) assert_equal(keep32, keep16) - @cpu_only - def test_batched_nms_implementations(self): + @pytest.mark.parametrize("seed", range(10)) + @pytest.mark.opcheck_only_one() + def test_batched_nms_implementations(self, seed): """Make sure that both implementations of batched_nms yield identical results""" + torch.random.manual_seed(seed) num_boxes = 1000 - iou_threshold = .9 + iou_threshold = 0.9 boxes = torch.cat((torch.rand(num_boxes, 2), torch.rand(num_boxes, 2) + 10), dim=1) assert max(boxes[:, 0]) < min(boxes[:, 2]) # x1 < x2 @@ -583,7 +917,18 @@ class TestNMS: torch.testing.assert_close(empty, ops.batched_nms(empty, None, None, None)) -class DeformConvTester(OpTester, unittest.TestCase): +optests.generate_opcheck_tests( + testcase=TestNMS, + namespaces=["torchvision"], + failures_dict_path=os.path.join(os.path.dirname(__file__), "optests_failures_dict.json"), + additional_decorators=[], + test_utils=OPTESTS, +) + + +class TestDeformConv: + dtype = torch.float64 + def expected_fn(self, x, weight, offset, mask, bias, stride=1, padding=0, dilation=1): stride_h, stride_w = _pair(stride) pad_h, pad_w = _pair(padding) @@ -625,8 +970,11 @@ class DeformConvTester(OpTester, unittest.TestCase): if mask is not None: mask_value = mask[b, mask_idx, i, j] - out[b, c_out, i, j] += (mask_value * weight[c_out, c, di, dj] * - bilinear_interpolate(x[b, c_in, :, :], pi, pj)) + out[b, c_out, i, j] += ( + mask_value + * weight[c_out, c, di, dj] + * bilinear_interpolate(x[b, c_in, :, :], pi, pj) + ) out += bias.view(1, n_out_channels, 1, 1) return out @@ -652,14 +1000,29 @@ class DeformConvTester(OpTester, unittest.TestCase): x = torch.rand(batch_sz, n_in_channels, in_h, in_w, device=device, dtype=dtype, requires_grad=True) - offset = torch.randn(batch_sz, n_offset_grps * 2 * weight_h * weight_w, out_h, out_w, - device=device, dtype=dtype, requires_grad=True) + offset = torch.randn( + batch_sz, + n_offset_grps * 2 * weight_h * weight_w, + out_h, + out_w, + device=device, + dtype=dtype, + requires_grad=True, + ) - mask = torch.randn(batch_sz, n_offset_grps * weight_h * weight_w, out_h, out_w, - device=device, dtype=dtype, requires_grad=True) + mask = torch.randn( + batch_sz, n_offset_grps * weight_h * weight_w, out_h, out_w, device=device, dtype=dtype, requires_grad=True + ) - weight = torch.randn(n_out_channels, n_in_channels // n_weight_grps, weight_h, weight_w, - device=device, dtype=dtype, requires_grad=True) + weight = torch.randn( + n_out_channels, + n_in_channels // n_weight_grps, + weight_h, + weight_w, + device=device, + dtype=dtype, + requires_grad=True, + ) bias = torch.randn(n_out_channels, device=device, dtype=dtype, requires_grad=True) @@ -671,12 +1034,27 @@ class DeformConvTester(OpTester, unittest.TestCase): return x, weight, offset, mask, bias, stride, pad, dilation - def _test_forward(self, device, contiguous, dtype=None): - dtype = self.dtype if dtype is None else dtype - for batch_sz in [0, 33]: - self._test_forward_with_batchsize(device, contiguous, batch_sz, dtype) - - def _test_forward_with_batchsize(self, device, contiguous, batch_sz, dtype): + def make_obj(self, in_channels=6, out_channels=2, kernel_size=(3, 2), groups=2, wrap=False): + obj = ops.DeformConv2d( + in_channels, out_channels, kernel_size, stride=(2, 1), padding=(1, 0), dilation=(2, 1), groups=groups + ) + return DeformConvModuleWrapper(obj) if wrap else obj + + @pytest.mark.parametrize("device", cpu_and_cuda()) + def test_is_leaf_node(self, device): + op_obj = self.make_obj(wrap=True).to(device=device) + graph_node_names = get_graph_node_names(op_obj) + + assert len(graph_node_names) == 2 + assert len(graph_node_names[0]) == len(graph_node_names[1]) + assert len(graph_node_names[0]) == 1 + op_obj.n_inputs + + @pytest.mark.parametrize("device", cpu_and_cuda()) + @pytest.mark.parametrize("contiguous", (True, False)) + @pytest.mark.parametrize("batch_sz", (0, 33)) + @pytest.mark.opcheck_only_one() + def test_forward(self, device, contiguous, batch_sz, dtype=None): + dtype = dtype or self.dtype x, _, offset, mask, _, stride, padding, dilation = self.get_fn_args(device, contiguous, batch_sz, dtype) in_channels = 6 out_channels = 2 @@ -684,8 +1062,9 @@ class DeformConvTester(OpTester, unittest.TestCase): groups = 2 tol = 2e-3 if dtype is torch.half else 1e-5 - layer = ops.DeformConv2d(in_channels, out_channels, kernel_size, stride=stride, padding=padding, - dilation=dilation, groups=groups).to(device=x.device, dtype=dtype) + layer = self.make_obj(in_channels, out_channels, kernel_size, groups, wrap=False).to( + device=x.device, dtype=dtype + ) res = layer(x, offset, mask) weight = layer.weight.data @@ -693,7 +1072,7 @@ class DeformConvTester(OpTester, unittest.TestCase): expected = self.expected_fn(x, weight, offset, mask, bias, stride=stride, padding=padding, dilation=dilation) torch.testing.assert_close( - res.to(expected), expected, rtol=tol, atol=tol, msg='\nres:\n{}\nexpected:\n{}'.format(res, expected) + res.to(expected), expected, rtol=tol, atol=tol, msg=f"\nres:\n{res}\nexpected:\n{expected}" ) # no modulation test @@ -701,97 +1080,136 @@ class DeformConvTester(OpTester, unittest.TestCase): expected = self.expected_fn(x, weight, offset, None, bias, stride=stride, padding=padding, dilation=dilation) torch.testing.assert_close( - res.to(expected), expected, rtol=tol, atol=tol, msg='\nres:\n{}\nexpected:\n{}'.format(res, expected) + res.to(expected), expected, rtol=tol, atol=tol, msg=f"\nres:\n{res}\nexpected:\n{expected}" ) - # test for wrong sizes - with self.assertRaises(RuntimeError): + def test_wrong_sizes(self): + in_channels = 6 + out_channels = 2 + kernel_size = (3, 2) + groups = 2 + x, _, offset, mask, _, stride, padding, dilation = self.get_fn_args( + "cpu", contiguous=True, batch_sz=10, dtype=self.dtype + ) + layer = ops.DeformConv2d( + in_channels, out_channels, kernel_size, stride=stride, padding=padding, dilation=dilation, groups=groups + ) + with pytest.raises(RuntimeError, match="the shape of the offset"): wrong_offset = torch.rand_like(offset[:, :2]) - res = layer(x, wrong_offset) + layer(x, wrong_offset) - with self.assertRaises(RuntimeError): + with pytest.raises(RuntimeError, match=r"mask.shape\[1\] is not valid"): wrong_mask = torch.rand_like(mask[:, :2]) - res = layer(x, offset, wrong_mask) - - def _test_backward(self, device, contiguous): - for batch_sz in [0, 33]: - self._test_backward_with_batchsize(device, contiguous, batch_sz) - - def _test_backward_with_batchsize(self, device, contiguous, batch_sz): - x, weight, offset, mask, bias, stride, padding, dilation = self.get_fn_args(device, contiguous, - batch_sz, self.dtype) + layer(x, offset, wrong_mask) + + @pytest.mark.parametrize("device", cpu_and_cuda()) + @pytest.mark.parametrize("contiguous", (True, False)) + @pytest.mark.parametrize("batch_sz", (0, 33)) + @pytest.mark.opcheck_only_one() + def test_backward(self, device, contiguous, batch_sz): + x, weight, offset, mask, bias, stride, padding, dilation = self.get_fn_args( + device, contiguous, batch_sz, self.dtype + ) def func(x_, offset_, mask_, weight_, bias_): - return ops.deform_conv2d(x_, offset_, weight_, bias_, stride=stride, - padding=padding, dilation=dilation, mask=mask_) + return ops.deform_conv2d( + x_, offset_, weight_, bias_, stride=stride, padding=padding, dilation=dilation, mask=mask_ + ) - gradcheck(func, (x, offset, mask, weight, bias), nondet_tol=1e-5) + gradcheck(func, (x, offset, mask, weight, bias), nondet_tol=1e-5, fast_mode=True) def func_no_mask(x_, offset_, weight_, bias_): - return ops.deform_conv2d(x_, offset_, weight_, bias_, stride=stride, - padding=padding, dilation=dilation, mask=None) + return ops.deform_conv2d( + x_, offset_, weight_, bias_, stride=stride, padding=padding, dilation=dilation, mask=None + ) - gradcheck(func_no_mask, (x, offset, weight, bias), nondet_tol=1e-5) + gradcheck(func_no_mask, (x, offset, weight, bias), nondet_tol=1e-5, fast_mode=True) @torch.jit.script def script_func(x_, offset_, mask_, weight_, bias_, stride_, pad_, dilation_): # type:(Tensor, Tensor, Tensor, Tensor, Tensor, Tuple[int, int], Tuple[int, int], Tuple[int, int])->Tensor - return ops.deform_conv2d(x_, offset_, weight_, bias_, stride=stride_, - padding=pad_, dilation=dilation_, mask=mask_) - - gradcheck(lambda z, off, msk, wei, bi: script_func(z, off, msk, wei, bi, stride, padding, dilation), - (x, offset, mask, weight, bias), nondet_tol=1e-5) + return ops.deform_conv2d( + x_, offset_, weight_, bias_, stride=stride_, padding=pad_, dilation=dilation_, mask=mask_ + ) + + gradcheck( + lambda z, off, msk, wei, bi: script_func(z, off, msk, wei, bi, stride, padding, dilation), + (x, offset, mask, weight, bias), + nondet_tol=1e-5, + fast_mode=True, + ) @torch.jit.script def script_func_no_mask(x_, offset_, weight_, bias_, stride_, pad_, dilation_): # type:(Tensor, Tensor, Tensor, Tensor, Tuple[int, int], Tuple[int, int], Tuple[int, int])->Tensor - return ops.deform_conv2d(x_, offset_, weight_, bias_, stride=stride_, - padding=pad_, dilation=dilation_, mask=None) - - gradcheck(lambda z, off, wei, bi: script_func_no_mask(z, off, wei, bi, stride, padding, dilation), - (x, offset, weight, bias), nondet_tol=1e-5) + return ops.deform_conv2d( + x_, offset_, weight_, bias_, stride=stride_, padding=pad_, dilation=dilation_, mask=None + ) + + gradcheck( + lambda z, off, wei, bi: script_func_no_mask(z, off, wei, bi, stride, padding, dilation), + (x, offset, weight, bias), + nondet_tol=1e-5, + fast_mode=True, + ) - @unittest.skipIf(not torch.cuda.is_available(), "CUDA unavailable") - def test_compare_cpu_cuda_grads(self): + @needs_cuda + @pytest.mark.parametrize("contiguous", (True, False)) + @pytest.mark.opcheck_only_one() + def test_compare_cpu_cuda_grads(self, contiguous): # Test from https://github.com/pytorch/vision/issues/2598 # Run on CUDA only - for contiguous in [False, True]: - # compare grads computed on CUDA with grads computed on CPU - true_cpu_grads = None - - init_weight = torch.randn(9, 9, 3, 3, requires_grad=True) - img = torch.randn(8, 9, 1000, 110) - offset = torch.rand(8, 2 * 3 * 3, 1000, 110) - mask = torch.rand(8, 3 * 3, 1000, 110) - - if not contiguous: - img = img.permute(0, 1, 3, 2).contiguous().permute(0, 1, 3, 2) - offset = offset.permute(1, 3, 0, 2).contiguous().permute(2, 0, 3, 1) - mask = mask.permute(1, 3, 0, 2).contiguous().permute(2, 0, 3, 1) - weight = init_weight.permute(3, 2, 0, 1).contiguous().permute(2, 3, 1, 0) + + # compare grads computed on CUDA with grads computed on CPU + true_cpu_grads = None + + init_weight = torch.randn(9, 9, 3, 3, requires_grad=True) + img = torch.randn(8, 9, 1000, 110) + offset = torch.rand(8, 2 * 3 * 3, 1000, 110) + mask = torch.rand(8, 3 * 3, 1000, 110) + + if not contiguous: + img = img.permute(0, 1, 3, 2).contiguous().permute(0, 1, 3, 2) + offset = offset.permute(1, 3, 0, 2).contiguous().permute(2, 0, 3, 1) + mask = mask.permute(1, 3, 0, 2).contiguous().permute(2, 0, 3, 1) + weight = init_weight.permute(3, 2, 0, 1).contiguous().permute(2, 3, 1, 0) + else: + weight = init_weight + + for d in ["cpu", "cuda"]: + out = ops.deform_conv2d(img.to(d), offset.to(d), weight.to(d), padding=1, mask=mask.to(d)) + out.mean().backward() + if true_cpu_grads is None: + true_cpu_grads = init_weight.grad + assert true_cpu_grads is not None else: - weight = init_weight + assert init_weight.grad is not None + res_grads = init_weight.grad.to("cpu") + torch.testing.assert_close(true_cpu_grads, res_grads) + + @needs_cuda + @pytest.mark.parametrize("batch_sz", (0, 33)) + @pytest.mark.parametrize("dtype", (torch.float, torch.half)) + @pytest.mark.opcheck_only_one() + def test_autocast(self, batch_sz, dtype): + with torch.cuda.amp.autocast(): + self.test_forward(torch.device("cuda"), contiguous=False, batch_sz=batch_sz, dtype=dtype) - for d in ["cpu", "cuda"]: + def test_forward_scriptability(self): + # Non-regression test for https://github.com/pytorch/vision/issues/4078 + torch.jit.script(ops.DeformConv2d(in_channels=8, out_channels=8, kernel_size=3)) - out = ops.deform_conv2d(img.to(d), offset.to(d), weight.to(d), padding=1, mask=mask.to(d)) - out.mean().backward() - if true_cpu_grads is None: - true_cpu_grads = init_weight.grad - self.assertTrue(true_cpu_grads is not None) - else: - self.assertTrue(init_weight.grad is not None) - res_grads = init_weight.grad.to("cpu") - torch.testing.assert_close(true_cpu_grads, res_grads) - @unittest.skipIf(not torch.cuda.is_available(), "CUDA unavailable") - def test_autocast(self): - for dtype in (torch.float, torch.half): - with torch.cuda.amp.autocast(): - self._test_forward(torch.device("cuda"), False, dtype=dtype) +optests.generate_opcheck_tests( + testcase=TestDeformConv, + namespaces=["torchvision"], + failures_dict_path=os.path.join(os.path.dirname(__file__), "optests_failures_dict.json"), + additional_decorators=[], + test_utils=OPTESTS, +) -class FrozenBNTester(unittest.TestCase): +class TestFrozenBNT: def test_frozenbatchnorm2d_repr(self): num_features = 32 eps = 1e-5 @@ -799,16 +1217,20 @@ class FrozenBNTester(unittest.TestCase): # Check integrity of object __repr__ attribute expected_string = f"FrozenBatchNorm2d({num_features}, eps={eps})" - self.assertEqual(t.__repr__(), expected_string) + assert repr(t) == expected_string - def test_frozenbatchnorm2d_eps(self): + @pytest.mark.parametrize("seed", range(10)) + def test_frozenbatchnorm2d_eps(self, seed): + torch.random.manual_seed(seed) sample_size = (4, 32, 28, 28) x = torch.rand(sample_size) - state_dict = dict(weight=torch.rand(sample_size[1]), - bias=torch.rand(sample_size[1]), - running_mean=torch.rand(sample_size[1]), - running_var=torch.rand(sample_size[1]), - num_batches_tracked=torch.tensor(100)) + state_dict = dict( + weight=torch.rand(sample_size[1]), + bias=torch.rand(sample_size[1]), + running_mean=torch.rand(sample_size[1]), + running_var=torch.rand(sample_size[1]), + num_batches_tracked=torch.tensor(100), + ) # Check that default eps is equal to the one of BN fbn = ops.misc.FrozenBatchNorm2d(sample_size[1]) @@ -825,44 +1247,40 @@ class FrozenBNTester(unittest.TestCase): bn.load_state_dict(state_dict) torch.testing.assert_close(fbn(x), bn(x), rtol=1e-5, atol=1e-6) - def test_frozenbatchnorm2d_n_arg(self): - """Ensure a warning is thrown when passing `n` kwarg - (remove this when support of `n` is dropped)""" - self.assertWarns(DeprecationWarning, ops.misc.FrozenBatchNorm2d, 32, eps=1e-5, n=32) - -class BoxConversionTester(unittest.TestCase): - @staticmethod +class TestBoxConversionToRoi: def _get_box_sequences(): # Define here the argument type of `boxes` supported by region pooling operations box_tensor = torch.tensor([[0, 0, 0, 100, 100], [1, 0, 0, 100, 100]], dtype=torch.float) - box_list = [torch.tensor([[0, 0, 100, 100]], dtype=torch.float), - torch.tensor([[0, 0, 100, 100]], dtype=torch.float)] + box_list = [ + torch.tensor([[0, 0, 100, 100]], dtype=torch.float), + torch.tensor([[0, 0, 100, 100]], dtype=torch.float), + ] box_tuple = tuple(box_list) return box_tensor, box_list, box_tuple - def test_check_roi_boxes_shape(self): + @pytest.mark.parametrize("box_sequence", _get_box_sequences()) + def test_check_roi_boxes_shape(self, box_sequence): # Ensure common sequences of tensors are supported - for box_sequence in self._get_box_sequences(): - self.assertIsNone(ops._utils.check_roi_boxes_shape(box_sequence)) + ops._utils.check_roi_boxes_shape(box_sequence) - def test_convert_boxes_to_roi_format(self): + @pytest.mark.parametrize("box_sequence", _get_box_sequences()) + def test_convert_boxes_to_roi_format(self, box_sequence): # Ensure common sequences of tensors yield the same result ref_tensor = None - for box_sequence in self._get_box_sequences(): - if ref_tensor is None: - ref_tensor = box_sequence - else: - self.assertTrue(torch.equal(ref_tensor, ops._utils.convert_boxes_to_roi_format(box_sequence))) + if ref_tensor is None: + ref_tensor = box_sequence + else: + assert_equal(ref_tensor, ops._utils.convert_boxes_to_roi_format(box_sequence)) -class BoxTester(unittest.TestCase): +class TestBoxConvert: def test_bbox_same(self): - box_tensor = torch.tensor([[0, 0, 100, 100], [0, 0, 0, 0], - [10, 15, 30, 35], [23, 35, 93, 95]], dtype=torch.float) + box_tensor = torch.tensor( + [[0, 0, 100, 100], [0, 0, 0, 0], [10, 15, 30, 35], [23, 35, 93, 95]], dtype=torch.float + ) - exp_xyxy = torch.tensor([[0, 0, 100, 100], [0, 0, 0, 0], - [10, 15, 30, 35], [23, 35, 93, 95]], dtype=torch.float) + exp_xyxy = torch.tensor([[0, 0, 100, 100], [0, 0, 0, 0], [10, 15, 30, 35], [23, 35, 93, 95]], dtype=torch.float) assert exp_xyxy.size() == torch.Size([4, 4]) assert_equal(ops.box_convert(box_tensor, in_fmt="xyxy", out_fmt="xyxy"), exp_xyxy) @@ -872,10 +1290,10 @@ class BoxTester(unittest.TestCase): def test_bbox_xyxy_xywh(self): # Simple test convert boxes to xywh and back. Make sure they are same. # box_tensor is in x1 y1 x2 y2 format. - box_tensor = torch.tensor([[0, 0, 100, 100], [0, 0, 0, 0], - [10, 15, 30, 35], [23, 35, 93, 95]], dtype=torch.float) - exp_xywh = torch.tensor([[0, 0, 100, 100], [0, 0, 0, 0], - [10, 15, 20, 20], [23, 35, 70, 60]], dtype=torch.float) + box_tensor = torch.tensor( + [[0, 0, 100, 100], [0, 0, 0, 0], [10, 15, 30, 35], [23, 35, 93, 95]], dtype=torch.float + ) + exp_xywh = torch.tensor([[0, 0, 100, 100], [0, 0, 0, 0], [10, 15, 20, 20], [23, 35, 70, 60]], dtype=torch.float) assert exp_xywh.size() == torch.Size([4, 4]) box_xywh = ops.box_convert(box_tensor, in_fmt="xyxy", out_fmt="xywh") @@ -886,12 +1304,14 @@ class BoxTester(unittest.TestCase): assert_equal(box_xyxy, box_tensor) def test_bbox_xyxy_cxcywh(self): - # Simple test convert boxes to xywh and back. Make sure they are same. + # Simple test convert boxes to cxcywh and back. Make sure they are same. # box_tensor is in x1 y1 x2 y2 format. - box_tensor = torch.tensor([[0, 0, 100, 100], [0, 0, 0, 0], - [10, 15, 30, 35], [23, 35, 93, 95]], dtype=torch.float) - exp_cxcywh = torch.tensor([[50, 50, 100, 100], [0, 0, 0, 0], - [20, 25, 20, 20], [58, 65, 70, 60]], dtype=torch.float) + box_tensor = torch.tensor( + [[0, 0, 100, 100], [0, 0, 0, 0], [10, 15, 30, 35], [23, 35, 93, 95]], dtype=torch.float + ) + exp_cxcywh = torch.tensor( + [[50, 50, 100, 100], [0, 0, 0, 0], [20, 25, 20, 20], [58, 65, 70, 60]], dtype=torch.float + ) assert exp_cxcywh.size() == torch.Size([4, 4]) box_cxcywh = ops.box_convert(box_tensor, in_fmt="xyxy", out_fmt="cxcywh") @@ -902,12 +1322,13 @@ class BoxTester(unittest.TestCase): assert_equal(box_xyxy, box_tensor) def test_bbox_xywh_cxcywh(self): - box_tensor = torch.tensor([[0, 0, 100, 100], [0, 0, 0, 0], - [10, 15, 20, 20], [23, 35, 70, 60]], dtype=torch.float) + box_tensor = torch.tensor( + [[0, 0, 100, 100], [0, 0, 0, 0], [10, 15, 20, 20], [23, 35, 70, 60]], dtype=torch.float + ) - # This is wrong - exp_cxcywh = torch.tensor([[50, 50, 100, 100], [0, 0, 0, 0], - [20, 25, 20, 20], [58, 65, 70, 60]], dtype=torch.float) + exp_cxcywh = torch.tensor( + [[50, 50, 100, 100], [0, 0, 0, 0], [20, 25, 20, 20], [58, 65, 70, 60]], dtype=torch.float + ) assert exp_cxcywh.size() == torch.Size([4, 4]) box_cxcywh = ops.box_convert(box_tensor, in_fmt="xywh", out_fmt="cxcywh") @@ -917,101 +1338,639 @@ class BoxTester(unittest.TestCase): box_xywh = ops.box_convert(box_cxcywh, in_fmt="cxcywh", out_fmt="xywh") assert_equal(box_xywh, box_tensor) - def test_bbox_invalid(self): - box_tensor = torch.tensor([[0, 0, 100, 100], [0, 0, 0, 0], - [10, 15, 20, 20], [23, 35, 70, 60]], dtype=torch.float) + @pytest.mark.parametrize("inv_infmt", ["xwyh", "cxwyh"]) + @pytest.mark.parametrize("inv_outfmt", ["xwcx", "xhwcy"]) + def test_bbox_invalid(self, inv_infmt, inv_outfmt): + box_tensor = torch.tensor( + [[0, 0, 100, 100], [0, 0, 0, 0], [10, 15, 20, 20], [23, 35, 70, 60]], dtype=torch.float + ) - invalid_infmts = ["xwyh", "cxwyh"] - invalid_outfmts = ["xwcx", "xhwcy"] - for inv_infmt in invalid_infmts: - for inv_outfmt in invalid_outfmts: - self.assertRaises(ValueError, ops.box_convert, box_tensor, inv_infmt, inv_outfmt) + with pytest.raises(ValueError): + ops.box_convert(box_tensor, inv_infmt, inv_outfmt) def test_bbox_convert_jit(self): - box_tensor = torch.tensor([[0, 0, 100, 100], [0, 0, 0, 0], - [10, 15, 30, 35], [23, 35, 93, 95]], dtype=torch.float) + box_tensor = torch.tensor( + [[0, 0, 100, 100], [0, 0, 0, 0], [10, 15, 30, 35], [23, 35, 93, 95]], dtype=torch.float + ) scripted_fn = torch.jit.script(ops.box_convert) - TOLERANCE = 1e-3 box_xywh = ops.box_convert(box_tensor, in_fmt="xyxy", out_fmt="xywh") - scripted_xywh = scripted_fn(box_tensor, 'xyxy', 'xywh') - torch.testing.assert_close(scripted_xywh, box_xywh, rtol=0.0, atol=TOLERANCE) + scripted_xywh = scripted_fn(box_tensor, "xyxy", "xywh") + torch.testing.assert_close(scripted_xywh, box_xywh) box_cxcywh = ops.box_convert(box_tensor, in_fmt="xyxy", out_fmt="cxcywh") - scripted_cxcywh = scripted_fn(box_tensor, 'xyxy', 'cxcywh') - torch.testing.assert_close(scripted_cxcywh, box_cxcywh, rtol=0.0, atol=TOLERANCE) - - -class BoxAreaTester(unittest.TestCase): - def test_box_area(self): - def area_check(box, expected, tolerance=1e-4): - out = ops.box_area(box) - torch.testing.assert_close(out, expected, rtol=0.0, check_dtype=False, atol=tolerance) - - # Check for int boxes - for dtype in [torch.int8, torch.int16, torch.int32, torch.int64]: - box_tensor = torch.tensor([[0, 0, 100, 100], [0, 0, 0, 0]], dtype=dtype) - expected = torch.tensor([10000, 0]) - area_check(box_tensor, expected) - - # Check for float32 and float64 boxes - for dtype in [torch.float32, torch.float64]: - box_tensor = torch.tensor([[285.3538, 185.5758, 1193.5110, 851.4551], - [285.1472, 188.7374, 1192.4984, 851.0669], - [279.2440, 197.9812, 1189.4746, 849.2019]], dtype=dtype) - expected = torch.tensor([604723.0806, 600965.4666, 592761.0085], dtype=torch.float64) - area_check(box_tensor, expected, tolerance=0.05) - - # Check for float16 box - box_tensor = torch.tensor([[285.25, 185.625, 1194.0, 851.5], - [285.25, 188.75, 1192.0, 851.0], - [279.25, 198.0, 1189.0, 849.0]], dtype=torch.float16) - expected = torch.tensor([605113.875, 600495.1875, 592247.25]) - area_check(box_tensor, expected) - - -class BoxIouTester(unittest.TestCase): - def test_iou(self): - def iou_check(box, expected, tolerance=1e-4): - out = ops.box_iou(box, box) - torch.testing.assert_close(out, expected, rtol=0.0, check_dtype=False, atol=tolerance) - - # Check for int boxes - for dtype in [torch.int16, torch.int32, torch.int64]: - box = torch.tensor([[0, 0, 100, 100], [0, 0, 50, 50], [200, 200, 300, 300]], dtype=dtype) - expected = torch.tensor([[1.0, 0.25, 0.0], [0.25, 1.0, 0.0], [0.0, 0.0, 1.0]]) - iou_check(box, expected) - - # Check for float boxes - for dtype in [torch.float16, torch.float32, torch.float64]: - box_tensor = torch.tensor([[285.3538, 185.5758, 1193.5110, 851.4551], - [285.1472, 188.7374, 1192.4984, 851.0669], - [279.2440, 197.9812, 1189.4746, 849.2019]], dtype=dtype) - expected = torch.tensor([[1.0, 0.9933, 0.9673], [0.9933, 1.0, 0.9737], [0.9673, 0.9737, 1.0]]) - iou_check(box_tensor, expected, tolerance=0.002 if dtype == torch.float16 else 1e-4) - - -class GenBoxIouTester(unittest.TestCase): - def test_gen_iou(self): - def gen_iou_check(box, expected, tolerance=1e-4): - out = ops.generalized_box_iou(box, box) - torch.testing.assert_close(out, expected, rtol=0.0, check_dtype=False, atol=tolerance) - - # Check for int boxes - for dtype in [torch.int16, torch.int32, torch.int64]: - box = torch.tensor([[0, 0, 100, 100], [0, 0, 50, 50], [200, 200, 300, 300]], dtype=dtype) - expected = torch.tensor([[1.0, 0.25, -0.7778], [0.25, 1.0, -0.8611], [-0.7778, -0.8611, 1.0]]) - gen_iou_check(box, expected) - - # Check for float boxes - for dtype in [torch.float16, torch.float32, torch.float64]: - box_tensor = torch.tensor([[285.3538, 185.5758, 1193.5110, 851.4551], - [285.1472, 188.7374, 1192.4984, 851.0669], - [279.2440, 197.9812, 1189.4746, 849.2019]], dtype=dtype) - expected = torch.tensor([[1.0, 0.9933, 0.9673], [0.9933, 1.0, 0.9737], [0.9673, 0.9737, 1.0]]) - gen_iou_check(box_tensor, expected, tolerance=0.002 if dtype == torch.float16 else 1e-3) + scripted_cxcywh = scripted_fn(box_tensor, "xyxy", "cxcywh") + torch.testing.assert_close(scripted_cxcywh, box_cxcywh) + + +class TestBoxArea: + def area_check(self, box, expected, atol=1e-4): + out = ops.box_area(box) + torch.testing.assert_close(out, expected, rtol=0.0, check_dtype=False, atol=atol) + + @pytest.mark.parametrize("dtype", [torch.int8, torch.int16, torch.int32, torch.int64]) + def test_int_boxes(self, dtype): + box_tensor = torch.tensor([[0, 0, 100, 100], [0, 0, 0, 0]], dtype=dtype) + expected = torch.tensor([10000, 0], dtype=torch.int32) + self.area_check(box_tensor, expected) + + @pytest.mark.parametrize("dtype", [torch.float32, torch.float64]) + def test_float_boxes(self, dtype): + box_tensor = torch.tensor(FLOAT_BOXES, dtype=dtype) + expected = torch.tensor([604723.0806, 600965.4666, 592761.0085], dtype=dtype) + self.area_check(box_tensor, expected) + + def test_float16_box(self): + box_tensor = torch.tensor( + [[2.825, 1.8625, 3.90, 4.85], [2.825, 4.875, 19.20, 5.10], [2.925, 1.80, 8.90, 4.90]], dtype=torch.float16 + ) + + expected = torch.tensor([3.2170, 3.7108, 18.5071], dtype=torch.float16) + self.area_check(box_tensor, expected, atol=0.01) + + def test_box_area_jit(self): + box_tensor = torch.tensor([[0, 0, 100, 100], [0, 0, 0, 0]], dtype=torch.float) + expected = ops.box_area(box_tensor) + scripted_fn = torch.jit.script(ops.box_area) + scripted_area = scripted_fn(box_tensor) + torch.testing.assert_close(scripted_area, expected) + +INT_BOXES = [[0, 0, 100, 100], [0, 0, 50, 50], [200, 200, 300, 300], [0, 0, 25, 25]] +INT_BOXES2 = [[0, 0, 100, 100], [0, 0, 50, 50], [200, 200, 300, 300]] +FLOAT_BOXES = [ + [285.3538, 185.5758, 1193.5110, 851.4551], + [285.1472, 188.7374, 1192.4984, 851.0669], + [279.2440, 197.9812, 1189.4746, 849.2019], +] -if __name__ == '__main__': - unittest.main() + +def gen_box(size, dtype=torch.float): + xy1 = torch.rand((size, 2), dtype=dtype) + xy2 = xy1 + torch.rand((size, 2), dtype=dtype) + return torch.cat([xy1, xy2], axis=-1) + + +class TestIouBase: + @staticmethod + def _run_test(target_fn: Callable, actual_box1, actual_box2, dtypes, atol, expected): + for dtype in dtypes: + actual_box1 = torch.tensor(actual_box1, dtype=dtype) + actual_box2 = torch.tensor(actual_box2, dtype=dtype) + expected_box = torch.tensor(expected) + out = target_fn(actual_box1, actual_box2) + torch.testing.assert_close(out, expected_box, rtol=0.0, check_dtype=False, atol=atol) + + @staticmethod + def _run_jit_test(target_fn: Callable, actual_box: List): + box_tensor = torch.tensor(actual_box, dtype=torch.float) + expected = target_fn(box_tensor, box_tensor) + scripted_fn = torch.jit.script(target_fn) + scripted_out = scripted_fn(box_tensor, box_tensor) + torch.testing.assert_close(scripted_out, expected) + + @staticmethod + def _cartesian_product(boxes1, boxes2, target_fn: Callable): + N = boxes1.size(0) + M = boxes2.size(0) + result = torch.zeros((N, M)) + for i in range(N): + for j in range(M): + result[i, j] = target_fn(boxes1[i].unsqueeze(0), boxes2[j].unsqueeze(0)) + return result + + @staticmethod + def _run_cartesian_test(target_fn: Callable): + boxes1 = gen_box(5) + boxes2 = gen_box(7) + a = TestIouBase._cartesian_product(boxes1, boxes2, target_fn) + b = target_fn(boxes1, boxes2) + torch.testing.assert_close(a, b) + + +class TestBoxIou(TestIouBase): + int_expected = [[1.0, 0.25, 0.0], [0.25, 1.0, 0.0], [0.0, 0.0, 1.0], [0.0625, 0.25, 0.0]] + float_expected = [[1.0, 0.9933, 0.9673], [0.9933, 1.0, 0.9737], [0.9673, 0.9737, 1.0]] + + @pytest.mark.parametrize( + "actual_box1, actual_box2, dtypes, atol, expected", + [ + pytest.param(INT_BOXES, INT_BOXES2, [torch.int16, torch.int32, torch.int64], 1e-4, int_expected), + pytest.param(FLOAT_BOXES, FLOAT_BOXES, [torch.float16], 0.002, float_expected), + pytest.param(FLOAT_BOXES, FLOAT_BOXES, [torch.float32, torch.float64], 1e-3, float_expected), + ], + ) + def test_iou(self, actual_box1, actual_box2, dtypes, atol, expected): + self._run_test(ops.box_iou, actual_box1, actual_box2, dtypes, atol, expected) + + def test_iou_jit(self): + self._run_jit_test(ops.box_iou, INT_BOXES) + + def test_iou_cartesian(self): + self._run_cartesian_test(ops.box_iou) + + +class TestGeneralizedBoxIou(TestIouBase): + int_expected = [[1.0, 0.25, -0.7778], [0.25, 1.0, -0.8611], [-0.7778, -0.8611, 1.0], [0.0625, 0.25, -0.8819]] + float_expected = [[1.0, 0.9933, 0.9673], [0.9933, 1.0, 0.9737], [0.9673, 0.9737, 1.0]] + + @pytest.mark.parametrize( + "actual_box1, actual_box2, dtypes, atol, expected", + [ + pytest.param(INT_BOXES, INT_BOXES2, [torch.int16, torch.int32, torch.int64], 1e-4, int_expected), + pytest.param(FLOAT_BOXES, FLOAT_BOXES, [torch.float16], 0.002, float_expected), + pytest.param(FLOAT_BOXES, FLOAT_BOXES, [torch.float32, torch.float64], 1e-3, float_expected), + ], + ) + def test_iou(self, actual_box1, actual_box2, dtypes, atol, expected): + self._run_test(ops.generalized_box_iou, actual_box1, actual_box2, dtypes, atol, expected) + + def test_iou_jit(self): + self._run_jit_test(ops.generalized_box_iou, INT_BOXES) + + def test_iou_cartesian(self): + self._run_cartesian_test(ops.generalized_box_iou) + + +class TestDistanceBoxIoU(TestIouBase): + int_expected = [ + [1.0000, 0.1875, -0.4444], + [0.1875, 1.0000, -0.5625], + [-0.4444, -0.5625, 1.0000], + [-0.0781, 0.1875, -0.6267], + ] + float_expected = [[1.0, 0.9933, 0.9673], [0.9933, 1.0, 0.9737], [0.9673, 0.9737, 1.0]] + + @pytest.mark.parametrize( + "actual_box1, actual_box2, dtypes, atol, expected", + [ + pytest.param(INT_BOXES, INT_BOXES2, [torch.int16, torch.int32, torch.int64], 1e-4, int_expected), + pytest.param(FLOAT_BOXES, FLOAT_BOXES, [torch.float16], 0.002, float_expected), + pytest.param(FLOAT_BOXES, FLOAT_BOXES, [torch.float32, torch.float64], 1e-3, float_expected), + ], + ) + def test_iou(self, actual_box1, actual_box2, dtypes, atol, expected): + self._run_test(ops.distance_box_iou, actual_box1, actual_box2, dtypes, atol, expected) + + def test_iou_jit(self): + self._run_jit_test(ops.distance_box_iou, INT_BOXES) + + def test_iou_cartesian(self): + self._run_cartesian_test(ops.distance_box_iou) + + +class TestCompleteBoxIou(TestIouBase): + int_expected = [ + [1.0000, 0.1875, -0.4444], + [0.1875, 1.0000, -0.5625], + [-0.4444, -0.5625, 1.0000], + [-0.0781, 0.1875, -0.6267], + ] + float_expected = [[1.0, 0.9933, 0.9673], [0.9933, 1.0, 0.9737], [0.9673, 0.9737, 1.0]] + + @pytest.mark.parametrize( + "actual_box1, actual_box2, dtypes, atol, expected", + [ + pytest.param(INT_BOXES, INT_BOXES2, [torch.int16, torch.int32, torch.int64], 1e-4, int_expected), + pytest.param(FLOAT_BOXES, FLOAT_BOXES, [torch.float16], 0.002, float_expected), + pytest.param(FLOAT_BOXES, FLOAT_BOXES, [torch.float32, torch.float64], 1e-3, float_expected), + ], + ) + def test_iou(self, actual_box1, actual_box2, dtypes, atol, expected): + self._run_test(ops.complete_box_iou, actual_box1, actual_box2, dtypes, atol, expected) + + def test_iou_jit(self): + self._run_jit_test(ops.complete_box_iou, INT_BOXES) + + def test_iou_cartesian(self): + self._run_cartesian_test(ops.complete_box_iou) + + +def get_boxes(dtype, device): + box1 = torch.tensor([-1, -1, 1, 1], dtype=dtype, device=device) + box2 = torch.tensor([0, 0, 1, 1], dtype=dtype, device=device) + box3 = torch.tensor([0, 1, 1, 2], dtype=dtype, device=device) + box4 = torch.tensor([1, 1, 2, 2], dtype=dtype, device=device) + + box1s = torch.stack([box2, box2], dim=0) + box2s = torch.stack([box3, box4], dim=0) + + return box1, box2, box3, box4, box1s, box2s + + +def assert_iou_loss(iou_fn, box1, box2, expected_loss, device, reduction="none"): + computed_loss = iou_fn(box1, box2, reduction=reduction) + expected_loss = torch.tensor(expected_loss, device=device) + torch.testing.assert_close(computed_loss, expected_loss) + + +def assert_empty_loss(iou_fn, dtype, device): + box1 = torch.randn([0, 4], dtype=dtype, device=device).requires_grad_() + box2 = torch.randn([0, 4], dtype=dtype, device=device).requires_grad_() + loss = iou_fn(box1, box2, reduction="mean") + loss.backward() + torch.testing.assert_close(loss, torch.tensor(0.0, device=device)) + assert box1.grad is not None, "box1.grad should not be None after backward is called" + assert box2.grad is not None, "box2.grad should not be None after backward is called" + loss = iou_fn(box1, box2, reduction="none") + assert loss.numel() == 0, f"{str(iou_fn)} for two empty box should be empty" + + +class TestGeneralizedBoxIouLoss: + # We refer to original test: https://github.com/facebookresearch/fvcore/blob/main/tests/test_giou_loss.py + @pytest.mark.parametrize("device", cpu_and_cuda()) + @pytest.mark.parametrize("dtype", [torch.float32, torch.half]) + def test_giou_loss(self, dtype, device): + box1, box2, box3, box4, box1s, box2s = get_boxes(dtype, device) + + # Identical boxes should have loss of 0 + assert_iou_loss(ops.generalized_box_iou_loss, box1, box1, 0.0, device=device) + + # quarter size box inside other box = IoU of 0.25 + assert_iou_loss(ops.generalized_box_iou_loss, box1, box2, 0.75, device=device) + + # Two side by side boxes, area=union + # IoU=0 and GIoU=0 (loss 1.0) + assert_iou_loss(ops.generalized_box_iou_loss, box2, box3, 1.0, device=device) + + # Two diagonally adjacent boxes, area=2*union + # IoU=0 and GIoU=-0.5 (loss 1.5) + assert_iou_loss(ops.generalized_box_iou_loss, box2, box4, 1.5, device=device) + + # Test batched loss and reductions + assert_iou_loss(ops.generalized_box_iou_loss, box1s, box2s, 2.5, device=device, reduction="sum") + assert_iou_loss(ops.generalized_box_iou_loss, box1s, box2s, 1.25, device=device, reduction="mean") + + # Test reduction value + # reduction value other than ["none", "mean", "sum"] should raise a ValueError + with pytest.raises(ValueError, match="Invalid"): + ops.generalized_box_iou_loss(box1s, box2s, reduction="xyz") + + @pytest.mark.parametrize("device", cpu_and_cuda()) + @pytest.mark.parametrize("dtype", [torch.float32, torch.half]) + def test_empty_inputs(self, dtype, device): + assert_empty_loss(ops.generalized_box_iou_loss, dtype, device) + + +class TestCompleteBoxIouLoss: + @pytest.mark.parametrize("dtype", [torch.float32, torch.half]) + @pytest.mark.parametrize("device", cpu_and_cuda()) + def test_ciou_loss(self, dtype, device): + box1, box2, box3, box4, box1s, box2s = get_boxes(dtype, device) + + assert_iou_loss(ops.complete_box_iou_loss, box1, box1, 0.0, device=device) + assert_iou_loss(ops.complete_box_iou_loss, box1, box2, 0.8125, device=device) + assert_iou_loss(ops.complete_box_iou_loss, box1, box3, 1.1923, device=device) + assert_iou_loss(ops.complete_box_iou_loss, box1, box4, 1.2500, device=device) + assert_iou_loss(ops.complete_box_iou_loss, box1s, box2s, 1.2250, device=device, reduction="mean") + assert_iou_loss(ops.complete_box_iou_loss, box1s, box2s, 2.4500, device=device, reduction="sum") + + with pytest.raises(ValueError, match="Invalid"): + ops.complete_box_iou_loss(box1s, box2s, reduction="xyz") + + @pytest.mark.parametrize("device", cpu_and_cuda()) + @pytest.mark.parametrize("dtype", [torch.float32, torch.half]) + def test_empty_inputs(self, dtype, device): + assert_empty_loss(ops.complete_box_iou_loss, dtype, device) + + +class TestDistanceBoxIouLoss: + @pytest.mark.parametrize("device", cpu_and_cuda()) + @pytest.mark.parametrize("dtype", [torch.float32, torch.half]) + def test_distance_iou_loss(self, dtype, device): + box1, box2, box3, box4, box1s, box2s = get_boxes(dtype, device) + + assert_iou_loss(ops.distance_box_iou_loss, box1, box1, 0.0, device=device) + assert_iou_loss(ops.distance_box_iou_loss, box1, box2, 0.8125, device=device) + assert_iou_loss(ops.distance_box_iou_loss, box1, box3, 1.1923, device=device) + assert_iou_loss(ops.distance_box_iou_loss, box1, box4, 1.2500, device=device) + assert_iou_loss(ops.distance_box_iou_loss, box1s, box2s, 1.2250, device=device, reduction="mean") + assert_iou_loss(ops.distance_box_iou_loss, box1s, box2s, 2.4500, device=device, reduction="sum") + + with pytest.raises(ValueError, match="Invalid"): + ops.distance_box_iou_loss(box1s, box2s, reduction="xyz") + + @pytest.mark.parametrize("device", cpu_and_cuda()) + @pytest.mark.parametrize("dtype", [torch.float32, torch.half]) + def test_empty_distance_iou_inputs(self, dtype, device): + assert_empty_loss(ops.distance_box_iou_loss, dtype, device) + + +class TestFocalLoss: + def _generate_diverse_input_target_pair(self, shape=(5, 2), **kwargs): + def logit(p): + return torch.log(p / (1 - p)) + + def generate_tensor_with_range_type(shape, range_type, **kwargs): + if range_type != "random_binary": + low, high = { + "small": (0.0, 0.2), + "big": (0.8, 1.0), + "zeros": (0.0, 0.0), + "ones": (1.0, 1.0), + "random": (0.0, 1.0), + }[range_type] + return torch.testing.make_tensor(shape, low=low, high=high, **kwargs) + else: + return torch.randint(0, 2, shape, **kwargs) + + # This function will return inputs and targets with shape: (shape[0]*9, shape[1]) + inputs = [] + targets = [] + for input_range_type, target_range_type in [ + ("small", "zeros"), + ("small", "ones"), + ("small", "random_binary"), + ("big", "zeros"), + ("big", "ones"), + ("big", "random_binary"), + ("random", "zeros"), + ("random", "ones"), + ("random", "random_binary"), + ]: + inputs.append(logit(generate_tensor_with_range_type(shape, input_range_type, **kwargs))) + targets.append(generate_tensor_with_range_type(shape, target_range_type, **kwargs)) + + return torch.cat(inputs), torch.cat(targets) + + @pytest.mark.parametrize("alpha", [-1.0, 0.0, 0.58, 1.0]) + @pytest.mark.parametrize("gamma", [0, 2]) + @pytest.mark.parametrize("device", cpu_and_cuda()) + @pytest.mark.parametrize("dtype", [torch.float32, torch.half]) + @pytest.mark.parametrize("seed", [0, 1]) + def test_correct_ratio(self, alpha, gamma, device, dtype, seed): + if device == "cpu" and dtype is torch.half: + pytest.skip("Currently torch.half is not fully supported on cpu") + # For testing the ratio with manual calculation, we require the reduction to be "none" + reduction = "none" + torch.random.manual_seed(seed) + inputs, targets = self._generate_diverse_input_target_pair(dtype=dtype, device=device) + focal_loss = ops.sigmoid_focal_loss(inputs, targets, gamma=gamma, alpha=alpha, reduction=reduction) + ce_loss = F.binary_cross_entropy_with_logits(inputs, targets, reduction=reduction) + + assert torch.all( + focal_loss <= ce_loss + ), "focal loss must be less or equal to cross entropy loss with same input" + + loss_ratio = (focal_loss / ce_loss).squeeze() + prob = torch.sigmoid(inputs) + p_t = prob * targets + (1 - prob) * (1 - targets) + correct_ratio = (1.0 - p_t) ** gamma + if alpha >= 0: + alpha_t = alpha * targets + (1 - alpha) * (1 - targets) + correct_ratio = correct_ratio * alpha_t + + tol = 1e-3 if dtype is torch.half else 1e-5 + torch.testing.assert_close(correct_ratio, loss_ratio, atol=tol, rtol=tol) + + @pytest.mark.parametrize("reduction", ["mean", "sum"]) + @pytest.mark.parametrize("device", cpu_and_cuda()) + @pytest.mark.parametrize("dtype", [torch.float32, torch.half]) + @pytest.mark.parametrize("seed", [2, 3]) + def test_equal_ce_loss(self, reduction, device, dtype, seed): + if device == "cpu" and dtype is torch.half: + pytest.skip("Currently torch.half is not fully supported on cpu") + # focal loss should be equal ce_loss if alpha=-1 and gamma=0 + alpha = -1 + gamma = 0 + torch.random.manual_seed(seed) + inputs, targets = self._generate_diverse_input_target_pair(dtype=dtype, device=device) + inputs_fl = inputs.clone().requires_grad_() + targets_fl = targets.clone() + inputs_ce = inputs.clone().requires_grad_() + targets_ce = targets.clone() + focal_loss = ops.sigmoid_focal_loss(inputs_fl, targets_fl, gamma=gamma, alpha=alpha, reduction=reduction) + ce_loss = F.binary_cross_entropy_with_logits(inputs_ce, targets_ce, reduction=reduction) + + torch.testing.assert_close(focal_loss, ce_loss) + + focal_loss.backward() + ce_loss.backward() + torch.testing.assert_close(inputs_fl.grad, inputs_ce.grad) + + @pytest.mark.parametrize("alpha", [-1.0, 0.0, 0.58, 1.0]) + @pytest.mark.parametrize("gamma", [0, 2]) + @pytest.mark.parametrize("reduction", ["none", "mean", "sum"]) + @pytest.mark.parametrize("device", cpu_and_cuda()) + @pytest.mark.parametrize("dtype", [torch.float32, torch.half]) + @pytest.mark.parametrize("seed", [4, 5]) + def test_jit(self, alpha, gamma, reduction, device, dtype, seed): + if device == "cpu" and dtype is torch.half: + pytest.skip("Currently torch.half is not fully supported on cpu") + script_fn = torch.jit.script(ops.sigmoid_focal_loss) + torch.random.manual_seed(seed) + inputs, targets = self._generate_diverse_input_target_pair(dtype=dtype, device=device) + focal_loss = ops.sigmoid_focal_loss(inputs, targets, gamma=gamma, alpha=alpha, reduction=reduction) + scripted_focal_loss = script_fn(inputs, targets, gamma=gamma, alpha=alpha, reduction=reduction) + + tol = 1e-3 if dtype is torch.half else 1e-5 + torch.testing.assert_close(focal_loss, scripted_focal_loss, rtol=tol, atol=tol) + + # Raise ValueError for anonymous reduction mode + @pytest.mark.parametrize("device", cpu_and_cuda()) + @pytest.mark.parametrize("dtype", [torch.float32, torch.half]) + def test_reduction_mode(self, device, dtype, reduction="xyz"): + if device == "cpu" and dtype is torch.half: + pytest.skip("Currently torch.half is not fully supported on cpu") + torch.random.manual_seed(0) + inputs, targets = self._generate_diverse_input_target_pair(device=device, dtype=dtype) + with pytest.raises(ValueError, match="Invalid"): + ops.sigmoid_focal_loss(inputs, targets, 0.25, 2, reduction) + + +class TestMasksToBoxes: + def test_masks_box(self): + def masks_box_check(masks, expected, atol=1e-4): + out = ops.masks_to_boxes(masks) + assert out.dtype == torch.float + torch.testing.assert_close(out, expected, rtol=0.0, check_dtype=True, atol=atol) + + # Check for int type boxes. + def _get_image(): + assets_directory = os.path.join(os.path.dirname(os.path.abspath(__file__)), "assets") + mask_path = os.path.join(assets_directory, "masks.tiff") + image = Image.open(mask_path) + return image + + def _create_masks(image, masks): + for index in range(image.n_frames): + image.seek(index) + frame = np.array(image) + masks[index] = torch.tensor(frame) + + return masks + + expected = torch.tensor( + [ + [127, 2, 165, 40], + [2, 50, 44, 92], + [56, 63, 98, 100], + [139, 68, 175, 104], + [160, 112, 198, 145], + [49, 138, 99, 182], + [108, 148, 152, 213], + ], + dtype=torch.float, + ) + + image = _get_image() + for dtype in [torch.float16, torch.float32, torch.float64]: + masks = torch.zeros((image.n_frames, image.height, image.width), dtype=dtype) + masks = _create_masks(image, masks) + masks_box_check(masks, expected) + + +class TestStochasticDepth: + @pytest.mark.parametrize("seed", range(10)) + @pytest.mark.parametrize("p", [0.2, 0.5, 0.8]) + @pytest.mark.parametrize("mode", ["batch", "row"]) + def test_stochastic_depth_random(self, seed, mode, p): + torch.manual_seed(seed) + stats = pytest.importorskip("scipy.stats") + batch_size = 5 + x = torch.ones(size=(batch_size, 3, 4, 4)) + layer = ops.StochasticDepth(p=p, mode=mode) + layer.__repr__() + + trials = 250 + num_samples = 0 + counts = 0 + for _ in range(trials): + out = layer(x) + non_zero_count = out.sum(dim=(1, 2, 3)).nonzero().size(0) + if mode == "batch": + if non_zero_count == 0: + counts += 1 + num_samples += 1 + elif mode == "row": + counts += batch_size - non_zero_count + num_samples += batch_size + + p_value = stats.binomtest(counts, num_samples, p=p).pvalue + assert p_value > 0.01 + + @pytest.mark.parametrize("seed", range(10)) + @pytest.mark.parametrize("p", (0, 1)) + @pytest.mark.parametrize("mode", ["batch", "row"]) + def test_stochastic_depth(self, seed, mode, p): + torch.manual_seed(seed) + batch_size = 5 + x = torch.ones(size=(batch_size, 3, 4, 4)) + layer = ops.StochasticDepth(p=p, mode=mode) + + out = layer(x) + if p == 0: + assert out.equal(x) + elif p == 1: + assert out.equal(torch.zeros_like(x)) + + def make_obj(self, p, mode, wrap=False): + obj = ops.StochasticDepth(p, mode) + return StochasticDepthWrapper(obj) if wrap else obj + + @pytest.mark.parametrize("p", (0, 1)) + @pytest.mark.parametrize("mode", ["batch", "row"]) + def test_is_leaf_node(self, p, mode): + op_obj = self.make_obj(p, mode, wrap=True) + graph_node_names = get_graph_node_names(op_obj) + + assert len(graph_node_names) == 2 + assert len(graph_node_names[0]) == len(graph_node_names[1]) + assert len(graph_node_names[0]) == 1 + op_obj.n_inputs + + +class TestUtils: + @pytest.mark.parametrize("norm_layer", [None, nn.BatchNorm2d, nn.LayerNorm]) + def test_split_normalization_params(self, norm_layer): + model = models.mobilenet_v3_large(norm_layer=norm_layer) + params = ops._utils.split_normalization_params(model, None if norm_layer is None else [norm_layer]) + + assert len(params[0]) == 92 + assert len(params[1]) == 82 + + +class TestDropBlock: + @pytest.mark.parametrize("seed", range(10)) + @pytest.mark.parametrize("dim", [2, 3]) + @pytest.mark.parametrize("p", [0, 0.5]) + @pytest.mark.parametrize("block_size", [5, 11]) + @pytest.mark.parametrize("inplace", [True, False]) + def test_drop_block(self, seed, dim, p, block_size, inplace): + torch.manual_seed(seed) + batch_size = 5 + channels = 3 + height = 11 + width = height + depth = height + if dim == 2: + x = torch.ones(size=(batch_size, channels, height, width)) + layer = ops.DropBlock2d(p=p, block_size=block_size, inplace=inplace) + feature_size = height * width + elif dim == 3: + x = torch.ones(size=(batch_size, channels, depth, height, width)) + layer = ops.DropBlock3d(p=p, block_size=block_size, inplace=inplace) + feature_size = depth * height * width + layer.__repr__() + + out = layer(x) + if p == 0: + assert out.equal(x) + if block_size == height: + for b, c in product(range(batch_size), range(channels)): + assert out[b, c].count_nonzero() in (0, feature_size) + + @pytest.mark.parametrize("seed", range(10)) + @pytest.mark.parametrize("dim", [2, 3]) + @pytest.mark.parametrize("p", [0.1, 0.2]) + @pytest.mark.parametrize("block_size", [3]) + @pytest.mark.parametrize("inplace", [False]) + def test_drop_block_random(self, seed, dim, p, block_size, inplace): + torch.manual_seed(seed) + batch_size = 5 + channels = 3 + height = 11 + width = height + depth = height + if dim == 2: + x = torch.ones(size=(batch_size, channels, height, width)) + layer = ops.DropBlock2d(p=p, block_size=block_size, inplace=inplace) + elif dim == 3: + x = torch.ones(size=(batch_size, channels, depth, height, width)) + layer = ops.DropBlock3d(p=p, block_size=block_size, inplace=inplace) + + trials = 250 + num_samples = 0 + counts = 0 + cell_numel = torch.tensor(x.shape).prod() + for _ in range(trials): + with torch.no_grad(): + out = layer(x) + non_zero_count = out.nonzero().size(0) + counts += cell_numel - non_zero_count + num_samples += cell_numel + + assert abs(p - counts / num_samples) / p < 0.15 + + def make_obj(self, dim, p, block_size, inplace, wrap=False): + if dim == 2: + obj = ops.DropBlock2d(p, block_size, inplace) + elif dim == 3: + obj = ops.DropBlock3d(p, block_size, inplace) + return DropBlockWrapper(obj) if wrap else obj + + @pytest.mark.parametrize("dim", (2, 3)) + @pytest.mark.parametrize("p", [0, 1]) + @pytest.mark.parametrize("block_size", [5, 7]) + @pytest.mark.parametrize("inplace", [True, False]) + def test_is_leaf_node(self, dim, p, block_size, inplace): + op_obj = self.make_obj(dim, p, block_size, inplace, wrap=True) + graph_node_names = get_graph_node_names(op_obj) + + assert len(graph_node_names) == 2 + assert len(graph_node_names[0]) == len(graph_node_names[1]) + assert len(graph_node_names[0]) == 1 + op_obj.n_inputs + + +if __name__ == "__main__": + pytest.main([__file__]) diff --git a/test/test_quantized_models.py b/test/test_quantized_models.py deleted file mode 100644 index d8fd5325755d4c666a85d4e204e2c3ed04a24709..0000000000000000000000000000000000000000 --- a/test/test_quantized_models.py +++ /dev/null @@ -1,93 +0,0 @@ -import torchvision -from common_utils import TestCase, map_nested_tensor_object -from collections import OrderedDict -from itertools import product -import torch -import numpy as np -from torchvision import models -import unittest -import traceback -import random - - -def set_rng_seed(seed): - torch.manual_seed(seed) - random.seed(seed) - np.random.seed(seed) - - -def get_available_quantizable_models(): - # TODO add a registration mechanism to torchvision.models - return [k for k, v in models.quantization.__dict__.items() if callable(v) and k[0].lower() == k[0] and k[0] != "_"] - - -# list of models that are not scriptable -scriptable_quantizable_models_blacklist = [] - - -@unittest.skipUnless('fbgemm' in torch.backends.quantized.supported_engines and - 'qnnpack' in torch.backends.quantized.supported_engines, - "This Pytorch Build has not been built with fbgemm and qnnpack") -class ModelTester(TestCase): - def check_quantized_model(self, model, input_shape): - x = torch.rand(input_shape) - model(x) - return - - def check_script(self, model, name): - if name in scriptable_quantizable_models_blacklist: - return - scriptable = True - msg = "" - try: - torch.jit.script(model) - except Exception as e: - tb = traceback.format_exc() - scriptable = False - msg = str(e) + str(tb) - self.assertTrue(scriptable, msg) - - def _test_classification_model(self, name, input_shape): - # First check if quantize=True provides models that can run with input data - - model = torchvision.models.quantization.__dict__[name](pretrained=False, quantize=True) - self.check_quantized_model(model, input_shape) - - for eval_mode in [True, False]: - model = torchvision.models.quantization.__dict__[name](pretrained=False, quantize=False) - if eval_mode: - model.eval() - model.qconfig = torch.quantization.default_qconfig - else: - model.train() - model.qconfig = torch.quantization.default_qat_qconfig - - model.fuse_model() - if eval_mode: - torch.quantization.prepare(model, inplace=True) - else: - torch.quantization.prepare_qat(model, inplace=True) - model.eval() - - torch.quantization.convert(model, inplace=True) - - self.check_script(model, name) - - -for model_name in get_available_quantizable_models(): - # for-loop bodies don't define scopes, so we have to save the variables - # we want to close over in some way - def do_test(self, model_name=model_name): - input_shape = (1, 3, 224, 224) - if model_name in ['inception_v3']: - input_shape = (1, 3, 299, 299) - self._test_classification_model(model_name, input_shape) - - # inception_v3 was causing timeouts on circleci - # See https://github.com/pytorch/vision/issues/1857 - if model_name not in ['inception_v3']: - setattr(ModelTester, "test_" + model_name, do_test) - - -if __name__ == '__main__': - unittest.main() diff --git a/test/test_transforms.py b/test/test_transforms.py index de309cb66c52ad971fa89406c7bbc7fc0f35b3c4..b49aeb59b5b8f6887ce8b282e70a19700fd3b168 100644 --- a/test/test_transforms.py +++ b/test/test_transforms.py @@ -1,16 +1,19 @@ -import itertools +import math import os +import random +import re +import sys +from functools import partial + +import numpy as np +import pytest import torch import torchvision.transforms as transforms +import torchvision.transforms._functional_tensor as F_t import torchvision.transforms.functional as F -import torchvision.transforms.functional_tensor as F_t -from torch._utils_internal import get_file_path_2 -from numpy.testing import assert_array_almost_equal -import unittest -import math -import random -import numpy as np from PIL import Image +from torch._utils_internal import get_file_path_2 + try: import accimage except ImportError: @@ -21,428 +24,481 @@ try: except ImportError: stats = None -from common_utils import cycle_over, int_dtypes, float_dtypes -from _assert_utils import assert_equal +from common_utils import assert_equal, cycle_over, float_dtypes, int_dtypes GRACE_HOPPER = get_file_path_2( - os.path.dirname(os.path.abspath(__file__)), 'assets', 'encode_jpeg', 'grace_hopper_517x606.jpg') + os.path.dirname(os.path.abspath(__file__)), "assets", "encode_jpeg", "grace_hopper_517x606.jpg" +) -class Tester(unittest.TestCase): +def _get_grayscale_test_image(img, fill=None): + img = img.convert("L") + fill = (fill[0],) if isinstance(fill, tuple) else fill + return img, fill - def test_center_crop(self): - height = random.randint(10, 32) * 2 - width = random.randint(10, 32) * 2 - oheight = random.randint(5, (height - 2) / 2) * 2 - owidth = random.randint(5, (width - 2) / 2) * 2 - img = torch.ones(3, height, width) - oh1 = (height - oheight) // 2 - ow1 = (width - owidth) // 2 - imgnarrow = img[:, oh1:oh1 + oheight, ow1:ow1 + owidth] - imgnarrow.fill_(0) - result = transforms.Compose([ - transforms.ToPILImage(), - transforms.CenterCrop((oheight, owidth)), - transforms.ToTensor(), - ])(img) - self.assertEqual(result.sum(), 0, - "height: {} width: {} oheight: {} owdith: {}".format(height, width, oheight, owidth)) - oheight += 1 - owidth += 1 - result = transforms.Compose([ - transforms.ToPILImage(), - transforms.CenterCrop((oheight, owidth)), - transforms.ToTensor(), - ])(img) - sum1 = result.sum() - self.assertGreater(sum1, 1, - "height: {} width: {} oheight: {} owdith: {}".format(height, width, oheight, owidth)) - oheight += 1 - owidth += 1 - result = transforms.Compose([ - transforms.ToPILImage(), - transforms.CenterCrop((oheight, owidth)), - transforms.ToTensor(), - ])(img) - sum2 = result.sum() - self.assertGreater(sum2, 0, - "height: {} width: {} oheight: {} owdith: {}".format(height, width, oheight, owidth)) - self.assertGreater(sum2, sum1, - "height: {} width: {} oheight: {} owdith: {}".format(height, width, oheight, owidth)) - - def test_center_crop_2(self): - """ Tests when center crop size is larger than image size, along any dimension""" - even_image_size = (random.randint(10, 32) * 2, random.randint(10, 32) * 2) - odd_image_size = (even_image_size[0] + 1, even_image_size[1] + 1) - - # Since height is independent of width, we can ignore images with odd height and even width and vice-versa. - input_image_sizes = [even_image_size, odd_image_size] - - # Get different crop sizes - delta = random.choice((1, 3, 5)) - crop_size_delta = [-2 * delta, -delta, 0, delta, 2 * delta] - crop_size_params = itertools.product(input_image_sizes, crop_size_delta, crop_size_delta) - - for (input_image_size, delta_height, delta_width) in crop_size_params: - img = torch.ones(3, *input_image_size) - crop_size = (input_image_size[0] + delta_height, input_image_size[1] + delta_width) - - # Test both transforms, one with PIL input and one with tensor - output_pil = transforms.Compose([ - transforms.ToPILImage(), - transforms.CenterCrop(crop_size), - transforms.ToTensor()], - )(img) - self.assertEqual(output_pil.size()[1:3], crop_size, - "image_size: {} crop_size: {}".format(input_image_size, crop_size)) - - output_tensor = transforms.CenterCrop(crop_size)(img) - self.assertEqual(output_tensor.size()[1:3], crop_size, - "image_size: {} crop_size: {}".format(input_image_size, crop_size)) - - # Ensure output for PIL and Tensor are equal - assert_equal( - output_tensor, output_pil, check_stride=False, - msg="image_size: {} crop_size: {}".format(input_image_size, crop_size) - ) - - # Check if content in center of both image and cropped output is same. - center_size = (min(crop_size[0], input_image_size[0]), min(crop_size[1], input_image_size[1])) - crop_center_tl, input_center_tl = [0, 0], [0, 0] - for index in range(2): - if crop_size[index] > input_image_size[index]: - crop_center_tl[index] = (crop_size[index] - input_image_size[index]) // 2 - else: - input_center_tl[index] = (input_image_size[index] - crop_size[index]) // 2 - - output_center = output_pil[ - :, - crop_center_tl[0]:crop_center_tl[0] + center_size[0], - crop_center_tl[1]:crop_center_tl[1] + center_size[1] - ] +class TestConvertImageDtype: + @pytest.mark.parametrize("input_dtype, output_dtype", cycle_over(float_dtypes())) + def test_float_to_float(self, input_dtype, output_dtype): + input_image = torch.tensor((0.0, 1.0), dtype=input_dtype) + transform = transforms.ConvertImageDtype(output_dtype) + transform_script = torch.jit.script(F.convert_image_dtype) + + output_image = transform(input_image) + output_image_script = transform_script(input_image, output_dtype) + + torch.testing.assert_close(output_image_script, output_image, rtol=0.0, atol=1e-6) + + actual_min, actual_max = output_image.tolist() + desired_min, desired_max = 0.0, 1.0 + + assert abs(actual_min - desired_min) < 1e-7 + assert abs(actual_max - desired_max) < 1e-7 + + @pytest.mark.parametrize("input_dtype", float_dtypes()) + @pytest.mark.parametrize("output_dtype", int_dtypes()) + def test_float_to_int(self, input_dtype, output_dtype): + input_image = torch.tensor((0.0, 1.0), dtype=input_dtype) + transform = transforms.ConvertImageDtype(output_dtype) + transform_script = torch.jit.script(F.convert_image_dtype) + + if (input_dtype == torch.float32 and output_dtype in (torch.int32, torch.int64)) or ( + input_dtype == torch.float64 and output_dtype == torch.int64 + ): + with pytest.raises(RuntimeError): + transform(input_image) + else: + output_image = transform(input_image) + output_image_script = transform_script(input_image, output_dtype) + + torch.testing.assert_close(output_image_script, output_image, rtol=0.0, atol=1e-6) + + actual_min, actual_max = output_image.tolist() + desired_min, desired_max = 0, torch.iinfo(output_dtype).max + + assert actual_min == desired_min + assert actual_max == desired_max + + @pytest.mark.parametrize("input_dtype", int_dtypes()) + @pytest.mark.parametrize("output_dtype", float_dtypes()) + def test_int_to_float(self, input_dtype, output_dtype): + input_image = torch.tensor((0, torch.iinfo(input_dtype).max), dtype=input_dtype) + transform = transforms.ConvertImageDtype(output_dtype) + transform_script = torch.jit.script(F.convert_image_dtype) + + output_image = transform(input_image) + output_image_script = transform_script(input_image, output_dtype) + + torch.testing.assert_close(output_image_script, output_image, rtol=0.0, atol=1e-6) + + actual_min, actual_max = output_image.tolist() + desired_min, desired_max = 0.0, 1.0 + + assert abs(actual_min - desired_min) < 1e-7 + assert actual_min >= desired_min + assert abs(actual_max - desired_max) < 1e-7 + assert actual_max <= desired_max + + @pytest.mark.parametrize("input_dtype, output_dtype", cycle_over(int_dtypes())) + def test_dtype_int_to_int(self, input_dtype, output_dtype): + input_max = torch.iinfo(input_dtype).max + input_image = torch.tensor((0, input_max), dtype=input_dtype) + output_max = torch.iinfo(output_dtype).max + + transform = transforms.ConvertImageDtype(output_dtype) + transform_script = torch.jit.script(F.convert_image_dtype) + + output_image = transform(input_image) + output_image_script = transform_script(input_image, output_dtype) + + torch.testing.assert_close( + output_image_script, + output_image, + rtol=0.0, + atol=1e-6, + msg=f"{output_image_script} vs {output_image}", + ) - img_center = img[ - :, - input_center_tl[0]:input_center_tl[0] + center_size[0], - input_center_tl[1]:input_center_tl[1] + center_size[1] + actual_min, actual_max = output_image.tolist() + desired_min, desired_max = 0, output_max + + # see https://github.com/pytorch/vision/pull/2078#issuecomment-641036236 for details + if input_max >= output_max: + error_term = 0 + else: + error_term = 1 - (torch.iinfo(output_dtype).max + 1) // (torch.iinfo(input_dtype).max + 1) + + assert actual_min == desired_min + assert actual_max == (desired_max + error_term) + + @pytest.mark.parametrize("input_dtype, output_dtype", cycle_over(int_dtypes())) + def test_int_to_int_consistency(self, input_dtype, output_dtype): + input_max = torch.iinfo(input_dtype).max + input_image = torch.tensor((0, input_max), dtype=input_dtype) + + output_max = torch.iinfo(output_dtype).max + if output_max <= input_max: + return + + transform = transforms.ConvertImageDtype(output_dtype) + inverse_transfrom = transforms.ConvertImageDtype(input_dtype) + output_image = inverse_transfrom(transform(input_image)) + + actual_min, actual_max = output_image.tolist() + desired_min, desired_max = 0, input_max + + assert actual_min == desired_min + assert actual_max == desired_max + + +@pytest.mark.skipif(accimage is None, reason="accimage not available") +class TestAccImage: + def test_accimage_to_tensor(self): + trans = transforms.PILToTensor() + + expected_output = trans(Image.open(GRACE_HOPPER).convert("RGB")) + output = trans(accimage.Image(GRACE_HOPPER)) + + torch.testing.assert_close(output, expected_output) + + def test_accimage_pil_to_tensor(self): + trans = transforms.PILToTensor() + + expected_output = trans(Image.open(GRACE_HOPPER).convert("RGB")) + output = trans(accimage.Image(GRACE_HOPPER)) + + assert expected_output.size() == output.size() + torch.testing.assert_close(output, expected_output) + + def test_accimage_resize(self): + trans = transforms.Compose( + [ + transforms.Resize(256, interpolation=Image.LINEAR), + transforms.PILToTensor(), + transforms.ConvertImageDtype(dtype=torch.float), ] + ) - assert_equal( - output_center, img_center, check_stride=False, - msg="image_size: {} crop_size: {}".format(input_image_size, crop_size) - ) + # Checking if Compose, Resize and ToTensor can be printed as string + trans.__repr__() - def test_five_crop(self): - to_pil_image = transforms.ToPILImage() - h = random.randint(5, 25) - w = random.randint(5, 25) - for single_dim in [True, False]: - crop_h = random.randint(1, h) - crop_w = random.randint(1, w) - if single_dim: - crop_h = min(crop_h, crop_w) - crop_w = crop_h - transform = transforms.FiveCrop(crop_h) - else: - transform = transforms.FiveCrop((crop_h, crop_w)) - - img = torch.FloatTensor(3, h, w).uniform_() - results = transform(to_pil_image(img)) - - self.assertEqual(len(results), 5) - for crop in results: - self.assertEqual(crop.size, (crop_w, crop_h)) - - to_pil_image = transforms.ToPILImage() - tl = to_pil_image(img[:, 0:crop_h, 0:crop_w]) - tr = to_pil_image(img[:, 0:crop_h, w - crop_w:]) - bl = to_pil_image(img[:, h - crop_h:, 0:crop_w]) - br = to_pil_image(img[:, h - crop_h:, w - crop_w:]) - center = transforms.CenterCrop((crop_h, crop_w))(to_pil_image(img)) - expected_output = (tl, tr, bl, br, center) - self.assertEqual(results, expected_output) - - def test_ten_crop(self): - to_pil_image = transforms.ToPILImage() - h = random.randint(5, 25) - w = random.randint(5, 25) - for should_vflip in [True, False]: - for single_dim in [True, False]: - crop_h = random.randint(1, h) - crop_w = random.randint(1, w) - if single_dim: - crop_h = min(crop_h, crop_w) - crop_w = crop_h - transform = transforms.TenCrop(crop_h, - vertical_flip=should_vflip) - five_crop = transforms.FiveCrop(crop_h) - else: - transform = transforms.TenCrop((crop_h, crop_w), - vertical_flip=should_vflip) - five_crop = transforms.FiveCrop((crop_h, crop_w)) - - img = to_pil_image(torch.FloatTensor(3, h, w).uniform_()) - results = transform(img) - expected_output = five_crop(img) - - # Checking if FiveCrop and TenCrop can be printed as string - transform.__repr__() - five_crop.__repr__() - - if should_vflip: - vflipped_img = img.transpose(Image.FLIP_TOP_BOTTOM) - expected_output += five_crop(vflipped_img) - else: - hflipped_img = img.transpose(Image.FLIP_LEFT_RIGHT) - expected_output += five_crop(hflipped_img) - - self.assertEqual(len(results), 10) - self.assertEqual(results, expected_output) - - def test_randomresized_params(self): - height = random.randint(24, 32) * 2 - width = random.randint(24, 32) * 2 - img = torch.ones(3, height, width) - to_pil_image = transforms.ToPILImage() - img = to_pil_image(img) - size = 100 - epsilon = 0.05 - min_scale = 0.25 - for _ in range(10): - scale_min = max(round(random.random(), 2), min_scale) - scale_range = (scale_min, scale_min + round(random.random(), 2)) - aspect_min = max(round(random.random(), 2), epsilon) - aspect_ratio_range = (aspect_min, aspect_min + round(random.random(), 2)) - randresizecrop = transforms.RandomResizedCrop(size, scale_range, aspect_ratio_range) - i, j, h, w = randresizecrop.get_params(img, scale_range, aspect_ratio_range) - aspect_ratio_obtained = w / h - self.assertTrue((min(aspect_ratio_range) - epsilon <= aspect_ratio_obtained and - aspect_ratio_obtained <= max(aspect_ratio_range) + epsilon) or - aspect_ratio_obtained == 1.0) - self.assertIsInstance(i, int) - self.assertIsInstance(j, int) - self.assertIsInstance(h, int) - self.assertIsInstance(w, int) - - def test_randomperspective(self): - for _ in range(10): - height = random.randint(24, 32) * 2 - width = random.randint(24, 32) * 2 - img = torch.ones(3, height, width) - to_pil_image = transforms.ToPILImage() - img = to_pil_image(img) - perp = transforms.RandomPerspective() - startpoints, endpoints = perp.get_params(width, height, 0.5) - tr_img = F.perspective(img, startpoints, endpoints) - tr_img2 = F.to_tensor(F.perspective(tr_img, endpoints, startpoints)) - tr_img = F.to_tensor(tr_img) - self.assertEqual(img.size[0], width) - self.assertEqual(img.size[1], height) - self.assertGreater(torch.nn.functional.mse_loss(tr_img, F.to_tensor(img)) + 0.3, - torch.nn.functional.mse_loss(tr_img2, F.to_tensor(img))) - - def test_randomperspective_fill(self): - - # assert fill being either a Sequence or a Number - with self.assertRaises(TypeError): - transforms.RandomPerspective(fill={}) - - t = transforms.RandomPerspective(fill=None) - self.assertTrue(t.fill == 0) - - height = 100 - width = 100 - img = torch.ones(3, height, width) - to_pil_image = transforms.ToPILImage() - img = to_pil_image(img) + expected_output = trans(Image.open(GRACE_HOPPER).convert("RGB")) + output = trans(accimage.Image(GRACE_HOPPER)) - modes = ("L", "RGB", "F") - nums_bands = [len(mode) for mode in modes] - fill = 127 - - for mode, num_bands in zip(modes, nums_bands): - img_conv = img.convert(mode) - perspective = transforms.RandomPerspective(p=1, fill=fill) - tr_img = perspective(img_conv) - pixel = tr_img.getpixel((0, 0)) - - if not isinstance(pixel, tuple): - pixel = (pixel,) - self.assertTupleEqual(pixel, tuple([fill] * num_bands)) - - for mode, num_bands in zip(modes, nums_bands): - img_conv = img.convert(mode) - startpoints, endpoints = transforms.RandomPerspective.get_params(width, height, 0.5) - tr_img = F.perspective(img_conv, startpoints, endpoints, fill=fill) - pixel = tr_img.getpixel((0, 0)) - - if not isinstance(pixel, tuple): - pixel = (pixel,) - self.assertTupleEqual(pixel, tuple([fill] * num_bands)) - - for wrong_num_bands in set(nums_bands) - {num_bands}: - with self.assertRaises(ValueError): - F.perspective(img_conv, startpoints, endpoints, fill=tuple([fill] * wrong_num_bands)) - - def test_resize(self): - - input_sizes = [ - # height, width - # square image - (28, 28), - (27, 27), - # rectangular image: h < w - (28, 34), - (29, 35), - # rectangular image: h > w - (34, 28), - (35, 29), - ] - test_output_sizes_1 = [ - # single integer - 22, 27, 28, 36, - # single integer in tuple/list - [22, ], (27, ), - ] - test_output_sizes_2 = [ - # two integers - [22, 22], [22, 28], [22, 36], - [27, 22], [36, 22], [28, 28], - [28, 37], [37, 27], [37, 37] - ] + assert expected_output.size() == output.size() + assert np.abs((expected_output - output).mean()) < 1e-3 + assert (expected_output - output).var() < 1e-5 + # note the high absolute tolerance + torch.testing.assert_close(output.numpy(), expected_output.numpy(), rtol=1e-5, atol=5e-2) - for height, width in input_sizes: - img = Image.new("RGB", size=(width, height), color=127) - - for osize in test_output_sizes_1: - for max_size in (None, 37, 1000): - - t = transforms.Resize(osize, max_size=max_size) - result = t(img) - - msg = "{}, {} - {} - {}".format(height, width, osize, max_size) - osize = osize[0] if isinstance(osize, (list, tuple)) else osize - # If size is an int, smaller edge of the image will be matched to this number. - # i.e, if height > width, then image will be rescaled to (size * height / width, size). - if height < width: - exp_w, exp_h = (int(osize * width / height), osize) # (w, h) - if max_size is not None and max_size < exp_w: - exp_w, exp_h = max_size, int(max_size * exp_h / exp_w) - self.assertEqual(result.size, (exp_w, exp_h), msg=msg) - elif width < height: - exp_w, exp_h = (osize, int(osize * height / width)) # (w, h) - if max_size is not None and max_size < exp_h: - exp_w, exp_h = int(max_size * exp_w / exp_h), max_size - self.assertEqual(result.size, (exp_w, exp_h), msg=msg) - else: - exp_w, exp_h = (osize, osize) # (w, h) - if max_size is not None and max_size < osize: - exp_w, exp_h = max_size, max_size - self.assertEqual(result.size, (exp_w, exp_h), msg=msg) - - for height, width in input_sizes: - img = Image.new("RGB", size=(width, height), color=127) - - for osize in test_output_sizes_2: - oheight, owidth = osize - - t = transforms.Resize(osize) - result = t(img) - - self.assertEqual((owidth, oheight), result.size) - - with self.assertWarnsRegex(UserWarning, r"Anti-alias option is always applied for PIL Image input"): - t = transforms.Resize(osize, antialias=False) - t(img) - - def test_random_crop(self): - height = random.randint(10, 32) * 2 - width = random.randint(10, 32) * 2 - oheight = random.randint(5, (height - 2) / 2) * 2 - owidth = random.randint(5, (width - 2) / 2) * 2 - img = torch.ones(3, height, width) - result = transforms.Compose([ - transforms.ToPILImage(), - transforms.RandomCrop((oheight, owidth)), - transforms.ToTensor(), - ])(img) - self.assertEqual(result.size(1), oheight) - self.assertEqual(result.size(2), owidth) + def test_accimage_crop(self): + trans = transforms.Compose( + [transforms.CenterCrop(256), transforms.PILToTensor(), transforms.ConvertImageDtype(dtype=torch.float)] + ) - padding = random.randint(1, 20) - result = transforms.Compose([ - transforms.ToPILImage(), - transforms.RandomCrop((oheight, owidth), padding=padding), - transforms.ToTensor(), - ])(img) - self.assertEqual(result.size(1), oheight) - self.assertEqual(result.size(2), owidth) + # Checking if Compose, CenterCrop and ToTensor can be printed as string + trans.__repr__() - result = transforms.Compose([ - transforms.ToPILImage(), - transforms.RandomCrop((height, width)), - transforms.ToTensor() - ])(img) - self.assertEqual(result.size(1), height) - self.assertEqual(result.size(2), width) - torch.testing.assert_close(result, img) - - result = transforms.Compose([ - transforms.ToPILImage(), - transforms.RandomCrop((height + 1, width + 1), pad_if_needed=True), - transforms.ToTensor(), - ])(img) - self.assertEqual(result.size(1), height + 1) - self.assertEqual(result.size(2), width + 1) + expected_output = trans(Image.open(GRACE_HOPPER).convert("RGB")) + output = trans(accimage.Image(GRACE_HOPPER)) + + assert expected_output.size() == output.size() + torch.testing.assert_close(output, expected_output) + + +class TestToTensor: + @pytest.mark.parametrize("channels", [1, 3, 4]) + def test_to_tensor(self, channels): + height, width = 4, 4 + trans = transforms.ToTensor() + np_rng = np.random.RandomState(0) + + input_data = torch.ByteTensor(channels, height, width).random_(0, 255).float().div_(255) + img = transforms.ToPILImage()(input_data) + output = trans(img) + torch.testing.assert_close(output, input_data) + + ndarray = np_rng.randint(low=0, high=255, size=(height, width, channels)).astype(np.uint8) + output = trans(ndarray) + expected_output = ndarray.transpose((2, 0, 1)) / 255.0 + torch.testing.assert_close(output.numpy(), expected_output, check_dtype=False) + + ndarray = np_rng.rand(height, width, channels).astype(np.float32) + output = trans(ndarray) + expected_output = ndarray.transpose((2, 0, 1)) + torch.testing.assert_close(output.numpy(), expected_output, check_dtype=False) + + # separate test for mode '1' PIL images + input_data = torch.ByteTensor(1, height, width).bernoulli_() + img = transforms.ToPILImage()(input_data.mul(255)).convert("1") + output = trans(img) + torch.testing.assert_close(input_data, output, check_dtype=False) + + def test_to_tensor_errors(self): + height, width = 4, 4 + trans = transforms.ToTensor() + np_rng = np.random.RandomState(0) + + with pytest.raises(TypeError): + trans(np_rng.rand(1, height, width).tolist()) + + with pytest.raises(ValueError): + trans(np_rng.rand(height)) + + with pytest.raises(ValueError): + trans(np_rng.rand(1, 1, height, width)) + + @pytest.mark.parametrize("dtype", [torch.float16, torch.float, torch.double]) + def test_to_tensor_with_other_default_dtypes(self, dtype): + np_rng = np.random.RandomState(0) + current_def_dtype = torch.get_default_dtype() + + t = transforms.ToTensor() + np_arr = np_rng.randint(0, 255, (32, 32, 3), dtype=np.uint8) + img = Image.fromarray(np_arr) + + torch.set_default_dtype(dtype) + res = t(img) + assert res.dtype == dtype, f"{res.dtype} vs {dtype}" + + torch.set_default_dtype(current_def_dtype) + + @pytest.mark.parametrize("channels", [1, 3, 4]) + def test_pil_to_tensor(self, channels): + height, width = 4, 4 + trans = transforms.PILToTensor() + np_rng = np.random.RandomState(0) - t = transforms.RandomCrop(48) - img = torch.ones(3, 32, 32) - with self.assertRaisesRegex(ValueError, r"Required crop size .+ is larger then input image size .+"): - t(img) + input_data = torch.ByteTensor(channels, height, width).random_(0, 255) + img = transforms.ToPILImage()(input_data) + output = trans(img) + torch.testing.assert_close(input_data, output) + + input_data = np_rng.randint(low=0, high=255, size=(height, width, channels)).astype(np.uint8) + img = transforms.ToPILImage()(input_data) + output = trans(img) + expected_output = input_data.transpose((2, 0, 1)) + torch.testing.assert_close(output.numpy(), expected_output) + + input_data = torch.as_tensor(np_rng.rand(channels, height, width).astype(np.float32)) + img = transforms.ToPILImage()(input_data) # CHW -> HWC and (* 255).byte() + output = trans(img) # HWC -> CHW + expected_output = (input_data * 255).byte() + torch.testing.assert_close(output, expected_output) - def test_pad(self): + # separate test for mode '1' PIL images + input_data = torch.ByteTensor(1, height, width).bernoulli_() + img = transforms.ToPILImage()(input_data.mul(255)).convert("1") + output = trans(img).view(torch.uint8).bool().to(torch.uint8) + torch.testing.assert_close(input_data, output) + + def test_pil_to_tensor_errors(self): + height, width = 4, 4 + trans = transforms.PILToTensor() + np_rng = np.random.RandomState(0) + + with pytest.raises(TypeError): + trans(np_rng.rand(1, height, width).tolist()) + + with pytest.raises(TypeError): + trans(np_rng.rand(1, height, width)) + + +def test_randomresized_params(): + height = random.randint(24, 32) * 2 + width = random.randint(24, 32) * 2 + img = torch.ones(3, height, width) + to_pil_image = transforms.ToPILImage() + img = to_pil_image(img) + size = 100 + epsilon = 0.05 + min_scale = 0.25 + for _ in range(10): + scale_min = max(round(random.random(), 2), min_scale) + scale_range = (scale_min, scale_min + round(random.random(), 2)) + aspect_min = max(round(random.random(), 2), epsilon) + aspect_ratio_range = (aspect_min, aspect_min + round(random.random(), 2)) + randresizecrop = transforms.RandomResizedCrop(size, scale_range, aspect_ratio_range, antialias=True) + i, j, h, w = randresizecrop.get_params(img, scale_range, aspect_ratio_range) + aspect_ratio_obtained = w / h + assert ( + min(aspect_ratio_range) - epsilon <= aspect_ratio_obtained + and aspect_ratio_obtained <= max(aspect_ratio_range) + epsilon + ) or aspect_ratio_obtained == 1.0 + assert isinstance(i, int) + assert isinstance(j, int) + assert isinstance(h, int) + assert isinstance(w, int) + + +@pytest.mark.parametrize( + "height, width", + [ + # height, width + # square image + (28, 28), + (27, 27), + # rectangular image: h < w + (28, 34), + (29, 35), + # rectangular image: h > w + (34, 28), + (35, 29), + ], +) +@pytest.mark.parametrize( + "osize", + [ + # single integer + 22, + 27, + 28, + 36, + # single integer in tuple/list + [ + 22, + ], + (27,), + ], +) +@pytest.mark.parametrize("max_size", (None, 37, 1000)) +def test_resize(height, width, osize, max_size): + img = Image.new("RGB", size=(width, height), color=127) + + t = transforms.Resize(osize, max_size=max_size, antialias=True) + result = t(img) + + msg = f"{height}, {width} - {osize} - {max_size}" + osize = osize[0] if isinstance(osize, (list, tuple)) else osize + # If size is an int, smaller edge of the image will be matched to this number. + # i.e, if height > width, then image will be rescaled to (size * height / width, size). + if height < width: + exp_w, exp_h = (int(osize * width / height), osize) # (w, h) + if max_size is not None and max_size < exp_w: + exp_w, exp_h = max_size, int(max_size * exp_h / exp_w) + assert result.size == (exp_w, exp_h), msg + elif width < height: + exp_w, exp_h = (osize, int(osize * height / width)) # (w, h) + if max_size is not None and max_size < exp_h: + exp_w, exp_h = int(max_size * exp_w / exp_h), max_size + assert result.size == (exp_w, exp_h), msg + else: + exp_w, exp_h = (osize, osize) # (w, h) + if max_size is not None and max_size < osize: + exp_w, exp_h = max_size, max_size + assert result.size == (exp_w, exp_h), msg + + +@pytest.mark.parametrize( + "height, width", + [ + # height, width + # square image + (28, 28), + (27, 27), + # rectangular image: h < w + (28, 34), + (29, 35), + # rectangular image: h > w + (34, 28), + (35, 29), + ], +) +@pytest.mark.parametrize( + "osize", + [ + # two integers sequence output + [22, 22], + [22, 28], + [22, 36], + [27, 22], + [36, 22], + [28, 28], + [28, 37], + [37, 27], + [37, 37], + ], +) +def test_resize_sequence_output(height, width, osize): + img = Image.new("RGB", size=(width, height), color=127) + oheight, owidth = osize + + t = transforms.Resize(osize, antialias=True) + result = t(img) + + assert (owidth, oheight) == result.size + + +def test_resize_antialias_error(): + osize = [37, 37] + img = Image.new("RGB", size=(35, 29), color=127) + + with pytest.warns(UserWarning, match=r"Anti-alias option is always applied for PIL Image input"): + t = transforms.Resize(osize, antialias=False) + t(img) + + +@pytest.mark.parametrize("height, width", ((32, 64), (64, 32))) +def test_resize_size_equals_small_edge_size(height, width): + # Non-regression test for https://github.com/pytorch/vision/issues/5405 + # max_size used to be ignored if size == small_edge_size + max_size = 40 + img = Image.new("RGB", size=(width, height), color=127) + + small_edge = min(height, width) + t = transforms.Resize(small_edge, max_size=max_size, antialias=True) + result = t(img) + assert max(result.size) == max_size + + +def test_resize_equal_input_output_sizes(): + # Regression test for https://github.com/pytorch/vision/issues/7518 + height, width = 28, 27 + img = Image.new("RGB", size=(width, height)) + + t = transforms.Resize((height, width), antialias=True) + result = t(img) + assert result is img + + +class TestPad: + @pytest.mark.parametrize("fill", [85, 85.0]) + def test_pad(self, fill): height = random.randint(10, 32) * 2 width = random.randint(10, 32) * 2 - img = torch.ones(3, height, width) + img = torch.ones(3, height, width, dtype=torch.uint8) padding = random.randint(1, 20) - fill = random.randint(1, 50) - result = transforms.Compose([ - transforms.ToPILImage(), - transforms.Pad(padding, fill=fill), - transforms.ToTensor(), - ])(img) - self.assertEqual(result.size(1), height + 2 * padding) - self.assertEqual(result.size(2), width + 2 * padding) + result = transforms.Compose( + [ + transforms.ToPILImage(), + transforms.Pad(padding, fill=fill), + transforms.PILToTensor(), + ] + )(img) + assert result.size(1) == height + 2 * padding + assert result.size(2) == width + 2 * padding # check that all elements in the padded region correspond # to the pad value - fill_v = fill / 255 - eps = 1e-5 h_padded = result[:, :padding, :] w_padded = result[:, :, :padding] - torch.testing.assert_close( - h_padded, torch.full_like(h_padded, fill_value=fill_v), check_stride=False, rtol=0.0, atol=eps - ) - torch.testing.assert_close( - w_padded, torch.full_like(w_padded, fill_value=fill_v), check_stride=False, rtol=0.0, atol=eps - ) - self.assertRaises(ValueError, transforms.Pad(padding, fill=(1, 2)), - transforms.ToPILImage()(img)) + torch.testing.assert_close(h_padded, torch.full_like(h_padded, fill_value=fill), rtol=0.0, atol=0.0) + torch.testing.assert_close(w_padded, torch.full_like(w_padded, fill_value=fill), rtol=0.0, atol=0.0) + pytest.raises(ValueError, transforms.Pad(padding, fill=(1, 2)), transforms.ToPILImage()(img)) def test_pad_with_tuple_of_pad_values(self): height = random.randint(10, 32) * 2 width = random.randint(10, 32) * 2 img = transforms.ToPILImage()(torch.ones(3, height, width)) - padding = tuple([random.randint(1, 20) for _ in range(2)]) + padding = tuple(random.randint(1, 20) for _ in range(2)) output = transforms.Pad(padding)(img) - self.assertEqual(output.size, (width + padding[0] * 2, height + padding[1] * 2)) + assert output.size == (width + padding[0] * 2, height + padding[1] * 2) - padding = tuple([random.randint(1, 20) for _ in range(4)]) + padding = [random.randint(1, 20) for _ in range(4)] output = transforms.Pad(padding)(img) - self.assertEqual(output.size[0], width + padding[0] + padding[2]) - self.assertEqual(output.size[1], height + padding[1] + padding[3]) + assert output.size[0] == width + padding[0] + padding[2] + assert output.size[1] == height + padding[1] + padding[3] # Checking if Padding can be printed as string transforms.Pad(padding).__repr__() @@ -455,47 +511,47 @@ class Tester(unittest.TestCase): img = F.pad(img, 1, (200, 200, 200)) # pad 3 to all sidess - edge_padded_img = F.pad(img, 3, padding_mode='edge') + edge_padded_img = F.pad(img, 3, padding_mode="edge") # First 6 elements of leftmost edge in the middle of the image, values are in order: # edge_pad, edge_pad, edge_pad, constant_pad, constant value added to leftmost edge, 0 edge_middle_slice = np.asarray(edge_padded_img).transpose(2, 0, 1)[0][17][:6] - assert_equal(edge_middle_slice, np.asarray([200, 200, 200, 200, 1, 0], dtype=np.uint8), check_stride=False) - self.assertEqual(transforms.ToTensor()(edge_padded_img).size(), (3, 35, 35)) + assert_equal(edge_middle_slice, np.asarray([200, 200, 200, 200, 1, 0], dtype=np.uint8)) + assert transforms.PILToTensor()(edge_padded_img).size() == (3, 35, 35) # Pad 3 to left/right, 2 to top/bottom - reflect_padded_img = F.pad(img, (3, 2), padding_mode='reflect') + reflect_padded_img = F.pad(img, (3, 2), padding_mode="reflect") # First 6 elements of leftmost edge in the middle of the image, values are in order: # reflect_pad, reflect_pad, reflect_pad, constant_pad, constant value added to leftmost edge, 0 reflect_middle_slice = np.asarray(reflect_padded_img).transpose(2, 0, 1)[0][17][:6] - assert_equal(reflect_middle_slice, np.asarray([0, 0, 1, 200, 1, 0], dtype=np.uint8), check_stride=False) - self.assertEqual(transforms.ToTensor()(reflect_padded_img).size(), (3, 33, 35)) + assert_equal(reflect_middle_slice, np.asarray([0, 0, 1, 200, 1, 0], dtype=np.uint8)) + assert transforms.PILToTensor()(reflect_padded_img).size() == (3, 33, 35) # Pad 3 to left, 2 to top, 2 to right, 1 to bottom - symmetric_padded_img = F.pad(img, (3, 2, 2, 1), padding_mode='symmetric') + symmetric_padded_img = F.pad(img, (3, 2, 2, 1), padding_mode="symmetric") # First 6 elements of leftmost edge in the middle of the image, values are in order: # sym_pad, sym_pad, sym_pad, constant_pad, constant value added to leftmost edge, 0 symmetric_middle_slice = np.asarray(symmetric_padded_img).transpose(2, 0, 1)[0][17][:6] - assert_equal(symmetric_middle_slice, np.asarray([0, 1, 200, 200, 1, 0], dtype=np.uint8), check_stride=False) - self.assertEqual(transforms.ToTensor()(symmetric_padded_img).size(), (3, 32, 34)) + assert_equal(symmetric_middle_slice, np.asarray([0, 1, 200, 200, 1, 0], dtype=np.uint8)) + assert transforms.PILToTensor()(symmetric_padded_img).size() == (3, 32, 34) # Check negative padding explicitly for symmetric case, since it is not # implemented for tensor case to compare to # Crop 1 to left, pad 2 to top, pad 3 to right, crop 3 to bottom - symmetric_padded_img_neg = F.pad(img, (-1, 2, 3, -3), padding_mode='symmetric') + symmetric_padded_img_neg = F.pad(img, (-1, 2, 3, -3), padding_mode="symmetric") symmetric_neg_middle_left = np.asarray(symmetric_padded_img_neg).transpose(2, 0, 1)[0][17][:3] symmetric_neg_middle_right = np.asarray(symmetric_padded_img_neg).transpose(2, 0, 1)[0][17][-4:] - assert_equal(symmetric_neg_middle_left, np.asarray([1, 0, 0], dtype=np.uint8), check_stride=False) - assert_equal(symmetric_neg_middle_right, np.asarray([200, 200, 0, 0], dtype=np.uint8), check_stride=False) - self.assertEqual(transforms.ToTensor()(symmetric_padded_img_neg).size(), (3, 28, 31)) + assert_equal(symmetric_neg_middle_left, np.asarray([1, 0, 0], dtype=np.uint8)) + assert_equal(symmetric_neg_middle_right, np.asarray([200, 200, 0, 0], dtype=np.uint8)) + assert transforms.PILToTensor()(symmetric_padded_img_neg).size() == (3, 28, 31) def test_pad_raises_with_invalid_pad_sequence_len(self): - with self.assertRaises(ValueError): + with pytest.raises(ValueError): transforms.Pad(()) - with self.assertRaises(ValueError): + with pytest.raises(ValueError): transforms.Pad((1, 2, 3)) - with self.assertRaises(ValueError): + with pytest.raises(ValueError): transforms.Pad((1, 2, 3, 4, 5)) def test_pad_with_mode_F_images(self): @@ -504,1520 +560,1686 @@ class Tester(unittest.TestCase): img = Image.new("F", (10, 10)) padded_img = transform(img) - self.assertSequenceEqual(padded_img.size, [edge_size + 2 * pad for edge_size in img.size]) - - def test_lambda(self): - trans = transforms.Lambda(lambda x: x.add(10)) - x = torch.randn(10) - y = trans(x) - assert_equal(y, torch.add(x, 10)) - - trans = transforms.Lambda(lambda x: x.add_(10)) - x = torch.randn(10) - y = trans(x) - assert_equal(y, x) - - # Checking if Lambda can be printed as string - trans.__repr__() - - @unittest.skipIf(stats is None, 'scipy.stats not available') - def test_random_apply(self): - random_state = random.getstate() - random.seed(42) - random_apply_transform = transforms.RandomApply( - [ - transforms.RandomRotation((-45, 45)), - transforms.RandomHorizontalFlip(), - transforms.RandomVerticalFlip(), - ], p=0.75 - ) - img = transforms.ToPILImage()(torch.rand(3, 10, 10)) - num_samples = 250 - num_applies = 0 - for _ in range(num_samples): - out = random_apply_transform(img) - if out != img: - num_applies += 1 - - p_value = stats.binom_test(num_applies, num_samples, p=0.75) - random.setstate(random_state) - self.assertGreater(p_value, 0.0001) - - # Checking if RandomApply can be printed as string - random_apply_transform.__repr__() - - @unittest.skipIf(stats is None, 'scipy.stats not available') - def test_random_choice(self): - random_state = random.getstate() - random.seed(42) - random_choice_transform = transforms.RandomChoice( - [ - transforms.Resize(15), - transforms.Resize(20), - transforms.CenterCrop(10) - ] - ) - img = transforms.ToPILImage()(torch.rand(3, 25, 25)) - num_samples = 250 - num_resize_15 = 0 - num_resize_20 = 0 - num_crop_10 = 0 - for _ in range(num_samples): - out = random_choice_transform(img) - if out.size == (15, 15): - num_resize_15 += 1 - elif out.size == (20, 20): - num_resize_20 += 1 - elif out.size == (10, 10): - num_crop_10 += 1 - - p_value = stats.binom_test(num_resize_15, num_samples, p=0.33333) - self.assertGreater(p_value, 0.0001) - p_value = stats.binom_test(num_resize_20, num_samples, p=0.33333) - self.assertGreater(p_value, 0.0001) - p_value = stats.binom_test(num_crop_10, num_samples, p=0.33333) - self.assertGreater(p_value, 0.0001) - - random.setstate(random_state) - # Checking if RandomChoice can be printed as string - random_choice_transform.__repr__() - - @unittest.skipIf(stats is None, 'scipy.stats not available') - def test_random_order(self): - random_state = random.getstate() - random.seed(42) - random_order_transform = transforms.RandomOrder( - [ - transforms.Resize(20), - transforms.CenterCrop(10) - ] - ) - img = transforms.ToPILImage()(torch.rand(3, 25, 25)) - num_samples = 250 - num_normal_order = 0 - resize_crop_out = transforms.CenterCrop(10)(transforms.Resize(20)(img)) - for _ in range(num_samples): - out = random_order_transform(img) - if out == resize_crop_out: - num_normal_order += 1 - - p_value = stats.binom_test(num_normal_order, num_samples, p=0.5) - random.setstate(random_state) - self.assertGreater(p_value, 0.0001) - - # Checking if RandomOrder can be printed as string - random_order_transform.__repr__() - - def test_to_tensor(self): - test_channels = [1, 3, 4] - height, width = 4, 4 - trans = transforms.ToTensor() - - with self.assertRaises(TypeError): - trans(np.random.rand(1, height, width).tolist()) - - with self.assertRaises(ValueError): - trans(np.random.rand(height)) - trans(np.random.rand(1, 1, height, width)) - - for channels in test_channels: - input_data = torch.ByteTensor(channels, height, width).random_(0, 255).float().div_(255) - img = transforms.ToPILImage()(input_data) - output = trans(img) - torch.testing.assert_close(output, input_data, check_stride=False) - - ndarray = np.random.randint(low=0, high=255, size=(height, width, channels)).astype(np.uint8) - output = trans(ndarray) - expected_output = ndarray.transpose((2, 0, 1)) / 255.0 - torch.testing.assert_close(output.numpy(), expected_output, check_stride=False, check_dtype=False) - - ndarray = np.random.rand(height, width, channels).astype(np.float32) - output = trans(ndarray) - expected_output = ndarray.transpose((2, 0, 1)) - torch.testing.assert_close(output.numpy(), expected_output, check_stride=False, check_dtype=False) - - # separate test for mode '1' PIL images - input_data = torch.ByteTensor(1, height, width).bernoulli_() - img = transforms.ToPILImage()(input_data.mul(255)).convert('1') - output = trans(img) - torch.testing.assert_close(input_data, output, check_dtype=False, check_stride=False) - - def test_to_tensor_with_other_default_dtypes(self): - current_def_dtype = torch.get_default_dtype() - - t = transforms.ToTensor() - np_arr = np.random.randint(0, 255, (32, 32, 3), dtype=np.uint8) - img = Image.fromarray(np_arr) - - for dtype in [torch.float16, torch.float, torch.double]: - torch.set_default_dtype(dtype) - res = t(img) - self.assertTrue(res.dtype == dtype, msg=f"{res.dtype} vs {dtype}") - - torch.set_default_dtype(current_def_dtype) - - def test_max_value(self): - for dtype in int_dtypes(): - self.assertEqual(F_t._max_value(dtype), torch.iinfo(dtype).max) - - # remove float testing as it can lead to errors such as - # runtime error: 5.7896e+76 is outside the range of representable values of type 'float' - # for dtype in float_dtypes(): - # self.assertGreater(F_t._max_value(dtype), torch.finfo(dtype).max) - - def test_convert_image_dtype_float_to_float(self): - for input_dtype, output_dtypes in cycle_over(float_dtypes()): - input_image = torch.tensor((0.0, 1.0), dtype=input_dtype) - for output_dtype in output_dtypes: - with self.subTest(input_dtype=input_dtype, output_dtype=output_dtype): - transform = transforms.ConvertImageDtype(output_dtype) - transform_script = torch.jit.script(F.convert_image_dtype) - - output_image = transform(input_image) - output_image_script = transform_script(input_image, output_dtype) - - torch.testing.assert_close(output_image_script, output_image, rtol=0.0, atol=1e-6) - - actual_min, actual_max = output_image.tolist() - desired_min, desired_max = 0.0, 1.0 - - self.assertAlmostEqual(actual_min, desired_min) - self.assertAlmostEqual(actual_max, desired_max) - - def test_convert_image_dtype_float_to_int(self): - for input_dtype in float_dtypes(): - input_image = torch.tensor((0.0, 1.0), dtype=input_dtype) - for output_dtype in int_dtypes(): - with self.subTest(input_dtype=input_dtype, output_dtype=output_dtype): - transform = transforms.ConvertImageDtype(output_dtype) - transform_script = torch.jit.script(F.convert_image_dtype) - - if (input_dtype == torch.float32 and output_dtype in (torch.int32, torch.int64)) or ( - input_dtype == torch.float64 and output_dtype == torch.int64 - ): - with self.assertRaises(RuntimeError): - transform(input_image) - else: - output_image = transform(input_image) - output_image_script = transform_script(input_image, output_dtype) - - torch.testing.assert_close(output_image_script, output_image, rtol=0.0, atol=1e-6) - - actual_min, actual_max = output_image.tolist() - desired_min, desired_max = 0, torch.iinfo(output_dtype).max - - self.assertEqual(actual_min, desired_min) - self.assertEqual(actual_max, desired_max) - - def test_convert_image_dtype_int_to_float(self): - for input_dtype in int_dtypes(): - input_image = torch.tensor((0, torch.iinfo(input_dtype).max), dtype=input_dtype) - for output_dtype in float_dtypes(): - with self.subTest(input_dtype=input_dtype, output_dtype=output_dtype): - transform = transforms.ConvertImageDtype(output_dtype) - transform_script = torch.jit.script(F.convert_image_dtype) - - output_image = transform(input_image) - output_image_script = transform_script(input_image, output_dtype) - - torch.testing.assert_close(output_image_script, output_image, rtol=0.0, atol=1e-6) - - actual_min, actual_max = output_image.tolist() - desired_min, desired_max = 0.0, 1.0 - - self.assertAlmostEqual(actual_min, desired_min) - self.assertGreaterEqual(actual_min, desired_min) - self.assertAlmostEqual(actual_max, desired_max) - self.assertLessEqual(actual_max, desired_max) - - def test_convert_image_dtype_int_to_int(self): - for input_dtype, output_dtypes in cycle_over(int_dtypes()): - input_max = torch.iinfo(input_dtype).max - input_image = torch.tensor((0, input_max), dtype=input_dtype) - for output_dtype in output_dtypes: - output_max = torch.iinfo(output_dtype).max - - with self.subTest(input_dtype=input_dtype, output_dtype=output_dtype): - transform = transforms.ConvertImageDtype(output_dtype) - transform_script = torch.jit.script(F.convert_image_dtype) - - output_image = transform(input_image) - output_image_script = transform_script(input_image, output_dtype) - - torch.testing.assert_close( - output_image_script, - output_image, - rtol=0.0, - atol=1e-6, - msg="{} vs {}".format(output_image_script, output_image), - ) - - actual_min, actual_max = output_image.tolist() - desired_min, desired_max = 0, output_max - - # see https://github.com/pytorch/vision/pull/2078#issuecomment-641036236 for details - if input_max >= output_max: - error_term = 0 - else: - error_term = 1 - (torch.iinfo(output_dtype).max + 1) // (torch.iinfo(input_dtype).max + 1) - - self.assertEqual(actual_min, desired_min) - self.assertEqual(actual_max, desired_max + error_term) - - def test_convert_image_dtype_int_to_int_consistency(self): - for input_dtype, output_dtypes in cycle_over(int_dtypes()): - input_max = torch.iinfo(input_dtype).max - input_image = torch.tensor((0, input_max), dtype=input_dtype) - for output_dtype in output_dtypes: - output_max = torch.iinfo(output_dtype).max - if output_max <= input_max: - continue - - with self.subTest(input_dtype=input_dtype, output_dtype=output_dtype): - transform = transforms.ConvertImageDtype(output_dtype) - inverse_transfrom = transforms.ConvertImageDtype(input_dtype) - output_image = inverse_transfrom(transform(input_image)) - - actual_min, actual_max = output_image.tolist() - desired_min, desired_max = 0, input_max - - self.assertEqual(actual_min, desired_min) - self.assertEqual(actual_max, desired_max) - - @unittest.skipIf(accimage is None, 'accimage not available') - def test_accimage_to_tensor(self): - trans = transforms.ToTensor() - - expected_output = trans(Image.open(GRACE_HOPPER).convert('RGB')) - output = trans(accimage.Image(GRACE_HOPPER)) - - torch.testing.assert_close(output, expected_output) - - def test_pil_to_tensor(self): - test_channels = [1, 3, 4] - height, width = 4, 4 - trans = transforms.PILToTensor() - - with self.assertRaises(TypeError): - trans(np.random.rand(1, height, width).tolist()) - trans(np.random.rand(1, height, width)) - - for channels in test_channels: - input_data = torch.ByteTensor(channels, height, width).random_(0, 255) - img = transforms.ToPILImage()(input_data) - output = trans(img) - torch.testing.assert_close(input_data, output, check_stride=False) - - input_data = np.random.randint(low=0, high=255, size=(height, width, channels)).astype(np.uint8) - img = transforms.ToPILImage()(input_data) - output = trans(img) - expected_output = input_data.transpose((2, 0, 1)) - torch.testing.assert_close(output.numpy(), expected_output) - - input_data = torch.as_tensor(np.random.rand(channels, height, width).astype(np.float32)) - img = transforms.ToPILImage()(input_data) # CHW -> HWC and (* 255).byte() - output = trans(img) # HWC -> CHW - expected_output = (input_data * 255).byte() - torch.testing.assert_close(output, expected_output, check_stride=False) - - # separate test for mode '1' PIL images - input_data = torch.ByteTensor(1, height, width).bernoulli_() - img = transforms.ToPILImage()(input_data.mul(255)).convert('1') - output = trans(img).view(torch.uint8).bool().to(torch.uint8) - torch.testing.assert_close(input_data, output, check_stride=False) - - @unittest.skipIf(accimage is None, 'accimage not available') - def test_accimage_pil_to_tensor(self): - trans = transforms.PILToTensor() - - expected_output = trans(Image.open(GRACE_HOPPER).convert('RGB')) - output = trans(accimage.Image(GRACE_HOPPER)) - - self.assertEqual(expected_output.size(), output.size()) - torch.testing.assert_close(output, expected_output, check_stride=False) - - @unittest.skipIf(accimage is None, 'accimage not available') - def test_accimage_resize(self): - trans = transforms.Compose([ - transforms.Resize(256, interpolation=Image.LINEAR), - transforms.ToTensor(), - ]) + assert_equal(padded_img.size, [edge_size + 2 * pad for edge_size in img.size]) + + +@pytest.mark.parametrize( + "fn, trans, kwargs", + [ + (F.invert, transforms.RandomInvert, {}), + (F.posterize, transforms.RandomPosterize, {"bits": 4}), + (F.solarize, transforms.RandomSolarize, {"threshold": 192}), + (F.adjust_sharpness, transforms.RandomAdjustSharpness, {"sharpness_factor": 2.0}), + (F.autocontrast, transforms.RandomAutocontrast, {}), + (F.equalize, transforms.RandomEqualize, {}), + (F.vflip, transforms.RandomVerticalFlip, {}), + (F.hflip, transforms.RandomHorizontalFlip, {}), + (partial(F.to_grayscale, num_output_channels=3), transforms.RandomGrayscale, {}), + ], +) +@pytest.mark.parametrize("seed", range(10)) +@pytest.mark.parametrize("p", (0, 1)) +def test_randomness(fn, trans, kwargs, seed, p): + torch.manual_seed(seed) + img = transforms.ToPILImage()(torch.rand(3, 16, 18)) + + expected_transformed_img = fn(img, **kwargs) + randomly_transformed_img = trans(p=p, **kwargs)(img) + + if p == 0: + assert randomly_transformed_img == img + elif p == 1: + assert randomly_transformed_img == expected_transformed_img + + trans(**kwargs).__repr__() + + +def test_autocontrast_equal_minmax(): + img_tensor = torch.tensor([[[10]], [[128]], [[245]]], dtype=torch.uint8).expand(3, 32, 32) + img_pil = F.to_pil_image(img_tensor) + + img_tensor = F.autocontrast(img_tensor) + img_pil = F.autocontrast(img_pil) + torch.testing.assert_close(img_tensor, F.pil_to_tensor(img_pil)) + + +class TestToPil: + def _get_1_channel_tensor_various_types(): + img_data_float = torch.Tensor(1, 4, 4).uniform_() + expected_output = img_data_float.mul(255).int().float().div(255).numpy() + yield img_data_float, expected_output, "L" - # Checking if Compose, Resize and ToTensor can be printed as string - trans.__repr__() + img_data_byte = torch.ByteTensor(1, 4, 4).random_(0, 255) + expected_output = img_data_byte.float().div(255.0).numpy() + yield img_data_byte, expected_output, "L" - expected_output = trans(Image.open(GRACE_HOPPER).convert('RGB')) - output = trans(accimage.Image(GRACE_HOPPER)) + img_data_short = torch.ShortTensor(1, 4, 4).random_() + expected_output = img_data_short.numpy() + yield img_data_short, expected_output, "I;16" if sys.byteorder == "little" else "I;16B" - self.assertEqual(expected_output.size(), output.size()) - self.assertLess(np.abs((expected_output - output).mean()), 1e-3) - self.assertLess((expected_output - output).var(), 1e-5) - # note the high absolute tolerance - self.assertTrue(np.allclose(output.numpy(), expected_output.numpy(), atol=5e-2)) + img_data_int = torch.IntTensor(1, 4, 4).random_() + expected_output = img_data_int.numpy() + yield img_data_int, expected_output, "I" - @unittest.skipIf(accimage is None, 'accimage not available') - def test_accimage_crop(self): - trans = transforms.Compose([ - transforms.CenterCrop(256), - transforms.ToTensor(), - ]) + def _get_2d_tensor_various_types(): + img_data_float = torch.Tensor(4, 4).uniform_() + expected_output = img_data_float.mul(255).int().float().div(255).numpy() + yield img_data_float, expected_output, "L" - # Checking if Compose, CenterCrop and ToTensor can be printed as string - trans.__repr__() + img_data_byte = torch.ByteTensor(4, 4).random_(0, 255) + expected_output = img_data_byte.float().div(255.0).numpy() + yield img_data_byte, expected_output, "L" - expected_output = trans(Image.open(GRACE_HOPPER).convert('RGB')) - output = trans(accimage.Image(GRACE_HOPPER)) + img_data_short = torch.ShortTensor(4, 4).random_() + expected_output = img_data_short.numpy() + yield img_data_short, expected_output, "I;16" if sys.byteorder == "little" else "I;16B" - self.assertEqual(expected_output.size(), output.size()) - torch.testing.assert_close(output, expected_output) + img_data_int = torch.IntTensor(4, 4).random_() + expected_output = img_data_int.numpy() + yield img_data_int, expected_output, "I" - def test_1_channel_tensor_to_pil_image(self): + @pytest.mark.parametrize("with_mode", [False, True]) + @pytest.mark.parametrize("img_data, expected_output, expected_mode", _get_1_channel_tensor_various_types()) + def test_1_channel_tensor_to_pil_image(self, with_mode, img_data, expected_output, expected_mode): + transform = transforms.ToPILImage(mode=expected_mode) if with_mode else transforms.ToPILImage() to_tensor = transforms.ToTensor() - img_data_float = torch.Tensor(1, 4, 4).uniform_() - img_data_byte = torch.ByteTensor(1, 4, 4).random_(0, 255) - img_data_short = torch.ShortTensor(1, 4, 4).random_() - img_data_int = torch.IntTensor(1, 4, 4).random_() + img = transform(img_data) + assert img.mode == expected_mode + torch.testing.assert_close(expected_output, to_tensor(img).numpy()) - inputs = [img_data_float, img_data_byte, img_data_short, img_data_int] - expected_outputs = [img_data_float.mul(255).int().float().div(255).numpy(), - img_data_byte.float().div(255.0).numpy(), - img_data_short.numpy(), - img_data_int.numpy()] - expected_modes = ['L', 'L', 'I;16', 'I'] - - for img_data, expected_output, mode in zip(inputs, expected_outputs, expected_modes): - for transform in [transforms.ToPILImage(), transforms.ToPILImage(mode=mode)]: - img = transform(img_data) - self.assertEqual(img.mode, mode) - torch.testing.assert_close(expected_output, to_tensor(img).numpy(), check_stride=False) + def test_1_channel_float_tensor_to_pil_image(self): + img_data = torch.Tensor(1, 4, 4).uniform_() # 'F' mode for torch.FloatTensor - img_F_mode = transforms.ToPILImage(mode='F')(img_data_float) - self.assertEqual(img_F_mode.mode, 'F') + img_F_mode = transforms.ToPILImage(mode="F")(img_data) + assert img_F_mode.mode == "F" torch.testing.assert_close( - np.array(Image.fromarray(img_data_float.squeeze(0).numpy(), mode='F')), np.array(img_F_mode) + np.array(Image.fromarray(img_data.squeeze(0).numpy(), mode="F")), np.array(img_F_mode) ) - def test_1_channel_ndarray_to_pil_image(self): - img_data_float = torch.Tensor(4, 4, 1).uniform_().numpy() - img_data_byte = torch.ByteTensor(4, 4, 1).random_(0, 255).numpy() - img_data_short = torch.ShortTensor(4, 4, 1).random_().numpy() - img_data_int = torch.IntTensor(4, 4, 1).random_().numpy() - - inputs = [img_data_float, img_data_byte, img_data_short, img_data_int] - expected_modes = ['F', 'L', 'I;16', 'I'] - for img_data, mode in zip(inputs, expected_modes): - for transform in [transforms.ToPILImage(), transforms.ToPILImage(mode=mode)]: - img = transform(img_data) - self.assertEqual(img.mode, mode) - # note: we explicitly convert img's dtype because pytorch doesn't support uint16 - # and otherwise assert_close wouldn't be able to construct a tensor from the uint16 array - torch.testing.assert_close(img_data[:, :, 0], np.asarray(img).astype(img_data.dtype)) - - def test_2_channel_ndarray_to_pil_image(self): - def verify_img_data(img_data, mode): - if mode is None: - img = transforms.ToPILImage()(img_data) - self.assertEqual(img.mode, 'LA') # default should assume LA - else: - img = transforms.ToPILImage(mode=mode)(img_data) - self.assertEqual(img.mode, mode) - split = img.split() - for i in range(2): - torch.testing.assert_close(img_data[:, :, i], np.asarray(split[i]), check_stride=False) - + @pytest.mark.parametrize("with_mode", [False, True]) + @pytest.mark.parametrize( + "img_data, expected_mode", + [ + (torch.Tensor(4, 4, 1).uniform_().numpy(), "L"), + (torch.ByteTensor(4, 4, 1).random_(0, 255).numpy(), "L"), + (torch.ShortTensor(4, 4, 1).random_().numpy(), "I;16" if sys.byteorder == "little" else "I;16B"), + (torch.IntTensor(4, 4, 1).random_().numpy(), "I"), + ], + ) + def test_1_channel_ndarray_to_pil_image(self, with_mode, img_data, expected_mode): + transform = transforms.ToPILImage(mode=expected_mode) if with_mode else transforms.ToPILImage() + img = transform(img_data) + assert img.mode == expected_mode + if np.issubdtype(img_data.dtype, np.floating): + img_data = (img_data * 255).astype(np.uint8) + # note: we explicitly convert img's dtype because pytorch doesn't support uint16 + # and otherwise assert_close wouldn't be able to construct a tensor from the uint16 array + torch.testing.assert_close(img_data[:, :, 0], np.asarray(img).astype(img_data.dtype)) + + @pytest.mark.parametrize("expected_mode", [None, "LA"]) + def test_2_channel_ndarray_to_pil_image(self, expected_mode): img_data = torch.ByteTensor(4, 4, 2).random_(0, 255).numpy() - for mode in [None, 'LA']: - verify_img_data(img_data, mode) + if expected_mode is None: + img = transforms.ToPILImage()(img_data) + assert img.mode == "LA" # default should assume LA + else: + img = transforms.ToPILImage(mode=expected_mode)(img_data) + assert img.mode == expected_mode + split = img.split() + for i in range(2): + torch.testing.assert_close(img_data[:, :, i], np.asarray(split[i])) + + def test_2_channel_ndarray_to_pil_image_error(self): + img_data = torch.ByteTensor(4, 4, 2).random_(0, 255).numpy() transforms.ToPILImage().__repr__() - with self.assertRaises(ValueError): - # should raise if we try a mode for 4 or 1 or 3 channel images - transforms.ToPILImage(mode='RGBA')(img_data) - transforms.ToPILImage(mode='P')(img_data) - transforms.ToPILImage(mode='RGB')(img_data) - - def test_2_channel_tensor_to_pil_image(self): - def verify_img_data(img_data, expected_output, mode): - if mode is None: - img = transforms.ToPILImage()(img_data) - self.assertEqual(img.mode, 'LA') # default should assume LA - else: - img = transforms.ToPILImage(mode=mode)(img_data) - self.assertEqual(img.mode, mode) - split = img.split() - for i in range(2): - self.assertTrue(np.allclose(expected_output[i].numpy(), F.to_tensor(split[i]).numpy())) + # should raise if we try a mode for 4 or 1 or 3 channel images + with pytest.raises(ValueError, match=r"Only modes \['LA'\] are supported for 2D inputs"): + transforms.ToPILImage(mode="RGBA")(img_data) + with pytest.raises(ValueError, match=r"Only modes \['LA'\] are supported for 2D inputs"): + transforms.ToPILImage(mode="P")(img_data) + with pytest.raises(ValueError, match=r"Only modes \['LA'\] are supported for 2D inputs"): + transforms.ToPILImage(mode="RGB")(img_data) + @pytest.mark.parametrize("expected_mode", [None, "LA"]) + def test_2_channel_tensor_to_pil_image(self, expected_mode): img_data = torch.Tensor(2, 4, 4).uniform_() expected_output = img_data.mul(255).int().float().div(255) - for mode in [None, 'LA']: - verify_img_data(img_data, expected_output, mode=mode) - - with self.assertRaises(ValueError): - # should raise if we try a mode for 4 or 1 or 3 channel images - transforms.ToPILImage(mode='RGBA')(img_data) - transforms.ToPILImage(mode='P')(img_data) - transforms.ToPILImage(mode='RGB')(img_data) - - def test_3_channel_tensor_to_pil_image(self): - def verify_img_data(img_data, expected_output, mode): - if mode is None: - img = transforms.ToPILImage()(img_data) - self.assertEqual(img.mode, 'RGB') # default should assume RGB - else: - img = transforms.ToPILImage(mode=mode)(img_data) - self.assertEqual(img.mode, mode) - split = img.split() - for i in range(3): - self.assertTrue(np.allclose(expected_output[i].numpy(), F.to_tensor(split[i]).numpy())) + if expected_mode is None: + img = transforms.ToPILImage()(img_data) + assert img.mode == "LA" # default should assume LA + else: + img = transforms.ToPILImage(mode=expected_mode)(img_data) + assert img.mode == expected_mode + + split = img.split() + for i in range(2): + torch.testing.assert_close(expected_output[i].numpy(), F.to_tensor(split[i]).squeeze(0).numpy()) + + def test_2_channel_tensor_to_pil_image_error(self): + img_data = torch.Tensor(2, 4, 4).uniform_() + + # should raise if we try a mode for 4 or 1 or 3 channel images + with pytest.raises(ValueError, match=r"Only modes \['LA'\] are supported for 2D inputs"): + transforms.ToPILImage(mode="RGBA")(img_data) + with pytest.raises(ValueError, match=r"Only modes \['LA'\] are supported for 2D inputs"): + transforms.ToPILImage(mode="P")(img_data) + with pytest.raises(ValueError, match=r"Only modes \['LA'\] are supported for 2D inputs"): + transforms.ToPILImage(mode="RGB")(img_data) + + @pytest.mark.parametrize("with_mode", [False, True]) + @pytest.mark.parametrize("img_data, expected_output, expected_mode", _get_2d_tensor_various_types()) + def test_2d_tensor_to_pil_image(self, with_mode, img_data, expected_output, expected_mode): + transform = transforms.ToPILImage(mode=expected_mode) if with_mode else transforms.ToPILImage() + to_tensor = transforms.ToTensor() + img = transform(img_data) + assert img.mode == expected_mode + torch.testing.assert_close(expected_output, to_tensor(img).numpy()[0]) + + @pytest.mark.parametrize("with_mode", [False, True]) + @pytest.mark.parametrize( + "img_data, expected_mode", + [ + (torch.Tensor(4, 4).uniform_().numpy(), "L"), + (torch.ByteTensor(4, 4).random_(0, 255).numpy(), "L"), + (torch.ShortTensor(4, 4).random_().numpy(), "I;16" if sys.byteorder == "little" else "I;16B"), + (torch.IntTensor(4, 4).random_().numpy(), "I"), + ], + ) + def test_2d_ndarray_to_pil_image(self, with_mode, img_data, expected_mode): + transform = transforms.ToPILImage(mode=expected_mode) if with_mode else transforms.ToPILImage() + img = transform(img_data) + assert img.mode == expected_mode + if np.issubdtype(img_data.dtype, np.floating): + img_data = (img_data * 255).astype(np.uint8) + np.testing.assert_allclose(img_data, img) + + @pytest.mark.parametrize("expected_mode", [None, "RGB", "HSV", "YCbCr"]) + def test_3_channel_tensor_to_pil_image(self, expected_mode): img_data = torch.Tensor(3, 4, 4).uniform_() expected_output = img_data.mul(255).int().float().div(255) - for mode in [None, 'RGB', 'HSV', 'YCbCr']: - verify_img_data(img_data, expected_output, mode=mode) - with self.assertRaises(ValueError): - # should raise if we try a mode for 4 or 1 or 2 channel images - transforms.ToPILImage(mode='RGBA')(img_data) - transforms.ToPILImage(mode='P')(img_data) - transforms.ToPILImage(mode='LA')(img_data) - - with self.assertRaises(ValueError): + if expected_mode is None: + img = transforms.ToPILImage()(img_data) + assert img.mode == "RGB" # default should assume RGB + else: + img = transforms.ToPILImage(mode=expected_mode)(img_data) + assert img.mode == expected_mode + split = img.split() + for i in range(3): + torch.testing.assert_close(expected_output[i].numpy(), F.to_tensor(split[i]).squeeze(0).numpy()) + + def test_3_channel_tensor_to_pil_image_error(self): + img_data = torch.Tensor(3, 4, 4).uniform_() + error_message_3d = r"Only modes \['RGB', 'YCbCr', 'HSV'\] are supported for 3D inputs" + # should raise if we try a mode for 4 or 1 or 2 channel images + with pytest.raises(ValueError, match=error_message_3d): + transforms.ToPILImage(mode="RGBA")(img_data) + with pytest.raises(ValueError, match=error_message_3d): + transforms.ToPILImage(mode="P")(img_data) + with pytest.raises(ValueError, match=error_message_3d): + transforms.ToPILImage(mode="LA")(img_data) + + with pytest.raises(ValueError, match=r"pic should be 2/3 dimensional. Got \d+ dimensions."): transforms.ToPILImage()(torch.Tensor(1, 3, 4, 4).uniform_()) - def test_3_channel_ndarray_to_pil_image(self): - def verify_img_data(img_data, mode): - if mode is None: - img = transforms.ToPILImage()(img_data) - self.assertEqual(img.mode, 'RGB') # default should assume RGB - else: - img = transforms.ToPILImage(mode=mode)(img_data) - self.assertEqual(img.mode, mode) - split = img.split() - for i in range(3): - torch.testing.assert_close(img_data[:, :, i], np.asarray(split[i]), check_stride=False) + @pytest.mark.parametrize("expected_mode", [None, "RGB", "HSV", "YCbCr"]) + def test_3_channel_ndarray_to_pil_image(self, expected_mode): + img_data = torch.ByteTensor(4, 4, 3).random_(0, 255).numpy() + if expected_mode is None: + img = transforms.ToPILImage()(img_data) + assert img.mode == "RGB" # default should assume RGB + else: + img = transforms.ToPILImage(mode=expected_mode)(img_data) + assert img.mode == expected_mode + split = img.split() + for i in range(3): + torch.testing.assert_close(img_data[:, :, i], np.asarray(split[i])) + + def test_3_channel_ndarray_to_pil_image_error(self): img_data = torch.ByteTensor(4, 4, 3).random_(0, 255).numpy() - for mode in [None, 'RGB', 'HSV', 'YCbCr']: - verify_img_data(img_data, mode) # Checking if ToPILImage can be printed as string transforms.ToPILImage().__repr__() - with self.assertRaises(ValueError): - # should raise if we try a mode for 4 or 1 or 2 channel images - transforms.ToPILImage(mode='RGBA')(img_data) - transforms.ToPILImage(mode='P')(img_data) - transforms.ToPILImage(mode='LA')(img_data) - - def test_4_channel_tensor_to_pil_image(self): - def verify_img_data(img_data, expected_output, mode): - if mode is None: - img = transforms.ToPILImage()(img_data) - self.assertEqual(img.mode, 'RGBA') # default should assume RGBA - else: - img = transforms.ToPILImage(mode=mode)(img_data) - self.assertEqual(img.mode, mode) - - split = img.split() - for i in range(4): - self.assertTrue(np.allclose(expected_output[i].numpy(), F.to_tensor(split[i]).numpy())) - + error_message_3d = r"Only modes \['RGB', 'YCbCr', 'HSV'\] are supported for 3D inputs" + # should raise if we try a mode for 4 or 1 or 2 channel images + with pytest.raises(ValueError, match=error_message_3d): + transforms.ToPILImage(mode="RGBA")(img_data) + with pytest.raises(ValueError, match=error_message_3d): + transforms.ToPILImage(mode="P")(img_data) + with pytest.raises(ValueError, match=error_message_3d): + transforms.ToPILImage(mode="LA")(img_data) + + @pytest.mark.parametrize("expected_mode", [None, "RGBA", "CMYK", "RGBX"]) + def test_4_channel_tensor_to_pil_image(self, expected_mode): img_data = torch.Tensor(4, 4, 4).uniform_() expected_output = img_data.mul(255).int().float().div(255) - for mode in [None, 'RGBA', 'CMYK', 'RGBX']: - verify_img_data(img_data, expected_output, mode) - - with self.assertRaises(ValueError): - # should raise if we try a mode for 3 or 1 or 2 channel images - transforms.ToPILImage(mode='RGB')(img_data) - transforms.ToPILImage(mode='P')(img_data) - transforms.ToPILImage(mode='LA')(img_data) - - def test_4_channel_ndarray_to_pil_image(self): - def verify_img_data(img_data, mode): - if mode is None: - img = transforms.ToPILImage()(img_data) - self.assertEqual(img.mode, 'RGBA') # default should assume RGBA - else: - img = transforms.ToPILImage(mode=mode)(img_data) - self.assertEqual(img.mode, mode) - split = img.split() - for i in range(4): - torch.testing.assert_close(img_data[:, :, i], np.asarray(split[i]), check_stride=False) - img_data = torch.ByteTensor(4, 4, 4).random_(0, 255).numpy() - for mode in [None, 'RGBA', 'CMYK', 'RGBX']: - verify_img_data(img_data, mode) + if expected_mode is None: + img = transforms.ToPILImage()(img_data) + assert img.mode == "RGBA" # default should assume RGBA + else: + img = transforms.ToPILImage(mode=expected_mode)(img_data) + assert img.mode == expected_mode - with self.assertRaises(ValueError): - # should raise if we try a mode for 3 or 1 or 2 channel images - transforms.ToPILImage(mode='RGB')(img_data) - transforms.ToPILImage(mode='P')(img_data) - transforms.ToPILImage(mode='LA')(img_data) + split = img.split() + for i in range(4): + torch.testing.assert_close(expected_output[i].numpy(), F.to_tensor(split[i]).squeeze(0).numpy()) - def test_2d_tensor_to_pil_image(self): - to_tensor = transforms.ToTensor() + def test_4_channel_tensor_to_pil_image_error(self): + img_data = torch.Tensor(4, 4, 4).uniform_() - img_data_float = torch.Tensor(4, 4).uniform_() - img_data_byte = torch.ByteTensor(4, 4).random_(0, 255) - img_data_short = torch.ShortTensor(4, 4).random_() - img_data_int = torch.IntTensor(4, 4).random_() + error_message_4d = r"Only modes \['RGBA', 'CMYK', 'RGBX'\] are supported for 4D inputs" + # should raise if we try a mode for 3 or 1 or 2 channel images + with pytest.raises(ValueError, match=error_message_4d): + transforms.ToPILImage(mode="RGB")(img_data) + with pytest.raises(ValueError, match=error_message_4d): + transforms.ToPILImage(mode="P")(img_data) + with pytest.raises(ValueError, match=error_message_4d): + transforms.ToPILImage(mode="LA")(img_data) + + @pytest.mark.parametrize("expected_mode", [None, "RGBA", "CMYK", "RGBX"]) + def test_4_channel_ndarray_to_pil_image(self, expected_mode): + img_data = torch.ByteTensor(4, 4, 4).random_(0, 255).numpy() - inputs = [img_data_float, img_data_byte, img_data_short, img_data_int] - expected_outputs = [img_data_float.mul(255).int().float().div(255).numpy(), - img_data_byte.float().div(255.0).numpy(), - img_data_short.numpy(), - img_data_int.numpy()] - expected_modes = ['L', 'L', 'I;16', 'I'] - - for img_data, expected_output, mode in zip(inputs, expected_outputs, expected_modes): - for transform in [transforms.ToPILImage(), transforms.ToPILImage(mode=mode)]: - img = transform(img_data) - self.assertEqual(img.mode, mode) - np.testing.assert_allclose(expected_output, to_tensor(img).numpy()[0]) - - def test_2d_ndarray_to_pil_image(self): - img_data_float = torch.Tensor(4, 4).uniform_().numpy() - img_data_byte = torch.ByteTensor(4, 4).random_(0, 255).numpy() - img_data_short = torch.ShortTensor(4, 4).random_().numpy() - img_data_int = torch.IntTensor(4, 4).random_().numpy() - - inputs = [img_data_float, img_data_byte, img_data_short, img_data_int] - expected_modes = ['F', 'L', 'I;16', 'I'] - for img_data, mode in zip(inputs, expected_modes): - for transform in [transforms.ToPILImage(), transforms.ToPILImage(mode=mode)]: - img = transform(img_data) - self.assertEqual(img.mode, mode) - np.testing.assert_allclose(img_data, img) + if expected_mode is None: + img = transforms.ToPILImage()(img_data) + assert img.mode == "RGBA" # default should assume RGBA + else: + img = transforms.ToPILImage(mode=expected_mode)(img_data) + assert img.mode == expected_mode + split = img.split() + for i in range(4): + torch.testing.assert_close(img_data[:, :, i], np.asarray(split[i])) + + def test_4_channel_ndarray_to_pil_image_error(self): + img_data = torch.ByteTensor(4, 4, 4).random_(0, 255).numpy() - def test_tensor_bad_types_to_pil_image(self): - with self.assertRaisesRegex(ValueError, r'pic should be 2/3 dimensional. Got \d+ dimensions.'): - transforms.ToPILImage()(torch.ones(1, 3, 4, 4)) - with self.assertRaisesRegex(ValueError, r'pic should not have > 4 channels. Got \d+ channels.'): - transforms.ToPILImage()(torch.ones(6, 4, 4)) + error_message_4d = r"Only modes \['RGBA', 'CMYK', 'RGBX'\] are supported for 4D inputs" + # should raise if we try a mode for 3 or 1 or 2 channel images + with pytest.raises(ValueError, match=error_message_4d): + transforms.ToPILImage(mode="RGB")(img_data) + with pytest.raises(ValueError, match=error_message_4d): + transforms.ToPILImage(mode="P")(img_data) + with pytest.raises(ValueError, match=error_message_4d): + transforms.ToPILImage(mode="LA")(img_data) def test_ndarray_bad_types_to_pil_image(self): trans = transforms.ToPILImage() - reg_msg = r'Input type \w+ is not supported' - with self.assertRaisesRegex(TypeError, reg_msg): + reg_msg = r"Input type \w+ is not supported" + with pytest.raises(TypeError, match=reg_msg): trans(np.ones([4, 4, 1], np.int64)) - with self.assertRaisesRegex(TypeError, reg_msg): + with pytest.raises(TypeError, match=reg_msg): trans(np.ones([4, 4, 1], np.uint16)) - with self.assertRaisesRegex(TypeError, reg_msg): + with pytest.raises(TypeError, match=reg_msg): trans(np.ones([4, 4, 1], np.uint32)) - with self.assertRaisesRegex(TypeError, reg_msg): - trans(np.ones([4, 4, 1], np.float64)) - with self.assertRaisesRegex(ValueError, r'pic should be 2/3 dimensional. Got \d+ dimensions.'): + with pytest.raises(ValueError, match=r"pic should be 2/3 dimensional. Got \d+ dimensions."): transforms.ToPILImage()(np.ones([1, 4, 4, 3])) - with self.assertRaisesRegex(ValueError, r'pic should not have > 4 channels. Got \d+ channels.'): + with pytest.raises(ValueError, match=r"pic should not have > 4 channels. Got \d+ channels."): transforms.ToPILImage()(np.ones([4, 4, 6])) - @unittest.skipIf(stats is None, 'scipy.stats not available') - def test_random_vertical_flip(self): - random_state = random.getstate() - random.seed(42) - img = transforms.ToPILImage()(torch.rand(3, 10, 10)) - vimg = img.transpose(Image.FLIP_TOP_BOTTOM) - - num_samples = 250 - num_vertical = 0 - for _ in range(num_samples): - out = transforms.RandomVerticalFlip()(img) - if out == vimg: - num_vertical += 1 - - p_value = stats.binom_test(num_vertical, num_samples, p=0.5) - random.setstate(random_state) - self.assertGreater(p_value, 0.0001) - - num_samples = 250 - num_vertical = 0 - for _ in range(num_samples): - out = transforms.RandomVerticalFlip(p=0.7)(img) - if out == vimg: - num_vertical += 1 - - p_value = stats.binom_test(num_vertical, num_samples, p=0.7) - random.setstate(random_state) - self.assertGreater(p_value, 0.0001) - - # Checking if RandomVerticalFlip can be printed as string - transforms.RandomVerticalFlip().__repr__() - - @unittest.skipIf(stats is None, 'scipy.stats not available') - def test_random_horizontal_flip(self): - random_state = random.getstate() - random.seed(42) - img = transforms.ToPILImage()(torch.rand(3, 10, 10)) - himg = img.transpose(Image.FLIP_LEFT_RIGHT) - - num_samples = 250 - num_horizontal = 0 - for _ in range(num_samples): - out = transforms.RandomHorizontalFlip()(img) - if out == himg: - num_horizontal += 1 - - p_value = stats.binom_test(num_horizontal, num_samples, p=0.5) - random.setstate(random_state) - self.assertGreater(p_value, 0.0001) - - num_samples = 250 - num_horizontal = 0 - for _ in range(num_samples): - out = transforms.RandomHorizontalFlip(p=0.7)(img) - if out == himg: - num_horizontal += 1 - - p_value = stats.binom_test(num_horizontal, num_samples, p=0.7) - random.setstate(random_state) - self.assertGreater(p_value, 0.0001) - - # Checking if RandomHorizontalFlip can be printed as string - transforms.RandomHorizontalFlip().__repr__() - - @unittest.skipIf(stats is None, 'scipy.stats is not available') - def test_normalize(self): - def samples_from_standard_normal(tensor): - p_value = stats.kstest(list(tensor.view(-1)), 'norm', args=(0, 1)).pvalue - return p_value > 0.0001 - - random_state = random.getstate() - random.seed(42) - for channels in [1, 3]: - img = torch.rand(channels, 10, 10) - mean = [img[c].mean() for c in range(channels)] - std = [img[c].std() for c in range(channels)] - normalized = transforms.Normalize(mean, std)(img) - self.assertTrue(samples_from_standard_normal(normalized)) - random.setstate(random_state) - - # Checking if Normalize can be printed as string - transforms.Normalize(mean, std).__repr__() - - # Checking the optional in-place behaviour - tensor = torch.rand((1, 16, 16)) - tensor_inplace = transforms.Normalize((0.5,), (0.5,), inplace=True)(tensor) - assert_equal(tensor, tensor_inplace) - - def test_normalize_different_dtype(self): - for dtype1 in [torch.float32, torch.float64]: - img = torch.rand(3, 10, 10, dtype=dtype1) - for dtype2 in [torch.int64, torch.float32, torch.float64]: - mean = torch.tensor([1, 2, 3], dtype=dtype2) - std = torch.tensor([1, 2, 1], dtype=dtype2) - # checks that it doesn't crash - transforms.functional.normalize(img, mean, std) - - def test_normalize_3d_tensor(self): - torch.manual_seed(28) - n_channels = 3 - img_size = 10 - mean = torch.rand(n_channels) - std = torch.rand(n_channels) - img = torch.rand(n_channels, img_size, img_size) - target = F.normalize(img, mean, std) - - mean_unsqueezed = mean.view(-1, 1, 1) - std_unsqueezed = std.view(-1, 1, 1) - result1 = F.normalize(img, mean_unsqueezed, std_unsqueezed) - result2 = F.normalize(img, - mean_unsqueezed.repeat(1, img_size, img_size), - std_unsqueezed.repeat(1, img_size, img_size)) - torch.testing.assert_close(target, result1) - torch.testing.assert_close(target, result2) - - def test_adjust_brightness(self): - x_shape = [2, 2, 3] - x_data = [0, 5, 13, 54, 135, 226, 37, 8, 234, 90, 255, 1] - x_np = np.array(x_data, dtype=np.uint8).reshape(x_shape) - x_pil = Image.fromarray(x_np, mode='RGB') - - # test 0 - y_pil = F.adjust_brightness(x_pil, 1) - y_np = np.array(y_pil) - torch.testing.assert_close(y_np, x_np) - - # test 1 - y_pil = F.adjust_brightness(x_pil, 0.5) - y_np = np.array(y_pil) - y_ans = [0, 2, 6, 27, 67, 113, 18, 4, 117, 45, 127, 0] - y_ans = np.array(y_ans, dtype=np.uint8).reshape(x_shape) - torch.testing.assert_close(y_np, y_ans) - - # test 2 - y_pil = F.adjust_brightness(x_pil, 2) - y_np = np.array(y_pil) - y_ans = [0, 10, 26, 108, 255, 255, 74, 16, 255, 180, 255, 2] - y_ans = np.array(y_ans, dtype=np.uint8).reshape(x_shape) - torch.testing.assert_close(y_np, y_ans) - - def test_adjust_contrast(self): - x_shape = [2, 2, 3] - x_data = [0, 5, 13, 54, 135, 226, 37, 8, 234, 90, 255, 1] - x_np = np.array(x_data, dtype=np.uint8).reshape(x_shape) - x_pil = Image.fromarray(x_np, mode='RGB') - - # test 0 - y_pil = F.adjust_contrast(x_pil, 1) - y_np = np.array(y_pil) - torch.testing.assert_close(y_np, x_np) - - # test 1 - y_pil = F.adjust_contrast(x_pil, 0.5) - y_np = np.array(y_pil) - y_ans = [43, 45, 49, 70, 110, 156, 61, 47, 160, 88, 170, 43] - y_ans = np.array(y_ans, dtype=np.uint8).reshape(x_shape) - torch.testing.assert_close(y_np, y_ans) - - # test 2 - y_pil = F.adjust_contrast(x_pil, 2) - y_np = np.array(y_pil) - y_ans = [0, 0, 0, 22, 184, 255, 0, 0, 255, 94, 255, 0] - y_ans = np.array(y_ans, dtype=np.uint8).reshape(x_shape) - torch.testing.assert_close(y_np, y_ans) - - @unittest.skipIf(Image.__version__ >= '7', "Temporarily disabled") - def test_adjust_saturation(self): - x_shape = [2, 2, 3] - x_data = [0, 5, 13, 54, 135, 226, 37, 8, 234, 90, 255, 1] - x_np = np.array(x_data, dtype=np.uint8).reshape(x_shape) - x_pil = Image.fromarray(x_np, mode='RGB') - - # test 0 - y_pil = F.adjust_saturation(x_pil, 1) - y_np = np.array(y_pil) - torch.testing.assert_close(y_np, x_np) - - # test 1 - y_pil = F.adjust_saturation(x_pil, 0.5) - y_np = np.array(y_pil) - y_ans = [2, 4, 8, 87, 128, 173, 39, 25, 138, 133, 215, 88] - y_ans = np.array(y_ans, dtype=np.uint8).reshape(x_shape) - torch.testing.assert_close(y_np, y_ans) - - # test 2 - y_pil = F.adjust_saturation(x_pil, 2) - y_np = np.array(y_pil) - y_ans = [0, 6, 22, 0, 149, 255, 32, 0, 255, 4, 255, 0] - y_ans = np.array(y_ans, dtype=np.uint8).reshape(x_shape) - torch.testing.assert_close(y_np, y_ans) - - def test_adjust_hue(self): - x_shape = [2, 2, 3] - x_data = [0, 5, 13, 54, 135, 226, 37, 8, 234, 90, 255, 1] - x_np = np.array(x_data, dtype=np.uint8).reshape(x_shape) - x_pil = Image.fromarray(x_np, mode='RGB') - - with self.assertRaises(ValueError): - F.adjust_hue(x_pil, -0.7) - F.adjust_hue(x_pil, 1) - - # test 0: almost same as x_data but not exact. - # probably because hsv <-> rgb floating point ops - y_pil = F.adjust_hue(x_pil, 0) - y_np = np.array(y_pil) - y_ans = [0, 5, 13, 54, 139, 226, 35, 8, 234, 91, 255, 1] - y_ans = np.array(y_ans, dtype=np.uint8).reshape(x_shape) - torch.testing.assert_close(y_np, y_ans) - - # test 1 - y_pil = F.adjust_hue(x_pil, 0.25) - y_np = np.array(y_pil) - y_ans = [13, 0, 12, 224, 54, 226, 234, 8, 99, 1, 222, 255] - y_ans = np.array(y_ans, dtype=np.uint8).reshape(x_shape) - torch.testing.assert_close(y_np, y_ans) - - # test 2 - y_pil = F.adjust_hue(x_pil, -0.25) - y_np = np.array(y_pil) - y_ans = [0, 13, 2, 54, 226, 58, 8, 234, 152, 255, 43, 1] - y_ans = np.array(y_ans, dtype=np.uint8).reshape(x_shape) - torch.testing.assert_close(y_np, y_ans) - - def test_adjust_sharpness(self): - x_shape = [4, 4, 3] - x_data = [75, 121, 114, 105, 97, 107, 105, 32, 66, 111, 117, 114, 99, 104, 97, 0, - 0, 65, 108, 101, 120, 97, 110, 100, 101, 114, 32, 86, 114, 121, 110, 105, - 111, 116, 105, 115, 0, 0, 73, 32, 108, 111, 118, 101, 32, 121, 111, 117] - x_np = np.array(x_data, dtype=np.uint8).reshape(x_shape) - x_pil = Image.fromarray(x_np, mode='RGB') - - # test 0 - y_pil = F.adjust_sharpness(x_pil, 1) - y_np = np.array(y_pil) - torch.testing.assert_close(y_np, x_np) - - # test 1 - y_pil = F.adjust_sharpness(x_pil, 0.5) - y_np = np.array(y_pil) - y_ans = [75, 121, 114, 105, 97, 107, 105, 32, 66, 111, 117, 114, 99, 104, 97, 30, - 30, 74, 103, 96, 114, 97, 110, 100, 101, 114, 32, 81, 103, 108, 102, 101, - 107, 116, 105, 115, 0, 0, 73, 32, 108, 111, 118, 101, 32, 121, 111, 117] - y_ans = np.array(y_ans, dtype=np.uint8).reshape(x_shape) - torch.testing.assert_close(y_np, y_ans) - - # test 2 - y_pil = F.adjust_sharpness(x_pil, 2) - y_np = np.array(y_pil) - y_ans = [75, 121, 114, 105, 97, 107, 105, 32, 66, 111, 117, 114, 99, 104, 97, 0, - 0, 46, 118, 111, 132, 97, 110, 100, 101, 114, 32, 95, 135, 146, 126, 112, - 119, 116, 105, 115, 0, 0, 73, 32, 108, 111, 118, 101, 32, 121, 111, 117] - y_ans = np.array(y_ans, dtype=np.uint8).reshape(x_shape) - torch.testing.assert_close(y_np, y_ans) - - # test 3 - x_shape = [2, 2, 3] - x_data = [0, 5, 13, 54, 135, 226, 37, 8, 234, 90, 255, 1] - x_np = np.array(x_data, dtype=np.uint8).reshape(x_shape) - x_pil = Image.fromarray(x_np, mode='RGB') - x_th = torch.tensor(x_np.transpose(2, 0, 1)) - y_pil = F.adjust_sharpness(x_pil, 2) - y_np = np.array(y_pil).transpose(2, 0, 1) - y_th = F.adjust_sharpness(x_th, 2) - torch.testing.assert_close(y_np, y_th.numpy()) - - def test_adjust_gamma(self): - x_shape = [2, 2, 3] - x_data = [0, 5, 13, 54, 135, 226, 37, 8, 234, 90, 255, 1] - x_np = np.array(x_data, dtype=np.uint8).reshape(x_shape) - x_pil = Image.fromarray(x_np, mode='RGB') - - # test 0 - y_pil = F.adjust_gamma(x_pil, 1) - y_np = np.array(y_pil) - torch.testing.assert_close(y_np, x_np) - - # test 1 - y_pil = F.adjust_gamma(x_pil, 0.5) - y_np = np.array(y_pil) - y_ans = [0, 35, 57, 117, 186, 241, 97, 45, 245, 152, 255, 16] - y_ans = np.array(y_ans, dtype=np.uint8).reshape(x_shape) - torch.testing.assert_close(y_np, y_ans) - - # test 2 - y_pil = F.adjust_gamma(x_pil, 2) - y_np = np.array(y_pil) - y_ans = [0, 0, 0, 11, 71, 201, 5, 0, 215, 31, 255, 0] - y_ans = np.array(y_ans, dtype=np.uint8).reshape(x_shape) - torch.testing.assert_close(y_np, y_ans) - - def test_adjusts_L_mode(self): - x_shape = [2, 2, 3] - x_data = [0, 5, 13, 54, 135, 226, 37, 8, 234, 90, 255, 1] - x_np = np.array(x_data, dtype=np.uint8).reshape(x_shape) - x_rgb = Image.fromarray(x_np, mode='RGB') - - x_l = x_rgb.convert('L') - self.assertEqual(F.adjust_brightness(x_l, 2).mode, 'L') - self.assertEqual(F.adjust_saturation(x_l, 2).mode, 'L') - self.assertEqual(F.adjust_contrast(x_l, 2).mode, 'L') - self.assertEqual(F.adjust_hue(x_l, 0.4).mode, 'L') - self.assertEqual(F.adjust_sharpness(x_l, 2).mode, 'L') - self.assertEqual(F.adjust_gamma(x_l, 0.5).mode, 'L') - - def test_color_jitter(self): - color_jitter = transforms.ColorJitter(2, 2, 2, 0.1) - - x_shape = [2, 2, 3] - x_data = [0, 5, 13, 54, 135, 226, 37, 8, 234, 90, 255, 1] - x_np = np.array(x_data, dtype=np.uint8).reshape(x_shape) - x_pil = Image.fromarray(x_np, mode='RGB') - x_pil_2 = x_pil.convert('L') - - for i in range(10): - y_pil = color_jitter(x_pil) - self.assertEqual(y_pil.mode, x_pil.mode) - - y_pil_2 = color_jitter(x_pil_2) - self.assertEqual(y_pil_2.mode, x_pil_2.mode) - - # Checking if ColorJitter can be printed as string - color_jitter.__repr__() - - def test_linear_transformation(self): - num_samples = 1000 - x = torch.randn(num_samples, 3, 10, 10) - flat_x = x.view(x.size(0), x.size(1) * x.size(2) * x.size(3)) - # compute principal components - sigma = torch.mm(flat_x.t(), flat_x) / flat_x.size(0) - u, s, _ = np.linalg.svd(sigma.numpy()) - zca_epsilon = 1e-10 # avoid division by 0 - d = torch.Tensor(np.diag(1. / np.sqrt(s + zca_epsilon))) - u = torch.Tensor(u) - principal_components = torch.mm(torch.mm(u, d), u.t()) - mean_vector = (torch.sum(flat_x, dim=0) / flat_x.size(0)) - # initialize whitening matrix - whitening = transforms.LinearTransformation(principal_components, mean_vector) - # estimate covariance and mean using weak law of large number - num_features = flat_x.size(1) - cov = 0.0 - mean = 0.0 - for i in x: - xwhite = whitening(i) - xwhite = xwhite.view(1, -1).numpy() - cov += np.dot(xwhite, xwhite.T) / num_features - mean += np.sum(xwhite) / num_features - # if rtol for std = 1e-3 then rtol for cov = 2e-3 as std**2 = cov - torch.testing.assert_close(cov / num_samples, np.identity(1), rtol=2e-3, atol=1e-8, check_dtype=False, - msg="cov not close to 1") - torch.testing.assert_close(mean / num_samples, 0, rtol=1e-3, atol=1e-8, check_dtype=False, - msg="mean not close to 0") - - # Checking if LinearTransformation can be printed as string - whitening.__repr__() - - def test_rotate(self): - x = np.zeros((100, 100, 3), dtype=np.uint8) - x[40, 40] = [255, 255, 255] - - with self.assertRaisesRegex(TypeError, r"img should be PIL Image"): - F.rotate(x, 10) - - img = F.to_pil_image(x) - - result = F.rotate(img, 45) - self.assertEqual(result.size, (100, 100)) - r, c, ch = np.where(result) - self.assertTrue(all(x in r for x in [49, 50])) - self.assertTrue(all(x in c for x in [36])) - self.assertTrue(all(x in ch for x in [0, 1, 2])) - - result = F.rotate(img, 45, expand=True) - self.assertEqual(result.size, (142, 142)) - r, c, ch = np.where(result) - self.assertTrue(all(x in r for x in [70, 71])) - self.assertTrue(all(x in c for x in [57])) - self.assertTrue(all(x in ch for x in [0, 1, 2])) - - result = F.rotate(img, 45, center=(40, 40)) - self.assertEqual(result.size, (100, 100)) - r, c, ch = np.where(result) - self.assertTrue(all(x in r for x in [40])) - self.assertTrue(all(x in c for x in [40])) - self.assertTrue(all(x in ch for x in [0, 1, 2])) - - result_a = F.rotate(img, 90) - result_b = F.rotate(img, -270) - - assert_equal(np.array(result_a), np.array(result_b)) - - def test_rotate_fill(self): - img = F.to_pil_image(np.ones((100, 100, 3), dtype=np.uint8) * 255, "RGB") - - modes = ("L", "RGB", "F") - nums_bands = [len(mode) for mode in modes] - fill = 127 - - for mode, num_bands in zip(modes, nums_bands): - img_conv = img.convert(mode) - img_rot = F.rotate(img_conv, 45.0, fill=fill) - pixel = img_rot.getpixel((0, 0)) - - if not isinstance(pixel, tuple): - pixel = (pixel,) - self.assertTupleEqual(pixel, tuple([fill] * num_bands)) - - for wrong_num_bands in set(nums_bands) - {num_bands}: - with self.assertRaises(ValueError): - F.rotate(img_conv, 45.0, fill=tuple([fill] * wrong_num_bands)) - - def test_affine(self): + def test_tensor_bad_types_to_pil_image(self): + with pytest.raises(ValueError, match=r"pic should be 2/3 dimensional. Got \d+ dimensions."): + transforms.ToPILImage()(torch.ones(1, 3, 4, 4)) + with pytest.raises(ValueError, match=r"pic should not have > 4 channels. Got \d+ channels."): + transforms.ToPILImage()(torch.ones(6, 4, 4)) + + +def test_adjust_brightness(): + x_shape = [2, 2, 3] + x_data = [0, 5, 13, 54, 135, 226, 37, 8, 234, 90, 255, 1] + x_np = np.array(x_data, dtype=np.uint8).reshape(x_shape) + x_pil = Image.fromarray(x_np, mode="RGB") + + # test 0 + y_pil = F.adjust_brightness(x_pil, 1) + y_np = np.array(y_pil) + torch.testing.assert_close(y_np, x_np) + + # test 1 + y_pil = F.adjust_brightness(x_pil, 0.5) + y_np = np.array(y_pil) + y_ans = [0, 2, 6, 27, 67, 113, 18, 4, 117, 45, 127, 0] + y_ans = np.array(y_ans, dtype=np.uint8).reshape(x_shape) + torch.testing.assert_close(y_np, y_ans) + + # test 2 + y_pil = F.adjust_brightness(x_pil, 2) + y_np = np.array(y_pil) + y_ans = [0, 10, 26, 108, 255, 255, 74, 16, 255, 180, 255, 2] + y_ans = np.array(y_ans, dtype=np.uint8).reshape(x_shape) + torch.testing.assert_close(y_np, y_ans) + + +def test_adjust_contrast(): + x_shape = [2, 2, 3] + x_data = [0, 5, 13, 54, 135, 226, 37, 8, 234, 90, 255, 1] + x_np = np.array(x_data, dtype=np.uint8).reshape(x_shape) + x_pil = Image.fromarray(x_np, mode="RGB") + + # test 0 + y_pil = F.adjust_contrast(x_pil, 1) + y_np = np.array(y_pil) + torch.testing.assert_close(y_np, x_np) + + # test 1 + y_pil = F.adjust_contrast(x_pil, 0.5) + y_np = np.array(y_pil) + y_ans = [43, 45, 49, 70, 110, 156, 61, 47, 160, 88, 170, 43] + y_ans = np.array(y_ans, dtype=np.uint8).reshape(x_shape) + torch.testing.assert_close(y_np, y_ans) + + # test 2 + y_pil = F.adjust_contrast(x_pil, 2) + y_np = np.array(y_pil) + y_ans = [0, 0, 0, 22, 184, 255, 0, 0, 255, 94, 255, 0] + y_ans = np.array(y_ans, dtype=np.uint8).reshape(x_shape) + torch.testing.assert_close(y_np, y_ans) + + +def test_adjust_hue(): + x_shape = [2, 2, 3] + x_data = [0, 5, 13, 54, 135, 226, 37, 8, 234, 90, 255, 1] + x_np = np.array(x_data, dtype=np.uint8).reshape(x_shape) + x_pil = Image.fromarray(x_np, mode="RGB") + + with pytest.raises(ValueError): + F.adjust_hue(x_pil, -0.7) + F.adjust_hue(x_pil, 1) + + # test 0: almost same as x_data but not exact. + # probably because hsv <-> rgb floating point ops + y_pil = F.adjust_hue(x_pil, 0) + y_np = np.array(y_pil) + y_ans = [0, 5, 13, 54, 139, 226, 35, 8, 234, 91, 255, 1] + y_ans = np.array(y_ans, dtype=np.uint8).reshape(x_shape) + torch.testing.assert_close(y_np, y_ans) + + # test 1 + y_pil = F.adjust_hue(x_pil, 0.25) + y_np = np.array(y_pil) + y_ans = [13, 0, 12, 224, 54, 226, 234, 8, 99, 1, 222, 255] + y_ans = np.array(y_ans, dtype=np.uint8).reshape(x_shape) + torch.testing.assert_close(y_np, y_ans) + + # test 2 + y_pil = F.adjust_hue(x_pil, -0.25) + y_np = np.array(y_pil) + y_ans = [0, 13, 2, 54, 226, 58, 8, 234, 152, 255, 43, 1] + y_ans = np.array(y_ans, dtype=np.uint8).reshape(x_shape) + torch.testing.assert_close(y_np, y_ans) + + +def test_adjust_sharpness(): + x_shape = [4, 4, 3] + x_data = [ + 75, + 121, + 114, + 105, + 97, + 107, + 105, + 32, + 66, + 111, + 117, + 114, + 99, + 104, + 97, + 0, + 0, + 65, + 108, + 101, + 120, + 97, + 110, + 100, + 101, + 114, + 32, + 86, + 114, + 121, + 110, + 105, + 111, + 116, + 105, + 115, + 0, + 0, + 73, + 32, + 108, + 111, + 118, + 101, + 32, + 121, + 111, + 117, + ] + x_np = np.array(x_data, dtype=np.uint8).reshape(x_shape) + x_pil = Image.fromarray(x_np, mode="RGB") + + # test 0 + y_pil = F.adjust_sharpness(x_pil, 1) + y_np = np.array(y_pil) + torch.testing.assert_close(y_np, x_np) + + # test 1 + y_pil = F.adjust_sharpness(x_pil, 0.5) + y_np = np.array(y_pil) + y_ans = [ + 75, + 121, + 114, + 105, + 97, + 107, + 105, + 32, + 66, + 111, + 117, + 114, + 99, + 104, + 97, + 30, + 30, + 74, + 103, + 96, + 114, + 97, + 110, + 100, + 101, + 114, + 32, + 81, + 103, + 108, + 102, + 101, + 107, + 116, + 105, + 115, + 0, + 0, + 73, + 32, + 108, + 111, + 118, + 101, + 32, + 121, + 111, + 117, + ] + y_ans = np.array(y_ans, dtype=np.uint8).reshape(x_shape) + torch.testing.assert_close(y_np, y_ans) + + # test 2 + y_pil = F.adjust_sharpness(x_pil, 2) + y_np = np.array(y_pil) + y_ans = [ + 75, + 121, + 114, + 105, + 97, + 107, + 105, + 32, + 66, + 111, + 117, + 114, + 99, + 104, + 97, + 0, + 0, + 46, + 118, + 111, + 132, + 97, + 110, + 100, + 101, + 114, + 32, + 95, + 135, + 146, + 126, + 112, + 119, + 116, + 105, + 115, + 0, + 0, + 73, + 32, + 108, + 111, + 118, + 101, + 32, + 121, + 111, + 117, + ] + y_ans = np.array(y_ans, dtype=np.uint8).reshape(x_shape) + torch.testing.assert_close(y_np, y_ans) + + # test 3 + x_shape = [2, 2, 3] + x_data = [0, 5, 13, 54, 135, 226, 37, 8, 234, 90, 255, 1] + x_np = np.array(x_data, dtype=np.uint8).reshape(x_shape) + x_pil = Image.fromarray(x_np, mode="RGB") + x_th = torch.tensor(x_np.transpose(2, 0, 1)) + y_pil = F.adjust_sharpness(x_pil, 2) + y_np = np.array(y_pil).transpose(2, 0, 1) + y_th = F.adjust_sharpness(x_th, 2) + torch.testing.assert_close(y_np, y_th.numpy()) + + +def test_adjust_gamma(): + x_shape = [2, 2, 3] + x_data = [0, 5, 13, 54, 135, 226, 37, 8, 234, 90, 255, 1] + x_np = np.array(x_data, dtype=np.uint8).reshape(x_shape) + x_pil = Image.fromarray(x_np, mode="RGB") + + # test 0 + y_pil = F.adjust_gamma(x_pil, 1) + y_np = np.array(y_pil) + torch.testing.assert_close(y_np, x_np) + + # test 1 + y_pil = F.adjust_gamma(x_pil, 0.5) + y_np = np.array(y_pil) + y_ans = [0, 35, 57, 117, 186, 241, 97, 45, 245, 152, 255, 16] + y_ans = np.array(y_ans, dtype=np.uint8).reshape(x_shape) + torch.testing.assert_close(y_np, y_ans) + + # test 2 + y_pil = F.adjust_gamma(x_pil, 2) + y_np = np.array(y_pil) + y_ans = [0, 0, 0, 11, 71, 201, 5, 0, 215, 31, 255, 0] + y_ans = np.array(y_ans, dtype=np.uint8).reshape(x_shape) + torch.testing.assert_close(y_np, y_ans) + + +def test_adjusts_L_mode(): + x_shape = [2, 2, 3] + x_data = [0, 5, 13, 54, 135, 226, 37, 8, 234, 90, 255, 1] + x_np = np.array(x_data, dtype=np.uint8).reshape(x_shape) + x_rgb = Image.fromarray(x_np, mode="RGB") + + x_l = x_rgb.convert("L") + assert F.adjust_brightness(x_l, 2).mode == "L" + assert F.adjust_saturation(x_l, 2).mode == "L" + assert F.adjust_contrast(x_l, 2).mode == "L" + assert F.adjust_hue(x_l, 0.4).mode == "L" + assert F.adjust_sharpness(x_l, 2).mode == "L" + assert F.adjust_gamma(x_l, 0.5).mode == "L" + + +def test_rotate(): + x = np.zeros((100, 100, 3), dtype=np.uint8) + x[40, 40] = [255, 255, 255] + + with pytest.raises(TypeError, match=r"img should be PIL Image"): + F.rotate(x, 10) + + img = F.to_pil_image(x) + + result = F.rotate(img, 45) + assert result.size == (100, 100) + r, c, ch = np.where(result) + assert all(x in r for x in [49, 50]) + assert all(x in c for x in [36]) + assert all(x in ch for x in [0, 1, 2]) + + result = F.rotate(img, 45, expand=True) + assert result.size == (142, 142) + r, c, ch = np.where(result) + assert all(x in r for x in [70, 71]) + assert all(x in c for x in [57]) + assert all(x in ch for x in [0, 1, 2]) + + result = F.rotate(img, 45, center=(40, 40)) + assert result.size == (100, 100) + r, c, ch = np.where(result) + assert all(x in r for x in [40]) + assert all(x in c for x in [40]) + assert all(x in ch for x in [0, 1, 2]) + + result_a = F.rotate(img, 90) + result_b = F.rotate(img, -270) + + assert_equal(np.array(result_a), np.array(result_b)) + + +@pytest.mark.parametrize("mode", ["L", "RGB", "F"]) +def test_rotate_fill(mode): + img = F.to_pil_image(np.ones((100, 100, 3), dtype=np.uint8) * 255, "RGB") + + num_bands = len(mode) + wrong_num_bands = num_bands + 1 + fill = 127 + + img_conv = img.convert(mode) + img_rot = F.rotate(img_conv, 45.0, fill=fill) + pixel = img_rot.getpixel((0, 0)) + + if not isinstance(pixel, tuple): + pixel = (pixel,) + assert pixel == tuple([fill] * num_bands) + + with pytest.raises(ValueError): + F.rotate(img_conv, 45.0, fill=tuple([fill] * wrong_num_bands)) + + +def test_gaussian_blur_asserts(): + np_img = np.ones((100, 100, 3), dtype=np.uint8) * 255 + img = F.to_pil_image(np_img, "RGB") + + with pytest.raises(ValueError, match=r"If kernel_size is a sequence its length should be 2"): + F.gaussian_blur(img, [3]) + with pytest.raises(ValueError, match=r"If kernel_size is a sequence its length should be 2"): + F.gaussian_blur(img, [3, 3, 3]) + with pytest.raises(ValueError, match=r"Kernel size should be a tuple/list of two integers"): + transforms.GaussianBlur([3, 3, 3]) + + with pytest.raises(ValueError, match=r"kernel_size should have odd and positive integers"): + F.gaussian_blur(img, [4, 4]) + with pytest.raises(ValueError, match=r"Kernel size value should be an odd and positive number"): + transforms.GaussianBlur([4, 4]) + + with pytest.raises(ValueError, match=r"kernel_size should have odd and positive integers"): + F.gaussian_blur(img, [-3, -3]) + with pytest.raises(ValueError, match=r"Kernel size value should be an odd and positive number"): + transforms.GaussianBlur([-3, -3]) + + with pytest.raises(ValueError, match=r"If sigma is a sequence, its length should be 2"): + F.gaussian_blur(img, 3, [1, 1, 1]) + with pytest.raises(ValueError, match=r"sigma should be a single number or a list/tuple with length 2"): + transforms.GaussianBlur(3, [1, 1, 1]) + + with pytest.raises(ValueError, match=r"sigma should have positive values"): + F.gaussian_blur(img, 3, -1.0) + with pytest.raises(ValueError, match=r"If sigma is a single number, it must be positive"): + transforms.GaussianBlur(3, -1.0) + + with pytest.raises(TypeError, match=r"kernel_size should be int or a sequence of integers"): + F.gaussian_blur(img, "kernel_size_string") + with pytest.raises(ValueError, match=r"Kernel size should be a tuple/list of two integers"): + transforms.GaussianBlur("kernel_size_string") + + with pytest.raises(TypeError, match=r"sigma should be either float or sequence of floats"): + F.gaussian_blur(img, 3, "sigma_string") + with pytest.raises(ValueError, match=r"sigma should be a single number or a list/tuple with length 2"): + transforms.GaussianBlur(3, "sigma_string") + + +def test_lambda(): + trans = transforms.Lambda(lambda x: x.add(10)) + x = torch.randn(10) + y = trans(x) + assert_equal(y, torch.add(x, 10)) + + trans = transforms.Lambda(lambda x: x.add_(10)) + x = torch.randn(10) + y = trans(x) + assert_equal(y, x) + + # Checking if Lambda can be printed as string + trans.__repr__() + + +def test_to_grayscale(): + """Unit tests for grayscale transform""" + + x_shape = [2, 2, 3] + x_data = [0, 5, 13, 54, 135, 226, 37, 8, 234, 90, 255, 1] + x_np = np.array(x_data, dtype=np.uint8).reshape(x_shape) + x_pil = Image.fromarray(x_np, mode="RGB") + x_pil_2 = x_pil.convert("L") + gray_np = np.array(x_pil_2) + + # Test Set: Grayscale an image with desired number of output channels + # Case 1: RGB -> 1 channel grayscale + trans1 = transforms.Grayscale(num_output_channels=1) + gray_pil_1 = trans1(x_pil) + gray_np_1 = np.array(gray_pil_1) + assert gray_pil_1.mode == "L", "mode should be L" + assert gray_np_1.shape == tuple(x_shape[0:2]), "should be 1 channel" + assert_equal(gray_np, gray_np_1) + + # Case 2: RGB -> 3 channel grayscale + trans2 = transforms.Grayscale(num_output_channels=3) + gray_pil_2 = trans2(x_pil) + gray_np_2 = np.array(gray_pil_2) + assert gray_pil_2.mode == "RGB", "mode should be RGB" + assert gray_np_2.shape == tuple(x_shape), "should be 3 channel" + assert_equal(gray_np_2[:, :, 0], gray_np_2[:, :, 1]) + assert_equal(gray_np_2[:, :, 1], gray_np_2[:, :, 2]) + assert_equal(gray_np, gray_np_2[:, :, 0]) + + # Case 3: 1 channel grayscale -> 1 channel grayscale + trans3 = transforms.Grayscale(num_output_channels=1) + gray_pil_3 = trans3(x_pil_2) + gray_np_3 = np.array(gray_pil_3) + assert gray_pil_3.mode == "L", "mode should be L" + assert gray_np_3.shape == tuple(x_shape[0:2]), "should be 1 channel" + assert_equal(gray_np, gray_np_3) + + # Case 4: 1 channel grayscale -> 3 channel grayscale + trans4 = transforms.Grayscale(num_output_channels=3) + gray_pil_4 = trans4(x_pil_2) + gray_np_4 = np.array(gray_pil_4) + assert gray_pil_4.mode == "RGB", "mode should be RGB" + assert gray_np_4.shape == tuple(x_shape), "should be 3 channel" + assert_equal(gray_np_4[:, :, 0], gray_np_4[:, :, 1]) + assert_equal(gray_np_4[:, :, 1], gray_np_4[:, :, 2]) + assert_equal(gray_np, gray_np_4[:, :, 0]) + + # Checking if Grayscale can be printed as string + trans4.__repr__() + + +@pytest.mark.parametrize("seed", range(10)) +@pytest.mark.parametrize("p", (0, 1)) +def test_random_apply(p, seed): + torch.manual_seed(seed) + random_apply_transform = transforms.RandomApply([transforms.RandomRotation((45, 50))], p=p) + img = transforms.ToPILImage()(torch.rand(3, 30, 40)) + out = random_apply_transform(img) + if p == 0: + assert out == img + elif p == 1: + assert out != img + + # Checking if RandomApply can be printed as string + random_apply_transform.__repr__() + + +@pytest.mark.parametrize("seed", range(10)) +@pytest.mark.parametrize("proba_passthrough", (0, 1)) +def test_random_choice(proba_passthrough, seed): + random.seed(seed) # RandomChoice relies on python builtin random.choice, not pytorch + + random_choice_transform = transforms.RandomChoice( + [ + lambda x: x, # passthrough + transforms.RandomRotation((45, 50)), + ], + p=[proba_passthrough, 1 - proba_passthrough], + ) + + img = transforms.ToPILImage()(torch.rand(3, 30, 40)) + out = random_choice_transform(img) + if proba_passthrough == 1: + assert out == img + elif proba_passthrough == 0: + assert out != img + + # Checking if RandomChoice can be printed as string + random_choice_transform.__repr__() + + +@pytest.mark.skipif(stats is None, reason="scipy.stats not available") +def test_random_order(): + random_state = random.getstate() + random.seed(42) + random_order_transform = transforms.RandomOrder([transforms.Resize(20, antialias=True), transforms.CenterCrop(10)]) + img = transforms.ToPILImage()(torch.rand(3, 25, 25)) + num_samples = 250 + num_normal_order = 0 + resize_crop_out = transforms.CenterCrop(10)(transforms.Resize(20, antialias=True)(img)) + for _ in range(num_samples): + out = random_order_transform(img) + if out == resize_crop_out: + num_normal_order += 1 + + p_value = stats.binomtest(num_normal_order, num_samples, p=0.5).pvalue + random.setstate(random_state) + assert p_value > 0.0001 + + # Checking if RandomOrder can be printed as string + random_order_transform.__repr__() + + +def test_linear_transformation(): + num_samples = 1000 + x = torch.randn(num_samples, 3, 10, 10) + flat_x = x.view(x.size(0), x.size(1) * x.size(2) * x.size(3)) + # compute principal components + sigma = torch.mm(flat_x.t(), flat_x) / flat_x.size(0) + u, s, _ = np.linalg.svd(sigma.numpy()) + zca_epsilon = 1e-10 # avoid division by 0 + d = torch.Tensor(np.diag(1.0 / np.sqrt(s + zca_epsilon))) + u = torch.Tensor(u) + principal_components = torch.mm(torch.mm(u, d), u.t()) + mean_vector = torch.sum(flat_x, dim=0) / flat_x.size(0) + # initialize whitening matrix + whitening = transforms.LinearTransformation(principal_components, mean_vector) + # estimate covariance and mean using weak law of large number + num_features = flat_x.size(1) + cov = 0.0 + mean = 0.0 + for i in x: + xwhite = whitening(i) + xwhite = xwhite.view(1, -1).numpy() + cov += np.dot(xwhite, xwhite.T) / num_features + mean += np.sum(xwhite) / num_features + # if rtol for std = 1e-3 then rtol for cov = 2e-3 as std**2 = cov + torch.testing.assert_close( + cov / num_samples, np.identity(1), rtol=2e-3, atol=1e-8, check_dtype=False, msg="cov not close to 1" + ) + torch.testing.assert_close( + mean / num_samples, 0, rtol=1e-3, atol=1e-8, check_dtype=False, msg="mean not close to 0" + ) + + # Checking if LinearTransformation can be printed as string + whitening.__repr__() + + +@pytest.mark.parametrize("dtype", int_dtypes()) +def test_max_value(dtype): + + assert F_t._max_value(dtype) == torch.iinfo(dtype).max + # remove float testing as it can lead to errors such as + # runtime error: 5.7896e+76 is outside the range of representable values of type 'float' + # for dtype in float_dtypes(): + # self.assertGreater(F_t._max_value(dtype), torch.finfo(dtype).max) + + +@pytest.mark.xfail( + reason="torch.iinfo() is not supported by torchscript. See https://github.com/pytorch/pytorch/issues/41492." +) +def test_max_value_iinfo(): + @torch.jit.script + def max_value(image: torch.Tensor) -> int: + return 1 if image.is_floating_point() else torch.iinfo(image.dtype).max + + +@pytest.mark.parametrize("should_vflip", [True, False]) +@pytest.mark.parametrize("single_dim", [True, False]) +def test_ten_crop(should_vflip, single_dim): + to_pil_image = transforms.ToPILImage() + h = random.randint(5, 25) + w = random.randint(5, 25) + crop_h = random.randint(1, h) + crop_w = random.randint(1, w) + if single_dim: + crop_h = min(crop_h, crop_w) + crop_w = crop_h + transform = transforms.TenCrop(crop_h, vertical_flip=should_vflip) + five_crop = transforms.FiveCrop(crop_h) + else: + transform = transforms.TenCrop((crop_h, crop_w), vertical_flip=should_vflip) + five_crop = transforms.FiveCrop((crop_h, crop_w)) + + img = to_pil_image(torch.FloatTensor(3, h, w).uniform_()) + results = transform(img) + expected_output = five_crop(img) + + # Checking if FiveCrop and TenCrop can be printed as string + transform.__repr__() + five_crop.__repr__() + + if should_vflip: + vflipped_img = img.transpose(Image.FLIP_TOP_BOTTOM) + expected_output += five_crop(vflipped_img) + else: + hflipped_img = img.transpose(Image.FLIP_LEFT_RIGHT) + expected_output += five_crop(hflipped_img) + + assert len(results) == 10 + assert results == expected_output + + +@pytest.mark.parametrize("single_dim", [True, False]) +def test_five_crop(single_dim): + to_pil_image = transforms.ToPILImage() + h = random.randint(5, 25) + w = random.randint(5, 25) + crop_h = random.randint(1, h) + crop_w = random.randint(1, w) + if single_dim: + crop_h = min(crop_h, crop_w) + crop_w = crop_h + transform = transforms.FiveCrop(crop_h) + else: + transform = transforms.FiveCrop((crop_h, crop_w)) + + img = torch.FloatTensor(3, h, w).uniform_() + + results = transform(to_pil_image(img)) + + assert len(results) == 5 + for crop in results: + assert crop.size == (crop_w, crop_h) + + to_pil_image = transforms.ToPILImage() + tl = to_pil_image(img[:, 0:crop_h, 0:crop_w]) + tr = to_pil_image(img[:, 0:crop_h, w - crop_w :]) + bl = to_pil_image(img[:, h - crop_h :, 0:crop_w]) + br = to_pil_image(img[:, h - crop_h :, w - crop_w :]) + center = transforms.CenterCrop((crop_h, crop_w))(to_pil_image(img)) + expected_output = (tl, tr, bl, br, center) + assert results == expected_output + + +@pytest.mark.parametrize("policy", transforms.AutoAugmentPolicy) +@pytest.mark.parametrize("fill", [None, 85, (128, 128, 128)]) +@pytest.mark.parametrize("grayscale", [True, False]) +def test_autoaugment(policy, fill, grayscale): + random.seed(42) + img = Image.open(GRACE_HOPPER) + if grayscale: + img, fill = _get_grayscale_test_image(img, fill) + transform = transforms.AutoAugment(policy=policy, fill=fill) + for _ in range(100): + img = transform(img) + transform.__repr__() + + +@pytest.mark.parametrize("num_ops", [1, 2, 3]) +@pytest.mark.parametrize("magnitude", [7, 9, 11]) +@pytest.mark.parametrize("fill", [None, 85, (128, 128, 128)]) +@pytest.mark.parametrize("grayscale", [True, False]) +def test_randaugment(num_ops, magnitude, fill, grayscale): + random.seed(42) + img = Image.open(GRACE_HOPPER) + if grayscale: + img, fill = _get_grayscale_test_image(img, fill) + transform = transforms.RandAugment(num_ops=num_ops, magnitude=magnitude, fill=fill) + for _ in range(100): + img = transform(img) + transform.__repr__() + + +@pytest.mark.parametrize("fill", [None, 85, (128, 128, 128)]) +@pytest.mark.parametrize("num_magnitude_bins", [10, 13, 30]) +@pytest.mark.parametrize("grayscale", [True, False]) +def test_trivialaugmentwide(fill, num_magnitude_bins, grayscale): + random.seed(42) + img = Image.open(GRACE_HOPPER) + if grayscale: + img, fill = _get_grayscale_test_image(img, fill) + transform = transforms.TrivialAugmentWide(fill=fill, num_magnitude_bins=num_magnitude_bins) + for _ in range(100): + img = transform(img) + transform.__repr__() + + +@pytest.mark.parametrize("fill", [None, 85, (128, 128, 128)]) +@pytest.mark.parametrize("severity", [1, 10]) +@pytest.mark.parametrize("mixture_width", [1, 2]) +@pytest.mark.parametrize("chain_depth", [-1, 2]) +@pytest.mark.parametrize("all_ops", [True, False]) +@pytest.mark.parametrize("grayscale", [True, False]) +def test_augmix(fill, severity, mixture_width, chain_depth, all_ops, grayscale): + random.seed(42) + img = Image.open(GRACE_HOPPER) + if grayscale: + img, fill = _get_grayscale_test_image(img, fill) + transform = transforms.AugMix( + fill=fill, severity=severity, mixture_width=mixture_width, chain_depth=chain_depth, all_ops=all_ops + ) + for _ in range(100): + img = transform(img) + transform.__repr__() + + +def test_random_crop(): + height = random.randint(10, 32) * 2 + width = random.randint(10, 32) * 2 + oheight = random.randint(5, (height - 2) // 2) * 2 + owidth = random.randint(5, (width - 2) // 2) * 2 + img = torch.ones(3, height, width, dtype=torch.uint8) + result = transforms.Compose( + [ + transforms.ToPILImage(), + transforms.RandomCrop((oheight, owidth)), + transforms.PILToTensor(), + ] + )(img) + assert result.size(1) == oheight + assert result.size(2) == owidth + + padding = random.randint(1, 20) + result = transforms.Compose( + [ + transforms.ToPILImage(), + transforms.RandomCrop((oheight, owidth), padding=padding), + transforms.PILToTensor(), + ] + )(img) + assert result.size(1) == oheight + assert result.size(2) == owidth + + result = transforms.Compose( + [transforms.ToPILImage(), transforms.RandomCrop((height, width)), transforms.PILToTensor()] + )(img) + assert result.size(1) == height + assert result.size(2) == width + torch.testing.assert_close(result, img) + + result = transforms.Compose( + [ + transforms.ToPILImage(), + transforms.RandomCrop((height + 1, width + 1), pad_if_needed=True), + transforms.PILToTensor(), + ] + )(img) + assert result.size(1) == height + 1 + assert result.size(2) == width + 1 + + t = transforms.RandomCrop(33) + img = torch.ones(3, 32, 32) + with pytest.raises(ValueError, match=r"Required crop size .+ is larger than input image size .+"): + t(img) + + +def test_center_crop(): + height = random.randint(10, 32) * 2 + width = random.randint(10, 32) * 2 + oheight = random.randint(5, (height - 2) // 2) * 2 + owidth = random.randint(5, (width - 2) // 2) * 2 + + img = torch.ones(3, height, width, dtype=torch.uint8) + oh1 = (height - oheight) // 2 + ow1 = (width - owidth) // 2 + imgnarrow = img[:, oh1 : oh1 + oheight, ow1 : ow1 + owidth] + imgnarrow.fill_(0) + result = transforms.Compose( + [ + transforms.ToPILImage(), + transforms.CenterCrop((oheight, owidth)), + transforms.PILToTensor(), + ] + )(img) + assert result.sum() == 0 + oheight += 1 + owidth += 1 + result = transforms.Compose( + [ + transforms.ToPILImage(), + transforms.CenterCrop((oheight, owidth)), + transforms.PILToTensor(), + ] + )(img) + sum1 = result.sum() + assert sum1 > 1 + oheight += 1 + owidth += 1 + result = transforms.Compose( + [ + transforms.ToPILImage(), + transforms.CenterCrop((oheight, owidth)), + transforms.PILToTensor(), + ] + )(img) + sum2 = result.sum() + assert sum2 > 0 + assert sum2 > sum1 + + +@pytest.mark.parametrize("odd_image_size", (True, False)) +@pytest.mark.parametrize("delta", (1, 3, 5)) +@pytest.mark.parametrize("delta_width", (-2, -1, 0, 1, 2)) +@pytest.mark.parametrize("delta_height", (-2, -1, 0, 1, 2)) +def test_center_crop_2(odd_image_size, delta, delta_width, delta_height): + """Tests when center crop size is larger than image size, along any dimension""" + + # Since height is independent of width, we can ignore images with odd height and even width and vice-versa. + input_image_size = (random.randint(10, 32) * 2, random.randint(10, 32) * 2) + if odd_image_size: + input_image_size = (input_image_size[0] + 1, input_image_size[1] + 1) + + delta_height *= delta + delta_width *= delta + + img = torch.ones(3, *input_image_size, dtype=torch.uint8) + crop_size = (input_image_size[0] + delta_height, input_image_size[1] + delta_width) + + # Test both transforms, one with PIL input and one with tensor + output_pil = transforms.Compose( + [transforms.ToPILImage(), transforms.CenterCrop(crop_size), transforms.PILToTensor()], + )(img) + assert output_pil.size()[1:3] == crop_size + + output_tensor = transforms.CenterCrop(crop_size)(img) + assert output_tensor.size()[1:3] == crop_size + + # Ensure output for PIL and Tensor are equal + assert_equal( + output_tensor, + output_pil, + msg=f"image_size: {input_image_size} crop_size: {crop_size}", + ) + + # Check if content in center of both image and cropped output is same. + center_size = (min(crop_size[0], input_image_size[0]), min(crop_size[1], input_image_size[1])) + crop_center_tl, input_center_tl = [0, 0], [0, 0] + for index in range(2): + if crop_size[index] > input_image_size[index]: + crop_center_tl[index] = (crop_size[index] - input_image_size[index]) // 2 + else: + input_center_tl[index] = (input_image_size[index] - crop_size[index]) // 2 + + output_center = output_pil[ + :, + crop_center_tl[0] : crop_center_tl[0] + center_size[0], + crop_center_tl[1] : crop_center_tl[1] + center_size[1], + ] + + img_center = img[ + :, + input_center_tl[0] : input_center_tl[0] + center_size[0], + input_center_tl[1] : input_center_tl[1] + center_size[1], + ] + + assert_equal(output_center, img_center) + + +def test_color_jitter(): + color_jitter = transforms.ColorJitter(2, 2, 2, 0.1) + + x_shape = [2, 2, 3] + x_data = [0, 5, 13, 54, 135, 226, 37, 8, 234, 90, 255, 1] + x_np = np.array(x_data, dtype=np.uint8).reshape(x_shape) + x_pil = Image.fromarray(x_np, mode="RGB") + x_pil_2 = x_pil.convert("L") + + for _ in range(10): + y_pil = color_jitter(x_pil) + assert y_pil.mode == x_pil.mode + + y_pil_2 = color_jitter(x_pil_2) + assert y_pil_2.mode == x_pil_2.mode + + # Checking if ColorJitter can be printed as string + color_jitter.__repr__() + + +@pytest.mark.parametrize("hue", [1, (-1, 1)]) +def test_color_jitter_hue_out_of_bounds(hue): + with pytest.raises(ValueError, match=re.escape("hue values should be between (-0.5, 0.5)")): + transforms.ColorJitter(hue=hue) + + +@pytest.mark.parametrize("seed", range(10)) +@pytest.mark.skipif(stats is None, reason="scipy.stats not available") +def test_random_erasing(seed): + torch.random.manual_seed(seed) + img = torch.ones(3, 128, 128) + + t = transforms.RandomErasing(scale=(0.1, 0.1), ratio=(1 / 3, 3.0)) + y, x, h, w, v = t.get_params( + img, + t.scale, + t.ratio, + [ + t.value, + ], + ) + aspect_ratio = h / w + # Add some tolerance due to the rounding and int conversion used in the transform + tol = 0.05 + assert 1 / 3 - tol <= aspect_ratio <= 3 + tol + + # Make sure that h > w and h < w are equally likely (log-scale sampling) + aspect_ratios = [] + random.seed(42) + trial = 1000 + for _ in range(trial): + y, x, h, w, v = t.get_params( + img, + t.scale, + t.ratio, + [ + t.value, + ], + ) + aspect_ratios.append(h / w) + + count_bigger_then_ones = len([1 for aspect_ratio in aspect_ratios if aspect_ratio > 1]) + p_value = stats.binomtest(count_bigger_then_ones, trial, p=0.5).pvalue + assert p_value > 0.0001 + + # Checking if RandomErasing can be printed as string + t.__repr__() + + +def test_random_rotation(): + + with pytest.raises(ValueError): + transforms.RandomRotation(-0.7) + + with pytest.raises(ValueError): + transforms.RandomRotation([-0.7]) + + with pytest.raises(ValueError): + transforms.RandomRotation([-0.7, 0, 0.7]) + + t = transforms.RandomRotation(0, fill=None) + assert t.fill == 0 + + t = transforms.RandomRotation(10) + angle = t.get_params(t.degrees) + assert angle > -10 and angle < 10 + + t = transforms.RandomRotation((-10, 10)) + angle = t.get_params(t.degrees) + assert -10 < angle < 10 + + # Checking if RandomRotation can be printed as string + t.__repr__() + + t = transforms.RandomRotation((-10, 10), interpolation=Image.BILINEAR) + assert t.interpolation == transforms.InterpolationMode.BILINEAR + + +def test_random_rotation_error(): + # assert fill being either a Sequence or a Number + with pytest.raises(TypeError): + transforms.RandomRotation(0, fill={}) + + +def test_randomperspective(): + for _ in range(10): + height = random.randint(24, 32) * 2 + width = random.randint(24, 32) * 2 + img = torch.ones(3, height, width) + to_pil_image = transforms.ToPILImage() + img = to_pil_image(img) + perp = transforms.RandomPerspective() + startpoints, endpoints = perp.get_params(width, height, 0.5) + tr_img = F.perspective(img, startpoints, endpoints) + tr_img2 = F.convert_image_dtype(F.pil_to_tensor(F.perspective(tr_img, endpoints, startpoints))) + tr_img = F.convert_image_dtype(F.pil_to_tensor(tr_img)) + assert img.size[0] == width + assert img.size[1] == height + assert torch.nn.functional.mse_loss( + tr_img, F.convert_image_dtype(F.pil_to_tensor(img)) + ) + 0.3 > torch.nn.functional.mse_loss(tr_img2, F.convert_image_dtype(F.pil_to_tensor(img))) + + +@pytest.mark.parametrize("seed", range(10)) +@pytest.mark.parametrize("mode", ["L", "RGB", "F"]) +def test_randomperspective_fill(mode, seed): + torch.random.manual_seed(seed) + + # assert fill being either a Sequence or a Number + with pytest.raises(TypeError): + transforms.RandomPerspective(fill={}) + + t = transforms.RandomPerspective(fill=None) + assert t.fill == 0 + + height = 100 + width = 100 + img = torch.ones(3, height, width) + to_pil_image = transforms.ToPILImage() + img = to_pil_image(img) + fill = 127 + num_bands = len(mode) + + img_conv = img.convert(mode) + perspective = transforms.RandomPerspective(p=1, fill=fill) + tr_img = perspective(img_conv) + pixel = tr_img.getpixel((0, 0)) + + if not isinstance(pixel, tuple): + pixel = (pixel,) + assert pixel == tuple([fill] * num_bands) + + startpoints, endpoints = transforms.RandomPerspective.get_params(width, height, 0.5) + tr_img = F.perspective(img_conv, startpoints, endpoints, fill=fill) + pixel = tr_img.getpixel((0, 0)) + + if not isinstance(pixel, tuple): + pixel = (pixel,) + assert pixel == tuple([fill] * num_bands) + + wrong_num_bands = num_bands + 1 + with pytest.raises(ValueError): + F.perspective(img_conv, startpoints, endpoints, fill=tuple([fill] * wrong_num_bands)) + + +@pytest.mark.skipif(stats is None, reason="scipy.stats not available") +def test_normalize(): + def samples_from_standard_normal(tensor): + p_value = stats.kstest(list(tensor.view(-1)), "norm", args=(0, 1)).pvalue + return p_value > 0.0001 + + random_state = random.getstate() + random.seed(42) + for channels in [1, 3]: + img = torch.rand(channels, 10, 10) + mean = [img[c].mean() for c in range(channels)] + std = [img[c].std() for c in range(channels)] + normalized = transforms.Normalize(mean, std)(img) + assert samples_from_standard_normal(normalized) + random.setstate(random_state) + + # Checking if Normalize can be printed as string + transforms.Normalize(mean, std).__repr__() + + # Checking the optional in-place behaviour + tensor = torch.rand((1, 16, 16)) + tensor_inplace = transforms.Normalize((0.5,), (0.5,), inplace=True)(tensor) + assert_equal(tensor, tensor_inplace) + + +@pytest.mark.parametrize("dtype1", [torch.float32, torch.float64]) +@pytest.mark.parametrize("dtype2", [torch.int64, torch.float32, torch.float64]) +def test_normalize_different_dtype(dtype1, dtype2): + img = torch.rand(3, 10, 10, dtype=dtype1) + mean = torch.tensor([1, 2, 3], dtype=dtype2) + std = torch.tensor([1, 2, 1], dtype=dtype2) + # checks that it doesn't crash + transforms.functional.normalize(img, mean, std) + + +def test_normalize_3d_tensor(): + torch.manual_seed(28) + n_channels = 3 + img_size = 10 + mean = torch.rand(n_channels) + std = torch.rand(n_channels) + img = torch.rand(n_channels, img_size, img_size) + target = F.normalize(img, mean, std) + + mean_unsqueezed = mean.view(-1, 1, 1) + std_unsqueezed = std.view(-1, 1, 1) + result1 = F.normalize(img, mean_unsqueezed, std_unsqueezed) + result2 = F.normalize( + img, mean_unsqueezed.repeat(1, img_size, img_size), std_unsqueezed.repeat(1, img_size, img_size) + ) + torch.testing.assert_close(target, result1) + torch.testing.assert_close(target, result2) + + +class TestAffine: + @pytest.fixture(scope="class") + def input_img(self): input_img = np.zeros((40, 40, 3), dtype=np.uint8) - cnt = [20, 20] for pt in [(16, 16), (20, 16), (20, 20)]: for i in range(-5, 5): for j in range(-5, 5): input_img[pt[0] + i, pt[1] + j, :] = [255, 155, 55] + return input_img - with self.assertRaises(TypeError, msg="Argument translate should be a sequence"): + def test_affine_translate_seq(self, input_img): + with pytest.raises(TypeError, match=r"Argument translate should be a sequence"): F.affine(input_img, 10, translate=0, scale=1, shear=1) - pil_img = F.to_pil_image(input_img) - - def _to_3x3_inv(inv_result_matrix): - result_matrix = np.zeros((3, 3)) - result_matrix[:2, :] = np.array(inv_result_matrix).reshape((2, 3)) - result_matrix[2, 2] = 1 - return np.linalg.inv(result_matrix) - - def _test_transformation(a, t, s, sh): - a_rad = math.radians(a) - s_rad = [math.radians(sh_) for sh_ in sh] - cx, cy = cnt - tx, ty = t - sx, sy = s_rad - rot = a_rad - - # 1) Check transformation matrix: - C = np.array([[1, 0, cx], - [0, 1, cy], - [0, 0, 1]]) - T = np.array([[1, 0, tx], - [0, 1, ty], - [0, 0, 1]]) - Cinv = np.linalg.inv(C) - - RS = np.array( - [[s * math.cos(rot), -s * math.sin(rot), 0], - [s * math.sin(rot), s * math.cos(rot), 0], - [0, 0, 1]]) - - SHx = np.array([[1, -math.tan(sx), 0], - [0, 1, 0], - [0, 0, 1]]) - - SHy = np.array([[1, 0, 0], - [-math.tan(sy), 1, 0], - [0, 0, 1]]) - - RSS = np.matmul(RS, np.matmul(SHy, SHx)) - - true_matrix = np.matmul(T, np.matmul(C, np.matmul(RSS, Cinv))) - - result_matrix = _to_3x3_inv(F._get_inverse_affine_matrix(center=cnt, angle=a, - translate=t, scale=s, shear=sh)) - self.assertLess(np.sum(np.abs(true_matrix - result_matrix)), 1e-10) - # 2) Perform inverse mapping: - true_result = np.zeros((40, 40, 3), dtype=np.uint8) - inv_true_matrix = np.linalg.inv(true_matrix) - for y in range(true_result.shape[0]): - for x in range(true_result.shape[1]): - # Same as for PIL: - # https://github.com/python-pillow/Pillow/blob/71f8ec6a0cfc1008076a023c0756542539d057ab/ - # src/libImaging/Geometry.c#L1060 - input_pt = np.array([x + 0.5, y + 0.5, 1.0]) - res = np.floor(np.dot(inv_true_matrix, input_pt)).astype(np.int) - _x, _y = res[:2] - if 0 <= _x < input_img.shape[1] and 0 <= _y < input_img.shape[0]: - true_result[y, x, :] = input_img[_y, _x, :] - - result = F.affine(pil_img, angle=a, translate=t, scale=s, shear=sh) - self.assertEqual(result.size, pil_img.size) - # Compute number of different pixels: - np_result = np.array(result) - n_diff_pixels = np.sum(np_result != true_result) / 3 - # Accept 3 wrong pixels - self.assertLess(n_diff_pixels, 3, - "a={}, t={}, s={}, sh={}\n".format(a, t, s, sh) + - "n diff pixels={}\n".format(np.sum(np.array(result)[:, :, 0] != true_result[:, :, 0]))) + @pytest.fixture(scope="class") + def pil_image(self, input_img): + return F.to_pil_image(input_img) - # Test rotation - a = 45 - _test_transformation(a=a, t=(0, 0), s=1.0, sh=(0.0, 0.0)) + def _to_3x3_inv(self, inv_result_matrix): + result_matrix = np.zeros((3, 3)) + result_matrix[:2, :] = np.array(inv_result_matrix).reshape((2, 3)) + result_matrix[2, 2] = 1 + return np.linalg.inv(result_matrix) - # Test translation - t = [10, 15] - _test_transformation(a=0.0, t=t, s=1.0, sh=(0.0, 0.0)) + def _test_transformation(self, angle, translate, scale, shear, pil_image, input_img, center=None): - # Test scale - s = 1.2 - _test_transformation(a=0.0, t=(0.0, 0.0), s=s, sh=(0.0, 0.0)) + a_rad = math.radians(angle) + s_rad = [math.radians(sh_) for sh_ in shear] + cnt = [20, 20] if center is None else center + cx, cy = cnt + tx, ty = translate + sx, sy = s_rad + rot = a_rad - # Test shear - sh = [45.0, 25.0] - _test_transformation(a=0.0, t=(0.0, 0.0), s=1.0, sh=sh) - - # Test rotation, scale, translation, shear - for a in range(-90, 90, 25): - for t1 in range(-10, 10, 5): - for s in [0.75, 0.98, 1.0, 1.2, 1.4]: - for sh in range(-15, 15, 5): - _test_transformation(a=a, t=(t1, t1), s=s, sh=(sh, sh)) - - def test_random_rotation(self): - - with self.assertRaises(ValueError): - transforms.RandomRotation(-0.7) - transforms.RandomRotation([-0.7]) - transforms.RandomRotation([-0.7, 0, 0.7]) - - # assert fill being either a Sequence or a Number - with self.assertRaises(TypeError): - transforms.RandomRotation(0, fill={}) - - t = transforms.RandomRotation(0, fill=None) - self.assertTrue(t.fill == 0) - - t = transforms.RandomRotation(10) - angle = t.get_params(t.degrees) - self.assertTrue(angle > -10 and angle < 10) - - t = transforms.RandomRotation((-10, 10)) - angle = t.get_params(t.degrees) - self.assertTrue(-10 < angle < 10) - - # Checking if RandomRotation can be printed as string - t.__repr__() - - # assert deprecation warning and non-BC - with self.assertWarnsRegex(UserWarning, r"Argument resample is deprecated and will be removed"): - t = transforms.RandomRotation((-10, 10), resample=2) - self.assertEqual(t.interpolation, transforms.InterpolationMode.BILINEAR) - - # assert changed type warning - with self.assertWarnsRegex(UserWarning, r"Argument interpolation should be of type InterpolationMode"): - t = transforms.RandomRotation((-10, 10), interpolation=2) - self.assertEqual(t.interpolation, transforms.InterpolationMode.BILINEAR) - - def test_random_affine(self): - - with self.assertRaises(ValueError): - transforms.RandomAffine(-0.7) - transforms.RandomAffine([-0.7]) - transforms.RandomAffine([-0.7, 0, 0.7]) - - transforms.RandomAffine([-90, 90], translate=2.0) - transforms.RandomAffine([-90, 90], translate=[-1.0, 1.0]) - transforms.RandomAffine([-90, 90], translate=[-1.0, 0.0, 1.0]) - - transforms.RandomAffine([-90, 90], translate=[0.2, 0.2], scale=[0.0]) - transforms.RandomAffine([-90, 90], translate=[0.2, 0.2], scale=[-1.0, 1.0]) - transforms.RandomAffine([-90, 90], translate=[0.2, 0.2], scale=[0.5, -0.5]) - transforms.RandomAffine([-90, 90], translate=[0.2, 0.2], scale=[0.5, 3.0, -0.5]) - - transforms.RandomAffine([-90, 90], translate=[0.2, 0.2], scale=[0.5, 0.5], shear=-7) - transforms.RandomAffine([-90, 90], translate=[0.2, 0.2], scale=[0.5, 0.5], shear=[-10]) - transforms.RandomAffine([-90, 90], translate=[0.2, 0.2], scale=[0.5, 0.5], shear=[-10, 0, 10]) - transforms.RandomAffine([-90, 90], translate=[0.2, 0.2], scale=[0.5, 0.5], shear=[-10, 0, 10, 0, 10]) - - # assert fill being either a Sequence or a Number - with self.assertRaises(TypeError): - transforms.RandomAffine(0, fill={}) - - t = transforms.RandomAffine(0, fill=None) - self.assertTrue(t.fill == 0) - - x = np.zeros((100, 100, 3), dtype=np.uint8) - img = F.to_pil_image(x) - - t = transforms.RandomAffine(10, translate=[0.5, 0.3], scale=[0.7, 1.3], shear=[-10, 10, 20, 40]) - for _ in range(100): - angle, translations, scale, shear = t.get_params(t.degrees, t.translate, t.scale, t.shear, - img_size=img.size) - self.assertTrue(-10 < angle < 10) - self.assertTrue(-img.size[0] * 0.5 <= translations[0] <= img.size[0] * 0.5, - "{} vs {}".format(translations[0], img.size[0] * 0.5)) - self.assertTrue(-img.size[1] * 0.5 <= translations[1] <= img.size[1] * 0.5, - "{} vs {}".format(translations[1], img.size[1] * 0.5)) - self.assertTrue(0.7 < scale < 1.3) - self.assertTrue(-10 < shear[0] < 10) - self.assertTrue(-20 < shear[1] < 40) - - # Checking if RandomAffine can be printed as string - t.__repr__() - - t = transforms.RandomAffine(10, interpolation=transforms.InterpolationMode.BILINEAR) - self.assertIn("bilinear", t.__repr__()) - - # assert deprecation warning and non-BC - with self.assertWarnsRegex(UserWarning, r"Argument resample is deprecated and will be removed"): - t = transforms.RandomAffine(10, resample=2) - self.assertEqual(t.interpolation, transforms.InterpolationMode.BILINEAR) - - with self.assertWarnsRegex(UserWarning, r"Argument fillcolor is deprecated and will be removed"): - t = transforms.RandomAffine(10, fillcolor=10) - self.assertEqual(t.fill, 10) - - # assert changed type warning - with self.assertWarnsRegex(UserWarning, r"Argument interpolation should be of type InterpolationMode"): - t = transforms.RandomAffine(10, interpolation=2) - self.assertEqual(t.interpolation, transforms.InterpolationMode.BILINEAR) - - def test_to_grayscale(self): - """Unit tests for grayscale transform""" - - x_shape = [2, 2, 3] - x_data = [0, 5, 13, 54, 135, 226, 37, 8, 234, 90, 255, 1] - x_np = np.array(x_data, dtype=np.uint8).reshape(x_shape) - x_pil = Image.fromarray(x_np, mode='RGB') - x_pil_2 = x_pil.convert('L') - gray_np = np.array(x_pil_2) - - # Test Set: Grayscale an image with desired number of output channels - # Case 1: RGB -> 1 channel grayscale - trans1 = transforms.Grayscale(num_output_channels=1) - gray_pil_1 = trans1(x_pil) - gray_np_1 = np.array(gray_pil_1) - self.assertEqual(gray_pil_1.mode, 'L', 'mode should be L') - self.assertEqual(gray_np_1.shape, tuple(x_shape[0:2]), 'should be 1 channel') - assert_equal(gray_np, gray_np_1) - - # Case 2: RGB -> 3 channel grayscale - trans2 = transforms.Grayscale(num_output_channels=3) - gray_pil_2 = trans2(x_pil) - gray_np_2 = np.array(gray_pil_2) - self.assertEqual(gray_pil_2.mode, 'RGB', 'mode should be RGB') - self.assertEqual(gray_np_2.shape, tuple(x_shape), 'should be 3 channel') - assert_equal(gray_np_2[:, :, 0], gray_np_2[:, :, 1]) - assert_equal(gray_np_2[:, :, 1], gray_np_2[:, :, 2]) - assert_equal(gray_np, gray_np_2[:, :, 0], check_stride=False) - - # Case 3: 1 channel grayscale -> 1 channel grayscale - trans3 = transforms.Grayscale(num_output_channels=1) - gray_pil_3 = trans3(x_pil_2) - gray_np_3 = np.array(gray_pil_3) - self.assertEqual(gray_pil_3.mode, 'L', 'mode should be L') - self.assertEqual(gray_np_3.shape, tuple(x_shape[0:2]), 'should be 1 channel') - assert_equal(gray_np, gray_np_3) - - # Case 4: 1 channel grayscale -> 3 channel grayscale - trans4 = transforms.Grayscale(num_output_channels=3) - gray_pil_4 = trans4(x_pil_2) - gray_np_4 = np.array(gray_pil_4) - self.assertEqual(gray_pil_4.mode, 'RGB', 'mode should be RGB') - self.assertEqual(gray_np_4.shape, tuple(x_shape), 'should be 3 channel') - assert_equal(gray_np_4[:, :, 0], gray_np_4[:, :, 1]) - assert_equal(gray_np_4[:, :, 1], gray_np_4[:, :, 2]) - assert_equal(gray_np, gray_np_4[:, :, 0], check_stride=False) - - # Checking if Grayscale can be printed as string - trans4.__repr__() - - @unittest.skipIf(stats is None, 'scipy.stats not available') - def test_random_grayscale(self): - """Unit tests for random grayscale transform""" - - # Test Set 1: RGB -> 3 channel grayscale - random_state = random.getstate() - random.seed(42) - x_shape = [2, 2, 3] - x_np = np.random.randint(0, 256, x_shape, np.uint8) - x_pil = Image.fromarray(x_np, mode='RGB') - x_pil_2 = x_pil.convert('L') - gray_np = np.array(x_pil_2) - - num_samples = 250 - num_gray = 0 - for _ in range(num_samples): - gray_pil_2 = transforms.RandomGrayscale(p=0.5)(x_pil) - gray_np_2 = np.array(gray_pil_2) - if np.array_equal(gray_np_2[:, :, 0], gray_np_2[:, :, 1]) and \ - np.array_equal(gray_np_2[:, :, 1], gray_np_2[:, :, 2]) and \ - np.array_equal(gray_np, gray_np_2[:, :, 0]): - num_gray = num_gray + 1 - - p_value = stats.binom_test(num_gray, num_samples, p=0.5) - random.setstate(random_state) - self.assertGreater(p_value, 0.0001) - - # Test Set 2: grayscale -> 1 channel grayscale - random_state = random.getstate() - random.seed(42) - x_shape = [2, 2, 3] - x_np = np.random.randint(0, 256, x_shape, np.uint8) - x_pil = Image.fromarray(x_np, mode='RGB') - x_pil_2 = x_pil.convert('L') - gray_np = np.array(x_pil_2) - - num_samples = 250 - num_gray = 0 - for _ in range(num_samples): - gray_pil_3 = transforms.RandomGrayscale(p=0.5)(x_pil_2) - gray_np_3 = np.array(gray_pil_3) - if np.array_equal(gray_np, gray_np_3): - num_gray = num_gray + 1 - - p_value = stats.binom_test(num_gray, num_samples, p=1.0) # Note: grayscale is always unchanged - random.setstate(random_state) - self.assertGreater(p_value, 0.0001) - - # Test set 3: Explicit tests - x_shape = [2, 2, 3] - x_data = [0, 5, 13, 54, 135, 226, 37, 8, 234, 90, 255, 1] - x_np = np.array(x_data, dtype=np.uint8).reshape(x_shape) - x_pil = Image.fromarray(x_np, mode='RGB') - x_pil_2 = x_pil.convert('L') - gray_np = np.array(x_pil_2) - - # Case 3a: RGB -> 3 channel grayscale (grayscaled) - trans2 = transforms.RandomGrayscale(p=1.0) - gray_pil_2 = trans2(x_pil) - gray_np_2 = np.array(gray_pil_2) - self.assertEqual(gray_pil_2.mode, 'RGB', 'mode should be RGB') - self.assertEqual(gray_np_2.shape, tuple(x_shape), 'should be 3 channel') - assert_equal(gray_np_2[:, :, 0], gray_np_2[:, :, 1]) - assert_equal(gray_np_2[:, :, 1], gray_np_2[:, :, 2]) - assert_equal(gray_np, gray_np_2[:, :, 0], check_stride=False) - - # Case 3b: RGB -> 3 channel grayscale (unchanged) - trans2 = transforms.RandomGrayscale(p=0.0) - gray_pil_2 = trans2(x_pil) - gray_np_2 = np.array(gray_pil_2) - self.assertEqual(gray_pil_2.mode, 'RGB', 'mode should be RGB') - self.assertEqual(gray_np_2.shape, tuple(x_shape), 'should be 3 channel') - assert_equal(x_np, gray_np_2) - - # Case 3c: 1 channel grayscale -> 1 channel grayscale (grayscaled) - trans3 = transforms.RandomGrayscale(p=1.0) - gray_pil_3 = trans3(x_pil_2) - gray_np_3 = np.array(gray_pil_3) - self.assertEqual(gray_pil_3.mode, 'L', 'mode should be L') - self.assertEqual(gray_np_3.shape, tuple(x_shape[0:2]), 'should be 1 channel') - assert_equal(gray_np, gray_np_3) - - # Case 3d: 1 channel grayscale -> 1 channel grayscale (unchanged) - trans3 = transforms.RandomGrayscale(p=0.0) - gray_pil_3 = trans3(x_pil_2) - gray_np_3 = np.array(gray_pil_3) - self.assertEqual(gray_pil_3.mode, 'L', 'mode should be L') - self.assertEqual(gray_np_3.shape, tuple(x_shape[0:2]), 'should be 1 channel') - assert_equal(gray_np, gray_np_3) - - # Checking if RandomGrayscale can be printed as string - trans3.__repr__() - - def test_gaussian_blur_asserts(self): - np_img = np.ones((100, 100, 3), dtype=np.uint8) * 255 - img = F.to_pil_image(np_img, "RGB") - - with self.assertRaisesRegex(ValueError, r"If kernel_size is a sequence its length should be 2"): - F.gaussian_blur(img, [3]) - - with self.assertRaisesRegex(ValueError, r"If kernel_size is a sequence its length should be 2"): - F.gaussian_blur(img, [3, 3, 3]) - with self.assertRaisesRegex(ValueError, r"Kernel size should be a tuple/list of two integers"): - transforms.GaussianBlur([3, 3, 3]) - - with self.assertRaisesRegex(ValueError, r"kernel_size should have odd and positive integers"): - F.gaussian_blur(img, [4, 4]) - with self.assertRaisesRegex(ValueError, r"Kernel size value should be an odd and positive number"): - transforms.GaussianBlur([4, 4]) - - with self.assertRaisesRegex(ValueError, r"kernel_size should have odd and positive integers"): - F.gaussian_blur(img, [-3, -3]) - with self.assertRaisesRegex(ValueError, r"Kernel size value should be an odd and positive number"): - transforms.GaussianBlur([-3, -3]) - - with self.assertRaisesRegex(ValueError, r"If sigma is a sequence, its length should be 2"): - F.gaussian_blur(img, 3, [1, 1, 1]) - with self.assertRaisesRegex(ValueError, r"sigma should be a single number or a list/tuple with length 2"): - transforms.GaussianBlur(3, [1, 1, 1]) - - with self.assertRaisesRegex(ValueError, r"sigma should have positive values"): - F.gaussian_blur(img, 3, -1.0) - with self.assertRaisesRegex(ValueError, r"If sigma is a single number, it must be positive"): - transforms.GaussianBlur(3, -1.0) - - with self.assertRaisesRegex(TypeError, r"kernel_size should be int or a sequence of integers"): - F.gaussian_blur(img, "kernel_size_string") - with self.assertRaisesRegex(ValueError, r"Kernel size should be a tuple/list of two integers"): - transforms.GaussianBlur("kernel_size_string") - - with self.assertRaisesRegex(TypeError, r"sigma should be either float or sequence of floats"): - F.gaussian_blur(img, 3, "sigma_string") - with self.assertRaisesRegex(ValueError, r"sigma should be a single number or a list/tuple with length 2"): - transforms.GaussianBlur(3, "sigma_string") - - def _test_randomness(self, fn, trans, configs): - random_state = random.getstate() - random.seed(42) - img = transforms.ToPILImage()(torch.rand(3, 16, 18)) - - for p in [0.5, 0.7]: - for config in configs: - inv_img = fn(img, **config) - - num_samples = 250 - counts = 0 - for _ in range(num_samples): - tranformation = trans(p=p, **config) - tranformation.__repr__() - out = tranformation(img) - if out == inv_img: - counts += 1 - - p_value = stats.binom_test(counts, num_samples, p=p) - random.setstate(random_state) - self.assertGreater(p_value, 0.0001) - - @unittest.skipIf(stats is None, 'scipy.stats not available') - def test_random_invert(self): - self._test_randomness( - F.invert, - transforms.RandomInvert, - [{}] + # 1) Check transformation matrix: + C = np.array([[1, 0, cx], [0, 1, cy], [0, 0, 1]]) + T = np.array([[1, 0, tx], [0, 1, ty], [0, 0, 1]]) + Cinv = np.linalg.inv(C) + + RS = np.array( + [ + [scale * math.cos(rot), -scale * math.sin(rot), 0], + [scale * math.sin(rot), scale * math.cos(rot), 0], + [0, 0, 1], + ] + ) + + SHx = np.array([[1, -math.tan(sx), 0], [0, 1, 0], [0, 0, 1]]) + + SHy = np.array([[1, 0, 0], [-math.tan(sy), 1, 0], [0, 0, 1]]) + + RSS = np.matmul(RS, np.matmul(SHy, SHx)) + + true_matrix = np.matmul(T, np.matmul(C, np.matmul(RSS, Cinv))) + + result_matrix = self._to_3x3_inv( + F._get_inverse_affine_matrix(center=cnt, angle=angle, translate=translate, scale=scale, shear=shear) + ) + assert np.sum(np.abs(true_matrix - result_matrix)) < 1e-10 + # 2) Perform inverse mapping: + true_result = np.zeros((40, 40, 3), dtype=np.uint8) + inv_true_matrix = np.linalg.inv(true_matrix) + for y in range(true_result.shape[0]): + for x in range(true_result.shape[1]): + # Same as for PIL: + # https://github.com/python-pillow/Pillow/blob/71f8ec6a0cfc1008076a023c0756542539d057ab/ + # src/libImaging/Geometry.c#L1060 + input_pt = np.array([x + 0.5, y + 0.5, 1.0]) + res = np.floor(np.dot(inv_true_matrix, input_pt)).astype(int) + _x, _y = res[:2] + if 0 <= _x < input_img.shape[1] and 0 <= _y < input_img.shape[0]: + true_result[y, x, :] = input_img[_y, _x, :] + + result = F.affine(pil_image, angle=angle, translate=translate, scale=scale, shear=shear, center=center) + assert result.size == pil_image.size + # Compute number of different pixels: + np_result = np.array(result) + n_diff_pixels = np.sum(np_result != true_result) / 3 + # Accept 3 wrong pixels + error_msg = ( + f"angle={angle}, translate={translate}, scale={scale}, shear={shear}\nn diff pixels={n_diff_pixels}\n" ) + assert n_diff_pixels < 3, error_msg - @unittest.skipIf(stats is None, 'scipy.stats not available') - def test_random_posterize(self): - self._test_randomness( - F.posterize, - transforms.RandomPosterize, - [{"bits": 4}] + def test_transformation_discrete(self, pil_image, input_img): + # Test rotation + angle = 45 + self._test_transformation( + angle=angle, translate=(0, 0), scale=1.0, shear=(0.0, 0.0), pil_image=pil_image, input_img=input_img + ) + + # Test rotation + angle = 45 + self._test_transformation( + angle=angle, + translate=(0, 0), + scale=1.0, + shear=(0.0, 0.0), + pil_image=pil_image, + input_img=input_img, + center=[0, 0], + ) + + # Test translation + translate = [10, 15] + self._test_transformation( + angle=0.0, translate=translate, scale=1.0, shear=(0.0, 0.0), pil_image=pil_image, input_img=input_img ) - @unittest.skipIf(stats is None, 'scipy.stats not available') - def test_random_solarize(self): - self._test_randomness( - F.solarize, - transforms.RandomSolarize, - [{"threshold": 192}] + # Test scale + scale = 1.2 + self._test_transformation( + angle=0.0, translate=(0.0, 0.0), scale=scale, shear=(0.0, 0.0), pil_image=pil_image, input_img=input_img ) - @unittest.skipIf(stats is None, 'scipy.stats not available') - def test_random_adjust_sharpness(self): - self._test_randomness( - F.adjust_sharpness, - transforms.RandomAdjustSharpness, - [{"sharpness_factor": 2.0}] + # Test shear + shear = [45.0, 25.0] + self._test_transformation( + angle=0.0, translate=(0.0, 0.0), scale=1.0, shear=shear, pil_image=pil_image, input_img=input_img ) - @unittest.skipIf(stats is None, 'scipy.stats not available') - def test_random_autocontrast(self): - self._test_randomness( - F.autocontrast, - transforms.RandomAutocontrast, - [{}] + # Test shear with top-left as center + shear = [45.0, 25.0] + self._test_transformation( + angle=0.0, + translate=(0.0, 0.0), + scale=1.0, + shear=shear, + pil_image=pil_image, + input_img=input_img, + center=[0, 0], ) - @unittest.skipIf(stats is None, 'scipy.stats not available') - def test_random_equalize(self): - self._test_randomness( - F.equalize, - transforms.RandomEqualize, - [{}] + @pytest.mark.parametrize("angle", range(-90, 90, 36)) + @pytest.mark.parametrize("translate", range(-10, 10, 5)) + @pytest.mark.parametrize("scale", [0.77, 1.0, 1.27]) + @pytest.mark.parametrize("shear", range(-15, 15, 5)) + def test_transformation_range(self, angle, translate, scale, shear, pil_image, input_img): + self._test_transformation( + angle=angle, + translate=(translate, translate), + scale=scale, + shear=(shear, shear), + pil_image=pil_image, + input_img=input_img, ) - def test_autoaugment(self): - for policy in transforms.AutoAugmentPolicy: - for fill in [None, 85, (128, 128, 128)]: - random.seed(42) - img = Image.open(GRACE_HOPPER) - transform = transforms.AutoAugment(policy=policy, fill=fill) - for _ in range(100): - img = transform(img) - transform.__repr__() - - @unittest.skipIf(stats is None, 'scipy.stats not available') - def test_random_erasing(self): - img = torch.ones(3, 128, 128) - - t = transforms.RandomErasing(scale=(0.1, 0.1), ratio=(1 / 3, 3.)) - y, x, h, w, v = t.get_params(img, t.scale, t.ratio, [t.value, ]) - aspect_ratio = h / w - # Add some tolerance due to the rounding and int conversion used in the transform - tol = 0.05 - self.assertTrue(1 / 3 - tol <= aspect_ratio <= 3 + tol) - - aspect_ratios = [] - random.seed(42) - trial = 1000 - for _ in range(trial): - y, x, h, w, v = t.get_params(img, t.scale, t.ratio, [t.value, ]) - aspect_ratios.append(h / w) - - count_bigger_then_ones = len([1 for aspect_ratio in aspect_ratios if aspect_ratio > 1]) - p_value = stats.binom_test(count_bigger_then_ones, trial, p=0.5) - self.assertGreater(p_value, 0.0001) - - # Checking if RandomErasing can be printed as string - t.__repr__() - - -if __name__ == '__main__': - unittest.main() + +def test_random_affine(): + + with pytest.raises(ValueError): + transforms.RandomAffine(-0.7) + with pytest.raises(ValueError): + transforms.RandomAffine([-0.7]) + with pytest.raises(ValueError): + transforms.RandomAffine([-0.7, 0, 0.7]) + with pytest.raises(TypeError): + transforms.RandomAffine([-90, 90], translate=2.0) + with pytest.raises(ValueError): + transforms.RandomAffine([-90, 90], translate=[-1.0, 1.0]) + with pytest.raises(ValueError): + transforms.RandomAffine([-90, 90], translate=[-1.0, 0.0, 1.0]) + + with pytest.raises(ValueError): + transforms.RandomAffine([-90, 90], translate=[0.2, 0.2], scale=[0.0]) + with pytest.raises(ValueError): + transforms.RandomAffine([-90, 90], translate=[0.2, 0.2], scale=[-1.0, 1.0]) + with pytest.raises(ValueError): + transforms.RandomAffine([-90, 90], translate=[0.2, 0.2], scale=[0.5, -0.5]) + with pytest.raises(ValueError): + transforms.RandomAffine([-90, 90], translate=[0.2, 0.2], scale=[0.5, 3.0, -0.5]) + + with pytest.raises(ValueError): + transforms.RandomAffine([-90, 90], translate=[0.2, 0.2], scale=[0.5, 0.5], shear=-7) + with pytest.raises(ValueError): + transforms.RandomAffine([-90, 90], translate=[0.2, 0.2], scale=[0.5, 0.5], shear=[-10]) + with pytest.raises(ValueError): + transforms.RandomAffine([-90, 90], translate=[0.2, 0.2], scale=[0.5, 0.5], shear=[-10, 0, 10]) + with pytest.raises(ValueError): + transforms.RandomAffine([-90, 90], translate=[0.2, 0.2], scale=[0.5, 0.5], shear=[-10, 0, 10, 0, 10]) + + # assert fill being either a Sequence or a Number + with pytest.raises(TypeError): + transforms.RandomAffine(0, fill={}) + + t = transforms.RandomAffine(0, fill=None) + assert t.fill == 0 + + x = np.zeros((100, 100, 3), dtype=np.uint8) + img = F.to_pil_image(x) + + t = transforms.RandomAffine(10, translate=[0.5, 0.3], scale=[0.7, 1.3], shear=[-10, 10, 20, 40]) + for _ in range(100): + angle, translations, scale, shear = t.get_params(t.degrees, t.translate, t.scale, t.shear, img_size=img.size) + assert -10 < angle < 10 + assert -img.size[0] * 0.5 <= translations[0] <= img.size[0] * 0.5 + assert -img.size[1] * 0.5 <= translations[1] <= img.size[1] * 0.5 + assert 0.7 < scale < 1.3 + assert -10 < shear[0] < 10 + assert -20 < shear[1] < 40 + + # Checking if RandomAffine can be printed as string + t.__repr__() + + t = transforms.RandomAffine(10, interpolation=transforms.InterpolationMode.BILINEAR) + assert "bilinear" in t.__repr__() + + t = transforms.RandomAffine(10, interpolation=Image.BILINEAR) + assert t.interpolation == transforms.InterpolationMode.BILINEAR + + +def test_elastic_transformation(): + with pytest.raises(TypeError, match=r"alpha should be float or a sequence of floats"): + transforms.ElasticTransform(alpha=True, sigma=2.0) + with pytest.raises(TypeError, match=r"alpha should be a sequence of floats"): + transforms.ElasticTransform(alpha=[1.0, True], sigma=2.0) + with pytest.raises(ValueError, match=r"alpha is a sequence its length should be 2"): + transforms.ElasticTransform(alpha=[1.0, 0.0, 1.0], sigma=2.0) + + with pytest.raises(TypeError, match=r"sigma should be float or a sequence of floats"): + transforms.ElasticTransform(alpha=2.0, sigma=True) + with pytest.raises(TypeError, match=r"sigma should be a sequence of floats"): + transforms.ElasticTransform(alpha=2.0, sigma=[1.0, True]) + with pytest.raises(ValueError, match=r"sigma is a sequence its length should be 2"): + transforms.ElasticTransform(alpha=2.0, sigma=[1.0, 0.0, 1.0]) + + t = transforms.transforms.ElasticTransform(alpha=2.0, sigma=2.0, interpolation=Image.BILINEAR) + assert t.interpolation == transforms.InterpolationMode.BILINEAR + + with pytest.raises(TypeError, match=r"fill should be int or float"): + transforms.ElasticTransform(alpha=1.0, sigma=1.0, fill={}) + + x = torch.randint(0, 256, (3, 32, 32), dtype=torch.uint8) + img = F.to_pil_image(x) + t = transforms.ElasticTransform(alpha=0.0, sigma=0.0) + transformed_img = t(img) + assert transformed_img == img + + # Smoke test on PIL images + t = transforms.ElasticTransform(alpha=0.5, sigma=0.23) + transformed_img = t(img) + assert isinstance(transformed_img, Image.Image) + + # Checking if ElasticTransform can be printed as string + t.__repr__() + + +def test_random_grayscale_with_grayscale_input(): + transform = transforms.RandomGrayscale(p=1.0) + + image_tensor = torch.randint(0, 256, (1, 16, 16), dtype=torch.uint8) + output_tensor = transform(image_tensor) + torch.testing.assert_close(output_tensor, image_tensor) + + image_pil = F.to_pil_image(image_tensor) + output_pil = transform(image_pil) + torch.testing.assert_close(F.pil_to_tensor(output_pil), image_tensor) + + +if __name__ == "__main__": + pytest.main([__file__]) diff --git a/test/test_transforms_tensor.py b/test/test_transforms_tensor.py index 0d5e365351db628dcb7f8d2e6b1fe87421463bc8..eac52dafc177494cc8dce8372406d687f70f4468 100644 --- a/test/test_transforms_tensor.py +++ b/test/test_transforms_tensor.py @@ -1,684 +1,892 @@ import os -import torch -from torchvision import transforms as T -from torchvision.transforms import functional as F -from torchvision.transforms import InterpolationMode +import sys import numpy as np +import PIL.Image +import pytest +import torch +from common_utils import ( + _assert_approx_equal_tensor_to_pil, + _assert_equal_tensor_to_pil, + _create_data, + _create_data_batch, + assert_equal, + cpu_and_cuda, + float_dtypes, + get_tmp_dir, + int_dtypes, +) +from torchvision import transforms as T +from torchvision.transforms import functional as F, InterpolationMode +from torchvision.transforms.autoaugment import _apply_op -import unittest -from typing import Sequence - -from common_utils import TransformsTester, get_tmp_dir, int_dtypes, float_dtypes -from _assert_utils import assert_equal - - -NEAREST, BILINEAR, BICUBIC = InterpolationMode.NEAREST, InterpolationMode.BILINEAR, InterpolationMode.BICUBIC - - -class Tester(TransformsTester): - - def setUp(self): - self.device = "cpu" - - def _test_functional_op(self, func, fn_kwargs, test_exact_match=True, **match_kwargs): - if fn_kwargs is None: - fn_kwargs = {} - - f = getattr(F, func) - tensor, pil_img = self._create_data(height=10, width=10, device=self.device) - transformed_tensor = f(tensor, **fn_kwargs) - transformed_pil_img = f(pil_img, **fn_kwargs) - if test_exact_match: - self.compareTensorToPIL(transformed_tensor, transformed_pil_img, **match_kwargs) - else: - self.approxEqualTensorToPIL(transformed_tensor, transformed_pil_img, **match_kwargs) - - def _test_transform_vs_scripted(self, transform, s_transform, tensor, msg=None): - torch.manual_seed(12) - out1 = transform(tensor) - torch.manual_seed(12) - out2 = s_transform(tensor) - assert_equal(out1, out2, msg=msg) - - def _test_transform_vs_scripted_on_batch(self, transform, s_transform, batch_tensors, msg=None): - torch.manual_seed(12) - transformed_batch = transform(batch_tensors) +NEAREST, NEAREST_EXACT, BILINEAR, BICUBIC = ( + InterpolationMode.NEAREST, + InterpolationMode.NEAREST_EXACT, + InterpolationMode.BILINEAR, + InterpolationMode.BICUBIC, +) - for i in range(len(batch_tensors)): - img_tensor = batch_tensors[i, ...] - torch.manual_seed(12) - transformed_img = transform(img_tensor) - assert_equal(transformed_img, transformed_batch[i, ...], msg=msg) - torch.manual_seed(12) - s_transformed_batch = s_transform(batch_tensors) - assert_equal(transformed_batch, s_transformed_batch, msg=msg) +def _test_transform_vs_scripted(transform, s_transform, tensor, msg=None): + torch.manual_seed(12) + out1 = transform(tensor) + torch.manual_seed(12) + out2 = s_transform(tensor) + assert_equal(out1, out2, msg=msg) - def _test_class_op(self, method, meth_kwargs=None, test_exact_match=True, **match_kwargs): - if meth_kwargs is None: - meth_kwargs = {} - # test for class interface - f = getattr(T, method)(**meth_kwargs) - scripted_fn = torch.jit.script(f) +def _test_transform_vs_scripted_on_batch(transform, s_transform, batch_tensors, msg=None): + torch.manual_seed(12) + transformed_batch = transform(batch_tensors) - tensor, pil_img = self._create_data(26, 34, device=self.device) - # set seed to reproduce the same transformation for tensor and PIL image + for i in range(len(batch_tensors)): + img_tensor = batch_tensors[i, ...] torch.manual_seed(12) - transformed_tensor = f(tensor) - torch.manual_seed(12) - transformed_pil_img = f(pil_img) - if test_exact_match: - self.compareTensorToPIL(transformed_tensor, transformed_pil_img, **match_kwargs) - else: - self.approxEqualTensorToPIL(transformed_tensor.float(), transformed_pil_img, **match_kwargs) - - torch.manual_seed(12) - transformed_tensor_script = scripted_fn(tensor) - assert_equal(transformed_tensor, transformed_tensor_script) - - batch_tensors = self._create_data_batch(height=23, width=34, channels=3, num_samples=4, device=self.device) - self._test_transform_vs_scripted_on_batch(f, scripted_fn, batch_tensors) - - with get_tmp_dir() as tmp_dir: - scripted_fn.save(os.path.join(tmp_dir, "t_{}.pt".format(method))) - - def _test_op(self, func, method, fn_kwargs=None, meth_kwargs=None, test_exact_match=True, **match_kwargs): - self._test_functional_op(func, fn_kwargs, test_exact_match=test_exact_match, **match_kwargs) - self._test_class_op(method, meth_kwargs, test_exact_match=test_exact_match, **match_kwargs) - - def test_random_horizontal_flip(self): - self._test_op('hflip', 'RandomHorizontalFlip') - - def test_random_vertical_flip(self): - self._test_op('vflip', 'RandomVerticalFlip') - - def test_random_invert(self): - self._test_op('invert', 'RandomInvert') - - def test_random_posterize(self): - fn_kwargs = meth_kwargs = {"bits": 4} - self._test_op( - 'posterize', 'RandomPosterize', fn_kwargs=fn_kwargs, meth_kwargs=meth_kwargs + transformed_img = transform(img_tensor) + assert_equal(transformed_img, transformed_batch[i, ...], msg=msg) + + torch.manual_seed(12) + s_transformed_batch = s_transform(batch_tensors) + assert_equal(transformed_batch, s_transformed_batch, msg=msg) + + +def _test_functional_op(f, device, channels=3, fn_kwargs=None, test_exact_match=True, **match_kwargs): + fn_kwargs = fn_kwargs or {} + + tensor, pil_img = _create_data(height=10, width=10, channels=channels, device=device) + transformed_tensor = f(tensor, **fn_kwargs) + transformed_pil_img = f(pil_img, **fn_kwargs) + if test_exact_match: + _assert_equal_tensor_to_pil(transformed_tensor, transformed_pil_img, **match_kwargs) + else: + _assert_approx_equal_tensor_to_pil(transformed_tensor, transformed_pil_img, **match_kwargs) + + +def _test_class_op(transform_cls, device, channels=3, meth_kwargs=None, test_exact_match=True, **match_kwargs): + meth_kwargs = meth_kwargs or {} + + # test for class interface + f = transform_cls(**meth_kwargs) + scripted_fn = torch.jit.script(f) + + tensor, pil_img = _create_data(26, 34, channels, device=device) + # set seed to reproduce the same transformation for tensor and PIL image + torch.manual_seed(12) + transformed_tensor = f(tensor) + torch.manual_seed(12) + transformed_pil_img = f(pil_img) + if test_exact_match: + _assert_equal_tensor_to_pil(transformed_tensor, transformed_pil_img, **match_kwargs) + else: + _assert_approx_equal_tensor_to_pil(transformed_tensor.float(), transformed_pil_img, **match_kwargs) + + torch.manual_seed(12) + transformed_tensor_script = scripted_fn(tensor) + assert_equal(transformed_tensor, transformed_tensor_script) + + batch_tensors = _create_data_batch(height=23, width=34, channels=channels, num_samples=4, device=device) + _test_transform_vs_scripted_on_batch(f, scripted_fn, batch_tensors) + + with get_tmp_dir() as tmp_dir: + scripted_fn.save(os.path.join(tmp_dir, f"t_{transform_cls.__name__}.pt")) + + +def _test_op(func, method, device, channels=3, fn_kwargs=None, meth_kwargs=None, test_exact_match=True, **match_kwargs): + _test_functional_op(func, device, channels, fn_kwargs, test_exact_match=test_exact_match, **match_kwargs) + _test_class_op(method, device, channels, meth_kwargs, test_exact_match=test_exact_match, **match_kwargs) + + +def _test_fn_save_load(fn, tmpdir): + scripted_fn = torch.jit.script(fn) + p = os.path.join(tmpdir, f"t_op_list_{getattr(fn, '__name__', fn.__class__.__name__)}.pt") + scripted_fn.save(p) + _ = torch.jit.load(p) + + +@pytest.mark.parametrize("device", cpu_and_cuda()) +@pytest.mark.parametrize( + "func,method,fn_kwargs,match_kwargs", + [ + (F.hflip, T.RandomHorizontalFlip, None, {}), + (F.vflip, T.RandomVerticalFlip, None, {}), + (F.invert, T.RandomInvert, None, {}), + (F.posterize, T.RandomPosterize, {"bits": 4}, {}), + (F.solarize, T.RandomSolarize, {"threshold": 192.0}, {}), + (F.adjust_sharpness, T.RandomAdjustSharpness, {"sharpness_factor": 2.0}, {}), + ( + F.autocontrast, + T.RandomAutocontrast, + None, + {"test_exact_match": False, "agg_method": "max", "tol": (1 + 1e-5), "allowed_percentage_diff": 0.05}, + ), + (F.equalize, T.RandomEqualize, None, {}), + ], +) +@pytest.mark.parametrize("channels", [1, 3]) +def test_random(func, method, device, channels, fn_kwargs, match_kwargs): + _test_op(func, method, device, channels, fn_kwargs, fn_kwargs, **match_kwargs) + + +@pytest.mark.parametrize("seed", range(10)) +@pytest.mark.parametrize("device", cpu_and_cuda()) +@pytest.mark.parametrize("channels", [1, 3]) +class TestColorJitter: + @pytest.fixture(autouse=True) + def set_random_seed(self, seed): + torch.random.manual_seed(seed) + + @pytest.mark.parametrize("brightness", [0.1, 0.5, 1.0, 1.34, (0.3, 0.7), [0.4, 0.5]]) + def test_color_jitter_brightness(self, brightness, device, channels): + tol = 1.0 + 1e-10 + meth_kwargs = {"brightness": brightness} + _test_class_op( + T.ColorJitter, + meth_kwargs=meth_kwargs, + test_exact_match=False, + device=device, + tol=tol, + agg_method="max", + channels=channels, ) - def test_random_solarize(self): - fn_kwargs = meth_kwargs = {"threshold": 192.0} - self._test_op( - 'solarize', 'RandomSolarize', fn_kwargs=fn_kwargs, meth_kwargs=meth_kwargs + @pytest.mark.parametrize("contrast", [0.2, 0.5, 1.0, 1.5, (0.3, 0.7), [0.4, 0.5]]) + def test_color_jitter_contrast(self, contrast, device, channels): + tol = 1.0 + 1e-10 + meth_kwargs = {"contrast": contrast} + _test_class_op( + T.ColorJitter, + meth_kwargs=meth_kwargs, + test_exact_match=False, + device=device, + tol=tol, + agg_method="max", + channels=channels, ) - def test_random_adjust_sharpness(self): - fn_kwargs = meth_kwargs = {"sharpness_factor": 2.0} - self._test_op( - 'adjust_sharpness', 'RandomAdjustSharpness', fn_kwargs=fn_kwargs, meth_kwargs=meth_kwargs + @pytest.mark.parametrize("saturation", [0.5, 0.75, 1.0, 1.25, (0.3, 0.7), [0.3, 0.4]]) + def test_color_jitter_saturation(self, saturation, device, channels): + tol = 1.0 + 1e-10 + meth_kwargs = {"saturation": saturation} + _test_class_op( + T.ColorJitter, + meth_kwargs=meth_kwargs, + test_exact_match=False, + device=device, + tol=tol, + agg_method="max", + channels=channels, ) - def test_random_autocontrast(self): - # We check the max abs difference because on some (very rare) pixels, the actual value may be different - # between PIL and tensors due to floating approximations. - self._test_op('autocontrast', 'RandomAutocontrast', test_exact_match=False, agg_method='max', - tol=(1 + 1e-5), allowed_percentage_diff=.05) - - def test_random_equalize(self): - self._test_op('equalize', 'RandomEqualize') - - def test_color_jitter(self): - - tol = 1.0 + 1e-10 - for f in [0.1, 0.5, 1.0, 1.34, (0.3, 0.7), [0.4, 0.5]]: - meth_kwargs = {"brightness": f} - self._test_class_op( - "ColorJitter", meth_kwargs=meth_kwargs, test_exact_match=False, tol=tol, agg_method="max" - ) - - for f in [0.2, 0.5, 1.0, 1.5, (0.3, 0.7), [0.4, 0.5]]: - meth_kwargs = {"contrast": f} - self._test_class_op( - "ColorJitter", meth_kwargs=meth_kwargs, test_exact_match=False, tol=tol, agg_method="max" - ) - - for f in [0.5, 0.75, 1.0, 1.25, (0.3, 0.7), [0.3, 0.4]]: - meth_kwargs = {"saturation": f} - self._test_class_op( - "ColorJitter", meth_kwargs=meth_kwargs, test_exact_match=False, tol=tol, agg_method="max" - ) - - for f in [0.2, 0.5, (-0.2, 0.3), [-0.4, 0.5]]: - meth_kwargs = {"hue": f} - self._test_class_op( - "ColorJitter", meth_kwargs=meth_kwargs, test_exact_match=False, tol=16.1, agg_method="max" - ) + @pytest.mark.parametrize("hue", [0.2, 0.5, (-0.2, 0.3), [-0.4, 0.5]]) + def test_color_jitter_hue(self, hue, device, channels): + meth_kwargs = {"hue": hue} + _test_class_op( + T.ColorJitter, + meth_kwargs=meth_kwargs, + test_exact_match=False, + device=device, + tol=16.1, + agg_method="max", + channels=channels, + ) + def test_color_jitter_all(self, device, channels): # All 4 parameters together meth_kwargs = {"brightness": 0.2, "contrast": 0.2, "saturation": 0.2, "hue": 0.2} - self._test_class_op( - "ColorJitter", meth_kwargs=meth_kwargs, test_exact_match=False, tol=12.1, agg_method="max" - ) - - def test_pad(self): - for m in ["constant", "edge", "reflect", "symmetric"]: - fill = 127 if m == "constant" else 0 - for mul in [1, -1]: - # Test functional.pad (PIL and Tensor) with padding as single int - self._test_functional_op( - "pad", fn_kwargs={"padding": mul * 2, "fill": fill, "padding_mode": m} - ) - # Test functional.pad and transforms.Pad with padding as [int, ] - fn_kwargs = meth_kwargs = {"padding": [mul * 2, ], "fill": fill, "padding_mode": m} - self._test_op( - "pad", "Pad", fn_kwargs=fn_kwargs, meth_kwargs=meth_kwargs - ) - # Test functional.pad and transforms.Pad with padding as list - fn_kwargs = meth_kwargs = {"padding": [mul * 4, 4], "fill": fill, "padding_mode": m} - self._test_op( - "pad", "Pad", fn_kwargs=fn_kwargs, meth_kwargs=meth_kwargs - ) - # Test functional.pad and transforms.Pad with padding as tuple - fn_kwargs = meth_kwargs = {"padding": (mul * 2, 2, 2, mul * 2), "fill": fill, "padding_mode": m} - self._test_op( - "pad", "Pad", fn_kwargs=fn_kwargs, meth_kwargs=meth_kwargs - ) - - def test_crop(self): - fn_kwargs = {"top": 2, "left": 3, "height": 4, "width": 5} - # Test transforms.RandomCrop with size and padding as tuple - meth_kwargs = {"size": (4, 5), "padding": (4, 4), "pad_if_needed": True, } - self._test_op( - 'crop', 'RandomCrop', fn_kwargs=fn_kwargs, meth_kwargs=meth_kwargs + _test_class_op( + T.ColorJitter, + meth_kwargs=meth_kwargs, + test_exact_match=False, + device=device, + tol=12.1, + agg_method="max", + channels=channels, ) - # Test transforms.functional.crop including outside the image area - fn_kwargs = {"top": -2, "left": 3, "height": 4, "width": 5} # top - self._test_functional_op('crop', fn_kwargs=fn_kwargs) - - fn_kwargs = {"top": 1, "left": -3, "height": 4, "width": 5} # left - self._test_functional_op('crop', fn_kwargs=fn_kwargs) - - fn_kwargs = {"top": 7, "left": 3, "height": 4, "width": 5} # bottom - self._test_functional_op('crop', fn_kwargs=fn_kwargs) - fn_kwargs = {"top": 3, "left": 8, "height": 4, "width": 5} # right - self._test_functional_op('crop', fn_kwargs=fn_kwargs) +@pytest.mark.parametrize("device", cpu_and_cuda()) +@pytest.mark.parametrize("m", ["constant", "edge", "reflect", "symmetric"]) +@pytest.mark.parametrize("mul", [1, -1]) +def test_pad(m, mul, device): + fill = 127 if m == "constant" else 0 + + # Test functional.pad (PIL and Tensor) with padding as single int + _test_functional_op(F.pad, fn_kwargs={"padding": mul * 2, "fill": fill, "padding_mode": m}, device=device) + # Test functional.pad and transforms.Pad with padding as [int, ] + fn_kwargs = meth_kwargs = { + "padding": [mul * 2], + "fill": fill, + "padding_mode": m, + } + _test_op(F.pad, T.Pad, device=device, fn_kwargs=fn_kwargs, meth_kwargs=meth_kwargs) + # Test functional.pad and transforms.Pad with padding as list + fn_kwargs = meth_kwargs = {"padding": [mul * 4, 4], "fill": fill, "padding_mode": m} + _test_op(F.pad, T.Pad, device=device, fn_kwargs=fn_kwargs, meth_kwargs=meth_kwargs) + # Test functional.pad and transforms.Pad with padding as tuple + fn_kwargs = meth_kwargs = {"padding": (mul * 2, 2, 2, mul * 2), "fill": fill, "padding_mode": m} + _test_op(F.pad, T.Pad, device=device, fn_kwargs=fn_kwargs, meth_kwargs=meth_kwargs) + + +@pytest.mark.parametrize("device", cpu_and_cuda()) +def test_crop(device): + fn_kwargs = {"top": 2, "left": 3, "height": 4, "width": 5} + # Test transforms.RandomCrop with size and padding as tuple + meth_kwargs = { + "size": (4, 5), + "padding": (4, 4), + "pad_if_needed": True, + } + _test_op(F.crop, T.RandomCrop, device=device, fn_kwargs=fn_kwargs, meth_kwargs=meth_kwargs) + + # Test transforms.functional.crop including outside the image area + fn_kwargs = {"top": -2, "left": 3, "height": 4, "width": 5} # top + _test_functional_op(F.crop, fn_kwargs=fn_kwargs, device=device) + + fn_kwargs = {"top": 1, "left": -3, "height": 4, "width": 5} # left + _test_functional_op(F.crop, fn_kwargs=fn_kwargs, device=device) + + fn_kwargs = {"top": 7, "left": 3, "height": 4, "width": 5} # bottom + _test_functional_op(F.crop, fn_kwargs=fn_kwargs, device=device) + + fn_kwargs = {"top": 3, "left": 8, "height": 4, "width": 5} # right + _test_functional_op(F.crop, fn_kwargs=fn_kwargs, device=device) + + fn_kwargs = {"top": -3, "left": -3, "height": 15, "width": 15} # all + _test_functional_op(F.crop, fn_kwargs=fn_kwargs, device=device) + + +@pytest.mark.parametrize("device", cpu_and_cuda()) +@pytest.mark.parametrize( + "padding_config", + [ + {"padding_mode": "constant", "fill": 0}, + {"padding_mode": "constant", "fill": 10}, + {"padding_mode": "edge"}, + {"padding_mode": "reflect"}, + ], +) +@pytest.mark.parametrize("pad_if_needed", [True, False]) +@pytest.mark.parametrize("padding", [[5], [5, 4], [1, 2, 3, 4]]) +@pytest.mark.parametrize("size", [5, [5], [6, 6]]) +def test_random_crop(size, padding, pad_if_needed, padding_config, device): + config = dict(padding_config) + config["size"] = size + config["padding"] = padding + config["pad_if_needed"] = pad_if_needed + _test_class_op(T.RandomCrop, device, meth_kwargs=config) + + +def test_random_crop_save_load(tmpdir): + fn = T.RandomCrop(32, [4], pad_if_needed=True) + _test_fn_save_load(fn, tmpdir) + + +@pytest.mark.parametrize("device", cpu_and_cuda()) +def test_center_crop(device, tmpdir): + fn_kwargs = {"output_size": (4, 5)} + meth_kwargs = {"size": (4, 5)} + _test_op(F.center_crop, T.CenterCrop, device=device, fn_kwargs=fn_kwargs, meth_kwargs=meth_kwargs) + fn_kwargs = {"output_size": (5,)} + meth_kwargs = {"size": (5,)} + _test_op(F.center_crop, T.CenterCrop, device=device, fn_kwargs=fn_kwargs, meth_kwargs=meth_kwargs) + tensor = torch.randint(0, 256, (3, 10, 10), dtype=torch.uint8, device=device) + # Test torchscript of transforms.CenterCrop with size as int + f = T.CenterCrop(size=5) + scripted_fn = torch.jit.script(f) + scripted_fn(tensor) + + # Test torchscript of transforms.CenterCrop with size as [int, ] + f = T.CenterCrop(size=[5]) + scripted_fn = torch.jit.script(f) + scripted_fn(tensor) + + # Test torchscript of transforms.CenterCrop with size as tuple + f = T.CenterCrop(size=(6, 6)) + scripted_fn = torch.jit.script(f) + scripted_fn(tensor) + + +def test_center_crop_save_load(tmpdir): + fn = T.CenterCrop(size=[5]) + _test_fn_save_load(fn, tmpdir) + + +@pytest.mark.parametrize("device", cpu_and_cuda()) +@pytest.mark.parametrize( + "fn, method, out_length", + [ + # test_five_crop + (F.five_crop, T.FiveCrop, 5), + # test_ten_crop + (F.ten_crop, T.TenCrop, 10), + ], +) +@pytest.mark.parametrize("size", [(5,), [5], (4, 5), [4, 5]]) +def test_x_crop(fn, method, out_length, size, device): + meth_kwargs = fn_kwargs = {"size": size} + scripted_fn = torch.jit.script(fn) + + tensor, pil_img = _create_data(height=20, width=20, device=device) + transformed_t_list = fn(tensor, **fn_kwargs) + transformed_p_list = fn(pil_img, **fn_kwargs) + assert len(transformed_t_list) == len(transformed_p_list) + assert len(transformed_t_list) == out_length + for transformed_tensor, transformed_pil_img in zip(transformed_t_list, transformed_p_list): + _assert_equal_tensor_to_pil(transformed_tensor, transformed_pil_img) + + transformed_t_list_script = scripted_fn(tensor.detach().clone(), **fn_kwargs) + assert len(transformed_t_list) == len(transformed_t_list_script) + assert len(transformed_t_list_script) == out_length + for transformed_tensor, transformed_tensor_script in zip(transformed_t_list, transformed_t_list_script): + assert_equal(transformed_tensor, transformed_tensor_script) - fn_kwargs = {"top": -3, "left": -3, "height": 15, "width": 15} # all - self._test_functional_op('crop', fn_kwargs=fn_kwargs) + # test for class interface + fn = method(**meth_kwargs) + scripted_fn = torch.jit.script(fn) + output = scripted_fn(tensor) + assert len(output) == len(transformed_t_list_script) - sizes = [5, [5, ], [6, 6]] - padding_configs = [ - {"padding_mode": "constant", "fill": 0}, - {"padding_mode": "constant", "fill": 10}, - {"padding_mode": "constant", "fill": 20}, - {"padding_mode": "edge"}, - {"padding_mode": "reflect"}, - ] + # test on batch of tensors + batch_tensors = _create_data_batch(height=23, width=34, channels=3, num_samples=4, device=device) + torch.manual_seed(12) + transformed_batch_list = fn(batch_tensors) - for size in sizes: - for padding_config in padding_configs: - config = dict(padding_config) - config["size"] = size - self._test_class_op("RandomCrop", config) - - def test_center_crop(self): - fn_kwargs = {"output_size": (4, 5)} - meth_kwargs = {"size": (4, 5), } - self._test_op( - "center_crop", "CenterCrop", fn_kwargs=fn_kwargs, meth_kwargs=meth_kwargs - ) - fn_kwargs = {"output_size": (5,)} - meth_kwargs = {"size": (5, )} - self._test_op( - "center_crop", "CenterCrop", fn_kwargs=fn_kwargs, meth_kwargs=meth_kwargs - ) - tensor = torch.randint(0, 256, (3, 10, 10), dtype=torch.uint8, device=self.device) - # Test torchscript of transforms.CenterCrop with size as int - f = T.CenterCrop(size=5) - scripted_fn = torch.jit.script(f) - scripted_fn(tensor) - - # Test torchscript of transforms.CenterCrop with size as [int, ] - f = T.CenterCrop(size=[5, ]) - scripted_fn = torch.jit.script(f) - scripted_fn(tensor) - - # Test torchscript of transforms.CenterCrop with size as tuple - f = T.CenterCrop(size=(6, 6)) - scripted_fn = torch.jit.script(f) - scripted_fn(tensor) - - with get_tmp_dir() as tmp_dir: - scripted_fn.save(os.path.join(tmp_dir, "t_center_crop.pt")) - - def _test_op_list_output(self, func, method, out_length, fn_kwargs=None, meth_kwargs=None): - if fn_kwargs is None: - fn_kwargs = {} - if meth_kwargs is None: - meth_kwargs = {} - - fn = getattr(F, func) - scripted_fn = torch.jit.script(fn) - - tensor, pil_img = self._create_data(height=20, width=20, device=self.device) - transformed_t_list = fn(tensor, **fn_kwargs) - transformed_p_list = fn(pil_img, **fn_kwargs) - self.assertEqual(len(transformed_t_list), len(transformed_p_list)) - self.assertEqual(len(transformed_t_list), out_length) - for transformed_tensor, transformed_pil_img in zip(transformed_t_list, transformed_p_list): - self.compareTensorToPIL(transformed_tensor, transformed_pil_img) - - transformed_t_list_script = scripted_fn(tensor.detach().clone(), **fn_kwargs) - self.assertEqual(len(transformed_t_list), len(transformed_t_list_script)) - self.assertEqual(len(transformed_t_list_script), out_length) - for transformed_tensor, transformed_tensor_script in zip(transformed_t_list, transformed_t_list_script): - assert_equal( - transformed_tensor, - transformed_tensor_script, - msg="{} vs {}".format(transformed_tensor, transformed_tensor_script), - ) - - # test for class interface - fn = getattr(T, method)(**meth_kwargs) - scripted_fn = torch.jit.script(fn) - output = scripted_fn(tensor) - self.assertEqual(len(output), len(transformed_t_list_script)) - - # test on batch of tensors - batch_tensors = self._create_data_batch(height=23, width=34, channels=3, num_samples=4, device=self.device) + for i in range(len(batch_tensors)): + img_tensor = batch_tensors[i, ...] torch.manual_seed(12) - transformed_batch_list = fn(batch_tensors) - - for i in range(len(batch_tensors)): - img_tensor = batch_tensors[i, ...] - torch.manual_seed(12) - transformed_img_list = fn(img_tensor) - for transformed_img, transformed_batch in zip(transformed_img_list, transformed_batch_list): - assert_equal( - transformed_img, - transformed_batch[i, ...], - msg="{} vs {}".format(transformed_img, transformed_batch[i, ...]), - ) - - with get_tmp_dir() as tmp_dir: - scripted_fn.save(os.path.join(tmp_dir, "t_op_list_{}.pt".format(method))) - - def test_five_crop(self): - fn_kwargs = meth_kwargs = {"size": (5,)} - self._test_op_list_output( - "five_crop", "FiveCrop", out_length=5, fn_kwargs=fn_kwargs, meth_kwargs=meth_kwargs - ) - fn_kwargs = meth_kwargs = {"size": [5, ]} - self._test_op_list_output( - "five_crop", "FiveCrop", out_length=5, fn_kwargs=fn_kwargs, meth_kwargs=meth_kwargs - ) - fn_kwargs = meth_kwargs = {"size": (4, 5)} - self._test_op_list_output( - "five_crop", "FiveCrop", out_length=5, fn_kwargs=fn_kwargs, meth_kwargs=meth_kwargs - ) - fn_kwargs = meth_kwargs = {"size": [4, 5]} - self._test_op_list_output( - "five_crop", "FiveCrop", out_length=5, fn_kwargs=fn_kwargs, meth_kwargs=meth_kwargs - ) + transformed_img_list = fn(img_tensor) + for transformed_img, transformed_batch in zip(transformed_img_list, transformed_batch_list): + assert_equal(transformed_img, transformed_batch[i, ...]) - def test_ten_crop(self): - fn_kwargs = meth_kwargs = {"size": (5,)} - self._test_op_list_output( - "ten_crop", "TenCrop", out_length=10, fn_kwargs=fn_kwargs, meth_kwargs=meth_kwargs - ) - fn_kwargs = meth_kwargs = {"size": [5, ]} - self._test_op_list_output( - "ten_crop", "TenCrop", out_length=10, fn_kwargs=fn_kwargs, meth_kwargs=meth_kwargs - ) - fn_kwargs = meth_kwargs = {"size": (4, 5)} - self._test_op_list_output( - "ten_crop", "TenCrop", out_length=10, fn_kwargs=fn_kwargs, meth_kwargs=meth_kwargs - ) - fn_kwargs = meth_kwargs = {"size": [4, 5]} - self._test_op_list_output( - "ten_crop", "TenCrop", out_length=10, fn_kwargs=fn_kwargs, meth_kwargs=meth_kwargs - ) - def test_resize(self): +@pytest.mark.parametrize("method", ["FiveCrop", "TenCrop"]) +def test_x_crop_save_load(method, tmpdir): + fn = getattr(T, method)(size=[5]) + _test_fn_save_load(fn, tmpdir) + +class TestResize: + @pytest.mark.parametrize("size", [32, 34, 35, 36, 38]) + def test_resize_int(self, size): # TODO: Minimal check for bug-fix, improve this later x = torch.rand(3, 32, 46) - t = T.Resize(size=38) + t = T.Resize(size=size, antialias=True) y = t(x) # If size is an int, smaller edge of the image will be matched to this number. # i.e, if height > width, then image will be rescaled to (size * height / width, size). - self.assertTrue(isinstance(y, torch.Tensor)) - self.assertEqual(y.shape[1], 38) - self.assertEqual(y.shape[2], int(38 * 46 / 32)) - - tensor, _ = self._create_data(height=34, width=36, device=self.device) - batch_tensors = torch.randint(0, 256, size=(4, 3, 44, 56), dtype=torch.uint8, device=self.device) - - for dt in [None, torch.float32, torch.float64]: - if dt is not None: - # This is a trivial cast to float of uint8 data to test all cases - tensor = tensor.to(dt) - for size in [32, 34, [32, ], [32, 32], (32, 32), [34, 35]]: - for max_size in (None, 35, 1000): - if max_size is not None and isinstance(size, Sequence) and len(size) != 1: - continue # Not supported - for interpolation in [BILINEAR, BICUBIC, NEAREST]: - - if isinstance(size, int): - script_size = [size, ] - else: - script_size = size - - transform = T.Resize(size=script_size, interpolation=interpolation, max_size=max_size) - s_transform = torch.jit.script(transform) - self._test_transform_vs_scripted(transform, s_transform, tensor) - self._test_transform_vs_scripted_on_batch(transform, s_transform, batch_tensors) - - with get_tmp_dir() as tmp_dir: - s_transform.save(os.path.join(tmp_dir, "t_resize.pt")) - - def test_resized_crop(self): - tensor = torch.randint(0, 256, size=(3, 44, 56), dtype=torch.uint8, device=self.device) - batch_tensors = torch.randint(0, 256, size=(4, 3, 44, 56), dtype=torch.uint8, device=self.device) - - for scale in [(0.7, 1.2), [0.7, 1.2]]: - for ratio in [(0.75, 1.333), [0.75, 1.333]]: - for size in [(32, ), [44, ], [32, ], [32, 32], (32, 32), [44, 55]]: - for interpolation in [NEAREST, BILINEAR, BICUBIC]: - transform = T.RandomResizedCrop( - size=size, scale=scale, ratio=ratio, interpolation=interpolation - ) - s_transform = torch.jit.script(transform) - self._test_transform_vs_scripted(transform, s_transform, tensor) - self._test_transform_vs_scripted_on_batch(transform, s_transform, batch_tensors) - - with get_tmp_dir() as tmp_dir: - s_transform.save(os.path.join(tmp_dir, "t_resized_crop.pt")) - - def test_random_affine(self): - tensor = torch.randint(0, 256, size=(3, 44, 56), dtype=torch.uint8, device=self.device) - batch_tensors = torch.randint(0, 256, size=(4, 3, 44, 56), dtype=torch.uint8, device=self.device) - - for shear in [15, 10.0, (5.0, 10.0), [-15, 15], [-10.0, 10.0, -11.0, 11.0]]: - for scale in [(0.7, 1.2), [0.7, 1.2]]: - for translate in [(0.1, 0.2), [0.2, 0.1]]: - for degrees in [45, 35.0, (-45, 45), [-90.0, 90.0]]: - for interpolation in [NEAREST, BILINEAR]: - for fill in [85, (10, -10, 10), 0.7, [0.0, 0.0, 0.0], [1, ], 1]: - transform = T.RandomAffine( - degrees=degrees, translate=translate, - scale=scale, shear=shear, interpolation=interpolation, fill=fill - ) - s_transform = torch.jit.script(transform) - - self._test_transform_vs_scripted(transform, s_transform, tensor) - self._test_transform_vs_scripted_on_batch(transform, s_transform, batch_tensors) - - with get_tmp_dir() as tmp_dir: - s_transform.save(os.path.join(tmp_dir, "t_random_affine.pt")) - - def test_random_rotate(self): - tensor = torch.randint(0, 256, size=(3, 44, 56), dtype=torch.uint8, device=self.device) - batch_tensors = torch.randint(0, 256, size=(4, 3, 44, 56), dtype=torch.uint8, device=self.device) - - for center in [(0, 0), [10, 10], None, (56, 44)]: - for expand in [True, False]: - for degrees in [45, 35.0, (-45, 45), [-90.0, 90.0]]: - for interpolation in [NEAREST, BILINEAR]: - for fill in [85, (10, -10, 10), 0.7, [0.0, 0.0, 0.0], [1, ], 1]: - transform = T.RandomRotation( - degrees=degrees, interpolation=interpolation, expand=expand, center=center, fill=fill - ) - s_transform = torch.jit.script(transform) - - self._test_transform_vs_scripted(transform, s_transform, tensor) - self._test_transform_vs_scripted_on_batch(transform, s_transform, batch_tensors) - - with get_tmp_dir() as tmp_dir: - s_transform.save(os.path.join(tmp_dir, "t_random_rotate.pt")) - - def test_random_perspective(self): - tensor = torch.randint(0, 256, size=(3, 44, 56), dtype=torch.uint8, device=self.device) - batch_tensors = torch.randint(0, 256, size=(4, 3, 44, 56), dtype=torch.uint8, device=self.device) - - for distortion_scale in np.linspace(0.1, 1.0, num=20): - for interpolation in [NEAREST, BILINEAR]: - for fill in [85, (10, -10, 10), 0.7, [0.0, 0.0, 0.0], [1, ], 1]: - transform = T.RandomPerspective( - distortion_scale=distortion_scale, - interpolation=interpolation, - fill=fill - ) - s_transform = torch.jit.script(transform) - - self._test_transform_vs_scripted(transform, s_transform, tensor) - self._test_transform_vs_scripted_on_batch(transform, s_transform, batch_tensors) - - with get_tmp_dir() as tmp_dir: - s_transform.save(os.path.join(tmp_dir, "t_perspective.pt")) - - def test_to_grayscale(self): - - meth_kwargs = {"num_output_channels": 1} - tol = 1.0 + 1e-10 - self._test_class_op( - "Grayscale", meth_kwargs=meth_kwargs, test_exact_match=False, tol=tol, agg_method="max" + assert isinstance(y, torch.Tensor) + assert y.shape[1] == size + assert y.shape[2] == int(size * 46 / 32) + + @pytest.mark.parametrize("device", cpu_and_cuda()) + @pytest.mark.parametrize("dt", [None, torch.float32, torch.float64]) + @pytest.mark.parametrize("size", [[32], [32, 32], (32, 32), [34, 35]]) + @pytest.mark.parametrize("max_size", [None, 35, 1000]) + @pytest.mark.parametrize("interpolation", [BILINEAR, BICUBIC, NEAREST, NEAREST_EXACT]) + def test_resize_scripted(self, dt, size, max_size, interpolation, device): + tensor, _ = _create_data(height=34, width=36, device=device) + batch_tensors = torch.randint(0, 256, size=(4, 3, 44, 56), dtype=torch.uint8, device=device) + + if dt is not None: + # This is a trivial cast to float of uint8 data to test all cases + tensor = tensor.to(dt) + if max_size is not None and len(size) != 1: + pytest.skip("Size should be an int or a sequence of length 1 if max_size is specified") + + transform = T.Resize(size=size, interpolation=interpolation, max_size=max_size, antialias=True) + s_transform = torch.jit.script(transform) + _test_transform_vs_scripted(transform, s_transform, tensor) + _test_transform_vs_scripted_on_batch(transform, s_transform, batch_tensors) + + def test_resize_save_load(self, tmpdir): + fn = T.Resize(size=[32], antialias=True) + _test_fn_save_load(fn, tmpdir) + + @pytest.mark.parametrize("device", cpu_and_cuda()) + @pytest.mark.parametrize("scale", [(0.7, 1.2), [0.7, 1.2]]) + @pytest.mark.parametrize("ratio", [(0.75, 1.333), [0.75, 1.333]]) + @pytest.mark.parametrize("size", [(32,), [44], [32], [32, 32], (32, 32), [44, 55]]) + @pytest.mark.parametrize("interpolation", [NEAREST, BILINEAR, BICUBIC, NEAREST_EXACT]) + @pytest.mark.parametrize("antialias", [None, True, False]) + def test_resized_crop(self, scale, ratio, size, interpolation, antialias, device): + + if antialias and interpolation in {NEAREST, NEAREST_EXACT}: + pytest.skip(f"Can not resize if interpolation mode is {interpolation} and antialias=True") + + tensor = torch.randint(0, 256, size=(3, 44, 56), dtype=torch.uint8, device=device) + batch_tensors = torch.randint(0, 256, size=(4, 3, 44, 56), dtype=torch.uint8, device=device) + transform = T.RandomResizedCrop( + size=size, scale=scale, ratio=ratio, interpolation=interpolation, antialias=antialias ) + s_transform = torch.jit.script(transform) + _test_transform_vs_scripted(transform, s_transform, tensor) + _test_transform_vs_scripted_on_batch(transform, s_transform, batch_tensors) - meth_kwargs = {"num_output_channels": 3} - self._test_class_op( - "Grayscale", meth_kwargs=meth_kwargs, test_exact_match=False, tol=tol, agg_method="max" - ) + def test_resized_crop_save_load(self, tmpdir): + fn = T.RandomResizedCrop(size=[32], antialias=True) + _test_fn_save_load(fn, tmpdir) - meth_kwargs = {} - self._test_class_op( - "RandomGrayscale", meth_kwargs=meth_kwargs, test_exact_match=False, tol=tol, agg_method="max" - ) - def test_normalize(self): - fn = T.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)) - tensor, _ = self._create_data(26, 34, device=self.device) +def _test_random_affine_helper(device, **kwargs): + tensor = torch.randint(0, 256, size=(3, 44, 56), dtype=torch.uint8, device=device) + batch_tensors = torch.randint(0, 256, size=(4, 3, 44, 56), dtype=torch.uint8, device=device) + transform = T.RandomAffine(**kwargs) + s_transform = torch.jit.script(transform) - with self.assertRaisesRegex(TypeError, r"Input tensor should be a float tensor"): - fn(tensor) + _test_transform_vs_scripted(transform, s_transform, tensor) + _test_transform_vs_scripted_on_batch(transform, s_transform, batch_tensors) - batch_tensors = torch.rand(4, 3, 44, 56, device=self.device) - tensor = tensor.to(dtype=torch.float32) / 255.0 - # test for class interface - scripted_fn = torch.jit.script(fn) - self._test_transform_vs_scripted(fn, scripted_fn, tensor) - self._test_transform_vs_scripted_on_batch(fn, scripted_fn, batch_tensors) +def test_random_affine_save_load(tmpdir): + fn = T.RandomAffine(degrees=45.0) + _test_fn_save_load(fn, tmpdir) - with get_tmp_dir() as tmp_dir: - scripted_fn.save(os.path.join(tmp_dir, "t_norm.pt")) - def test_linear_transformation(self): - c, h, w = 3, 24, 32 +@pytest.mark.parametrize("device", cpu_and_cuda()) +@pytest.mark.parametrize("interpolation", [NEAREST, BILINEAR]) +@pytest.mark.parametrize("shear", [15, 10.0, (5.0, 10.0), [-15, 15], [-10.0, 10.0, -11.0, 11.0]]) +def test_random_affine_shear(device, interpolation, shear): + _test_random_affine_helper(device, degrees=0.0, interpolation=interpolation, shear=shear) - tensor, _ = self._create_data(h, w, channels=c, device=self.device) - matrix = torch.rand(c * h * w, c * h * w, device=self.device) - mean_vector = torch.rand(c * h * w, device=self.device) +@pytest.mark.parametrize("device", cpu_and_cuda()) +@pytest.mark.parametrize("interpolation", [NEAREST, BILINEAR]) +@pytest.mark.parametrize("scale", [(0.7, 1.2), [0.7, 1.2]]) +def test_random_affine_scale(device, interpolation, scale): + _test_random_affine_helper(device, degrees=0.0, interpolation=interpolation, scale=scale) - fn = T.LinearTransformation(matrix, mean_vector) - scripted_fn = torch.jit.script(fn) - self._test_transform_vs_scripted(fn, scripted_fn, tensor) +@pytest.mark.parametrize("device", cpu_and_cuda()) +@pytest.mark.parametrize("interpolation", [NEAREST, BILINEAR]) +@pytest.mark.parametrize("translate", [(0.1, 0.2), [0.2, 0.1]]) +def test_random_affine_translate(device, interpolation, translate): + _test_random_affine_helper(device, degrees=0.0, interpolation=interpolation, translate=translate) - batch_tensors = torch.rand(4, c, h, w, device=self.device) - # We skip some tests from _test_transform_vs_scripted_on_batch as - # results for scripted and non-scripted transformations are not exactly the same - torch.manual_seed(12) - transformed_batch = fn(batch_tensors) - torch.manual_seed(12) - s_transformed_batch = scripted_fn(batch_tensors) - assert_equal(transformed_batch, s_transformed_batch) - with get_tmp_dir() as tmp_dir: - scripted_fn.save(os.path.join(tmp_dir, "t_norm.pt")) +@pytest.mark.parametrize("device", cpu_and_cuda()) +@pytest.mark.parametrize("interpolation", [NEAREST, BILINEAR]) +@pytest.mark.parametrize("degrees", [45, 35.0, (-45, 45), [-90.0, 90.0]]) +def test_random_affine_degrees(device, interpolation, degrees): + _test_random_affine_helper(device, degrees=degrees, interpolation=interpolation) - def test_compose(self): - tensor, _ = self._create_data(26, 34, device=self.device) - tensor = tensor.to(dtype=torch.float32) / 255.0 - transforms = T.Compose([ - T.CenterCrop(10), - T.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225)), - ]) - s_transforms = torch.nn.Sequential(*transforms.transforms) +@pytest.mark.parametrize("device", cpu_and_cuda()) +@pytest.mark.parametrize("interpolation", [NEAREST, BILINEAR]) +@pytest.mark.parametrize("fill", [85, (10, -10, 10), 0.7, [0.0, 0.0, 0.0], [1], 1]) +def test_random_affine_fill(device, interpolation, fill): + _test_random_affine_helper(device, degrees=0.0, interpolation=interpolation, fill=fill) - scripted_fn = torch.jit.script(s_transforms) - torch.manual_seed(12) - transformed_tensor = transforms(tensor) - torch.manual_seed(12) - transformed_tensor_script = scripted_fn(tensor) - assert_equal(transformed_tensor, transformed_tensor_script, msg="{}".format(transforms)) - t = T.Compose([ - lambda x: x, - ]) - with self.assertRaisesRegex(RuntimeError, r"Could not get name of python class object"): - torch.jit.script(t) - - def test_random_apply(self): - tensor, _ = self._create_data(26, 34, device=self.device) - tensor = tensor.to(dtype=torch.float32) / 255.0 - - transforms = T.RandomApply([ - T.RandomHorizontalFlip(), - T.ColorJitter(), - ], p=0.4) - s_transforms = T.RandomApply(torch.nn.ModuleList([ - T.RandomHorizontalFlip(), - T.ColorJitter(), - ]), p=0.4) +@pytest.mark.parametrize("device", cpu_and_cuda()) +@pytest.mark.parametrize("center", [(0, 0), [10, 10], None, (56, 44)]) +@pytest.mark.parametrize("expand", [True, False]) +@pytest.mark.parametrize("degrees", [45, 35.0, (-45, 45), [-90.0, 90.0]]) +@pytest.mark.parametrize("interpolation", [NEAREST, BILINEAR]) +@pytest.mark.parametrize("fill", [85, (10, -10, 10), 0.7, [0.0, 0.0, 0.0], [1], 1]) +def test_random_rotate(device, center, expand, degrees, interpolation, fill): + tensor = torch.randint(0, 256, size=(3, 44, 56), dtype=torch.uint8, device=device) + batch_tensors = torch.randint(0, 256, size=(4, 3, 44, 56), dtype=torch.uint8, device=device) - scripted_fn = torch.jit.script(s_transforms) - torch.manual_seed(12) - transformed_tensor = transforms(tensor) - torch.manual_seed(12) - transformed_tensor_script = scripted_fn(tensor) - assert_equal(transformed_tensor, transformed_tensor_script, msg="{}".format(transforms)) + transform = T.RandomRotation(degrees=degrees, interpolation=interpolation, expand=expand, center=center, fill=fill) + s_transform = torch.jit.script(transform) - if torch.device(self.device).type == "cpu": - # Can't check this twice, otherwise - # "Can't redefine method: forward on class: __torch__.torchvision.transforms.transforms.RandomApply" - transforms = T.RandomApply([ - T.ColorJitter(), - ], p=0.3) - with self.assertRaisesRegex(RuntimeError, r"Module 'RandomApply' has no attribute 'transforms'"): - torch.jit.script(transforms) + _test_transform_vs_scripted(transform, s_transform, tensor) + _test_transform_vs_scripted_on_batch(transform, s_transform, batch_tensors) - def test_gaussian_blur(self): - tol = 1.0 + 1e-10 - self._test_class_op( - "GaussianBlur", meth_kwargs={"kernel_size": 3, "sigma": 0.75}, - test_exact_match=False, agg_method="max", tol=tol - ) - self._test_class_op( - "GaussianBlur", meth_kwargs={"kernel_size": 23, "sigma": [0.1, 2.0]}, - test_exact_match=False, agg_method="max", tol=tol - ) +def test_random_rotate_save_load(tmpdir): + fn = T.RandomRotation(degrees=45.0) + _test_fn_save_load(fn, tmpdir) - self._test_class_op( - "GaussianBlur", meth_kwargs={"kernel_size": 23, "sigma": (0.1, 2.0)}, - test_exact_match=False, agg_method="max", tol=tol - ) - self._test_class_op( - "GaussianBlur", meth_kwargs={"kernel_size": [3, 3], "sigma": (1.0, 1.0)}, - test_exact_match=False, agg_method="max", tol=tol - ) +@pytest.mark.parametrize("device", cpu_and_cuda()) +@pytest.mark.parametrize("distortion_scale", np.linspace(0.1, 1.0, num=20)) +@pytest.mark.parametrize("interpolation", [NEAREST, BILINEAR]) +@pytest.mark.parametrize("fill", [85, (10, -10, 10), 0.7, [0.0, 0.0, 0.0], [1], 1]) +def test_random_perspective(device, distortion_scale, interpolation, fill): + tensor = torch.randint(0, 256, size=(3, 44, 56), dtype=torch.uint8, device=device) + batch_tensors = torch.randint(0, 256, size=(4, 3, 44, 56), dtype=torch.uint8, device=device) - self._test_class_op( - "GaussianBlur", meth_kwargs={"kernel_size": (3, 3), "sigma": (0.1, 2.0)}, - test_exact_match=False, agg_method="max", tol=tol - ) + transform = T.RandomPerspective(distortion_scale=distortion_scale, interpolation=interpolation, fill=fill) + s_transform = torch.jit.script(transform) - self._test_class_op( - "GaussianBlur", meth_kwargs={"kernel_size": [23], "sigma": 0.75}, - test_exact_match=False, agg_method="max", tol=tol - ) + _test_transform_vs_scripted(transform, s_transform, tensor) + _test_transform_vs_scripted_on_batch(transform, s_transform, batch_tensors) - def test_random_erasing(self): - img = torch.rand(3, 60, 60) - # Test Set 0: invalid value - random_erasing = T.RandomErasing(value=(0.1, 0.2, 0.3, 0.4), p=1.0) - with self.assertRaises(ValueError, msg="If value is a sequence, it should have either a single value or 3"): - random_erasing(img) +def test_random_perspective_save_load(tmpdir): + fn = T.RandomPerspective() + _test_fn_save_load(fn, tmpdir) - tensor, _ = self._create_data(24, 32, channels=3, device=self.device) - batch_tensors = torch.rand(4, 3, 44, 56, device=self.device) - test_configs = [ - {"value": 0.2}, - {"value": "random"}, - {"value": (0.2, 0.2, 0.2)}, - {"value": "random", "ratio": (0.1, 0.2)}, - ] +@pytest.mark.parametrize("device", cpu_and_cuda()) +@pytest.mark.parametrize( + "Klass, meth_kwargs", + [(T.Grayscale, {"num_output_channels": 1}), (T.Grayscale, {"num_output_channels": 3}), (T.RandomGrayscale, {})], +) +def test_to_grayscale(device, Klass, meth_kwargs): + tol = 1.0 + 1e-10 + _test_class_op(Klass, meth_kwargs=meth_kwargs, test_exact_match=False, device=device, tol=tol, agg_method="max") - for config in test_configs: - fn = T.RandomErasing(**config) - scripted_fn = torch.jit.script(fn) - self._test_transform_vs_scripted(fn, scripted_fn, tensor) - self._test_transform_vs_scripted_on_batch(fn, scripted_fn, batch_tensors) - with get_tmp_dir() as tmp_dir: - scripted_fn.save(os.path.join(tmp_dir, "t_random_erasing.pt")) +@pytest.mark.parametrize("device", cpu_and_cuda()) +@pytest.mark.parametrize("in_dtype", int_dtypes() + float_dtypes()) +@pytest.mark.parametrize("out_dtype", int_dtypes() + float_dtypes()) +def test_convert_image_dtype(device, in_dtype, out_dtype): + tensor, _ = _create_data(26, 34, device=device) + batch_tensors = torch.rand(4, 3, 44, 56, device=device) - def test_convert_image_dtype(self): - tensor, _ = self._create_data(26, 34, device=self.device) - batch_tensors = torch.rand(4, 3, 44, 56, device=self.device) + in_tensor = tensor.to(in_dtype) + in_batch_tensors = batch_tensors.to(in_dtype) - for in_dtype in int_dtypes() + float_dtypes(): - in_tensor = tensor.to(in_dtype) - in_batch_tensors = batch_tensors.to(in_dtype) - for out_dtype in int_dtypes() + float_dtypes(): + fn = T.ConvertImageDtype(dtype=out_dtype) + scripted_fn = torch.jit.script(fn) - fn = T.ConvertImageDtype(dtype=out_dtype) - scripted_fn = torch.jit.script(fn) + if (in_dtype == torch.float32 and out_dtype in (torch.int32, torch.int64)) or ( + in_dtype == torch.float64 and out_dtype == torch.int64 + ): + with pytest.raises(RuntimeError, match=r"cannot be performed safely"): + _test_transform_vs_scripted(fn, scripted_fn, in_tensor) + with pytest.raises(RuntimeError, match=r"cannot be performed safely"): + _test_transform_vs_scripted_on_batch(fn, scripted_fn, in_batch_tensors) + return - if (in_dtype == torch.float32 and out_dtype in (torch.int32, torch.int64)) or \ - (in_dtype == torch.float64 and out_dtype == torch.int64): - with self.assertRaisesRegex(RuntimeError, r"cannot be performed safely"): - self._test_transform_vs_scripted(fn, scripted_fn, in_tensor) - with self.assertRaisesRegex(RuntimeError, r"cannot be performed safely"): - self._test_transform_vs_scripted_on_batch(fn, scripted_fn, in_batch_tensors) - continue + _test_transform_vs_scripted(fn, scripted_fn, in_tensor) + _test_transform_vs_scripted_on_batch(fn, scripted_fn, in_batch_tensors) - self._test_transform_vs_scripted(fn, scripted_fn, in_tensor) - self._test_transform_vs_scripted_on_batch(fn, scripted_fn, in_batch_tensors) - with get_tmp_dir() as tmp_dir: - scripted_fn.save(os.path.join(tmp_dir, "t_convert_dtype.pt")) +def test_convert_image_dtype_save_load(tmpdir): + fn = T.ConvertImageDtype(dtype=torch.uint8) + _test_fn_save_load(fn, tmpdir) + + +@pytest.mark.parametrize("device", cpu_and_cuda()) +@pytest.mark.parametrize("policy", [policy for policy in T.AutoAugmentPolicy]) +@pytest.mark.parametrize("fill", [None, 85, (10, -10, 10), 0.7, [0.0, 0.0, 0.0], [1], 1]) +def test_autoaugment(device, policy, fill): + tensor = torch.randint(0, 256, size=(3, 44, 56), dtype=torch.uint8, device=device) + batch_tensors = torch.randint(0, 256, size=(4, 3, 44, 56), dtype=torch.uint8, device=device) + + transform = T.AutoAugment(policy=policy, fill=fill) + s_transform = torch.jit.script(transform) + for _ in range(25): + _test_transform_vs_scripted(transform, s_transform, tensor) + _test_transform_vs_scripted_on_batch(transform, s_transform, batch_tensors) + + +@pytest.mark.parametrize("device", cpu_and_cuda()) +@pytest.mark.parametrize("num_ops", [1, 2, 3]) +@pytest.mark.parametrize("magnitude", [7, 9, 11]) +@pytest.mark.parametrize("fill", [None, 85, (10, -10, 10), 0.7, [0.0, 0.0, 0.0], [1], 1]) +def test_randaugment(device, num_ops, magnitude, fill): + tensor = torch.randint(0, 256, size=(3, 44, 56), dtype=torch.uint8, device=device) + batch_tensors = torch.randint(0, 256, size=(4, 3, 44, 56), dtype=torch.uint8, device=device) + + transform = T.RandAugment(num_ops=num_ops, magnitude=magnitude, fill=fill) + s_transform = torch.jit.script(transform) + for _ in range(25): + _test_transform_vs_scripted(transform, s_transform, tensor) + _test_transform_vs_scripted_on_batch(transform, s_transform, batch_tensors) + + +@pytest.mark.parametrize("device", cpu_and_cuda()) +@pytest.mark.parametrize("fill", [None, 85, (10, -10, 10), 0.7, [0.0, 0.0, 0.0], [1], 1]) +def test_trivialaugmentwide(device, fill): + tensor = torch.randint(0, 256, size=(3, 44, 56), dtype=torch.uint8, device=device) + batch_tensors = torch.randint(0, 256, size=(4, 3, 44, 56), dtype=torch.uint8, device=device) + + transform = T.TrivialAugmentWide(fill=fill) + s_transform = torch.jit.script(transform) + for _ in range(25): + _test_transform_vs_scripted(transform, s_transform, tensor) + _test_transform_vs_scripted_on_batch(transform, s_transform, batch_tensors) + + +@pytest.mark.parametrize("device", cpu_and_cuda()) +@pytest.mark.parametrize("fill", [None, 85, (10, -10, 10), 0.7, [0.0, 0.0, 0.0], [1], 1]) +def test_augmix(device, fill): + tensor = torch.randint(0, 256, size=(3, 44, 56), dtype=torch.uint8, device=device) + batch_tensors = torch.randint(0, 256, size=(4, 3, 44, 56), dtype=torch.uint8, device=device) + + class DeterministicAugMix(T.AugMix): + def _sample_dirichlet(self, params: torch.Tensor) -> torch.Tensor: + # patch the method to ensure that the order of rand calls doesn't affect the outcome + return params.softmax(dim=-1) + + transform = DeterministicAugMix(fill=fill) + s_transform = torch.jit.script(transform) + for _ in range(25): + _test_transform_vs_scripted(transform, s_transform, tensor) + _test_transform_vs_scripted_on_batch(transform, s_transform, batch_tensors) + + +@pytest.mark.parametrize("augmentation", [T.AutoAugment, T.RandAugment, T.TrivialAugmentWide, T.AugMix]) +def test_autoaugment_save_load(augmentation, tmpdir): + fn = augmentation() + _test_fn_save_load(fn, tmpdir) + + +@pytest.mark.parametrize("interpolation", [F.InterpolationMode.NEAREST, F.InterpolationMode.BILINEAR]) +@pytest.mark.parametrize("mode", ["X", "Y"]) +def test_autoaugment__op_apply_shear(interpolation, mode): + # We check that torchvision's implementation of shear is equivalent + # to official CIFAR10 autoaugment implementation: + # https://github.com/tensorflow/models/blob/885fda091c46c59d6c7bb5c7e760935eacc229da/research/autoaugment/augmentation_transforms.py#L273-L290 + image_size = 32 + + def shear(pil_img, level, mode, resample): + if mode == "X": + matrix = (1, level, 0, 0, 1, 0) + elif mode == "Y": + matrix = (1, 0, 0, level, 1, 0) + return pil_img.transform((image_size, image_size), PIL.Image.AFFINE, matrix, resample=resample) + + t_img, pil_img = _create_data(image_size, image_size) + + resample_pil = { + F.InterpolationMode.NEAREST: PIL.Image.NEAREST, + F.InterpolationMode.BILINEAR: PIL.Image.BILINEAR, + }[interpolation] + + level = 0.3 + expected_out = shear(pil_img, level, mode=mode, resample=resample_pil) - def test_autoaugment(self): - tensor = torch.randint(0, 256, size=(3, 44, 56), dtype=torch.uint8, device=self.device) - batch_tensors = torch.randint(0, 256, size=(4, 3, 44, 56), dtype=torch.uint8, device=self.device) + # Check pil output vs expected pil + out = _apply_op(pil_img, op_name=f"Shear{mode}", magnitude=level, interpolation=interpolation, fill=0) + assert out == expected_out + + if interpolation == F.InterpolationMode.BILINEAR: + # We skip bilinear mode for tensors as + # affine transformation results are not exactly the same + # between tensors and pil images + # MAE as around 1.40 + # Max Abs error can be 163 or 170 + return + + # Check tensor output vs expected pil + out = _apply_op(t_img, op_name=f"Shear{mode}", magnitude=level, interpolation=interpolation, fill=0) + _assert_approx_equal_tensor_to_pil(out, expected_out) + + +@pytest.mark.parametrize("device", cpu_and_cuda()) +@pytest.mark.parametrize( + "config", + [ + {}, + {"value": 1}, + {"value": 0.2}, + {"value": "random"}, + {"value": (1, 1, 1)}, + {"value": (0.2, 0.2, 0.2)}, + {"value": [1, 1, 1]}, + {"value": [0.2, 0.2, 0.2]}, + {"value": "random", "ratio": (0.1, 0.2)}, + ], +) +def test_random_erasing(device, config): + tensor, _ = _create_data(24, 32, channels=3, device=device) + batch_tensors = torch.rand(4, 3, 44, 56, device=device) + + fn = T.RandomErasing(**config) + scripted_fn = torch.jit.script(fn) + _test_transform_vs_scripted(fn, scripted_fn, tensor) + _test_transform_vs_scripted_on_batch(fn, scripted_fn, batch_tensors) + + +def test_random_erasing_save_load(tmpdir): + fn = T.RandomErasing(value=0.2) + _test_fn_save_load(fn, tmpdir) + + +def test_random_erasing_with_invalid_data(): + img = torch.rand(3, 60, 60) + # Test Set 0: invalid value + random_erasing = T.RandomErasing(value=(0.1, 0.2, 0.3, 0.4), p=1.0) + with pytest.raises(ValueError, match="If value is a sequence, it should have either a single value or 3"): + random_erasing(img) + + +@pytest.mark.parametrize("device", cpu_and_cuda()) +def test_normalize(device, tmpdir): + fn = T.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)) + tensor, _ = _create_data(26, 34, device=device) + + with pytest.raises(TypeError, match="Input tensor should be a float tensor"): + fn(tensor) + + batch_tensors = torch.rand(4, 3, 44, 56, device=device) + tensor = tensor.to(dtype=torch.float32) / 255.0 + # test for class interface + scripted_fn = torch.jit.script(fn) - s_transform = None - for policy in T.AutoAugmentPolicy: - for fill in [None, 85, (10, -10, 10), 0.7, [0.0, 0.0, 0.0], [1, ], 1]: - transform = T.AutoAugment(policy=policy, fill=fill) - s_transform = torch.jit.script(transform) - for _ in range(100): - self._test_transform_vs_scripted(transform, s_transform, tensor) - self._test_transform_vs_scripted_on_batch(transform, s_transform, batch_tensors) + _test_transform_vs_scripted(fn, scripted_fn, tensor) + _test_transform_vs_scripted_on_batch(fn, scripted_fn, batch_tensors) + + scripted_fn.save(os.path.join(tmpdir, "t_norm.pt")) + + +@pytest.mark.parametrize("device", cpu_and_cuda()) +def test_linear_transformation(device, tmpdir): + c, h, w = 3, 24, 32 + + tensor, _ = _create_data(h, w, channels=c, device=device) + + matrix = torch.rand(c * h * w, c * h * w, device=device) + mean_vector = torch.rand(c * h * w, device=device) + + fn = T.LinearTransformation(matrix, mean_vector) + scripted_fn = torch.jit.script(fn) + + _test_transform_vs_scripted(fn, scripted_fn, tensor) - if s_transform is not None: - with get_tmp_dir() as tmp_dir: - s_transform.save(os.path.join(tmp_dir, "t_autoaugment.pt")) + batch_tensors = torch.rand(4, c, h, w, device=device) + # We skip some tests from _test_transform_vs_scripted_on_batch as + # results for scripted and non-scripted transformations are not exactly the same + torch.manual_seed(12) + transformed_batch = fn(batch_tensors) + torch.manual_seed(12) + s_transformed_batch = scripted_fn(batch_tensors) + assert_equal(transformed_batch, s_transformed_batch) + + scripted_fn.save(os.path.join(tmpdir, "t_norm.pt")) -@unittest.skipIf(not torch.cuda.is_available(), reason="Skip if no CUDA device") -class CUDATester(Tester): +@pytest.mark.parametrize("device", cpu_and_cuda()) +def test_compose(device): + tensor, _ = _create_data(26, 34, device=device) + tensor = tensor.to(dtype=torch.float32) / 255.0 + transforms = T.Compose( + [ + T.CenterCrop(10), + T.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225)), + ] + ) + s_transforms = torch.nn.Sequential(*transforms.transforms) + + scripted_fn = torch.jit.script(s_transforms) + torch.manual_seed(12) + transformed_tensor = transforms(tensor) + torch.manual_seed(12) + transformed_tensor_script = scripted_fn(tensor) + assert_equal(transformed_tensor, transformed_tensor_script, msg=f"{transforms}") + + t = T.Compose( + [ + lambda x: x, + ] + ) + with pytest.raises(RuntimeError, match="cannot call a value of type 'Tensor'"): + torch.jit.script(t) - def setUp(self): - torch.set_deterministic(False) - self.device = "cuda" +@pytest.mark.parametrize("device", cpu_and_cuda()) +def test_random_apply(device): + tensor, _ = _create_data(26, 34, device=device) + tensor = tensor.to(dtype=torch.float32) / 255.0 -if __name__ == '__main__': - unittest.main() + transforms = T.RandomApply( + [ + T.RandomHorizontalFlip(), + T.ColorJitter(), + ], + p=0.4, + ) + s_transforms = T.RandomApply( + torch.nn.ModuleList( + [ + T.RandomHorizontalFlip(), + T.ColorJitter(), + ] + ), + p=0.4, + ) + + scripted_fn = torch.jit.script(s_transforms) + torch.manual_seed(12) + transformed_tensor = transforms(tensor) + torch.manual_seed(12) + transformed_tensor_script = scripted_fn(tensor) + assert_equal(transformed_tensor, transformed_tensor_script, msg=f"{transforms}") + + if device == "cpu": + # Can't check this twice, otherwise + # "Can't redefine method: forward on class: __torch__.torchvision.transforms.transforms.RandomApply" + transforms = T.RandomApply( + [ + T.ColorJitter(), + ], + p=0.3, + ) + with pytest.raises(RuntimeError, match="Module 'RandomApply' has no attribute 'transforms'"): + torch.jit.script(transforms) + + +@pytest.mark.parametrize("device", cpu_and_cuda()) +@pytest.mark.parametrize( + "meth_kwargs", + [ + {"kernel_size": 3, "sigma": 0.75}, + {"kernel_size": 23, "sigma": [0.1, 2.0]}, + {"kernel_size": 23, "sigma": (0.1, 2.0)}, + {"kernel_size": [3, 3], "sigma": (1.0, 1.0)}, + {"kernel_size": (3, 3), "sigma": (0.1, 2.0)}, + {"kernel_size": [23], "sigma": 0.75}, + ], +) +@pytest.mark.parametrize("channels", [1, 3]) +def test_gaussian_blur(device, channels, meth_kwargs): + if all( + [ + device == "cuda", + channels == 1, + meth_kwargs["kernel_size"] in [23, [23]], + torch.version.cuda == "11.3", + sys.platform in ("win32", "cygwin"), + ] + ): + pytest.skip("Fails on Windows, see https://github.com/pytorch/vision/issues/5464") + + tol = 1.0 + 1e-10 + torch.manual_seed(12) + _test_class_op( + T.GaussianBlur, + meth_kwargs=meth_kwargs, + channels=channels, + test_exact_match=False, + device=device, + agg_method="max", + tol=tol, + ) + + +@pytest.mark.parametrize("device", cpu_and_cuda()) +@pytest.mark.parametrize( + "fill", + [ + 1, + 1.0, + [1], + [1.0], + (1,), + (1.0,), + [1, 2, 3], + [1.0, 2.0, 3.0], + (1, 2, 3), + (1.0, 2.0, 3.0), + ], +) +@pytest.mark.parametrize("channels", [1, 3]) +def test_elastic_transform(device, channels, fill): + if isinstance(fill, (list, tuple)) and len(fill) > 1 and channels == 1: + # For this the test would correctly fail, since the number of channels in the image does not match `fill`. + # Thus, this is not an issue in the transform, but rather a problem of parametrization that just gives the + # product of `fill` and `channels`. + return + + _test_class_op( + T.ElasticTransform, + meth_kwargs=dict(fill=fill), + channels=channels, + device=device, + ) diff --git a/test/test_transforms_v2.py b/test/test_transforms_v2.py new file mode 100644 index 0000000000000000000000000000000000000000..07e3d75df6da2818fe8a828f802e741908d386f4 --- /dev/null +++ b/test/test_transforms_v2.py @@ -0,0 +1,6147 @@ +import contextlib +import decimal +import functools +import inspect +import itertools +import math +import pickle +import random +import re +import sys +from copy import deepcopy +from pathlib import Path +from unittest import mock + +import numpy as np +import PIL.Image +import pytest + +import torch +import torchvision.ops +import torchvision.transforms.v2 as transforms + +from common_utils import ( + assert_equal, + cache, + cpu_and_cuda, + freeze_rng_state, + ignore_jit_no_profile_information_warning, + make_bounding_boxes, + make_detection_masks, + make_image, + make_image_pil, + make_image_tensor, + make_segmentation_mask, + make_video, + make_video_tensor, + needs_cuda, + set_rng_seed, +) + +from torch import nn +from torch.testing import assert_close +from torch.utils._pytree import tree_flatten, tree_map +from torch.utils.data import DataLoader, default_collate +from torchvision import tv_tensors +from torchvision.ops.boxes import box_iou + +from torchvision.transforms._functional_tensor import _max_value as get_max_value +from torchvision.transforms.functional import pil_modes_mapping, to_pil_image +from torchvision.transforms.v2 import functional as F +from torchvision.transforms.v2._utils import check_type, is_pure_tensor +from torchvision.transforms.v2.functional._geometry import _get_perspective_coeffs +from torchvision.transforms.v2.functional._utils import _get_kernel, _register_kernel_internal + + +# turns all warnings into errors for this module +pytestmark = [pytest.mark.filterwarnings("error")] + +if sys.version_info[:2] >= (3, 12): + # torchscript relies on some AST stuff that got deprecated in 3.12, + # so we have to explicitly ignore those otherwise we'd error on warnings due to the pytestmark filter above. + pytestmark.append(pytest.mark.filterwarnings("ignore::DeprecationWarning")) + + +@pytest.fixture(autouse=True) +def fix_rng_seed(): + set_rng_seed(0) + yield + + +def _to_tolerances(maybe_tolerance_dict): + if not isinstance(maybe_tolerance_dict, dict): + return dict(rtol=None, atol=None) + + tolerances = dict(rtol=0, atol=0) + tolerances.update(maybe_tolerance_dict) + return tolerances + + +def _check_kernel_cuda_vs_cpu(kernel, input, *args, rtol, atol, **kwargs): + """Checks if the kernel produces closes results for inputs on GPU and CPU.""" + if input.device.type != "cuda": + return + + input_cuda = input.as_subclass(torch.Tensor) + input_cpu = input_cuda.to("cpu") + + with freeze_rng_state(): + actual = kernel(input_cuda, *args, **kwargs) + with freeze_rng_state(): + expected = kernel(input_cpu, *args, **kwargs) + + assert_close(actual, expected, check_device=False, rtol=rtol, atol=atol) + + +@cache +def _script(obj): + try: + return torch.jit.script(obj) + except Exception as error: + name = getattr(obj, "__name__", obj.__class__.__name__) + raise AssertionError(f"Trying to `torch.jit.script` `{name}` raised the error above.") from error + + +def _check_kernel_scripted_vs_eager(kernel, input, *args, rtol, atol, **kwargs): + """Checks if the kernel is scriptable and if the scripted output is close to the eager one.""" + if input.device.type != "cpu": + return + + kernel_scripted = _script(kernel) + + input = input.as_subclass(torch.Tensor) + with ignore_jit_no_profile_information_warning(): + with freeze_rng_state(): + actual = kernel_scripted(input, *args, **kwargs) + with freeze_rng_state(): + expected = kernel(input, *args, **kwargs) + + assert_close(actual, expected, rtol=rtol, atol=atol) + + +def _check_kernel_batched_vs_unbatched(kernel, input, *args, rtol, atol, **kwargs): + """Checks if the kernel produces close results for batched and unbatched inputs.""" + unbatched_input = input.as_subclass(torch.Tensor) + + for batch_dims in [(2,), (2, 1)]: + repeats = [*batch_dims, *[1] * input.ndim] + + actual = kernel(unbatched_input.repeat(repeats), *args, **kwargs) + + expected = kernel(unbatched_input, *args, **kwargs) + # We can't directly call `.repeat()` on the output, since some kernel also return some additional metadata + if isinstance(expected, torch.Tensor): + expected = expected.repeat(repeats) + else: + tensor, *metadata = expected + expected = (tensor.repeat(repeats), *metadata) + + assert_close(actual, expected, rtol=rtol, atol=atol) + + for degenerate_batch_dims in [(0,), (5, 0), (0, 5)]: + degenerate_batched_input = torch.empty( + degenerate_batch_dims + input.shape, dtype=input.dtype, device=input.device + ) + + output = kernel(degenerate_batched_input, *args, **kwargs) + # Most kernels just return a tensor, but some also return some additional metadata + if not isinstance(output, torch.Tensor): + output, *_ = output + + assert output.shape[: -input.ndim] == degenerate_batch_dims + + +def check_kernel( + kernel, + input, + *args, + check_cuda_vs_cpu=True, + check_scripted_vs_eager=True, + check_batched_vs_unbatched=True, + **kwargs, +): + initial_input_version = input._version + + output = kernel(input.as_subclass(torch.Tensor), *args, **kwargs) + # Most kernels just return a tensor, but some also return some additional metadata + if not isinstance(output, torch.Tensor): + output, *_ = output + + # check that no inplace operation happened + assert input._version == initial_input_version + + if kernel not in {F.to_dtype_image, F.to_dtype_video}: + assert output.dtype == input.dtype + assert output.device == input.device + + if check_cuda_vs_cpu: + _check_kernel_cuda_vs_cpu(kernel, input, *args, **kwargs, **_to_tolerances(check_cuda_vs_cpu)) + + if check_scripted_vs_eager: + _check_kernel_scripted_vs_eager(kernel, input, *args, **kwargs, **_to_tolerances(check_scripted_vs_eager)) + + if check_batched_vs_unbatched: + _check_kernel_batched_vs_unbatched(kernel, input, *args, **kwargs, **_to_tolerances(check_batched_vs_unbatched)) + + +def _check_functional_scripted_smoke(functional, input, *args, **kwargs): + """Checks if the functional can be scripted and the scripted version can be called without error.""" + if not isinstance(input, tv_tensors.Image): + return + + functional_scripted = _script(functional) + with ignore_jit_no_profile_information_warning(): + functional_scripted(input.as_subclass(torch.Tensor), *args, **kwargs) + + +def check_functional(functional, input, *args, check_scripted_smoke=True, **kwargs): + unknown_input = object() + with pytest.raises(TypeError, match=re.escape(str(type(unknown_input)))): + functional(unknown_input, *args, **kwargs) + + with mock.patch("torch._C._log_api_usage_once", wraps=torch._C._log_api_usage_once) as spy: + output = functional(input, *args, **kwargs) + + spy.assert_any_call(f"{functional.__module__}.{functional.__name__}") + + assert isinstance(output, type(input)) + + if isinstance(input, tv_tensors.BoundingBoxes) and functional is not F.convert_bounding_box_format: + assert output.format == input.format + + if check_scripted_smoke: + _check_functional_scripted_smoke(functional, input, *args, **kwargs) + + +def check_functional_kernel_signature_match(functional, *, kernel, input_type): + """Checks if the signature of the functional matches the kernel signature.""" + functional_params = list(inspect.signature(functional).parameters.values())[1:] + kernel_params = list(inspect.signature(kernel).parameters.values())[1:] + + if issubclass(input_type, tv_tensors.TVTensor): + # We filter out metadata that is implicitly passed to the functional through the input tv_tensor, but has to be + # explicitly passed to the kernel. + explicit_metadata = { + tv_tensors.BoundingBoxes: {"format", "canvas_size"}, + } + kernel_params = [param for param in kernel_params if param.name not in explicit_metadata.get(input_type, set())] + + functional_params = iter(functional_params) + for functional_param, kernel_param in zip(functional_params, kernel_params): + try: + # In general, the functional parameters are a superset of the kernel parameters. Thus, we filter out + # functional parameters that have no kernel equivalent while keeping the order intact. + while functional_param.name != kernel_param.name: + functional_param = next(functional_params) + except StopIteration: + raise AssertionError( + f"Parameter `{kernel_param.name}` of kernel `{kernel.__name__}` " + f"has no corresponding parameter on the functional `{functional.__name__}`." + ) from None + + if issubclass(input_type, PIL.Image.Image): + # PIL kernels often have more correct annotations, since they are not limited by JIT. Thus, we don't check + # them in the first place. + functional_param._annotation = kernel_param._annotation = inspect.Parameter.empty + + assert functional_param == kernel_param + + +def _check_transform_v1_compatibility(transform, input, *, rtol, atol): + """If the transform defines the ``_v1_transform_cls`` attribute, checks if the transform has a public, static + ``get_params`` method that is the v1 equivalent, the output is close to v1, is scriptable, and the scripted version + can be called without error.""" + if not (type(input) is torch.Tensor or isinstance(input, PIL.Image.Image)): + return + + v1_transform_cls = transform._v1_transform_cls + if v1_transform_cls is None: + return + + if hasattr(v1_transform_cls, "get_params"): + assert type(transform).get_params is v1_transform_cls.get_params + + v1_transform = v1_transform_cls(**transform._extract_params_for_v1_transform()) + + with freeze_rng_state(): + output_v2 = transform(input) + + with freeze_rng_state(): + output_v1 = v1_transform(input) + + assert_close(F.to_image(output_v2), F.to_image(output_v1), rtol=rtol, atol=atol) + + if isinstance(input, PIL.Image.Image): + return + + _script(v1_transform)(input) + + +def _make_transform_sample(transform, *, image_or_video, adapter): + device = image_or_video.device if isinstance(image_or_video, torch.Tensor) else "cpu" + size = F.get_size(image_or_video) + input = dict( + image_or_video=image_or_video, + image_tv_tensor=make_image(size, device=device), + video_tv_tensor=make_video(size, device=device), + image_pil=make_image_pil(size), + bounding_boxes_xyxy=make_bounding_boxes(size, format=tv_tensors.BoundingBoxFormat.XYXY, device=device), + bounding_boxes_xywh=make_bounding_boxes(size, format=tv_tensors.BoundingBoxFormat.XYWH, device=device), + bounding_boxes_cxcywh=make_bounding_boxes(size, format=tv_tensors.BoundingBoxFormat.CXCYWH, device=device), + bounding_boxes_degenerate_xyxy=tv_tensors.BoundingBoxes( + [ + [0, 0, 0, 0], # no height or width + [0, 0, 0, 1], # no height + [0, 0, 1, 0], # no width + [2, 0, 1, 1], # x1 > x2, y1 < y2 + [0, 2, 1, 1], # x1 < x2, y1 > y2 + [2, 2, 1, 1], # x1 > x2, y1 > y2 + ], + format=tv_tensors.BoundingBoxFormat.XYXY, + canvas_size=size, + device=device, + ), + bounding_boxes_degenerate_xywh=tv_tensors.BoundingBoxes( + [ + [0, 0, 0, 0], # no height or width + [0, 0, 0, 1], # no height + [0, 0, 1, 0], # no width + [0, 0, 1, -1], # negative height + [0, 0, -1, 1], # negative width + [0, 0, -1, -1], # negative height and width + ], + format=tv_tensors.BoundingBoxFormat.XYWH, + canvas_size=size, + device=device, + ), + bounding_boxes_degenerate_cxcywh=tv_tensors.BoundingBoxes( + [ + [0, 0, 0, 0], # no height or width + [0, 0, 0, 1], # no height + [0, 0, 1, 0], # no width + [0, 0, 1, -1], # negative height + [0, 0, -1, 1], # negative width + [0, 0, -1, -1], # negative height and width + ], + format=tv_tensors.BoundingBoxFormat.CXCYWH, + canvas_size=size, + device=device, + ), + detection_mask=make_detection_masks(size, device=device), + segmentation_mask=make_segmentation_mask(size, device=device), + int=0, + float=0.0, + bool=True, + none=None, + str="str", + path=Path.cwd(), + object=object(), + tensor=torch.empty(5), + array=np.empty(5), + ) + if adapter is not None: + input = adapter(transform, input, device) + return input + + +def _check_transform_sample_input_smoke(transform, input, *, adapter): + # This is a bunch of input / output convention checks, using a big sample with different parts as input. + + if not check_type(input, (is_pure_tensor, PIL.Image.Image, tv_tensors.Image, tv_tensors.Video)): + return + + sample = _make_transform_sample( + # adapter might change transform inplace + transform=transform if adapter is None else deepcopy(transform), + image_or_video=input, + adapter=adapter, + ) + for container_type in [dict, list, tuple]: + if container_type is dict: + input = sample + else: + input = container_type(sample.values()) + + input_flat, input_spec = tree_flatten(input) + + with freeze_rng_state(): + torch.manual_seed(0) + output = transform(input) + output_flat, output_spec = tree_flatten(output) + + assert output_spec == input_spec + + for output_item, input_item, should_be_transformed in zip( + output_flat, input_flat, transforms.Transform()._needs_transform_list(input_flat) + ): + if should_be_transformed: + assert type(output_item) is type(input_item) + else: + assert output_item is input_item + + # Enforce that the transform does not turn a degenerate bounding box, e.g. marked by RandomIoUCrop (or any other + # future transform that does this), back into a valid one. + for degenerate_bounding_boxes in ( + bounding_box + for name, bounding_box in sample.items() + if "degenerate" in name and isinstance(bounding_box, tv_tensors.BoundingBoxes) + ): + sample = dict( + boxes=degenerate_bounding_boxes, + labels=torch.randint(10, (degenerate_bounding_boxes.shape[0],), device=degenerate_bounding_boxes.device), + ) + assert transforms.SanitizeBoundingBoxes()(sample)["boxes"].shape == (0, 4) + + +def check_transform(transform, input, check_v1_compatibility=True, check_sample_input=True): + pickle.loads(pickle.dumps(transform)) + + output = transform(input) + assert isinstance(output, type(input)) + + if isinstance(input, tv_tensors.BoundingBoxes) and not isinstance(transform, transforms.ConvertBoundingBoxFormat): + assert output.format == input.format + + if check_sample_input: + _check_transform_sample_input_smoke( + transform, input, adapter=check_sample_input if callable(check_sample_input) else None + ) + + if check_v1_compatibility: + _check_transform_v1_compatibility(transform, input, **_to_tolerances(check_v1_compatibility)) + + return output + + +def transform_cls_to_functional(transform_cls, **transform_specific_kwargs): + def wrapper(input, *args, **kwargs): + transform = transform_cls(*args, **transform_specific_kwargs, **kwargs) + return transform(input) + + wrapper.__name__ = transform_cls.__name__ + + return wrapper + + +def param_value_parametrization(**kwargs): + """Helper function to turn + + @pytest.mark.parametrize( + ("param", "value"), + ("a", 1), + ("a", 2), + ("a", 3), + ("b", -1.0) + ("b", 1.0) + ) + + into + + @param_value_parametrization(a=[1, 2, 3], b=[-1.0, 1.0]) + """ + return pytest.mark.parametrize( + ("param", "value"), + [(param, value) for param, values in kwargs.items() for value in values], + ) + + +def adapt_fill(value, *, dtype): + """Adapt fill values in the range [0.0, 1.0] to the value range of the dtype""" + if value is None: + return value + + max_value = get_max_value(dtype) + value_type = float if dtype.is_floating_point else int + + if isinstance(value, (int, float)): + return value_type(value * max_value) + elif isinstance(value, (list, tuple)): + return type(value)(value_type(v * max_value) for v in value) + else: + raise ValueError(f"fill should be an int or float, or a list or tuple of the former, but got '{value}'.") + + +EXHAUSTIVE_TYPE_FILLS = [ + None, + 1, + 0.5, + [1], + [0.2], + (0,), + (0.7,), + [1, 0, 1], + [0.1, 0.2, 0.3], + (0, 1, 0), + (0.9, 0.234, 0.314), +] +CORRECTNESS_FILLS = [ + v for v in EXHAUSTIVE_TYPE_FILLS if v is None or isinstance(v, float) or (isinstance(v, list) and len(v) > 1) +] + + +# We cannot use `list(transforms.InterpolationMode)` here, since it includes some PIL-only ones as well +INTERPOLATION_MODES = [ + transforms.InterpolationMode.NEAREST, + transforms.InterpolationMode.NEAREST_EXACT, + transforms.InterpolationMode.BILINEAR, + transforms.InterpolationMode.BICUBIC, +] + + +def reference_affine_bounding_boxes_helper(bounding_boxes, *, affine_matrix, new_canvas_size=None, clamp=True): + format = bounding_boxes.format + canvas_size = new_canvas_size or bounding_boxes.canvas_size + + def affine_bounding_boxes(bounding_boxes): + dtype = bounding_boxes.dtype + device = bounding_boxes.device + + # Go to float before converting to prevent precision loss in case of CXCYWH -> XYXY and W or H is 1 + input_xyxy = F.convert_bounding_box_format( + bounding_boxes.to(dtype=torch.float64, device="cpu", copy=True), + old_format=format, + new_format=tv_tensors.BoundingBoxFormat.XYXY, + inplace=True, + ) + x1, y1, x2, y2 = input_xyxy.squeeze(0).tolist() + + points = np.array( + [ + [x1, y1, 1.0], + [x2, y1, 1.0], + [x1, y2, 1.0], + [x2, y2, 1.0], + ] + ) + transformed_points = np.matmul(points, affine_matrix.astype(points.dtype).T) + + output_xyxy = torch.Tensor( + [ + float(np.min(transformed_points[:, 0])), + float(np.min(transformed_points[:, 1])), + float(np.max(transformed_points[:, 0])), + float(np.max(transformed_points[:, 1])), + ] + ) + + output = F.convert_bounding_box_format( + output_xyxy, old_format=tv_tensors.BoundingBoxFormat.XYXY, new_format=format + ) + + if clamp: + # It is important to clamp before casting, especially for CXCYWH format, dtype=int64 + output = F.clamp_bounding_boxes( + output, + format=format, + canvas_size=canvas_size, + ) + else: + # We leave the bounding box as float64 so the caller gets the full precision to perform any additional + # operation + dtype = output.dtype + + return output.to(dtype=dtype, device=device) + + return tv_tensors.BoundingBoxes( + torch.cat([affine_bounding_boxes(b) for b in bounding_boxes.reshape(-1, 4).unbind()], dim=0).reshape( + bounding_boxes.shape + ), + format=format, + canvas_size=canvas_size, + ) + + +class TestResize: + INPUT_SIZE = (17, 11) + OUTPUT_SIZES = [17, [17], (17,), None, [12, 13], (12, 13)] + + def _make_max_size_kwarg(self, *, use_max_size, size): + if size is None: + max_size = min(list(self.INPUT_SIZE)) + elif use_max_size: + if not (isinstance(size, int) or len(size) == 1): + # This would result in an `ValueError` + return None + + max_size = (size if isinstance(size, int) else size[0]) + 1 + else: + max_size = None + + return dict(max_size=max_size) + + def _compute_output_size(self, *, input_size, size, max_size): + if size is None: + size = max_size + + elif not (isinstance(size, int) or len(size) == 1): + return tuple(size) + + elif not isinstance(size, int): + size = size[0] + + old_height, old_width = input_size + ratio = old_width / old_height + if ratio > 1: + new_height = size + new_width = int(ratio * new_height) + else: + new_width = size + new_height = int(new_width / ratio) + + if max_size is not None and max(new_height, new_width) > max_size: + # Need to recompute the aspect ratio, since it might have changed due to rounding + ratio = new_width / new_height + if ratio > 1: + new_width = max_size + new_height = int(new_width / ratio) + else: + new_height = max_size + new_width = int(new_height * ratio) + + return new_height, new_width + + @pytest.mark.parametrize("size", OUTPUT_SIZES) + @pytest.mark.parametrize("interpolation", INTERPOLATION_MODES) + @pytest.mark.parametrize("use_max_size", [True, False]) + @pytest.mark.parametrize("antialias", [True, False]) + @pytest.mark.parametrize("dtype", [torch.float32, torch.uint8]) + @pytest.mark.parametrize("device", cpu_and_cuda()) + def test_kernel_image(self, size, interpolation, use_max_size, antialias, dtype, device): + if not (max_size_kwarg := self._make_max_size_kwarg(use_max_size=use_max_size, size=size)): + return + + # In contrast to CPU, there is no native `InterpolationMode.BICUBIC` implementation for uint8 images on CUDA. + # Internally, it uses the float path. Thus, we need to test with an enormous tolerance here to account for that. + atol = 30 if (interpolation is transforms.InterpolationMode.BICUBIC and dtype is torch.uint8) else 1 + check_cuda_vs_cpu_tolerances = dict(rtol=0, atol=atol / 255 if dtype.is_floating_point else atol) + + check_kernel( + F.resize_image, + make_image(self.INPUT_SIZE, dtype=dtype, device=device), + size=size, + interpolation=interpolation, + **max_size_kwarg, + antialias=antialias, + check_cuda_vs_cpu=check_cuda_vs_cpu_tolerances, + check_scripted_vs_eager=not isinstance(size, int), + ) + + @pytest.mark.parametrize("format", list(tv_tensors.BoundingBoxFormat)) + @pytest.mark.parametrize("size", OUTPUT_SIZES) + @pytest.mark.parametrize("use_max_size", [True, False]) + @pytest.mark.parametrize("dtype", [torch.float32, torch.int64]) + @pytest.mark.parametrize("device", cpu_and_cuda()) + def test_kernel_bounding_boxes(self, format, size, use_max_size, dtype, device): + if not (max_size_kwarg := self._make_max_size_kwarg(use_max_size=use_max_size, size=size)): + return + + bounding_boxes = make_bounding_boxes( + format=format, + canvas_size=self.INPUT_SIZE, + dtype=dtype, + device=device, + ) + check_kernel( + F.resize_bounding_boxes, + bounding_boxes, + canvas_size=bounding_boxes.canvas_size, + size=size, + **max_size_kwarg, + check_scripted_vs_eager=not isinstance(size, int), + ) + + @pytest.mark.parametrize("make_mask", [make_segmentation_mask, make_detection_masks]) + def test_kernel_mask(self, make_mask): + check_kernel(F.resize_mask, make_mask(self.INPUT_SIZE), size=self.OUTPUT_SIZES[-1]) + + def test_kernel_video(self): + check_kernel(F.resize_video, make_video(self.INPUT_SIZE), size=self.OUTPUT_SIZES[-1], antialias=True) + + @pytest.mark.parametrize("size", OUTPUT_SIZES) + @pytest.mark.parametrize( + "make_input", + [make_image_tensor, make_image_pil, make_image, make_bounding_boxes, make_segmentation_mask, make_video], + ) + def test_functional(self, size, make_input): + max_size_kwarg = self._make_max_size_kwarg(use_max_size=size is None, size=size) + + check_functional( + F.resize, + make_input(self.INPUT_SIZE), + size=size, + **max_size_kwarg, + antialias=True, + check_scripted_smoke=not isinstance(size, int), + ) + + @pytest.mark.parametrize( + ("kernel", "input_type"), + [ + (F.resize_image, torch.Tensor), + (F._geometry._resize_image_pil, PIL.Image.Image), + (F.resize_image, tv_tensors.Image), + (F.resize_bounding_boxes, tv_tensors.BoundingBoxes), + (F.resize_mask, tv_tensors.Mask), + (F.resize_video, tv_tensors.Video), + ], + ) + def test_functional_signature(self, kernel, input_type): + check_functional_kernel_signature_match(F.resize, kernel=kernel, input_type=input_type) + + @pytest.mark.parametrize("size", OUTPUT_SIZES) + @pytest.mark.parametrize("device", cpu_and_cuda()) + @pytest.mark.parametrize( + "make_input", + [ + make_image_tensor, + make_image_pil, + make_image, + make_bounding_boxes, + make_segmentation_mask, + make_detection_masks, + make_video, + ], + ) + def test_transform(self, size, device, make_input): + max_size_kwarg = self._make_max_size_kwarg(use_max_size=size is None, size=size) + + check_transform( + transforms.Resize(size=size, **max_size_kwarg, antialias=True), + make_input(self.INPUT_SIZE, device=device), + # atol=1 due to Resize v2 is using native uint8 interpolate path for bilinear and nearest modes + check_v1_compatibility=dict(rtol=0, atol=1) if size is not None else False, + ) + + def _check_output_size(self, input, output, *, size, max_size): + assert tuple(F.get_size(output)) == self._compute_output_size( + input_size=F.get_size(input), size=size, max_size=max_size + ) + + @pytest.mark.parametrize("size", OUTPUT_SIZES) + # `InterpolationMode.NEAREST` is modeled after the buggy `INTER_NEAREST` interpolation of CV2. + # The PIL equivalent of `InterpolationMode.NEAREST` is `InterpolationMode.NEAREST_EXACT` + @pytest.mark.parametrize("interpolation", set(INTERPOLATION_MODES) - {transforms.InterpolationMode.NEAREST}) + @pytest.mark.parametrize("use_max_size", [True, False]) + @pytest.mark.parametrize("fn", [F.resize, transform_cls_to_functional(transforms.Resize)]) + def test_image_correctness(self, size, interpolation, use_max_size, fn): + if not (max_size_kwarg := self._make_max_size_kwarg(use_max_size=use_max_size, size=size)): + return + + image = make_image(self.INPUT_SIZE, dtype=torch.uint8) + + actual = fn(image, size=size, interpolation=interpolation, **max_size_kwarg, antialias=True) + expected = F.to_image(F.resize(F.to_pil_image(image), size=size, interpolation=interpolation, **max_size_kwarg)) + + self._check_output_size(image, actual, size=size, **max_size_kwarg) + torch.testing.assert_close(actual, expected, atol=1, rtol=0) + + def _reference_resize_bounding_boxes(self, bounding_boxes, *, size, max_size=None): + old_height, old_width = bounding_boxes.canvas_size + new_height, new_width = self._compute_output_size( + input_size=bounding_boxes.canvas_size, size=size, max_size=max_size + ) + + if (old_height, old_width) == (new_height, new_width): + return bounding_boxes + + affine_matrix = np.array( + [ + [new_width / old_width, 0, 0], + [0, new_height / old_height, 0], + ], + ) + + return reference_affine_bounding_boxes_helper( + bounding_boxes, + affine_matrix=affine_matrix, + new_canvas_size=(new_height, new_width), + ) + + @pytest.mark.parametrize("format", list(tv_tensors.BoundingBoxFormat)) + @pytest.mark.parametrize("size", OUTPUT_SIZES) + @pytest.mark.parametrize("use_max_size", [True, False]) + @pytest.mark.parametrize("fn", [F.resize, transform_cls_to_functional(transforms.Resize)]) + def test_bounding_boxes_correctness(self, format, size, use_max_size, fn): + if not (max_size_kwarg := self._make_max_size_kwarg(use_max_size=use_max_size, size=size)): + return + + bounding_boxes = make_bounding_boxes(format=format, canvas_size=self.INPUT_SIZE) + + actual = fn(bounding_boxes, size=size, **max_size_kwarg) + expected = self._reference_resize_bounding_boxes(bounding_boxes, size=size, **max_size_kwarg) + + self._check_output_size(bounding_boxes, actual, size=size, **max_size_kwarg) + torch.testing.assert_close(actual, expected) + + @pytest.mark.parametrize("interpolation", set(transforms.InterpolationMode) - set(INTERPOLATION_MODES)) + @pytest.mark.parametrize( + "make_input", + [make_image_tensor, make_image_pil, make_image, make_video], + ) + def test_pil_interpolation_compat_smoke(self, interpolation, make_input): + input = make_input(self.INPUT_SIZE) + + with ( + contextlib.nullcontext() + if isinstance(input, PIL.Image.Image) + # This error is triggered in PyTorch core + else pytest.raises(NotImplementedError, match=f"got {interpolation.value.lower()}") + ): + F.resize( + input, + size=self.OUTPUT_SIZES[0], + interpolation=interpolation, + ) + + def test_functional_pil_antialias_warning(self): + with pytest.warns(UserWarning, match="Anti-alias option is always applied for PIL Image input"): + F.resize(make_image_pil(self.INPUT_SIZE), size=self.OUTPUT_SIZES[0], antialias=False) + + @pytest.mark.parametrize("size", OUTPUT_SIZES) + @pytest.mark.parametrize( + "make_input", + [ + make_image_tensor, + make_image_pil, + make_image, + make_bounding_boxes, + make_segmentation_mask, + make_detection_masks, + make_video, + ], + ) + def test_max_size_error(self, size, make_input): + if size is None: + # value can be anything other than an integer + max_size = None + match = "max_size must be an integer when size is None" + elif isinstance(size, int) or len(size) == 1: + max_size = (size if isinstance(size, int) else size[0]) - 1 + match = "must be strictly greater than the requested size" + else: + # value can be anything other than None + max_size = -1 + match = "size should be an int or a sequence of length 1" + + with pytest.raises(ValueError, match=match): + F.resize(make_input(self.INPUT_SIZE), size=size, max_size=max_size, antialias=True) + + if isinstance(size, list) and len(size) != 1: + with pytest.raises(ValueError, match="max_size should only be passed if size is None or specifies"): + F.resize(make_input(self.INPUT_SIZE), size=size, max_size=500) + + @pytest.mark.parametrize( + "input_size, max_size, expected_size", + [ + ((10, 10), 10, (10, 10)), + ((10, 20), 40, (20, 40)), + ((20, 10), 40, (40, 20)), + ((10, 20), 10, (5, 10)), + ((20, 10), 10, (10, 5)), + ], + ) + @pytest.mark.parametrize( + "make_input", + [ + make_image_tensor, + make_image_pil, + make_image, + make_bounding_boxes, + make_segmentation_mask, + make_detection_masks, + make_video, + ], + ) + def test_resize_size_none(self, input_size, max_size, expected_size, make_input): + img = make_input(input_size) + out = F.resize(img, size=None, max_size=max_size) + assert F.get_size(out)[-2:] == list(expected_size) + + @pytest.mark.parametrize("interpolation", INTERPOLATION_MODES) + @pytest.mark.parametrize( + "make_input", + [make_image_tensor, make_image_pil, make_image, make_video], + ) + def test_interpolation_int(self, interpolation, make_input): + input = make_input(self.INPUT_SIZE) + + # `InterpolationMode.NEAREST_EXACT` has no proper corresponding integer equivalent. Internally, we map it to + # `0` to be the same as `InterpolationMode.NEAREST` for PIL. However, for the tensor backend there is a + # difference and thus we don't test it here. + if isinstance(input, torch.Tensor) and interpolation is transforms.InterpolationMode.NEAREST_EXACT: + return + + expected = F.resize(input, size=self.OUTPUT_SIZES[0], interpolation=interpolation, antialias=True) + actual = F.resize( + input, size=self.OUTPUT_SIZES[0], interpolation=pil_modes_mapping[interpolation], antialias=True + ) + + assert_equal(actual, expected) + + def test_transform_unknown_size_error(self): + with pytest.raises(ValueError, match="size can be an integer, a sequence of one or two integers, or None"): + transforms.Resize(size=object()) + + @pytest.mark.parametrize( + "size", [min(INPUT_SIZE), [min(INPUT_SIZE)], (min(INPUT_SIZE),), list(INPUT_SIZE), tuple(INPUT_SIZE)] + ) + @pytest.mark.parametrize( + "make_input", + [ + make_image_tensor, + make_image_pil, + make_image, + make_bounding_boxes, + make_segmentation_mask, + make_detection_masks, + make_video, + ], + ) + def test_noop(self, size, make_input): + input = make_input(self.INPUT_SIZE) + + output = F.resize(input, size=F.get_size(input), antialias=True) + + # This identity check is not a requirement. It is here to avoid breaking the behavior by accident. If there + # is a good reason to break this, feel free to downgrade to an equality check. + if isinstance(input, tv_tensors.TVTensor): + # We can't test identity directly, since that checks for the identity of the Python object. Since all + # tv_tensors unwrap before a kernel and wrap again afterwards, the Python object changes. Thus, we check + # that the underlying storage is the same + assert output.data_ptr() == input.data_ptr() + else: + assert output is input + + @pytest.mark.parametrize( + "make_input", + [ + make_image_tensor, + make_image_pil, + make_image, + make_bounding_boxes, + make_segmentation_mask, + make_detection_masks, + make_video, + ], + ) + def test_no_regression_5405(self, make_input): + # Checks that `max_size` is not ignored if `size == small_edge_size` + # See https://github.com/pytorch/vision/issues/5405 + + input = make_input(self.INPUT_SIZE) + + size = min(F.get_size(input)) + max_size = size + 1 + output = F.resize(input, size=size, max_size=max_size, antialias=True) + + assert max(F.get_size(output)) == max_size + + def _make_image(self, *args, batch_dims=(), memory_format=torch.contiguous_format, **kwargs): + # torch.channels_last memory_format is only available for 4D tensors, i.e. (B, C, H, W). However, images coming + # from PIL or our own I/O functions do not have a batch dimensions and are thus 3D, i.e. (C, H, W). Still, the + # layout of the data in memory is channels last. To emulate this when a 3D input is requested here, we create + # the image as 4D and create a view with the right shape afterwards. With this the layout in memory is channels + # last although PyTorch doesn't recognizes it as such. + emulate_channels_last = memory_format is torch.channels_last and len(batch_dims) != 1 + + image = make_image( + *args, + batch_dims=(math.prod(batch_dims),) if emulate_channels_last else batch_dims, + memory_format=memory_format, + **kwargs, + ) + + if emulate_channels_last: + image = tv_tensors.wrap(image.view(*batch_dims, *image.shape[-3:]), like=image) + + return image + + def _check_stride(self, image, *, memory_format): + C, H, W = F.get_dimensions(image) + if memory_format is torch.contiguous_format: + expected_stride = (H * W, W, 1) + elif memory_format is torch.channels_last: + expected_stride = (1, W * C, C) + else: + raise ValueError(f"Unknown memory_format: {memory_format}") + + assert image.stride() == expected_stride + + # TODO: We can remove this test and related torchvision workaround + # once we fixed related pytorch issue: https://github.com/pytorch/pytorch/issues/68430 + @pytest.mark.parametrize("interpolation", INTERPOLATION_MODES) + @pytest.mark.parametrize("antialias", [True, False]) + @pytest.mark.parametrize("memory_format", [torch.contiguous_format, torch.channels_last]) + @pytest.mark.parametrize("dtype", [torch.uint8, torch.float32]) + @pytest.mark.parametrize("device", cpu_and_cuda()) + def test_kernel_image_memory_format_consistency(self, interpolation, antialias, memory_format, dtype, device): + size = self.OUTPUT_SIZES[0] + + input = self._make_image(self.INPUT_SIZE, dtype=dtype, device=device, memory_format=memory_format) + + # Smoke test to make sure we aren't starting with wrong assumptions + self._check_stride(input, memory_format=memory_format) + + output = F.resize_image(input, size=size, interpolation=interpolation, antialias=antialias) + + self._check_stride(output, memory_format=memory_format) + + def test_float16_no_rounding(self): + # Make sure Resize() doesn't round float16 images + # Non-regression test for https://github.com/pytorch/vision/issues/7667 + + input = make_image_tensor(self.INPUT_SIZE, dtype=torch.float16) + output = F.resize_image(input, size=self.OUTPUT_SIZES[0], antialias=True) + + assert output.dtype is torch.float16 + assert (output.round() - output).abs().sum() > 0 + + +class TestHorizontalFlip: + @pytest.mark.parametrize("dtype", [torch.float32, torch.uint8]) + @pytest.mark.parametrize("device", cpu_and_cuda()) + def test_kernel_image(self, dtype, device): + check_kernel(F.horizontal_flip_image, make_image(dtype=dtype, device=device)) + + @pytest.mark.parametrize("format", list(tv_tensors.BoundingBoxFormat)) + @pytest.mark.parametrize("dtype", [torch.float32, torch.int64]) + @pytest.mark.parametrize("device", cpu_and_cuda()) + def test_kernel_bounding_boxes(self, format, dtype, device): + bounding_boxes = make_bounding_boxes(format=format, dtype=dtype, device=device) + check_kernel( + F.horizontal_flip_bounding_boxes, + bounding_boxes, + format=format, + canvas_size=bounding_boxes.canvas_size, + ) + + @pytest.mark.parametrize("make_mask", [make_segmentation_mask, make_detection_masks]) + def test_kernel_mask(self, make_mask): + check_kernel(F.horizontal_flip_mask, make_mask()) + + def test_kernel_video(self): + check_kernel(F.horizontal_flip_video, make_video()) + + @pytest.mark.parametrize( + "make_input", + [make_image_tensor, make_image_pil, make_image, make_bounding_boxes, make_segmentation_mask, make_video], + ) + def test_functional(self, make_input): + check_functional(F.horizontal_flip, make_input()) + + @pytest.mark.parametrize( + ("kernel", "input_type"), + [ + (F.horizontal_flip_image, torch.Tensor), + (F._geometry._horizontal_flip_image_pil, PIL.Image.Image), + (F.horizontal_flip_image, tv_tensors.Image), + (F.horizontal_flip_bounding_boxes, tv_tensors.BoundingBoxes), + (F.horizontal_flip_mask, tv_tensors.Mask), + (F.horizontal_flip_video, tv_tensors.Video), + ], + ) + def test_functional_signature(self, kernel, input_type): + check_functional_kernel_signature_match(F.horizontal_flip, kernel=kernel, input_type=input_type) + + @pytest.mark.parametrize( + "make_input", + [make_image_tensor, make_image_pil, make_image, make_bounding_boxes, make_segmentation_mask, make_video], + ) + @pytest.mark.parametrize("device", cpu_and_cuda()) + def test_transform(self, make_input, device): + check_transform(transforms.RandomHorizontalFlip(p=1), make_input(device=device)) + + @pytest.mark.parametrize( + "fn", [F.horizontal_flip, transform_cls_to_functional(transforms.RandomHorizontalFlip, p=1)] + ) + def test_image_correctness(self, fn): + image = make_image(dtype=torch.uint8, device="cpu") + + actual = fn(image) + expected = F.to_image(F.horizontal_flip(F.to_pil_image(image))) + + torch.testing.assert_close(actual, expected) + + def _reference_horizontal_flip_bounding_boxes(self, bounding_boxes): + affine_matrix = np.array( + [ + [-1, 0, bounding_boxes.canvas_size[1]], + [0, 1, 0], + ], + ) + + return reference_affine_bounding_boxes_helper(bounding_boxes, affine_matrix=affine_matrix) + + @pytest.mark.parametrize("format", list(tv_tensors.BoundingBoxFormat)) + @pytest.mark.parametrize( + "fn", [F.horizontal_flip, transform_cls_to_functional(transforms.RandomHorizontalFlip, p=1)] + ) + def test_bounding_boxes_correctness(self, format, fn): + bounding_boxes = make_bounding_boxes(format=format) + + actual = fn(bounding_boxes) + expected = self._reference_horizontal_flip_bounding_boxes(bounding_boxes) + + torch.testing.assert_close(actual, expected) + + @pytest.mark.parametrize( + "make_input", + [make_image_tensor, make_image_pil, make_image, make_bounding_boxes, make_segmentation_mask, make_video], + ) + @pytest.mark.parametrize("device", cpu_and_cuda()) + def test_transform_noop(self, make_input, device): + input = make_input(device=device) + + transform = transforms.RandomHorizontalFlip(p=0) + + output = transform(input) + + assert_equal(output, input) + + +class TestAffine: + _EXHAUSTIVE_TYPE_AFFINE_KWARGS = dict( + # float, int + angle=[-10.9, 18], + # two-list of float, two-list of int, two-tuple of float, two-tuple of int + translate=[[6.3, -0.6], [1, -3], (16.6, -6.6), (-2, 4)], + # float + scale=[0.5], + # float, int, + # one-list of float, one-list of int, one-tuple of float, one-tuple of int + # two-list of float, two-list of int, two-tuple of float, two-tuple of int + shear=[35.6, 38, [-37.7], [-23], (5.3,), (-52,), [5.4, 21.8], [-47, 51], (-11.2, 36.7), (8, -53)], + # None + # two-list of float, two-list of int, two-tuple of float, two-tuple of int + center=[None, [1.2, 4.9], [-3, 1], (2.5, -4.7), (3, 2)], + ) + # The special case for shear makes sure we pick a value that is supported while JIT scripting + _MINIMAL_AFFINE_KWARGS = { + k: vs[0] if k != "shear" else next(v for v in vs if isinstance(v, list)) + for k, vs in _EXHAUSTIVE_TYPE_AFFINE_KWARGS.items() + } + _CORRECTNESS_AFFINE_KWARGS = { + k: [v for v in vs if v is None or isinstance(v, float) or (isinstance(v, list) and len(v) > 1)] + for k, vs in _EXHAUSTIVE_TYPE_AFFINE_KWARGS.items() + } + + _EXHAUSTIVE_TYPE_TRANSFORM_AFFINE_RANGES = dict( + degrees=[30, (-15, 20)], + translate=[None, (0.5, 0.5)], + scale=[None, (0.75, 1.25)], + shear=[None, (12, 30, -17, 5), 10, (-5, 12)], + ) + _CORRECTNESS_TRANSFORM_AFFINE_RANGES = { + k: next(v for v in vs if v is not None) for k, vs in _EXHAUSTIVE_TYPE_TRANSFORM_AFFINE_RANGES.items() + } + + def _check_kernel(self, kernel, input, *args, **kwargs): + kwargs_ = self._MINIMAL_AFFINE_KWARGS.copy() + kwargs_.update(kwargs) + check_kernel(kernel, input, *args, **kwargs_) + + @param_value_parametrization( + angle=_EXHAUSTIVE_TYPE_AFFINE_KWARGS["angle"], + translate=_EXHAUSTIVE_TYPE_AFFINE_KWARGS["translate"], + shear=_EXHAUSTIVE_TYPE_AFFINE_KWARGS["shear"], + center=_EXHAUSTIVE_TYPE_AFFINE_KWARGS["center"], + interpolation=[transforms.InterpolationMode.NEAREST, transforms.InterpolationMode.BILINEAR], + fill=EXHAUSTIVE_TYPE_FILLS, + ) + @pytest.mark.parametrize("dtype", [torch.float32, torch.uint8]) + @pytest.mark.parametrize("device", cpu_and_cuda()) + def test_kernel_image(self, param, value, dtype, device): + if param == "fill": + value = adapt_fill(value, dtype=dtype) + self._check_kernel( + F.affine_image, + make_image(dtype=dtype, device=device), + **{param: value}, + check_scripted_vs_eager=not (param in {"shear", "fill"} and isinstance(value, (int, float))), + check_cuda_vs_cpu=dict(atol=1, rtol=0) + if dtype is torch.uint8 and param == "interpolation" and value is transforms.InterpolationMode.BILINEAR + else True, + ) + + @param_value_parametrization( + angle=_EXHAUSTIVE_TYPE_AFFINE_KWARGS["angle"], + translate=_EXHAUSTIVE_TYPE_AFFINE_KWARGS["translate"], + shear=_EXHAUSTIVE_TYPE_AFFINE_KWARGS["shear"], + center=_EXHAUSTIVE_TYPE_AFFINE_KWARGS["center"], + ) + @pytest.mark.parametrize("format", list(tv_tensors.BoundingBoxFormat)) + @pytest.mark.parametrize("dtype", [torch.float32, torch.int64]) + @pytest.mark.parametrize("device", cpu_and_cuda()) + def test_kernel_bounding_boxes(self, param, value, format, dtype, device): + bounding_boxes = make_bounding_boxes(format=format, dtype=dtype, device=device) + self._check_kernel( + F.affine_bounding_boxes, + bounding_boxes, + format=format, + canvas_size=bounding_boxes.canvas_size, + **{param: value}, + check_scripted_vs_eager=not (param == "shear" and isinstance(value, (int, float))), + ) + + @pytest.mark.parametrize("make_mask", [make_segmentation_mask, make_detection_masks]) + def test_kernel_mask(self, make_mask): + self._check_kernel(F.affine_mask, make_mask()) + + def test_kernel_video(self): + self._check_kernel(F.affine_video, make_video()) + + @pytest.mark.parametrize( + "make_input", + [make_image_tensor, make_image_pil, make_image, make_bounding_boxes, make_segmentation_mask, make_video], + ) + def test_functional(self, make_input): + check_functional(F.affine, make_input(), **self._MINIMAL_AFFINE_KWARGS) + + @pytest.mark.parametrize( + ("kernel", "input_type"), + [ + (F.affine_image, torch.Tensor), + (F._geometry._affine_image_pil, PIL.Image.Image), + (F.affine_image, tv_tensors.Image), + (F.affine_bounding_boxes, tv_tensors.BoundingBoxes), + (F.affine_mask, tv_tensors.Mask), + (F.affine_video, tv_tensors.Video), + ], + ) + def test_functional_signature(self, kernel, input_type): + check_functional_kernel_signature_match(F.affine, kernel=kernel, input_type=input_type) + + @pytest.mark.parametrize( + "make_input", + [make_image_tensor, make_image_pil, make_image, make_bounding_boxes, make_segmentation_mask, make_video], + ) + @pytest.mark.parametrize("device", cpu_and_cuda()) + def test_transform(self, make_input, device): + input = make_input(device=device) + + check_transform(transforms.RandomAffine(**self._CORRECTNESS_TRANSFORM_AFFINE_RANGES), input) + + @pytest.mark.parametrize("angle", _CORRECTNESS_AFFINE_KWARGS["angle"]) + @pytest.mark.parametrize("translate", _CORRECTNESS_AFFINE_KWARGS["translate"]) + @pytest.mark.parametrize("scale", _CORRECTNESS_AFFINE_KWARGS["scale"]) + @pytest.mark.parametrize("shear", _CORRECTNESS_AFFINE_KWARGS["shear"]) + @pytest.mark.parametrize("center", _CORRECTNESS_AFFINE_KWARGS["center"]) + @pytest.mark.parametrize( + "interpolation", [transforms.InterpolationMode.NEAREST, transforms.InterpolationMode.BILINEAR] + ) + @pytest.mark.parametrize("fill", CORRECTNESS_FILLS) + def test_functional_image_correctness(self, angle, translate, scale, shear, center, interpolation, fill): + image = make_image(dtype=torch.uint8, device="cpu") + + fill = adapt_fill(fill, dtype=torch.uint8) + + actual = F.affine( + image, + angle=angle, + translate=translate, + scale=scale, + shear=shear, + center=center, + interpolation=interpolation, + fill=fill, + ) + expected = F.to_image( + F.affine( + F.to_pil_image(image), + angle=angle, + translate=translate, + scale=scale, + shear=shear, + center=center, + interpolation=interpolation, + fill=fill, + ) + ) + + mae = (actual.float() - expected.float()).abs().mean() + assert mae < 2 if interpolation is transforms.InterpolationMode.NEAREST else 8 + + @pytest.mark.parametrize("center", _CORRECTNESS_AFFINE_KWARGS["center"]) + @pytest.mark.parametrize( + "interpolation", [transforms.InterpolationMode.NEAREST, transforms.InterpolationMode.BILINEAR] + ) + @pytest.mark.parametrize("fill", CORRECTNESS_FILLS) + @pytest.mark.parametrize("seed", list(range(5))) + def test_transform_image_correctness(self, center, interpolation, fill, seed): + image = make_image(dtype=torch.uint8, device="cpu") + + fill = adapt_fill(fill, dtype=torch.uint8) + + transform = transforms.RandomAffine( + **self._CORRECTNESS_TRANSFORM_AFFINE_RANGES, center=center, interpolation=interpolation, fill=fill + ) + + torch.manual_seed(seed) + actual = transform(image) + + torch.manual_seed(seed) + expected = F.to_image(transform(F.to_pil_image(image))) + + mae = (actual.float() - expected.float()).abs().mean() + assert mae < 2 if interpolation is transforms.InterpolationMode.NEAREST else 8 + + def _compute_affine_matrix(self, *, angle, translate, scale, shear, center): + rot = math.radians(angle) + cx, cy = center + tx, ty = translate + sx, sy = [math.radians(s) for s in ([shear, 0.0] if isinstance(shear, (int, float)) else shear)] + + c_matrix = np.array([[1, 0, cx], [0, 1, cy], [0, 0, 1]]) + t_matrix = np.array([[1, 0, tx], [0, 1, ty], [0, 0, 1]]) + c_matrix_inv = np.linalg.inv(c_matrix) + rs_matrix = np.array( + [ + [scale * math.cos(rot), -scale * math.sin(rot), 0], + [scale * math.sin(rot), scale * math.cos(rot), 0], + [0, 0, 1], + ] + ) + shear_x_matrix = np.array([[1, -math.tan(sx), 0], [0, 1, 0], [0, 0, 1]]) + shear_y_matrix = np.array([[1, 0, 0], [-math.tan(sy), 1, 0], [0, 0, 1]]) + rss_matrix = np.matmul(rs_matrix, np.matmul(shear_y_matrix, shear_x_matrix)) + true_matrix = np.matmul(t_matrix, np.matmul(c_matrix, np.matmul(rss_matrix, c_matrix_inv))) + return true_matrix[:2, :] + + def _reference_affine_bounding_boxes(self, bounding_boxes, *, angle, translate, scale, shear, center): + if center is None: + center = [s * 0.5 for s in bounding_boxes.canvas_size[::-1]] + + return reference_affine_bounding_boxes_helper( + bounding_boxes, + affine_matrix=self._compute_affine_matrix( + angle=angle, translate=translate, scale=scale, shear=shear, center=center + ), + ) + + @pytest.mark.parametrize("format", list(tv_tensors.BoundingBoxFormat)) + @pytest.mark.parametrize("angle", _CORRECTNESS_AFFINE_KWARGS["angle"]) + @pytest.mark.parametrize("translate", _CORRECTNESS_AFFINE_KWARGS["translate"]) + @pytest.mark.parametrize("scale", _CORRECTNESS_AFFINE_KWARGS["scale"]) + @pytest.mark.parametrize("shear", _CORRECTNESS_AFFINE_KWARGS["shear"]) + @pytest.mark.parametrize("center", _CORRECTNESS_AFFINE_KWARGS["center"]) + def test_functional_bounding_boxes_correctness(self, format, angle, translate, scale, shear, center): + bounding_boxes = make_bounding_boxes(format=format) + + actual = F.affine( + bounding_boxes, + angle=angle, + translate=translate, + scale=scale, + shear=shear, + center=center, + ) + expected = self._reference_affine_bounding_boxes( + bounding_boxes, + angle=angle, + translate=translate, + scale=scale, + shear=shear, + center=center, + ) + + torch.testing.assert_close(actual, expected) + + @pytest.mark.parametrize("format", list(tv_tensors.BoundingBoxFormat)) + @pytest.mark.parametrize("center", _CORRECTNESS_AFFINE_KWARGS["center"]) + @pytest.mark.parametrize("seed", list(range(5))) + def test_transform_bounding_boxes_correctness(self, format, center, seed): + bounding_boxes = make_bounding_boxes(format=format) + + transform = transforms.RandomAffine(**self._CORRECTNESS_TRANSFORM_AFFINE_RANGES, center=center) + + torch.manual_seed(seed) + params = transform._get_params([bounding_boxes]) + + torch.manual_seed(seed) + actual = transform(bounding_boxes) + + expected = self._reference_affine_bounding_boxes(bounding_boxes, **params, center=center) + + torch.testing.assert_close(actual, expected) + + @pytest.mark.parametrize("degrees", _EXHAUSTIVE_TYPE_TRANSFORM_AFFINE_RANGES["degrees"]) + @pytest.mark.parametrize("translate", _EXHAUSTIVE_TYPE_TRANSFORM_AFFINE_RANGES["translate"]) + @pytest.mark.parametrize("scale", _EXHAUSTIVE_TYPE_TRANSFORM_AFFINE_RANGES["scale"]) + @pytest.mark.parametrize("shear", _EXHAUSTIVE_TYPE_TRANSFORM_AFFINE_RANGES["shear"]) + @pytest.mark.parametrize("seed", list(range(10))) + def test_transform_get_params_bounds(self, degrees, translate, scale, shear, seed): + image = make_image() + height, width = F.get_size(image) + + transform = transforms.RandomAffine(degrees=degrees, translate=translate, scale=scale, shear=shear) + + torch.manual_seed(seed) + params = transform._get_params([image]) + + if isinstance(degrees, (int, float)): + assert -degrees <= params["angle"] <= degrees + else: + assert degrees[0] <= params["angle"] <= degrees[1] + + if translate is not None: + width_max = int(round(translate[0] * width)) + height_max = int(round(translate[1] * height)) + assert -width_max <= params["translate"][0] <= width_max + assert -height_max <= params["translate"][1] <= height_max + else: + assert params["translate"] == (0, 0) + + if scale is not None: + assert scale[0] <= params["scale"] <= scale[1] + else: + assert params["scale"] == 1.0 + + if shear is not None: + if isinstance(shear, (int, float)): + assert -shear <= params["shear"][0] <= shear + assert params["shear"][1] == 0.0 + elif len(shear) == 2: + assert shear[0] <= params["shear"][0] <= shear[1] + assert params["shear"][1] == 0.0 + elif len(shear) == 4: + assert shear[0] <= params["shear"][0] <= shear[1] + assert shear[2] <= params["shear"][1] <= shear[3] + else: + assert params["shear"] == (0, 0) + + @pytest.mark.parametrize("param", ["degrees", "translate", "scale", "shear", "center"]) + @pytest.mark.parametrize("value", [0, [0], [0, 0, 0]]) + def test_transform_sequence_len_errors(self, param, value): + if param in {"degrees", "shear"} and not isinstance(value, list): + return + + kwargs = {param: value} + if param != "degrees": + kwargs["degrees"] = 0 + + with pytest.raises( + ValueError if isinstance(value, list) else TypeError, match=f"{param} should be a sequence of length 2" + ): + transforms.RandomAffine(**kwargs) + + def test_transform_negative_degrees_error(self): + with pytest.raises(ValueError, match="If degrees is a single number, it must be positive"): + transforms.RandomAffine(degrees=-1) + + @pytest.mark.parametrize("translate", [[-1, 0], [2, 0], [-1, 2]]) + def test_transform_translate_range_error(self, translate): + with pytest.raises(ValueError, match="translation values should be between 0 and 1"): + transforms.RandomAffine(degrees=0, translate=translate) + + @pytest.mark.parametrize("scale", [[-1, 0], [0, -1], [-1, -1]]) + def test_transform_scale_range_error(self, scale): + with pytest.raises(ValueError, match="scale values should be positive"): + transforms.RandomAffine(degrees=0, scale=scale) + + def test_transform_negative_shear_error(self): + with pytest.raises(ValueError, match="If shear is a single number, it must be positive"): + transforms.RandomAffine(degrees=0, shear=-1) + + def test_transform_unknown_fill_error(self): + with pytest.raises(TypeError, match="Got inappropriate fill arg"): + transforms.RandomAffine(degrees=0, fill="fill") + + +class TestVerticalFlip: + @pytest.mark.parametrize("dtype", [torch.float32, torch.uint8]) + @pytest.mark.parametrize("device", cpu_and_cuda()) + def test_kernel_image(self, dtype, device): + check_kernel(F.vertical_flip_image, make_image(dtype=dtype, device=device)) + + @pytest.mark.parametrize("format", list(tv_tensors.BoundingBoxFormat)) + @pytest.mark.parametrize("dtype", [torch.float32, torch.int64]) + @pytest.mark.parametrize("device", cpu_and_cuda()) + def test_kernel_bounding_boxes(self, format, dtype, device): + bounding_boxes = make_bounding_boxes(format=format, dtype=dtype, device=device) + check_kernel( + F.vertical_flip_bounding_boxes, + bounding_boxes, + format=format, + canvas_size=bounding_boxes.canvas_size, + ) + + @pytest.mark.parametrize("make_mask", [make_segmentation_mask, make_detection_masks]) + def test_kernel_mask(self, make_mask): + check_kernel(F.vertical_flip_mask, make_mask()) + + def test_kernel_video(self): + check_kernel(F.vertical_flip_video, make_video()) + + @pytest.mark.parametrize( + "make_input", + [make_image_tensor, make_image_pil, make_image, make_bounding_boxes, make_segmentation_mask, make_video], + ) + def test_functional(self, make_input): + check_functional(F.vertical_flip, make_input()) + + @pytest.mark.parametrize( + ("kernel", "input_type"), + [ + (F.vertical_flip_image, torch.Tensor), + (F._geometry._vertical_flip_image_pil, PIL.Image.Image), + (F.vertical_flip_image, tv_tensors.Image), + (F.vertical_flip_bounding_boxes, tv_tensors.BoundingBoxes), + (F.vertical_flip_mask, tv_tensors.Mask), + (F.vertical_flip_video, tv_tensors.Video), + ], + ) + def test_functional_signature(self, kernel, input_type): + check_functional_kernel_signature_match(F.vertical_flip, kernel=kernel, input_type=input_type) + + @pytest.mark.parametrize( + "make_input", + [make_image_tensor, make_image_pil, make_image, make_bounding_boxes, make_segmentation_mask, make_video], + ) + @pytest.mark.parametrize("device", cpu_and_cuda()) + def test_transform(self, make_input, device): + check_transform(transforms.RandomVerticalFlip(p=1), make_input(device=device)) + + @pytest.mark.parametrize("fn", [F.vertical_flip, transform_cls_to_functional(transforms.RandomVerticalFlip, p=1)]) + def test_image_correctness(self, fn): + image = make_image(dtype=torch.uint8, device="cpu") + + actual = fn(image) + expected = F.to_image(F.vertical_flip(F.to_pil_image(image))) + + torch.testing.assert_close(actual, expected) + + def _reference_vertical_flip_bounding_boxes(self, bounding_boxes): + affine_matrix = np.array( + [ + [1, 0, 0], + [0, -1, bounding_boxes.canvas_size[0]], + ], + ) + + return reference_affine_bounding_boxes_helper(bounding_boxes, affine_matrix=affine_matrix) + + @pytest.mark.parametrize("format", list(tv_tensors.BoundingBoxFormat)) + @pytest.mark.parametrize("fn", [F.vertical_flip, transform_cls_to_functional(transforms.RandomVerticalFlip, p=1)]) + def test_bounding_boxes_correctness(self, format, fn): + bounding_boxes = make_bounding_boxes(format=format) + + actual = fn(bounding_boxes) + expected = self._reference_vertical_flip_bounding_boxes(bounding_boxes) + + torch.testing.assert_close(actual, expected) + + @pytest.mark.parametrize( + "make_input", + [make_image_tensor, make_image_pil, make_image, make_bounding_boxes, make_segmentation_mask, make_video], + ) + @pytest.mark.parametrize("device", cpu_and_cuda()) + def test_transform_noop(self, make_input, device): + input = make_input(device=device) + + transform = transforms.RandomVerticalFlip(p=0) + + output = transform(input) + + assert_equal(output, input) + + +class TestRotate: + _EXHAUSTIVE_TYPE_AFFINE_KWARGS = dict( + # float, int + angle=[-10.9, 18], + # None + # two-list of float, two-list of int, two-tuple of float, two-tuple of int + center=[None, [1.2, 4.9], [-3, 1], (2.5, -4.7), (3, 2)], + ) + _MINIMAL_AFFINE_KWARGS = {k: vs[0] for k, vs in _EXHAUSTIVE_TYPE_AFFINE_KWARGS.items()} + _CORRECTNESS_AFFINE_KWARGS = { + k: [v for v in vs if v is None or isinstance(v, float) or isinstance(v, list)] + for k, vs in _EXHAUSTIVE_TYPE_AFFINE_KWARGS.items() + } + + _EXHAUSTIVE_TYPE_TRANSFORM_AFFINE_RANGES = dict( + degrees=[30, (-15, 20)], + ) + _CORRECTNESS_TRANSFORM_AFFINE_RANGES = {k: vs[0] for k, vs in _EXHAUSTIVE_TYPE_TRANSFORM_AFFINE_RANGES.items()} + + @param_value_parametrization( + angle=_EXHAUSTIVE_TYPE_AFFINE_KWARGS["angle"], + interpolation=[transforms.InterpolationMode.NEAREST, transforms.InterpolationMode.BILINEAR], + expand=[False, True], + center=_EXHAUSTIVE_TYPE_AFFINE_KWARGS["center"], + fill=EXHAUSTIVE_TYPE_FILLS, + ) + @pytest.mark.parametrize("dtype", [torch.float32, torch.uint8]) + @pytest.mark.parametrize("device", cpu_and_cuda()) + def test_kernel_image(self, param, value, dtype, device): + kwargs = {param: value} + if param != "angle": + kwargs["angle"] = self._MINIMAL_AFFINE_KWARGS["angle"] + check_kernel( + F.rotate_image, + make_image(dtype=dtype, device=device), + **kwargs, + check_scripted_vs_eager=not (param == "fill" and isinstance(value, (int, float))), + ) + + @param_value_parametrization( + angle=_EXHAUSTIVE_TYPE_AFFINE_KWARGS["angle"], + expand=[False, True], + center=_EXHAUSTIVE_TYPE_AFFINE_KWARGS["center"], + ) + @pytest.mark.parametrize("format", list(tv_tensors.BoundingBoxFormat)) + @pytest.mark.parametrize("dtype", [torch.float32, torch.uint8]) + @pytest.mark.parametrize("device", cpu_and_cuda()) + def test_kernel_bounding_boxes(self, param, value, format, dtype, device): + kwargs = {param: value} + if param != "angle": + kwargs["angle"] = self._MINIMAL_AFFINE_KWARGS["angle"] + + bounding_boxes = make_bounding_boxes(format=format, dtype=dtype, device=device) + + check_kernel( + F.rotate_bounding_boxes, + bounding_boxes, + format=format, + canvas_size=bounding_boxes.canvas_size, + **kwargs, + ) + + @pytest.mark.parametrize("make_mask", [make_segmentation_mask, make_detection_masks]) + def test_kernel_mask(self, make_mask): + check_kernel(F.rotate_mask, make_mask(), **self._MINIMAL_AFFINE_KWARGS) + + def test_kernel_video(self): + check_kernel(F.rotate_video, make_video(), **self._MINIMAL_AFFINE_KWARGS) + + @pytest.mark.parametrize( + "make_input", + [make_image_tensor, make_image_pil, make_image, make_bounding_boxes, make_segmentation_mask, make_video], + ) + def test_functional(self, make_input): + check_functional(F.rotate, make_input(), **self._MINIMAL_AFFINE_KWARGS) + + @pytest.mark.parametrize( + ("kernel", "input_type"), + [ + (F.rotate_image, torch.Tensor), + (F._geometry._rotate_image_pil, PIL.Image.Image), + (F.rotate_image, tv_tensors.Image), + (F.rotate_bounding_boxes, tv_tensors.BoundingBoxes), + (F.rotate_mask, tv_tensors.Mask), + (F.rotate_video, tv_tensors.Video), + ], + ) + def test_functional_signature(self, kernel, input_type): + check_functional_kernel_signature_match(F.rotate, kernel=kernel, input_type=input_type) + + @pytest.mark.parametrize( + "make_input", + [make_image_tensor, make_image_pil, make_image, make_bounding_boxes, make_segmentation_mask, make_video], + ) + @pytest.mark.parametrize("device", cpu_and_cuda()) + def test_transform(self, make_input, device): + check_transform( + transforms.RandomRotation(**self._CORRECTNESS_TRANSFORM_AFFINE_RANGES), make_input(device=device) + ) + + @pytest.mark.parametrize("angle", _CORRECTNESS_AFFINE_KWARGS["angle"]) + @pytest.mark.parametrize("center", _CORRECTNESS_AFFINE_KWARGS["center"]) + @pytest.mark.parametrize( + "interpolation", [transforms.InterpolationMode.NEAREST, transforms.InterpolationMode.BILINEAR] + ) + @pytest.mark.parametrize("expand", [False, True]) + @pytest.mark.parametrize("fill", CORRECTNESS_FILLS) + def test_functional_image_correctness(self, angle, center, interpolation, expand, fill): + image = make_image(dtype=torch.uint8, device="cpu") + + fill = adapt_fill(fill, dtype=torch.uint8) + + actual = F.rotate(image, angle=angle, center=center, interpolation=interpolation, expand=expand, fill=fill) + expected = F.to_image( + F.rotate( + F.to_pil_image(image), angle=angle, center=center, interpolation=interpolation, expand=expand, fill=fill + ) + ) + + mae = (actual.float() - expected.float()).abs().mean() + assert mae < 1 if interpolation is transforms.InterpolationMode.NEAREST else 6 + + @pytest.mark.parametrize("center", _CORRECTNESS_AFFINE_KWARGS["center"]) + @pytest.mark.parametrize( + "interpolation", [transforms.InterpolationMode.NEAREST, transforms.InterpolationMode.BILINEAR] + ) + @pytest.mark.parametrize("expand", [False, True]) + @pytest.mark.parametrize("fill", CORRECTNESS_FILLS) + @pytest.mark.parametrize("seed", list(range(5))) + def test_transform_image_correctness(self, center, interpolation, expand, fill, seed): + image = make_image(dtype=torch.uint8, device="cpu") + + fill = adapt_fill(fill, dtype=torch.uint8) + + transform = transforms.RandomRotation( + **self._CORRECTNESS_TRANSFORM_AFFINE_RANGES, + center=center, + interpolation=interpolation, + expand=expand, + fill=fill, + ) + + torch.manual_seed(seed) + actual = transform(image) + + torch.manual_seed(seed) + expected = F.to_image(transform(F.to_pil_image(image))) + + mae = (actual.float() - expected.float()).abs().mean() + assert mae < 1 if interpolation is transforms.InterpolationMode.NEAREST else 6 + + def _compute_output_canvas_size(self, *, expand, canvas_size, affine_matrix): + if not expand: + return canvas_size, (0.0, 0.0) + + input_height, input_width = canvas_size + + input_image_frame = np.array( + [ + [0.0, 0.0, 1.0], + [0.0, input_height, 1.0], + [input_width, input_height, 1.0], + [input_width, 0.0, 1.0], + ], + dtype=np.float64, + ) + output_image_frame = np.matmul(input_image_frame, affine_matrix.astype(input_image_frame.dtype).T) + + recenter_x = float(np.min(output_image_frame[:, 0])) + recenter_y = float(np.min(output_image_frame[:, 1])) + + output_width = int(np.max(output_image_frame[:, 0]) - recenter_x) + output_height = int(np.max(output_image_frame[:, 1]) - recenter_y) + + return (output_height, output_width), (recenter_x, recenter_y) + + def _recenter_bounding_boxes_after_expand(self, bounding_boxes, *, recenter_xy): + x, y = recenter_xy + if bounding_boxes.format is tv_tensors.BoundingBoxFormat.XYXY: + translate = [x, y, x, y] + else: + translate = [x, y, 0.0, 0.0] + return tv_tensors.wrap( + (bounding_boxes.to(torch.float64) - torch.tensor(translate)).to(bounding_boxes.dtype), like=bounding_boxes + ) + + def _reference_rotate_bounding_boxes(self, bounding_boxes, *, angle, expand, center): + if center is None: + center = [s * 0.5 for s in bounding_boxes.canvas_size[::-1]] + cx, cy = center + + a = np.cos(angle * np.pi / 180.0) + b = np.sin(angle * np.pi / 180.0) + affine_matrix = np.array( + [ + [a, b, cx - cx * a - b * cy], + [-b, a, cy + cx * b - a * cy], + ], + ) + + new_canvas_size, recenter_xy = self._compute_output_canvas_size( + expand=expand, canvas_size=bounding_boxes.canvas_size, affine_matrix=affine_matrix + ) + + output = reference_affine_bounding_boxes_helper( + bounding_boxes, + affine_matrix=affine_matrix, + new_canvas_size=new_canvas_size, + clamp=False, + ) + + return F.clamp_bounding_boxes(self._recenter_bounding_boxes_after_expand(output, recenter_xy=recenter_xy)).to( + bounding_boxes + ) + + @pytest.mark.parametrize("format", list(tv_tensors.BoundingBoxFormat)) + @pytest.mark.parametrize("angle", _CORRECTNESS_AFFINE_KWARGS["angle"]) + @pytest.mark.parametrize("expand", [False, True]) + @pytest.mark.parametrize("center", _CORRECTNESS_AFFINE_KWARGS["center"]) + def test_functional_bounding_boxes_correctness(self, format, angle, expand, center): + bounding_boxes = make_bounding_boxes(format=format) + + actual = F.rotate(bounding_boxes, angle=angle, expand=expand, center=center) + expected = self._reference_rotate_bounding_boxes(bounding_boxes, angle=angle, expand=expand, center=center) + + torch.testing.assert_close(actual, expected) + torch.testing.assert_close(F.get_size(actual), F.get_size(expected), atol=2 if expand else 0, rtol=0) + + @pytest.mark.parametrize("format", list(tv_tensors.BoundingBoxFormat)) + @pytest.mark.parametrize("expand", [False, True]) + @pytest.mark.parametrize("center", _CORRECTNESS_AFFINE_KWARGS["center"]) + @pytest.mark.parametrize("seed", list(range(5))) + def test_transform_bounding_boxes_correctness(self, format, expand, center, seed): + bounding_boxes = make_bounding_boxes(format=format) + + transform = transforms.RandomRotation(**self._CORRECTNESS_TRANSFORM_AFFINE_RANGES, expand=expand, center=center) + + torch.manual_seed(seed) + params = transform._get_params([bounding_boxes]) + + torch.manual_seed(seed) + actual = transform(bounding_boxes) + + expected = self._reference_rotate_bounding_boxes(bounding_boxes, **params, expand=expand, center=center) + + torch.testing.assert_close(actual, expected) + torch.testing.assert_close(F.get_size(actual), F.get_size(expected), atol=2 if expand else 0, rtol=0) + + @pytest.mark.parametrize("degrees", _EXHAUSTIVE_TYPE_TRANSFORM_AFFINE_RANGES["degrees"]) + @pytest.mark.parametrize("seed", list(range(10))) + def test_transform_get_params_bounds(self, degrees, seed): + transform = transforms.RandomRotation(degrees=degrees) + + torch.manual_seed(seed) + params = transform._get_params([]) + + if isinstance(degrees, (int, float)): + assert -degrees <= params["angle"] <= degrees + else: + assert degrees[0] <= params["angle"] <= degrees[1] + + @pytest.mark.parametrize("param", ["degrees", "center"]) + @pytest.mark.parametrize("value", [0, [0], [0, 0, 0]]) + def test_transform_sequence_len_errors(self, param, value): + if param == "degrees" and not isinstance(value, list): + return + + kwargs = {param: value} + if param != "degrees": + kwargs["degrees"] = 0 + + with pytest.raises( + ValueError if isinstance(value, list) else TypeError, match=f"{param} should be a sequence of length 2" + ): + transforms.RandomRotation(**kwargs) + + def test_transform_negative_degrees_error(self): + with pytest.raises(ValueError, match="If degrees is a single number, it must be positive"): + transforms.RandomAffine(degrees=-1) + + def test_transform_unknown_fill_error(self): + with pytest.raises(TypeError, match="Got inappropriate fill arg"): + transforms.RandomAffine(degrees=0, fill="fill") + + @pytest.mark.parametrize("size", [(11, 17), (16, 16)]) + @pytest.mark.parametrize("angle", [0, 90, 180, 270]) + @pytest.mark.parametrize("expand", [False, True]) + def test_functional_image_fast_path_correctness(self, size, angle, expand): + image = make_image(size, dtype=torch.uint8, device="cpu") + + actual = F.rotate(image, angle=angle, expand=expand) + expected = F.to_image(F.rotate(F.to_pil_image(image), angle=angle, expand=expand)) + + torch.testing.assert_close(actual, expected) + + +class TestContainerTransforms: + class BuiltinTransform(transforms.Transform): + def _transform(self, inpt, params): + return inpt + + class PackedInputTransform(nn.Module): + def forward(self, sample): + assert len(sample) == 2 + return sample + + class UnpackedInputTransform(nn.Module): + def forward(self, image, label): + return image, label + + @pytest.mark.parametrize( + "transform_cls", [transforms.Compose, functools.partial(transforms.RandomApply, p=1), transforms.RandomOrder] + ) + @pytest.mark.parametrize( + "wrapped_transform_clss", + [ + [BuiltinTransform], + [PackedInputTransform], + [UnpackedInputTransform], + [BuiltinTransform, BuiltinTransform], + [PackedInputTransform, PackedInputTransform], + [UnpackedInputTransform, UnpackedInputTransform], + [BuiltinTransform, PackedInputTransform, BuiltinTransform], + [BuiltinTransform, UnpackedInputTransform, BuiltinTransform], + [PackedInputTransform, BuiltinTransform, PackedInputTransform], + [UnpackedInputTransform, BuiltinTransform, UnpackedInputTransform], + ], + ) + @pytest.mark.parametrize("unpack", [True, False]) + def test_packed_unpacked(self, transform_cls, wrapped_transform_clss, unpack): + needs_packed_inputs = any(issubclass(cls, self.PackedInputTransform) for cls in wrapped_transform_clss) + needs_unpacked_inputs = any(issubclass(cls, self.UnpackedInputTransform) for cls in wrapped_transform_clss) + assert not (needs_packed_inputs and needs_unpacked_inputs) + + transform = transform_cls([cls() for cls in wrapped_transform_clss]) + + image = make_image() + label = 3 + packed_input = (image, label) + + def call_transform(): + if unpack: + return transform(*packed_input) + else: + return transform(packed_input) + + if needs_unpacked_inputs and not unpack: + with pytest.raises(TypeError, match="missing 1 required positional argument"): + call_transform() + elif needs_packed_inputs and unpack: + with pytest.raises(TypeError, match="takes 2 positional arguments but 3 were given"): + call_transform() + else: + output = call_transform() + + assert isinstance(output, tuple) and len(output) == 2 + assert output[0] is image + assert output[1] is label + + def test_compose(self): + transform = transforms.Compose( + [ + transforms.RandomHorizontalFlip(p=1), + transforms.RandomVerticalFlip(p=1), + ] + ) + + input = make_image() + + actual = check_transform(transform, input) + expected = F.vertical_flip(F.horizontal_flip(input)) + + assert_equal(actual, expected) + + @pytest.mark.parametrize("p", [0.0, 1.0]) + @pytest.mark.parametrize("sequence_type", [list, nn.ModuleList]) + def test_random_apply(self, p, sequence_type): + transform = transforms.RandomApply( + sequence_type( + [ + transforms.RandomHorizontalFlip(p=1), + transforms.RandomVerticalFlip(p=1), + ] + ), + p=p, + ) + + # This needs to be a pure tensor (or a PIL image), because otherwise check_transforms skips the v1 compatibility + # check + input = make_image_tensor() + output = check_transform(transform, input, check_v1_compatibility=issubclass(sequence_type, nn.ModuleList)) + + if p == 1: + assert_equal(output, F.vertical_flip(F.horizontal_flip(input))) + else: + assert output is input + + @pytest.mark.parametrize("p", [(0, 1), (1, 0)]) + def test_random_choice(self, p): + transform = transforms.RandomChoice( + [ + transforms.RandomHorizontalFlip(p=1), + transforms.RandomVerticalFlip(p=1), + ], + p=p, + ) + + input = make_image() + output = check_transform(transform, input) + + p_horz, p_vert = p + if p_horz: + assert_equal(output, F.horizontal_flip(input)) + else: + assert_equal(output, F.vertical_flip(input)) + + def test_random_order(self): + transform = transforms.Compose( + [ + transforms.RandomHorizontalFlip(p=1), + transforms.RandomVerticalFlip(p=1), + ] + ) + + input = make_image() + + actual = check_transform(transform, input) + # We can't really check whether the transforms are actually applied in random order. However, horizontal and + # vertical flip are commutative. Meaning, even under the assumption that the transform applies them in random + # order, we can use a fixed order to compute the expected value. + expected = F.vertical_flip(F.horizontal_flip(input)) + + assert_equal(actual, expected) + + def test_errors(self): + for cls in [transforms.Compose, transforms.RandomChoice, transforms.RandomOrder]: + with pytest.raises(TypeError, match="Argument transforms should be a sequence of callables"): + cls(lambda x: x) + + with pytest.raises(ValueError, match="at least one transform"): + transforms.Compose([]) + + for p in [-1, 2]: + with pytest.raises(ValueError, match=re.escape("value in the interval [0.0, 1.0]")): + transforms.RandomApply([lambda x: x], p=p) + + for transforms_, p in [([lambda x: x], []), ([], [1.0])]: + with pytest.raises(ValueError, match="Length of p doesn't match the number of transforms"): + transforms.RandomChoice(transforms_, p=p) + + +class TestToDtype: + @pytest.mark.parametrize( + ("kernel", "make_input"), + [ + (F.to_dtype_image, make_image_tensor), + (F.to_dtype_image, make_image), + (F.to_dtype_video, make_video), + ], + ) + @pytest.mark.parametrize("input_dtype", [torch.float32, torch.float64, torch.uint8]) + @pytest.mark.parametrize("output_dtype", [torch.float32, torch.float64, torch.uint8]) + @pytest.mark.parametrize("device", cpu_and_cuda()) + @pytest.mark.parametrize("scale", (True, False)) + def test_kernel(self, kernel, make_input, input_dtype, output_dtype, device, scale): + check_kernel( + kernel, + make_input(dtype=input_dtype, device=device), + dtype=output_dtype, + scale=scale, + ) + + @pytest.mark.parametrize("make_input", [make_image_tensor, make_image, make_video]) + @pytest.mark.parametrize("input_dtype", [torch.float32, torch.float64, torch.uint8]) + @pytest.mark.parametrize("output_dtype", [torch.float32, torch.float64, torch.uint8]) + @pytest.mark.parametrize("device", cpu_and_cuda()) + @pytest.mark.parametrize("scale", (True, False)) + def test_functional(self, make_input, input_dtype, output_dtype, device, scale): + check_functional( + F.to_dtype, + make_input(dtype=input_dtype, device=device), + dtype=output_dtype, + scale=scale, + ) + + @pytest.mark.parametrize( + "make_input", + [make_image_tensor, make_image, make_bounding_boxes, make_segmentation_mask, make_video], + ) + @pytest.mark.parametrize("input_dtype", [torch.float32, torch.float64, torch.uint8]) + @pytest.mark.parametrize("output_dtype", [torch.float32, torch.float64, torch.uint8]) + @pytest.mark.parametrize("device", cpu_and_cuda()) + @pytest.mark.parametrize("scale", (True, False)) + @pytest.mark.parametrize("as_dict", (True, False)) + def test_transform(self, make_input, input_dtype, output_dtype, device, scale, as_dict): + input = make_input(dtype=input_dtype, device=device) + if as_dict: + output_dtype = {type(input): output_dtype} + check_transform(transforms.ToDtype(dtype=output_dtype, scale=scale), input, check_sample_input=not as_dict) + + def reference_convert_dtype_image_tensor(self, image, dtype=torch.float, scale=False): + input_dtype = image.dtype + output_dtype = dtype + + if not scale: + return image.to(dtype) + + if output_dtype == input_dtype: + return image + + def fn(value): + if input_dtype.is_floating_point: + if output_dtype.is_floating_point: + return value + else: + return round(decimal.Decimal(value) * torch.iinfo(output_dtype).max) + else: + input_max_value = torch.iinfo(input_dtype).max + + if output_dtype.is_floating_point: + return float(decimal.Decimal(value) / input_max_value) + else: + output_max_value = torch.iinfo(output_dtype).max + + if input_max_value > output_max_value: + factor = (input_max_value + 1) // (output_max_value + 1) + return value / factor + else: + factor = (output_max_value + 1) // (input_max_value + 1) + return value * factor + + return torch.tensor(tree_map(fn, image.tolist()), dtype=dtype, device=image.device) + + @pytest.mark.parametrize("input_dtype", [torch.float32, torch.float64, torch.uint8]) + @pytest.mark.parametrize("output_dtype", [torch.float32, torch.float64, torch.uint8]) + @pytest.mark.parametrize("device", cpu_and_cuda()) + @pytest.mark.parametrize("scale", (True, False)) + def test_image_correctness(self, input_dtype, output_dtype, device, scale): + if input_dtype.is_floating_point and output_dtype == torch.int64: + pytest.xfail("float to int64 conversion is not supported") + + input = make_image(dtype=input_dtype, device=device) + + out = F.to_dtype(input, dtype=output_dtype, scale=scale) + expected = self.reference_convert_dtype_image_tensor(input, dtype=output_dtype, scale=scale) + + if input_dtype.is_floating_point and not output_dtype.is_floating_point and scale: + torch.testing.assert_close(out, expected, atol=1, rtol=0) + else: + torch.testing.assert_close(out, expected) + + def was_scaled(self, inpt): + # this assumes the target dtype is float + return inpt.max() <= 1 + + def make_inpt_with_bbox_and_mask(self, make_input): + H, W = 10, 10 + inpt_dtype = torch.uint8 + bbox_dtype = torch.float32 + mask_dtype = torch.bool + sample = { + "inpt": make_input(size=(H, W), dtype=inpt_dtype), + "bbox": make_bounding_boxes(canvas_size=(H, W), dtype=bbox_dtype), + "mask": make_detection_masks(size=(H, W), dtype=mask_dtype), + } + + return sample, inpt_dtype, bbox_dtype, mask_dtype + + @pytest.mark.parametrize("make_input", (make_image_tensor, make_image, make_video)) + @pytest.mark.parametrize("scale", (True, False)) + def test_dtype_not_a_dict(self, make_input, scale): + # assert only inpt gets transformed when dtype isn't a dict + + sample, inpt_dtype, bbox_dtype, mask_dtype = self.make_inpt_with_bbox_and_mask(make_input) + out = transforms.ToDtype(dtype=torch.float32, scale=scale)(sample) + + assert out["inpt"].dtype != inpt_dtype + assert out["inpt"].dtype == torch.float32 + if scale: + assert self.was_scaled(out["inpt"]) + else: + assert not self.was_scaled(out["inpt"]) + assert out["bbox"].dtype == bbox_dtype + assert out["mask"].dtype == mask_dtype + + @pytest.mark.parametrize("make_input", (make_image_tensor, make_image, make_video)) + def test_others_catch_all_and_none(self, make_input): + # make sure "others" works as a catch-all and that None means no conversion + + sample, inpt_dtype, bbox_dtype, mask_dtype = self.make_inpt_with_bbox_and_mask(make_input) + out = transforms.ToDtype(dtype={tv_tensors.Mask: torch.int64, "others": None})(sample) + assert out["inpt"].dtype == inpt_dtype + assert out["bbox"].dtype == bbox_dtype + assert out["mask"].dtype != mask_dtype + assert out["mask"].dtype == torch.int64 + + @pytest.mark.parametrize("make_input", (make_image_tensor, make_image, make_video)) + def test_typical_use_case(self, make_input): + # Typical use-case: want to convert dtype and scale for inpt and just dtype for masks. + # This just makes sure we now have a decent API for this + + sample, inpt_dtype, bbox_dtype, mask_dtype = self.make_inpt_with_bbox_and_mask(make_input) + out = transforms.ToDtype( + dtype={type(sample["inpt"]): torch.float32, tv_tensors.Mask: torch.int64, "others": None}, scale=True + )(sample) + assert out["inpt"].dtype != inpt_dtype + assert out["inpt"].dtype == torch.float32 + assert self.was_scaled(out["inpt"]) + assert out["bbox"].dtype == bbox_dtype + assert out["mask"].dtype != mask_dtype + assert out["mask"].dtype == torch.int64 + + @pytest.mark.parametrize("make_input", (make_image_tensor, make_image, make_video)) + def test_errors_warnings(self, make_input): + sample, inpt_dtype, bbox_dtype, mask_dtype = self.make_inpt_with_bbox_and_mask(make_input) + + with pytest.raises(ValueError, match="No dtype was specified for"): + out = transforms.ToDtype(dtype={tv_tensors.Mask: torch.float32})(sample) + with pytest.warns(UserWarning, match=re.escape("plain `torch.Tensor` will *not* be transformed")): + transforms.ToDtype(dtype={torch.Tensor: torch.float32, tv_tensors.Image: torch.float32}) + with pytest.warns(UserWarning, match="no scaling will be done"): + out = transforms.ToDtype(dtype={"others": None}, scale=True)(sample) + assert out["inpt"].dtype == inpt_dtype + assert out["bbox"].dtype == bbox_dtype + assert out["mask"].dtype == mask_dtype + + +class TestAdjustBrightness: + _CORRECTNESS_BRIGHTNESS_FACTORS = [0.5, 0.0, 1.0, 5.0] + _DEFAULT_BRIGHTNESS_FACTOR = _CORRECTNESS_BRIGHTNESS_FACTORS[0] + + @pytest.mark.parametrize( + ("kernel", "make_input"), + [ + (F.adjust_brightness_image, make_image), + (F.adjust_brightness_video, make_video), + ], + ) + @pytest.mark.parametrize("dtype", [torch.float32, torch.uint8]) + @pytest.mark.parametrize("device", cpu_and_cuda()) + def test_kernel(self, kernel, make_input, dtype, device): + check_kernel(kernel, make_input(dtype=dtype, device=device), brightness_factor=self._DEFAULT_BRIGHTNESS_FACTOR) + + @pytest.mark.parametrize("make_input", [make_image_tensor, make_image_pil, make_image, make_video]) + def test_functional(self, make_input): + check_functional(F.adjust_brightness, make_input(), brightness_factor=self._DEFAULT_BRIGHTNESS_FACTOR) + + @pytest.mark.parametrize( + ("kernel", "input_type"), + [ + (F.adjust_brightness_image, torch.Tensor), + (F._color._adjust_brightness_image_pil, PIL.Image.Image), + (F.adjust_brightness_image, tv_tensors.Image), + (F.adjust_brightness_video, tv_tensors.Video), + ], + ) + def test_functional_signature(self, kernel, input_type): + check_functional_kernel_signature_match(F.adjust_brightness, kernel=kernel, input_type=input_type) + + @pytest.mark.parametrize("brightness_factor", _CORRECTNESS_BRIGHTNESS_FACTORS) + def test_image_correctness(self, brightness_factor): + image = make_image(dtype=torch.uint8, device="cpu") + + actual = F.adjust_brightness(image, brightness_factor=brightness_factor) + expected = F.to_image(F.adjust_brightness(F.to_pil_image(image), brightness_factor=brightness_factor)) + + torch.testing.assert_close(actual, expected) + + +class TestCutMixMixUp: + class DummyDataset: + def __init__(self, size, num_classes, one_hot_labels): + self.size = size + self.num_classes = num_classes + self.one_hot_labels = one_hot_labels + assert size < num_classes + + def __getitem__(self, idx): + img = torch.rand(3, 100, 100) + label = idx # This ensures all labels in a batch are unique and makes testing easier + if self.one_hot_labels: + label = torch.nn.functional.one_hot(torch.tensor(label), num_classes=self.num_classes) + return img, label + + def __len__(self): + return self.size + + @pytest.mark.parametrize("T", [transforms.CutMix, transforms.MixUp]) + @pytest.mark.parametrize("one_hot_labels", (True, False)) + def test_supported_input_structure(self, T, one_hot_labels): + + batch_size = 32 + num_classes = 100 + + dataset = self.DummyDataset(size=batch_size, num_classes=num_classes, one_hot_labels=one_hot_labels) + + cutmix_mixup = T(num_classes=num_classes) + + dl = DataLoader(dataset, batch_size=batch_size) + + # Input sanity checks + img, target = next(iter(dl)) + input_img_size = img.shape[-3:] + assert isinstance(img, torch.Tensor) and isinstance(target, torch.Tensor) + assert target.shape == (batch_size, num_classes) if one_hot_labels else (batch_size,) + + def check_output(img, target): + assert img.shape == (batch_size, *input_img_size) + assert target.shape == (batch_size, num_classes) + torch.testing.assert_close(target.sum(axis=-1), torch.ones(batch_size)) + num_non_zero_labels = (target != 0).sum(axis=-1) + assert (num_non_zero_labels == 2).all() + + # After Dataloader, as unpacked input + img, target = next(iter(dl)) + assert target.shape == (batch_size, num_classes) if one_hot_labels else (batch_size,) + img, target = cutmix_mixup(img, target) + check_output(img, target) + + # After Dataloader, as packed input + packed_from_dl = next(iter(dl)) + assert isinstance(packed_from_dl, list) + img, target = cutmix_mixup(packed_from_dl) + check_output(img, target) + + # As collation function. We expect default_collate to be used by users. + def collate_fn_1(batch): + return cutmix_mixup(default_collate(batch)) + + def collate_fn_2(batch): + return cutmix_mixup(*default_collate(batch)) + + for collate_fn in (collate_fn_1, collate_fn_2): + dl = DataLoader(dataset, batch_size=batch_size, collate_fn=collate_fn) + img, target = next(iter(dl)) + check_output(img, target) + + @needs_cuda + @pytest.mark.parametrize("T", [transforms.CutMix, transforms.MixUp]) + def test_cpu_vs_gpu(self, T): + num_classes = 10 + batch_size = 3 + H, W = 12, 12 + + imgs = torch.rand(batch_size, 3, H, W) + labels = torch.randint(0, num_classes, (batch_size,)) + cutmix_mixup = T(alpha=0.5, num_classes=num_classes) + + _check_kernel_cuda_vs_cpu(cutmix_mixup, imgs, labels, rtol=None, atol=None) + + @pytest.mark.parametrize("T", [transforms.CutMix, transforms.MixUp]) + def test_error(self, T): + + num_classes = 10 + batch_size = 9 + + imgs = torch.rand(batch_size, 3, 12, 12) + cutmix_mixup = T(alpha=0.5, num_classes=num_classes) + + for input_with_bad_type in ( + F.to_pil_image(imgs[0]), + tv_tensors.Mask(torch.rand(12, 12)), + tv_tensors.BoundingBoxes(torch.rand(2, 4), format="XYXY", canvas_size=12), + ): + with pytest.raises(ValueError, match="does not support PIL images, "): + cutmix_mixup(input_with_bad_type) + + with pytest.raises(ValueError, match="Could not infer where the labels are"): + cutmix_mixup({"img": imgs, "Nothing_else": 3}) + + with pytest.raises(ValueError, match="labels should be index based"): + # Note: the error message isn't ideal, but that's because the label heuristic found the img as the label + # It's OK, it's an edge-case. The important thing is that this fails loudly instead of passing silently + cutmix_mixup(imgs) + + with pytest.raises(ValueError, match="When using the default labels_getter"): + cutmix_mixup(imgs, "not_a_tensor") + + with pytest.raises(ValueError, match="Expected a batched input with 4 dims"): + cutmix_mixup(imgs[None, None], torch.randint(0, num_classes, size=(batch_size,))) + + with pytest.raises(ValueError, match="does not match the batch size of the labels"): + cutmix_mixup(imgs, torch.randint(0, num_classes, size=(batch_size + 1,))) + + with pytest.raises(ValueError, match="When passing 2D labels"): + wrong_num_classes = num_classes + 1 + T(alpha=0.5, num_classes=num_classes)(imgs, torch.randint(0, 2, size=(batch_size, wrong_num_classes))) + + with pytest.raises(ValueError, match="but got a tensor of shape"): + cutmix_mixup(imgs, torch.randint(0, 2, size=(2, 3, 4))) + + with pytest.raises(ValueError, match="num_classes must be passed"): + T(alpha=0.5)(imgs, torch.randint(0, num_classes, size=(batch_size,))) + + +@pytest.mark.parametrize("key", ("labels", "LABELS", "LaBeL", "SOME_WEIRD_KEY_THAT_HAS_LABeL_IN_IT")) +@pytest.mark.parametrize("sample_type", (tuple, list, dict)) +def test_labels_getter_default_heuristic(key, sample_type): + labels = torch.arange(10) + sample = {key: labels, "another_key": "whatever"} + if sample_type is not dict: + sample = sample_type((None, sample, "whatever_again")) + assert transforms._utils._find_labels_default_heuristic(sample) is labels + + if key.lower() != "labels": + # If "labels" is in the dict (case-insensitive), + # it takes precedence over other keys which would otherwise be a match + d = {key: "something_else", "labels": labels} + assert transforms._utils._find_labels_default_heuristic(d) is labels + + +class TestShapeGetters: + @pytest.mark.parametrize( + ("kernel", "make_input"), + [ + (F.get_dimensions_image, make_image_tensor), + (F._meta._get_dimensions_image_pil, make_image_pil), + (F.get_dimensions_image, make_image), + (F.get_dimensions_video, make_video), + ], + ) + def test_get_dimensions(self, kernel, make_input): + size = (10, 10) + color_space, num_channels = "RGB", 3 + + input = make_input(size, color_space=color_space) + + assert kernel(input) == F.get_dimensions(input) == [num_channels, *size] + + @pytest.mark.parametrize( + ("kernel", "make_input"), + [ + (F.get_num_channels_image, make_image_tensor), + (F._meta._get_num_channels_image_pil, make_image_pil), + (F.get_num_channels_image, make_image), + (F.get_num_channels_video, make_video), + ], + ) + def test_get_num_channels(self, kernel, make_input): + color_space, num_channels = "RGB", 3 + + input = make_input(color_space=color_space) + + assert kernel(input) == F.get_num_channels(input) == num_channels + + @pytest.mark.parametrize( + ("kernel", "make_input"), + [ + (F.get_size_image, make_image_tensor), + (F._meta._get_size_image_pil, make_image_pil), + (F.get_size_image, make_image), + (F.get_size_bounding_boxes, make_bounding_boxes), + (F.get_size_mask, make_detection_masks), + (F.get_size_mask, make_segmentation_mask), + (F.get_size_video, make_video), + ], + ) + def test_get_size(self, kernel, make_input): + size = (10, 10) + + input = make_input(size) + + assert kernel(input) == F.get_size(input) == list(size) + + @pytest.mark.parametrize( + ("kernel", "make_input"), + [ + (F.get_num_frames_video, make_video_tensor), + (F.get_num_frames_video, make_video), + ], + ) + def test_get_num_frames(self, kernel, make_input): + num_frames = 4 + + input = make_input(num_frames=num_frames) + + assert kernel(input) == F.get_num_frames(input) == num_frames + + @pytest.mark.parametrize( + ("functional", "make_input"), + [ + (F.get_dimensions, make_bounding_boxes), + (F.get_dimensions, make_detection_masks), + (F.get_dimensions, make_segmentation_mask), + (F.get_num_channels, make_bounding_boxes), + (F.get_num_channels, make_detection_masks), + (F.get_num_channels, make_segmentation_mask), + (F.get_num_frames, make_image_pil), + (F.get_num_frames, make_image), + (F.get_num_frames, make_bounding_boxes), + (F.get_num_frames, make_detection_masks), + (F.get_num_frames, make_segmentation_mask), + ], + ) + def test_unsupported_types(self, functional, make_input): + input = make_input() + + with pytest.raises(TypeError, match=re.escape(str(type(input)))): + functional(input) + + +class TestRegisterKernel: + @pytest.mark.parametrize("functional", (F.resize, "resize")) + def test_register_kernel(self, functional): + class CustomTVTensor(tv_tensors.TVTensor): + pass + + kernel_was_called = False + + @F.register_kernel(functional, CustomTVTensor) + def new_resize(dp, *args, **kwargs): + nonlocal kernel_was_called + kernel_was_called = True + return dp + + t = transforms.Resize(size=(224, 224), antialias=True) + + my_dp = CustomTVTensor(torch.rand(3, 10, 10)) + out = t(my_dp) + assert out is my_dp + assert kernel_was_called + + # Sanity check to make sure we didn't override the kernel of other types + t(torch.rand(3, 10, 10)).shape == (3, 224, 224) + t(tv_tensors.Image(torch.rand(3, 10, 10))).shape == (3, 224, 224) + + def test_errors(self): + with pytest.raises(ValueError, match="Could not find functional with name"): + F.register_kernel("bad_name", tv_tensors.Image) + + with pytest.raises(ValueError, match="Kernels can only be registered on functionals"): + F.register_kernel(tv_tensors.Image, F.resize) + + with pytest.raises(ValueError, match="Kernels can only be registered for subclasses"): + F.register_kernel(F.resize, object) + + with pytest.raises(ValueError, match="cannot be registered for the builtin tv_tensor classes"): + F.register_kernel(F.resize, tv_tensors.Image)(F.resize_image) + + class CustomTVTensor(tv_tensors.TVTensor): + pass + + def resize_custom_tv_tensor(): + pass + + F.register_kernel(F.resize, CustomTVTensor)(resize_custom_tv_tensor) + + with pytest.raises(ValueError, match="already has a kernel registered for type"): + F.register_kernel(F.resize, CustomTVTensor)(resize_custom_tv_tensor) + + +class TestGetKernel: + # We are using F.resize as functional and the kernels below as proxy. Any other functional / kernels combination + # would also be fine + KERNELS = { + torch.Tensor: F.resize_image, + PIL.Image.Image: F._geometry._resize_image_pil, + tv_tensors.Image: F.resize_image, + tv_tensors.BoundingBoxes: F.resize_bounding_boxes, + tv_tensors.Mask: F.resize_mask, + tv_tensors.Video: F.resize_video, + } + + @pytest.mark.parametrize("input_type", [str, int, object]) + def test_unsupported_types(self, input_type): + with pytest.raises(TypeError, match="supports inputs of type"): + _get_kernel(F.resize, input_type) + + def test_exact_match(self): + # We cannot use F.resize together with self.KERNELS mapping here directly here, since this is only the + # ideal wrapping. Practically, we have an intermediate wrapper layer. Thus, we create a new resize functional + # here, register the kernels without wrapper, and check the exact matching afterwards. + def resize_with_pure_kernels(): + pass + + for input_type, kernel in self.KERNELS.items(): + _register_kernel_internal(resize_with_pure_kernels, input_type, tv_tensor_wrapper=False)(kernel) + + assert _get_kernel(resize_with_pure_kernels, input_type) is kernel + + def test_builtin_tv_tensor_subclass(self): + # We cannot use F.resize together with self.KERNELS mapping here directly here, since this is only the + # ideal wrapping. Practically, we have an intermediate wrapper layer. Thus, we create a new resize functional + # here, register the kernels without wrapper, and check if subclasses of our builtin tv_tensors get dispatched + # to the kernel of the corresponding superclass + def resize_with_pure_kernels(): + pass + + class MyImage(tv_tensors.Image): + pass + + class MyBoundingBoxes(tv_tensors.BoundingBoxes): + pass + + class MyMask(tv_tensors.Mask): + pass + + class MyVideo(tv_tensors.Video): + pass + + for custom_tv_tensor_subclass in [ + MyImage, + MyBoundingBoxes, + MyMask, + MyVideo, + ]: + builtin_tv_tensor_class = custom_tv_tensor_subclass.__mro__[1] + builtin_tv_tensor_kernel = self.KERNELS[builtin_tv_tensor_class] + _register_kernel_internal(resize_with_pure_kernels, builtin_tv_tensor_class, tv_tensor_wrapper=False)( + builtin_tv_tensor_kernel + ) + + assert _get_kernel(resize_with_pure_kernels, custom_tv_tensor_subclass) is builtin_tv_tensor_kernel + + def test_tv_tensor_subclass(self): + class MyTVTensor(tv_tensors.TVTensor): + pass + + with pytest.raises(TypeError, match="supports inputs of type"): + _get_kernel(F.resize, MyTVTensor) + + def resize_my_tv_tensor(): + pass + + _register_kernel_internal(F.resize, MyTVTensor, tv_tensor_wrapper=False)(resize_my_tv_tensor) + + assert _get_kernel(F.resize, MyTVTensor) is resize_my_tv_tensor + + def test_pil_image_subclass(self): + opened_image = PIL.Image.open(Path(__file__).parent / "assets" / "encode_jpeg" / "grace_hopper_517x606.jpg") + loaded_image = opened_image.convert("RGB") + + # check the assumptions + assert isinstance(opened_image, PIL.Image.Image) + assert type(opened_image) is not PIL.Image.Image + + assert type(loaded_image) is PIL.Image.Image + + size = [17, 11] + for image in [opened_image, loaded_image]: + kernel = _get_kernel(F.resize, type(image)) + + output = kernel(image, size=size) + + assert F.get_size(output) == size + + +class TestPermuteChannels: + _DEFAULT_PERMUTATION = [2, 0, 1] + + @pytest.mark.parametrize( + ("kernel", "make_input"), + [ + (F.permute_channels_image, make_image_tensor), + # FIXME + # check_kernel does not support PIL kernel, but it should + (F.permute_channels_image, make_image), + (F.permute_channels_video, make_video), + ], + ) + @pytest.mark.parametrize("dtype", [torch.float32, torch.uint8]) + @pytest.mark.parametrize("device", cpu_and_cuda()) + def test_kernel(self, kernel, make_input, dtype, device): + check_kernel(kernel, make_input(dtype=dtype, device=device), permutation=self._DEFAULT_PERMUTATION) + + @pytest.mark.parametrize("make_input", [make_image_tensor, make_image_pil, make_image, make_video]) + def test_functional(self, make_input): + check_functional(F.permute_channels, make_input(), permutation=self._DEFAULT_PERMUTATION) + + @pytest.mark.parametrize( + ("kernel", "input_type"), + [ + (F.permute_channels_image, torch.Tensor), + (F._color._permute_channels_image_pil, PIL.Image.Image), + (F.permute_channels_image, tv_tensors.Image), + (F.permute_channels_video, tv_tensors.Video), + ], + ) + def test_functional_signature(self, kernel, input_type): + check_functional_kernel_signature_match(F.permute_channels, kernel=kernel, input_type=input_type) + + def reference_image_correctness(self, image, permutation): + channel_images = image.split(1, dim=-3) + permuted_channel_images = [channel_images[channel_idx] for channel_idx in permutation] + return tv_tensors.Image(torch.concat(permuted_channel_images, dim=-3)) + + @pytest.mark.parametrize("permutation", [[2, 0, 1], [1, 2, 0], [2, 0, 1], [0, 1, 2]]) + @pytest.mark.parametrize("batch_dims", [(), (2,), (2, 1)]) + def test_image_correctness(self, permutation, batch_dims): + image = make_image(batch_dims=batch_dims) + + actual = F.permute_channels(image, permutation=permutation) + expected = self.reference_image_correctness(image, permutation=permutation) + + torch.testing.assert_close(actual, expected) + + +class TestElastic: + def _make_displacement(self, inpt): + return torch.rand( + 1, + *F.get_size(inpt), + 2, + dtype=torch.float32, + device=inpt.device if isinstance(inpt, torch.Tensor) else "cpu", + ) + + @param_value_parametrization( + interpolation=[transforms.InterpolationMode.NEAREST, transforms.InterpolationMode.BILINEAR], + fill=EXHAUSTIVE_TYPE_FILLS, + ) + @pytest.mark.parametrize("dtype", [torch.float32, torch.uint8, torch.float16]) + @pytest.mark.parametrize("device", cpu_and_cuda()) + def test_kernel_image(self, param, value, dtype, device): + image = make_image_tensor(dtype=dtype, device=device) + + check_kernel( + F.elastic_image, + image, + displacement=self._make_displacement(image), + **{param: value}, + check_scripted_vs_eager=not (param == "fill" and isinstance(value, (int, float))), + check_cuda_vs_cpu=dtype is not torch.float16, + ) + + @pytest.mark.parametrize("format", list(tv_tensors.BoundingBoxFormat)) + @pytest.mark.parametrize("dtype", [torch.float32, torch.int64]) + @pytest.mark.parametrize("device", cpu_and_cuda()) + def test_kernel_bounding_boxes(self, format, dtype, device): + bounding_boxes = make_bounding_boxes(format=format, dtype=dtype, device=device) + + check_kernel( + F.elastic_bounding_boxes, + bounding_boxes, + format=bounding_boxes.format, + canvas_size=bounding_boxes.canvas_size, + displacement=self._make_displacement(bounding_boxes), + ) + + @pytest.mark.parametrize("make_mask", [make_segmentation_mask, make_detection_masks]) + def test_kernel_mask(self, make_mask): + mask = make_mask() + check_kernel(F.elastic_mask, mask, displacement=self._make_displacement(mask)) + + def test_kernel_video(self): + video = make_video() + check_kernel(F.elastic_video, video, displacement=self._make_displacement(video)) + + @pytest.mark.parametrize( + "make_input", + [make_image_tensor, make_image_pil, make_image, make_bounding_boxes, make_segmentation_mask, make_video], + ) + def test_functional(self, make_input): + input = make_input() + check_functional(F.elastic, input, displacement=self._make_displacement(input)) + + @pytest.mark.parametrize( + ("kernel", "input_type"), + [ + (F.elastic_image, torch.Tensor), + (F._geometry._elastic_image_pil, PIL.Image.Image), + (F.elastic_image, tv_tensors.Image), + (F.elastic_bounding_boxes, tv_tensors.BoundingBoxes), + (F.elastic_mask, tv_tensors.Mask), + (F.elastic_video, tv_tensors.Video), + ], + ) + def test_functional_signature(self, kernel, input_type): + check_functional_kernel_signature_match(F.elastic, kernel=kernel, input_type=input_type) + + @pytest.mark.parametrize( + "make_input", + [make_image_tensor, make_image_pil, make_image, make_bounding_boxes, make_segmentation_mask, make_video], + ) + def test_displacement_error(self, make_input): + input = make_input() + + with pytest.raises(TypeError, match="displacement should be a Tensor"): + F.elastic(input, displacement=None) + + with pytest.raises(ValueError, match="displacement shape should be"): + F.elastic(input, displacement=torch.rand(F.get_size(input))) + + @pytest.mark.parametrize( + "make_input", + [make_image_tensor, make_image_pil, make_image, make_bounding_boxes, make_segmentation_mask, make_video], + ) + # ElasticTransform needs larger images to avoid the needed internal padding being larger than the actual image + @pytest.mark.parametrize("size", [(163, 163), (72, 333), (313, 95)]) + @pytest.mark.parametrize("device", cpu_and_cuda()) + def test_transform(self, make_input, size, device): + # We have to skip that test on M1 because it's flaky: Mismatched elements: 35 / 89205 (0.0%) + # See https://github.com/pytorch/vision/issues/8154 + # All other platforms are fine, so the differences do not come from something we own in torchvision + check_v1_compatibility = False if sys.platform == "darwin" else dict(rtol=0, atol=1) + + check_transform( + transforms.ElasticTransform(), + make_input(size, device=device), + check_v1_compatibility=check_v1_compatibility, + ) + + +class TestToPureTensor: + def test_correctness(self): + input = { + "img": make_image(), + "img_tensor": make_image_tensor(), + "img_pil": make_image_pil(), + "mask": make_detection_masks(), + "video": make_video(), + "bbox": make_bounding_boxes(), + "str": "str", + } + + out = transforms.ToPureTensor()(input) + + for input_value, out_value in zip(input.values(), out.values()): + if isinstance(input_value, tv_tensors.TVTensor): + assert isinstance(out_value, torch.Tensor) and not isinstance(out_value, tv_tensors.TVTensor) + else: + assert isinstance(out_value, type(input_value)) + + +class TestCrop: + INPUT_SIZE = (21, 11) + + CORRECTNESS_CROP_KWARGS = [ + # center + dict(top=5, left=5, height=10, width=5), + # larger than input, i.e. pad + dict(top=-5, left=-5, height=30, width=20), + # sides: left, right, top, bottom + dict(top=-5, left=-5, height=30, width=10), + dict(top=-5, left=5, height=30, width=10), + dict(top=-5, left=-5, height=20, width=20), + dict(top=5, left=-5, height=20, width=20), + # corners: top-left, top-right, bottom-left, bottom-right + dict(top=-5, left=-5, height=20, width=10), + dict(top=-5, left=5, height=20, width=10), + dict(top=5, left=-5, height=20, width=10), + dict(top=5, left=5, height=20, width=10), + ] + MINIMAL_CROP_KWARGS = CORRECTNESS_CROP_KWARGS[0] + + @pytest.mark.parametrize("kwargs", CORRECTNESS_CROP_KWARGS) + @pytest.mark.parametrize("dtype", [torch.uint8, torch.float32]) + @pytest.mark.parametrize("device", cpu_and_cuda()) + def test_kernel_image(self, kwargs, dtype, device): + check_kernel(F.crop_image, make_image(self.INPUT_SIZE, dtype=dtype, device=device), **kwargs) + + @pytest.mark.parametrize("kwargs", CORRECTNESS_CROP_KWARGS) + @pytest.mark.parametrize("format", list(tv_tensors.BoundingBoxFormat)) + @pytest.mark.parametrize("dtype", [torch.float32, torch.int64]) + @pytest.mark.parametrize("device", cpu_and_cuda()) + def test_kernel_bounding_box(self, kwargs, format, dtype, device): + bounding_boxes = make_bounding_boxes(self.INPUT_SIZE, format=format, dtype=dtype, device=device) + check_kernel(F.crop_bounding_boxes, bounding_boxes, format=format, **kwargs) + + @pytest.mark.parametrize("make_mask", [make_segmentation_mask, make_detection_masks]) + def test_kernel_mask(self, make_mask): + check_kernel(F.crop_mask, make_mask(self.INPUT_SIZE), **self.MINIMAL_CROP_KWARGS) + + def test_kernel_video(self): + check_kernel(F.crop_video, make_video(self.INPUT_SIZE), **self.MINIMAL_CROP_KWARGS) + + @pytest.mark.parametrize( + "make_input", + [make_image_tensor, make_image_pil, make_image, make_bounding_boxes, make_segmentation_mask, make_video], + ) + def test_functional(self, make_input): + check_functional(F.crop, make_input(self.INPUT_SIZE), **self.MINIMAL_CROP_KWARGS) + + @pytest.mark.parametrize( + ("kernel", "input_type"), + [ + (F.crop_image, torch.Tensor), + (F._geometry._crop_image_pil, PIL.Image.Image), + (F.crop_image, tv_tensors.Image), + (F.crop_bounding_boxes, tv_tensors.BoundingBoxes), + (F.crop_mask, tv_tensors.Mask), + (F.crop_video, tv_tensors.Video), + ], + ) + def test_functional_signature(self, kernel, input_type): + check_functional_kernel_signature_match(F.crop, kernel=kernel, input_type=input_type) + + @pytest.mark.parametrize("kwargs", CORRECTNESS_CROP_KWARGS) + def test_functional_image_correctness(self, kwargs): + image = make_image(self.INPUT_SIZE, dtype=torch.uint8, device="cpu") + + actual = F.crop(image, **kwargs) + expected = F.to_image(F.crop(F.to_pil_image(image), **kwargs)) + + assert_equal(actual, expected) + + @param_value_parametrization( + size=[(10, 5), (25, 15), (25, 5), (10, 15)], + fill=EXHAUSTIVE_TYPE_FILLS, + ) + @pytest.mark.parametrize( + "make_input", + [make_image_tensor, make_image_pil, make_image, make_bounding_boxes, make_segmentation_mask, make_video], + ) + def test_transform(self, param, value, make_input): + input = make_input(self.INPUT_SIZE) + + check_sample_input = True + if param == "fill": + if isinstance(value, (tuple, list)): + if isinstance(input, tv_tensors.Mask): + pytest.skip("F.pad_mask doesn't support non-scalar fill.") + else: + check_sample_input = False + + kwargs = dict( + # 1. size is required + # 2. the fill parameter only has an affect if we need padding + size=[s + 4 for s in self.INPUT_SIZE], + fill=adapt_fill(value, dtype=input.dtype if isinstance(input, torch.Tensor) else torch.uint8), + ) + else: + kwargs = {param: value} + + check_transform( + transforms.RandomCrop(**kwargs, pad_if_needed=True), + input, + check_v1_compatibility=param != "fill" or isinstance(value, (int, float)), + check_sample_input=check_sample_input, + ) + + @pytest.mark.parametrize("padding", [1, (1, 1), (1, 1, 1, 1)]) + def test_transform_padding(self, padding): + inpt = make_image(self.INPUT_SIZE) + + output_size = [s + 2 for s in F.get_size(inpt)] + transform = transforms.RandomCrop(output_size, padding=padding) + + output = transform(inpt) + + assert F.get_size(output) == output_size + + @pytest.mark.parametrize("padding", [None, 1, (1, 1), (1, 1, 1, 1)]) + def test_transform_insufficient_padding(self, padding): + inpt = make_image(self.INPUT_SIZE) + + output_size = [s + 3 for s in F.get_size(inpt)] + transform = transforms.RandomCrop(output_size, padding=padding) + + with pytest.raises(ValueError, match="larger than (padded )?input image size"): + transform(inpt) + + def test_transform_pad_if_needed(self): + inpt = make_image(self.INPUT_SIZE) + + output_size = [s * 2 for s in F.get_size(inpt)] + transform = transforms.RandomCrop(output_size, pad_if_needed=True) + + output = transform(inpt) + + assert F.get_size(output) == output_size + + @param_value_parametrization( + size=[(10, 5), (25, 15), (25, 5), (10, 15)], + fill=CORRECTNESS_FILLS, + padding_mode=["constant", "edge", "reflect", "symmetric"], + ) + @pytest.mark.parametrize("seed", list(range(5))) + def test_transform_image_correctness(self, param, value, seed): + kwargs = {param: value} + if param != "size": + # 1. size is required + # 2. the fill / padding_mode parameters only have an affect if we need padding + kwargs["size"] = [s + 4 for s in self.INPUT_SIZE] + if param == "fill": + kwargs["fill"] = adapt_fill(kwargs["fill"], dtype=torch.uint8) + + transform = transforms.RandomCrop(pad_if_needed=True, **kwargs) + + image = make_image(self.INPUT_SIZE) + + with freeze_rng_state(): + torch.manual_seed(seed) + actual = transform(image) + + torch.manual_seed(seed) + expected = F.to_image(transform(F.to_pil_image(image))) + + assert_equal(actual, expected) + + def _reference_crop_bounding_boxes(self, bounding_boxes, *, top, left, height, width): + affine_matrix = np.array( + [ + [1, 0, -left], + [0, 1, -top], + ], + ) + return reference_affine_bounding_boxes_helper( + bounding_boxes, affine_matrix=affine_matrix, new_canvas_size=(height, width) + ) + + @pytest.mark.parametrize("kwargs", CORRECTNESS_CROP_KWARGS) + @pytest.mark.parametrize("format", list(tv_tensors.BoundingBoxFormat)) + @pytest.mark.parametrize("dtype", [torch.float32, torch.int64]) + @pytest.mark.parametrize("device", cpu_and_cuda()) + def test_functional_bounding_box_correctness(self, kwargs, format, dtype, device): + bounding_boxes = make_bounding_boxes(self.INPUT_SIZE, format=format, dtype=dtype, device=device) + + actual = F.crop(bounding_boxes, **kwargs) + expected = self._reference_crop_bounding_boxes(bounding_boxes, **kwargs) + + assert_equal(actual, expected, atol=1, rtol=0) + assert_equal(F.get_size(actual), F.get_size(expected)) + + @pytest.mark.parametrize("output_size", [(17, 11), (11, 17), (11, 11)]) + @pytest.mark.parametrize("format", list(tv_tensors.BoundingBoxFormat)) + @pytest.mark.parametrize("dtype", [torch.float32, torch.int64]) + @pytest.mark.parametrize("device", cpu_and_cuda()) + @pytest.mark.parametrize("seed", list(range(5))) + def test_transform_bounding_boxes_correctness(self, output_size, format, dtype, device, seed): + input_size = [s * 2 for s in output_size] + bounding_boxes = make_bounding_boxes(input_size, format=format, dtype=dtype, device=device) + + transform = transforms.RandomCrop(output_size) + + with freeze_rng_state(): + torch.manual_seed(seed) + params = transform._get_params([bounding_boxes]) + assert not params.pop("needs_pad") + del params["padding"] + assert params.pop("needs_crop") + + torch.manual_seed(seed) + actual = transform(bounding_boxes) + + expected = self._reference_crop_bounding_boxes(bounding_boxes, **params) + + assert_equal(actual, expected) + assert_equal(F.get_size(actual), F.get_size(expected)) + + def test_errors(self): + with pytest.raises(ValueError, match="Please provide only two dimensions"): + transforms.RandomCrop([10, 12, 14]) + + with pytest.raises(TypeError, match="Got inappropriate padding arg"): + transforms.RandomCrop([10, 12], padding="abc") + + with pytest.raises(ValueError, match="Padding must be an int or a 1, 2, or 4"): + transforms.RandomCrop([10, 12], padding=[-0.7, 0, 0.7]) + + with pytest.raises(TypeError, match="Got inappropriate fill arg"): + transforms.RandomCrop([10, 12], padding=1, fill="abc") + + with pytest.raises(ValueError, match="Padding mode should be either"): + transforms.RandomCrop([10, 12], padding=1, padding_mode="abc") + + +class TestErase: + INPUT_SIZE = (17, 11) + FUNCTIONAL_KWARGS = dict( + zip("ijhwv", [2, 2, 10, 8, torch.tensor(0.0, dtype=torch.float32, device="cpu").reshape(-1, 1, 1)]) + ) + + @pytest.mark.parametrize("dtype", [torch.float32, torch.uint8]) + @pytest.mark.parametrize("device", cpu_and_cuda()) + def test_kernel_image(self, dtype, device): + check_kernel(F.erase_image, make_image(self.INPUT_SIZE, dtype=dtype, device=device), **self.FUNCTIONAL_KWARGS) + + @pytest.mark.parametrize("dtype", [torch.float32, torch.uint8]) + @pytest.mark.parametrize("device", cpu_and_cuda()) + def test_kernel_image_inplace(self, dtype, device): + input = make_image(self.INPUT_SIZE, dtype=dtype, device=device) + input_version = input._version + + output_out_of_place = F.erase_image(input, **self.FUNCTIONAL_KWARGS) + assert output_out_of_place.data_ptr() != input.data_ptr() + assert output_out_of_place is not input + + output_inplace = F.erase_image(input, **self.FUNCTIONAL_KWARGS, inplace=True) + assert output_inplace.data_ptr() == input.data_ptr() + assert output_inplace._version > input_version + assert output_inplace is input + + assert_equal(output_inplace, output_out_of_place) + + def test_kernel_video(self): + check_kernel(F.erase_video, make_video(self.INPUT_SIZE), **self.FUNCTIONAL_KWARGS) + + @pytest.mark.parametrize( + "make_input", + [make_image_tensor, make_image_pil, make_image, make_video], + ) + def test_functional(self, make_input): + check_functional(F.erase, make_input(), **self.FUNCTIONAL_KWARGS) + + @pytest.mark.parametrize( + ("kernel", "input_type"), + [ + (F.erase_image, torch.Tensor), + (F._augment._erase_image_pil, PIL.Image.Image), + (F.erase_image, tv_tensors.Image), + (F.erase_video, tv_tensors.Video), + ], + ) + def test_functional_signature(self, kernel, input_type): + check_functional_kernel_signature_match(F.erase, kernel=kernel, input_type=input_type) + + @pytest.mark.parametrize( + "make_input", + [make_image_tensor, make_image_pil, make_image, make_video], + ) + @pytest.mark.parametrize("device", cpu_and_cuda()) + def test_transform(self, make_input, device): + input = make_input(device=device) + + with pytest.warns(UserWarning, match="currently passing through inputs of type"): + check_transform( + transforms.RandomErasing(p=1), + input, + check_v1_compatibility=not isinstance(input, PIL.Image.Image), + ) + + def _reference_erase_image(self, image, *, i, j, h, w, v): + mask = torch.zeros_like(image, dtype=torch.bool) + mask[..., i : i + h, j : j + w] = True + + # The broadcasting and type casting logic is handled automagically in the kernel through indexing + value = torch.broadcast_to(v, (*image.shape[:-2], h, w)).to(image) + + erased_image = torch.empty_like(image) + erased_image[mask] = value.flatten() + erased_image[~mask] = image[~mask] + + return erased_image + + @pytest.mark.parametrize("dtype", [torch.float32, torch.uint8]) + @pytest.mark.parametrize("device", cpu_and_cuda()) + def test_functional_image_correctness(self, dtype, device): + image = make_image(dtype=dtype, device=device) + + actual = F.erase(image, **self.FUNCTIONAL_KWARGS) + expected = self._reference_erase_image(image, **self.FUNCTIONAL_KWARGS) + + assert_equal(actual, expected) + + @param_value_parametrization( + scale=[(0.1, 0.2), [0.0, 1.0]], + ratio=[(0.3, 0.7), [0.1, 5.0]], + value=[0, 0.5, (0, 1, 0), [-0.2, 0.0, 1.3], "random"], + ) + @pytest.mark.parametrize("dtype", [torch.float32, torch.uint8]) + @pytest.mark.parametrize("device", cpu_and_cuda()) + @pytest.mark.parametrize("seed", list(range(5))) + def test_transform_image_correctness(self, param, value, dtype, device, seed): + transform = transforms.RandomErasing(**{param: value}, p=1) + + image = make_image(dtype=dtype, device=device) + + with freeze_rng_state(): + torch.manual_seed(seed) + # This emulates the random apply check that happens before _get_params is called + torch.rand(1) + params = transform._get_params([image]) + + torch.manual_seed(seed) + actual = transform(image) + + expected = self._reference_erase_image(image, **params) + + assert_equal(actual, expected) + + def test_transform_errors(self): + with pytest.raises(TypeError, match="Argument value should be either a number or str or a sequence"): + transforms.RandomErasing(value={}) + + with pytest.raises(ValueError, match="If value is str, it should be 'random'"): + transforms.RandomErasing(value="abc") + + with pytest.raises(TypeError, match="Scale should be a sequence"): + transforms.RandomErasing(scale=123) + + with pytest.raises(TypeError, match="Ratio should be a sequence"): + transforms.RandomErasing(ratio=123) + + with pytest.raises(ValueError, match="Scale should be between 0 and 1"): + transforms.RandomErasing(scale=[-1, 2]) + + transform = transforms.RandomErasing(value=[1, 2, 3, 4]) + + with pytest.raises(ValueError, match="If value is a sequence, it should have either a single value"): + transform._get_params([make_image()]) + + +class TestGaussianBlur: + @pytest.mark.parametrize("kernel_size", [1, 3, (3, 1), [3, 5]]) + @pytest.mark.parametrize("sigma", [None, 1.0, 1, (0.5,), [0.3], (0.3, 0.7), [0.9, 0.2]]) + def test_kernel_image(self, kernel_size, sigma): + check_kernel( + F.gaussian_blur_image, + make_image(), + kernel_size=kernel_size, + sigma=sigma, + check_scripted_vs_eager=not (isinstance(kernel_size, int) or isinstance(sigma, (float, int))), + ) + + def test_kernel_image_errors(self): + image = make_image_tensor() + + with pytest.raises(ValueError, match="kernel_size is a sequence its length should be 2"): + F.gaussian_blur_image(image, kernel_size=[1, 2, 3]) + + for kernel_size in [2, -1]: + with pytest.raises(ValueError, match="kernel_size should have odd and positive integers"): + F.gaussian_blur_image(image, kernel_size=kernel_size) + + with pytest.raises(ValueError, match="sigma is a sequence, its length should be 2"): + F.gaussian_blur_image(image, kernel_size=1, sigma=[1, 2, 3]) + + with pytest.raises(TypeError, match="sigma should be either float or sequence of floats"): + F.gaussian_blur_image(image, kernel_size=1, sigma=object()) + + with pytest.raises(ValueError, match="sigma should have positive values"): + F.gaussian_blur_image(image, kernel_size=1, sigma=-1) + + def test_kernel_video(self): + check_kernel(F.gaussian_blur_video, make_video(), kernel_size=(3, 3)) + + @pytest.mark.parametrize( + "make_input", + [make_image_tensor, make_image_pil, make_image, make_video], + ) + def test_functional(self, make_input): + check_functional(F.gaussian_blur, make_input(), kernel_size=(3, 3)) + + @pytest.mark.parametrize( + ("kernel", "input_type"), + [ + (F.gaussian_blur_image, torch.Tensor), + (F._misc._gaussian_blur_image_pil, PIL.Image.Image), + (F.gaussian_blur_image, tv_tensors.Image), + (F.gaussian_blur_video, tv_tensors.Video), + ], + ) + def test_functional_signature(self, kernel, input_type): + check_functional_kernel_signature_match(F.gaussian_blur, kernel=kernel, input_type=input_type) + + @pytest.mark.parametrize( + "make_input", + [make_image_tensor, make_image_pil, make_image, make_bounding_boxes, make_segmentation_mask, make_video], + ) + @pytest.mark.parametrize("device", cpu_and_cuda()) + @pytest.mark.parametrize("sigma", [5, 2.0, (0.5, 2), [1.3, 2.7]]) + def test_transform(self, make_input, device, sigma): + check_transform(transforms.GaussianBlur(kernel_size=3, sigma=sigma), make_input(device=device)) + + def test_assertions(self): + with pytest.raises(ValueError, match="Kernel size should be a tuple/list of two integers"): + transforms.GaussianBlur([10, 12, 14]) + + with pytest.raises(ValueError, match="Kernel size value should be an odd and positive number"): + transforms.GaussianBlur(4) + + with pytest.raises(ValueError, match="If sigma is a sequence its length should be 1 or 2. Got 3"): + transforms.GaussianBlur(3, sigma=[1, 2, 3]) + + with pytest.raises(ValueError, match="sigma values should be positive and of the form"): + transforms.GaussianBlur(3, sigma=-1.0) + + with pytest.raises(ValueError, match="sigma values should be positive and of the form"): + transforms.GaussianBlur(3, sigma=[2.0, 1.0]) + + with pytest.raises(TypeError, match="sigma should be a number or a sequence of numbers"): + transforms.GaussianBlur(3, sigma={}) + + @pytest.mark.parametrize("sigma", [10.0, [10.0, 12.0], (10, 12.0), [10]]) + def test__get_params(self, sigma): + transform = transforms.GaussianBlur(3, sigma=sigma) + params = transform._get_params([]) + + if isinstance(sigma, float): + assert params["sigma"][0] == params["sigma"][1] == sigma + elif isinstance(sigma, list) and len(sigma) == 1: + assert params["sigma"][0] == params["sigma"][1] == sigma[0] + else: + assert sigma[0] <= params["sigma"][0] <= sigma[1] + assert sigma[0] <= params["sigma"][1] <= sigma[1] + + # np_img = np.arange(3 * 10 * 12, dtype="uint8").reshape((10, 12, 3)) + # np_img2 = np.arange(26 * 28, dtype="uint8").reshape((26, 28)) + # { + # "10_12_3__3_3_0.8": cv2.GaussianBlur(np_img, ksize=(3, 3), sigmaX=0.8), + # "10_12_3__3_3_0.5": cv2.GaussianBlur(np_img, ksize=(3, 3), sigmaX=0.5), + # "10_12_3__3_5_0.8": cv2.GaussianBlur(np_img, ksize=(3, 5), sigmaX=0.8), + # "10_12_3__3_5_0.5": cv2.GaussianBlur(np_img, ksize=(3, 5), sigmaX=0.5), + # "26_28_1__23_23_1.7": cv2.GaussianBlur(np_img2, ksize=(23, 23), sigmaX=1.7), + # } + REFERENCE_GAUSSIAN_BLUR_IMAGE_RESULTS = torch.load( + Path(__file__).parent / "assets" / "gaussian_blur_opencv_results.pt", + weights_only=False, + ) + + @pytest.mark.parametrize( + ("dimensions", "kernel_size", "sigma"), + [ + ((3, 10, 12), (3, 3), 0.8), + ((3, 10, 12), (3, 3), 0.5), + ((3, 10, 12), (3, 5), 0.8), + ((3, 10, 12), (3, 5), 0.5), + ((1, 26, 28), (23, 23), 1.7), + ], + ) + @pytest.mark.parametrize("dtype", [torch.float32, torch.float64, torch.float16]) + @pytest.mark.parametrize("device", cpu_and_cuda()) + def test_functional_image_correctness(self, dimensions, kernel_size, sigma, dtype, device): + if dtype is torch.float16 and device == "cpu": + pytest.skip("The CPU implementation of float16 on CPU differs from opencv") + + num_channels, height, width = dimensions + + reference_results_key = f"{height}_{width}_{num_channels}__{kernel_size[0]}_{kernel_size[1]}_{sigma}" + expected = ( + torch.tensor(self.REFERENCE_GAUSSIAN_BLUR_IMAGE_RESULTS[reference_results_key]) + .reshape(height, width, num_channels) + .permute(2, 0, 1) + .to(dtype=dtype, device=device) + ) + + image = tv_tensors.Image( + torch.arange(num_channels * height * width, dtype=torch.uint8) + .reshape(height, width, num_channels) + .permute(2, 0, 1), + dtype=dtype, + device=device, + ) + + actual = F.gaussian_blur_image(image, kernel_size=kernel_size, sigma=sigma) + + torch.testing.assert_close(actual, expected, rtol=0, atol=1) + + +class TestGaussianNoise: + @pytest.mark.parametrize( + "make_input", + [make_image_tensor, make_image, make_video], + ) + def test_kernel(self, make_input): + check_kernel( + F.gaussian_noise, + make_input(dtype=torch.float32), + # This cannot pass because the noise on a batch in not per-image + check_batched_vs_unbatched=False, + ) + + @pytest.mark.parametrize( + "make_input", + [make_image_tensor, make_image, make_video], + ) + def test_functional(self, make_input): + check_functional(F.gaussian_noise, make_input(dtype=torch.float32)) + + @pytest.mark.parametrize( + ("kernel", "input_type"), + [ + (F.gaussian_noise, torch.Tensor), + (F.gaussian_noise_image, tv_tensors.Image), + (F.gaussian_noise_video, tv_tensors.Video), + ], + ) + def test_functional_signature(self, kernel, input_type): + check_functional_kernel_signature_match(F.gaussian_noise, kernel=kernel, input_type=input_type) + + @pytest.mark.parametrize( + "make_input", + [make_image_tensor, make_image, make_video], + ) + def test_transform(self, make_input): + def adapter(_, input, __): + # This transform doesn't support uint8 so we have to convert the auto-generated uint8 tensors to float32 + # Same for PIL images + for key, value in input.items(): + if isinstance(value, torch.Tensor) and not value.is_floating_point(): + input[key] = value.to(torch.float32) + if isinstance(value, PIL.Image.Image): + input[key] = F.pil_to_tensor(value).to(torch.float32) + return input + + check_transform(transforms.GaussianNoise(), make_input(dtype=torch.float32), check_sample_input=adapter) + + def test_bad_input(self): + with pytest.raises(ValueError, match="Gaussian Noise is not implemented for PIL images."): + F.gaussian_noise(make_image_pil()) + with pytest.raises(ValueError, match="Input tensor is expected to be in float dtype"): + F.gaussian_noise(make_image(dtype=torch.uint8)) + with pytest.raises(ValueError, match="sigma shouldn't be negative"): + F.gaussian_noise(make_image(dtype=torch.float32), sigma=-1) + + def test_clip(self): + img = make_image(dtype=torch.float32) + + out = F.gaussian_noise(img, mean=100, clip=False) + assert out.min() > 50 + + out = F.gaussian_noise(img, mean=100, clip=True) + assert (out == 1).all() + + out = F.gaussian_noise(img, mean=-100, clip=False) + assert out.min() < -50 + + out = F.gaussian_noise(img, mean=-100, clip=True) + assert (out == 0).all() + + +class TestAutoAugmentTransforms: + # These transforms have a lot of branches in their `forward()` passes which are conditioned on random sampling. + # It's typically very hard to test the effect on some parameters without heavy mocking logic. + # This class adds correctness tests for the kernels that are specific to those transforms. The rest of kernels, e.g. + # rotate, are tested in their respective classes. The rest of the tests here are mostly smoke tests. + + def _reference_shear_translate(self, image, *, transform_id, magnitude, interpolation, fill): + if isinstance(image, PIL.Image.Image): + input = image + else: + input = F.to_pil_image(image) + + matrix = { + "ShearX": (1, magnitude, 0, 0, 1, 0), + "ShearY": (1, 0, 0, magnitude, 1, 0), + "TranslateX": (1, 0, -int(magnitude), 0, 1, 0), + "TranslateY": (1, 0, 0, 0, 1, -int(magnitude)), + }[transform_id] + + output = input.transform( + input.size, PIL.Image.AFFINE, matrix, resample=pil_modes_mapping[interpolation], fill=fill + ) + + if isinstance(image, PIL.Image.Image): + return output + else: + return F.to_image(output) + + @pytest.mark.parametrize("transform_id", ["ShearX", "ShearY", "TranslateX", "TranslateY"]) + @pytest.mark.parametrize("magnitude", [0.3, -0.2, 0.0]) + @pytest.mark.parametrize( + "interpolation", [transforms.InterpolationMode.NEAREST, transforms.InterpolationMode.BILINEAR] + ) + @pytest.mark.parametrize("fill", CORRECTNESS_FILLS) + @pytest.mark.parametrize("input_type", ["Tensor", "PIL"]) + def test_correctness_shear_translate(self, transform_id, magnitude, interpolation, fill, input_type): + # ShearX/Y and TranslateX/Y are the only ops that are native to the AA transforms. They are modeled after the + # reference implementation: + # https://github.com/tensorflow/models/blob/885fda091c46c59d6c7bb5c7e760935eacc229da/research/autoaugment/augmentation_transforms.py#L273-L362 + # All other ops are checked in their respective dedicated tests. + + image = make_image(dtype=torch.uint8, device="cpu") + if input_type == "PIL": + image = F.to_pil_image(image) + + if "Translate" in transform_id: + # For TranslateX/Y magnitude is a value in pixels + magnitude *= min(F.get_size(image)) + + actual = transforms.AutoAugment()._apply_image_or_video_transform( + image, + transform_id=transform_id, + magnitude=magnitude, + interpolation=interpolation, + fill={type(image): fill}, + ) + expected = self._reference_shear_translate( + image, transform_id=transform_id, magnitude=magnitude, interpolation=interpolation, fill=fill + ) + + if input_type == "PIL": + actual, expected = F.to_image(actual), F.to_image(expected) + + if "Shear" in transform_id and input_type == "Tensor": + mae = (actual.float() - expected.float()).abs().mean() + assert mae < (12 if interpolation is transforms.InterpolationMode.NEAREST else 5) + else: + assert_close(actual, expected, rtol=0, atol=1) + + def _sample_input_adapter(self, transform, input, device): + adapted_input = {} + image_or_video_found = False + for key, value in input.items(): + if isinstance(value, (tv_tensors.BoundingBoxes, tv_tensors.Mask)): + # AA transforms don't support bounding boxes or masks + continue + elif check_type(value, (tv_tensors.Image, tv_tensors.Video, is_pure_tensor, PIL.Image.Image)): + if image_or_video_found: + # AA transforms only support a single image or video + continue + image_or_video_found = True + adapted_input[key] = value + return adapted_input + + @pytest.mark.parametrize( + "transform", + [transforms.AutoAugment(), transforms.RandAugment(), transforms.TrivialAugmentWide(), transforms.AugMix()], + ) + @pytest.mark.parametrize("make_input", [make_image_tensor, make_image_pil, make_image, make_video]) + @pytest.mark.parametrize("dtype", [torch.uint8, torch.float32]) + @pytest.mark.parametrize("device", cpu_and_cuda()) + def test_transform_smoke(self, transform, make_input, dtype, device): + if make_input is make_image_pil and not (dtype is torch.uint8 and device == "cpu"): + pytest.skip( + "PIL image tests with parametrization other than dtype=torch.uint8 and device='cpu' " + "will degenerate to that anyway." + ) + input = make_input(dtype=dtype, device=device) + + with freeze_rng_state(): + # By default every test starts from the same random seed. This leads to minimal coverage of the sampling + # that happens inside forward(). To avoid calling the transform multiple times to achieve higher coverage, + # we build a reproducible random seed from the input type, dtype, and device. + torch.manual_seed(hash((make_input, dtype, device))) + + # For v2, we changed the random sampling of the AA transforms. This makes it impossible to compare the v1 + # and v2 outputs without complicated mocking and monkeypatching. Thus, we skip the v1 compatibility checks + # here and only check if we can script the v2 transform and subsequently call the result. + check_transform( + transform, input, check_v1_compatibility=False, check_sample_input=self._sample_input_adapter + ) + + if type(input) is torch.Tensor and dtype is torch.uint8: + _script(transform)(input) + + def test_auto_augment_policy_error(self): + with pytest.raises(ValueError, match="provided policy"): + transforms.AutoAugment(policy=None) + + @pytest.mark.parametrize("severity", [0, 11]) + def test_aug_mix_severity_error(self, severity): + with pytest.raises(ValueError, match="severity must be between"): + transforms.AugMix(severity=severity) + + +class TestConvertBoundingBoxFormat: + old_new_formats = list(itertools.permutations(iter(tv_tensors.BoundingBoxFormat), 2)) + + @pytest.mark.parametrize(("old_format", "new_format"), old_new_formats) + def test_kernel(self, old_format, new_format): + check_kernel( + F.convert_bounding_box_format, + make_bounding_boxes(format=old_format), + new_format=new_format, + old_format=old_format, + ) + + @pytest.mark.parametrize("format", list(tv_tensors.BoundingBoxFormat)) + @pytest.mark.parametrize("inplace", [False, True]) + def test_kernel_noop(self, format, inplace): + input = make_bounding_boxes(format=format).as_subclass(torch.Tensor) + input_version = input._version + + output = F.convert_bounding_box_format(input, old_format=format, new_format=format, inplace=inplace) + + assert output is input + assert output.data_ptr() == input.data_ptr() + assert output._version == input_version + + @pytest.mark.parametrize(("old_format", "new_format"), old_new_formats) + def test_kernel_inplace(self, old_format, new_format): + input = make_bounding_boxes(format=old_format).as_subclass(torch.Tensor) + input_version = input._version + + output_out_of_place = F.convert_bounding_box_format(input, old_format=old_format, new_format=new_format) + assert output_out_of_place.data_ptr() != input.data_ptr() + assert output_out_of_place is not input + + output_inplace = F.convert_bounding_box_format( + input, old_format=old_format, new_format=new_format, inplace=True + ) + assert output_inplace.data_ptr() == input.data_ptr() + assert output_inplace._version > input_version + assert output_inplace is input + + assert_equal(output_inplace, output_out_of_place) + + @pytest.mark.parametrize(("old_format", "new_format"), old_new_formats) + def test_functional(self, old_format, new_format): + check_functional(F.convert_bounding_box_format, make_bounding_boxes(format=old_format), new_format=new_format) + + @pytest.mark.parametrize(("old_format", "new_format"), old_new_formats) + @pytest.mark.parametrize("format_type", ["enum", "str"]) + def test_transform(self, old_format, new_format, format_type): + check_transform( + transforms.ConvertBoundingBoxFormat(new_format.name if format_type == "str" else new_format), + make_bounding_boxes(format=old_format), + ) + + @pytest.mark.parametrize(("old_format", "new_format"), old_new_formats) + def test_strings(self, old_format, new_format): + # Non-regression test for https://github.com/pytorch/vision/issues/8258 + input = tv_tensors.BoundingBoxes(torch.tensor([[10, 10, 20, 20]]), format=old_format, canvas_size=(50, 50)) + expected = self._reference_convert_bounding_box_format(input, new_format) + + old_format = old_format.name + new_format = new_format.name + + out_functional = F.convert_bounding_box_format(input, new_format=new_format) + out_functional_tensor = F.convert_bounding_box_format( + input.as_subclass(torch.Tensor), old_format=old_format, new_format=new_format + ) + out_transform = transforms.ConvertBoundingBoxFormat(new_format)(input) + for out in (out_functional, out_functional_tensor, out_transform): + assert_equal(out, expected) + + def _reference_convert_bounding_box_format(self, bounding_boxes, new_format): + return tv_tensors.wrap( + torchvision.ops.box_convert( + bounding_boxes.as_subclass(torch.Tensor), + in_fmt=bounding_boxes.format.name.lower(), + out_fmt=new_format.name.lower(), + ).to(bounding_boxes.dtype), + like=bounding_boxes, + format=new_format, + ) + + @pytest.mark.parametrize(("old_format", "new_format"), old_new_formats) + @pytest.mark.parametrize("dtype", [torch.int64, torch.float32]) + @pytest.mark.parametrize("device", cpu_and_cuda()) + @pytest.mark.parametrize("fn_type", ["functional", "transform"]) + def test_correctness(self, old_format, new_format, dtype, device, fn_type): + bounding_boxes = make_bounding_boxes(format=old_format, dtype=dtype, device=device) + + if fn_type == "functional": + fn = functools.partial(F.convert_bounding_box_format, new_format=new_format) + else: + fn = transforms.ConvertBoundingBoxFormat(format=new_format) + + actual = fn(bounding_boxes) + expected = self._reference_convert_bounding_box_format(bounding_boxes, new_format) + + assert_equal(actual, expected) + + def test_errors(self): + input_tv_tensor = make_bounding_boxes() + input_pure_tensor = input_tv_tensor.as_subclass(torch.Tensor) + + for input in [input_tv_tensor, input_pure_tensor]: + with pytest.raises(TypeError, match="missing 1 required argument: 'new_format'"): + F.convert_bounding_box_format(input) + + with pytest.raises(ValueError, match="`old_format` has to be passed"): + F.convert_bounding_box_format(input_pure_tensor, new_format=input_tv_tensor.format) + + with pytest.raises(ValueError, match="`old_format` must not be passed"): + F.convert_bounding_box_format( + input_tv_tensor, old_format=input_tv_tensor.format, new_format=input_tv_tensor.format + ) + + +class TestResizedCrop: + INPUT_SIZE = (17, 11) + CROP_KWARGS = dict(top=2, left=2, height=5, width=7) + OUTPUT_SIZE = (19, 32) + + @pytest.mark.parametrize( + ("kernel", "make_input"), + [ + (F.resized_crop_image, make_image), + (F.resized_crop_bounding_boxes, make_bounding_boxes), + (F.resized_crop_mask, make_segmentation_mask), + (F.resized_crop_mask, make_detection_masks), + (F.resized_crop_video, make_video), + ], + ) + def test_kernel(self, kernel, make_input): + input = make_input(self.INPUT_SIZE) + if isinstance(input, tv_tensors.BoundingBoxes): + extra_kwargs = dict(format=input.format) + elif isinstance(input, tv_tensors.Mask): + extra_kwargs = dict() + else: + extra_kwargs = dict(antialias=True) + + check_kernel(kernel, input, **self.CROP_KWARGS, size=self.OUTPUT_SIZE, **extra_kwargs) + + @pytest.mark.parametrize( + "make_input", + [make_image_tensor, make_image_pil, make_image, make_bounding_boxes, make_segmentation_mask, make_video], + ) + def test_functional(self, make_input): + check_functional( + F.resized_crop, make_input(self.INPUT_SIZE), **self.CROP_KWARGS, size=self.OUTPUT_SIZE, antialias=True + ) + + @pytest.mark.parametrize( + ("kernel", "input_type"), + [ + (F.resized_crop_image, torch.Tensor), + (F._geometry._resized_crop_image_pil, PIL.Image.Image), + (F.resized_crop_image, tv_tensors.Image), + (F.resized_crop_bounding_boxes, tv_tensors.BoundingBoxes), + (F.resized_crop_mask, tv_tensors.Mask), + (F.resized_crop_video, tv_tensors.Video), + ], + ) + def test_functional_signature(self, kernel, input_type): + check_functional_kernel_signature_match(F.resized_crop, kernel=kernel, input_type=input_type) + + @param_value_parametrization( + scale=[(0.1, 0.2), [0.0, 1.0]], + ratio=[(0.3, 0.7), [0.1, 5.0]], + ) + @pytest.mark.parametrize( + "make_input", + [make_image_tensor, make_image_pil, make_image, make_bounding_boxes, make_segmentation_mask, make_video], + ) + def test_transform(self, param, value, make_input): + check_transform( + transforms.RandomResizedCrop(size=self.OUTPUT_SIZE, **{param: value}, antialias=True), + make_input(self.INPUT_SIZE), + check_v1_compatibility=dict(rtol=0, atol=1), + ) + + # `InterpolationMode.NEAREST` is modeled after the buggy `INTER_NEAREST` interpolation of CV2. + # The PIL equivalent of `InterpolationMode.NEAREST` is `InterpolationMode.NEAREST_EXACT` + @pytest.mark.parametrize("interpolation", set(INTERPOLATION_MODES) - {transforms.InterpolationMode.NEAREST}) + def test_functional_image_correctness(self, interpolation): + image = make_image(self.INPUT_SIZE, dtype=torch.uint8) + + actual = F.resized_crop( + image, **self.CROP_KWARGS, size=self.OUTPUT_SIZE, interpolation=interpolation, antialias=True + ) + expected = F.to_image( + F.resized_crop( + F.to_pil_image(image), **self.CROP_KWARGS, size=self.OUTPUT_SIZE, interpolation=interpolation + ) + ) + + torch.testing.assert_close(actual, expected, atol=1, rtol=0) + + def _reference_resized_crop_bounding_boxes(self, bounding_boxes, *, top, left, height, width, size): + new_height, new_width = size + + crop_affine_matrix = np.array( + [ + [1, 0, -left], + [0, 1, -top], + [0, 0, 1], + ], + ) + resize_affine_matrix = np.array( + [ + [new_width / width, 0, 0], + [0, new_height / height, 0], + [0, 0, 1], + ], + ) + affine_matrix = (resize_affine_matrix @ crop_affine_matrix)[:2, :] + + return reference_affine_bounding_boxes_helper( + bounding_boxes, + affine_matrix=affine_matrix, + new_canvas_size=size, + ) + + @pytest.mark.parametrize("format", list(tv_tensors.BoundingBoxFormat)) + def test_functional_bounding_boxes_correctness(self, format): + bounding_boxes = make_bounding_boxes(self.INPUT_SIZE, format=format) + + actual = F.resized_crop(bounding_boxes, **self.CROP_KWARGS, size=self.OUTPUT_SIZE) + expected = self._reference_resized_crop_bounding_boxes( + bounding_boxes, **self.CROP_KWARGS, size=self.OUTPUT_SIZE + ) + + assert_equal(actual, expected) + assert_equal(F.get_size(actual), F.get_size(expected)) + + def test_transform_errors_warnings(self): + with pytest.raises(ValueError, match="provide only two dimensions"): + transforms.RandomResizedCrop(size=(1, 2, 3)) + + with pytest.raises(TypeError, match="Scale should be a sequence"): + transforms.RandomResizedCrop(size=self.INPUT_SIZE, scale=123) + + with pytest.raises(TypeError, match="Ratio should be a sequence"): + transforms.RandomResizedCrop(size=self.INPUT_SIZE, ratio=123) + + for param in ["scale", "ratio"]: + with pytest.warns(match="Scale and ratio should be of kind"): + transforms.RandomResizedCrop(size=self.INPUT_SIZE, **{param: [1, 0]}) + + +class TestPad: + EXHAUSTIVE_TYPE_PADDINGS = [1, (1,), (1, 2), (1, 2, 3, 4), [1], [1, 2], [1, 2, 3, 4]] + CORRECTNESS_PADDINGS = [ + padding + for padding in EXHAUSTIVE_TYPE_PADDINGS + if isinstance(padding, int) or isinstance(padding, list) and len(padding) > 1 + ] + PADDING_MODES = ["constant", "symmetric", "edge", "reflect"] + + @param_value_parametrization( + padding=EXHAUSTIVE_TYPE_PADDINGS, + fill=EXHAUSTIVE_TYPE_FILLS, + padding_mode=PADDING_MODES, + ) + @pytest.mark.parametrize("dtype", [torch.uint8, torch.float32]) + @pytest.mark.parametrize("device", cpu_and_cuda()) + def test_kernel_image(self, param, value, dtype, device): + if param == "fill": + value = adapt_fill(value, dtype=dtype) + kwargs = {param: value} + if param != "padding": + kwargs["padding"] = [1] + + image = make_image(dtype=dtype, device=device) + + check_kernel( + F.pad_image, + image, + **kwargs, + check_scripted_vs_eager=not ( + (param == "padding" and isinstance(value, int)) + # See https://github.com/pytorch/vision/pull/7252#issue-1585585521 for details + or ( + param == "fill" + and ( + isinstance(value, tuple) or (isinstance(value, list) and any(isinstance(v, int) for v in value)) + ) + ) + ), + ) + + @pytest.mark.parametrize("format", list(tv_tensors.BoundingBoxFormat)) + def test_kernel_bounding_boxes(self, format): + bounding_boxes = make_bounding_boxes(format=format) + check_kernel( + F.pad_bounding_boxes, + bounding_boxes, + format=bounding_boxes.format, + canvas_size=bounding_boxes.canvas_size, + padding=[1], + ) + + @pytest.mark.parametrize("padding_mode", ["symmetric", "edge", "reflect"]) + def test_kernel_bounding_boxes_errors(self, padding_mode): + bounding_boxes = make_bounding_boxes() + with pytest.raises(ValueError, match=f"'{padding_mode}' is not supported"): + F.pad_bounding_boxes( + bounding_boxes, + format=bounding_boxes.format, + canvas_size=bounding_boxes.canvas_size, + padding=[1], + padding_mode=padding_mode, + ) + + @pytest.mark.parametrize("make_mask", [make_segmentation_mask, make_detection_masks]) + def test_kernel_mask(self, make_mask): + check_kernel(F.pad_mask, make_mask(), padding=[1]) + + @pytest.mark.parametrize("fill", [[1], (0,), [1, 0, 1], (0, 1, 0)]) + def test_kernel_mask_errors(self, fill): + with pytest.raises(ValueError, match="Non-scalar fill value is not supported"): + F.pad_mask(make_segmentation_mask(), padding=[1], fill=fill) + + def test_kernel_video(self): + check_kernel(F.pad_video, make_video(), padding=[1]) + + @pytest.mark.parametrize( + "make_input", + [make_image_tensor, make_image_pil, make_image, make_bounding_boxes, make_segmentation_mask, make_video], + ) + def test_functional(self, make_input): + check_functional(F.pad, make_input(), padding=[1]) + + @pytest.mark.parametrize( + ("kernel", "input_type"), + [ + (F.pad_image, torch.Tensor), + # The PIL kernel uses fill=0 as default rather than fill=None as all others. + # Since the whole fill story is already really inconsistent, we won't introduce yet another case to allow + # for this test to pass. + # See https://github.com/pytorch/vision/issues/6623 for a discussion. + # (F._geometry._pad_image_pil, PIL.Image.Image), + (F.pad_image, tv_tensors.Image), + (F.pad_bounding_boxes, tv_tensors.BoundingBoxes), + (F.pad_mask, tv_tensors.Mask), + (F.pad_video, tv_tensors.Video), + ], + ) + def test_functional_signature(self, kernel, input_type): + check_functional_kernel_signature_match(F.pad, kernel=kernel, input_type=input_type) + + @pytest.mark.parametrize( + "make_input", + [make_image_tensor, make_image_pil, make_image, make_bounding_boxes, make_segmentation_mask, make_video], + ) + def test_transform(self, make_input): + check_transform(transforms.Pad(padding=[1]), make_input()) + + def test_transform_errors(self): + with pytest.raises(TypeError, match="Got inappropriate padding arg"): + transforms.Pad("abc") + + with pytest.raises(ValueError, match="Padding must be an int or a 1, 2, or 4"): + transforms.Pad([-0.7, 0, 0.7]) + + with pytest.raises(TypeError, match="Got inappropriate fill arg"): + transforms.Pad(12, fill="abc") + + with pytest.raises(ValueError, match="Padding mode should be either"): + transforms.Pad(12, padding_mode="abc") + + @pytest.mark.parametrize("padding", CORRECTNESS_PADDINGS) + @pytest.mark.parametrize( + ("padding_mode", "fill"), + [ + *[("constant", fill) for fill in CORRECTNESS_FILLS], + *[(padding_mode, None) for padding_mode in ["symmetric", "edge", "reflect"]], + ], + ) + @pytest.mark.parametrize("fn", [F.pad, transform_cls_to_functional(transforms.Pad)]) + def test_image_correctness(self, padding, padding_mode, fill, fn): + image = make_image(dtype=torch.uint8, device="cpu") + + fill = adapt_fill(fill, dtype=torch.uint8) + + actual = fn(image, padding=padding, padding_mode=padding_mode, fill=fill) + expected = F.to_image(F.pad(F.to_pil_image(image), padding=padding, padding_mode=padding_mode, fill=fill)) + + assert_equal(actual, expected) + + def _reference_pad_bounding_boxes(self, bounding_boxes, *, padding): + if isinstance(padding, int): + padding = [padding] + left, top, right, bottom = padding * (4 // len(padding)) + + affine_matrix = np.array( + [ + [1, 0, left], + [0, 1, top], + ], + ) + + height = bounding_boxes.canvas_size[0] + top + bottom + width = bounding_boxes.canvas_size[1] + left + right + + return reference_affine_bounding_boxes_helper( + bounding_boxes, affine_matrix=affine_matrix, new_canvas_size=(height, width) + ) + + @pytest.mark.parametrize("padding", CORRECTNESS_PADDINGS) + @pytest.mark.parametrize("format", list(tv_tensors.BoundingBoxFormat)) + @pytest.mark.parametrize("dtype", [torch.int64, torch.float32]) + @pytest.mark.parametrize("device", cpu_and_cuda()) + @pytest.mark.parametrize("fn", [F.pad, transform_cls_to_functional(transforms.Pad)]) + def test_bounding_boxes_correctness(self, padding, format, dtype, device, fn): + bounding_boxes = make_bounding_boxes(format=format, dtype=dtype, device=device) + + actual = fn(bounding_boxes, padding=padding) + expected = self._reference_pad_bounding_boxes(bounding_boxes, padding=padding) + + assert_equal(actual, expected) + + +class TestCenterCrop: + INPUT_SIZE = (17, 11) + OUTPUT_SIZES = [(3, 5), (5, 3), (4, 4), (21, 9), (13, 15), (19, 14), 3, (4,), [5], INPUT_SIZE] + + @pytest.mark.parametrize("output_size", OUTPUT_SIZES) + @pytest.mark.parametrize("dtype", [torch.int64, torch.float32]) + @pytest.mark.parametrize("device", cpu_and_cuda()) + def test_kernel_image(self, output_size, dtype, device): + check_kernel( + F.center_crop_image, + make_image(self.INPUT_SIZE, dtype=dtype, device=device), + output_size=output_size, + check_scripted_vs_eager=not isinstance(output_size, int), + ) + + @pytest.mark.parametrize("output_size", OUTPUT_SIZES) + @pytest.mark.parametrize("format", list(tv_tensors.BoundingBoxFormat)) + def test_kernel_bounding_boxes(self, output_size, format): + bounding_boxes = make_bounding_boxes(self.INPUT_SIZE, format=format) + check_kernel( + F.center_crop_bounding_boxes, + bounding_boxes, + format=bounding_boxes.format, + canvas_size=bounding_boxes.canvas_size, + output_size=output_size, + check_scripted_vs_eager=not isinstance(output_size, int), + ) + + @pytest.mark.parametrize("make_mask", [make_segmentation_mask, make_detection_masks]) + def test_kernel_mask(self, make_mask): + check_kernel(F.center_crop_mask, make_mask(), output_size=self.OUTPUT_SIZES[0]) + + def test_kernel_video(self): + check_kernel(F.center_crop_video, make_video(self.INPUT_SIZE), output_size=self.OUTPUT_SIZES[0]) + + @pytest.mark.parametrize( + "make_input", + [make_image_tensor, make_image_pil, make_image, make_bounding_boxes, make_segmentation_mask, make_video], + ) + def test_functional(self, make_input): + check_functional(F.center_crop, make_input(self.INPUT_SIZE), output_size=self.OUTPUT_SIZES[0]) + + @pytest.mark.parametrize( + ("kernel", "input_type"), + [ + (F.center_crop_image, torch.Tensor), + (F._geometry._center_crop_image_pil, PIL.Image.Image), + (F.center_crop_image, tv_tensors.Image), + (F.center_crop_bounding_boxes, tv_tensors.BoundingBoxes), + (F.center_crop_mask, tv_tensors.Mask), + (F.center_crop_video, tv_tensors.Video), + ], + ) + def test_functional_signature(self, kernel, input_type): + check_functional_kernel_signature_match(F.center_crop, kernel=kernel, input_type=input_type) + + @pytest.mark.parametrize( + "make_input", + [make_image_tensor, make_image_pil, make_image, make_bounding_boxes, make_segmentation_mask, make_video], + ) + def test_transform(self, make_input): + check_transform(transforms.CenterCrop(self.OUTPUT_SIZES[0]), make_input(self.INPUT_SIZE)) + + @pytest.mark.parametrize("output_size", OUTPUT_SIZES) + @pytest.mark.parametrize("fn", [F.center_crop, transform_cls_to_functional(transforms.CenterCrop)]) + def test_image_correctness(self, output_size, fn): + image = make_image(self.INPUT_SIZE, dtype=torch.uint8, device="cpu") + + actual = fn(image, output_size) + expected = F.to_image(F.center_crop(F.to_pil_image(image), output_size=output_size)) + + assert_equal(actual, expected) + + def _reference_center_crop_bounding_boxes(self, bounding_boxes, output_size): + image_height, image_width = bounding_boxes.canvas_size + if isinstance(output_size, int): + output_size = (output_size, output_size) + elif len(output_size) == 1: + output_size *= 2 + crop_height, crop_width = output_size + + top = int(round((image_height - crop_height) / 2)) + left = int(round((image_width - crop_width) / 2)) + + affine_matrix = np.array( + [ + [1, 0, -left], + [0, 1, -top], + ], + ) + return reference_affine_bounding_boxes_helper( + bounding_boxes, affine_matrix=affine_matrix, new_canvas_size=output_size + ) + + @pytest.mark.parametrize("output_size", OUTPUT_SIZES) + @pytest.mark.parametrize("format", list(tv_tensors.BoundingBoxFormat)) + @pytest.mark.parametrize("dtype", [torch.int64, torch.float32]) + @pytest.mark.parametrize("device", cpu_and_cuda()) + @pytest.mark.parametrize("fn", [F.center_crop, transform_cls_to_functional(transforms.CenterCrop)]) + def test_bounding_boxes_correctness(self, output_size, format, dtype, device, fn): + bounding_boxes = make_bounding_boxes(self.INPUT_SIZE, format=format, dtype=dtype, device=device) + + actual = fn(bounding_boxes, output_size) + expected = self._reference_center_crop_bounding_boxes(bounding_boxes, output_size) + + assert_equal(actual, expected) + + +class TestPerspective: + COEFFICIENTS = [ + [1.2405, 0.1772, -6.9113, 0.0463, 1.251, -5.235, 0.00013, 0.0018], + [0.7366, -0.11724, 1.45775, -0.15012, 0.73406, 2.6019, -0.0072, -0.0063], + ] + START_END_POINTS = [ + ([[0, 0], [33, 0], [33, 25], [0, 25]], [[3, 2], [32, 3], [30, 24], [2, 25]]), + ([[3, 2], [32, 3], [30, 24], [2, 25]], [[0, 0], [33, 0], [33, 25], [0, 25]]), + ([[3, 2], [32, 3], [30, 24], [2, 25]], [[5, 5], [30, 3], [33, 19], [4, 25]]), + ] + MINIMAL_KWARGS = dict(startpoints=None, endpoints=None, coefficients=COEFFICIENTS[0]) + + @param_value_parametrization( + coefficients=COEFFICIENTS, + start_end_points=START_END_POINTS, + fill=EXHAUSTIVE_TYPE_FILLS, + ) + @pytest.mark.parametrize("dtype", [torch.uint8, torch.float32]) + @pytest.mark.parametrize("device", cpu_and_cuda()) + def test_kernel_image(self, param, value, dtype, device): + if param == "start_end_points": + kwargs = dict(zip(["startpoints", "endpoints"], value)) + else: + kwargs = {"startpoints": None, "endpoints": None, param: value} + if param == "fill": + kwargs["coefficients"] = self.COEFFICIENTS[0] + + check_kernel( + F.perspective_image, + make_image(dtype=dtype, device=device), + **kwargs, + check_scripted_vs_eager=not (param == "fill" and isinstance(value, (int, float))), + ) + + def test_kernel_image_error(self): + image = make_image_tensor() + + with pytest.raises(ValueError, match="startpoints/endpoints or the coefficients must have non `None` values"): + F.perspective_image(image, startpoints=None, endpoints=None) + + with pytest.raises( + ValueError, match="startpoints/endpoints and the coefficients shouldn't be defined concurrently" + ): + startpoints, endpoints = self.START_END_POINTS[0] + coefficients = self.COEFFICIENTS[0] + F.perspective_image(image, startpoints=startpoints, endpoints=endpoints, coefficients=coefficients) + + with pytest.raises(ValueError, match="coefficients should have 8 float values"): + F.perspective_image(image, startpoints=None, endpoints=None, coefficients=list(range(7))) + + @param_value_parametrization( + coefficients=COEFFICIENTS, + start_end_points=START_END_POINTS, + ) + @pytest.mark.parametrize("format", list(tv_tensors.BoundingBoxFormat)) + def test_kernel_bounding_boxes(self, param, value, format): + if param == "start_end_points": + kwargs = dict(zip(["startpoints", "endpoints"], value)) + else: + kwargs = {"startpoints": None, "endpoints": None, param: value} + + bounding_boxes = make_bounding_boxes(format=format) + + check_kernel( + F.perspective_bounding_boxes, + bounding_boxes, + format=bounding_boxes.format, + canvas_size=bounding_boxes.canvas_size, + **kwargs, + ) + + def test_kernel_bounding_boxes_error(self): + bounding_boxes = make_bounding_boxes() + format, canvas_size = bounding_boxes.format, bounding_boxes.canvas_size + bounding_boxes = bounding_boxes.as_subclass(torch.Tensor) + + with pytest.raises(RuntimeError, match="Denominator is zero"): + F.perspective_bounding_boxes( + bounding_boxes, + format=format, + canvas_size=canvas_size, + startpoints=None, + endpoints=None, + coefficients=[0.0] * 8, + ) + + @pytest.mark.parametrize("make_mask", [make_segmentation_mask, make_detection_masks]) + def test_kernel_mask(self, make_mask): + check_kernel(F.perspective_mask, make_mask(), **self.MINIMAL_KWARGS) + + def test_kernel_video(self): + check_kernel(F.perspective_video, make_video(), **self.MINIMAL_KWARGS) + + @pytest.mark.parametrize( + "make_input", + [make_image_tensor, make_image_pil, make_image, make_bounding_boxes, make_segmentation_mask, make_video], + ) + def test_functional(self, make_input): + check_functional(F.perspective, make_input(), **self.MINIMAL_KWARGS) + + @pytest.mark.parametrize( + ("kernel", "input_type"), + [ + (F.perspective_image, torch.Tensor), + (F._geometry._perspective_image_pil, PIL.Image.Image), + (F.perspective_image, tv_tensors.Image), + (F.perspective_bounding_boxes, tv_tensors.BoundingBoxes), + (F.perspective_mask, tv_tensors.Mask), + (F.perspective_video, tv_tensors.Video), + ], + ) + def test_functional_signature(self, kernel, input_type): + check_functional_kernel_signature_match(F.perspective, kernel=kernel, input_type=input_type) + + @pytest.mark.parametrize("distortion_scale", [0.5, 0.0, 1.0]) + @pytest.mark.parametrize( + "make_input", + [make_image_tensor, make_image_pil, make_image, make_bounding_boxes, make_segmentation_mask, make_video], + ) + def test_transform(self, distortion_scale, make_input): + check_transform(transforms.RandomPerspective(distortion_scale=distortion_scale, p=1), make_input()) + + @pytest.mark.parametrize("distortion_scale", [-1, 2]) + def test_transform_error(self, distortion_scale): + with pytest.raises(ValueError, match="distortion_scale value should be between 0 and 1"): + transforms.RandomPerspective(distortion_scale=distortion_scale) + + @pytest.mark.parametrize("coefficients", COEFFICIENTS) + @pytest.mark.parametrize( + "interpolation", [transforms.InterpolationMode.NEAREST, transforms.InterpolationMode.BILINEAR] + ) + @pytest.mark.parametrize("fill", CORRECTNESS_FILLS) + def test_image_functional_correctness(self, coefficients, interpolation, fill): + image = make_image(dtype=torch.uint8, device="cpu") + + actual = F.perspective( + image, startpoints=None, endpoints=None, coefficients=coefficients, interpolation=interpolation, fill=fill + ) + expected = F.to_image( + F.perspective( + F.to_pil_image(image), + startpoints=None, + endpoints=None, + coefficients=coefficients, + interpolation=interpolation, + fill=fill, + ) + ) + + if interpolation is transforms.InterpolationMode.BILINEAR: + abs_diff = (actual.float() - expected.float()).abs() + assert (abs_diff > 1).float().mean() < 7e-2 + mae = abs_diff.mean() + assert mae < 3 + else: + assert_equal(actual, expected) + + def _reference_perspective_bounding_boxes(self, bounding_boxes, *, startpoints, endpoints): + format = bounding_boxes.format + canvas_size = bounding_boxes.canvas_size + dtype = bounding_boxes.dtype + device = bounding_boxes.device + + coefficients = _get_perspective_coeffs(endpoints, startpoints) + + def perspective_bounding_boxes(bounding_boxes): + m1 = np.array( + [ + [coefficients[0], coefficients[1], coefficients[2]], + [coefficients[3], coefficients[4], coefficients[5]], + ] + ) + m2 = np.array( + [ + [coefficients[6], coefficients[7], 1.0], + [coefficients[6], coefficients[7], 1.0], + ] + ) + + # Go to float before converting to prevent precision loss in case of CXCYWH -> XYXY and W or H is 1 + input_xyxy = F.convert_bounding_box_format( + bounding_boxes.to(dtype=torch.float64, device="cpu", copy=True), + old_format=format, + new_format=tv_tensors.BoundingBoxFormat.XYXY, + inplace=True, + ) + x1, y1, x2, y2 = input_xyxy.squeeze(0).tolist() + + points = np.array( + [ + [x1, y1, 1.0], + [x2, y1, 1.0], + [x1, y2, 1.0], + [x2, y2, 1.0], + ] + ) + + numerator = points @ m1.T + denominator = points @ m2.T + transformed_points = numerator / denominator + + output_xyxy = torch.Tensor( + [ + float(np.min(transformed_points[:, 0])), + float(np.min(transformed_points[:, 1])), + float(np.max(transformed_points[:, 0])), + float(np.max(transformed_points[:, 1])), + ] + ) + + output = F.convert_bounding_box_format( + output_xyxy, old_format=tv_tensors.BoundingBoxFormat.XYXY, new_format=format + ) + + # It is important to clamp before casting, especially for CXCYWH format, dtype=int64 + return F.clamp_bounding_boxes( + output, + format=format, + canvas_size=canvas_size, + ).to(dtype=dtype, device=device) + + return tv_tensors.BoundingBoxes( + torch.cat([perspective_bounding_boxes(b) for b in bounding_boxes.reshape(-1, 4).unbind()], dim=0).reshape( + bounding_boxes.shape + ), + format=format, + canvas_size=canvas_size, + ) + + @pytest.mark.parametrize(("startpoints", "endpoints"), START_END_POINTS) + @pytest.mark.parametrize("format", list(tv_tensors.BoundingBoxFormat)) + @pytest.mark.parametrize("dtype", [torch.int64, torch.float32]) + @pytest.mark.parametrize("device", cpu_and_cuda()) + def test_correctness_perspective_bounding_boxes(self, startpoints, endpoints, format, dtype, device): + bounding_boxes = make_bounding_boxes(format=format, dtype=dtype, device=device) + + actual = F.perspective(bounding_boxes, startpoints=startpoints, endpoints=endpoints) + expected = self._reference_perspective_bounding_boxes( + bounding_boxes, startpoints=startpoints, endpoints=endpoints + ) + + assert_close(actual, expected, rtol=0, atol=1) + + +class TestEqualize: + @pytest.mark.parametrize("dtype", [torch.uint8, torch.float32]) + @pytest.mark.parametrize("device", cpu_and_cuda()) + def test_kernel_image(self, dtype, device): + check_kernel(F.equalize_image, make_image(dtype=dtype, device=device)) + + def test_kernel_video(self): + check_kernel(F.equalize_image, make_video()) + + @pytest.mark.parametrize("make_input", [make_image_tensor, make_image_pil, make_image, make_video]) + def test_functional(self, make_input): + check_functional(F.equalize, make_input()) + + @pytest.mark.parametrize( + ("kernel", "input_type"), + [ + (F.equalize_image, torch.Tensor), + (F._color._equalize_image_pil, PIL.Image.Image), + (F.equalize_image, tv_tensors.Image), + (F.equalize_video, tv_tensors.Video), + ], + ) + def test_functional_signature(self, kernel, input_type): + check_functional_kernel_signature_match(F.equalize, kernel=kernel, input_type=input_type) + + @pytest.mark.parametrize( + "make_input", + [make_image_tensor, make_image_pil, make_image, make_video], + ) + def test_transform(self, make_input): + check_transform(transforms.RandomEqualize(p=1), make_input()) + + @pytest.mark.parametrize(("low", "high"), [(0, 64), (64, 192), (192, 256), (0, 1), (127, 128), (255, 256)]) + @pytest.mark.parametrize("fn", [F.equalize, transform_cls_to_functional(transforms.RandomEqualize, p=1)]) + def test_image_correctness(self, low, high, fn): + # We are not using the default `make_image` here since that uniformly samples the values over the whole value + # range. Since the whole point of F.equalize is to transform an arbitrary distribution of values into a uniform + # one over the full range, the information gain is low if we already provide something really close to the + # expected value. + image = tv_tensors.Image( + torch.testing.make_tensor((3, 117, 253), dtype=torch.uint8, device="cpu", low=low, high=high) + ) + + actual = fn(image) + expected = F.to_image(F.equalize(F.to_pil_image(image))) + + assert_equal(actual, expected) + + +class TestUniformTemporalSubsample: + def test_kernel_video(self): + check_kernel(F.uniform_temporal_subsample_video, make_video(), num_samples=2) + + @pytest.mark.parametrize("make_input", [make_video_tensor, make_video]) + def test_functional(self, make_input): + check_functional(F.uniform_temporal_subsample, make_input(), num_samples=2) + + @pytest.mark.parametrize( + ("kernel", "input_type"), + [ + (F.uniform_temporal_subsample_video, torch.Tensor), + (F.uniform_temporal_subsample_video, tv_tensors.Video), + ], + ) + def test_functional_signature(self, kernel, input_type): + check_functional_kernel_signature_match(F.uniform_temporal_subsample, kernel=kernel, input_type=input_type) + + @pytest.mark.parametrize("make_input", [make_video_tensor, make_video]) + def test_transform(self, make_input): + check_transform(transforms.UniformTemporalSubsample(num_samples=2), make_input()) + + def _reference_uniform_temporal_subsample_video(self, video, *, num_samples): + # Adapted from + # https://github.com/facebookresearch/pytorchvideo/blob/c8d23d8b7e597586a9e2d18f6ed31ad8aa379a7a/pytorchvideo/transforms/functional.py#L19 + t = video.shape[-4] + assert num_samples > 0 and t > 0 + # Sample by nearest neighbor interpolation if num_samples > t. + indices = torch.linspace(0, t - 1, num_samples, device=video.device) + indices = torch.clamp(indices, 0, t - 1).long() + return tv_tensors.Video(torch.index_select(video, -4, indices)) + + CORRECTNESS_NUM_FRAMES = 5 + + @pytest.mark.parametrize("num_samples", list(range(1, CORRECTNESS_NUM_FRAMES + 1))) + @pytest.mark.parametrize("dtype", [torch.uint8, torch.float32]) + @pytest.mark.parametrize("device", cpu_and_cuda()) + @pytest.mark.parametrize( + "fn", [F.uniform_temporal_subsample, transform_cls_to_functional(transforms.UniformTemporalSubsample)] + ) + def test_video_correctness(self, num_samples, dtype, device, fn): + video = make_video(num_frames=self.CORRECTNESS_NUM_FRAMES, dtype=dtype, device=device) + + actual = fn(video, num_samples=num_samples) + expected = self._reference_uniform_temporal_subsample_video(video, num_samples=num_samples) + + assert_equal(actual, expected) + + +class TestNormalize: + MEANS_STDS = [ + ((0.485, 0.456, 0.406), (0.229, 0.224, 0.225)), + ([0.0, 0.0, 0.0], [1.0, 1.0, 1.0]), + ] + MEAN, STD = MEANS_STDS[0] + + @pytest.mark.parametrize(("mean", "std"), [*MEANS_STDS, (0.5, 2.0)]) + @pytest.mark.parametrize("device", cpu_and_cuda()) + def test_kernel_image(self, mean, std, device): + check_kernel(F.normalize_image, make_image(dtype=torch.float32, device=device), mean=self.MEAN, std=self.STD) + + @pytest.mark.parametrize("device", cpu_and_cuda()) + def test_kernel_image_inplace(self, device): + input = make_image_tensor(dtype=torch.float32, device=device) + input_version = input._version + + output_out_of_place = F.normalize_image(input, mean=self.MEAN, std=self.STD) + assert output_out_of_place.data_ptr() != input.data_ptr() + assert output_out_of_place is not input + + output_inplace = F.normalize_image(input, mean=self.MEAN, std=self.STD, inplace=True) + assert output_inplace.data_ptr() == input.data_ptr() + assert output_inplace._version > input_version + assert output_inplace is input + + assert_equal(output_inplace, output_out_of_place) + + def test_kernel_video(self): + check_kernel(F.normalize_video, make_video(dtype=torch.float32), mean=self.MEAN, std=self.STD) + + @pytest.mark.parametrize("make_input", [make_image_tensor, make_image, make_video]) + def test_functional(self, make_input): + check_functional(F.normalize, make_input(dtype=torch.float32), mean=self.MEAN, std=self.STD) + + @pytest.mark.parametrize( + ("kernel", "input_type"), + [ + (F.normalize_image, torch.Tensor), + (F.normalize_image, tv_tensors.Image), + (F.normalize_video, tv_tensors.Video), + ], + ) + def test_functional_signature(self, kernel, input_type): + check_functional_kernel_signature_match(F.normalize, kernel=kernel, input_type=input_type) + + def test_functional_error(self): + with pytest.raises(TypeError, match="should be a float tensor"): + F.normalize_image(make_image(dtype=torch.uint8), mean=self.MEAN, std=self.STD) + + with pytest.raises(ValueError, match="tensor image of size"): + F.normalize_image(torch.rand(16, 16, dtype=torch.float32), mean=self.MEAN, std=self.STD) + + for std in [0, [0, 0, 0], [0, 1, 1]]: + with pytest.raises(ValueError, match="std evaluated to zero, leading to division by zero"): + F.normalize_image(make_image(dtype=torch.float32), mean=self.MEAN, std=std) + + def _sample_input_adapter(self, transform, input, device): + adapted_input = {} + for key, value in input.items(): + if isinstance(value, PIL.Image.Image): + # normalize doesn't support PIL images + continue + elif check_type(value, (is_pure_tensor, tv_tensors.Image, tv_tensors.Video)): + # normalize doesn't support integer images + value = F.to_dtype(value, torch.float32, scale=True) + adapted_input[key] = value + return adapted_input + + @pytest.mark.parametrize("make_input", [make_image_tensor, make_image, make_video]) + def test_transform(self, make_input): + check_transform( + transforms.Normalize(mean=self.MEAN, std=self.STD), + make_input(dtype=torch.float32), + check_sample_input=self._sample_input_adapter, + ) + + def _reference_normalize_image(self, image, *, mean, std): + image = image.numpy() + mean, std = [np.array(stat, dtype=image.dtype).reshape((-1, 1, 1)) for stat in [mean, std]] + return tv_tensors.Image((image - mean) / std) + + @pytest.mark.parametrize(("mean", "std"), MEANS_STDS) + @pytest.mark.parametrize("dtype", [torch.float16, torch.float32, torch.float64]) + @pytest.mark.parametrize("fn", [F.normalize, transform_cls_to_functional(transforms.Normalize)]) + def test_correctness_image(self, mean, std, dtype, fn): + image = make_image(dtype=dtype) + + actual = fn(image, mean=mean, std=std) + expected = self._reference_normalize_image(image, mean=mean, std=std) + + assert_equal(actual, expected) + + +class TestClampBoundingBoxes: + @pytest.mark.parametrize("format", list(tv_tensors.BoundingBoxFormat)) + @pytest.mark.parametrize("dtype", [torch.int64, torch.float32]) + @pytest.mark.parametrize("device", cpu_and_cuda()) + def test_kernel(self, format, dtype, device): + bounding_boxes = make_bounding_boxes(format=format, dtype=dtype, device=device) + check_kernel( + F.clamp_bounding_boxes, + bounding_boxes, + format=bounding_boxes.format, + canvas_size=bounding_boxes.canvas_size, + ) + + @pytest.mark.parametrize("format", list(tv_tensors.BoundingBoxFormat)) + def test_functional(self, format): + check_functional(F.clamp_bounding_boxes, make_bounding_boxes(format=format)) + + def test_errors(self): + input_tv_tensor = make_bounding_boxes() + input_pure_tensor = input_tv_tensor.as_subclass(torch.Tensor) + format, canvas_size = input_tv_tensor.format, input_tv_tensor.canvas_size + + for format_, canvas_size_ in [(None, None), (format, None), (None, canvas_size)]: + with pytest.raises( + ValueError, match="For pure tensor inputs, `format` and `canvas_size` have to be passed." + ): + F.clamp_bounding_boxes(input_pure_tensor, format=format_, canvas_size=canvas_size_) + + for format_, canvas_size_ in [(format, canvas_size), (format, None), (None, canvas_size)]: + with pytest.raises( + ValueError, match="For bounding box tv_tensor inputs, `format` and `canvas_size` must not be passed." + ): + F.clamp_bounding_boxes(input_tv_tensor, format=format_, canvas_size=canvas_size_) + + def test_transform(self): + check_transform(transforms.ClampBoundingBoxes(), make_bounding_boxes()) + + +class TestInvert: + @pytest.mark.parametrize("dtype", [torch.uint8, torch.int16, torch.float32]) + @pytest.mark.parametrize("device", cpu_and_cuda()) + def test_kernel_image(self, dtype, device): + check_kernel(F.invert_image, make_image(dtype=dtype, device=device)) + + def test_kernel_video(self): + check_kernel(F.invert_video, make_video()) + + @pytest.mark.parametrize("make_input", [make_image_tensor, make_image, make_image_pil, make_video]) + def test_functional(self, make_input): + check_functional(F.invert, make_input()) + + @pytest.mark.parametrize( + ("kernel", "input_type"), + [ + (F.invert_image, torch.Tensor), + (F._color._invert_image_pil, PIL.Image.Image), + (F.invert_image, tv_tensors.Image), + (F.invert_video, tv_tensors.Video), + ], + ) + def test_functional_signature(self, kernel, input_type): + check_functional_kernel_signature_match(F.invert, kernel=kernel, input_type=input_type) + + @pytest.mark.parametrize("make_input", [make_image_tensor, make_image_pil, make_image, make_video]) + def test_transform(self, make_input): + check_transform(transforms.RandomInvert(p=1), make_input()) + + @pytest.mark.parametrize("fn", [F.invert, transform_cls_to_functional(transforms.RandomInvert, p=1)]) + def test_correctness_image(self, fn): + image = make_image(dtype=torch.uint8, device="cpu") + + actual = fn(image) + expected = F.to_image(F.invert(F.to_pil_image(image))) + + assert_equal(actual, expected) + + +class TestPosterize: + @pytest.mark.parametrize("dtype", [torch.uint8, torch.float32]) + @pytest.mark.parametrize("device", cpu_and_cuda()) + def test_kernel_image(self, dtype, device): + check_kernel(F.posterize_image, make_image(dtype=dtype, device=device), bits=1) + + def test_kernel_video(self): + check_kernel(F.posterize_video, make_video(), bits=1) + + @pytest.mark.parametrize("make_input", [make_image_tensor, make_image, make_image_pil, make_video]) + def test_functional(self, make_input): + check_functional(F.posterize, make_input(), bits=1) + + @pytest.mark.parametrize( + ("kernel", "input_type"), + [ + (F.posterize_image, torch.Tensor), + (F._color._posterize_image_pil, PIL.Image.Image), + (F.posterize_image, tv_tensors.Image), + (F.posterize_video, tv_tensors.Video), + ], + ) + def test_functional_signature(self, kernel, input_type): + check_functional_kernel_signature_match(F.posterize, kernel=kernel, input_type=input_type) + + @pytest.mark.parametrize("make_input", [make_image_tensor, make_image_pil, make_image, make_video]) + def test_transform(self, make_input): + check_transform(transforms.RandomPosterize(bits=1, p=1), make_input()) + + @pytest.mark.parametrize("bits", [1, 4, 8]) + @pytest.mark.parametrize("fn", [F.posterize, transform_cls_to_functional(transforms.RandomPosterize, p=1)]) + def test_correctness_image(self, bits, fn): + image = make_image(dtype=torch.uint8, device="cpu") + + actual = fn(image, bits=bits) + expected = F.to_image(F.posterize(F.to_pil_image(image), bits=bits)) + + assert_equal(actual, expected) + + +class TestSolarize: + def _make_threshold(self, input, *, factor=0.5): + dtype = input.dtype if isinstance(input, torch.Tensor) else torch.uint8 + return (float if dtype.is_floating_point else int)(get_max_value(dtype) * factor) + + @pytest.mark.parametrize("dtype", [torch.uint8, torch.float32]) + @pytest.mark.parametrize("device", cpu_and_cuda()) + def test_kernel_image(self, dtype, device): + image = make_image(dtype=dtype, device=device) + check_kernel(F.solarize_image, image, threshold=self._make_threshold(image)) + + def test_kernel_video(self): + video = make_video() + check_kernel(F.solarize_video, video, threshold=self._make_threshold(video)) + + @pytest.mark.parametrize("make_input", [make_image_tensor, make_image, make_image_pil, make_video]) + def test_functional(self, make_input): + input = make_input() + check_functional(F.solarize, input, threshold=self._make_threshold(input)) + + @pytest.mark.parametrize( + ("kernel", "input_type"), + [ + (F.solarize_image, torch.Tensor), + (F._color._solarize_image_pil, PIL.Image.Image), + (F.solarize_image, tv_tensors.Image), + (F.solarize_video, tv_tensors.Video), + ], + ) + def test_functional_signature(self, kernel, input_type): + check_functional_kernel_signature_match(F.solarize, kernel=kernel, input_type=input_type) + + @pytest.mark.parametrize(("dtype", "threshold"), [(torch.uint8, 256), (torch.float, 1.5)]) + def test_functional_error(self, dtype, threshold): + with pytest.raises(TypeError, match="Threshold should be less or equal the maximum value of the dtype"): + F.solarize(make_image(dtype=dtype), threshold=threshold) + + @pytest.mark.parametrize("make_input", [make_image_tensor, make_image_pil, make_image, make_video]) + def test_transform(self, make_input): + input = make_input() + check_transform(transforms.RandomSolarize(threshold=self._make_threshold(input), p=1), input) + + @pytest.mark.parametrize("threshold_factor", [0.0, 0.1, 0.5, 0.9, 1.0]) + @pytest.mark.parametrize("fn", [F.solarize, transform_cls_to_functional(transforms.RandomSolarize, p=1)]) + def test_correctness_image(self, threshold_factor, fn): + image = make_image(dtype=torch.uint8, device="cpu") + threshold = self._make_threshold(image, factor=threshold_factor) + + actual = fn(image, threshold=threshold) + expected = F.to_image(F.solarize(F.to_pil_image(image), threshold=threshold)) + + assert_equal(actual, expected) + + +class TestAutocontrast: + @pytest.mark.parametrize("dtype", [torch.uint8, torch.int16, torch.float32]) + @pytest.mark.parametrize("device", cpu_and_cuda()) + def test_kernel_image(self, dtype, device): + check_kernel(F.autocontrast_image, make_image(dtype=dtype, device=device)) + + def test_kernel_video(self): + check_kernel(F.autocontrast_video, make_video()) + + @pytest.mark.parametrize("make_input", [make_image_tensor, make_image, make_image_pil, make_video]) + def test_functional(self, make_input): + check_functional(F.autocontrast, make_input()) + + @pytest.mark.parametrize( + ("kernel", "input_type"), + [ + (F.autocontrast_image, torch.Tensor), + (F._color._autocontrast_image_pil, PIL.Image.Image), + (F.autocontrast_image, tv_tensors.Image), + (F.autocontrast_video, tv_tensors.Video), + ], + ) + def test_functional_signature(self, kernel, input_type): + check_functional_kernel_signature_match(F.autocontrast, kernel=kernel, input_type=input_type) + + @pytest.mark.parametrize("make_input", [make_image_tensor, make_image_pil, make_image, make_video]) + def test_transform(self, make_input): + check_transform(transforms.RandomAutocontrast(p=1), make_input(), check_v1_compatibility=dict(rtol=0, atol=1)) + + @pytest.mark.parametrize("fn", [F.autocontrast, transform_cls_to_functional(transforms.RandomAutocontrast, p=1)]) + def test_correctness_image(self, fn): + image = make_image(dtype=torch.uint8, device="cpu") + + actual = fn(image) + expected = F.to_image(F.autocontrast(F.to_pil_image(image))) + + assert_close(actual, expected, rtol=0, atol=1) + + +class TestAdjustSharpness: + @pytest.mark.parametrize("dtype", [torch.uint8, torch.float32]) + @pytest.mark.parametrize("device", cpu_and_cuda()) + def test_kernel_image(self, dtype, device): + check_kernel(F.adjust_sharpness_image, make_image(dtype=dtype, device=device), sharpness_factor=0.5) + + def test_kernel_video(self): + check_kernel(F.adjust_sharpness_video, make_video(), sharpness_factor=0.5) + + @pytest.mark.parametrize("make_input", [make_image_tensor, make_image, make_image_pil, make_video]) + def test_functional(self, make_input): + check_functional(F.adjust_sharpness, make_input(), sharpness_factor=0.5) + + @pytest.mark.parametrize( + ("kernel", "input_type"), + [ + (F.adjust_sharpness_image, torch.Tensor), + (F._color._adjust_sharpness_image_pil, PIL.Image.Image), + (F.adjust_sharpness_image, tv_tensors.Image), + (F.adjust_sharpness_video, tv_tensors.Video), + ], + ) + def test_functional_signature(self, kernel, input_type): + check_functional_kernel_signature_match(F.adjust_sharpness, kernel=kernel, input_type=input_type) + + @pytest.mark.parametrize("make_input", [make_image_tensor, make_image_pil, make_image, make_video]) + def test_transform(self, make_input): + check_transform(transforms.RandomAdjustSharpness(sharpness_factor=0.5, p=1), make_input()) + + def test_functional_error(self): + with pytest.raises(TypeError, match="can have 1 or 3 channels"): + F.adjust_sharpness(make_image(color_space="RGBA"), sharpness_factor=0.5) + + with pytest.raises(ValueError, match="is not non-negative"): + F.adjust_sharpness(make_image(), sharpness_factor=-1) + + @pytest.mark.parametrize("sharpness_factor", [0.1, 0.5, 1.0]) + @pytest.mark.parametrize( + "fn", [F.adjust_sharpness, transform_cls_to_functional(transforms.RandomAdjustSharpness, p=1)] + ) + def test_correctness_image(self, sharpness_factor, fn): + image = make_image(dtype=torch.uint8, device="cpu") + + actual = fn(image, sharpness_factor=sharpness_factor) + expected = F.to_image(F.adjust_sharpness(F.to_pil_image(image), sharpness_factor=sharpness_factor)) + + assert_equal(actual, expected) + + +class TestAdjustContrast: + @pytest.mark.parametrize("dtype", [torch.uint8, torch.float32]) + @pytest.mark.parametrize("device", cpu_and_cuda()) + def test_kernel_image(self, dtype, device): + check_kernel(F.adjust_contrast_image, make_image(dtype=dtype, device=device), contrast_factor=0.5) + + def test_kernel_video(self): + check_kernel(F.adjust_contrast_video, make_video(), contrast_factor=0.5) + + @pytest.mark.parametrize("make_input", [make_image_tensor, make_image, make_image_pil, make_video]) + def test_functional(self, make_input): + check_functional(F.adjust_contrast, make_input(), contrast_factor=0.5) + + @pytest.mark.parametrize( + ("kernel", "input_type"), + [ + (F.adjust_contrast_image, torch.Tensor), + (F._color._adjust_contrast_image_pil, PIL.Image.Image), + (F.adjust_contrast_image, tv_tensors.Image), + (F.adjust_contrast_video, tv_tensors.Video), + ], + ) + def test_functional_signature(self, kernel, input_type): + check_functional_kernel_signature_match(F.adjust_contrast, kernel=kernel, input_type=input_type) + + def test_functional_error(self): + with pytest.raises(TypeError, match="permitted channel values are 1 or 3"): + F.adjust_contrast(make_image(color_space="RGBA"), contrast_factor=0.5) + + with pytest.raises(ValueError, match="is not non-negative"): + F.adjust_contrast(make_image(), contrast_factor=-1) + + @pytest.mark.parametrize("contrast_factor", [0.1, 0.5, 1.0]) + def test_correctness_image(self, contrast_factor): + image = make_image(dtype=torch.uint8, device="cpu") + + actual = F.adjust_contrast(image, contrast_factor=contrast_factor) + expected = F.to_image(F.adjust_contrast(F.to_pil_image(image), contrast_factor=contrast_factor)) + + assert_close(actual, expected, rtol=0, atol=1) + + +class TestAdjustGamma: + @pytest.mark.parametrize("dtype", [torch.uint8, torch.float32]) + @pytest.mark.parametrize("device", cpu_and_cuda()) + def test_kernel_image(self, dtype, device): + check_kernel(F.adjust_gamma_image, make_image(dtype=dtype, device=device), gamma=0.5) + + def test_kernel_video(self): + check_kernel(F.adjust_gamma_video, make_video(), gamma=0.5) + + @pytest.mark.parametrize("make_input", [make_image_tensor, make_image, make_image_pil, make_video]) + def test_functional(self, make_input): + check_functional(F.adjust_gamma, make_input(), gamma=0.5) + + @pytest.mark.parametrize( + ("kernel", "input_type"), + [ + (F.adjust_gamma_image, torch.Tensor), + (F._color._adjust_gamma_image_pil, PIL.Image.Image), + (F.adjust_gamma_image, tv_tensors.Image), + (F.adjust_gamma_video, tv_tensors.Video), + ], + ) + def test_functional_signature(self, kernel, input_type): + check_functional_kernel_signature_match(F.adjust_gamma, kernel=kernel, input_type=input_type) + + def test_functional_error(self): + with pytest.raises(ValueError, match="Gamma should be a non-negative real number"): + F.adjust_gamma(make_image(), gamma=-1) + + @pytest.mark.parametrize("gamma", [0.1, 0.5, 1.0]) + @pytest.mark.parametrize("gain", [0.1, 1.0, 2.0]) + def test_correctness_image(self, gamma, gain): + image = make_image(dtype=torch.uint8, device="cpu") + + actual = F.adjust_gamma(image, gamma=gamma, gain=gain) + expected = F.to_image(F.adjust_gamma(F.to_pil_image(image), gamma=gamma, gain=gain)) + + assert_equal(actual, expected) + + +class TestAdjustHue: + @pytest.mark.parametrize("dtype", [torch.uint8, torch.float32]) + @pytest.mark.parametrize("device", cpu_and_cuda()) + def test_kernel_image(self, dtype, device): + check_kernel(F.adjust_hue_image, make_image(dtype=dtype, device=device), hue_factor=0.25) + + def test_kernel_video(self): + check_kernel(F.adjust_hue_video, make_video(), hue_factor=0.25) + + @pytest.mark.parametrize("make_input", [make_image_tensor, make_image, make_image_pil, make_video]) + def test_functional(self, make_input): + check_functional(F.adjust_hue, make_input(), hue_factor=0.25) + + @pytest.mark.parametrize( + ("kernel", "input_type"), + [ + (F.adjust_hue_image, torch.Tensor), + (F._color._adjust_hue_image_pil, PIL.Image.Image), + (F.adjust_hue_image, tv_tensors.Image), + (F.adjust_hue_video, tv_tensors.Video), + ], + ) + def test_functional_signature(self, kernel, input_type): + check_functional_kernel_signature_match(F.adjust_hue, kernel=kernel, input_type=input_type) + + def test_functional_error(self): + with pytest.raises(TypeError, match="permitted channel values are 1 or 3"): + F.adjust_hue(make_image(color_space="RGBA"), hue_factor=0.25) + + for hue_factor in [-1, 1]: + with pytest.raises(ValueError, match=re.escape("is not in [-0.5, 0.5]")): + F.adjust_hue(make_image(), hue_factor=hue_factor) + + @pytest.mark.parametrize("hue_factor", [-0.5, -0.3, 0.0, 0.2, 0.5]) + def test_correctness_image(self, hue_factor): + image = make_image(dtype=torch.uint8, device="cpu") + + actual = F.adjust_hue(image, hue_factor=hue_factor) + expected = F.to_image(F.adjust_hue(F.to_pil_image(image), hue_factor=hue_factor)) + + mae = (actual.float() - expected.float()).abs().mean() + assert mae < 2 + + +class TestAdjustSaturation: + @pytest.mark.parametrize("dtype", [torch.uint8, torch.float32]) + @pytest.mark.parametrize("device", cpu_and_cuda()) + def test_kernel_image(self, dtype, device): + check_kernel(F.adjust_saturation_image, make_image(dtype=dtype, device=device), saturation_factor=0.5) + + def test_kernel_video(self): + check_kernel(F.adjust_saturation_video, make_video(), saturation_factor=0.5) + + @pytest.mark.parametrize("make_input", [make_image_tensor, make_image, make_image_pil, make_video]) + def test_functional(self, make_input): + check_functional(F.adjust_saturation, make_input(), saturation_factor=0.5) + + @pytest.mark.parametrize( + ("kernel", "input_type"), + [ + (F.adjust_saturation_image, torch.Tensor), + (F._color._adjust_saturation_image_pil, PIL.Image.Image), + (F.adjust_saturation_image, tv_tensors.Image), + (F.adjust_saturation_video, tv_tensors.Video), + ], + ) + def test_functional_signature(self, kernel, input_type): + check_functional_kernel_signature_match(F.adjust_saturation, kernel=kernel, input_type=input_type) + + def test_functional_error(self): + with pytest.raises(TypeError, match="permitted channel values are 1 or 3"): + F.adjust_saturation(make_image(color_space="RGBA"), saturation_factor=0.5) + + with pytest.raises(ValueError, match="is not non-negative"): + F.adjust_saturation(make_image(), saturation_factor=-1) + + @pytest.mark.parametrize("saturation_factor", [0.1, 0.5, 1.0]) + def test_correctness_image(self, saturation_factor): + image = make_image(dtype=torch.uint8, device="cpu") + + actual = F.adjust_saturation(image, saturation_factor=saturation_factor) + expected = F.to_image(F.adjust_saturation(F.to_pil_image(image), saturation_factor=saturation_factor)) + + assert_close(actual, expected, rtol=0, atol=1) + + +class TestFiveTenCrop: + INPUT_SIZE = (17, 11) + OUTPUT_SIZE = (3, 5) + + @pytest.mark.parametrize("dtype", [torch.uint8, torch.float32]) + @pytest.mark.parametrize("device", cpu_and_cuda()) + @pytest.mark.parametrize("kernel", [F.five_crop_image, F.ten_crop_image]) + def test_kernel_image(self, dtype, device, kernel): + check_kernel( + kernel, + make_image(self.INPUT_SIZE, dtype=dtype, device=device), + size=self.OUTPUT_SIZE, + check_batched_vs_unbatched=False, + ) + + @pytest.mark.parametrize("kernel", [F.five_crop_video, F.ten_crop_video]) + def test_kernel_video(self, kernel): + check_kernel(kernel, make_video(self.INPUT_SIZE), size=self.OUTPUT_SIZE, check_batched_vs_unbatched=False) + + def _functional_wrapper(self, fn): + # This wrapper is needed to make five_crop / ten_crop compatible with check_functional, since that requires a + # single output rather than a sequence. + @functools.wraps(fn) + def wrapper(*args, **kwargs): + outputs = fn(*args, **kwargs) + return outputs[0] + + return wrapper + + @pytest.mark.parametrize( + "make_input", + [make_image_tensor, make_image_pil, make_image, make_video], + ) + @pytest.mark.parametrize("functional", [F.five_crop, F.ten_crop]) + def test_functional(self, make_input, functional): + check_functional( + self._functional_wrapper(functional), + make_input(self.INPUT_SIZE), + size=self.OUTPUT_SIZE, + check_scripted_smoke=False, + ) + + @pytest.mark.parametrize( + ("functional", "kernel", "input_type"), + [ + (F.five_crop, F.five_crop_image, torch.Tensor), + (F.five_crop, F._geometry._five_crop_image_pil, PIL.Image.Image), + (F.five_crop, F.five_crop_image, tv_tensors.Image), + (F.five_crop, F.five_crop_video, tv_tensors.Video), + (F.ten_crop, F.ten_crop_image, torch.Tensor), + (F.ten_crop, F._geometry._ten_crop_image_pil, PIL.Image.Image), + (F.ten_crop, F.ten_crop_image, tv_tensors.Image), + (F.ten_crop, F.ten_crop_video, tv_tensors.Video), + ], + ) + def test_functional_signature(self, functional, kernel, input_type): + check_functional_kernel_signature_match(functional, kernel=kernel, input_type=input_type) + + class _TransformWrapper(nn.Module): + # This wrapper is needed to make FiveCrop / TenCrop compatible with check_transform, since that requires a + # single output rather than a sequence. + _v1_transform_cls = None + + def _extract_params_for_v1_transform(self): + return dict(five_ten_crop_transform=self.five_ten_crop_transform) + + def __init__(self, five_ten_crop_transform): + super().__init__() + type(self)._v1_transform_cls = type(self) + self.five_ten_crop_transform = five_ten_crop_transform + + def forward(self, input: torch.Tensor) -> torch.Tensor: + outputs = self.five_ten_crop_transform(input) + return outputs[0] + + @pytest.mark.parametrize( + "make_input", + [make_image_tensor, make_image_pil, make_image, make_video], + ) + @pytest.mark.parametrize("transform_cls", [transforms.FiveCrop, transforms.TenCrop]) + def test_transform(self, make_input, transform_cls): + check_transform( + self._TransformWrapper(transform_cls(size=self.OUTPUT_SIZE)), + make_input(self.INPUT_SIZE), + check_sample_input=False, + ) + + @pytest.mark.parametrize("make_input", [make_bounding_boxes, make_detection_masks]) + @pytest.mark.parametrize("transform_cls", [transforms.FiveCrop, transforms.TenCrop]) + def test_transform_error(self, make_input, transform_cls): + transform = transform_cls(size=self.OUTPUT_SIZE) + + with pytest.raises(TypeError, match="not supported"): + transform(make_input(self.INPUT_SIZE)) + + @pytest.mark.parametrize("fn", [F.five_crop, transform_cls_to_functional(transforms.FiveCrop)]) + def test_correctness_image_five_crop(self, fn): + image = make_image(self.INPUT_SIZE, dtype=torch.uint8, device="cpu") + + actual = fn(image, size=self.OUTPUT_SIZE) + expected = F.five_crop(F.to_pil_image(image), size=self.OUTPUT_SIZE) + + assert isinstance(actual, tuple) + assert_equal(actual, [F.to_image(e) for e in expected]) + + @pytest.mark.parametrize("fn_or_class", [F.ten_crop, transforms.TenCrop]) + @pytest.mark.parametrize("vertical_flip", [False, True]) + def test_correctness_image_ten_crop(self, fn_or_class, vertical_flip): + if fn_or_class is transforms.TenCrop: + fn = transform_cls_to_functional(fn_or_class, size=self.OUTPUT_SIZE, vertical_flip=vertical_flip) + kwargs = dict() + else: + fn = fn_or_class + kwargs = dict(size=self.OUTPUT_SIZE, vertical_flip=vertical_flip) + + image = make_image(self.INPUT_SIZE, dtype=torch.uint8, device="cpu") + + actual = fn(image, **kwargs) + expected = F.ten_crop(F.to_pil_image(image), size=self.OUTPUT_SIZE, vertical_flip=vertical_flip) + + assert isinstance(actual, tuple) + assert_equal(actual, [F.to_image(e) for e in expected]) + + +class TestColorJitter: + @pytest.mark.parametrize( + "make_input", + [make_image_tensor, make_image_pil, make_image, make_video], + ) + @pytest.mark.parametrize("dtype", [torch.uint8, torch.float32]) + @pytest.mark.parametrize("device", cpu_and_cuda()) + def test_transform(self, make_input, dtype, device): + if make_input is make_image_pil and not (dtype is torch.uint8 and device == "cpu"): + pytest.skip( + "PIL image tests with parametrization other than dtype=torch.uint8 and device='cpu' " + "will degenerate to that anyway." + ) + + check_transform( + transforms.ColorJitter(brightness=0.5, contrast=0.5, saturation=0.5, hue=0.25), + make_input(dtype=dtype, device=device), + ) + + def test_transform_noop(self): + input = make_image() + input_version = input._version + + transform = transforms.ColorJitter() + output = transform(input) + + assert output is input + assert output.data_ptr() == input.data_ptr() + assert output._version == input_version + + def test_transform_error(self): + with pytest.raises(ValueError, match="must be non negative"): + transforms.ColorJitter(brightness=-1) + + for brightness in [object(), [1, 2, 3]]: + with pytest.raises(TypeError, match="single number or a sequence with length 2"): + transforms.ColorJitter(brightness=brightness) + + with pytest.raises(ValueError, match="values should be between"): + transforms.ColorJitter(brightness=(-1, 0.5)) + + with pytest.raises(ValueError, match="values should be between"): + transforms.ColorJitter(hue=1) + + @pytest.mark.parametrize("brightness", [None, 0.1, (0.2, 0.3)]) + @pytest.mark.parametrize("contrast", [None, 0.4, (0.5, 0.6)]) + @pytest.mark.parametrize("saturation", [None, 0.7, (0.8, 0.9)]) + @pytest.mark.parametrize("hue", [None, 0.3, (-0.1, 0.2)]) + def test_transform_correctness(self, brightness, contrast, saturation, hue): + image = make_image(dtype=torch.uint8, device="cpu") + + transform = transforms.ColorJitter(brightness=brightness, contrast=contrast, saturation=saturation, hue=hue) + + with freeze_rng_state(): + torch.manual_seed(0) + actual = transform(image) + + torch.manual_seed(0) + expected = F.to_image(transform(F.to_pil_image(image))) + + mae = (actual.float() - expected.float()).abs().mean() + assert mae < 2 + + +class TestRgbToGrayscale: + @pytest.mark.parametrize("dtype", [torch.uint8, torch.float32]) + @pytest.mark.parametrize("device", cpu_and_cuda()) + def test_kernel_image(self, dtype, device): + check_kernel(F.rgb_to_grayscale_image, make_image(dtype=dtype, device=device)) + + @pytest.mark.parametrize("make_input", [make_image_tensor, make_image_pil, make_image]) + def test_functional(self, make_input): + check_functional(F.rgb_to_grayscale, make_input()) + + @pytest.mark.parametrize( + ("kernel", "input_type"), + [ + (F.rgb_to_grayscale_image, torch.Tensor), + (F._color._rgb_to_grayscale_image_pil, PIL.Image.Image), + (F.rgb_to_grayscale_image, tv_tensors.Image), + ], + ) + def test_functional_signature(self, kernel, input_type): + check_functional_kernel_signature_match(F.rgb_to_grayscale, kernel=kernel, input_type=input_type) + + @pytest.mark.parametrize("transform", [transforms.Grayscale(), transforms.RandomGrayscale(p=1)]) + @pytest.mark.parametrize("make_input", [make_image_tensor, make_image_pil, make_image]) + def test_transform(self, transform, make_input): + check_transform(transform, make_input()) + + @pytest.mark.parametrize("num_output_channels", [1, 3]) + @pytest.mark.parametrize("color_space", ["RGB", "GRAY"]) + @pytest.mark.parametrize("fn", [F.rgb_to_grayscale, transform_cls_to_functional(transforms.Grayscale)]) + def test_image_correctness(self, num_output_channels, color_space, fn): + image = make_image(dtype=torch.uint8, device="cpu", color_space=color_space) + + actual = fn(image, num_output_channels=num_output_channels) + expected = F.to_image(F.rgb_to_grayscale(F.to_pil_image(image), num_output_channels=num_output_channels)) + + assert_equal(actual, expected, rtol=0, atol=1) + + def test_expanded_channels_are_not_views_into_the_same_underlying_tensor(self): + image = make_image(dtype=torch.uint8, device="cpu", color_space="GRAY") + + output_image = F.rgb_to_grayscale(image, num_output_channels=3) + assert_equal(output_image[0][0][0], output_image[1][0][0]) + output_image[0][0][0] = output_image[0][0][0] + 1 + assert output_image[0][0][0] != output_image[1][0][0] + + @pytest.mark.parametrize("num_input_channels", [1, 3]) + def test_random_transform_correctness(self, num_input_channels): + image = make_image( + color_space={ + 1: "GRAY", + 3: "RGB", + }[num_input_channels], + dtype=torch.uint8, + device="cpu", + ) + + transform = transforms.RandomGrayscale(p=1) + + actual = transform(image) + expected = F.to_image(F.rgb_to_grayscale(F.to_pil_image(image), num_output_channels=num_input_channels)) + + assert_equal(actual, expected, rtol=0, atol=1) + + +class TestGrayscaleToRgb: + @pytest.mark.parametrize("dtype", [torch.uint8, torch.float32]) + @pytest.mark.parametrize("device", cpu_and_cuda()) + def test_kernel_image(self, dtype, device): + check_kernel(F.grayscale_to_rgb_image, make_image(dtype=dtype, device=device)) + + @pytest.mark.parametrize("make_input", [make_image_tensor, make_image_pil, make_image]) + def test_functional(self, make_input): + check_functional(F.grayscale_to_rgb, make_input()) + + @pytest.mark.parametrize( + ("kernel", "input_type"), + [ + (F.rgb_to_grayscale_image, torch.Tensor), + (F._color._rgb_to_grayscale_image_pil, PIL.Image.Image), + (F.rgb_to_grayscale_image, tv_tensors.Image), + ], + ) + def test_functional_signature(self, kernel, input_type): + check_functional_kernel_signature_match(F.grayscale_to_rgb, kernel=kernel, input_type=input_type) + + @pytest.mark.parametrize("make_input", [make_image_tensor, make_image_pil, make_image]) + def test_transform(self, make_input): + check_transform(transforms.RGB(), make_input(color_space="GRAY")) + + @pytest.mark.parametrize("fn", [F.grayscale_to_rgb, transform_cls_to_functional(transforms.RGB)]) + def test_image_correctness(self, fn): + image = make_image(dtype=torch.uint8, device="cpu", color_space="GRAY") + + actual = fn(image) + expected = F.to_image(F.grayscale_to_rgb(F.to_pil_image(image))) + + assert_equal(actual, expected, rtol=0, atol=1) + + def test_expanded_channels_are_not_views_into_the_same_underlying_tensor(self): + image = make_image(dtype=torch.uint8, device="cpu", color_space="GRAY") + + output_image = F.grayscale_to_rgb(image) + assert_equal(output_image[0][0][0], output_image[1][0][0]) + output_image[0][0][0] = output_image[0][0][0] + 1 + assert output_image[0][0][0] != output_image[1][0][0] + + def test_rgb_image_is_unchanged(self): + image = make_image(dtype=torch.uint8, device="cpu", color_space="RGB") + assert_equal(image.shape[-3], 3) + assert_equal(F.grayscale_to_rgb(image), image) + + +class TestRandomZoomOut: + # Tests are light because this largely relies on the already tested `pad` kernels. + + @pytest.mark.parametrize( + "make_input", + [ + make_image_tensor, + make_image_pil, + make_image, + make_bounding_boxes, + make_segmentation_mask, + make_detection_masks, + make_video, + ], + ) + def test_transform(self, make_input): + check_transform(transforms.RandomZoomOut(p=1), make_input()) + + def test_transform_error(self): + for side_range in [None, 1, [1, 2, 3]]: + with pytest.raises( + ValueError if isinstance(side_range, list) else TypeError, match="should be a sequence of length 2" + ): + transforms.RandomZoomOut(side_range=side_range) + + for side_range in [[0.5, 1.5], [2.0, 1.0]]: + with pytest.raises(ValueError, match="Invalid side range"): + transforms.RandomZoomOut(side_range=side_range) + + @pytest.mark.parametrize("side_range", [(1.0, 4.0), [2.0, 5.0]]) + @pytest.mark.parametrize( + "make_input", + [ + make_image_tensor, + make_image_pil, + make_image, + make_bounding_boxes, + make_segmentation_mask, + make_detection_masks, + make_video, + ], + ) + @pytest.mark.parametrize("device", cpu_and_cuda()) + def test_transform_params_correctness(self, side_range, make_input, device): + if make_input is make_image_pil and device != "cpu": + pytest.skip("PIL image tests with parametrization device!='cpu' will degenerate to that anyway.") + + transform = transforms.RandomZoomOut(side_range=side_range) + + input = make_input() + height, width = F.get_size(input) + + params = transform._get_params([input]) + assert "padding" in params + + padding = params["padding"] + assert len(padding) == 4 + + assert 0 <= padding[0] <= (side_range[1] - 1) * width + assert 0 <= padding[1] <= (side_range[1] - 1) * height + assert 0 <= padding[2] <= (side_range[1] - 1) * width + assert 0 <= padding[3] <= (side_range[1] - 1) * height + + +class TestRandomPhotometricDistort: + # Tests are light because this largely relies on the already tested + # `adjust_{brightness,contrast,saturation,hue}` and `permute_channels` kernels. + + @pytest.mark.parametrize( + "make_input", + [make_image_tensor, make_image_pil, make_image, make_video], + ) + @pytest.mark.parametrize("dtype", [torch.uint8, torch.float32]) + @pytest.mark.parametrize("device", cpu_and_cuda()) + def test_transform(self, make_input, dtype, device): + if make_input is make_image_pil and not (dtype is torch.uint8 and device == "cpu"): + pytest.skip( + "PIL image tests with parametrization other than dtype=torch.uint8 and device='cpu' " + "will degenerate to that anyway." + ) + + check_transform( + transforms.RandomPhotometricDistort( + brightness=(0.3, 0.4), contrast=(0.5, 0.6), saturation=(0.7, 0.8), hue=(-0.1, 0.2), p=1 + ), + make_input(dtype=dtype, device=device), + ) + + +class TestScaleJitter: + # Tests are light because this largely relies on the already tested `resize` kernels. + + INPUT_SIZE = (17, 11) + TARGET_SIZE = (12, 13) + + @pytest.mark.parametrize( + "make_input", + [make_image_tensor, make_image_pil, make_image, make_bounding_boxes, make_segmentation_mask, make_video], + ) + @pytest.mark.parametrize("device", cpu_and_cuda()) + def test_transform(self, make_input, device): + if make_input is make_image_pil and device != "cpu": + pytest.skip("PIL image tests with parametrization device!='cpu' will degenerate to that anyway.") + + check_transform(transforms.ScaleJitter(self.TARGET_SIZE), make_input(self.INPUT_SIZE, device=device)) + + def test__get_params(self): + input_size = self.INPUT_SIZE + target_size = self.TARGET_SIZE + scale_range = (0.5, 1.5) + + transform = transforms.ScaleJitter(target_size=target_size, scale_range=scale_range) + params = transform._get_params([make_image(input_size)]) + + assert "size" in params + size = params["size"] + + assert isinstance(size, tuple) and len(size) == 2 + height, width = size + + r_min = min(target_size[1] / input_size[0], target_size[0] / input_size[1]) * scale_range[0] + r_max = min(target_size[1] / input_size[0], target_size[0] / input_size[1]) * scale_range[1] + + assert int(input_size[0] * r_min) <= height <= int(input_size[0] * r_max) + assert int(input_size[1] * r_min) <= width <= int(input_size[1] * r_max) + + +class TestLinearTransform: + def _make_matrix_and_vector(self, input, *, device=None): + device = device or input.device + numel = math.prod(F.get_dimensions(input)) + transformation_matrix = torch.randn((numel, numel), device=device) + mean_vector = torch.randn((numel,), device=device) + return transformation_matrix, mean_vector + + def _sample_input_adapter(self, transform, input, device): + return {key: value for key, value in input.items() if not isinstance(value, PIL.Image.Image)} + + @pytest.mark.parametrize("make_input", [make_image_tensor, make_image, make_video]) + @pytest.mark.parametrize("dtype", [torch.uint8, torch.float32]) + @pytest.mark.parametrize("device", cpu_and_cuda()) + def test_transform(self, make_input, dtype, device): + input = make_input(dtype=dtype, device=device) + check_transform( + transforms.LinearTransformation(*self._make_matrix_and_vector(input)), + input, + check_sample_input=self._sample_input_adapter, + # Compat check is failing on M1 with: + # AssertionError: Tensor-likes are not close! + # Mismatched elements: 1 / 561 (0.2%) + # See https://github.com/pytorch/vision/issues/8453 + check_v1_compatibility=(sys.platform != "darwin"), + ) + + def test_transform_error(self): + with pytest.raises(ValueError, match="transformation_matrix should be square"): + transforms.LinearTransformation(transformation_matrix=torch.rand(2, 3), mean_vector=torch.rand(2)) + + with pytest.raises(ValueError, match="mean_vector should have the same length"): + transforms.LinearTransformation(transformation_matrix=torch.rand(2, 2), mean_vector=torch.rand(1)) + + for matrix_dtype, vector_dtype in [(torch.float32, torch.float64), (torch.float64, torch.float32)]: + with pytest.raises(ValueError, match="Input tensors should have the same dtype"): + transforms.LinearTransformation( + transformation_matrix=torch.rand(2, 2, dtype=matrix_dtype), + mean_vector=torch.rand(2, dtype=vector_dtype), + ) + + image = make_image() + transform = transforms.LinearTransformation(transformation_matrix=torch.rand(2, 2), mean_vector=torch.rand(2)) + with pytest.raises(ValueError, match="Input tensor and transformation matrix have incompatible shape"): + transform(image) + + transform = transforms.LinearTransformation(*self._make_matrix_and_vector(image)) + with pytest.raises(TypeError, match="does not support PIL images"): + transform(F.to_pil_image(image)) + + @needs_cuda + def test_transform_error_cuda(self): + for matrix_device, vector_device in [("cuda", "cpu"), ("cpu", "cuda")]: + with pytest.raises(ValueError, match="Input tensors should be on the same device"): + transforms.LinearTransformation( + transformation_matrix=torch.rand(2, 2, device=matrix_device), + mean_vector=torch.rand(2, device=vector_device), + ) + + for input_device, param_device in [("cuda", "cpu"), ("cpu", "cuda")]: + input = make_image(device=input_device) + transform = transforms.LinearTransformation(*self._make_matrix_and_vector(input, device=param_device)) + with pytest.raises( + ValueError, match="Input tensor should be on the same device as transformation matrix and mean vector" + ): + transform(input) + + +def make_image_numpy(*args, **kwargs): + image = make_image_tensor(*args, **kwargs) + return image.permute((1, 2, 0)).numpy() + + +class TestToImage: + @pytest.mark.parametrize("make_input", [make_image_tensor, make_image_pil, make_image, make_image_numpy]) + @pytest.mark.parametrize("fn", [F.to_image, transform_cls_to_functional(transforms.ToImage)]) + def test_functional_and_transform(self, make_input, fn): + input = make_input() + output = fn(input) + + assert isinstance(output, tv_tensors.Image) + + input_size = list(input.shape[:2]) if isinstance(input, np.ndarray) else F.get_size(input) + assert F.get_size(output) == input_size + + if isinstance(input, torch.Tensor): + assert output.data_ptr() == input.data_ptr() + + def test_2d_np_array(self): + # Non-regression test for https://github.com/pytorch/vision/issues/8255 + input = np.random.rand(10, 10) + assert F.to_image(input).shape == (1, 10, 10) + + def test_functional_error(self): + with pytest.raises(TypeError, match="Input can either be a pure Tensor, a numpy array, or a PIL image"): + F.to_image(object()) + + +class TestToPILImage: + @pytest.mark.parametrize("make_input", [make_image_tensor, make_image, make_image_numpy]) + @pytest.mark.parametrize("color_space", ["RGB", "GRAY"]) + @pytest.mark.parametrize("fn", [F.to_pil_image, transform_cls_to_functional(transforms.ToPILImage)]) + def test_functional_and_transform(self, make_input, color_space, fn): + input = make_input(color_space=color_space) + output = fn(input) + + assert isinstance(output, PIL.Image.Image) + + input_size = list(input.shape[:2]) if isinstance(input, np.ndarray) else F.get_size(input) + assert F.get_size(output) == input_size + + def test_functional_error(self): + with pytest.raises(TypeError, match="pic should be Tensor or ndarray"): + F.to_pil_image(object()) + + for ndim in [1, 4]: + with pytest.raises(ValueError, match="pic should be 2/3 dimensional"): + F.to_pil_image(torch.empty(*[1] * ndim)) + + with pytest.raises(ValueError, match="pic should not have > 4 channels"): + num_channels = 5 + F.to_pil_image(torch.empty(num_channels, 1, 1)) + + +class TestToTensor: + @pytest.mark.parametrize("make_input", [make_image_tensor, make_image_pil, make_image, make_image_numpy]) + def test_smoke(self, make_input): + with pytest.warns(UserWarning, match="deprecated and will be removed"): + transform = transforms.ToTensor() + + input = make_input() + output = transform(input) + + input_size = list(input.shape[:2]) if isinstance(input, np.ndarray) else F.get_size(input) + assert F.get_size(output) == input_size + + +class TestPILToTensor: + @pytest.mark.parametrize("color_space", ["RGB", "GRAY"]) + @pytest.mark.parametrize("fn", [F.pil_to_tensor, transform_cls_to_functional(transforms.PILToTensor)]) + def test_functional_and_transform(self, color_space, fn): + input = make_image_pil(color_space=color_space) + output = fn(input) + + assert isinstance(output, torch.Tensor) and not isinstance(output, tv_tensors.TVTensor) + assert F.get_size(output) == F.get_size(input) + + def test_functional_error(self): + with pytest.raises(TypeError, match="pic should be PIL Image"): + F.pil_to_tensor(object()) + + +class TestLambda: + @pytest.mark.parametrize("input", [object(), torch.empty(()), np.empty(()), "string", 1, 0.0]) + @pytest.mark.parametrize("types", [(), (torch.Tensor, np.ndarray)]) + def test_transform(self, input, types): + was_applied = False + + def was_applied_fn(input): + nonlocal was_applied + was_applied = True + return input + + transform = transforms.Lambda(was_applied_fn, *types) + output = transform(input) + + assert output is input + assert was_applied is (not types or isinstance(input, types)) + + +@pytest.mark.parametrize( + ("alias", "target"), + [ + pytest.param(alias, target, id=alias.__name__) + for alias, target in [ + (F.hflip, F.horizontal_flip), + (F.vflip, F.vertical_flip), + (F.get_image_num_channels, F.get_num_channels), + (F.to_pil_image, F.to_pil_image), + (F.elastic_transform, F.elastic), + (F.to_grayscale, F.rgb_to_grayscale), + ] + ], +) +def test_alias(alias, target): + assert alias is target + + +@pytest.mark.parametrize( + "make_inputs", + itertools.permutations( + [ + make_image_tensor, + make_image_tensor, + make_image_pil, + make_image, + make_video, + ], + 3, + ), +) +def test_pure_tensor_heuristic(make_inputs): + flat_inputs = [make_input() for make_input in make_inputs] + + def split_on_pure_tensor(to_split): + # This takes a sequence that is structurally aligned with `flat_inputs` and splits its items into three parts: + # 1. The first pure tensor. If none is present, this will be `None` + # 2. A list of the remaining pure tensors + # 3. A list of all other items + pure_tensors = [] + others = [] + # Splitting always happens on the original `flat_inputs` to avoid any erroneous type changes by the transform to + # affect the splitting. + for item, inpt in zip(to_split, flat_inputs): + (pure_tensors if is_pure_tensor(inpt) else others).append(item) + return pure_tensors[0] if pure_tensors else None, pure_tensors[1:], others + + class CopyCloneTransform(transforms.Transform): + def _transform(self, inpt, params): + return inpt.clone() if isinstance(inpt, torch.Tensor) else inpt.copy() + + @staticmethod + def was_applied(output, inpt): + identity = output is inpt + if identity: + return False + + # Make sure nothing fishy is going on + assert_equal(output, inpt) + return True + + first_pure_tensor_input, other_pure_tensor_inputs, other_inputs = split_on_pure_tensor(flat_inputs) + + transform = CopyCloneTransform() + transformed_sample = transform(flat_inputs) + + first_pure_tensor_output, other_pure_tensor_outputs, other_outputs = split_on_pure_tensor(transformed_sample) + + if first_pure_tensor_input is not None: + if other_inputs: + assert not transform.was_applied(first_pure_tensor_output, first_pure_tensor_input) + else: + assert transform.was_applied(first_pure_tensor_output, first_pure_tensor_input) + + for output, inpt in zip(other_pure_tensor_outputs, other_pure_tensor_inputs): + assert not transform.was_applied(output, inpt) + + for input, output in zip(other_inputs, other_outputs): + assert transform.was_applied(output, input) + + +class TestRandomIoUCrop: + @pytest.mark.parametrize("device", cpu_and_cuda()) + @pytest.mark.parametrize("options", [[0.5, 0.9], [2.0]]) + def test__get_params(self, device, options): + orig_h, orig_w = size = (24, 32) + image = make_image(size) + bboxes = tv_tensors.BoundingBoxes( + torch.tensor([[1, 1, 10, 10], [20, 20, 23, 23], [1, 20, 10, 23], [20, 1, 23, 10]]), + format="XYXY", + canvas_size=size, + device=device, + ) + sample = [image, bboxes] + + transform = transforms.RandomIoUCrop(sampler_options=options) + + n_samples = 5 + for _ in range(n_samples): + + params = transform._get_params(sample) + + if options == [2.0]: + assert len(params) == 0 + return + + assert len(params["is_within_crop_area"]) > 0 + assert params["is_within_crop_area"].dtype == torch.bool + + assert int(transform.min_scale * orig_h) <= params["height"] <= int(transform.max_scale * orig_h) + assert int(transform.min_scale * orig_w) <= params["width"] <= int(transform.max_scale * orig_w) + + left, top = params["left"], params["top"] + new_h, new_w = params["height"], params["width"] + ious = box_iou( + bboxes, + torch.tensor([[left, top, left + new_w, top + new_h]], dtype=bboxes.dtype, device=bboxes.device), + ) + assert ious.max() >= options[0] or ious.max() >= options[1], f"{ious} vs {options}" + + def test__transform_empty_params(self, mocker): + transform = transforms.RandomIoUCrop(sampler_options=[2.0]) + image = tv_tensors.Image(torch.rand(1, 3, 4, 4)) + bboxes = tv_tensors.BoundingBoxes(torch.tensor([[1, 1, 2, 2]]), format="XYXY", canvas_size=(4, 4)) + label = torch.tensor([1]) + sample = [image, bboxes, label] + # Let's mock transform._get_params to control the output: + transform._get_params = mocker.MagicMock(return_value={}) + output = transform(sample) + torch.testing.assert_close(output, sample) + + def test_forward_assertion(self): + transform = transforms.RandomIoUCrop() + with pytest.raises( + TypeError, + match="requires input sample to contain tensor or PIL images and bounding boxes", + ): + transform(torch.tensor(0)) + + def test__transform(self, mocker): + transform = transforms.RandomIoUCrop() + + size = (32, 24) + image = make_image(size) + bboxes = make_bounding_boxes(format="XYXY", canvas_size=size, num_boxes=6) + masks = make_detection_masks(size, num_masks=6) + + sample = [image, bboxes, masks] + + is_within_crop_area = torch.tensor([0, 1, 0, 1, 0, 1], dtype=torch.bool) + + params = dict(top=1, left=2, height=12, width=12, is_within_crop_area=is_within_crop_area) + transform._get_params = mocker.MagicMock(return_value=params) + output = transform(sample) + + # check number of bboxes vs number of labels: + output_bboxes = output[1] + assert isinstance(output_bboxes, tv_tensors.BoundingBoxes) + assert (output_bboxes[~is_within_crop_area] == 0).all() + + output_masks = output[2] + assert isinstance(output_masks, tv_tensors.Mask) + + +class TestRandomShortestSize: + @pytest.mark.parametrize("min_size,max_size", [([5, 9], 20), ([5, 9], None)]) + def test__get_params(self, min_size, max_size): + canvas_size = (3, 10) + + transform = transforms.RandomShortestSize(min_size=min_size, max_size=max_size, antialias=True) + + sample = make_image(canvas_size) + params = transform._get_params([sample]) + + assert "size" in params + size = params["size"] + + assert isinstance(size, tuple) and len(size) == 2 + + longer = max(size) + shorter = min(size) + if max_size is not None: + assert longer <= max_size + assert shorter <= max_size + else: + assert shorter in min_size + + +class TestRandomResize: + def test__get_params(self): + min_size = 3 + max_size = 6 + + transform = transforms.RandomResize(min_size=min_size, max_size=max_size, antialias=True) + + for _ in range(10): + params = transform._get_params([]) + + assert isinstance(params["size"], list) and len(params["size"]) == 1 + size = params["size"][0] + + assert min_size <= size < max_size + + +@pytest.mark.parametrize("image_type", (PIL.Image, torch.Tensor, tv_tensors.Image)) +@pytest.mark.parametrize("label_type", (torch.Tensor, int)) +@pytest.mark.parametrize("dataset_return_type", (dict, tuple)) +@pytest.mark.parametrize("to_tensor", (transforms.ToTensor, transforms.ToImage)) +def test_classification_preset(image_type, label_type, dataset_return_type, to_tensor): + + image = tv_tensors.Image(torch.randint(0, 256, size=(1, 3, 250, 250), dtype=torch.uint8)) + if image_type is PIL.Image: + image = to_pil_image(image[0]) + elif image_type is torch.Tensor: + image = image.as_subclass(torch.Tensor) + assert is_pure_tensor(image) + + label = 1 if label_type is int else torch.tensor([1]) + + if dataset_return_type is dict: + sample = { + "image": image, + "label": label, + } + else: + sample = image, label + + if to_tensor is transforms.ToTensor: + with pytest.warns(UserWarning, match="deprecated and will be removed"): + to_tensor = to_tensor() + else: + to_tensor = to_tensor() + + t = transforms.Compose( + [ + transforms.RandomResizedCrop((224, 224), antialias=True), + transforms.RandomHorizontalFlip(p=1), + transforms.RandAugment(), + transforms.TrivialAugmentWide(), + transforms.AugMix(), + transforms.AutoAugment(), + to_tensor, + # TODO: ConvertImageDtype is a pass-through on PIL images, is that + # intended? This results in a failure if we convert to tensor after + # it, because the image would still be uint8 which make Normalize + # fail. + transforms.ConvertImageDtype(torch.float), + transforms.Normalize(mean=[0, 0, 0], std=[1, 1, 1]), + transforms.RandomErasing(p=1), + ] + ) + + out = t(sample) + + assert type(out) == type(sample) + + if dataset_return_type is tuple: + out_image, out_label = out + else: + assert out.keys() == sample.keys() + out_image, out_label = out.values() + + assert out_image.shape[-2:] == (224, 224) + assert out_label == label + + +@pytest.mark.parametrize("image_type", (PIL.Image, torch.Tensor, tv_tensors.Image)) +@pytest.mark.parametrize("data_augmentation", ("hflip", "lsj", "multiscale", "ssd", "ssdlite")) +@pytest.mark.parametrize("to_tensor", (transforms.ToTensor, transforms.ToImage)) +@pytest.mark.parametrize("sanitize", (True, False)) +def test_detection_preset(image_type, data_augmentation, to_tensor, sanitize): + torch.manual_seed(0) + + if to_tensor is transforms.ToTensor: + with pytest.warns(UserWarning, match="deprecated and will be removed"): + to_tensor = to_tensor() + else: + to_tensor = to_tensor() + + if data_augmentation == "hflip": + t = [ + transforms.RandomHorizontalFlip(p=1), + to_tensor, + transforms.ConvertImageDtype(torch.float), + ] + elif data_augmentation == "lsj": + t = [ + transforms.ScaleJitter(target_size=(1024, 1024), antialias=True), + # Note: replaced FixedSizeCrop with RandomCrop, becuase we're + # leaving FixedSizeCrop in prototype for now, and it expects Label + # classes which we won't release yet. + # transforms.FixedSizeCrop( + # size=(1024, 1024), fill=defaultdict(lambda: (123.0, 117.0, 104.0), {tv_tensors.Mask: 0}) + # ), + transforms.RandomCrop((1024, 1024), pad_if_needed=True), + transforms.RandomHorizontalFlip(p=1), + to_tensor, + transforms.ConvertImageDtype(torch.float), + ] + elif data_augmentation == "multiscale": + t = [ + transforms.RandomShortestSize( + min_size=(480, 512, 544, 576, 608, 640, 672, 704, 736, 768, 800), max_size=1333, antialias=True + ), + transforms.RandomHorizontalFlip(p=1), + to_tensor, + transforms.ConvertImageDtype(torch.float), + ] + elif data_augmentation == "ssd": + t = [ + transforms.RandomPhotometricDistort(p=1), + transforms.RandomZoomOut(fill={"others": (123.0, 117.0, 104.0), tv_tensors.Mask: 0}, p=1), + transforms.RandomIoUCrop(), + transforms.RandomHorizontalFlip(p=1), + to_tensor, + transforms.ConvertImageDtype(torch.float), + ] + elif data_augmentation == "ssdlite": + t = [ + transforms.RandomIoUCrop(), + transforms.RandomHorizontalFlip(p=1), + to_tensor, + transforms.ConvertImageDtype(torch.float), + ] + if sanitize: + t += [transforms.SanitizeBoundingBoxes()] + t = transforms.Compose(t) + + num_boxes = 5 + H = W = 250 + + image = tv_tensors.Image(torch.randint(0, 256, size=(1, 3, H, W), dtype=torch.uint8)) + if image_type is PIL.Image: + image = to_pil_image(image[0]) + elif image_type is torch.Tensor: + image = image.as_subclass(torch.Tensor) + assert is_pure_tensor(image) + + label = torch.randint(0, 10, size=(num_boxes,)) + + boxes = torch.randint(0, min(H, W) // 2, size=(num_boxes, 4)) + boxes[:, 2:] += boxes[:, :2] + boxes = boxes.clamp(min=0, max=min(H, W)) + boxes = tv_tensors.BoundingBoxes(boxes, format="XYXY", canvas_size=(H, W)) + + masks = tv_tensors.Mask(torch.randint(0, 2, size=(num_boxes, H, W), dtype=torch.uint8)) + + sample = { + "image": image, + "label": label, + "boxes": boxes, + "masks": masks, + } + + out = t(sample) + + if isinstance(to_tensor, transforms.ToTensor) and image_type is not tv_tensors.Image: + assert is_pure_tensor(out["image"]) + else: + assert isinstance(out["image"], tv_tensors.Image) + assert isinstance(out["label"], type(sample["label"])) + + num_boxes_expected = { + # ssd and ssdlite contain RandomIoUCrop which may "remove" some bbox. It + # doesn't remove them strictly speaking, it just marks some boxes as + # degenerate and those boxes will be later removed by + # SanitizeBoundingBoxes(), which we add to the pipelines if the sanitize + # param is True. + # Note that the values below are probably specific to the random seed + # set above (which is fine). + (True, "ssd"): 5, + (True, "ssdlite"): 4, + }.get((sanitize, data_augmentation), num_boxes) + + assert out["boxes"].shape[0] == out["masks"].shape[0] == out["label"].shape[0] == num_boxes_expected + + +class TestSanitizeBoundingBoxes: + def _get_boxes_and_valid_mask(self, H=256, W=128, min_size=10, min_area=10): + boxes_and_validity = [ + ([0, 1, 10, 1], False), # Y1 == Y2 + ([0, 1, 0, 20], False), # X1 == X2 + ([0, 0, min_size - 1, 10], False), # H < min_size + ([0, 0, 10, min_size - 1], False), # W < min_size + ([0, 0, 10, H + 1], False), # Y2 > H + ([0, 0, W + 1, 10], False), # X2 > W + ([-1, 1, 10, 20], False), # any < 0 + ([0, 0, -1, 20], False), # any < 0 + ([0, 0, -10, -1], False), # any < 0 + ([0, 0, min_size, 10], min_size * 10 >= min_area), # H < min_size + ([0, 0, 10, min_size], min_size * 10 >= min_area), # W < min_size + ([0, 0, W, H], W * H >= min_area), + ([1, 1, 30, 20], 29 * 19 >= min_area), + ([0, 0, 10, 10], 9 * 9 >= min_area), + ([1, 1, 30, 20], 29 * 19 >= min_area), + ] + + random.shuffle(boxes_and_validity) # For test robustness: mix order of wrong and correct cases + boxes, expected_valid_mask = zip(*boxes_and_validity) + boxes = tv_tensors.BoundingBoxes( + boxes, + format=tv_tensors.BoundingBoxFormat.XYXY, + canvas_size=(H, W), + ) + + return boxes, expected_valid_mask + + @pytest.mark.parametrize("min_size, min_area", ((1, 1), (10, 1), (10, 101))) + @pytest.mark.parametrize( + "labels_getter", + ( + "default", + lambda inputs: inputs["labels"], + lambda inputs: (inputs["labels"], inputs["other_labels"]), + lambda inputs: [inputs["labels"], inputs["other_labels"]], + None, + lambda inputs: None, + ), + ) + @pytest.mark.parametrize("sample_type", (tuple, dict)) + def test_transform(self, min_size, min_area, labels_getter, sample_type): + + if sample_type is tuple and not isinstance(labels_getter, str): + # The "lambda inputs: inputs["labels"]" labels_getter used in this test + # doesn't work if the input is a tuple. + return + + H, W = 256, 128 + boxes, expected_valid_mask = self._get_boxes_and_valid_mask(H=H, W=W, min_size=min_size, min_area=min_area) + valid_indices = [i for (i, is_valid) in enumerate(expected_valid_mask) if is_valid] + + labels = torch.arange(boxes.shape[0]) + masks = tv_tensors.Mask(torch.randint(0, 2, size=(boxes.shape[0], H, W))) + # other_labels corresponds to properties from COCO like iscrowd, area... + # We only sanitize it when labels_getter returns a tuple + other_labels = torch.arange(boxes.shape[0]) + whatever = torch.rand(10) + input_img = torch.randint(0, 256, size=(1, 3, H, W), dtype=torch.uint8) + sample = { + "image": input_img, + "labels": labels, + "boxes": boxes, + "other_labels": other_labels, + "whatever": whatever, + "None": None, + "masks": masks, + } + + if sample_type is tuple: + img = sample.pop("image") + sample = (img, sample) + + out = transforms.SanitizeBoundingBoxes(min_size=min_size, min_area=min_area, labels_getter=labels_getter)( + sample + ) + + if sample_type is tuple: + out_image = out[0] + out_labels = out[1]["labels"] + out_other_labels = out[1]["other_labels"] + out_boxes = out[1]["boxes"] + out_masks = out[1]["masks"] + out_whatever = out[1]["whatever"] + else: + out_image = out["image"] + out_labels = out["labels"] + out_other_labels = out["other_labels"] + out_boxes = out["boxes"] + out_masks = out["masks"] + out_whatever = out["whatever"] + + assert out_image is input_img + assert out_whatever is whatever + + assert isinstance(out_boxes, tv_tensors.BoundingBoxes) + assert isinstance(out_masks, tv_tensors.Mask) + + if labels_getter is None or (callable(labels_getter) and labels_getter(sample) is None): + assert out_labels is labels + assert out_other_labels is other_labels + else: + assert isinstance(out_labels, torch.Tensor) + assert out_boxes.shape[0] == out_labels.shape[0] == out_masks.shape[0] + # This works because we conveniently set labels to arange(num_boxes) + assert out_labels.tolist() == valid_indices + + if callable(labels_getter) and isinstance(labels_getter(sample), (tuple, list)): + assert_equal(out_other_labels, out_labels) + else: + assert_equal(out_other_labels, other_labels) + + @pytest.mark.parametrize("input_type", (torch.Tensor, tv_tensors.BoundingBoxes)) + def test_functional(self, input_type): + # Note: the "functional" F.sanitize_bounding_boxes was added after the class, so there is some + # redundancy with test_transform() in terms of correctness checks. But that's OK. + + H, W, min_size = 256, 128, 10 + + boxes, expected_valid_mask = self._get_boxes_and_valid_mask(H=H, W=W, min_size=min_size) + + if input_type is tv_tensors.BoundingBoxes: + format = canvas_size = None + else: + # just passing "XYXY" explicitly to make sure we support strings + format, canvas_size = "XYXY", boxes.canvas_size + boxes = boxes.as_subclass(torch.Tensor) + + boxes, valid = F.sanitize_bounding_boxes(boxes, format=format, canvas_size=canvas_size, min_size=min_size) + + assert_equal(valid, torch.tensor(expected_valid_mask)) + assert type(valid) == torch.Tensor + assert boxes.shape[0] == sum(valid) + assert isinstance(boxes, input_type) + + def test_kernel(self): + H, W, min_size = 256, 128, 10 + boxes, _ = self._get_boxes_and_valid_mask(H=H, W=W, min_size=min_size) + + format, canvas_size = boxes.format, boxes.canvas_size + boxes = boxes.as_subclass(torch.Tensor) + + check_kernel( + F.sanitize_bounding_boxes, + input=boxes, + format=format, + canvas_size=canvas_size, + check_batched_vs_unbatched=False, + ) + + def test_no_label(self): + # Non-regression test for https://github.com/pytorch/vision/issues/7878 + + img = make_image() + boxes = make_bounding_boxes() + + with pytest.raises(ValueError, match="or a two-tuple whose second item is a dict"): + transforms.SanitizeBoundingBoxes()(img, boxes) + + out_img, out_boxes = transforms.SanitizeBoundingBoxes(labels_getter=None)(img, boxes) + assert isinstance(out_img, tv_tensors.Image) + assert isinstance(out_boxes, tv_tensors.BoundingBoxes) + + def test_errors_transform(self): + good_bbox = tv_tensors.BoundingBoxes( + [[0, 0, 10, 10]], + format=tv_tensors.BoundingBoxFormat.XYXY, + canvas_size=(20, 20), + ) + + with pytest.raises(ValueError, match="min_size must be >= 1"): + transforms.SanitizeBoundingBoxes(min_size=0) + with pytest.raises(ValueError, match="min_area must be >= 1"): + transforms.SanitizeBoundingBoxes(min_area=0) + with pytest.raises(ValueError, match="labels_getter should either be 'default'"): + transforms.SanitizeBoundingBoxes(labels_getter=12) + + with pytest.raises(ValueError, match="Could not infer where the labels are"): + bad_labels_key = {"bbox": good_bbox, "BAD_KEY": torch.arange(good_bbox.shape[0])} + transforms.SanitizeBoundingBoxes()(bad_labels_key) + + with pytest.raises(ValueError, match="must be a tensor"): + not_a_tensor = {"bbox": good_bbox, "labels": torch.arange(good_bbox.shape[0]).tolist()} + transforms.SanitizeBoundingBoxes()(not_a_tensor) + + with pytest.raises(ValueError, match="Number of boxes"): + different_sizes = {"bbox": good_bbox, "labels": torch.arange(good_bbox.shape[0] + 3)} + transforms.SanitizeBoundingBoxes()(different_sizes) + + def test_errors_functional(self): + + good_bbox = tv_tensors.BoundingBoxes( + [[0, 0, 10, 10]], + format=tv_tensors.BoundingBoxFormat.XYXY, + canvas_size=(20, 20), + ) + + with pytest.raises(ValueError, match="canvas_size cannot be None if bounding_boxes is a pure tensor"): + F.sanitize_bounding_boxes(good_bbox.as_subclass(torch.Tensor), format="XYXY", canvas_size=None) + + with pytest.raises(ValueError, match="canvas_size cannot be None if bounding_boxes is a pure tensor"): + F.sanitize_bounding_boxes(good_bbox.as_subclass(torch.Tensor), format=None, canvas_size=(10, 10)) + + with pytest.raises(ValueError, match="canvas_size must be None when bounding_boxes is a tv_tensors"): + F.sanitize_bounding_boxes(good_bbox, format="XYXY", canvas_size=None) + + with pytest.raises(ValueError, match="canvas_size must be None when bounding_boxes is a tv_tensors"): + F.sanitize_bounding_boxes(good_bbox, format="XYXY", canvas_size=None) + + with pytest.raises(ValueError, match="bounding_boxes must be a tv_tensors.BoundingBoxes instance or a"): + F.sanitize_bounding_boxes(good_bbox.tolist()) + + +class TestJPEG: + @pytest.mark.parametrize("quality", [5, 75]) + @pytest.mark.parametrize("color_space", ["RGB", "GRAY"]) + def test_kernel_image(self, quality, color_space): + check_kernel(F.jpeg_image, make_image(color_space=color_space), quality=quality) + + def test_kernel_video(self): + check_kernel(F.jpeg_video, make_video(), quality=5) + + @pytest.mark.parametrize("make_input", [make_image_tensor, make_image_pil, make_image, make_video]) + def test_functional(self, make_input): + check_functional(F.jpeg, make_input(), quality=5) + + @pytest.mark.parametrize( + ("kernel", "input_type"), + [ + (F.jpeg_image, torch.Tensor), + (F._augment._jpeg_image_pil, PIL.Image.Image), + (F.jpeg_image, tv_tensors.Image), + (F.jpeg_video, tv_tensors.Video), + ], + ) + def test_functional_signature(self, kernel, input_type): + check_functional_kernel_signature_match(F.jpeg, kernel=kernel, input_type=input_type) + + @pytest.mark.parametrize("make_input", [make_image_tensor, make_image_pil, make_image, make_video]) + @pytest.mark.parametrize("quality", [5, (10, 20)]) + @pytest.mark.parametrize("color_space", ["RGB", "GRAY"]) + def test_transform(self, make_input, quality, color_space): + check_transform(transforms.JPEG(quality=quality), make_input(color_space=color_space)) + + @pytest.mark.parametrize("quality", [5]) + def test_functional_image_correctness(self, quality): + image = make_image() + + actual = F.jpeg(image, quality=quality) + expected = F.to_image(F.jpeg(F.to_pil_image(image), quality=quality)) + + # NOTE: this will fail if torchvision and Pillow use different JPEG encoder/decoder + torch.testing.assert_close(actual, expected, rtol=0, atol=1) + + @pytest.mark.parametrize("quality", [5, (10, 20)]) + @pytest.mark.parametrize("color_space", ["RGB", "GRAY"]) + @pytest.mark.parametrize("seed", list(range(5))) + def test_transform_image_correctness(self, quality, color_space, seed): + image = make_image(color_space=color_space) + + transform = transforms.JPEG(quality=quality) + + with freeze_rng_state(): + torch.manual_seed(seed) + actual = transform(image) + + torch.manual_seed(seed) + expected = F.to_image(transform(F.to_pil_image(image))) + + torch.testing.assert_close(actual, expected, rtol=0, atol=1) + + @pytest.mark.parametrize("quality", [5, (10, 20)]) + @pytest.mark.parametrize("seed", list(range(10))) + def test_transform_get_params_bounds(self, quality, seed): + transform = transforms.JPEG(quality=quality) + + with freeze_rng_state(): + torch.manual_seed(seed) + params = transform._get_params([]) + + if isinstance(quality, int): + assert params["quality"] == quality + else: + assert quality[0] <= params["quality"] <= quality[1] + + @pytest.mark.parametrize("quality", [[0], [0, 0, 0]]) + def test_transform_sequence_len_error(self, quality): + with pytest.raises(ValueError, match="quality should be a sequence of length 2"): + transforms.JPEG(quality=quality) + + @pytest.mark.parametrize("quality", [-1, 0, 150]) + def test_transform_invalid_quality_error(self, quality): + with pytest.raises(ValueError, match="quality must be an integer from 1 to 100"): + transforms.JPEG(quality=quality) diff --git a/test/test_transforms_v2_utils.py b/test/test_transforms_v2_utils.py new file mode 100644 index 0000000000000000000000000000000000000000..53222c6a2c85c474112b4c45eab8675c092ad29c --- /dev/null +++ b/test/test_transforms_v2_utils.py @@ -0,0 +1,92 @@ +import PIL.Image +import pytest + +import torch + +import torchvision.transforms.v2._utils +from common_utils import DEFAULT_SIZE, make_bounding_boxes, make_detection_masks, make_image + +from torchvision import tv_tensors +from torchvision.transforms.v2._utils import has_all, has_any +from torchvision.transforms.v2.functional import to_pil_image + + +IMAGE = make_image(DEFAULT_SIZE, color_space="RGB") +BOUNDING_BOX = make_bounding_boxes(DEFAULT_SIZE, format=tv_tensors.BoundingBoxFormat.XYXY) +MASK = make_detection_masks(DEFAULT_SIZE) + + +@pytest.mark.parametrize( + ("sample", "types", "expected"), + [ + ((IMAGE, BOUNDING_BOX, MASK), (tv_tensors.Image,), True), + ((IMAGE, BOUNDING_BOX, MASK), (tv_tensors.BoundingBoxes,), True), + ((IMAGE, BOUNDING_BOX, MASK), (tv_tensors.Mask,), True), + ((IMAGE, BOUNDING_BOX, MASK), (tv_tensors.Image, tv_tensors.BoundingBoxes), True), + ((IMAGE, BOUNDING_BOX, MASK), (tv_tensors.Image, tv_tensors.Mask), True), + ((IMAGE, BOUNDING_BOX, MASK), (tv_tensors.BoundingBoxes, tv_tensors.Mask), True), + ((MASK,), (tv_tensors.Image, tv_tensors.BoundingBoxes), False), + ((BOUNDING_BOX,), (tv_tensors.Image, tv_tensors.Mask), False), + ((IMAGE,), (tv_tensors.BoundingBoxes, tv_tensors.Mask), False), + ( + (IMAGE, BOUNDING_BOX, MASK), + (tv_tensors.Image, tv_tensors.BoundingBoxes, tv_tensors.Mask), + True, + ), + ((), (tv_tensors.Image, tv_tensors.BoundingBoxes, tv_tensors.Mask), False), + ((IMAGE, BOUNDING_BOX, MASK), (lambda obj: isinstance(obj, tv_tensors.Image),), True), + ((IMAGE, BOUNDING_BOX, MASK), (lambda _: False,), False), + ((IMAGE, BOUNDING_BOX, MASK), (lambda _: True,), True), + ((IMAGE,), (tv_tensors.Image, PIL.Image.Image, torchvision.transforms.v2._utils.is_pure_tensor), True), + ( + (torch.Tensor(IMAGE),), + (tv_tensors.Image, PIL.Image.Image, torchvision.transforms.v2._utils.is_pure_tensor), + True, + ), + ( + (to_pil_image(IMAGE),), + (tv_tensors.Image, PIL.Image.Image, torchvision.transforms.v2._utils.is_pure_tensor), + True, + ), + ], +) +def test_has_any(sample, types, expected): + assert has_any(sample, *types) is expected + + +@pytest.mark.parametrize( + ("sample", "types", "expected"), + [ + ((IMAGE, BOUNDING_BOX, MASK), (tv_tensors.Image,), True), + ((IMAGE, BOUNDING_BOX, MASK), (tv_tensors.BoundingBoxes,), True), + ((IMAGE, BOUNDING_BOX, MASK), (tv_tensors.Mask,), True), + ((IMAGE, BOUNDING_BOX, MASK), (tv_tensors.Image, tv_tensors.BoundingBoxes), True), + ((IMAGE, BOUNDING_BOX, MASK), (tv_tensors.Image, tv_tensors.Mask), True), + ((IMAGE, BOUNDING_BOX, MASK), (tv_tensors.BoundingBoxes, tv_tensors.Mask), True), + ( + (IMAGE, BOUNDING_BOX, MASK), + (tv_tensors.Image, tv_tensors.BoundingBoxes, tv_tensors.Mask), + True, + ), + ((BOUNDING_BOX, MASK), (tv_tensors.Image, tv_tensors.BoundingBoxes), False), + ((BOUNDING_BOX, MASK), (tv_tensors.Image, tv_tensors.Mask), False), + ((IMAGE, MASK), (tv_tensors.BoundingBoxes, tv_tensors.Mask), False), + ( + (IMAGE, BOUNDING_BOX, MASK), + (tv_tensors.Image, tv_tensors.BoundingBoxes, tv_tensors.Mask), + True, + ), + ((BOUNDING_BOX, MASK), (tv_tensors.Image, tv_tensors.BoundingBoxes, tv_tensors.Mask), False), + ((IMAGE, MASK), (tv_tensors.Image, tv_tensors.BoundingBoxes, tv_tensors.Mask), False), + ((IMAGE, BOUNDING_BOX), (tv_tensors.Image, tv_tensors.BoundingBoxes, tv_tensors.Mask), False), + ( + (IMAGE, BOUNDING_BOX, MASK), + (lambda obj: isinstance(obj, (tv_tensors.Image, tv_tensors.BoundingBoxes, tv_tensors.Mask)),), + True, + ), + ((IMAGE, BOUNDING_BOX, MASK), (lambda _: False,), False), + ((IMAGE, BOUNDING_BOX, MASK), (lambda _: True,), True), + ], +) +def test_has_all(sample, types, expected): + assert has_all(sample, *types) is expected diff --git a/test/test_transforms_video.py b/test/test_transforms_video.py index 942bb010f71786c4a40bd4b603b73418d597de45..4ad57e6a98ed24e2927d26f4ca1097970cd1ab64 100644 --- a/test/test_transforms_video.py +++ b/test/test_transforms_video.py @@ -1,10 +1,11 @@ -import torch -from torchvision.transforms import Compose -import unittest import random -import numpy as np import warnings -from _assert_utils import assert_equal + +import numpy as np +import pytest +import torch +from common_utils import assert_equal +from torchvision.transforms import Compose try: from scipy import stats @@ -17,21 +18,22 @@ with warnings.catch_warnings(record=True): import torchvision.transforms._transforms_video as transforms -class TestVideoTransforms(unittest.TestCase): - +class TestVideoTransforms: def test_random_crop_video(self): numFrames = random.randint(4, 128) height = random.randint(10, 32) * 2 width = random.randint(10, 32) * 2 - oheight = random.randint(5, (height - 2) / 2) * 2 - owidth = random.randint(5, (width - 2) / 2) * 2 + oheight = random.randint(5, (height - 2) // 2) * 2 + owidth = random.randint(5, (width - 2) // 2) * 2 clip = torch.randint(0, 256, (numFrames, height, width, 3), dtype=torch.uint8) - result = Compose([ - transforms.ToTensorVideo(), - transforms.RandomCropVideo((oheight, owidth)), - ])(clip) - self.assertEqual(result.size(2), oheight) - self.assertEqual(result.size(3), owidth) + result = Compose( + [ + transforms.ToTensorVideo(), + transforms.RandomCropVideo((oheight, owidth)), + ] + )(clip) + assert result.size(2) == oheight + assert result.size(3) == owidth transforms.RandomCropVideo((oheight, owidth)).__repr__() @@ -39,15 +41,17 @@ class TestVideoTransforms(unittest.TestCase): numFrames = random.randint(4, 128) height = random.randint(10, 32) * 2 width = random.randint(10, 32) * 2 - oheight = random.randint(5, (height - 2) / 2) * 2 - owidth = random.randint(5, (width - 2) / 2) * 2 + oheight = random.randint(5, (height - 2) // 2) * 2 + owidth = random.randint(5, (width - 2) // 2) * 2 clip = torch.randint(0, 256, (numFrames, height, width, 3), dtype=torch.uint8) - result = Compose([ - transforms.ToTensorVideo(), - transforms.RandomResizedCropVideo((oheight, owidth)), - ])(clip) - self.assertEqual(result.size(2), oheight) - self.assertEqual(result.size(3), owidth) + result = Compose( + [ + transforms.ToTensorVideo(), + transforms.RandomResizedCropVideo((oheight, owidth)), + ] + )(clip) + assert result.size(2) == oheight + assert result.size(3) == owidth transforms.RandomResizedCropVideo((oheight, owidth)).__repr__() @@ -55,67 +59,77 @@ class TestVideoTransforms(unittest.TestCase): numFrames = random.randint(4, 128) height = random.randint(10, 32) * 2 width = random.randint(10, 32) * 2 - oheight = random.randint(5, (height - 2) / 2) * 2 - owidth = random.randint(5, (width - 2) / 2) * 2 + oheight = random.randint(5, (height - 2) // 2) * 2 + owidth = random.randint(5, (width - 2) // 2) * 2 clip = torch.ones((numFrames, height, width, 3), dtype=torch.uint8) * 255 oh1 = (height - oheight) // 2 ow1 = (width - owidth) // 2 - clipNarrow = clip[:, oh1:oh1 + oheight, ow1:ow1 + owidth, :] + clipNarrow = clip[:, oh1 : oh1 + oheight, ow1 : ow1 + owidth, :] clipNarrow.fill_(0) - result = Compose([ - transforms.ToTensorVideo(), - transforms.CenterCropVideo((oheight, owidth)), - ])(clip) - - msg = "height: " + str(height) + " width: " \ - + str(width) + " oheight: " + str(oheight) + " owidth: " + str(owidth) - self.assertEqual(result.sum().item(), 0, msg) + result = Compose( + [ + transforms.ToTensorVideo(), + transforms.CenterCropVideo((oheight, owidth)), + ] + )(clip) + + msg = ( + "height: " + str(height) + " width: " + str(width) + " oheight: " + str(oheight) + " owidth: " + str(owidth) + ) + assert result.sum().item() == 0, msg oheight += 1 owidth += 1 - result = Compose([ - transforms.ToTensorVideo(), - transforms.CenterCropVideo((oheight, owidth)), - ])(clip) + result = Compose( + [ + transforms.ToTensorVideo(), + transforms.CenterCropVideo((oheight, owidth)), + ] + )(clip) sum1 = result.sum() - msg = "height: " + str(height) + " width: " \ - + str(width) + " oheight: " + str(oheight) + " owidth: " + str(owidth) - self.assertEqual(sum1.item() > 1, True, msg) + msg = ( + "height: " + str(height) + " width: " + str(width) + " oheight: " + str(oheight) + " owidth: " + str(owidth) + ) + assert sum1.item() > 1, msg oheight += 1 owidth += 1 - result = Compose([ - transforms.ToTensorVideo(), - transforms.CenterCropVideo((oheight, owidth)), - ])(clip) + result = Compose( + [ + transforms.ToTensorVideo(), + transforms.CenterCropVideo((oheight, owidth)), + ] + )(clip) sum2 = result.sum() - msg = "height: " + str(height) + " width: " \ - + str(width) + " oheight: " + str(oheight) + " owidth: " + str(owidth) - self.assertTrue(sum2.item() > 1, msg) - self.assertTrue(sum2.item() > sum1.item(), msg) + msg = ( + "height: " + str(height) + " width: " + str(width) + " oheight: " + str(oheight) + " owidth: " + str(owidth) + ) + assert sum2.item() > 1, msg + assert sum2.item() > sum1.item(), msg - @unittest.skipIf(stats is None, 'scipy.stats is not available') - def test_normalize_video(self): + @pytest.mark.skipif(stats is None, reason="scipy.stats is not available") + @pytest.mark.parametrize("channels", [1, 3]) + def test_normalize_video(self, channels): def samples_from_standard_normal(tensor): - p_value = stats.kstest(list(tensor.view(-1)), 'norm', args=(0, 1)).pvalue + p_value = stats.kstest(list(tensor.view(-1)), "norm", args=(0, 1)).pvalue return p_value > 0.0001 random_state = random.getstate() random.seed(42) - for channels in [1, 3]: - numFrames = random.randint(4, 128) - height = random.randint(32, 256) - width = random.randint(32, 256) - mean = random.random() - std = random.random() - clip = torch.normal(mean, std, size=(channels, numFrames, height, width)) - mean = [clip[c].mean().item() for c in range(channels)] - std = [clip[c].std().item() for c in range(channels)] - normalized = transforms.NormalizeVideo(mean, std)(clip) - self.assertTrue(samples_from_standard_normal(normalized)) + + numFrames = random.randint(4, 128) + height = random.randint(32, 256) + width = random.randint(32, 256) + mean = random.random() + std = random.random() + clip = torch.normal(mean, std, size=(channels, numFrames, height, width)) + mean = [clip[c].mean().item() for c in range(channels)] + std = [clip[c].std().item() for c in range(channels)] + normalized = transforms.NormalizeVideo(mean, std)(clip) + assert samples_from_standard_normal(normalized) random.setstate(random_state) # Checking the optional in-place behaviour @@ -129,49 +143,36 @@ class TestVideoTransforms(unittest.TestCase): numFrames, height, width = 64, 4, 4 trans = transforms.ToTensorVideo() - with self.assertRaises(TypeError): - trans(np.random.rand(numFrames, height, width, 1).tolist()) + with pytest.raises(TypeError): + np_rng = np.random.RandomState(0) + trans(np_rng.rand(numFrames, height, width, 1).tolist()) + with pytest.raises(TypeError): trans(torch.rand((numFrames, height, width, 1), dtype=torch.float)) - with self.assertRaises(ValueError): + with pytest.raises(ValueError): trans(torch.ones((3, numFrames, height, width, 3), dtype=torch.uint8)) + with pytest.raises(ValueError): trans(torch.ones((height, width, 3), dtype=torch.uint8)) + with pytest.raises(ValueError): trans(torch.ones((width, 3), dtype=torch.uint8)) + with pytest.raises(ValueError): trans(torch.ones((3), dtype=torch.uint8)) trans.__repr__() - @unittest.skipIf(stats is None, 'scipy.stats not available') - def test_random_horizontal_flip_video(self): - random_state = random.getstate() - random.seed(42) + @pytest.mark.parametrize("p", (0, 1)) + def test_random_horizontal_flip_video(self, p): clip = torch.rand((3, 4, 112, 112), dtype=torch.float) - hclip = clip.flip((-1)) - - num_samples = 250 - num_horizontal = 0 - for _ in range(num_samples): - out = transforms.RandomHorizontalFlipVideo()(clip) - if torch.all(torch.eq(out, hclip)): - num_horizontal += 1 + hclip = clip.flip(-1) - p_value = stats.binom_test(num_horizontal, num_samples, p=0.5) - random.setstate(random_state) - self.assertGreater(p_value, 0.0001) - - num_samples = 250 - num_horizontal = 0 - for _ in range(num_samples): - out = transforms.RandomHorizontalFlipVideo(p=0.7)(clip) - if torch.all(torch.eq(out, hclip)): - num_horizontal += 1 - - p_value = stats.binom_test(num_horizontal, num_samples, p=0.7) - random.setstate(random_state) - self.assertGreater(p_value, 0.0001) + out = transforms.RandomHorizontalFlipVideo(p=p)(clip) + if p == 0: + torch.testing.assert_close(out, clip) + elif p == 1: + torch.testing.assert_close(out, hclip) transforms.RandomHorizontalFlipVideo().__repr__() -if __name__ == '__main__': - unittest.main() +if __name__ == "__main__": + pytest.main([__file__]) diff --git a/test/test_tv_tensors.py b/test/test_tv_tensors.py new file mode 100644 index 0000000000000000000000000000000000000000..ed75ae35ecd1cbf63ecf3a1b3b67725108d219c6 --- /dev/null +++ b/test/test_tv_tensors.py @@ -0,0 +1,320 @@ +from copy import deepcopy + +import pytest +import torch +from common_utils import assert_equal, make_bounding_boxes, make_image, make_segmentation_mask, make_video +from PIL import Image + +from torchvision import tv_tensors + + +@pytest.fixture(autouse=True) +def restore_tensor_return_type(): + # This is for security, as we should already be restoring the default manually in each test anyway + # (at least at the time of writing...) + yield + tv_tensors.set_return_type("Tensor") + + +@pytest.mark.parametrize("data", [torch.rand(3, 32, 32), Image.new("RGB", (32, 32), color=123)]) +def test_image_instance(data): + image = tv_tensors.Image(data) + assert isinstance(image, torch.Tensor) + assert image.ndim == 3 and image.shape[0] == 3 + + +@pytest.mark.parametrize("data", [torch.randint(0, 10, size=(1, 32, 32)), Image.new("L", (32, 32), color=2)]) +def test_mask_instance(data): + mask = tv_tensors.Mask(data) + assert isinstance(mask, torch.Tensor) + assert mask.ndim == 3 and mask.shape[0] == 1 + + +@pytest.mark.parametrize("data", [torch.randint(0, 32, size=(5, 4)), [[0, 0, 5, 5], [2, 2, 7, 7]], [1, 2, 3, 4]]) +@pytest.mark.parametrize( + "format", ["XYXY", "CXCYWH", tv_tensors.BoundingBoxFormat.XYXY, tv_tensors.BoundingBoxFormat.XYWH] +) +def test_bbox_instance(data, format): + bboxes = tv_tensors.BoundingBoxes(data, format=format, canvas_size=(32, 32)) + assert isinstance(bboxes, torch.Tensor) + assert bboxes.ndim == 2 and bboxes.shape[1] == 4 + if isinstance(format, str): + format = tv_tensors.BoundingBoxFormat[(format.upper())] + assert bboxes.format == format + + +def test_bbox_dim_error(): + data_3d = [[[1, 2, 3, 4]]] + with pytest.raises(ValueError, match="Expected a 1D or 2D tensor, got 3D"): + tv_tensors.BoundingBoxes(data_3d, format="XYXY", canvas_size=(32, 32)) + + +@pytest.mark.parametrize( + ("data", "input_requires_grad", "expected_requires_grad"), + [ + ([[[0.0, 1.0], [0.0, 1.0]]], None, False), + ([[[0.0, 1.0], [0.0, 1.0]]], False, False), + ([[[0.0, 1.0], [0.0, 1.0]]], True, True), + (torch.rand(3, 16, 16, requires_grad=False), None, False), + (torch.rand(3, 16, 16, requires_grad=False), False, False), + (torch.rand(3, 16, 16, requires_grad=False), True, True), + (torch.rand(3, 16, 16, requires_grad=True), None, True), + (torch.rand(3, 16, 16, requires_grad=True), False, False), + (torch.rand(3, 16, 16, requires_grad=True), True, True), + ], +) +def test_new_requires_grad(data, input_requires_grad, expected_requires_grad): + tv_tensor = tv_tensors.Image(data, requires_grad=input_requires_grad) + assert tv_tensor.requires_grad is expected_requires_grad + + +@pytest.mark.parametrize("make_input", [make_image, make_bounding_boxes, make_segmentation_mask, make_video]) +def test_isinstance(make_input): + assert isinstance(make_input(), torch.Tensor) + + +def test_wrapping_no_copy(): + tensor = torch.rand(3, 16, 16) + image = tv_tensors.Image(tensor) + + assert image.data_ptr() == tensor.data_ptr() + + +@pytest.mark.parametrize("make_input", [make_image, make_bounding_boxes, make_segmentation_mask, make_video]) +def test_to_wrapping(make_input): + dp = make_input() + + dp_to = dp.to(torch.float64) + + assert type(dp_to) is type(dp) + assert dp_to.dtype is torch.float64 + + +@pytest.mark.parametrize("make_input", [make_image, make_bounding_boxes, make_segmentation_mask, make_video]) +@pytest.mark.parametrize("return_type", ["Tensor", "TVTensor"]) +def test_to_tv_tensor_reference(make_input, return_type): + tensor = torch.rand((3, 16, 16), dtype=torch.float64) + dp = make_input() + + with tv_tensors.set_return_type(return_type): + tensor_to = tensor.to(dp) + + assert type(tensor_to) is (type(dp) if return_type == "TVTensor" else torch.Tensor) + assert tensor_to.dtype is dp.dtype + assert type(tensor) is torch.Tensor + + +@pytest.mark.parametrize("make_input", [make_image, make_bounding_boxes, make_segmentation_mask, make_video]) +@pytest.mark.parametrize("return_type", ["Tensor", "TVTensor"]) +def test_clone_wrapping(make_input, return_type): + dp = make_input() + + with tv_tensors.set_return_type(return_type): + dp_clone = dp.clone() + + assert type(dp_clone) is type(dp) + assert dp_clone.data_ptr() != dp.data_ptr() + + +@pytest.mark.parametrize("make_input", [make_image, make_bounding_boxes, make_segmentation_mask, make_video]) +@pytest.mark.parametrize("return_type", ["Tensor", "TVTensor"]) +def test_requires_grad__wrapping(make_input, return_type): + dp = make_input(dtype=torch.float) + + assert not dp.requires_grad + + with tv_tensors.set_return_type(return_type): + dp_requires_grad = dp.requires_grad_(True) + + assert type(dp_requires_grad) is type(dp) + assert dp.requires_grad + assert dp_requires_grad.requires_grad + + +@pytest.mark.parametrize("make_input", [make_image, make_bounding_boxes, make_segmentation_mask, make_video]) +@pytest.mark.parametrize("return_type", ["Tensor", "TVTensor"]) +def test_detach_wrapping(make_input, return_type): + dp = make_input(dtype=torch.float).requires_grad_(True) + + with tv_tensors.set_return_type(return_type): + dp_detached = dp.detach() + + assert type(dp_detached) is type(dp) + + +@pytest.mark.parametrize("return_type", ["Tensor", "TVTensor"]) +def test_force_subclass_with_metadata(return_type): + # Sanity checks for the ops in _FORCE_TORCHFUNCTION_SUBCLASS and tv_tensors with metadata + # Largely the same as above, we additionally check that the metadata is preserved + format, canvas_size = "XYXY", (32, 32) + bbox = tv_tensors.BoundingBoxes([[0, 0, 5, 5], [2, 2, 7, 7]], format=format, canvas_size=canvas_size) + + tv_tensors.set_return_type(return_type) + bbox = bbox.clone() + if return_type == "TVTensor": + assert bbox.format, bbox.canvas_size == (format, canvas_size) + + bbox = bbox.to(torch.float64) + if return_type == "TVTensor": + assert bbox.format, bbox.canvas_size == (format, canvas_size) + + bbox = bbox.detach() + if return_type == "TVTensor": + assert bbox.format, bbox.canvas_size == (format, canvas_size) + + assert not bbox.requires_grad + bbox.requires_grad_(True) + if return_type == "TVTensor": + assert bbox.format, bbox.canvas_size == (format, canvas_size) + assert bbox.requires_grad + tv_tensors.set_return_type("tensor") + + +@pytest.mark.parametrize("make_input", [make_image, make_bounding_boxes, make_segmentation_mask, make_video]) +@pytest.mark.parametrize("return_type", ["Tensor", "TVTensor"]) +def test_other_op_no_wrapping(make_input, return_type): + dp = make_input() + + with tv_tensors.set_return_type(return_type): + # any operation besides the ones listed in _FORCE_TORCHFUNCTION_SUBCLASS will do here + output = dp * 2 + + assert type(output) is (type(dp) if return_type == "TVTensor" else torch.Tensor) + + +@pytest.mark.parametrize("make_input", [make_image, make_bounding_boxes, make_segmentation_mask, make_video]) +@pytest.mark.parametrize( + "op", + [ + lambda t: t.numpy(), + lambda t: t.tolist(), + lambda t: t.max(dim=-1), + ], +) +def test_no_tensor_output_op_no_wrapping(make_input, op): + dp = make_input() + + output = op(dp) + + assert type(output) is not type(dp) + + +@pytest.mark.parametrize("make_input", [make_image, make_bounding_boxes, make_segmentation_mask, make_video]) +@pytest.mark.parametrize("return_type", ["Tensor", "TVTensor"]) +def test_inplace_op_no_wrapping(make_input, return_type): + dp = make_input() + original_type = type(dp) + + with tv_tensors.set_return_type(return_type): + output = dp.add_(0) + + assert type(output) is (type(dp) if return_type == "TVTensor" else torch.Tensor) + assert type(dp) is original_type + + +@pytest.mark.parametrize("make_input", [make_image, make_bounding_boxes, make_segmentation_mask, make_video]) +def test_wrap(make_input): + dp = make_input() + + # any operation besides the ones listed in _FORCE_TORCHFUNCTION_SUBCLASS will do here + output = dp * 2 + + dp_new = tv_tensors.wrap(output, like=dp) + + assert type(dp_new) is type(dp) + assert dp_new.data_ptr() == output.data_ptr() + + +@pytest.mark.parametrize("make_input", [make_image, make_bounding_boxes, make_segmentation_mask, make_video]) +@pytest.mark.parametrize("requires_grad", [False, True]) +def test_deepcopy(make_input, requires_grad): + dp = make_input(dtype=torch.float) + + dp.requires_grad_(requires_grad) + + dp_deepcopied = deepcopy(dp) + + assert dp_deepcopied is not dp + assert dp_deepcopied.data_ptr() != dp.data_ptr() + assert_equal(dp_deepcopied, dp) + + assert type(dp_deepcopied) is type(dp) + assert dp_deepcopied.requires_grad is requires_grad + + +@pytest.mark.parametrize("make_input", [make_image, make_bounding_boxes, make_segmentation_mask, make_video]) +@pytest.mark.parametrize("return_type", ["Tensor", "TVTensor"]) +@pytest.mark.parametrize( + "op", + ( + lambda dp: dp + torch.rand(*dp.shape), + lambda dp: torch.rand(*dp.shape) + dp, + lambda dp: dp * torch.rand(*dp.shape), + lambda dp: torch.rand(*dp.shape) * dp, + lambda dp: dp + 3, + lambda dp: 3 + dp, + lambda dp: dp + dp, + lambda dp: dp.sum(), + lambda dp: dp.reshape(-1), + lambda dp: dp.int(), + lambda dp: torch.stack([dp, dp]), + lambda dp: torch.chunk(dp, 2)[0], + lambda dp: torch.unbind(dp)[0], + ), +) +def test_usual_operations(make_input, return_type, op): + + dp = make_input() + with tv_tensors.set_return_type(return_type): + out = op(dp) + assert type(out) is (type(dp) if return_type == "TVTensor" else torch.Tensor) + if isinstance(dp, tv_tensors.BoundingBoxes) and return_type == "TVTensor": + assert hasattr(out, "format") + assert hasattr(out, "canvas_size") + + +def test_subclasses(): + img = make_image() + masks = make_segmentation_mask() + + with pytest.raises(TypeError, match="unsupported operand"): + img + masks + + +def test_set_return_type(): + img = make_image() + + assert type(img + 3) is torch.Tensor + + with tv_tensors.set_return_type("TVTensor"): + assert type(img + 3) is tv_tensors.Image + assert type(img + 3) is torch.Tensor + + tv_tensors.set_return_type("TVTensor") + assert type(img + 3) is tv_tensors.Image + + with tv_tensors.set_return_type("tensor"): + assert type(img + 3) is torch.Tensor + with tv_tensors.set_return_type("TVTensor"): + assert type(img + 3) is tv_tensors.Image + tv_tensors.set_return_type("tensor") + assert type(img + 3) is torch.Tensor + assert type(img + 3) is torch.Tensor + # Exiting a context manager will restore the return type as it was prior to entering it, + # regardless of whether the "global" tv_tensors.set_return_type() was called within the context manager. + assert type(img + 3) is tv_tensors.Image + + tv_tensors.set_return_type("tensor") + + +def test_return_type_input(): + img = make_image() + + # Case-insensitive + with tv_tensors.set_return_type("tvtensor"): + assert type(img + 3) is tv_tensors.Image + + with pytest.raises(ValueError, match="return_type must be"): + tv_tensors.set_return_type("typo") + + tv_tensors.set_return_type("tensor") diff --git a/test/test_utils.py b/test/test_utils.py index 3fed2535c77f2dcefc35c9130383fa276eb589ec..e89bef4a6d9630cf6eded6a26d67a1d0f31829fe 100644 --- a/test/test_utils.py +++ b/test/test_utils.py @@ -1,21 +1,24 @@ -import pytest -import numpy as np import os +import re import sys import tempfile +from io import BytesIO + +import numpy as np +import pytest import torch +import torchvision.transforms.functional as F import torchvision.utils as utils +from common_utils import assert_equal, cpu_and_cuda +from PIL import __version__ as PILLOW_VERSION, Image, ImageColor +from torchvision.transforms.v2.functional import to_dtype -from io import BytesIO -import torchvision.transforms.functional as F -from PIL import Image, __version__ as PILLOW_VERSION, ImageColor -from _assert_utils import assert_equal +PILLOW_VERSION = tuple(int(x) for x in PILLOW_VERSION.split(".")) -PILLOW_VERSION = tuple(int(x) for x in PILLOW_VERSION.split('.')) +boxes = torch.tensor([[0, 0, 20, 20], [0, 0, 0, 0], [10, 15, 30, 35], [23, 35, 93, 95]], dtype=torch.float) -boxes = torch.tensor([[0, 0, 20, 20], [0, 0, 0, 0], - [10, 15, 30, 35], [23, 35, 93, 95]], dtype=torch.float) +keypoints = torch.tensor([[[10, 10], [5, 5], [2, 2]], [[20, 20], [30, 30], [3, 3]]], dtype=torch.float) def test_make_grid_not_inplace(): @@ -23,13 +26,13 @@ def test_make_grid_not_inplace(): t_clone = t.clone() utils.make_grid(t, normalize=False) - assert_equal(t, t_clone, msg='make_grid modified tensor in-place') + assert_equal(t, t_clone, msg="make_grid modified tensor in-place") utils.make_grid(t, normalize=True, scale_each=False) - assert_equal(t, t_clone, msg='make_grid modified tensor in-place') + assert_equal(t, t_clone, msg="make_grid modified tensor in-place") utils.make_grid(t, normalize=True, scale_each=True) - assert_equal(t, t_clone, msg='make_grid modified tensor in-place') + assert_equal(t, t_clone, msg="make_grid modified tensor in-place") def test_normalize_in_make_grid(): @@ -43,51 +46,51 @@ def test_normalize_in_make_grid(): # Rounding the result to one decimal for comparison n_digits = 1 - rounded_grid_max = torch.round(grid_max * 10 ** n_digits) / (10 ** n_digits) - rounded_grid_min = torch.round(grid_min * 10 ** n_digits) / (10 ** n_digits) + rounded_grid_max = torch.round(grid_max * 10**n_digits) / (10**n_digits) + rounded_grid_min = torch.round(grid_min * 10**n_digits) / (10**n_digits) - assert_equal(norm_max, rounded_grid_max, msg='Normalized max is not equal to 1') - assert_equal(norm_min, rounded_grid_min, msg='Normalized min is not equal to 0') + assert_equal(norm_max, rounded_grid_max, msg="Normalized max is not equal to 1") + assert_equal(norm_min, rounded_grid_min, msg="Normalized min is not equal to 0") -@pytest.mark.skipif(sys.platform in ('win32', 'cygwin'), reason='temporarily disabled on Windows') +@pytest.mark.skipif(sys.platform in ("win32", "cygwin"), reason="temporarily disabled on Windows") def test_save_image(): - with tempfile.NamedTemporaryFile(suffix='.png') as f: + with tempfile.NamedTemporaryFile(suffix=".png") as f: t = torch.rand(2, 3, 64, 64) utils.save_image(t, f.name) - assert os.path.exists(f.name), 'The image is not present after save' + assert os.path.exists(f.name), "The image is not present after save" -@pytest.mark.skipif(sys.platform in ('win32', 'cygwin'), reason='temporarily disabled on Windows') +@pytest.mark.skipif(sys.platform in ("win32", "cygwin"), reason="temporarily disabled on Windows") def test_save_image_single_pixel(): - with tempfile.NamedTemporaryFile(suffix='.png') as f: + with tempfile.NamedTemporaryFile(suffix=".png") as f: t = torch.rand(1, 3, 1, 1) utils.save_image(t, f.name) - assert os.path.exists(f.name), 'The pixel image is not present after save' + assert os.path.exists(f.name), "The pixel image is not present after save" -@pytest.mark.skipif(sys.platform in ('win32', 'cygwin'), reason='temporarily disabled on Windows') +@pytest.mark.skipif(sys.platform in ("win32", "cygwin"), reason="temporarily disabled on Windows") def test_save_image_file_object(): - with tempfile.NamedTemporaryFile(suffix='.png') as f: + with tempfile.NamedTemporaryFile(suffix=".png") as f: t = torch.rand(2, 3, 64, 64) utils.save_image(t, f.name) img_orig = Image.open(f.name) fp = BytesIO() - utils.save_image(t, fp, format='png') + utils.save_image(t, fp, format="png") img_bytes = Image.open(fp) - assert_equal(F.to_tensor(img_orig), F.to_tensor(img_bytes), msg='Image not stored in file object') + assert_equal(F.pil_to_tensor(img_orig), F.pil_to_tensor(img_bytes), msg="Image not stored in file object") -@pytest.mark.skipif(sys.platform in ('win32', 'cygwin'), reason='temporarily disabled on Windows') +@pytest.mark.skipif(sys.platform in ("win32", "cygwin"), reason="temporarily disabled on Windows") def test_save_image_single_pixel_file_object(): - with tempfile.NamedTemporaryFile(suffix='.png') as f: + with tempfile.NamedTemporaryFile(suffix=".png") as f: t = torch.rand(1, 3, 1, 1) utils.save_image(t, f.name) img_orig = Image.open(f.name) fp = BytesIO() - utils.save_image(t, fp, format='png') + utils.save_image(t, fp, format="png") img_bytes = Image.open(fp) - assert_equal(F.to_tensor(img_orig), F.to_tensor(img_bytes), msg='Image not stored in file object') + assert_equal(F.pil_to_tensor(img_orig), F.pil_to_tensor(img_bytes), msg="Image not stored in file object") def test_draw_boxes(): @@ -103,7 +106,7 @@ def test_draw_boxes(): res = Image.fromarray(result.permute(1, 2, 0).contiguous().numpy()) res.save(path) - if PILLOW_VERSION >= (8, 2): + if PILLOW_VERSION >= (10, 1): # The reference image is only valid for new PIL versions expected = torch.as_tensor(np.array(Image.open(path))).permute(2, 0, 1) assert_equal(result, expected) @@ -113,11 +116,37 @@ def test_draw_boxes(): assert_equal(img, img_cp) +@pytest.mark.parametrize("fill", [True, False]) +def test_draw_boxes_dtypes(fill): + img_uint8 = torch.full((3, 100, 100), 255, dtype=torch.uint8) + out_uint8 = utils.draw_bounding_boxes(img_uint8, boxes, fill=fill) + + assert img_uint8 is not out_uint8 + assert out_uint8.dtype == torch.uint8 + + img_float = to_dtype(img_uint8, torch.float, scale=True) + out_float = utils.draw_bounding_boxes(img_float, boxes, fill=fill) + + assert img_float is not out_float + assert out_float.is_floating_point() + + torch.testing.assert_close(out_uint8, to_dtype(out_float, torch.uint8, scale=True), rtol=0, atol=1) + + +@pytest.mark.parametrize("colors", [None, ["red", "blue", "#FF00FF", (1, 34, 122)], "red", "#FF00FF", (1, 34, 122)]) +def test_draw_boxes_colors(colors): + img = torch.full((3, 100, 100), 0, dtype=torch.uint8) + utils.draw_bounding_boxes(img, boxes, fill=False, width=7, colors=colors) + + with pytest.raises(ValueError, match="Number of colors must be equal or larger than the number of objects"): + utils.draw_bounding_boxes(image=img, boxes=boxes, colors=[]) + + def test_draw_boxes_vanilla(): img = torch.full((3, 100, 100), 0, dtype=torch.uint8) img_cp = img.clone() boxes_cp = boxes.clone() - result = utils.draw_bounding_boxes(img, boxes, fill=False, width=7) + result = utils.draw_bounding_boxes(img, boxes, fill=False, width=7, colors="white") path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "assets", "fakedata", "draw_boxes_vanilla.png") if not os.path.exists(path): @@ -131,39 +160,75 @@ def test_draw_boxes_vanilla(): assert_equal(img, img_cp) +def test_draw_boxes_grayscale(): + img = torch.full((1, 4, 4), fill_value=255, dtype=torch.uint8) + boxes = torch.tensor([[0, 0, 3, 3]], dtype=torch.int64) + bboxed_img = utils.draw_bounding_boxes(image=img, boxes=boxes, colors=["#1BBC9B"]) + assert bboxed_img.size(0) == 3 + + def test_draw_invalid_boxes(): img_tp = ((1, 1, 1), (1, 2, 3)) - img_wrong1 = torch.full((3, 5, 5), 255, dtype=torch.float) img_wrong2 = torch.full((1, 3, 5, 5), 255, dtype=torch.uint8) - boxes = torch.tensor([[0, 0, 20, 20], [0, 0, 0, 0], - [10, 15, 30, 35], [23, 35, 93, 95]], dtype=torch.float) + img_correct = torch.zeros((3, 10, 10), dtype=torch.uint8) + boxes = torch.tensor([[0, 0, 20, 20], [0, 0, 0, 0], [10, 15, 30, 35], [23, 35, 93, 95]], dtype=torch.float) + boxes_wrong = torch.tensor([[10, 10, 4, 5], [30, 20, 10, 5]], dtype=torch.float) + labels_wrong = ["one", "two"] + colors_wrong = ["pink", "blue"] + with pytest.raises(TypeError, match="Tensor expected"): utils.draw_bounding_boxes(img_tp, boxes) - with pytest.raises(ValueError, match="Tensor uint8 expected"): - utils.draw_bounding_boxes(img_wrong1, boxes) with pytest.raises(ValueError, match="Pass individual images, not batches"): utils.draw_bounding_boxes(img_wrong2, boxes) + with pytest.raises(ValueError, match="Only grayscale and RGB images are supported"): + utils.draw_bounding_boxes(img_wrong2[0][:2], boxes) + with pytest.raises(ValueError, match="Number of boxes"): + utils.draw_bounding_boxes(img_correct, boxes, labels_wrong) + with pytest.raises(ValueError, match="Number of colors"): + utils.draw_bounding_boxes(img_correct, boxes, colors=colors_wrong) + with pytest.raises(ValueError, match="Boxes need to be in"): + utils.draw_bounding_boxes(img_correct, boxes_wrong) + + +def test_draw_boxes_warning(): + img = torch.full((3, 100, 100), 255, dtype=torch.uint8) + + with pytest.warns(UserWarning, match=re.escape("Argument 'font_size' will be ignored since 'font' is not set.")): + utils.draw_bounding_boxes(img, boxes, font_size=11) -@pytest.mark.parametrize('colors', [ - None, - ['red', 'blue'], - ['#FF00FF', (1, 34, 122)], -]) -@pytest.mark.parametrize('alpha', (0, .5, .7, 1)) -def test_draw_segmentation_masks(colors, alpha): +def test_draw_no_boxes(): + img = torch.full((3, 100, 100), 0, dtype=torch.uint8) + boxes = torch.full((0, 4), 0, dtype=torch.float) + with pytest.warns(UserWarning, match=re.escape("boxes doesn't contain any box. No box was drawn")): + res = utils.draw_bounding_boxes(img, boxes) + # Check that the function didn't change the image + assert res.eq(img).all() + + +@pytest.mark.parametrize( + "colors", + [ + None, + "blue", + "#FF00FF", + (1, 34, 122), + ["red", "blue"], + ["#FF00FF", (1, 34, 122)], + ], +) +@pytest.mark.parametrize("alpha", (0, 0.5, 0.7, 1)) +@pytest.mark.parametrize("device", cpu_and_cuda()) +def test_draw_segmentation_masks(colors, alpha, device): """This test makes sure that masks draw their corresponding color where they should""" num_masks, h, w = 2, 100, 100 dtype = torch.uint8 - img = torch.randint(0, 256, size=(3, h, w), dtype=dtype) - masks = torch.randint(0, 2, (num_masks, h, w), dtype=torch.bool) + img = torch.randint(0, 256, size=(3, h, w), dtype=dtype, device=device) + masks = torch.zeros((num_masks, h, w), dtype=torch.bool, device=device) + masks[0, 10:20, 10:20] = True + masks[1, 15:25, 15:25] = True - # For testing we enforce that there's no overlap between the masks. The - # current behaviour is that the last mask's color will take priority when - # masks overlap, but this makes testing slightly harder so we don't really - # care overlap = masks[0] & masks[1] - masks[:, overlap] = False out = utils.draw_segmentation_masks(img, masks, colors=colors, alpha=alpha) assert out.dtype == dtype @@ -175,27 +240,53 @@ def test_draw_segmentation_masks(colors, alpha): if colors is None: colors = utils._generate_color_palette(num_masks) + elif isinstance(colors, str) or isinstance(colors, tuple): + colors = [colors] # Make sure each mask draws with its own color for mask, color in zip(masks, colors): if isinstance(color, str): color = ImageColor.getrgb(color) - color = torch.tensor(color, dtype=dtype) + color = torch.tensor(color, dtype=dtype, device=device) if alpha == 1: - assert (out[:, mask] == color[:, None]).all() + assert (out[:, mask & ~overlap] == color[:, None]).all() elif alpha == 0: - assert (out[:, mask] == img[:, mask]).all() + assert (out[:, mask & ~overlap] == img[:, mask & ~overlap]).all() + + interpolated_color = (img[:, mask & ~overlap] * (1 - alpha) + color[:, None] * alpha).to(dtype) + torch.testing.assert_close(out[:, mask & ~overlap], interpolated_color, rtol=0.0, atol=1.0) + + interpolated_overlap = (img[:, overlap] * (1 - alpha)).to(dtype) + torch.testing.assert_close(out[:, overlap], interpolated_overlap, rtol=0.0, atol=1.0) + + +def test_draw_segmentation_masks_dtypes(): + num_masks, h, w = 2, 100, 100 + + masks = torch.randint(0, 2, (num_masks, h, w), dtype=torch.bool) + + img_uint8 = torch.randint(0, 256, size=(3, h, w), dtype=torch.uint8) + out_uint8 = utils.draw_segmentation_masks(img_uint8, masks) + + assert img_uint8 is not out_uint8 + assert out_uint8.dtype == torch.uint8 + + img_float = to_dtype(img_uint8, torch.float, scale=True) + out_float = utils.draw_segmentation_masks(img_float, masks) + + assert img_float is not out_float + assert out_float.is_floating_point() - interpolated_color = (img[:, mask] * (1 - alpha) + color[:, None] * alpha).to(dtype) - torch.testing.assert_close(out[:, mask], interpolated_color, rtol=0.0, atol=1.0) + torch.testing.assert_close(out_uint8, to_dtype(out_float, torch.uint8, scale=True), rtol=0, atol=1) -def test_draw_segmentation_masks_errors(): +@pytest.mark.parametrize("device", cpu_and_cuda()) +def test_draw_segmentation_masks_errors(device): h, w = 10, 10 - masks = torch.randint(0, 2, size=(h, w), dtype=torch.bool) - img = torch.randint(0, 256, size=(3, h, w), dtype=torch.uint8) + masks = torch.randint(0, 2, size=(h, w), dtype=torch.bool, device=device) + img = torch.randint(0, 256, size=(3, h, w), dtype=torch.uint8, device=device) with pytest.raises(TypeError, match="The image must be a tensor"): utils.draw_segmentation_masks(image="Not A Tensor Image", masks=masks) @@ -217,15 +308,236 @@ def test_draw_segmentation_masks_errors(): with pytest.raises(ValueError, match="must have the same height and width"): masks_bad_shape = torch.randint(0, 2, size=(h + 4, w), dtype=torch.bool) utils.draw_segmentation_masks(image=img, masks=masks_bad_shape) - with pytest.raises(ValueError, match="There are more masks"): + with pytest.raises(ValueError, match="Number of colors must be equal or larger than the number of objects"): utils.draw_segmentation_masks(image=img, masks=masks, colors=[]) - with pytest.raises(ValueError, match="colors must be a tuple or a string, or a list thereof"): - bad_colors = np.array(['red', 'blue']) # should be a list + with pytest.raises(ValueError, match="`colors` must be a tuple or a string, or a list thereof"): + bad_colors = np.array(["red", "blue"]) # should be a list utils.draw_segmentation_masks(image=img, masks=masks, colors=bad_colors) - with pytest.raises(ValueError, match="It seems that you passed a tuple of colors instead of"): - bad_colors = ('red', 'blue') # should be a list + with pytest.raises(ValueError, match="If passed as tuple, colors should be an RGB triplet"): + bad_colors = ("red", "blue") # should be a list utils.draw_segmentation_masks(image=img, masks=masks, colors=bad_colors) +@pytest.mark.parametrize("device", cpu_and_cuda()) +def test_draw_no_segmention_mask(device): + img = torch.full((3, 100, 100), 0, dtype=torch.uint8, device=device) + masks = torch.full((0, 100, 100), 0, dtype=torch.bool, device=device) + with pytest.warns(UserWarning, match=re.escape("masks doesn't contain any mask. No mask was drawn")): + res = utils.draw_segmentation_masks(img, masks) + # Check that the function didn't change the image + assert res.eq(img).all() + + +def test_draw_keypoints_vanilla(): + # Keypoints is declared on top as global variable + keypoints_cp = keypoints.clone() + + img = torch.full((3, 100, 100), 0, dtype=torch.uint8) + img_cp = img.clone() + result = utils.draw_keypoints( + img, + keypoints, + colors="red", + connectivity=[ + (0, 1), + ], + ) + path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "assets", "fakedata", "draw_keypoint_vanilla.png") + if not os.path.exists(path): + res = Image.fromarray(result.permute(1, 2, 0).contiguous().numpy()) + res.save(path) + + expected = torch.as_tensor(np.array(Image.open(path))).permute(2, 0, 1) + assert_equal(result, expected) + # Check that keypoints are not modified inplace + assert_equal(keypoints, keypoints_cp) + # Check that image is not modified in place + assert_equal(img, img_cp) + + +def test_draw_keypoins_K_equals_one(): + # Non-regression test for https://github.com/pytorch/vision/pull/8439 + img = torch.full((3, 100, 100), 0, dtype=torch.uint8) + keypoints = torch.tensor([[[10, 10]]], dtype=torch.float) + utils.draw_keypoints(img, keypoints) + + +@pytest.mark.parametrize("colors", ["red", "#FF00FF", (1, 34, 122)]) +def test_draw_keypoints_colored(colors): + # Keypoints is declared on top as global variable + keypoints_cp = keypoints.clone() + + img = torch.full((3, 100, 100), 0, dtype=torch.uint8) + img_cp = img.clone() + result = utils.draw_keypoints( + img, + keypoints, + colors=colors, + connectivity=[ + (0, 1), + ], + ) + assert result.size(0) == 3 + assert_equal(keypoints, keypoints_cp) + assert_equal(img, img_cp) + + +@pytest.mark.parametrize("connectivity", [[(0, 1)], [(0, 1), (1, 2)]]) +@pytest.mark.parametrize( + "vis", + [ + torch.tensor([[1, 1, 0], [1, 1, 0]], dtype=torch.bool), + torch.tensor([[1, 1, 0], [1, 1, 0]], dtype=torch.float).unsqueeze_(-1), + ], +) +def test_draw_keypoints_visibility(connectivity, vis): + # Keypoints is declared on top as global variable + keypoints_cp = keypoints.clone() + + img = torch.full((3, 100, 100), 0, dtype=torch.uint8) + img_cp = img.clone() + + vis_cp = vis if vis is None else vis.clone() + + result = utils.draw_keypoints( + image=img, + keypoints=keypoints, + connectivity=connectivity, + colors="red", + visibility=vis, + ) + assert result.size(0) == 3 + assert_equal(keypoints, keypoints_cp) + assert_equal(img, img_cp) + + # compare with a fakedata image + # connect the key points 0 to 1 for both skeletons and do not show the other key points + path = os.path.join( + os.path.dirname(os.path.abspath(__file__)), "assets", "fakedata", "draw_keypoints_visibility.png" + ) + if not os.path.exists(path): + res = Image.fromarray(result.permute(1, 2, 0).contiguous().numpy()) + res.save(path) + + expected = torch.as_tensor(np.array(Image.open(path))).permute(2, 0, 1) + assert_equal(result, expected) + + if vis_cp is None: + assert vis is None + else: + assert_equal(vis, vis_cp) + assert vis.dtype == vis_cp.dtype + + +def test_draw_keypoints_visibility_default(): + # Keypoints is declared on top as global variable + keypoints_cp = keypoints.clone() + + img = torch.full((3, 100, 100), 0, dtype=torch.uint8) + img_cp = img.clone() + + result = utils.draw_keypoints( + image=img, + keypoints=keypoints, + connectivity=[(0, 1)], + colors="red", + visibility=None, + ) + assert result.size(0) == 3 + assert_equal(keypoints, keypoints_cp) + assert_equal(img, img_cp) + + # compare against fakedata image, which connects 0->1 for both key-point skeletons + path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "assets", "fakedata", "draw_keypoint_vanilla.png") + expected = torch.as_tensor(np.array(Image.open(path))).permute(2, 0, 1) + assert_equal(result, expected) + + +def test_draw_keypoints_dtypes(): + image_uint8 = torch.randint(0, 256, size=(3, 100, 100), dtype=torch.uint8) + image_float = to_dtype(image_uint8, torch.float, scale=True) + + out_uint8 = utils.draw_keypoints(image_uint8, keypoints) + out_float = utils.draw_keypoints(image_float, keypoints) + + assert out_uint8.dtype == torch.uint8 + assert out_uint8 is not image_uint8 + + assert out_float.is_floating_point() + assert out_float is not image_float + + torch.testing.assert_close(out_uint8, to_dtype(out_float, torch.uint8, scale=True), rtol=0, atol=1) + + +def test_draw_keypoints_errors(): + h, w = 10, 10 + img = torch.full((3, 100, 100), 0, dtype=torch.uint8) + + with pytest.raises(TypeError, match="The image must be a tensor"): + utils.draw_keypoints(image="Not A Tensor Image", keypoints=keypoints) + with pytest.raises(ValueError, match="The image dtype must be"): + img_bad_dtype = torch.full((3, h, w), 0, dtype=torch.int64) + utils.draw_keypoints(image=img_bad_dtype, keypoints=keypoints) + with pytest.raises(ValueError, match="Pass individual images, not batches"): + batch = torch.randint(0, 256, size=(10, 3, h, w), dtype=torch.uint8) + utils.draw_keypoints(image=batch, keypoints=keypoints) + with pytest.raises(ValueError, match="Pass an RGB image"): + one_channel = torch.randint(0, 256, size=(1, h, w), dtype=torch.uint8) + utils.draw_keypoints(image=one_channel, keypoints=keypoints) + with pytest.raises(ValueError, match="keypoints must be of shape"): + invalid_keypoints = torch.tensor([[10, 10, 10, 10], [5, 6, 7, 8]], dtype=torch.float) + utils.draw_keypoints(image=img, keypoints=invalid_keypoints) + with pytest.raises(ValueError, match=re.escape("visibility must be of shape (num_instances, K)")): + one_dim_visibility = torch.tensor([True, True, True], dtype=torch.bool) + utils.draw_keypoints(image=img, keypoints=keypoints, visibility=one_dim_visibility) + with pytest.raises(ValueError, match=re.escape("visibility must be of shape (num_instances, K)")): + three_dim_visibility = torch.ones((2, 3, 4), dtype=torch.bool) + utils.draw_keypoints(image=img, keypoints=keypoints, visibility=three_dim_visibility) + with pytest.raises(ValueError, match="keypoints and visibility must have the same dimensionality"): + vis_wrong_n = torch.ones((3, 3), dtype=torch.bool) + utils.draw_keypoints(image=img, keypoints=keypoints, visibility=vis_wrong_n) + with pytest.raises(ValueError, match="keypoints and visibility must have the same dimensionality"): + vis_wrong_k = torch.ones((2, 4), dtype=torch.bool) + utils.draw_keypoints(image=img, keypoints=keypoints, visibility=vis_wrong_k) + + +@pytest.mark.parametrize("batch", (True, False)) +def test_flow_to_image(batch): + h, w = 100, 100 + flow = torch.meshgrid(torch.arange(h), torch.arange(w), indexing="ij") + flow = torch.stack(flow[::-1], dim=0).float() + flow[0] -= h / 2 + flow[1] -= w / 2 + + if batch: + flow = torch.stack([flow, flow]) + + img = utils.flow_to_image(flow) + assert img.shape == (2, 3, h, w) if batch else (3, h, w) + + path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "assets", "expected_flow.pt") + expected_img = torch.load(path, map_location="cpu", weights_only=True) + + if batch: + expected_img = torch.stack([expected_img, expected_img]) + + assert_equal(expected_img, img) + + +@pytest.mark.parametrize( + "input_flow, match", + ( + (torch.full((3, 10, 10), 0, dtype=torch.float), "Input flow should have shape"), + (torch.full((5, 3, 10, 10), 0, dtype=torch.float), "Input flow should have shape"), + (torch.full((2, 10), 0, dtype=torch.float), "Input flow should have shape"), + (torch.full((5, 2, 10), 0, dtype=torch.float), "Input flow should have shape"), + (torch.full((2, 10, 30), 0, dtype=torch.int), "Flow should be of dtype torch.float"), + ), +) +def test_flow_to_image_errors(input_flow, match): + with pytest.raises(ValueError, match=match): + utils.flow_to_image(flow=input_flow) + + if __name__ == "__main__": pytest.main([__file__]) diff --git a/test/test_video_gpu_decoder.py b/test/test_video_gpu_decoder.py new file mode 100644 index 0000000000000000000000000000000000000000..aa6d0aee9e04afe5d36227922e2bc589d16d3ee6 --- /dev/null +++ b/test/test_video_gpu_decoder.py @@ -0,0 +1,97 @@ +import math +import os + +import pytest +import torch +import torchvision +from torchvision.io import _HAS_GPU_VIDEO_DECODER, VideoReader + +try: + import av +except ImportError: + av = None + +VIDEO_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), "assets", "videos") + + +@pytest.mark.skipif(_HAS_GPU_VIDEO_DECODER is False, reason="Didn't compile with support for gpu decoder") +class TestVideoGPUDecoder: + @pytest.mark.skipif(av is None, reason="PyAV unavailable") + @pytest.mark.parametrize( + "video_file", + [ + "RATRACE_wave_f_nm_np1_fr_goo_37.avi", + "TrumanShow_wave_f_nm_np1_fr_med_26.avi", + "v_SoccerJuggling_g23_c01.avi", + "v_SoccerJuggling_g24_c01.avi", + "R6llTwEh07w.mp4", + "SOX5yA1l24A.mp4", + "WUzgd7C1pWA.mp4", + ], + ) + def test_frame_reading(self, video_file): + torchvision.set_video_backend("cuda") + full_path = os.path.join(VIDEO_DIR, video_file) + decoder = VideoReader(full_path) + with av.open(full_path) as container: + for av_frame in container.decode(container.streams.video[0]): + av_frames = torch.tensor(av_frame.to_rgb(src_colorspace="ITU709").to_ndarray()) + vision_frames = next(decoder)["data"] + mean_delta = torch.mean(torch.abs(av_frames.float() - vision_frames.cpu().float())) + assert mean_delta < 0.75 + + @pytest.mark.skipif(av is None, reason="PyAV unavailable") + @pytest.mark.parametrize("keyframes", [True, False]) + @pytest.mark.parametrize( + "full_path, duration", + [ + (os.path.join(VIDEO_DIR, x), y) + for x, y in [ + ("v_SoccerJuggling_g23_c01.avi", 8.0), + ("v_SoccerJuggling_g24_c01.avi", 8.0), + ("R6llTwEh07w.mp4", 10.0), + ("SOX5yA1l24A.mp4", 11.0), + ("WUzgd7C1pWA.mp4", 11.0), + ] + ], + ) + def test_seek_reading(self, keyframes, full_path, duration): + torchvision.set_video_backend("cuda") + decoder = VideoReader(full_path) + time = duration / 2 + decoder.seek(time, keyframes_only=keyframes) + with av.open(full_path) as container: + container.seek(int(time * 1000000), any_frame=not keyframes, backward=False) + for av_frame in container.decode(container.streams.video[0]): + av_frames = torch.tensor(av_frame.to_rgb(src_colorspace="ITU709").to_ndarray()) + vision_frames = next(decoder)["data"] + mean_delta = torch.mean(torch.abs(av_frames.float() - vision_frames.cpu().float())) + assert mean_delta < 0.75 + + @pytest.mark.skipif(av is None, reason="PyAV unavailable") + @pytest.mark.parametrize( + "video_file", + [ + "RATRACE_wave_f_nm_np1_fr_goo_37.avi", + "TrumanShow_wave_f_nm_np1_fr_med_26.avi", + "v_SoccerJuggling_g23_c01.avi", + "v_SoccerJuggling_g24_c01.avi", + "R6llTwEh07w.mp4", + "SOX5yA1l24A.mp4", + "WUzgd7C1pWA.mp4", + ], + ) + def test_metadata(self, video_file): + torchvision.set_video_backend("cuda") + full_path = os.path.join(VIDEO_DIR, video_file) + decoder = VideoReader(full_path) + video_metadata = decoder.get_metadata()["video"] + with av.open(full_path) as container: + video = container.streams.video[0] + av_duration = float(video.duration * video.time_base) + assert math.isclose(video_metadata["duration"], av_duration, rel_tol=1e-2) + assert math.isclose(video_metadata["fps"], video.base_rate, rel_tol=1e-2) + + +if __name__ == "__main__": + pytest.main([__file__]) diff --git a/test/test_video_reader.py b/test/test_video_reader.py index 9818b6fc900a54ee7acfeb7d8fbd5f03cd906720..243aa12fc120ed0102f66d064cf834ec3a26cafb 100644 --- a/test/test_video_reader.py +++ b/test/test_video_reader.py @@ -1,17 +1,17 @@ import collections import math import os -import time -import unittest from fractions import Fraction import numpy as np +import pytest import torch import torchvision.io as io +from common_utils import assert_equal from numpy.random import randint +from pytest import approx +from torchvision import set_video_backend from torchvision.io import _HAS_VIDEO_OPT -from common_utils import PY39_SKIP -from _assert_utils import assert_equal try: @@ -23,9 +23,6 @@ except ImportError: av = None -from urllib.error import URLError - - VIDEO_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), "assets", "videos") CheckerConfig = [ @@ -110,18 +107,14 @@ test_videos = { } -DecoderResult = collections.namedtuple( - "DecoderResult", "vframes vframe_pts vtimebase aframes aframe_pts atimebase" -) +DecoderResult = collections.namedtuple("DecoderResult", "vframes vframe_pts vtimebase aframes aframe_pts atimebase") -"""av_seek_frame is imprecise so seek to a timestamp earlier by a margin -The unit of margin is second""" -seek_frame_margin = 0.25 +# av_seek_frame is imprecise so seek to a timestamp earlier by a margin +# The unit of margin is second +SEEK_FRAME_MARGIN = 0.25 -def _read_from_stream( - container, start_pts, end_pts, stream, stream_name, buffer_size=4 -): +def _read_from_stream(container, start_pts, end_pts, stream, stream_name, buffer_size=4): """ Args: container: pyav container @@ -134,7 +127,7 @@ def _read_from_stream( ascending order. We need to decode more frames even when we meet end pts """ - # seeking in the stream is imprecise. Thus, seek to an ealier PTS by a margin + # seeking in the stream is imprecise. Thus, seek to an earlier PTS by a margin margin = 1 seek_offset = max(start_pts - margin, 0) @@ -233,9 +226,7 @@ def _decode_frames_by_av_module( else: aframes = torch.empty((1, 0), dtype=torch.float32) - aframe_pts = torch.tensor( - [audio_frame.pts for audio_frame in audio_frames], dtype=torch.int64 - ) + aframe_pts = torch.tensor([audio_frame.pts for audio_frame in audio_frames], dtype=torch.int64) return DecoderResult( vframes=vframes, @@ -266,64 +257,64 @@ def _get_video_tensor(video_dir, video_file): assert os.path.exists(full_path), "File not found: %s" % full_path with open(full_path, "rb") as fp: - video_tensor = torch.from_numpy(np.frombuffer(fp.read(), dtype=np.uint8)) + video_tensor = torch.frombuffer(fp.read(), dtype=torch.uint8) return full_path, video_tensor -@unittest.skipIf(av is None, "PyAV unavailable") -@unittest.skipIf(_HAS_VIDEO_OPT is False, "Didn't compile with ffmpeg") -class TestVideoReader(unittest.TestCase): +@pytest.mark.skipif(av is None, reason="PyAV unavailable") +@pytest.mark.skipif(_HAS_VIDEO_OPT is False, reason="Didn't compile with ffmpeg") +class TestVideoReader: def check_separate_decoding_result(self, tv_result, config): - """check the decoding results from TorchVision decoder - """ - vframes, vframe_pts, vtimebase, vfps, vduration, \ - aframes, aframe_pts, atimebase, asample_rate, aduration = ( - tv_result - ) + """check the decoding results from TorchVision decoder""" + ( + vframes, + vframe_pts, + vtimebase, + vfps, + vduration, + aframes, + aframe_pts, + atimebase, + asample_rate, + aduration, + ) = tv_result + + video_duration = vduration.item() * Fraction(vtimebase[0].item(), vtimebase[1].item()) + assert video_duration == approx(config.duration, abs=0.5) + + assert vfps.item() == approx(config.video_fps, abs=0.5) - video_duration = vduration.item() * Fraction( - vtimebase[0].item(), vtimebase[1].item() - ) - self.assertAlmostEqual(video_duration, config.duration, delta=0.5) - - self.assertAlmostEqual(vfps.item(), config.video_fps, delta=0.5) if asample_rate.numel() > 0: - self.assertEqual(asample_rate.item(), config.audio_sample_rate) - audio_duration = aduration.item() * Fraction( - atimebase[0].item(), atimebase[1].item() - ) - self.assertAlmostEqual(audio_duration, config.duration, delta=0.5) + assert asample_rate.item() == config.audio_sample_rate + audio_duration = aduration.item() * Fraction(atimebase[0].item(), atimebase[1].item()) + assert audio_duration == approx(config.duration, abs=0.5) # check if pts of video frames are sorted in ascending order for i in range(len(vframe_pts) - 1): - self.assertEqual(vframe_pts[i] < vframe_pts[i + 1], True) + assert vframe_pts[i] < vframe_pts[i + 1] if len(aframe_pts) > 1: # check if pts of audio frames are sorted in ascending order for i in range(len(aframe_pts) - 1): - self.assertEqual(aframe_pts[i] < aframe_pts[i + 1], True) + assert aframe_pts[i] < aframe_pts[i + 1] def check_probe_result(self, result, config): vtimebase, vfps, vduration, atimebase, asample_rate, aduration = result - video_duration = vduration.item() * Fraction( - vtimebase[0].item(), vtimebase[1].item() - ) - self.assertAlmostEqual(video_duration, config.duration, delta=0.5) - self.assertAlmostEqual(vfps.item(), config.video_fps, delta=0.5) + video_duration = vduration.item() * Fraction(vtimebase[0].item(), vtimebase[1].item()) + assert video_duration == approx(config.duration, abs=0.5) + assert vfps.item() == approx(config.video_fps, abs=0.5) if asample_rate.numel() > 0: - self.assertEqual(asample_rate.item(), config.audio_sample_rate) - audio_duration = aduration.item() * Fraction( - atimebase[0].item(), atimebase[1].item() - ) - self.assertAlmostEqual(audio_duration, config.duration, delta=0.5) + assert asample_rate.item() == config.audio_sample_rate + audio_duration = aduration.item() * Fraction(atimebase[0].item(), atimebase[1].item()) + assert audio_duration == approx(config.duration, abs=0.5) def check_meta_result(self, result, config): - self.assertAlmostEqual(result.video_duration, config.duration, delta=0.5) - self.assertAlmostEqual(result.video_fps, config.video_fps, delta=0.5) + assert result.video_duration == approx(config.duration, abs=0.5) + assert result.video_fps == approx(config.video_fps, abs=0.5) if result.has_audio > 0: - self.assertEqual(result.audio_sample_rate, config.audio_sample_rate) - self.assertAlmostEqual(result.audio_duration, config.duration, delta=0.5) + assert result.audio_sample_rate == config.audio_sample_rate + assert result.audio_duration == approx(config.duration, abs=0.5) def compare_decoding_result(self, tv_result, ref_result, config=all_check_config): """ @@ -334,10 +325,18 @@ class TestVideoReader(unittest.TestCase): decoder or TorchVision decoder with getPtsOnly = 1 config: config of decoding results checker """ - vframes, vframe_pts, vtimebase, _vfps, _vduration, \ - aframes, aframe_pts, atimebase, _asample_rate, _aduration = ( - tv_result - ) + ( + vframes, + vframe_pts, + vtimebase, + _vfps, + _vduration, + aframes, + aframe_pts, + atimebase, + _asample_rate, + _aduration, + ) = tv_result if isinstance(ref_result, list): # the ref_result is from new video_reader decoder ref_result = DecoderResult( @@ -350,43 +349,32 @@ class TestVideoReader(unittest.TestCase): ) if vframes.numel() > 0 and ref_result.vframes.numel() > 0: - mean_delta = torch.mean( - torch.abs(vframes.float() - ref_result.vframes.float()) - ) - self.assertAlmostEqual(mean_delta, 0, delta=8.0) + mean_delta = torch.mean(torch.abs(vframes.float() - ref_result.vframes.float())) + assert mean_delta == approx(0.0, abs=8.0) - mean_delta = torch.mean( - torch.abs(vframe_pts.float() - ref_result.vframe_pts.float()) - ) - self.assertAlmostEqual(mean_delta, 0, delta=1.0) + mean_delta = torch.mean(torch.abs(vframe_pts.float() - ref_result.vframe_pts.float())) + assert mean_delta == approx(0.0, abs=1.0) assert_equal(vtimebase, ref_result.vtimebase) - if ( - config.check_aframes - and aframes.numel() > 0 - and ref_result.aframes.numel() > 0 - ): + if config.check_aframes and aframes.numel() > 0 and ref_result.aframes.numel() > 0: """Audio stream is available and audio frame is required to return from decoder""" assert_equal(aframes, ref_result.aframes) - if ( - config.check_aframe_pts - and aframe_pts.numel() > 0 - and ref_result.aframe_pts.numel() > 0 - ): + if config.check_aframe_pts and aframe_pts.numel() > 0 and ref_result.aframe_pts.numel() > 0: """Audio stream is available""" assert_equal(aframe_pts, ref_result.aframe_pts) assert_equal(atimebase, ref_result.atimebase) - @unittest.skip( - "This stress test will iteratively decode the same set of videos." - "It helps to detect memory leak but it takes lots of time to run." - "By default, it is disabled" - ) - def test_stress_test_read_video_from_file(self): + @pytest.mark.parametrize("test_video", test_videos.keys()) + def test_stress_test_read_video_from_file(self, test_video): + pytest.skip( + "This stress test will iteratively decode the same set of videos." + "It helps to detect memory leak but it takes lots of time to run." + "By default, it is disabled" + ) num_iter = 10000 # video related width, height, min_dimension, max_dimension = 0, 0, 0, 0 @@ -398,53 +386,12 @@ class TestVideoReader(unittest.TestCase): audio_timebase_num, audio_timebase_den = 0, 1 for _i in range(num_iter): - for test_video, _config in test_videos.items(): - full_path = os.path.join(VIDEO_DIR, test_video) - - # pass 1: decode all frames using new decoder - torch.ops.video_reader.read_video_from_file( - full_path, - seek_frame_margin, - 0, # getPtsOnly - 1, # readVideoStream - width, - height, - min_dimension, - max_dimension, - video_start_pts, - video_end_pts, - video_timebase_num, - video_timebase_den, - 1, # readAudioStream - samples, - channels, - audio_start_pts, - audio_end_pts, - audio_timebase_num, - audio_timebase_den, - ) - - @PY39_SKIP - def test_read_video_from_file(self): - """ - Test the case when decoder starts with a video file to decode frames. - """ - # video related - width, height, min_dimension, max_dimension = 0, 0, 0, 0 - video_start_pts, video_end_pts = 0, -1 - video_timebase_num, video_timebase_den = 0, 1 - # audio related - samples, channels = 0, 0 - audio_start_pts, audio_end_pts = 0, -1 - audio_timebase_num, audio_timebase_den = 0, 1 - - for test_video, config in test_videos.items(): full_path = os.path.join(VIDEO_DIR, test_video) # pass 1: decode all frames using new decoder - tv_result = torch.ops.video_reader.read_video_from_file( + torch.ops.video_reader.read_video_from_file( full_path, - seek_frame_margin, + SEEK_FRAME_MARGIN, 0, # getPtsOnly 1, # readVideoStream width, @@ -463,15 +410,57 @@ class TestVideoReader(unittest.TestCase): audio_timebase_num, audio_timebase_den, ) - # pass 2: decode all frames using av - pyav_result = _decode_frames_by_av_module(full_path) - # check results from TorchVision decoder - self.check_separate_decoding_result(tv_result, config) - # compare decoding results - self.compare_decoding_result(tv_result, pyav_result, config) - @PY39_SKIP - def test_read_video_from_file_read_single_stream_only(self): + @pytest.mark.parametrize("test_video,config", test_videos.items()) + def test_read_video_from_file(self, test_video, config): + """ + Test the case when decoder starts with a video file to decode frames. + """ + # video related + width, height, min_dimension, max_dimension = 0, 0, 0, 0 + video_start_pts, video_end_pts = 0, -1 + video_timebase_num, video_timebase_den = 0, 1 + # audio related + samples, channels = 0, 0 + audio_start_pts, audio_end_pts = 0, -1 + audio_timebase_num, audio_timebase_den = 0, 1 + + full_path = os.path.join(VIDEO_DIR, test_video) + + # pass 1: decode all frames using new decoder + tv_result = torch.ops.video_reader.read_video_from_file( + full_path, + SEEK_FRAME_MARGIN, + 0, # getPtsOnly + 1, # readVideoStream + width, + height, + min_dimension, + max_dimension, + video_start_pts, + video_end_pts, + video_timebase_num, + video_timebase_den, + 1, # readAudioStream + samples, + channels, + audio_start_pts, + audio_end_pts, + audio_timebase_num, + audio_timebase_den, + ) + # pass 2: decode all frames using av + pyav_result = _decode_frames_by_av_module(full_path) + # check results from TorchVision decoder + self.check_separate_decoding_result(tv_result, config) + # compare decoding results + self.compare_decoding_result(tv_result, pyav_result, config) + + @pytest.mark.parametrize("test_video,config", test_videos.items()) + @pytest.mark.parametrize("read_video_stream,read_audio_stream", [(1, 0), (0, 1)]) + def test_read_video_from_file_read_single_stream_only( + self, test_video, config, read_video_stream, read_audio_stream + ): """ Test the case when decoder starts with a video file to decode frames, and only reads video stream and ignores audio stream @@ -485,51 +474,56 @@ class TestVideoReader(unittest.TestCase): audio_start_pts, audio_end_pts = 0, -1 audio_timebase_num, audio_timebase_den = 0, 1 - for test_video, config in test_videos.items(): - full_path = os.path.join(VIDEO_DIR, test_video) - for readVideoStream, readAudioStream in [(1, 0), (0, 1)]: - # decode all frames using new decoder - tv_result = torch.ops.video_reader.read_video_from_file( - full_path, - seek_frame_margin, - 0, # getPtsOnly - readVideoStream, - width, - height, - min_dimension, - max_dimension, - video_start_pts, - video_end_pts, - video_timebase_num, - video_timebase_den, - readAudioStream, - samples, - channels, - audio_start_pts, - audio_end_pts, - audio_timebase_num, - audio_timebase_den, - ) - - vframes, vframe_pts, vtimebase, vfps, vduration, \ - aframes, aframe_pts, atimebase, asample_rate, aduration = ( - tv_result - ) - - self.assertEqual(vframes.numel() > 0, readVideoStream) - self.assertEqual(vframe_pts.numel() > 0, readVideoStream) - self.assertEqual(vtimebase.numel() > 0, readVideoStream) - self.assertEqual(vfps.numel() > 0, readVideoStream) - - expect_audio_data = ( - readAudioStream == 1 and config.audio_sample_rate is not None - ) - self.assertEqual(aframes.numel() > 0, expect_audio_data) - self.assertEqual(aframe_pts.numel() > 0, expect_audio_data) - self.assertEqual(atimebase.numel() > 0, expect_audio_data) - self.assertEqual(asample_rate.numel() > 0, expect_audio_data) - - def test_read_video_from_file_rescale_min_dimension(self): + full_path = os.path.join(VIDEO_DIR, test_video) + # decode all frames using new decoder + tv_result = torch.ops.video_reader.read_video_from_file( + full_path, + SEEK_FRAME_MARGIN, + 0, # getPtsOnly + read_video_stream, + width, + height, + min_dimension, + max_dimension, + video_start_pts, + video_end_pts, + video_timebase_num, + video_timebase_den, + read_audio_stream, + samples, + channels, + audio_start_pts, + audio_end_pts, + audio_timebase_num, + audio_timebase_den, + ) + + ( + vframes, + vframe_pts, + vtimebase, + vfps, + vduration, + aframes, + aframe_pts, + atimebase, + asample_rate, + aduration, + ) = tv_result + + assert (vframes.numel() > 0) is bool(read_video_stream) + assert (vframe_pts.numel() > 0) is bool(read_video_stream) + assert (vtimebase.numel() > 0) is bool(read_video_stream) + assert (vfps.numel() > 0) is bool(read_video_stream) + + expect_audio_data = read_audio_stream == 1 and config.audio_sample_rate is not None + assert (aframes.numel() > 0) is bool(expect_audio_data) + assert (aframe_pts.numel() > 0) is bool(expect_audio_data) + assert (atimebase.numel() > 0) is bool(expect_audio_data) + assert (asample_rate.numel() > 0) is bool(expect_audio_data) + + @pytest.mark.parametrize("test_video", test_videos.keys()) + def test_read_video_from_file_rescale_min_dimension(self, test_video): """ Test the case when decoder starts with a video file to decode frames, and video min dimension between height and width is set. @@ -543,35 +537,33 @@ class TestVideoReader(unittest.TestCase): audio_start_pts, audio_end_pts = 0, -1 audio_timebase_num, audio_timebase_den = 0, 1 - for test_video, _config in test_videos.items(): - full_path = os.path.join(VIDEO_DIR, test_video) - - tv_result = torch.ops.video_reader.read_video_from_file( - full_path, - seek_frame_margin, - 0, # getPtsOnly - 1, # readVideoStream - width, - height, - min_dimension, - max_dimension, - video_start_pts, - video_end_pts, - video_timebase_num, - video_timebase_den, - 1, # readAudioStream - samples, - channels, - audio_start_pts, - audio_end_pts, - audio_timebase_num, - audio_timebase_den, - ) - self.assertEqual( - min_dimension, min(tv_result[0].size(1), tv_result[0].size(2)) - ) + full_path = os.path.join(VIDEO_DIR, test_video) + + tv_result = torch.ops.video_reader.read_video_from_file( + full_path, + SEEK_FRAME_MARGIN, + 0, # getPtsOnly + 1, # readVideoStream + width, + height, + min_dimension, + max_dimension, + video_start_pts, + video_end_pts, + video_timebase_num, + video_timebase_den, + 1, # readAudioStream + samples, + channels, + audio_start_pts, + audio_end_pts, + audio_timebase_num, + audio_timebase_den, + ) + assert min_dimension == min(tv_result[0].size(1), tv_result[0].size(2)) - def test_read_video_from_file_rescale_max_dimension(self): + @pytest.mark.parametrize("test_video", test_videos.keys()) + def test_read_video_from_file_rescale_max_dimension(self, test_video): """ Test the case when decoder starts with a video file to decode frames, and video min dimension between height and width is set. @@ -585,35 +577,33 @@ class TestVideoReader(unittest.TestCase): audio_start_pts, audio_end_pts = 0, -1 audio_timebase_num, audio_timebase_den = 0, 1 - for test_video, _config in test_videos.items(): - full_path = os.path.join(VIDEO_DIR, test_video) - - tv_result = torch.ops.video_reader.read_video_from_file( - full_path, - seek_frame_margin, - 0, # getPtsOnly - 1, # readVideoStream - width, - height, - min_dimension, - max_dimension, - video_start_pts, - video_end_pts, - video_timebase_num, - video_timebase_den, - 1, # readAudioStream - samples, - channels, - audio_start_pts, - audio_end_pts, - audio_timebase_num, - audio_timebase_den, - ) - self.assertEqual( - max_dimension, max(tv_result[0].size(1), tv_result[0].size(2)) - ) + full_path = os.path.join(VIDEO_DIR, test_video) + + tv_result = torch.ops.video_reader.read_video_from_file( + full_path, + SEEK_FRAME_MARGIN, + 0, # getPtsOnly + 1, # readVideoStream + width, + height, + min_dimension, + max_dimension, + video_start_pts, + video_end_pts, + video_timebase_num, + video_timebase_den, + 1, # readAudioStream + samples, + channels, + audio_start_pts, + audio_end_pts, + audio_timebase_num, + audio_timebase_den, + ) + assert max_dimension == max(tv_result[0].size(1), tv_result[0].size(2)) - def test_read_video_from_file_rescale_both_min_max_dimension(self): + @pytest.mark.parametrize("test_video", test_videos.keys()) + def test_read_video_from_file_rescale_both_min_max_dimension(self, test_video): """ Test the case when decoder starts with a video file to decode frames, and video min dimension between height and width is set. @@ -627,38 +617,34 @@ class TestVideoReader(unittest.TestCase): audio_start_pts, audio_end_pts = 0, -1 audio_timebase_num, audio_timebase_den = 0, 1 - for test_video, _config in test_videos.items(): - full_path = os.path.join(VIDEO_DIR, test_video) - - tv_result = torch.ops.video_reader.read_video_from_file( - full_path, - seek_frame_margin, - 0, # getPtsOnly - 1, # readVideoStream - width, - height, - min_dimension, - max_dimension, - video_start_pts, - video_end_pts, - video_timebase_num, - video_timebase_den, - 1, # readAudioStream - samples, - channels, - audio_start_pts, - audio_end_pts, - audio_timebase_num, - audio_timebase_den, - ) - self.assertEqual( - min_dimension, min(tv_result[0].size(1), tv_result[0].size(2)) - ) - self.assertEqual( - max_dimension, max(tv_result[0].size(1), tv_result[0].size(2)) - ) + full_path = os.path.join(VIDEO_DIR, test_video) + + tv_result = torch.ops.video_reader.read_video_from_file( + full_path, + SEEK_FRAME_MARGIN, + 0, # getPtsOnly + 1, # readVideoStream + width, + height, + min_dimension, + max_dimension, + video_start_pts, + video_end_pts, + video_timebase_num, + video_timebase_den, + 1, # readAudioStream + samples, + channels, + audio_start_pts, + audio_end_pts, + audio_timebase_num, + audio_timebase_den, + ) + assert min_dimension == min(tv_result[0].size(1), tv_result[0].size(2)) + assert max_dimension == max(tv_result[0].size(1), tv_result[0].size(2)) - def test_read_video_from_file_rescale_width(self): + @pytest.mark.parametrize("test_video", test_videos.keys()) + def test_read_video_from_file_rescale_width(self, test_video): """ Test the case when decoder starts with a video file to decode frames, and video width is set. @@ -672,33 +658,33 @@ class TestVideoReader(unittest.TestCase): audio_start_pts, audio_end_pts = 0, -1 audio_timebase_num, audio_timebase_den = 0, 1 - for test_video, _config in test_videos.items(): - full_path = os.path.join(VIDEO_DIR, test_video) - - tv_result = torch.ops.video_reader.read_video_from_file( - full_path, - seek_frame_margin, - 0, # getPtsOnly - 1, # readVideoStream - width, - height, - min_dimension, - max_dimension, - video_start_pts, - video_end_pts, - video_timebase_num, - video_timebase_den, - 1, # readAudioStream - samples, - channels, - audio_start_pts, - audio_end_pts, - audio_timebase_num, - audio_timebase_den, - ) - self.assertEqual(tv_result[0].size(2), width) + full_path = os.path.join(VIDEO_DIR, test_video) + + tv_result = torch.ops.video_reader.read_video_from_file( + full_path, + SEEK_FRAME_MARGIN, + 0, # getPtsOnly + 1, # readVideoStream + width, + height, + min_dimension, + max_dimension, + video_start_pts, + video_end_pts, + video_timebase_num, + video_timebase_den, + 1, # readAudioStream + samples, + channels, + audio_start_pts, + audio_end_pts, + audio_timebase_num, + audio_timebase_den, + ) + assert tv_result[0].size(2) == width - def test_read_video_from_file_rescale_height(self): + @pytest.mark.parametrize("test_video", test_videos.keys()) + def test_read_video_from_file_rescale_height(self, test_video): """ Test the case when decoder starts with a video file to decode frames, and video height is set. @@ -712,33 +698,33 @@ class TestVideoReader(unittest.TestCase): audio_start_pts, audio_end_pts = 0, -1 audio_timebase_num, audio_timebase_den = 0, 1 - for test_video, _config in test_videos.items(): - full_path = os.path.join(VIDEO_DIR, test_video) - - tv_result = torch.ops.video_reader.read_video_from_file( - full_path, - seek_frame_margin, - 0, # getPtsOnly - 1, # readVideoStream - width, - height, - min_dimension, - max_dimension, - video_start_pts, - video_end_pts, - video_timebase_num, - video_timebase_den, - 1, # readAudioStream - samples, - channels, - audio_start_pts, - audio_end_pts, - audio_timebase_num, - audio_timebase_den, - ) - self.assertEqual(tv_result[0].size(1), height) + full_path = os.path.join(VIDEO_DIR, test_video) + + tv_result = torch.ops.video_reader.read_video_from_file( + full_path, + SEEK_FRAME_MARGIN, + 0, # getPtsOnly + 1, # readVideoStream + width, + height, + min_dimension, + max_dimension, + video_start_pts, + video_end_pts, + video_timebase_num, + video_timebase_den, + 1, # readAudioStream + samples, + channels, + audio_start_pts, + audio_end_pts, + audio_timebase_num, + audio_timebase_den, + ) + assert tv_result[0].size(1) == height - def test_read_video_from_file_rescale_width_and_height(self): + @pytest.mark.parametrize("test_video", test_videos.keys()) + def test_read_video_from_file_rescale_width_and_height(self, test_video): """ Test the case when decoder starts with a video file to decode frames, and both video height and width are set. @@ -752,95 +738,92 @@ class TestVideoReader(unittest.TestCase): audio_start_pts, audio_end_pts = 0, -1 audio_timebase_num, audio_timebase_den = 0, 1 - for test_video, _config in test_videos.items(): - full_path = os.path.join(VIDEO_DIR, test_video) - - tv_result = torch.ops.video_reader.read_video_from_file( - full_path, - seek_frame_margin, - 0, # getPtsOnly - 1, # readVideoStream - width, - height, - min_dimension, - max_dimension, - video_start_pts, - video_end_pts, - video_timebase_num, - video_timebase_den, - 1, # readAudioStream - samples, - channels, - audio_start_pts, - audio_end_pts, - audio_timebase_num, - audio_timebase_den, - ) - self.assertEqual(tv_result[0].size(1), height) - self.assertEqual(tv_result[0].size(2), width) + full_path = os.path.join(VIDEO_DIR, test_video) + + tv_result = torch.ops.video_reader.read_video_from_file( + full_path, + SEEK_FRAME_MARGIN, + 0, # getPtsOnly + 1, # readVideoStream + width, + height, + min_dimension, + max_dimension, + video_start_pts, + video_end_pts, + video_timebase_num, + video_timebase_den, + 1, # readAudioStream + samples, + channels, + audio_start_pts, + audio_end_pts, + audio_timebase_num, + audio_timebase_den, + ) + assert tv_result[0].size(1) == height + assert tv_result[0].size(2) == width - @PY39_SKIP - def test_read_video_from_file_audio_resampling(self): + @pytest.mark.parametrize("test_video", test_videos.keys()) + @pytest.mark.parametrize("samples", [9600, 96000]) + def test_read_video_from_file_audio_resampling(self, test_video, samples): """ Test the case when decoder starts with a video file to decode frames, and audio waveform are resampled """ + # video related + width, height, min_dimension, max_dimension = 0, 0, 0, 0 + video_start_pts, video_end_pts = 0, -1 + video_timebase_num, video_timebase_den = 0, 1 + # audio related + channels = 0 + audio_start_pts, audio_end_pts = 0, -1 + audio_timebase_num, audio_timebase_den = 0, 1 - for samples in [9600, 96000]: # downsampling # upsampling - # video related - width, height, min_dimension, max_dimension = 0, 0, 0, 0 - video_start_pts, video_end_pts = 0, -1 - video_timebase_num, video_timebase_den = 0, 1 - # audio related - channels = 0 - audio_start_pts, audio_end_pts = 0, -1 - audio_timebase_num, audio_timebase_den = 0, 1 - - for test_video, _config in test_videos.items(): - full_path = os.path.join(VIDEO_DIR, test_video) - - tv_result = torch.ops.video_reader.read_video_from_file( - full_path, - seek_frame_margin, - 0, # getPtsOnly - 1, # readVideoStream - width, - height, - min_dimension, - max_dimension, - video_start_pts, - video_end_pts, - video_timebase_num, - video_timebase_den, - 1, # readAudioStream - samples, - channels, - audio_start_pts, - audio_end_pts, - audio_timebase_num, - audio_timebase_den, - ) - vframes, vframe_pts, vtimebase, vfps, vduration, \ - aframes, aframe_pts, atimebase, asample_rate, aduration = ( - tv_result - ) - if aframes.numel() > 0: - self.assertEqual(samples, asample_rate.item()) - self.assertEqual(1, aframes.size(1)) - # when audio stream is found - duration = ( - float(aframe_pts[-1]) - * float(atimebase[0]) - / float(atimebase[1]) - ) - self.assertAlmostEqual( - aframes.size(0), - int(duration * asample_rate.item()), - delta=0.1 * asample_rate.item(), - ) - - @PY39_SKIP - def test_compare_read_video_from_memory_and_file(self): + full_path = os.path.join(VIDEO_DIR, test_video) + + tv_result = torch.ops.video_reader.read_video_from_file( + full_path, + SEEK_FRAME_MARGIN, + 0, # getPtsOnly + 1, # readVideoStream + width, + height, + min_dimension, + max_dimension, + video_start_pts, + video_end_pts, + video_timebase_num, + video_timebase_den, + 1, # readAudioStream + samples, + channels, + audio_start_pts, + audio_end_pts, + audio_timebase_num, + audio_timebase_den, + ) + ( + vframes, + vframe_pts, + vtimebase, + vfps, + vduration, + aframes, + aframe_pts, + atimebase, + asample_rate, + aduration, + ) = tv_result + if aframes.numel() > 0: + assert samples == asample_rate.item() + assert 1 == aframes.size(1) + # when audio stream is found + duration = float(aframe_pts[-1]) * float(atimebase[0]) / float(atimebase[1]) + assert aframes.size(0) == approx(int(duration * asample_rate.item()), abs=0.1 * asample_rate.item()) + + @pytest.mark.parametrize("test_video,config", test_videos.items()) + def test_compare_read_video_from_memory_and_file(self, test_video, config): """ Test the case when video is already in memory, and decoder reads data in memory """ @@ -853,61 +836,60 @@ class TestVideoReader(unittest.TestCase): audio_start_pts, audio_end_pts = 0, -1 audio_timebase_num, audio_timebase_den = 0, 1 - for test_video, config in test_videos.items(): - full_path, video_tensor = _get_video_tensor(VIDEO_DIR, test_video) - - # pass 1: decode all frames using cpp decoder - tv_result_memory = torch.ops.video_reader.read_video_from_memory( - video_tensor, - seek_frame_margin, - 0, # getPtsOnly - 1, # readVideoStream - width, - height, - min_dimension, - max_dimension, - video_start_pts, - video_end_pts, - video_timebase_num, - video_timebase_den, - 1, # readAudioStream - samples, - channels, - audio_start_pts, - audio_end_pts, - audio_timebase_num, - audio_timebase_den, - ) - self.check_separate_decoding_result(tv_result_memory, config) - # pass 2: decode all frames from file - tv_result_file = torch.ops.video_reader.read_video_from_file( - full_path, - seek_frame_margin, - 0, # getPtsOnly - 1, # readVideoStream - width, - height, - min_dimension, - max_dimension, - video_start_pts, - video_end_pts, - video_timebase_num, - video_timebase_den, - 1, # readAudioStream - samples, - channels, - audio_start_pts, - audio_end_pts, - audio_timebase_num, - audio_timebase_den, - ) + full_path, video_tensor = _get_video_tensor(VIDEO_DIR, test_video) + + # pass 1: decode all frames using cpp decoder + tv_result_memory = torch.ops.video_reader.read_video_from_memory( + video_tensor, + SEEK_FRAME_MARGIN, + 0, # getPtsOnly + 1, # readVideoStream + width, + height, + min_dimension, + max_dimension, + video_start_pts, + video_end_pts, + video_timebase_num, + video_timebase_den, + 1, # readAudioStream + samples, + channels, + audio_start_pts, + audio_end_pts, + audio_timebase_num, + audio_timebase_den, + ) + self.check_separate_decoding_result(tv_result_memory, config) + # pass 2: decode all frames from file + tv_result_file = torch.ops.video_reader.read_video_from_file( + full_path, + SEEK_FRAME_MARGIN, + 0, # getPtsOnly + 1, # readVideoStream + width, + height, + min_dimension, + max_dimension, + video_start_pts, + video_end_pts, + video_timebase_num, + video_timebase_den, + 1, # readAudioStream + samples, + channels, + audio_start_pts, + audio_end_pts, + audio_timebase_num, + audio_timebase_den, + ) - self.check_separate_decoding_result(tv_result_file, config) - # finally, compare results decoded from memory and file - self.compare_decoding_result(tv_result_memory, tv_result_file) + self.check_separate_decoding_result(tv_result_file, config) + # finally, compare results decoded from memory and file + self.compare_decoding_result(tv_result_memory, tv_result_file) - @PY39_SKIP - def test_read_video_from_memory(self): + @pytest.mark.parametrize("test_video,config", test_videos.items()) + def test_read_video_from_memory(self, test_video, config): """ Test the case when video is already in memory, and decoder reads data in memory """ @@ -920,39 +902,38 @@ class TestVideoReader(unittest.TestCase): audio_start_pts, audio_end_pts = 0, -1 audio_timebase_num, audio_timebase_den = 0, 1 - for test_video, config in test_videos.items(): - full_path, video_tensor = _get_video_tensor(VIDEO_DIR, test_video) - - # pass 1: decode all frames using cpp decoder - tv_result = torch.ops.video_reader.read_video_from_memory( - video_tensor, - seek_frame_margin, - 0, # getPtsOnly - 1, # readVideoStream - width, - height, - min_dimension, - max_dimension, - video_start_pts, - video_end_pts, - video_timebase_num, - video_timebase_den, - 1, # readAudioStream - samples, - channels, - audio_start_pts, - audio_end_pts, - audio_timebase_num, - audio_timebase_den, - ) - # pass 2: decode all frames using av - pyav_result = _decode_frames_by_av_module(full_path) + full_path, video_tensor = _get_video_tensor(VIDEO_DIR, test_video) + + # pass 1: decode all frames using cpp decoder + tv_result = torch.ops.video_reader.read_video_from_memory( + video_tensor, + SEEK_FRAME_MARGIN, + 0, # getPtsOnly + 1, # readVideoStream + width, + height, + min_dimension, + max_dimension, + video_start_pts, + video_end_pts, + video_timebase_num, + video_timebase_den, + 1, # readAudioStream + samples, + channels, + audio_start_pts, + audio_end_pts, + audio_timebase_num, + audio_timebase_den, + ) + # pass 2: decode all frames using av + pyav_result = _decode_frames_by_av_module(full_path) - self.check_separate_decoding_result(tv_result, config) - self.compare_decoding_result(tv_result, pyav_result, config) + self.check_separate_decoding_result(tv_result, config) + self.compare_decoding_result(tv_result, pyav_result, config) - @PY39_SKIP - def test_read_video_from_memory_get_pts_only(self): + @pytest.mark.parametrize("test_video,config", test_videos.items()) + def test_read_video_from_memory_get_pts_only(self, test_video, config): """ Test the case when video is already in memory, and decoder reads data in memory. Compare frame pts between decoding for pts only and full decoding @@ -967,238 +948,234 @@ class TestVideoReader(unittest.TestCase): audio_start_pts, audio_end_pts = 0, -1 audio_timebase_num, audio_timebase_den = 0, 1 - for test_video, config in test_videos.items(): - full_path, video_tensor = _get_video_tensor(VIDEO_DIR, test_video) - - # pass 1: decode all frames using cpp decoder - tv_result = torch.ops.video_reader.read_video_from_memory( - video_tensor, - seek_frame_margin, - 0, # getPtsOnly - 1, # readVideoStream - width, - height, - min_dimension, - max_dimension, - video_start_pts, - video_end_pts, - video_timebase_num, - video_timebase_den, - 1, # readAudioStream - samples, - channels, - audio_start_pts, - audio_end_pts, - audio_timebase_num, - audio_timebase_den, - ) - self.assertAlmostEqual(config.video_fps, tv_result[3].item(), delta=0.01) - - # pass 2: decode all frames to get PTS only using cpp decoder - tv_result_pts_only = torch.ops.video_reader.read_video_from_memory( - video_tensor, - seek_frame_margin, - 1, # getPtsOnly - 1, # readVideoStream - width, - height, - min_dimension, - max_dimension, - video_start_pts, - video_end_pts, - video_timebase_num, - video_timebase_den, - 1, # readAudioStream - samples, - channels, - audio_start_pts, - audio_end_pts, - audio_timebase_num, - audio_timebase_den, - ) + _, video_tensor = _get_video_tensor(VIDEO_DIR, test_video) + + # pass 1: decode all frames using cpp decoder + tv_result = torch.ops.video_reader.read_video_from_memory( + video_tensor, + SEEK_FRAME_MARGIN, + 0, # getPtsOnly + 1, # readVideoStream + width, + height, + min_dimension, + max_dimension, + video_start_pts, + video_end_pts, + video_timebase_num, + video_timebase_den, + 1, # readAudioStream + samples, + channels, + audio_start_pts, + audio_end_pts, + audio_timebase_num, + audio_timebase_den, + ) + assert abs(config.video_fps - tv_result[3].item()) < 0.01 + + # pass 2: decode all frames to get PTS only using cpp decoder + tv_result_pts_only = torch.ops.video_reader.read_video_from_memory( + video_tensor, + SEEK_FRAME_MARGIN, + 1, # getPtsOnly + 1, # readVideoStream + width, + height, + min_dimension, + max_dimension, + video_start_pts, + video_end_pts, + video_timebase_num, + video_timebase_den, + 1, # readAudioStream + samples, + channels, + audio_start_pts, + audio_end_pts, + audio_timebase_num, + audio_timebase_den, + ) - self.assertEqual(tv_result_pts_only[0].numel(), 0) - self.assertEqual(tv_result_pts_only[5].numel(), 0) - self.compare_decoding_result(tv_result, tv_result_pts_only) + assert not tv_result_pts_only[0].numel() + assert not tv_result_pts_only[5].numel() + self.compare_decoding_result(tv_result, tv_result_pts_only) - @PY39_SKIP - def test_read_video_in_range_from_memory(self): + @pytest.mark.parametrize("test_video,config", test_videos.items()) + @pytest.mark.parametrize("num_frames", [4, 8, 16, 32, 64, 128]) + def test_read_video_in_range_from_memory(self, test_video, config, num_frames): """ Test the case when video is already in memory, and decoder reads data in memory. In addition, decoder takes meaningful start- and end PTS as input, and decode frames within that interval """ - for test_video, config in test_videos.items(): - full_path, video_tensor = _get_video_tensor(VIDEO_DIR, test_video) - # video related - width, height, min_dimension, max_dimension = 0, 0, 0, 0 - video_start_pts, video_end_pts = 0, -1 - video_timebase_num, video_timebase_den = 0, 1 - # audio related - samples, channels = 0, 0 - audio_start_pts, audio_end_pts = 0, -1 - audio_timebase_num, audio_timebase_den = 0, 1 - # pass 1: decode all frames using new decoder - tv_result = torch.ops.video_reader.read_video_from_memory( - video_tensor, - seek_frame_margin, - 0, # getPtsOnly - 1, # readVideoStream - width, - height, - min_dimension, - max_dimension, - video_start_pts, - video_end_pts, - video_timebase_num, - video_timebase_den, - 1, # readAudioStream - samples, - channels, - audio_start_pts, - audio_end_pts, - audio_timebase_num, - audio_timebase_den, + full_path, video_tensor = _get_video_tensor(VIDEO_DIR, test_video) + # video related + width, height, min_dimension, max_dimension = 0, 0, 0, 0 + video_start_pts, video_end_pts = 0, -1 + video_timebase_num, video_timebase_den = 0, 1 + # audio related + samples, channels = 0, 0 + audio_start_pts, audio_end_pts = 0, -1 + audio_timebase_num, audio_timebase_den = 0, 1 + # pass 1: decode all frames using new decoder + tv_result = torch.ops.video_reader.read_video_from_memory( + video_tensor, + SEEK_FRAME_MARGIN, + 0, # getPtsOnly + 1, # readVideoStream + width, + height, + min_dimension, + max_dimension, + video_start_pts, + video_end_pts, + video_timebase_num, + video_timebase_den, + 1, # readAudioStream + samples, + channels, + audio_start_pts, + audio_end_pts, + audio_timebase_num, + audio_timebase_den, + ) + ( + vframes, + vframe_pts, + vtimebase, + vfps, + vduration, + aframes, + aframe_pts, + atimebase, + asample_rate, + aduration, + ) = tv_result + assert abs(config.video_fps - vfps.item()) < 0.01 + + start_pts_ind_max = vframe_pts.size(0) - num_frames + if start_pts_ind_max <= 0: + return + # randomly pick start pts + start_pts_ind = randint(0, start_pts_ind_max) + end_pts_ind = start_pts_ind + num_frames - 1 + video_start_pts = vframe_pts[start_pts_ind] + video_end_pts = vframe_pts[end_pts_ind] + + video_timebase_num, video_timebase_den = vtimebase[0], vtimebase[1] + if len(atimebase) > 0: + # when audio stream is available + audio_timebase_num, audio_timebase_den = atimebase[0], atimebase[1] + audio_start_pts = _pts_convert( + video_start_pts.item(), + Fraction(video_timebase_num.item(), video_timebase_den.item()), + Fraction(audio_timebase_num.item(), audio_timebase_den.item()), + math.floor, + ) + audio_end_pts = _pts_convert( + video_end_pts.item(), + Fraction(video_timebase_num.item(), video_timebase_den.item()), + Fraction(audio_timebase_num.item(), audio_timebase_den.item()), + math.ceil, + ) + + # pass 2: decode frames in the randomly generated range + tv_result = torch.ops.video_reader.read_video_from_memory( + video_tensor, + SEEK_FRAME_MARGIN, + 0, # getPtsOnly + 1, # readVideoStream + width, + height, + min_dimension, + max_dimension, + video_start_pts, + video_end_pts, + video_timebase_num, + video_timebase_den, + 1, # readAudioStream + samples, + channels, + audio_start_pts, + audio_end_pts, + audio_timebase_num, + audio_timebase_den, + ) + + # pass 3: decode frames in range using PyAv + video_timebase_av, audio_timebase_av = _get_timebase_by_av_module(full_path) + + video_start_pts_av = _pts_convert( + video_start_pts.item(), + Fraction(video_timebase_num.item(), video_timebase_den.item()), + Fraction(video_timebase_av.numerator, video_timebase_av.denominator), + math.floor, + ) + video_end_pts_av = _pts_convert( + video_end_pts.item(), + Fraction(video_timebase_num.item(), video_timebase_den.item()), + Fraction(video_timebase_av.numerator, video_timebase_av.denominator), + math.ceil, + ) + if audio_timebase_av: + audio_start_pts = _pts_convert( + video_start_pts.item(), + Fraction(video_timebase_num.item(), video_timebase_den.item()), + Fraction(audio_timebase_av.numerator, audio_timebase_av.denominator), + math.floor, + ) + audio_end_pts = _pts_convert( + video_end_pts.item(), + Fraction(video_timebase_num.item(), video_timebase_den.item()), + Fraction(audio_timebase_av.numerator, audio_timebase_av.denominator), + math.ceil, ) - vframes, vframe_pts, vtimebase, vfps, vduration, \ - aframes, aframe_pts, atimebase, asample_rate, aduration = ( - tv_result - ) - self.assertAlmostEqual(config.video_fps, vfps.item(), delta=0.01) - - for num_frames in [4, 8, 16, 32, 64, 128]: - start_pts_ind_max = vframe_pts.size(0) - num_frames - if start_pts_ind_max <= 0: - continue - # randomly pick start pts - start_pts_ind = randint(0, start_pts_ind_max) - end_pts_ind = start_pts_ind + num_frames - 1 - video_start_pts = vframe_pts[start_pts_ind] - video_end_pts = vframe_pts[end_pts_ind] - - video_timebase_num, video_timebase_den = vtimebase[0], vtimebase[1] - if len(atimebase) > 0: - # when audio stream is available - audio_timebase_num, audio_timebase_den = atimebase[0], atimebase[1] - audio_start_pts = _pts_convert( - video_start_pts.item(), - Fraction(video_timebase_num.item(), video_timebase_den.item()), - Fraction(audio_timebase_num.item(), audio_timebase_den.item()), - math.floor, - ) - audio_end_pts = _pts_convert( - video_end_pts.item(), - Fraction(video_timebase_num.item(), video_timebase_den.item()), - Fraction(audio_timebase_num.item(), audio_timebase_den.item()), - math.ceil, - ) - - # pass 2: decode frames in the randomly generated range - tv_result = torch.ops.video_reader.read_video_from_memory( - video_tensor, - seek_frame_margin, - 0, # getPtsOnly - 1, # readVideoStream - width, - height, - min_dimension, - max_dimension, - video_start_pts, - video_end_pts, - video_timebase_num, - video_timebase_den, - 1, # readAudioStream - samples, - channels, - audio_start_pts, - audio_end_pts, - audio_timebase_num, - audio_timebase_den, - ) - - # pass 3: decode frames in range using PyAv - video_timebase_av, audio_timebase_av = _get_timebase_by_av_module( - full_path - ) - - video_start_pts_av = _pts_convert( - video_start_pts.item(), - Fraction(video_timebase_num.item(), video_timebase_den.item()), - Fraction( - video_timebase_av.numerator, video_timebase_av.denominator - ), - math.floor, - ) - video_end_pts_av = _pts_convert( - video_end_pts.item(), - Fraction(video_timebase_num.item(), video_timebase_den.item()), - Fraction( - video_timebase_av.numerator, video_timebase_av.denominator - ), - math.ceil, - ) - if audio_timebase_av: - audio_start_pts = _pts_convert( - video_start_pts.item(), - Fraction(video_timebase_num.item(), video_timebase_den.item()), - Fraction( - audio_timebase_av.numerator, audio_timebase_av.denominator - ), - math.floor, - ) - audio_end_pts = _pts_convert( - video_end_pts.item(), - Fraction(video_timebase_num.item(), video_timebase_den.item()), - Fraction( - audio_timebase_av.numerator, audio_timebase_av.denominator - ), - math.ceil, - ) - - pyav_result = _decode_frames_by_av_module( - full_path, - video_start_pts_av, - video_end_pts_av, - audio_start_pts, - audio_end_pts, - ) - - self.assertEqual(tv_result[0].size(0), num_frames) - if pyav_result.vframes.size(0) == num_frames: - # if PyAv decodes a different number of video frames, skip - # comparing the decoding results between Torchvision video reader - # and PyAv - self.compare_decoding_result(tv_result, pyav_result, config) - - def test_probe_video_from_file(self): + + pyav_result = _decode_frames_by_av_module( + full_path, + video_start_pts_av, + video_end_pts_av, + audio_start_pts, + audio_end_pts, + ) + + assert tv_result[0].size(0) == num_frames + if pyav_result.vframes.size(0) == num_frames: + # if PyAv decodes a different number of video frames, skip + # comparing the decoding results between Torchvision video reader + # and PyAv + self.compare_decoding_result(tv_result, pyav_result, config) + + @pytest.mark.parametrize("test_video,config", test_videos.items()) + def test_probe_video_from_file(self, test_video, config): """ Test the case when decoder probes a video file """ - for test_video, config in test_videos.items(): - full_path = os.path.join(VIDEO_DIR, test_video) - probe_result = torch.ops.video_reader.probe_video_from_file(full_path) - self.check_probe_result(probe_result, config) + full_path = os.path.join(VIDEO_DIR, test_video) + probe_result = torch.ops.video_reader.probe_video_from_file(full_path) + self.check_probe_result(probe_result, config) - def test_probe_video_from_memory(self): + @pytest.mark.parametrize("test_video,config", test_videos.items()) + def test_probe_video_from_memory(self, test_video, config): """ Test the case when decoder probes a video in memory """ - for test_video, config in test_videos.items(): - full_path, video_tensor = _get_video_tensor(VIDEO_DIR, test_video) - probe_result = torch.ops.video_reader.probe_video_from_memory(video_tensor) - self.check_probe_result(probe_result, config) + _, video_tensor = _get_video_tensor(VIDEO_DIR, test_video) + probe_result = torch.ops.video_reader.probe_video_from_memory(video_tensor) + self.check_probe_result(probe_result, config) - def test_probe_video_from_memory_script(self): + @pytest.mark.parametrize("test_video,config", test_videos.items()) + def test_probe_video_from_memory_script(self, test_video, config): scripted_fun = torch.jit.script(io._probe_video_from_memory) - self.assertIsNotNone(scripted_fun) + assert scripted_fun is not None - for test_video, config in test_videos.items(): - full_path, video_tensor = _get_video_tensor(VIDEO_DIR, test_video) - probe_result = scripted_fun(video_tensor) - self.check_meta_result(probe_result, config) + _, video_tensor = _get_video_tensor(VIDEO_DIR, test_video) + probe_result = scripted_fun(video_tensor) + self.check_meta_result(probe_result, config) - @PY39_SKIP - def test_read_video_from_memory_scripted(self): + @pytest.mark.parametrize("test_video", test_videos.keys()) + def test_read_video_from_memory_scripted(self, test_video): """ Test the case when video is already in memory, and decoder reads data in memory """ @@ -1212,71 +1189,66 @@ class TestVideoReader(unittest.TestCase): audio_timebase_num, audio_timebase_den = 0, 1 scripted_fun = torch.jit.script(io._read_video_from_memory) - self.assertIsNotNone(scripted_fun) - - for test_video, _config in test_videos.items(): - full_path, video_tensor = _get_video_tensor(VIDEO_DIR, test_video) - - # decode all frames using cpp decoder - scripted_fun( - video_tensor, - seek_frame_margin, - 1, # readVideoStream - width, - height, - min_dimension, - max_dimension, - [video_start_pts, video_end_pts], - video_timebase_num, - video_timebase_den, - 1, # readAudioStream - samples, - channels, - [audio_start_pts, audio_end_pts], - audio_timebase_num, - audio_timebase_den, - ) - # FUTURE: check value of video / audio frames - - def test_audio_video_sync(self): - """Test if audio/video are synchronised with pyav output.""" - for test_video, config in test_videos.items(): - full_path = os.path.join(VIDEO_DIR, test_video) - container = av.open(full_path) - if not container.streams.audio: - # Skip if no audio stream - continue - start_pts_val, cutoff = 0, 1 - if container.streams.video: - video = container.streams.video[0] - arr = [] - for index, frame in enumerate(container.decode(video)): - if index == cutoff: - start_pts_val = frame.pts - if index >= cutoff: - arr.append(frame.to_rgb().to_ndarray()) - visual, _, info = io.read_video(full_path, start_pts=start_pts_val, pts_unit='pts') - self.assertAlmostEqual( - config.video_fps, info['video_fps'], delta=0.0001 - ) - arr = torch.Tensor(arr) - if arr.shape == visual.shape: - self.assertGreaterEqual( - torch.mean(torch.isclose(visual.float(), arr, atol=1e-5).float()), 0.99) - - container = av.open(full_path) - if container.streams.audio: - audio = container.streams.audio[0] - arr = [] - for index, frame in enumerate(container.decode(audio)): - if index >= cutoff: - arr.append(frame.to_ndarray()) - _, audio, _ = io.read_video(full_path, start_pts=start_pts_val, pts_unit='pts') - arr = torch.as_tensor(np.concatenate(arr, axis=1)) - if arr.shape == audio.shape: - self.assertGreaterEqual( - torch.mean(torch.isclose(audio.float(), arr).float()), 0.99) + assert scripted_fun is not None + + _, video_tensor = _get_video_tensor(VIDEO_DIR, test_video) + + # decode all frames using cpp decoder + scripted_fun( + video_tensor, + SEEK_FRAME_MARGIN, + 1, # readVideoStream + width, + height, + min_dimension, + max_dimension, + [video_start_pts, video_end_pts], + video_timebase_num, + video_timebase_den, + 1, # readAudioStream + samples, + channels, + [audio_start_pts, audio_end_pts], + audio_timebase_num, + audio_timebase_den, + ) + # FUTURE: check value of video / audio frames + + def test_invalid_file(self): + set_video_backend("video_reader") + with pytest.raises(RuntimeError): + io.read_video("foo.mp4") + + set_video_backend("pyav") + with pytest.raises(RuntimeError): + io.read_video("foo.mp4") + + @pytest.mark.parametrize("test_video", test_videos.keys()) + @pytest.mark.parametrize("backend", ["video_reader", "pyav"]) + @pytest.mark.parametrize("start_offset", [0, 500]) + @pytest.mark.parametrize("end_offset", [3000, None]) + def test_audio_present_pts(self, test_video, backend, start_offset, end_offset): + """Test if audio frames are returned with pts unit.""" + full_path = os.path.join(VIDEO_DIR, test_video) + container = av.open(full_path) + if container.streams.audio: + set_video_backend(backend) + _, audio, _ = io.read_video(full_path, start_offset, end_offset, pts_unit="pts") + assert all([dimension > 0 for dimension in audio.shape[:2]]) + + @pytest.mark.parametrize("test_video", test_videos.keys()) + @pytest.mark.parametrize("backend", ["video_reader", "pyav"]) + @pytest.mark.parametrize("start_offset", [0, 0.1]) + @pytest.mark.parametrize("end_offset", [0.3, None]) + def test_audio_present_sec(self, test_video, backend, start_offset, end_offset): + """Test if audio frames are returned with sec unit.""" + full_path = os.path.join(VIDEO_DIR, test_video) + container = av.open(full_path) + if container.streams.audio: + set_video_backend(backend) + _, audio, _ = io.read_video(full_path, start_offset, end_offset, pts_unit="sec") + assert all([dimension > 0 for dimension in audio.shape[:2]]) if __name__ == "__main__": - unittest.main() + pytest.main([__file__]) diff --git a/test/test_videoapi.py b/test/test_videoapi.py index da73c7cd17d3b585c688b05c619c42c4a6172d51..dc878ca9f8cbfb9fdd3911e339104248918ac7c7 100644 --- a/test/test_videoapi.py +++ b/test/test_videoapi.py @@ -1,13 +1,20 @@ import collections import os -import unittest +import urllib +import pytest import torch import torchvision -from torchvision.io import _HAS_VIDEO_OPT, VideoReader +from pytest import approx from torchvision.datasets.utils import download_url +from torchvision.io import _HAS_VIDEO_OPT, VideoReader + + +# WARNING: these tests have been skipped forever on the CI because the video ops +# are never properly available. This is bad, but things have been in a terrible +# state for a long time already as we write this comment, and we'll hopefully be +# able to get rid of this all soon. -from common_utils import PY39_SKIP try: import av @@ -24,6 +31,13 @@ CheckerConfig = ["duration", "video_fps", "audio_sample_rate"] GroundTruth = collections.namedtuple("GroundTruth", " ".join(CheckerConfig)) +def backends(): + backends_ = ["video_reader"] + if av is not None: + backends_.append("pyav") + return backends_ + + def fate(name, path="."): """Download and return a path to a sample from the FFmpeg test suite. See the `FFmpeg Automated Test Environment `_ @@ -35,166 +49,264 @@ def fate(name, path="."): test_videos = { - "RATRACE_wave_f_nm_np1_fr_goo_37.avi": GroundTruth( - duration=2.0, video_fps=30.0, audio_sample_rate=None - ), + "RATRACE_wave_f_nm_np1_fr_goo_37.avi": GroundTruth(duration=2.0, video_fps=30.0, audio_sample_rate=None), "SchoolRulesHowTheyHelpUs_wave_f_nm_np1_ba_med_0.avi": GroundTruth( duration=2.0, video_fps=30.0, audio_sample_rate=None ), - "TrumanShow_wave_f_nm_np1_fr_med_26.avi": GroundTruth( - duration=2.0, video_fps=30.0, audio_sample_rate=None - ), - "v_SoccerJuggling_g23_c01.avi": GroundTruth( - duration=8.0, video_fps=29.97, audio_sample_rate=None - ), - "v_SoccerJuggling_g24_c01.avi": GroundTruth( - duration=8.0, video_fps=29.97, audio_sample_rate=None - ), - "R6llTwEh07w.mp4": GroundTruth( - duration=10.0, video_fps=30.0, audio_sample_rate=44100 - ), - "SOX5yA1l24A.mp4": GroundTruth( - duration=11.0, video_fps=29.97, audio_sample_rate=48000 - ), - "WUzgd7C1pWA.mp4": GroundTruth( - duration=11.0, video_fps=29.97, audio_sample_rate=48000 - ), + "TrumanShow_wave_f_nm_np1_fr_med_26.avi": GroundTruth(duration=2.0, video_fps=30.0, audio_sample_rate=None), + "v_SoccerJuggling_g23_c01.avi": GroundTruth(duration=8.0, video_fps=29.97, audio_sample_rate=None), + "v_SoccerJuggling_g24_c01.avi": GroundTruth(duration=8.0, video_fps=29.97, audio_sample_rate=None), + "R6llTwEh07w.mp4": GroundTruth(duration=10.0, video_fps=30.0, audio_sample_rate=44100), + "SOX5yA1l24A.mp4": GroundTruth(duration=11.0, video_fps=29.97, audio_sample_rate=48000), + "WUzgd7C1pWA.mp4": GroundTruth(duration=11.0, video_fps=29.97, audio_sample_rate=48000), } -@unittest.skipIf(_HAS_VIDEO_OPT is False, "Didn't compile with ffmpeg") -@PY39_SKIP -class TestVideoApi(unittest.TestCase): - @unittest.skipIf(av is None, "PyAV unavailable") - def test_frame_reading(self): - for test_video, config in test_videos.items(): - full_path = os.path.join(VIDEO_DIR, test_video) - - av_reader = av.open(full_path) - +@pytest.mark.skipif(_HAS_VIDEO_OPT is False, reason="Didn't compile with ffmpeg") +class TestVideoApi: + @pytest.mark.skipif(av is None, reason="PyAV unavailable") + @pytest.mark.parametrize("test_video", test_videos.keys()) + @pytest.mark.parametrize("backend", backends()) + def test_frame_reading(self, test_video, backend): + torchvision.set_video_backend(backend) + full_path = os.path.join(VIDEO_DIR, test_video) + with av.open(full_path) as av_reader: if av_reader.streams.video: - video_reader = VideoReader(full_path, "video") + av_frames, vr_frames = [], [] + av_pts, vr_pts = [], [] + # get av frames for av_frame in av_reader.decode(av_reader.streams.video[0]): - vr_frame = next(video_reader) - - self.assertAlmostEqual( - float(av_frame.pts * av_frame.time_base), - vr_frame["pts"], - delta=0.1, - ) - - av_array = torch.tensor(av_frame.to_rgb().to_ndarray()).permute( - 2, 0, 1 - ) - vr_array = vr_frame["data"] - mean_delta = torch.mean( - torch.abs(av_array.float() - vr_array.float()) - ) + av_frames.append(torch.tensor(av_frame.to_rgb().to_ndarray()).permute(2, 0, 1)) + av_pts.append(av_frame.pts * av_frame.time_base) + + # get vr frames + video_reader = VideoReader(full_path, "video") + for vr_frame in video_reader: + vr_frames.append(vr_frame["data"]) + vr_pts.append(vr_frame["pts"]) + + # same number of frames + assert len(vr_frames) == len(av_frames) + assert len(vr_pts) == len(av_pts) + + # compare the frames and ptss + for i in range(len(vr_frames)): + assert float(av_pts[i]) == approx(vr_pts[i], abs=0.1) + + mean_delta = torch.mean(torch.abs(av_frames[i].float() - vr_frames[i].float())) # on average the difference is very small and caused # by decoding (around 1%) # TODO: asses empirically how to set this? atm it's 1% # averaged over all frames - self.assertTrue(mean_delta.item() < 2.5) + assert mean_delta.item() < 2.55 + + del vr_frames, av_frames, vr_pts, av_pts - av_reader = av.open(full_path) + # test audio reading compared to PYAV + with av.open(full_path) as av_reader: if av_reader.streams.audio: - video_reader = VideoReader(full_path, "audio") + av_frames, vr_frames = [], [] + av_pts, vr_pts = [], [] + # get av frames for av_frame in av_reader.decode(av_reader.streams.audio[0]): - vr_frame = next(video_reader) - self.assertAlmostEqual( - float(av_frame.pts * av_frame.time_base), - vr_frame["pts"], - delta=0.1, - ) - - av_array = torch.tensor(av_frame.to_ndarray()).permute(1, 0) - vr_array = vr_frame["data"] - - max_delta = torch.max( - torch.abs(av_array.float() - vr_array.float()) - ) - # we assure that there is never more than 1% difference in signal - self.assertTrue(max_delta.item() < 0.001) + av_frames.append(torch.tensor(av_frame.to_ndarray()).permute(1, 0)) + av_pts.append(av_frame.pts * av_frame.time_base) + av_reader.close() - def test_metadata(self): + # get vr frames + video_reader = VideoReader(full_path, "audio") + for vr_frame in video_reader: + vr_frames.append(vr_frame["data"]) + vr_pts.append(vr_frame["pts"]) + + # same number of frames + assert len(vr_frames) == len(av_frames) + assert len(vr_pts) == len(av_pts) + + # compare the frames and ptss + for i in range(len(vr_frames)): + assert float(av_pts[i]) == approx(vr_pts[i], abs=0.1) + max_delta = torch.max(torch.abs(av_frames[i].float() - vr_frames[i].float())) + # we assure that there is never more than 1% difference in signal + assert max_delta.item() < 0.001 + + @pytest.mark.parametrize("stream", ["video", "audio"]) + @pytest.mark.parametrize("test_video", test_videos.keys()) + @pytest.mark.parametrize("backend", backends()) + def test_frame_reading_mem_vs_file(self, test_video, stream, backend): + torchvision.set_video_backend(backend) + full_path = os.path.join(VIDEO_DIR, test_video) + + reader = VideoReader(full_path) + reader_md = reader.get_metadata() + + if stream in reader_md: + # Test video reading from file vs from memory + vr_frames, vr_frames_mem = [], [] + vr_pts, vr_pts_mem = [], [] + # get vr frames + video_reader = VideoReader(full_path, stream) + for vr_frame in video_reader: + vr_frames.append(vr_frame["data"]) + vr_pts.append(vr_frame["pts"]) + + # get vr frames = read from memory + f = open(full_path, "rb") + fbytes = f.read() + f.close() + video_reader_from_mem = VideoReader(fbytes, stream) + + for vr_frame_from_mem in video_reader_from_mem: + vr_frames_mem.append(vr_frame_from_mem["data"]) + vr_pts_mem.append(vr_frame_from_mem["pts"]) + + # same number of frames + assert len(vr_frames) == len(vr_frames_mem) + assert len(vr_pts) == len(vr_pts_mem) + + # compare the frames and ptss + for i in range(len(vr_frames)): + assert vr_pts[i] == vr_pts_mem[i] + mean_delta = torch.mean(torch.abs(vr_frames[i].float() - vr_frames_mem[i].float())) + # on average the difference is very small and caused + # by decoding (around 1%) + # TODO: asses empirically how to set this? atm it's 1% + # averaged over all frames + assert mean_delta.item() < 2.55 + + del vr_frames, vr_pts, vr_frames_mem, vr_pts_mem + else: + del reader, reader_md + + @pytest.mark.parametrize("test_video,config", test_videos.items()) + @pytest.mark.parametrize("backend", backends()) + def test_metadata(self, test_video, config, backend): """ Test that the metadata returned via pyav corresponds to the one returned by the new video decoder API """ - for test_video, config in test_videos.items(): - full_path = os.path.join(VIDEO_DIR, test_video) - reader = VideoReader(full_path, "video") - reader_md = reader.get_metadata() - self.assertAlmostEqual( - config.video_fps, reader_md["video"]["fps"][0], delta=0.0001 - ) - self.assertAlmostEqual( - config.duration, reader_md["video"]["duration"][0], delta=0.5 - ) - - def test_seek_start(self): - for test_video, config in test_videos.items(): - full_path = os.path.join(VIDEO_DIR, test_video) - - video_reader = VideoReader(full_path, "video") + torchvision.set_video_backend(backend) + full_path = os.path.join(VIDEO_DIR, test_video) + reader = VideoReader(full_path, "video") + reader_md = reader.get_metadata() + assert config.video_fps == approx(reader_md["video"]["fps"][0], abs=0.0001) + assert config.duration == approx(reader_md["video"]["duration"][0], abs=0.5) + + @pytest.mark.parametrize("test_video", test_videos.keys()) + @pytest.mark.parametrize("backend", backends()) + def test_seek_start(self, test_video, backend): + torchvision.set_video_backend(backend) + full_path = os.path.join(VIDEO_DIR, test_video) + video_reader = VideoReader(full_path, "video") + num_frames = 0 + for _ in video_reader: + num_frames += 1 + + # now seek the container to 0 and do it again + # It's often that starting seek can be inprecise + # this way and it doesn't start at 0 + video_reader.seek(0) + start_num_frames = 0 + for _ in video_reader: + start_num_frames += 1 + + assert start_num_frames == num_frames + + # now seek the container to < 0 to check for unexpected behaviour + video_reader.seek(-1) + start_num_frames = 0 + for _ in video_reader: + start_num_frames += 1 + + assert start_num_frames == num_frames + + @pytest.mark.parametrize("test_video", test_videos.keys()) + @pytest.mark.parametrize("backend", ["video_reader"]) + def test_accurateseek_middle(self, test_video, backend): + torchvision.set_video_backend(backend) + full_path = os.path.join(VIDEO_DIR, test_video) + stream = "video" + video_reader = VideoReader(full_path, stream) + md = video_reader.get_metadata() + duration = md[stream]["duration"][0] + if duration is not None: num_frames = 0 - for frame in video_reader: + for _ in video_reader: num_frames += 1 - # now seek the container to 0 and do it again - # It's often that starting seek can be inprecise - # this way and it doesn't start at 0 - video_reader.seek(0) - start_num_frames = 0 - for frame in video_reader: - start_num_frames += 1 - - self.assertEqual(start_num_frames, num_frames) + video_reader.seek(duration / 2) + middle_num_frames = 0 + for _ in video_reader: + middle_num_frames += 1 - # now seek the container to < 0 to check for unexpected behaviour - video_reader.seek(-1) - start_num_frames = 0 - for frame in video_reader: - start_num_frames += 1 + assert middle_num_frames < num_frames + assert middle_num_frames == approx(num_frames // 2, abs=1) - self.assertEqual(start_num_frames, num_frames) + video_reader.seek(duration / 2) + frame = next(video_reader) + lb = duration / 2 - 1 / md[stream]["fps"][0] + ub = duration / 2 + 1 / md[stream]["fps"][0] + assert (lb <= frame["pts"]) and (ub >= frame["pts"]) - def test_accurateseek_middle(self): - for test_video, config in test_videos.items(): - full_path = os.path.join(VIDEO_DIR, test_video) + def test_fate_suite(self): + # TODO: remove the try-except statement once the connectivity issues are resolved + try: + video_path = fate("sub/MovText_capability_tester.mp4", VIDEO_DIR) + except (urllib.error.URLError, ConnectionError) as error: + pytest.skip(f"Skipping due to connectivity issues: {error}") + vr = VideoReader(video_path) + metadata = vr.get_metadata() - stream = "video" - video_reader = VideoReader(full_path, stream) - md = video_reader.get_metadata() - duration = md[stream]["duration"][0] - if duration is not None: + assert metadata["subtitles"]["duration"] is not None + os.remove(video_path) - num_frames = 0 - for frame in video_reader: - num_frames += 1 + @pytest.mark.skipif(av is None, reason="PyAV unavailable") + @pytest.mark.parametrize("test_video,config", test_videos.items()) + @pytest.mark.parametrize("backend", backends()) + def test_keyframe_reading(self, test_video, config, backend): + torchvision.set_video_backend(backend) + full_path = os.path.join(VIDEO_DIR, test_video) - video_reader.seek(duration / 2) - middle_num_frames = 0 - for frame in video_reader: - middle_num_frames += 1 + av_reader = av.open(full_path) + # reduce streams to only keyframes + av_stream = av_reader.streams.video[0] + av_stream.codec_context.skip_frame = "NONKEY" - self.assertTrue(middle_num_frames < num_frames) - self.assertAlmostEqual(middle_num_frames, num_frames // 2, delta=1) + av_keyframes = [] + vr_keyframes = [] + if av_reader.streams.video: - video_reader.seek(duration / 2) - frame = next(video_reader) - lb = duration / 2 - 1 / md[stream]["fps"][0] - ub = duration / 2 + 1 / md[stream]["fps"][0] - self.assertTrue((lb <= frame["pts"]) & (ub >= frame["pts"])) + # get all keyframes using pyav. Then, seek randomly into video reader + # and assert that all the returned values are in AV_KEYFRAMES - def test_fate_suite(self): - video_path = fate("sub/MovText_capability_tester.mp4", VIDEO_DIR) - vr = VideoReader(video_path) - metadata = vr.get_metadata() + for av_frame in av_reader.decode(av_stream): + av_keyframes.append(float(av_frame.pts * av_frame.time_base)) - self.assertTrue(metadata["subtitles"]["duration"] is not None) - os.remove(video_path) + if len(av_keyframes) > 1: + video_reader = VideoReader(full_path, "video") + for i in range(1, len(av_keyframes)): + seek_val = (av_keyframes[i] + av_keyframes[i - 1]) / 2 + data = next(video_reader.seek(seek_val, True)) + vr_keyframes.append(data["pts"]) + + data = next(video_reader.seek(config.duration, True)) + vr_keyframes.append(data["pts"]) + + assert len(av_keyframes) == len(vr_keyframes) + # NOTE: this video gets different keyframe with different + # loaders (0.333 pyav, 0.666 for us) + if test_video != "TrumanShow_wave_f_nm_np1_fr_med_26.avi": + for i in range(len(av_keyframes)): + assert av_keyframes[i] == approx(vr_keyframes[i], rel=0.001) + + def test_src(self): + with pytest.raises(ValueError, match="src cannot be empty"): + VideoReader(src="") + with pytest.raises(ValueError, match="src must be either string"): + VideoReader(src=2) + with pytest.raises(TypeError, match="unexpected keyword argument"): + VideoReader(path="path") if __name__ == "__main__": - unittest.main() + pytest.main([__file__]) diff --git a/test/tracing/frcnn/CMakeLists.txt b/test/tracing/frcnn/CMakeLists.txt deleted file mode 100644 index c79382470bd528e17e38fb01ad3078d77eccf24b..0000000000000000000000000000000000000000 --- a/test/tracing/frcnn/CMakeLists.txt +++ /dev/null @@ -1,13 +0,0 @@ -cmake_minimum_required(VERSION 3.1 FATAL_ERROR) -project(test_frcnn_tracing) - -find_package(Torch REQUIRED) -find_package(TorchVision REQUIRED) - -# This due to some headers importing Python.h -find_package(Python3 COMPONENTS Development) - -add_executable(test_frcnn_tracing test_frcnn_tracing.cpp) -target_compile_features(test_frcnn_tracing PUBLIC cxx_range_for) -target_link_libraries(test_frcnn_tracing ${TORCH_LIBRARIES} TorchVision::TorchVision Python3::Python) -set_property(TARGET test_frcnn_tracing PROPERTY CXX_STANDARD 14) diff --git a/test/tracing/frcnn/test_frcnn_tracing.cpp b/test/tracing/frcnn/test_frcnn_tracing.cpp deleted file mode 100644 index f5f350b6b02c0fbf3b0cfa3f2f44ab69c1c231a4..0000000000000000000000000000000000000000 --- a/test/tracing/frcnn/test_frcnn_tracing.cpp +++ /dev/null @@ -1,58 +0,0 @@ -#include -#include -#include -#include - - -int main() { - torch::DeviceType device_type; - device_type = torch::kCPU; - - torch::jit::script::Module module; - try { - std::cout << "Loading model\n"; - // Deserialize the ScriptModule from a file using torch::jit::load(). - module = torch::jit::load("fasterrcnn_resnet50_fpn.pt"); - std::cout << "Model loaded\n"; - } catch (const torch::Error& e) { - std::cout << "error loading the model\n"; - return -1; - } catch (const std::exception& e) { - std::cout << "Other error: " << e.what() << "\n"; - return -1; - } - - // TorchScript models require a List[IValue] as input - std::vector inputs; - - // Faster RCNN accepts a List[Tensor] as main input - std::vector images; - images.push_back(torch::rand({3, 256, 275})); - images.push_back(torch::rand({3, 256, 275})); - - inputs.push_back(images); - auto output = module.forward(inputs); - - std::cout << "ok\n"; - std::cout << "output" << output << "\n"; - - if (torch::cuda::is_available()) { - // Move traced model to GPU - module.to(torch::kCUDA); - - // Add GPU inputs - images.clear(); - inputs.clear(); - - torch::TensorOptions options = torch::TensorOptions{torch::kCUDA}; - images.push_back(torch::rand({3, 256, 275}, options)); - images.push_back(torch::rand({3, 256, 275}, options)); - - inputs.push_back(images); - auto output = module.forward(inputs); - - std::cout << "ok\n"; - std::cout << "output" << output << "\n"; - } - return 0; -} diff --git a/test/tracing/frcnn/trace_model.py b/test/tracing/frcnn/trace_model.py deleted file mode 100644 index 34961e8684f1376e644e349a24f072760d1b9a95..0000000000000000000000000000000000000000 --- a/test/tracing/frcnn/trace_model.py +++ /dev/null @@ -1,14 +0,0 @@ - -import os.path as osp - -import torch -import torchvision - -HERE = osp.dirname(osp.abspath(__file__)) -ASSETS = osp.dirname(osp.dirname(HERE)) - -model = torchvision.models.detection.fasterrcnn_resnet50_fpn(pretrained=False) -model.eval() - -traced_model = torch.jit.script(model) -traced_model.save("fasterrcnn_resnet50_fpn.pt") diff --git a/torchvision/__init__.py b/torchvision/__init__.py index 9508605b551c74b71941a6f90b5713a0a3c03a20..857625a783c4c59dd0fe5f5fc64f1014a431aa6e 100644 --- a/torchvision/__init__.py +++ b/torchvision/__init__.py @@ -1,31 +1,32 @@ -import warnings import os - -from .extension import _HAS_OPS - -from torchvision import models -from torchvision import datasets -from torchvision import ops -from torchvision import transforms -from torchvision import utils -from torchvision import io +import warnings +from modulefinder import Module import torch +# Don't re-order these, we need to load the _C extension (done when importing +# .extensions) before entering _meta_registrations. +from .extension import _HAS_OPS # usort:skip +from torchvision import _meta_registrations, datasets, io, models, ops, transforms, utils # usort:skip + try: from .version import __version__ # noqa: F401 except ImportError: pass + # Check if torchvision is being imported within the root folder -if (not _HAS_OPS and os.path.dirname(os.path.realpath(__file__)) == - os.path.join(os.path.realpath(os.getcwd()), 'torchvision')): - message = ('You are importing torchvision within its own root folder ({}). ' - 'This is not expected to work and may give errors. Please exit the ' - 'torchvision project source and relaunch your python interpreter.') +if not _HAS_OPS and os.path.dirname(os.path.realpath(__file__)) == os.path.join( + os.path.realpath(os.getcwd()), "torchvision" +): + message = ( + "You are importing torchvision within its own root folder ({}). " + "This is not expected to work and may give errors. Please exit the " + "torchvision project source and relaunch your python interpreter." + ) warnings.warn(message.format(os.getcwd())) -_image_backend = 'PIL' +_image_backend = "PIL" _video_backend = "pyav" @@ -40,9 +41,8 @@ def set_image_backend(backend): generally faster than PIL, but does not support as many operations. """ global _image_backend - if backend not in ['PIL', 'accimage']: - raise ValueError("Invalid backend '{}'. Options are 'PIL' and 'accimage'" - .format(backend)) + if backend not in ["PIL", "accimage"]: + raise ValueError(f"Invalid backend '{backend}'. Options are 'PIL' and 'accimage'") _image_backend = backend @@ -63,23 +63,23 @@ def set_video_backend(backend): binding for the FFmpeg libraries. The :mod:`video_reader` package includes a native C++ implementation on top of FFMPEG libraries, and a python API of TorchScript custom operator. - It is generally decoding faster than :mod:`pyav`, but perhaps is less robust. + It generally decodes faster than :mod:`pyav`, but is perhaps less robust. .. note:: - Building with FFMPEG is disabled by default in the latest master. If you want to use the 'video_reader' + Building with FFMPEG is disabled by default in the latest `main`. If you want to use the 'video_reader' backend, please compile torchvision from source. """ global _video_backend - if backend not in ["pyav", "video_reader"]: - raise ValueError( - "Invalid video backend '%s'. Options are 'pyav' and 'video_reader'" % backend - ) + if backend not in ["pyav", "video_reader", "cuda"]: + raise ValueError("Invalid video backend '%s'. Options are 'pyav', 'video_reader' and 'cuda'" % backend) if backend == "video_reader" and not io._HAS_VIDEO_OPT: - message = ( - "video_reader video backend is not available." - " Please compile torchvision from source and try again" - ) - warnings.warn(message) + # TODO: better messages + message = "video_reader video backend is not available. Please compile torchvision from source and try again" + raise RuntimeError(message) + elif backend == "cuda" and not io._HAS_GPU_VIDEO_DECODER: + # TODO: better messages + message = "cuda video backend is not available." + raise RuntimeError(message) else: _video_backend = backend @@ -97,3 +97,9 @@ def get_video_backend(): def _is_tracing(): return torch._C._get_tracing_state() + + +def disable_beta_transforms_warning(): + # Noop, only exists to avoid breaking existing code. + # See https://github.com/pytorch/vision/issues/7896 + pass diff --git a/torchvision/_internally_replaced_utils.py b/torchvision/_internally_replaced_utils.py new file mode 100644 index 0000000000000000000000000000000000000000..d9a6e261ea277989f4362037352cb24da6564460 --- /dev/null +++ b/torchvision/_internally_replaced_utils.py @@ -0,0 +1,50 @@ +import importlib.machinery +import os + +from torch.hub import _get_torch_home + + +_HOME = os.path.join(_get_torch_home(), "datasets", "vision") +_USE_SHARDED_DATASETS = False + + +def _download_file_from_remote_location(fpath: str, url: str) -> None: + pass + + +def _is_remote_location_available() -> bool: + return False + + +try: + from torch.hub import load_state_dict_from_url # noqa: 401 +except ImportError: + from torch.utils.model_zoo import load_url as load_state_dict_from_url # noqa: 401 + + +def _get_extension_path(lib_name): + + lib_dir = os.path.dirname(__file__) + if os.name == "nt": + # Register the main torchvision library location on the default DLL path + import ctypes + + kernel32 = ctypes.WinDLL("kernel32.dll", use_last_error=True) + with_load_library_flags = hasattr(kernel32, "AddDllDirectory") + prev_error_mode = kernel32.SetErrorMode(0x0001) + + if with_load_library_flags: + kernel32.AddDllDirectory.restype = ctypes.c_void_p + + os.add_dll_directory(lib_dir) + + kernel32.SetErrorMode(prev_error_mode) + + loader_details = (importlib.machinery.ExtensionFileLoader, importlib.machinery.EXTENSION_SUFFIXES) + + extfinder = importlib.machinery.FileFinder(lib_dir, loader_details) + ext_specs = extfinder.find_spec(lib_name) + if ext_specs is None: + raise ImportError + + return ext_specs.origin diff --git a/torchvision/_meta_registrations.py b/torchvision/_meta_registrations.py new file mode 100644 index 0000000000000000000000000000000000000000..f75bfb77a7f25a1842509de595f109f232994574 --- /dev/null +++ b/torchvision/_meta_registrations.py @@ -0,0 +1,225 @@ +import functools + +import torch +import torch._custom_ops +import torch.library + +# Ensure that torch.ops.torchvision is visible +import torchvision.extension # noqa: F401 + + +@functools.lru_cache(None) +def get_meta_lib(): + return torch.library.Library("torchvision", "IMPL", "Meta") + + +def register_meta(op_name, overload_name="default"): + def wrapper(fn): + if torchvision.extension._has_ops(): + get_meta_lib().impl(getattr(getattr(torch.ops.torchvision, op_name), overload_name), fn) + return fn + + return wrapper + + +@register_meta("roi_align") +def meta_roi_align(input, rois, spatial_scale, pooled_height, pooled_width, sampling_ratio, aligned): + torch._check(rois.size(1) == 5, lambda: "rois must have shape as Tensor[K, 5]") + torch._check( + input.dtype == rois.dtype, + lambda: ( + "Expected tensor for input to have the same type as tensor for rois; " + f"but type {input.dtype} does not equal {rois.dtype}" + ), + ) + num_rois = rois.size(0) + channels = input.size(1) + return input.new_empty((num_rois, channels, pooled_height, pooled_width)) + + +@register_meta("_roi_align_backward") +def meta_roi_align_backward( + grad, rois, spatial_scale, pooled_height, pooled_width, batch_size, channels, height, width, sampling_ratio, aligned +): + torch._check( + grad.dtype == rois.dtype, + lambda: ( + "Expected tensor for grad to have the same type as tensor for rois; " + f"but type {grad.dtype} does not equal {rois.dtype}" + ), + ) + return grad.new_empty((batch_size, channels, height, width)) + + +@register_meta("ps_roi_align") +def meta_ps_roi_align(input, rois, spatial_scale, pooled_height, pooled_width, sampling_ratio): + torch._check(rois.size(1) == 5, lambda: "rois must have shape as Tensor[K, 5]") + torch._check( + input.dtype == rois.dtype, + lambda: ( + "Expected tensor for input to have the same type as tensor for rois; " + f"but type {input.dtype} does not equal {rois.dtype}" + ), + ) + channels = input.size(1) + torch._check( + channels % (pooled_height * pooled_width) == 0, + "input channels must be a multiple of pooling height * pooling width", + ) + + num_rois = rois.size(0) + out_size = (num_rois, channels // (pooled_height * pooled_width), pooled_height, pooled_width) + return input.new_empty(out_size), torch.empty(out_size, dtype=torch.int32, device="meta") + + +@register_meta("_ps_roi_align_backward") +def meta_ps_roi_align_backward( + grad, + rois, + channel_mapping, + spatial_scale, + pooled_height, + pooled_width, + sampling_ratio, + batch_size, + channels, + height, + width, +): + torch._check( + grad.dtype == rois.dtype, + lambda: ( + "Expected tensor for grad to have the same type as tensor for rois; " + f"but type {grad.dtype} does not equal {rois.dtype}" + ), + ) + return grad.new_empty((batch_size, channels, height, width)) + + +@register_meta("roi_pool") +def meta_roi_pool(input, rois, spatial_scale, pooled_height, pooled_width): + torch._check(rois.size(1) == 5, lambda: "rois must have shape as Tensor[K, 5]") + torch._check( + input.dtype == rois.dtype, + lambda: ( + "Expected tensor for input to have the same type as tensor for rois; " + f"but type {input.dtype} does not equal {rois.dtype}" + ), + ) + num_rois = rois.size(0) + channels = input.size(1) + out_size = (num_rois, channels, pooled_height, pooled_width) + return input.new_empty(out_size), torch.empty(out_size, device="meta", dtype=torch.int32) + + +@register_meta("_roi_pool_backward") +def meta_roi_pool_backward( + grad, rois, argmax, spatial_scale, pooled_height, pooled_width, batch_size, channels, height, width +): + torch._check( + grad.dtype == rois.dtype, + lambda: ( + "Expected tensor for grad to have the same type as tensor for rois; " + f"but type {grad.dtype} does not equal {rois.dtype}" + ), + ) + return grad.new_empty((batch_size, channels, height, width)) + + +@register_meta("ps_roi_pool") +def meta_ps_roi_pool(input, rois, spatial_scale, pooled_height, pooled_width): + torch._check(rois.size(1) == 5, lambda: "rois must have shape as Tensor[K, 5]") + torch._check( + input.dtype == rois.dtype, + lambda: ( + "Expected tensor for input to have the same type as tensor for rois; " + f"but type {input.dtype} does not equal {rois.dtype}" + ), + ) + channels = input.size(1) + torch._check( + channels % (pooled_height * pooled_width) == 0, + "input channels must be a multiple of pooling height * pooling width", + ) + num_rois = rois.size(0) + out_size = (num_rois, channels // (pooled_height * pooled_width), pooled_height, pooled_width) + return input.new_empty(out_size), torch.empty(out_size, device="meta", dtype=torch.int32) + + +@register_meta("_ps_roi_pool_backward") +def meta_ps_roi_pool_backward( + grad, rois, channel_mapping, spatial_scale, pooled_height, pooled_width, batch_size, channels, height, width +): + torch._check( + grad.dtype == rois.dtype, + lambda: ( + "Expected tensor for grad to have the same type as tensor for rois; " + f"but type {grad.dtype} does not equal {rois.dtype}" + ), + ) + return grad.new_empty((batch_size, channels, height, width)) + + +@torch.library.register_fake("torchvision::nms") +def meta_nms(dets, scores, iou_threshold): + torch._check(dets.dim() == 2, lambda: f"boxes should be a 2d tensor, got {dets.dim()}D") + torch._check(dets.size(1) == 4, lambda: f"boxes should have 4 elements in dimension 1, got {dets.size(1)}") + torch._check(scores.dim() == 1, lambda: f"scores should be a 1d tensor, got {scores.dim()}") + torch._check( + dets.size(0) == scores.size(0), + lambda: f"boxes and scores should have same number of elements in dimension 0, got {dets.size(0)} and {scores.size(0)}", + ) + ctx = torch._custom_ops.get_ctx() + num_to_keep = ctx.create_unbacked_symint() + return dets.new_empty(num_to_keep, dtype=torch.long) + + +@register_meta("deform_conv2d") +def meta_deform_conv2d( + input, + weight, + offset, + mask, + bias, + stride_h, + stride_w, + pad_h, + pad_w, + dil_h, + dil_w, + n_weight_grps, + n_offset_grps, + use_mask, +): + + out_height, out_width = offset.shape[-2:] + out_channels = weight.shape[0] + batch_size = input.shape[0] + return input.new_empty((batch_size, out_channels, out_height, out_width)) + + +@register_meta("_deform_conv2d_backward") +def meta_deform_conv2d_backward( + grad, + input, + weight, + offset, + mask, + bias, + stride_h, + stride_w, + pad_h, + pad_w, + dilation_h, + dilation_w, + groups, + offset_groups, + use_mask, +): + + grad_input = input.new_empty(input.shape) + grad_weight = weight.new_empty(weight.shape) + grad_offset = offset.new_empty(offset.shape) + grad_mask = mask.new_empty(mask.shape) + grad_bias = bias.new_empty(bias.shape) + return grad_input, grad_weight, grad_offset, grad_mask, grad_bias diff --git a/torchvision/_utils.py b/torchvision/_utils.py new file mode 100644 index 0000000000000000000000000000000000000000..b739ef0966e9b6fac4574f3d6f04051799f75a16 --- /dev/null +++ b/torchvision/_utils.py @@ -0,0 +1,32 @@ +import enum +from typing import Sequence, Type, TypeVar + +T = TypeVar("T", bound=enum.Enum) + + +class StrEnumMeta(enum.EnumMeta): + auto = enum.auto + + def from_str(self: Type[T], member: str) -> T: # type: ignore[misc] + try: + return self[member] + except KeyError: + # TODO: use `add_suggestion` from torchvision.prototype.utils._internal to improve the error message as + # soon as it is migrated. + raise ValueError(f"Unknown value '{member}' for {self.__name__}.") from None + + +class StrEnum(enum.Enum, metaclass=StrEnumMeta): + pass + + +def sequence_to_str(seq: Sequence, separate_last: str = "") -> str: + if not seq: + return "" + if len(seq) == 1: + return f"'{seq[0]}'" + + head = "'" + "', '".join([str(item) for item in seq[:-1]]) + "'" + tail = f"{'' if separate_last and len(seq) == 2 else ','} {separate_last}'{seq[-1]}'" + + return head + tail diff --git a/torchvision/csrc/io/decoder/audio_sampler.cpp b/torchvision/csrc/io/decoder/audio_sampler.cpp index 421e503b2cea4f6f5b81bdad19573aa31e11c703..d46b93ddc692c720481936f41f906242c291edf8 100644 --- a/torchvision/csrc/io/decoder/audio_sampler.cpp +++ b/torchvision/csrc/io/decoder/audio_sampler.cpp @@ -48,6 +48,23 @@ bool AudioSampler::init(const SamplerParameters& params) { return false; } +#if LIBAVUTIL_VERSION_INT >= AV_VERSION_INT(57, 28, 100) + SwrContext* swrContext_ = NULL; + AVChannelLayout channel_out; + AVChannelLayout channel_in; + av_channel_layout_default(&channel_out, params.out.audio.channels); + av_channel_layout_default(&channel_in, params.in.audio.channels); + int ret = swr_alloc_set_opts2( + &swrContext_, + &channel_out, + (AVSampleFormat)params.out.audio.format, + params.out.audio.samples, + &channel_in, + (AVSampleFormat)params.in.audio.format, + params.in.audio.samples, + 0, + logCtx_); +#else swrContext_ = swr_alloc_set_opts( nullptr, av_get_default_channel_layout(params.out.audio.channels), @@ -58,6 +75,7 @@ bool AudioSampler::init(const SamplerParameters& params) { params.in.audio.samples, 0, logCtx_); +#endif if (swrContext_ == nullptr) { LOG(ERROR) << "Cannot allocate SwrContext"; return false; @@ -65,7 +83,7 @@ bool AudioSampler::init(const SamplerParameters& params) { int result; if ((result = swr_init(swrContext_)) < 0) { - LOG(ERROR) << "swr_init faield, err: " << Util::generateErrorDesc(result) + LOG(ERROR) << "swr_init failed, err: " << Util::generateErrorDesc(result) << ", in -> format: " << params.in.audio.format << ", channels: " << params.in.audio.channels << ", samples: " << params.in.audio.samples @@ -116,12 +134,12 @@ int AudioSampler::sample( outNumSamples, inPlanes, inNumSamples)) < 0) { - LOG(ERROR) << "swr_convert faield, err: " + LOG(ERROR) << "swr_convert failed, err: " << Util::generateErrorDesc(result); return result; } - CHECK_LE(result, outNumSamples); + TORCH_CHECK_LE(result, outNumSamples); if (result) { if ((result = av_samples_get_buffer_size( @@ -132,7 +150,7 @@ int AudioSampler::sample( 1)) >= 0) { out->append(result); } else { - LOG(ERROR) << "av_samples_get_buffer_size faield, err: " + LOG(ERROR) << "av_samples_get_buffer_size failed, err: " << Util::generateErrorDesc(result); } } @@ -140,7 +158,7 @@ int AudioSampler::sample( // allocate a temporary buffer auto* tmpBuffer = static_cast(av_malloc(outBufferBytes)); if (!tmpBuffer) { - LOG(ERROR) << "av_alloc faield, for size: " << outBufferBytes; + LOG(ERROR) << "av_alloc failed, for size: " << outBufferBytes; return -1; } @@ -158,7 +176,7 @@ int AudioSampler::sample( outNumSamples, inPlanes, inNumSamples)) < 0) { - LOG(ERROR) << "swr_convert faield, err: " + LOG(ERROR) << "swr_convert failed, err: " << Util::generateErrorDesc(result); av_free(tmpBuffer); return result; @@ -166,7 +184,7 @@ int AudioSampler::sample( av_free(tmpBuffer); - CHECK_LE(result, outNumSamples); + TORCH_CHECK_LE(result, outNumSamples); if (result) { result = av_samples_get_buffer_size( diff --git a/torchvision/csrc/io/decoder/audio_stream.cpp b/torchvision/csrc/io/decoder/audio_stream.cpp index 9d66e589bf319a4266113d1503c0fc79aeefa6b6..9d7354e02f5dec30e169b210152a41a3d97b5a37 100644 --- a/torchvision/csrc/io/decoder/audio_stream.cpp +++ b/torchvision/csrc/io/decoder/audio_stream.cpp @@ -6,26 +6,36 @@ namespace ffmpeg { namespace { +static int get_nb_channels(const AVFrame* frame, const AVCodecContext* codec) { +#if LIBAVUTIL_VERSION_INT >= AV_VERSION_INT(57, 28, 100) + return frame ? frame->ch_layout.nb_channels : codec->ch_layout.nb_channels; +#else + return frame ? frame->channels : codec->channels; +#endif +} + bool operator==(const AudioFormat& x, const AVFrame& y) { - return x.samples == y.sample_rate && x.channels == y.channels && + return x.samples == static_cast(y.sample_rate) && + x.channels == static_cast(get_nb_channels(&y, nullptr)) && x.format == y.format; } bool operator==(const AudioFormat& x, const AVCodecContext& y) { - return x.samples == y.sample_rate && x.channels == y.channels && + return x.samples == static_cast(y.sample_rate) && + x.channels == static_cast(get_nb_channels(nullptr, &y)) && x.format == y.sample_fmt; } AudioFormat& toAudioFormat(AudioFormat& x, const AVFrame& y) { x.samples = y.sample_rate; - x.channels = y.channels; + x.channels = get_nb_channels(&y, nullptr); x.format = y.format; return x; } AudioFormat& toAudioFormat(AudioFormat& x, const AVCodecContext& y) { x.samples = y.sample_rate; - x.channels = y.channels; + x.channels = get_nb_channels(nullptr, &y); x.format = y.sample_fmt; return x; } @@ -54,9 +64,15 @@ int AudioStream::initFormat() { if (format_.format.audio.samples == 0) { format_.format.audio.samples = codecCtx_->sample_rate; } +#if LIBAVUTIL_VERSION_INT >= AV_VERSION_INT(57, 28, 100) + if (format_.format.audio.channels == 0) { + format_.format.audio.channels = codecCtx_->ch_layout.nb_channels; + } +#else if (format_.format.audio.channels == 0) { format_.format.audio.channels = codecCtx_->channels; } +#endif if (format_.format.audio.format == AV_SAMPLE_FMT_NONE) { format_.format.audio.format = codecCtx_->sample_fmt; } @@ -68,6 +84,7 @@ int AudioStream::initFormat() { : -1; } +// copies audio sample bytes via swr_convert call in audio_sampler.cpp int AudioStream::copyFrameBytes(ByteStorage* out, bool flush) { if (!sampler_) { sampler_ = std::make_unique(codecCtx_); @@ -95,6 +112,8 @@ int AudioStream::copyFrameBytes(ByteStorage* out, bool flush) { << ", channels: " << format_.format.audio.channels << ", format: " << format_.format.audio.format; } + // calls to a sampler that converts the audio samples and copies them to the + // out buffer via ffmpeg::swr_convert return sampler_->sample(flush ? nullptr : frame_, out); } diff --git a/torchvision/csrc/io/decoder/decoder.cpp b/torchvision/csrc/io/decoder/decoder.cpp index 6c9a3cdf825a573d5a9aab516284df66b0df15b3..e95e4a3aea58e4cdfcd662aa25541ef3854481ae 100644 --- a/torchvision/csrc/io/decoder/decoder.cpp +++ b/torchvision/csrc/io/decoder/decoder.cpp @@ -1,5 +1,6 @@ #include "decoder.h" #include +#include #include #include #include @@ -17,25 +18,6 @@ constexpr size_t kIoBufferSize = 96 * 1024; constexpr size_t kIoPaddingSize = AV_INPUT_BUFFER_PADDING_SIZE; constexpr size_t kLogBufferSize = 1024; -int ffmpeg_lock(void** mutex, enum AVLockOp op) { - std::mutex** handle = (std::mutex**)mutex; - switch (op) { - case AV_LOCK_CREATE: - *handle = new std::mutex(); - break; - case AV_LOCK_OBTAIN: - (*handle)->lock(); - break; - case AV_LOCK_RELEASE: - (*handle)->unlock(); - break; - case AV_LOCK_DESTROY: - delete *handle; - break; - } - return 0; -} - bool mapFfmpegType(AVMediaType media, MediaType* type) { switch (media) { case AVMEDIA_TYPE_AUDIO: @@ -196,11 +178,11 @@ int64_t Decoder::seekCallback(int64_t offset, int whence) { void Decoder::initOnce() { static std::once_flag flagInit; std::call_once(flagInit, []() { +#if LIBAVUTIL_VERSION_MAJOR < 56 // Before FFMPEG 4.0 av_register_all(); avcodec_register_all(); +#endif avformat_network_init(); - // register ffmpeg lock manager - av_lockmgr_register(&ffmpeg_lock); av_log_set_callback(Decoder::logFunction); av_log_set_level(AV_LOG_ERROR); VLOG(1) << "Registered ffmpeg libs"; @@ -215,6 +197,12 @@ Decoder::~Decoder() { cleanUp(); } +// Initialise the format context that holds information about the container and +// fill it with minimal information about the format (codecs are not opened +// here). Function reads in information about the streams from the container +// into inputCtx and then passes it to decoder::openStreams. Finally, if seek is +// specified within the decoder parameters, it seeks into the correct frame +// (note, the seek defined here is "precise" seek). bool Decoder::init( const DecoderParameters& params, DecoderInCallback&& in, @@ -268,7 +256,7 @@ bool Decoder::init( break; } - fmt = av_find_input_format(fmtName); + fmt = (AVInputFormat*)av_find_input_format(fmtName); } const size_t avioCtxBufferSize = kIoBufferSize; @@ -324,6 +312,8 @@ bool Decoder::init( } } + av_dict_set_int(&options, "probesize", params_.probeSize, 0); + interrupted_ = false; // ffmpeg avformat_open_input call can hang if media source doesn't respond @@ -381,7 +371,7 @@ bool Decoder::init( cleanUp(); return false; } - + // SyncDecoder inherits Decoder which would override onInit. onInit(); if (params.startOffset != 0) { @@ -396,11 +386,17 @@ bool Decoder::init( return true; } +// open appropriate CODEC for every type of stream and move it to the class +// variable `streams_` and make sure it is in range for decoding bool Decoder::openStreams(std::vector* metadata) { - for (int i = 0; i < inputCtx_->nb_streams; i++) { + for (unsigned int i = 0; i < inputCtx_->nb_streams; i++) { // - find the corespondent format at params_.formats set MediaFormat format; +#if LIBAVUTIL_VERSION_MAJOR < 56 // Before FFMPEG 4.0 const auto media = inputCtx_->streams[i]->codec->codec_type; +#else // FFMPEG 4.0+ + const auto media = inputCtx_->streams[i]->codecpar->codec_type; +#endif if (!mapFfmpegType(media, &format.type)) { VLOG(1) << "Stream media: " << media << " at index " << i << " gets ignored, unknown type"; @@ -424,20 +420,20 @@ bool Decoder::openStreams(std::vector* metadata) { if (it->stream == -2 || // all streams of this type are welcome (!stream && (it->stream == -1 || it->stream == i))) { // new stream VLOG(1) << "Stream type: " << format.type << " found, at index: " << i; - auto stream = createStream( + auto stream_2 = createStream( format.type, inputCtx_, i, params_.convertPtsToWallTime, it->format, params_.loggingUuid); - CHECK(stream); - if (stream->openCodec(metadata) < 0) { + CHECK(stream_2); + if (stream_2->openCodec(metadata, params_.numThreads) < 0) { LOG(ERROR) << "uuid=" << params_.loggingUuid << " open codec failed, stream_idx=" << i; return false; } - streams_.emplace(i, std::move(stream)); + streams_.emplace(i, std::move(stream_2)); inRange_.set(i, true); } } @@ -478,6 +474,10 @@ void Decoder::cleanUp() { seekableBuffer_.shutdown(); } +// function does actual work, derived class calls it in working thread +// periodically. On success method returns 0, ENODATA on EOF, ETIMEDOUT if +// no frames got decoded in the specified timeout time, AVERROR_BUFFER_TOO_SMALL +// when unable to allocate packet and error on unrecoverable error int Decoder::getFrame(size_t workingTimeInMs) { if (inRange_.none()) { return ENODATA; @@ -486,10 +486,16 @@ int Decoder::getFrame(size_t workingTimeInMs) { // once decode() method gets called and grab some bytes // run this method again // init package - AVPacket avPacket; - av_init_packet(&avPacket); - avPacket.data = nullptr; - avPacket.size = 0; + // update 03/22: moving memory management to ffmpeg + AVPacket* avPacket; + avPacket = av_packet_alloc(); + if (avPacket == nullptr) { + LOG(ERROR) << "uuid=" << params_.loggingUuid + << " decoder as not able to allocate the packet."; + return AVERROR_BUFFER_TOO_SMALL; + } + avPacket->data = nullptr; + avPacket->size = 0; auto end = std::chrono::steady_clock::now() + std::chrono::milliseconds(workingTimeInMs); @@ -501,28 +507,44 @@ int Decoder::getFrame(size_t workingTimeInMs) { int result = 0; size_t decodingErrors = 0; bool decodedFrame = false; - while (!interrupted_ && inRange_.any() && !decodedFrame && watcher()) { - result = av_read_frame(inputCtx_, &avPacket); + while (!interrupted_ && inRange_.any() && !decodedFrame) { + if (watcher() == false) { + LOG(ERROR) << "uuid=" << params_.loggingUuid << " hit ETIMEDOUT"; + result = ETIMEDOUT; + break; + } + result = av_read_frame(inputCtx_, avPacket); if (result == AVERROR(EAGAIN)) { VLOG(4) << "Decoder is busy..."; std::this_thread::yield(); result = 0; // reset error, EAGAIN is not an error at all + // reset the packet to default settings + av_packet_unref(avPacket); continue; } else if (result == AVERROR_EOF) { flushStreams(); VLOG(1) << "End of stream"; result = ENODATA; break; + } else if ( + result == AVERROR(EPERM) && params_.skipOperationNotPermittedPackets) { + // reset error, lets skip packets with EPERM + result = 0; + // reset the packet to default settings + av_packet_unref(avPacket); + continue; } else if (result < 0) { flushStreams(); - LOG(ERROR) << "Error detected: " << Util::generateErrorDesc(result); + LOG(ERROR) << "uuid=" << params_.loggingUuid + << " error detected: " << Util::generateErrorDesc(result); break; } - // get stream - auto stream = findByIndex(avPacket.stream_index); + // get stream; if stream cannot be found reset the packet to + // default settings + auto stream = findByIndex(avPacket->stream_index); if (stream == nullptr || !inRange_.test(stream->getIndex())) { - av_packet_unref(&avPacket); + av_packet_unref(avPacket); continue; } @@ -533,9 +555,10 @@ int Decoder::getFrame(size_t workingTimeInMs) { bool gotFrame = false; bool hasMsg = false; // packet either got consumed completely or not at all - if ((result = processPacket(stream, &avPacket, &gotFrame, &hasMsg)) < 0) { + if ((result = processPacket( + stream, avPacket, &gotFrame, &hasMsg, params_.fastSeek)) < 0) { LOG(ERROR) << "uuid=" << params_.loggingUuid - << " processPacket failed with code=" << result; + << " processPacket failed with code: " << result; break; } @@ -566,20 +589,18 @@ int Decoder::getFrame(size_t workingTimeInMs) { result = 0; - av_packet_unref(&avPacket); + av_packet_unref(avPacket); } - av_packet_unref(&avPacket); - + av_packet_free(&avPacket); VLOG(2) << "Interrupted loop" << ", interrupted_ " << interrupted_ << ", inRange_.any() " << inRange_.any() << ", decodedFrame " << decodedFrame << ", result " << result; // loop can be terminated, either by: - // 1. explcitly iterrupted - // 2. terminated by workable timeout - // 3. unrecoverable error or ENODATA (end of stream) + // 1. explicitly interrupted + // 3. unrecoverable error or ENODATA (end of stream) or ETIMEDOUT (timeout) // 4. decoded frames pts are out of the specified range // 5. success decoded frame if (interrupted_) { @@ -594,11 +615,13 @@ int Decoder::getFrame(size_t workingTimeInMs) { return 0; } +// find stream by stream index Stream* Decoder::findByIndex(int streamIndex) const { auto it = streams_.find(streamIndex); return it != streams_.end() ? it->second.get() : nullptr; } +// find stream by type; note finds only the first stream of a given type Stream* Decoder::findByType(const MediaFormat& format) const { for (auto& stream : streams_) { if (stream.second->getMediaFormat().type == format.type) { @@ -608,11 +631,14 @@ Stream* Decoder::findByType(const MediaFormat& format) const { return nullptr; } +// given the stream and packet, decode the frame buffers into the +// DecoderOutputMessage data structure via stream::decodePacket function. int Decoder::processPacket( Stream* stream, AVPacket* packet, bool* gotFrame, - bool* hasMsg) { + bool* hasMsg, + bool fastSeek) { // decode package int result; DecoderOutputMessage msg; @@ -625,7 +651,15 @@ int Decoder::processPacket( bool endInRange = params_.endOffset <= 0 || msg.header.pts <= params_.endOffset; inRange_.set(stream->getIndex(), endInRange); - if (endInRange && msg.header.pts >= params_.startOffset) { + // if fastseek is enabled, we're returning the first + // frame that we decode after (potential) seek. + // By default, we perform accurate seek to the closest + // following frame + bool startCondition = true; + if (!fastSeek) { + startCondition = msg.header.pts >= params_.startOffset; + } + if (endInRange && startCondition) { *hasMsg = true; push(std::move(msg)); } diff --git a/torchvision/csrc/io/decoder/decoder.h b/torchvision/csrc/io/decoder/decoder.h index c2d8f163bc30faccbf0bbb751cb77fcc53f360d2..44d6676aa6b5f29dc2db68a13ea9ae7fbcd2f27e 100644 --- a/torchvision/csrc/io/decoder/decoder.h +++ b/torchvision/csrc/io/decoder/decoder.h @@ -59,11 +59,11 @@ class Decoder : public MediaDecoder { private: // mark below function for a proper invocation - virtual bool enableLogLevel(int level) const; - virtual void logCallback(int level, const std::string& message); - virtual int readCallback(uint8_t* buf, int size); - virtual int64_t seekCallback(int64_t offset, int whence); - virtual int shutdownCallback(); + bool enableLogLevel(int level) const; + void logCallback(int level, const std::string& message); + int readCallback(uint8_t* buf, int size); + int64_t seekCallback(int64_t offset, int whence); + int shutdownCallback(); bool openStreams(std::vector* metadata); Stream* findByIndex(int streamIndex) const; @@ -72,7 +72,8 @@ class Decoder : public MediaDecoder { Stream* stream, AVPacket* packet, bool* gotFrame, - bool* hasMsg); + bool* hasMsg, + bool fastSeek = false); void flushStreams(); void cleanUp(); diff --git a/torchvision/csrc/io/decoder/defs.h b/torchvision/csrc/io/decoder/defs.h index b828934bdf0e3b9779649cb185ac65b2547941df..6be50f8abc2dc1bd7e10d279f267c67542a585e7 100644 --- a/torchvision/csrc/io/decoder/defs.h +++ b/torchvision/csrc/io/decoder/defs.h @@ -165,7 +165,7 @@ struct MediaFormat { struct DecoderParameters { // local file, remote file, http url, rtmp stream uri, etc. anything that // ffmpeg can recognize - std::string uri; + std::string uri{std::string()}; // timeout on getting bytes for decoding size_t timeoutMs{1000}; // logging level, default AV_LOG_PANIC @@ -190,10 +190,15 @@ struct DecoderParameters { bool listen{false}; // don't copy frame body, only header bool headerOnly{false}; + // enable fast seek (seek only to keyframes) + bool fastSeek{false}; // interrupt init method on timeout bool preventStaleness{true}; // seek tolerated accuracy (us) double seekAccuracy{1000000.0}; + // Allow multithreaded decoding for numThreads > 1; + // 0 numThreads=0 sets up sensible defaults + int numThreads{1}; // what media types should be processed, default none std::set formats; @@ -205,6 +210,15 @@ struct DecoderParameters { std::string tlsCertFile; std::string tlsKeyFile; + + // Skip packets that fail with EPERM errors and continue decoding. + bool skipOperationNotPermittedPackets{false}; + + // probing size in bytes, i.e. the size of the data to analyze to get stream + // information. A higher value will enable detecting more information in case + // it is dispersed into the stream, but will increase latency. Must be an + // integer not lesser than 32. It is 5000000 by default. + int64_t probeSize{5000000}; }; struct DecoderHeader { @@ -287,7 +301,7 @@ struct DecoderMetadata { }; /** * Abstract class for decoding media bytes - * It has two diffrent modes. Internal media bytes retrieval for given uri and + * It has two different modes. Internal media bytes retrieval for given uri and * external media bytes provider in case of memory streams */ class MediaDecoder { diff --git a/torchvision/csrc/io/decoder/gpu/README.rst b/torchvision/csrc/io/decoder/gpu/README.rst new file mode 100644 index 0000000000000000000000000000000000000000..cebd31cb55724690dc2a3b08bfce957b59c87d63 --- /dev/null +++ b/torchvision/csrc/io/decoder/gpu/README.rst @@ -0,0 +1,21 @@ +GPU Decoder +=========== + +GPU decoder depends on ffmpeg for demuxing, uses NVDECODE APIs from the nvidia-video-codec sdk and uses cuda for processing on gpu. In order to use this, please follow the following steps: + +* Download the latest `nvidia-video-codec-sdk `_ +* Extract the zipped file. +* Set TORCHVISION_INCLUDE environment variable to the location of the video codec headers(`nvcuvid.h` and `cuviddec.h`), which would be under `Interface` directory. +* Set TORCHVISION_LIBRARY environment variable to the location of the video codec library(`libnvcuvid.so`), which would be under `Lib/linux/stubs/x86_64` directory. +* Install the latest ffmpeg from `conda-forge` channel. + +.. code:: bash + + conda install -c conda-forge ffmpeg + +* Set CUDA_HOME environment variable to the cuda root directory. +* Build torchvision from source: + +.. code:: bash + + python setup.py install diff --git a/torchvision/csrc/io/decoder/gpu/decoder.cpp b/torchvision/csrc/io/decoder/gpu/decoder.cpp new file mode 100644 index 0000000000000000000000000000000000000000..22cce7f87abab979648cbec34c5387e18501edc9 --- /dev/null +++ b/torchvision/csrc/io/decoder/gpu/decoder.cpp @@ -0,0 +1,404 @@ +#include "decoder.h" +#include +#include +#include +#include +#include + +static float chroma_height_factor(cudaVideoSurfaceFormat surface_format) { + return (surface_format == cudaVideoSurfaceFormat_YUV444 || + surface_format == cudaVideoSurfaceFormat_YUV444_16Bit) + ? 1.0 + : 0.5; +} + +static int chroma_plane_count(cudaVideoSurfaceFormat surface_format) { + return (surface_format == cudaVideoSurfaceFormat_YUV444 || + surface_format == cudaVideoSurfaceFormat_YUV444_16Bit) + ? 2 + : 1; +} + +/* Initialise cu_context and video_codec, create context lock and create parser + * object. + */ +void Decoder::init(CUcontext context, cudaVideoCodec codec) { + cu_context = context; + video_codec = codec; + check_for_cuda_errors( + cuvidCtxLockCreate(&ctx_lock, cu_context), __LINE__, __FILE__); + + CUVIDPARSERPARAMS parser_params = {}; + parser_params.CodecType = codec; + parser_params.ulMaxNumDecodeSurfaces = 1; + parser_params.ulClockRate = 1000; + parser_params.ulMaxDisplayDelay = 0u; + parser_params.pUserData = this; + parser_params.pfnSequenceCallback = video_sequence_handler; + parser_params.pfnDecodePicture = picture_decode_handler; + parser_params.pfnDisplayPicture = picture_display_handler; + parser_params.pfnGetOperatingPoint = operating_point_handler; + + check_for_cuda_errors( + cuvidCreateVideoParser(&parser, &parser_params), __LINE__, __FILE__); +} + +/* Destroy parser object and context lock. + */ +Decoder::~Decoder() { + if (parser) { + cuvidDestroyVideoParser(parser); + } + cuvidCtxLockDestroy(ctx_lock); +} + +/* Destroy CUvideodecoder object and free up all the unreturned decoded frames. + */ +void Decoder::release() { + cuCtxPushCurrent(cu_context); + if (decoder) { + cuvidDestroyDecoder(decoder); + } + cuCtxPopCurrent(nullptr); +} + +/* Trigger video decoding. + */ +void Decoder::decode(const uint8_t* data, unsigned long size) { + CUVIDSOURCEDATAPACKET pkt = {}; + pkt.flags = CUVID_PKT_TIMESTAMP; + pkt.payload_size = size; + pkt.payload = data; + pkt.timestamp = 0; + if (!data || size == 0) { + pkt.flags |= CUVID_PKT_ENDOFSTREAM; + } + check_for_cuda_errors(cuvidParseVideoData(parser, &pkt), __LINE__, __FILE__); + cuvidStream = 0; +} + +/* Fetch a decoded frame and remove it from the queue. + */ +torch::Tensor Decoder::fetch_frame() { + if (decoded_frames.empty()) { + auto options = + torch::TensorOptions().dtype(torch::kU8).device(torch::kCUDA); + return torch::zeros({0}, options); + } + torch::Tensor frame = decoded_frames.front(); + decoded_frames.pop(); + return frame; +} + +/* Called when a picture is ready to be decoded. + */ +int Decoder::handle_picture_decode(CUVIDPICPARAMS* pic_params) { + if (!decoder) { + TORCH_CHECK(false, "Uninitialised decoder"); + } + pic_num_in_decode_order[pic_params->CurrPicIdx] = decode_pic_count++; + check_for_cuda_errors(cuCtxPushCurrent(cu_context), __LINE__, __FILE__); + check_for_cuda_errors( + cuvidDecodePicture(decoder, pic_params), __LINE__, __FILE__); + check_for_cuda_errors(cuCtxPopCurrent(nullptr), __LINE__, __FILE__); + return 1; +} + +/* Process the decoded data and copy it to a cuda memory location. + */ +int Decoder::handle_picture_display(CUVIDPARSERDISPINFO* disp_info) { + CUVIDPROCPARAMS proc_params = {}; + proc_params.progressive_frame = disp_info->progressive_frame; + proc_params.second_field = disp_info->repeat_first_field + 1; + proc_params.top_field_first = disp_info->top_field_first; + proc_params.unpaired_field = disp_info->repeat_first_field < 0; + proc_params.output_stream = cuvidStream; + + CUdeviceptr source_frame = 0; + unsigned int source_pitch = 0; + check_for_cuda_errors(cuCtxPushCurrent(cu_context), __LINE__, __FILE__); + check_for_cuda_errors( + cuvidMapVideoFrame( + decoder, + disp_info->picture_index, + &source_frame, + &source_pitch, + &proc_params), + __LINE__, + __FILE__); + + CUVIDGETDECODESTATUS decode_status; + memset(&decode_status, 0, sizeof(decode_status)); + CUresult result = + cuvidGetDecodeStatus(decoder, disp_info->picture_index, &decode_status); + if (result == CUDA_SUCCESS && + (decode_status.decodeStatus == cuvidDecodeStatus_Error || + decode_status.decodeStatus == cuvidDecodeStatus_Error_Concealed)) { + VLOG(1) << "Decode Error occurred for picture " + << pic_num_in_decode_order[disp_info->picture_index]; + } + + auto options = torch::TensorOptions().dtype(torch::kU8).device(torch::kCUDA); + torch::Tensor decoded_frame = torch::empty({get_height(), width, 3}, options); + uint8_t* frame_ptr = decoded_frame.data_ptr(); + const uint8_t* const source_arr[] = { + (const uint8_t* const)source_frame, + (const uint8_t* const)(source_frame + source_pitch * ((surface_height + 1) & ~1))}; + + auto err = nppiNV12ToRGB_709CSC_8u_P2C3R( + source_arr, + source_pitch, + frame_ptr, + width * 3, + {(int)decoded_frame.size(1), (int)decoded_frame.size(0)}); + + TORCH_CHECK( + err == NPP_NO_ERROR, + "Failed to convert from NV12 to RGB. Error code:", + err); + + check_for_cuda_errors(cuStreamSynchronize(cuvidStream), __LINE__, __FILE__); + decoded_frames.push(decoded_frame); + check_for_cuda_errors(cuCtxPopCurrent(nullptr), __LINE__, __FILE__); + + check_for_cuda_errors( + cuvidUnmapVideoFrame(decoder, source_frame), __LINE__, __FILE__); + return 1; +} + +/* Query the capabilities of the underlying hardware video decoder and + * verify if the hardware supports decoding the passed video. + */ +void Decoder::query_hardware(CUVIDEOFORMAT* video_format) { + CUVIDDECODECAPS decode_caps = {}; + decode_caps.eCodecType = video_format->codec; + decode_caps.eChromaFormat = video_format->chroma_format; + decode_caps.nBitDepthMinus8 = video_format->bit_depth_luma_minus8; + + check_for_cuda_errors(cuCtxPushCurrent(cu_context), __LINE__, __FILE__); + check_for_cuda_errors(cuvidGetDecoderCaps(&decode_caps), __LINE__, __FILE__); + check_for_cuda_errors(cuCtxPopCurrent(nullptr), __LINE__, __FILE__); + + if (!decode_caps.bIsSupported) { + TORCH_CHECK(false, "Codec not supported on this GPU"); + } + if ((video_format->coded_width > decode_caps.nMaxWidth) || + (video_format->coded_height > decode_caps.nMaxHeight)) { + TORCH_CHECK( + false, + "Resolution : ", + video_format->coded_width, + "x", + video_format->coded_height, + "\nMax Supported (wxh) : ", + decode_caps.nMaxWidth, + "x", + decode_caps.nMaxHeight, + "\nResolution not supported on this GPU"); + } + if ((video_format->coded_width >> 4) * (video_format->coded_height >> 4) > + decode_caps.nMaxMBCount) { + TORCH_CHECK( + false, + "MBCount : ", + (video_format->coded_width >> 4) * (video_format->coded_height >> 4), + "\nMax Supported mbcnt : ", + decode_caps.nMaxMBCount, + "\nMBCount not supported on this GPU"); + } + // Check if output format supported. If not, check fallback options + if (!(decode_caps.nOutputFormatMask & (1 << video_output_format))) { + if (decode_caps.nOutputFormatMask & (1 << cudaVideoSurfaceFormat_NV12)) { + video_output_format = cudaVideoSurfaceFormat_NV12; + } else if ( + decode_caps.nOutputFormatMask & (1 << cudaVideoSurfaceFormat_P016)) { + video_output_format = cudaVideoSurfaceFormat_P016; + } else if ( + decode_caps.nOutputFormatMask & (1 << cudaVideoSurfaceFormat_YUV444)) { + video_output_format = cudaVideoSurfaceFormat_YUV444; + } else if ( + decode_caps.nOutputFormatMask & + (1 << cudaVideoSurfaceFormat_YUV444_16Bit)) { + video_output_format = cudaVideoSurfaceFormat_YUV444_16Bit; + } else { + TORCH_CHECK(false, "No supported output format found"); + } + } +} + +/* Called before decoding frames and/or whenever there is a configuration + * change. + */ +int Decoder::handle_video_sequence(CUVIDEOFORMAT* video_format) { + // video_codec has been set in init(). Here it's set + // again for potential correction. + video_codec = video_format->codec; + video_chroma_format = video_format->chroma_format; + bit_depth_minus8 = video_format->bit_depth_luma_minus8; + bytes_per_pixel = bit_depth_minus8 > 0 ? 2 : 1; + // Set the output surface format same as chroma format + switch (video_chroma_format) { + case cudaVideoChromaFormat_Monochrome: + case cudaVideoChromaFormat_420: + video_output_format = video_format->bit_depth_luma_minus8 + ? cudaVideoSurfaceFormat_P016 + : cudaVideoSurfaceFormat_NV12; + break; + case cudaVideoChromaFormat_444: + video_output_format = video_format->bit_depth_luma_minus8 + ? cudaVideoSurfaceFormat_YUV444_16Bit + : cudaVideoSurfaceFormat_YUV444; + break; + case cudaVideoChromaFormat_422: + video_output_format = cudaVideoSurfaceFormat_NV12; + } + + query_hardware(video_format); + + if (width && luma_height && chroma_height) { + // cuvidCreateDecoder() has been called before and now there's possible + // config change. + return reconfigure_decoder(video_format); + } + + cu_video_format = *video_format; + unsigned long decode_surface = video_format->min_num_decode_surfaces; + cudaVideoDeinterlaceMode deinterlace_mode = cudaVideoDeinterlaceMode_Adaptive; + + if (video_format->progressive_sequence) { + deinterlace_mode = cudaVideoDeinterlaceMode_Weave; + } + + CUVIDDECODECREATEINFO video_decode_create_info = {}; + video_decode_create_info.ulWidth = video_format->coded_width; + video_decode_create_info.ulHeight = video_format->coded_height; + video_decode_create_info.ulNumDecodeSurfaces = decode_surface; + video_decode_create_info.CodecType = video_format->codec; + video_decode_create_info.ChromaFormat = video_format->chroma_format; + // With PreferCUVID, JPEG is still decoded by CUDA while video is decoded + // by NVDEC hardware + video_decode_create_info.ulCreationFlags = cudaVideoCreate_PreferCUVID; + video_decode_create_info.bitDepthMinus8 = video_format->bit_depth_luma_minus8; + video_decode_create_info.OutputFormat = video_output_format; + video_decode_create_info.DeinterlaceMode = deinterlace_mode; + video_decode_create_info.ulNumOutputSurfaces = 2; + video_decode_create_info.vidLock = ctx_lock; + + // AV1 has max width/height of sequence in sequence header + if (video_format->codec == cudaVideoCodec_AV1 && + video_format->seqhdr_data_length > 0) { + CUVIDEOFORMATEX* video_format_ex = (CUVIDEOFORMATEX*)video_format; + max_width = video_format_ex->av1.max_width; + max_height = video_format_ex->av1.max_height; + } + if (max_width < video_format->coded_width) { + max_width = video_format->coded_width; + } + if (max_height < video_format->coded_height) { + max_height = video_format->coded_height; + } + video_decode_create_info.ulMaxWidth = max_width; + video_decode_create_info.ulMaxHeight = max_height; + width = video_format->display_area.right - video_format->display_area.left; + luma_height = + video_format->display_area.bottom - video_format->display_area.top; + video_decode_create_info.ulTargetWidth = video_format->coded_width; + video_decode_create_info.ulTargetHeight = video_format->coded_height; + chroma_height = + (int)(ceil(luma_height * chroma_height_factor(video_output_format))); + num_chroma_planes = chroma_plane_count(video_output_format); + surface_height = video_decode_create_info.ulTargetHeight; + surface_width = video_decode_create_info.ulTargetWidth; + display_rect.bottom = video_decode_create_info.display_area.bottom; + display_rect.top = video_decode_create_info.display_area.top; + display_rect.left = video_decode_create_info.display_area.left; + display_rect.right = video_decode_create_info.display_area.right; + + check_for_cuda_errors(cuCtxPushCurrent(cu_context), __LINE__, __FILE__); + check_for_cuda_errors( + cuvidCreateDecoder(&decoder, &video_decode_create_info), + __LINE__, + __FILE__); + check_for_cuda_errors(cuCtxPopCurrent(nullptr), __LINE__, __FILE__); + return decode_surface; +} + +int Decoder::reconfigure_decoder(CUVIDEOFORMAT* video_format) { + if (video_format->bit_depth_luma_minus8 != + cu_video_format.bit_depth_luma_minus8 || + video_format->bit_depth_chroma_minus8 != + cu_video_format.bit_depth_chroma_minus8) { + TORCH_CHECK(false, "Reconfigure not supported for bit depth change"); + } + if (video_format->chroma_format != cu_video_format.chroma_format) { + TORCH_CHECK(false, "Reconfigure not supported for chroma format change"); + } + + bool decode_res_change = + !(video_format->coded_width == cu_video_format.coded_width && + video_format->coded_height == cu_video_format.coded_height); + bool display_rect_change = + !(video_format->display_area.bottom == + cu_video_format.display_area.bottom && + video_format->display_area.top == cu_video_format.display_area.top && + video_format->display_area.left == cu_video_format.display_area.left && + video_format->display_area.right == cu_video_format.display_area.right); + + unsigned int decode_surface = video_format->min_num_decode_surfaces; + + if ((video_format->coded_width > max_width) || + (video_format->coded_height > max_height)) { + // For VP9, let driver handle the change if new width/height > + // maxwidth/maxheight + if (video_codec != cudaVideoCodec_VP9) { + TORCH_CHECK( + false, + "Reconfigure not supported when width/height > maxwidth/maxheight"); + } + return 1; + } + + if (!decode_res_change) { + // If the coded_width/coded_height hasn't changed but display resolution has + // changed, then need to update width/height for correct output without + // cropping. Example : 1920x1080 vs 1920x1088. + if (display_rect_change) { + width = + video_format->display_area.right - video_format->display_area.left; + luma_height = + video_format->display_area.bottom - video_format->display_area.top; + chroma_height = + (int)ceil(luma_height * chroma_height_factor(video_output_format)); + num_chroma_planes = chroma_plane_count(video_output_format); + } + return 1; + } + cu_video_format.coded_width = video_format->coded_width; + cu_video_format.coded_height = video_format->coded_height; + CUVIDRECONFIGUREDECODERINFO reconfig_params = {}; + reconfig_params.ulWidth = video_format->coded_width; + reconfig_params.ulHeight = video_format->coded_height; + reconfig_params.ulTargetWidth = surface_width; + reconfig_params.ulTargetHeight = surface_height; + reconfig_params.ulNumDecodeSurfaces = decode_surface; + reconfig_params.display_area.bottom = display_rect.bottom; + reconfig_params.display_area.top = display_rect.top; + reconfig_params.display_area.left = display_rect.left; + reconfig_params.display_area.right = display_rect.right; + + check_for_cuda_errors(cuCtxPushCurrent(cu_context), __LINE__, __FILE__); + check_for_cuda_errors( + cuvidReconfigureDecoder(decoder, &reconfig_params), __LINE__, __FILE__); + check_for_cuda_errors(cuCtxPopCurrent(nullptr), __LINE__, __FILE__); + + return decode_surface; +} + +/* Called from AV1 sequence header to get operating point of an AV1 bitstream. + */ +int Decoder::get_operating_point(CUVIDOPERATINGPOINTINFO* oper_point_info) { + return oper_point_info->codec == cudaVideoCodec_AV1 && + oper_point_info->av1.operating_points_cnt > 1 + ? 0 + : -1; +} diff --git a/torchvision/csrc/io/decoder/gpu/decoder.h b/torchvision/csrc/io/decoder/gpu/decoder.h new file mode 100644 index 0000000000000000000000000000000000000000..5ad685ec746ee4b4e426b6a768e2079eb6282545 --- /dev/null +++ b/torchvision/csrc/io/decoder/gpu/decoder.h @@ -0,0 +1,89 @@ +#include +#include +#include +#include +#include +#include +#include + +static auto check_for_cuda_errors = + [](CUresult result, int line_num, std::string file_name) { + if (CUDA_SUCCESS != result) { + const char* error_name = nullptr; + + TORCH_CHECK( + CUDA_SUCCESS != cuGetErrorName(result, &error_name), + "CUDA error: ", + error_name, + " in ", + file_name, + " at line ", + line_num) + TORCH_CHECK( + false, "Error: ", result, " in ", file_name, " at line ", line_num); + } + }; + +struct Rect { + int left, top, right, bottom; +}; + +class Decoder { + public: + Decoder() {} + ~Decoder(); + void init(CUcontext, cudaVideoCodec); + void release(); + void decode(const uint8_t*, unsigned long); + torch::Tensor fetch_frame(); + int get_height() const { + return luma_height; + } + + private: + unsigned int width = 0, luma_height = 0, chroma_height = 0; + unsigned int surface_height = 0, surface_width = 0; + unsigned int max_width = 0, max_height = 0; + unsigned int num_chroma_planes = 0; + int bit_depth_minus8 = 0, bytes_per_pixel = 1; + int decode_pic_count = 0, pic_num_in_decode_order[32]; + std::queue decoded_frames; + CUcontext cu_context = NULL; + CUvideoctxlock ctx_lock; + CUvideoparser parser = NULL; + CUvideodecoder decoder = NULL; + CUstream cuvidStream = 0; + cudaVideoCodec video_codec = cudaVideoCodec_NumCodecs; + cudaVideoChromaFormat video_chroma_format = cudaVideoChromaFormat_420; + cudaVideoSurfaceFormat video_output_format = cudaVideoSurfaceFormat_NV12; + CUVIDEOFORMAT cu_video_format = {}; + Rect display_rect = {}; + + static int video_sequence_handler( + void* user_data, + CUVIDEOFORMAT* video_format) { + return ((Decoder*)user_data)->handle_video_sequence(video_format); + } + static int picture_decode_handler( + void* user_data, + CUVIDPICPARAMS* pic_params) { + return ((Decoder*)user_data)->handle_picture_decode(pic_params); + } + static int picture_display_handler( + void* user_data, + CUVIDPARSERDISPINFO* disp_info) { + return ((Decoder*)user_data)->handle_picture_display(disp_info); + } + static int operating_point_handler( + void* user_data, + CUVIDOPERATINGPOINTINFO* operating_info) { + return ((Decoder*)user_data)->get_operating_point(operating_info); + } + + void query_hardware(CUVIDEOFORMAT*); + int reconfigure_decoder(CUVIDEOFORMAT*); + int handle_video_sequence(CUVIDEOFORMAT*); + int handle_picture_decode(CUVIDPICPARAMS*); + int handle_picture_display(CUVIDPARSERDISPINFO*); + int get_operating_point(CUVIDOPERATINGPOINTINFO*); +}; diff --git a/torchvision/csrc/io/decoder/gpu/demuxer.h b/torchvision/csrc/io/decoder/gpu/demuxer.h new file mode 100644 index 0000000000000000000000000000000000000000..f6e72dceee186f09eba1b01025c9639bf3733bdb --- /dev/null +++ b/torchvision/csrc/io/decoder/gpu/demuxer.h @@ -0,0 +1,257 @@ +extern "C" { +#include +#include +#include +#include +} + +class Demuxer { + private: + AVFormatContext* fmtCtx = NULL; + AVBSFContext* bsfCtx = NULL; + AVPacket pkt, pktFiltered; + AVCodecID eVideoCodec; + uint8_t* dataWithHeader = NULL; + bool bMp4H264, bMp4HEVC, bMp4MPEG4; + unsigned int frameCount = 0; + int iVideoStream; + double timeBase = 0.0; + + public: + Demuxer(const char* filePath) { + avformat_network_init(); + TORCH_CHECK( + 0 <= avformat_open_input(&fmtCtx, filePath, NULL, NULL), + "avformat_open_input() failed at line ", + __LINE__, + " in demuxer.h\n"); + if (!fmtCtx) { + TORCH_CHECK( + false, + "Encountered NULL AVFormatContext at line ", + __LINE__, + " in demuxer.h\n"); + } + + TORCH_CHECK( + 0 <= avformat_find_stream_info(fmtCtx, NULL), + "avformat_find_stream_info() failed at line ", + __LINE__, + " in demuxer.h\n"); + iVideoStream = + av_find_best_stream(fmtCtx, AVMEDIA_TYPE_VIDEO, -1, -1, NULL, 0); + if (iVideoStream < 0) { + TORCH_CHECK( + false, + "av_find_best_stream() failed at line ", + __LINE__, + " in demuxer.h\n"); + } + + eVideoCodec = fmtCtx->streams[iVideoStream]->codecpar->codec_id; + AVRational rTimeBase = fmtCtx->streams[iVideoStream]->time_base; + timeBase = av_q2d(rTimeBase); + + bMp4H264 = eVideoCodec == AV_CODEC_ID_H264 && + (!strcmp(fmtCtx->iformat->long_name, "QuickTime / MOV") || + !strcmp(fmtCtx->iformat->long_name, "FLV (Flash Video)") || + !strcmp(fmtCtx->iformat->long_name, "Matroska / WebM")); + bMp4HEVC = eVideoCodec == AV_CODEC_ID_HEVC && + (!strcmp(fmtCtx->iformat->long_name, "QuickTime / MOV") || + !strcmp(fmtCtx->iformat->long_name, "FLV (Flash Video)") || + !strcmp(fmtCtx->iformat->long_name, "Matroska / WebM")); + bMp4MPEG4 = eVideoCodec == AV_CODEC_ID_MPEG4 && + (!strcmp(fmtCtx->iformat->long_name, "QuickTime / MOV") || + !strcmp(fmtCtx->iformat->long_name, "FLV (Flash Video)") || + !strcmp(fmtCtx->iformat->long_name, "Matroska / WebM")); + + av_init_packet(&pkt); + pkt.data = NULL; + pkt.size = 0; + av_init_packet(&pktFiltered); + pktFiltered.data = NULL; + pktFiltered.size = 0; + + if (bMp4H264) { + const AVBitStreamFilter* bsf = av_bsf_get_by_name("h264_mp4toannexb"); + if (!bsf) { + TORCH_CHECK( + false, + "av_bsf_get_by_name() failed at line ", + __LINE__, + " in demuxer.h\n"); + } + TORCH_CHECK( + 0 <= av_bsf_alloc(bsf, &bsfCtx), + "av_bsf_alloc() failed at line ", + __LINE__, + " in demuxer.h\n"); + avcodec_parameters_copy( + bsfCtx->par_in, fmtCtx->streams[iVideoStream]->codecpar); + TORCH_CHECK( + 0 <= av_bsf_init(bsfCtx), + "av_bsf_init() failed at line ", + __LINE__, + " in demuxer.h\n"); + } + if (bMp4HEVC) { + const AVBitStreamFilter* bsf = av_bsf_get_by_name("hevc_mp4toannexb"); + if (!bsf) { + TORCH_CHECK( + false, + "av_bsf_get_by_name() failed at line ", + __LINE__, + " in demuxer.h\n"); + } + TORCH_CHECK( + 0 <= av_bsf_alloc(bsf, &bsfCtx), + "av_bsf_alloc() failed at line ", + __LINE__, + " in demuxer.h\n"); + avcodec_parameters_copy( + bsfCtx->par_in, fmtCtx->streams[iVideoStream]->codecpar); + TORCH_CHECK( + 0 <= av_bsf_init(bsfCtx), + "av_bsf_init() failed at line ", + __LINE__, + " in demuxer.h\n"); + } + } + + ~Demuxer() { + if (!fmtCtx) { + return; + } + if (pkt.data) { + av_packet_unref(&pkt); + } + if (pktFiltered.data) { + av_packet_unref(&pktFiltered); + } + if (bsfCtx) { + av_bsf_free(&bsfCtx); + } + avformat_close_input(&fmtCtx); + if (dataWithHeader) { + av_free(dataWithHeader); + } + } + + AVCodecID get_video_codec() { + return eVideoCodec; + } + + double get_duration() const { + return (double)fmtCtx->duration / AV_TIME_BASE; + } + + double get_fps() const { + return av_q2d(fmtCtx->streams[iVideoStream]->r_frame_rate); + } + + bool demux(uint8_t** video, unsigned long* videoBytes) { + if (!fmtCtx) { + return false; + } + *videoBytes = 0; + + if (pkt.data) { + av_packet_unref(&pkt); + } + int e = 0; + while ((e = av_read_frame(fmtCtx, &pkt)) >= 0 && + pkt.stream_index != iVideoStream) { + av_packet_unref(&pkt); + } + if (e < 0) { + return false; + } + + if (bMp4H264 || bMp4HEVC) { + if (pktFiltered.data) { + av_packet_unref(&pktFiltered); + } + TORCH_CHECK( + 0 <= av_bsf_send_packet(bsfCtx, &pkt), + "av_bsf_send_packet() failed at line ", + __LINE__, + " in demuxer.h\n"); + TORCH_CHECK( + 0 <= av_bsf_receive_packet(bsfCtx, &pktFiltered), + "av_bsf_receive_packet() failed at line ", + __LINE__, + " in demuxer.h\n"); + *video = pktFiltered.data; + *videoBytes = pktFiltered.size; + } else { + if (bMp4MPEG4 && (frameCount == 0)) { + int extraDataSize = + fmtCtx->streams[iVideoStream]->codecpar->extradata_size; + + if (extraDataSize > 0) { + dataWithHeader = (uint8_t*)av_malloc( + extraDataSize + pkt.size - 3 * sizeof(uint8_t)); + if (!dataWithHeader) { + TORCH_CHECK( + false, + "av_malloc() failed at line ", + __LINE__, + " in demuxer.h\n"); + } + memcpy( + dataWithHeader, + fmtCtx->streams[iVideoStream]->codecpar->extradata, + extraDataSize); + memcpy( + dataWithHeader + extraDataSize, + pkt.data + 3, + pkt.size - 3 * sizeof(uint8_t)); + *video = dataWithHeader; + *videoBytes = extraDataSize + pkt.size - 3 * sizeof(uint8_t); + } + } else { + *video = pkt.data; + *videoBytes = pkt.size; + } + } + frameCount++; + return true; + } + + void seek(double timestamp, int flag) { + int64_t time = timestamp * AV_TIME_BASE; + TORCH_CHECK( + 0 <= av_seek_frame(fmtCtx, -1, time, flag), + "av_seek_frame() failed at line ", + __LINE__, + " in demuxer.h\n"); + } +}; + +inline cudaVideoCodec ffmpeg_to_codec(AVCodecID id) { + switch (id) { + case AV_CODEC_ID_MPEG1VIDEO: + return cudaVideoCodec_MPEG1; + case AV_CODEC_ID_MPEG2VIDEO: + return cudaVideoCodec_MPEG2; + case AV_CODEC_ID_MPEG4: + return cudaVideoCodec_MPEG4; + case AV_CODEC_ID_WMV3: + case AV_CODEC_ID_VC1: + return cudaVideoCodec_VC1; + case AV_CODEC_ID_H264: + return cudaVideoCodec_H264; + case AV_CODEC_ID_HEVC: + return cudaVideoCodec_HEVC; + case AV_CODEC_ID_VP8: + return cudaVideoCodec_VP8; + case AV_CODEC_ID_VP9: + return cudaVideoCodec_VP9; + case AV_CODEC_ID_MJPEG: + return cudaVideoCodec_JPEG; + case AV_CODEC_ID_AV1: + return cudaVideoCodec_AV1; + default: + return cudaVideoCodec_NumCodecs; + } +} diff --git a/torchvision/csrc/io/decoder/gpu/gpu_decoder.cpp b/torchvision/csrc/io/decoder/gpu/gpu_decoder.cpp new file mode 100644 index 0000000000000000000000000000000000000000..1fe3ec8ab7ab2fb378923b099f6c1af05d0d36f5 --- /dev/null +++ b/torchvision/csrc/io/decoder/gpu/gpu_decoder.cpp @@ -0,0 +1,65 @@ +#include "gpu_decoder.h" +#include + +/* Set cuda device, create cuda context and initialise the demuxer and decoder. + */ +GPUDecoder::GPUDecoder(std::string src_file, torch::Device dev) + : demuxer(src_file.c_str()) { + at::cuda::CUDAGuard device_guard(dev); + device = device_guard.current_device().index(); + check_for_cuda_errors( + cuDevicePrimaryCtxRetain(&ctx, device), __LINE__, __FILE__); + decoder.init(ctx, ffmpeg_to_codec(demuxer.get_video_codec())); + initialised = true; +} + +GPUDecoder::~GPUDecoder() { + at::cuda::CUDAGuard device_guard(device); + decoder.release(); + if (initialised) { + check_for_cuda_errors( + cuDevicePrimaryCtxRelease(device), __LINE__, __FILE__); + } +} + +/* Fetch a decoded frame tensor after demuxing and decoding. + */ +torch::Tensor GPUDecoder::decode() { + torch::Tensor frameTensor; + unsigned long videoBytes = 0; + uint8_t* video = nullptr; + at::cuda::CUDAGuard device_guard(device); + torch::Tensor frame; + do { + demuxer.demux(&video, &videoBytes); + decoder.decode(video, videoBytes); + frame = decoder.fetch_frame(); + } while (frame.numel() == 0 && videoBytes > 0); + return frame; +} + +/* Seek to a passed timestamp. The second argument controls whether to seek to a + * keyframe. + */ +void GPUDecoder::seek(double timestamp, bool keyframes_only) { + int flag = keyframes_only ? 0 : AVSEEK_FLAG_ANY; + demuxer.seek(timestamp, flag); +} + +c10::Dict> GPUDecoder:: + get_metadata() const { + c10::Dict> metadata; + c10::Dict video_metadata; + video_metadata.insert("duration", demuxer.get_duration()); + video_metadata.insert("fps", demuxer.get_fps()); + metadata.insert("video", video_metadata); + return metadata; +} + +TORCH_LIBRARY(torchvision, m) { + m.class_("GPUDecoder") + .def(torch::init()) + .def("seek", &GPUDecoder::seek) + .def("get_metadata", &GPUDecoder::get_metadata) + .def("next", &GPUDecoder::decode); +} diff --git a/torchvision/csrc/io/decoder/gpu/gpu_decoder.h b/torchvision/csrc/io/decoder/gpu/gpu_decoder.h new file mode 100644 index 0000000000000000000000000000000000000000..22bf680a98283b549d346bb9fce98a577e0e7791 --- /dev/null +++ b/torchvision/csrc/io/decoder/gpu/gpu_decoder.h @@ -0,0 +1,20 @@ +#include +#include +#include "decoder.h" +#include "demuxer.h" + +class GPUDecoder : public torch::CustomClassHolder { + public: + GPUDecoder(std::string, torch::Device); + ~GPUDecoder(); + torch::Tensor decode(); + void seek(double, bool); + c10::Dict> get_metadata() const; + + private: + Demuxer demuxer; + CUcontext ctx; + Decoder decoder; + int64_t device; + bool initialised = false; +}; diff --git a/torchvision/csrc/io/decoder/memory_buffer.cpp b/torchvision/csrc/io/decoder/memory_buffer.cpp index a7b0128e3edecfa3b18bc3730a8e75e384d2738a..4e420c3b3cd685e8fbda2fd84f6f9256dbfc2229 100644 --- a/torchvision/csrc/io/decoder/memory_buffer.cpp +++ b/torchvision/csrc/io/decoder/memory_buffer.cpp @@ -61,7 +61,7 @@ DecoderInCallback MemoryBuffer::getCallback( } // seek mode if (!timeoutMs) { - // seek capabilty, yes - supported + // seek capability, yes - supported return 0; } return object.seek(size, whence); diff --git a/torchvision/csrc/io/decoder/stream.cpp b/torchvision/csrc/io/decoder/stream.cpp index 37dd5805d5a08e79526e6ac1bb7b0fb67e839c6c..8c91405058704113c5499b241d196e10acf36309 100644 --- a/torchvision/csrc/io/decoder/stream.cpp +++ b/torchvision/csrc/io/decoder/stream.cpp @@ -1,5 +1,7 @@ #include "stream.h" #include +#include +#include #include "util.h" namespace ffmpeg { @@ -24,11 +26,16 @@ Stream::~Stream() { } } +// look up the proper CODEC querying the function AVCodec* Stream::findCodec(AVCodecParameters* params) { - return avcodec_find_decoder(params->codec_id); + return (AVCodec*)avcodec_find_decoder(params->codec_id); } -int Stream::openCodec(std::vector* metadata) { +// Allocate memory for the AVCodecContext, which will hold the context for +// decode/encode process. Then fill this codec context with CODEC parameters +// defined in stream parameters. Open the codec, and allocate the global frame +// defined in the header file +int Stream::openCodec(std::vector* metadata, int num_threads) { AVStream* steam = inputCtx_->streams[format_.stream]; AVCodec* codec = findCodec(steam->codecpar); @@ -44,6 +51,21 @@ int Stream::openCodec(std::vector* metadata) { << ", avcodec_alloc_context3 failed"; return AVERROR(ENOMEM); } + // multithreading heuristics + // if user defined, + if (num_threads > max_threads) { + num_threads = max_threads; + } + + if (num_threads > 0) { + // if user defined, respect that + // note that default thread_type will be used + codecCtx_->thread_count = num_threads; + } else { + // otherwise set sensible defaults + codecCtx_->thread_count = 8; + codecCtx_->thread_type = FF_THREAD_SLICE; + } int ret; // Copy codec parameters from input stream to output codec context @@ -93,6 +115,9 @@ int Stream::openCodec(std::vector* metadata) { return ret; } +// send the raw data packet (compressed frame) to the decoder, through the codec +// context and receive the raw data frame (uncompressed frame) from the +// decoder, through the same codec context int Stream::analyzePacket(const AVPacket* packet, bool* gotFrame) { int consumed = 0; int result = avcodec_send_packet(codecCtx_, packet); @@ -134,6 +159,9 @@ int Stream::analyzePacket(const AVPacket* packet, bool* gotFrame) { return consumed; } +// General decoding function: +// given the packet, analyse the metadata, and write the +// metadata and the buffer to the DecoderOutputImage. int Stream::decodePacket( const AVPacket* packet, DecoderOutputMessage* out, @@ -167,6 +195,9 @@ int Stream::flush(DecoderOutputMessage* out, bool headerOnly) { return 1; } +// Sets the header and payload via stream::setHeader and copyFrameBytes +// functions that are defined in type stream subclass (VideoStream, AudioStream, +// ...) int Stream::getMessage(DecoderOutputMessage* out, bool flush, bool headerOnly) { if (flush) { // only flush of audio frames makes sense diff --git a/torchvision/csrc/io/decoder/stream.h b/torchvision/csrc/io/decoder/stream.h index 97dfa8b57610d2c5bb45eea5cb1ea74236ea3bef..6250dd9ecd2a0e4586fc1a32acf0e7cdd4a72cb7 100644 --- a/torchvision/csrc/io/decoder/stream.h +++ b/torchvision/csrc/io/decoder/stream.h @@ -20,7 +20,9 @@ class Stream { virtual ~Stream(); // returns 0 - on success or negative error - int openCodec(std::vector* metadata); + // num_threads sets up the codec context for multithreading if needed + // default is set to single thread in order to not break BC + int openCodec(std::vector* metadata, int num_threads = 1); // returns 1 - if packet got consumed, 0 - if it's not, and < 0 on error int decodePacket( const AVPacket* packet, @@ -69,6 +71,10 @@ class Stream { // estimated next frame pts for flushing the last frame int64_t nextPts_{0}; double fps_{30.}; + // this is a dumb conservative limit; ideally we'd use + // int max_threads = at::get_num_threads(); but this would cause + // fb sync to fail as it would add dependency to ATen to the decoder API + const int max_threads = 12; }; } // namespace ffmpeg diff --git a/torchvision/csrc/io/decoder/subtitle_stream.cpp b/torchvision/csrc/io/decoder/subtitle_stream.cpp index 0d3fc9f12c12c6c191de8aeac4549427f9e06daa..27c61d4dbd9f80c4c1f41545b0fcf570a43cfc8a 100644 --- a/torchvision/csrc/io/decoder/subtitle_stream.cpp +++ b/torchvision/csrc/io/decoder/subtitle_stream.cpp @@ -43,21 +43,34 @@ int SubtitleStream::initFormat() { int SubtitleStream::analyzePacket(const AVPacket* packet, bool* gotFrame) { // clean-up releaseSubtitle(); + + // FIXME: should this even be created? + AVPacket* avPacket; + avPacket = av_packet_alloc(); + if (avPacket == nullptr) { + LOG(ERROR) + << "decoder as not able to allocate the subtitle-specific packet."; + // alternative to ENOMEM + return AVERROR_BUFFER_TOO_SMALL; + } + avPacket->data = nullptr; + avPacket->size = 0; // check flush packet - AVPacket avPacket; - av_init_packet(&avPacket); - avPacket.data = nullptr; - avPacket.size = 0; - auto pkt = packet ? *packet : avPacket; + auto pkt = packet ? packet : avPacket; + int gotFramePtr = 0; - int result = avcodec_decode_subtitle2(codecCtx_, &sub_, &gotFramePtr, &pkt); + // is these a better way than cast from const? + int result = + avcodec_decode_subtitle2(codecCtx_, &sub_, &gotFramePtr, (AVPacket*)pkt); if (result < 0) { LOG(ERROR) << "avcodec_decode_subtitle2 failed, err: " << Util::generateErrorDesc(result); + // free the packet we've created + av_packet_free(&avPacket); return result; } else if (result == 0) { - result = pkt.size; // discard the rest of the package + result = pkt->size; // discard the rest of the package } sub_.release = gotFramePtr; @@ -66,9 +79,10 @@ int SubtitleStream::analyzePacket(const AVPacket* packet, bool* gotFrame) { // set proper pts in us if (gotFramePtr) { sub_.pts = av_rescale_q( - pkt.pts, inputCtx_->streams[format_.stream]->time_base, timeBaseQ); + pkt->pts, inputCtx_->streams[format_.stream]->time_base, timeBaseQ); } + av_packet_free(&avPacket); return result; } diff --git a/torchvision/csrc/io/decoder/sync_decoder.cpp b/torchvision/csrc/io/decoder/sync_decoder.cpp index 374b40838ea13e7bc25b98878a0e23576f764fc5..1f03ef8eb950c898920be587efc8dbaf10160fd9 100644 --- a/torchvision/csrc/io/decoder/sync_decoder.cpp +++ b/torchvision/csrc/io/decoder/sync_decoder.cpp @@ -19,17 +19,17 @@ void SyncDecoder::AVByteStorage::ensure(size_t n) { } uint8_t* SyncDecoder::AVByteStorage::writableTail() { - CHECK_LE(offset_ + length_, capacity_); + TORCH_CHECK_LE(offset_ + length_, capacity_); return buffer_ + offset_ + length_; } void SyncDecoder::AVByteStorage::append(size_t n) { - CHECK_LE(n, tail()); + TORCH_CHECK_LE(n, tail()); length_ += n; } void SyncDecoder::AVByteStorage::trim(size_t n) { - CHECK_LE(n, length_); + TORCH_CHECK_LE(n, length_); offset_ += n; length_ -= n; } @@ -43,7 +43,7 @@ size_t SyncDecoder::AVByteStorage::length() const { } size_t SyncDecoder::AVByteStorage::tail() const { - CHECK_LE(offset_ + length_, capacity_); + TORCH_CHECK_LE(offset_ + length_, capacity_); return capacity_ - offset_ - length_; } diff --git a/torchvision/csrc/io/decoder/sync_decoder_test.cpp b/torchvision/csrc/io/decoder/sync_decoder_test.cpp index 6109b12685e4f0dd1f0e92c7878420e1197bb14c..980725c2fcb43fdd6dee2b61ee230c93673f3de8 100644 --- a/torchvision/csrc/io/decoder/sync_decoder_test.cpp +++ b/torchvision/csrc/io/decoder/sync_decoder_test.cpp @@ -50,7 +50,8 @@ void gotFilesStats(std::vector& stats) { fseek(f, 0, SEEK_END); std::vector buffer(ftell(f)); rewind(f); - CHECK_EQ(buffer.size(), fread(buffer.data(), 1, buffer.size(), f)); + size_t s = fread(buffer.data(), 1, buffer.size(), f); + TORCH_CHECK_EQ(buffer.size(), s); fclose(f); for (size_t i = 0; i < rounds; ++i) { @@ -66,7 +67,7 @@ void gotFilesStats(std::vector& stats) { avgProvUs += std::chrono::duration_cast(then - now) .count(); - CHECK_EQ(metadata.size(), 1); + TORCH_CHECK_EQ(metadata.size(), 1); item.num = metadata[0].num; item.den = metadata[0].den; item.fps = metadata[0].fps; @@ -90,7 +91,8 @@ size_t measurePerformanceUs( fseek(f, 0, SEEK_END); std::vector buffer(ftell(f)); rewind(f); - CHECK_EQ(buffer.size(), fread(buffer.data(), 1, buffer.size(), f)); + size_t s = fread(buffer.data(), 1, buffer.size(), f); + TORCH_CHECK_EQ(buffer.size(), s); fclose(f); for (size_t i = 0; i < rounds; ++i) { @@ -324,7 +326,8 @@ TEST(SyncDecoder, TestMemoryBuffer) { fseek(f, 0, SEEK_END); std::vector buffer(ftell(f)); rewind(f); - CHECK_EQ(buffer.size(), fread(buffer.data(), 1, buffer.size(), f)); + size_t s = fread(buffer.data(), 1, buffer.size(), f); + TORCH_CHECK_EQ(buffer.size(), s); fclose(f); CHECK(decoder.init( params, @@ -349,7 +352,8 @@ TEST(SyncDecoder, TestMemoryBufferNoSeekableWithFullRead) { fseek(f, 0, SEEK_END); std::vector buffer(ftell(f)); rewind(f); - CHECK_EQ(buffer.size(), fread(buffer.data(), 1, buffer.size(), f)); + size_t s = fread(buffer.data(), 1, buffer.size(), f); + TORCH_CHECK_EQ(buffer.size(), s); fclose(f); params.maxSeekableBytes = buffer.size() + 1; @@ -364,7 +368,7 @@ TEST(SyncDecoder, TestMemoryBufferNoSeekableWithFullRead) { } // seek mode if (!timeoutMs) { - // seek capabilty, yes - no + // seek capability, yes - no return -1; } return object.seek(size, whence); @@ -388,7 +392,8 @@ TEST(SyncDecoder, TestMemoryBufferNoSeekableWithPartialRead) { fseek(f, 0, SEEK_END); std::vector buffer(ftell(f)); rewind(f); - CHECK_EQ(buffer.size(), fread(buffer.data(), 1, buffer.size(), f)); + size_t s = fread(buffer.data(), 1, buffer.size(), f); + TORCH_CHECK_EQ(buffer.size(), s); fclose(f); params.maxSeekableBytes = buffer.size() / 2; @@ -403,7 +408,7 @@ TEST(SyncDecoder, TestMemoryBufferNoSeekableWithPartialRead) { } // seek mode if (!timeoutMs) { - // seek capabilty, yes - no + // seek capability, yes - no return -1; } return object.seek(size, whence); diff --git a/torchvision/csrc/io/decoder/util.cpp b/torchvision/csrc/io/decoder/util.cpp index 658876ff600bc6f5972e4f6534bdfeee3360bc29..2ecd7512c064be529abec99f82ae189d4f78282b 100644 --- a/torchvision/csrc/io/decoder/util.cpp +++ b/torchvision/csrc/io/decoder/util.cpp @@ -265,7 +265,7 @@ std::string generateErrorDesc(int errorCode) { size_t serialize(const AVSubtitle& sub, ByteStorage* out) { const auto len = size(sub); - CHECK_LE(len, out->tail()); + TORCH_CHECK_LE(len, out->tail()); size_t pos = 0; if (!Serializer::serializeItem(out->writableTail(), len, pos, sub)) { return 0; diff --git a/torchvision/csrc/io/decoder/video_sampler.cpp b/torchvision/csrc/io/decoder/video_sampler.cpp index 5b9726b7c6c4e783cebb5ff41c433b665b0d822a..8b712609e3439cd6478968e7a5410a276cb9758b 100644 --- a/torchvision/csrc/io/decoder/video_sampler.cpp +++ b/torchvision/csrc/io/decoder/video_sampler.cpp @@ -7,6 +7,17 @@ namespace ffmpeg { namespace { + +// Setup the data pointers and linesizes based on the specified image +// parameters and the provided array. This sets up "planes" to point to a +// "buffer" +// NOTE: this is most likely culprit behind #3534 +// +// Args: +// fmt: desired output video format +// buffer: source constant image buffer (in different format) that will contain +// the final image after SWScale planes: destination data pointer to be filled +// lineSize: target destination linesize (always {0}) int preparePlanes( const VideoFormat& fmt, const uint8_t* buffer, @@ -14,6 +25,7 @@ int preparePlanes( int* lineSize) { int result; + // NOTE: 1 at the end of av_fill_arrays is the value used for alignment if ((result = av_image_fill_arrays( planes, lineSize, @@ -28,6 +40,18 @@ int preparePlanes( return result; } +// Scale (and crop) the image slice in srcSlice and put the resulting scaled +// slice to `planes` buffer, which is mapped to be `out` via preparePlanes as +// `sws_scale` cannot access buffers directly. +// +// Args: +// context: SWSContext allocated on line 119 (if crop, optional) or 163 (if +// scale) srcSlice: frame data in YUV420P srcStride: the array containing the +// strides for each plane of the source +// image (from AVFrame->linesize[0]) +// out: destination buffer +// planes: indirect destination buffer (mapped to "out" via preparePlanes) +// lines: destination linesize; constant {0} int transformImage( SwsContext* context, const uint8_t* const srcSlice[], @@ -41,12 +65,31 @@ int transformImage( if ((result = preparePlanes(outFormat, out, planes, lines)) < 0) { return result; } - - if ((result = sws_scale( - context, srcSlice, srcStride, 0, inFormat.height, planes, lines)) < - 0) { - LOG(ERROR) << "sws_scale failed, err: " << Util::generateErrorDesc(result); - return result; + if (context) { + // NOTE: srcY stride always 0: this is a parameter of YUV format + if ((result = sws_scale( + context, srcSlice, srcStride, 0, inFormat.height, planes, lines)) < + 0) { + LOG(ERROR) << "sws_scale failed, err: " + << Util::generateErrorDesc(result); + return result; + } + } else if ( + inFormat.width == outFormat.width && + inFormat.height == outFormat.height && + inFormat.format == outFormat.format) { + // Copy planes without using sws_scale if sws_getContext failed. + av_image_copy( + planes, + lines, + (const uint8_t**)srcSlice, + srcStride, + (AVPixelFormat)inFormat.format, + inFormat.width, + inFormat.height); + } else { + LOG(ERROR) << "Invalid scale context format " << inFormat.format; + return AVERROR(EINVAL); } return 0; } @@ -135,6 +178,26 @@ bool VideoSampler::init(const SamplerParameters& params) { << params.out.video.minDimension << ", cropImage " << params.out.video.cropImage; + // set output format + params_ = params; + + if (params.in.video.format == AV_PIX_FMT_YUV420P) { + /* When the video width and height are not multiples of 8, + * and there is no size change in the conversion, + * a blurry screen will appear on the right side + * This problem was discovered in 2012 and + * continues to exist in version 4.1.3 in 2019 + * This problem can be avoided by increasing SWS_ACCURATE_RND + * details https://trac.ffmpeg.org/ticket/1582 + */ + if ((params.in.video.width & 0x7) || (params.in.video.height & 0x7)) { + VLOG(1) << "The width " << params.in.video.width << " and height " + << params.in.video.height << " the image is not a multiple of 8, " + << "the decoding speed may be reduced"; + swsFlags_ |= SWS_ACCURATE_RND; + } + } + scaleContext_ = sws_getContext( params.in.video.width, params.in.video.height, @@ -146,13 +209,24 @@ bool VideoSampler::init(const SamplerParameters& params) { nullptr, nullptr, nullptr); - - // set output format - params_ = params; - + // sws_getContext might fail if in/out format == AV_PIX_FMT_PAL8 (png format) + // Return true if input and output formats/width/height are identical + // Check scaleContext_ for nullptr in transformImage to copy planes directly + + if (params.in.video.width == scaleFormat_.width && + params.in.video.height == scaleFormat_.height && + params.in.video.format == scaleFormat_.format) { + return true; + } return scaleContext_ != nullptr; } +// Main body of the sample function called from one of the overloads below +// +// Args: +// srcSlice: decoded AVFrame->data perpared buffer +// srcStride: linesize (usually obtained from AVFrame->linesize) +// out: return buffer (ByteStorage*) int VideoSampler::sample( const uint8_t* const srcSlice[], int srcStride[], @@ -221,6 +295,7 @@ int VideoSampler::sample( return outImageSize; } +// Call from `video_stream.cpp::114` - occurs during file reads int VideoSampler::sample(AVFrame* frame, ByteStorage* out) { if (!frame) { return 0; // no flush for videos @@ -229,6 +304,7 @@ int VideoSampler::sample(AVFrame* frame, ByteStorage* out) { return sample(frame->data, frame->linesize, out); } +// Call from `video_stream.cpp::114` - not sure when this occurs int VideoSampler::sample(const ByteStorage* in, ByteStorage* out) { if (!in) { return 0; // no flush for videos diff --git a/torchvision/csrc/io/decoder/video_stream.cpp b/torchvision/csrc/io/decoder/video_stream.cpp index a9e20434fe04297c4a970f40d603e7f41c139e2a..fa08c65cac1d99de8d2b5b2ae0b0a9b43588166f 100644 --- a/torchvision/csrc/io/decoder/video_stream.cpp +++ b/torchvision/csrc/io/decoder/video_stream.cpp @@ -6,11 +6,13 @@ namespace ffmpeg { namespace { bool operator==(const VideoFormat& x, const AVFrame& y) { - return x.width == y.width && x.height == y.height && x.format == y.format; + return x.width == static_cast(y.width) && + x.height == static_cast(y.height) && x.format == y.format; } bool operator==(const VideoFormat& x, const AVCodecContext& y) { - return x.width == y.width && x.height == y.height && x.format == y.pix_fmt; + return x.width == static_cast(y.width) && + x.height == static_cast(y.height) && x.format == y.pix_fmt; } VideoFormat& toVideoFormat(VideoFormat& x, const AVFrame& y) { @@ -80,6 +82,7 @@ int VideoStream::initFormat() { : -1; } +// copies frame bytes via sws_scale call in video_sampler.cpp int VideoStream::copyFrameBytes(ByteStorage* out, bool flush) { if (!sampler_) { sampler_ = std::make_unique(SWS_AREA, loggingUuid_); @@ -110,7 +113,9 @@ int VideoStream::copyFrameBytes(ByteStorage* out, bool flush) { << ", minDimension: " << format_.format.video.minDimension << ", crop: " << format_.format.video.cropImage; } - + // calls to a sampler that converts the frame from YUV422 to RGB24, and + // optionally crops and resizes the frame. Frame bytes are copied from + // frame_->data to out buffer return sampler_->sample(flush ? nullptr : frame_, out); } diff --git a/torchvision/csrc/io/image/cpu/decode_gif.cpp b/torchvision/csrc/io/image/cpu/decode_gif.cpp new file mode 100644 index 0000000000000000000000000000000000000000..183d42e86a4c2fd48f39aad709227ed17ee61cc0 --- /dev/null +++ b/torchvision/csrc/io/image/cpu/decode_gif.cpp @@ -0,0 +1,173 @@ +#include "decode_gif.h" +#include +#include "giflib/gif_lib.h" + +namespace vision { +namespace image { + +typedef struct reader_helper_t { + uint8_t const* encoded_data; // input tensor data pointer + size_t encoded_data_size; // size of input tensor in bytes + size_t num_bytes_read; // number of bytes read so far in the tensor +} reader_helper_t; + +// That function is used by GIFLIB routines to read the encoded bytes. +// This reads `len` bytes and writes them into `buf`. The data is read from the +// input tensor passed to decode_gif() starting at the `num_bytes_read` +// position. +int read_from_tensor(GifFileType* gifFile, GifByteType* buf, int len) { + // the UserData field was set in DGifOpen() + reader_helper_t* reader_helper = + static_cast(gifFile->UserData); + + size_t num_bytes_to_read = std::min( + (size_t)len, + reader_helper->encoded_data_size - reader_helper->num_bytes_read); + std::memcpy( + buf, reader_helper->encoded_data + reader_helper->num_bytes_read, len); + reader_helper->num_bytes_read += num_bytes_to_read; + return num_bytes_to_read; +} + +torch::Tensor decode_gif(const torch::Tensor& encoded_data) { + // LibGif docs: https://giflib.sourceforge.net/intro.html + // Refer over there for more details on the libgif API, API ref, and a + // detailed description of the GIF format. + + TORCH_CHECK(encoded_data.is_contiguous(), "Input tensor must be contiguous."); + TORCH_CHECK( + encoded_data.dtype() == torch::kU8, + "Input tensor must have uint8 data type, got ", + encoded_data.dtype()); + TORCH_CHECK( + encoded_data.dim() == 1, + "Input tensor must be 1-dimensional, got ", + encoded_data.dim(), + " dims."); + + int error = D_GIF_SUCCEEDED; + + // We're using DGidOpen. The other entrypoints of libgif are + // DGifOpenFileName and DGifOpenFileHandle but we don't want to use those, + // since we need to read the encoded bytes from a tensor of encoded bytes, not + // from a file (for consistency with existing jpeg and png decoders). Using + // DGifOpen is the only way to read from a custom source. + // For that we need to provide a reader function `read_from_tensor` that + // reads from the tensor, and we have to keep track of the number of bytes + // read so far: this is why we need the reader_helper struct. + + // TODO: We are potentially doing an unnecessary copy of the encoded bytes: + // - 1 copy in from file to tensor (in read_file()) + // - 1 copy from tensor to GIFLIB buffers (in read_from_tensor()) + // Since we're vendoring GIFLIB we can potentially modify the calls to + // InternalRead() and just set the `buf` pointer to the tensor data directly. + // That might even save allocation of those buffers. + // If we do that, we'd have to make sure the buffers are never written to by + // GIFLIB, otherwise we'd be overridding the tensor data. + reader_helper_t reader_helper; + reader_helper.encoded_data = encoded_data.data_ptr(); + reader_helper.encoded_data_size = encoded_data.numel(); + reader_helper.num_bytes_read = 0; + GifFileType* gifFile = + DGifOpen(static_cast(&reader_helper), read_from_tensor, &error); + + TORCH_CHECK( + (gifFile != nullptr) && (error == D_GIF_SUCCEEDED), + "DGifOpenFileName() failed - ", + error); + + if (DGifSlurp(gifFile) == GIF_ERROR) { + auto gifFileError = gifFile->Error; + DGifCloseFile(gifFile, &error); + TORCH_CHECK(false, "DGifSlurp() failed - ", gifFileError); + } + auto num_images = gifFile->ImageCount; + + // This check should already done within DGifSlurp(), just to be safe + TORCH_CHECK(num_images > 0, "GIF file should contain at least one image!"); + + GifColorType bg = {0, 0, 0}; + if (gifFile->SColorMap) { + bg = gifFile->SColorMap->Colors[gifFile->SBackGroundColor]; + } + + // The GIFLIB docs say that the canvas's height and width are potentially + // ignored by modern viewers, so to be on the safe side we set the output + // height to max(canvas_heigh, first_image_height). Same for width. + // https://giflib.sourceforge.net/whatsinagif/bits_and_bytes.html + auto out_h = + std::max(gifFile->SHeight, gifFile->SavedImages[0].ImageDesc.Height); + auto out_w = + std::max(gifFile->SWidth, gifFile->SavedImages[0].ImageDesc.Width); + + // We output a channels-last tensor for consistency with other image decoders. + // Torchvision's resize tends to be is faster on uint8 channels-last tensors. + auto options = torch::TensorOptions() + .dtype(torch::kU8) + .memory_format(torch::MemoryFormat::ChannelsLast); + auto out = torch::empty( + {int64_t(num_images), 3, int64_t(out_h), int64_t(out_w)}, options); + auto out_a = out.accessor(); + for (int i = 0; i < num_images; i++) { + const SavedImage& img = gifFile->SavedImages[i]; + + GraphicsControlBlock gcb; + DGifSavedExtensionToGCB(gifFile, i, &gcb); + + const GifImageDesc& desc = img.ImageDesc; + const ColorMapObject* cmap = + desc.ColorMap ? desc.ColorMap : gifFile->SColorMap; + TORCH_CHECK( + cmap != nullptr, + "Global and local color maps are missing. This should never happen!"); + + // When going from one image to another, there is a "disposal method" which + // specifies how to handle the transition. E.g. DISPOSE_DO_NOT means that + // the current image should essentially be drawn on top of the previous + // canvas. The pixels of that previous canvas will appear on the new one if + // either: + // - a pixel is transparent in the current image + // - the current image is smaller than the canvas, hence exposing its pixels + // The "background" disposal method means that the current canvas should be + // set to the background color. + // We only support these 2 modes and default to "background" when the + // disposal method is unspecified, or when it's set to "DISPOSE_PREVIOUS" + // which according to GIFLIB is not widely supported. + // (https://giflib.sourceforge.net/whatsinagif/animation_and_transparency.html). + if (i > 0 && gcb.DisposalMode == DISPOSE_DO_NOT) { + out[i] = out[i - 1]; + } else { + // Background. If bg wasn't defined, it will be (0, 0, 0) + for (int h = 0; h < gifFile->SHeight; h++) { + for (int w = 0; w < gifFile->SWidth; w++) { + out_a[i][0][h][w] = bg.Red; + out_a[i][1][h][w] = bg.Green; + out_a[i][2][h][w] = bg.Blue; + } + } + } + + for (int h = 0; h < desc.Height; h++) { + for (int w = 0; w < desc.Width; w++) { + auto c = img.RasterBits[h * desc.Width + w]; + if (c == gcb.TransparentColor) { + continue; + } + GifColorType rgb = cmap->Colors[c]; + out_a[i][0][h + desc.Top][w + desc.Left] = rgb.Red; + out_a[i][1][h + desc.Top][w + desc.Left] = rgb.Green; + out_a[i][2][h + desc.Top][w + desc.Left] = rgb.Blue; + } + } + } + + out = out.squeeze(0); // remove batch dim if there's only one image + + DGifCloseFile(gifFile, &error); + TORCH_CHECK(error == D_GIF_SUCCEEDED, "DGifCloseFile() failed - ", error); + + return out; +} + +} // namespace image +} // namespace vision diff --git a/torchvision/csrc/io/image/cpu/decode_gif.h b/torchvision/csrc/io/image/cpu/decode_gif.h new file mode 100644 index 0000000000000000000000000000000000000000..68d5073c91b46e39600281f69106441068984514 --- /dev/null +++ b/torchvision/csrc/io/image/cpu/decode_gif.h @@ -0,0 +1,12 @@ +#pragma once + +#include + +namespace vision { +namespace image { + +// encoded_data tensor must be 1D uint8 and contiguous +C10_EXPORT torch::Tensor decode_gif(const torch::Tensor& encoded_data); + +} // namespace image +} // namespace vision diff --git a/torchvision/csrc/io/image/cpu/decode_image.cpp b/torchvision/csrc/io/image/cpu/decode_image.cpp index 1cc05dc76cadcb563a777c444139799186d1977e..1f09da17597a4c3d78ee6d2ced4d3825b9d9cffe 100644 --- a/torchvision/csrc/io/image/cpu/decode_image.cpp +++ b/torchvision/csrc/io/image/cpu/decode_image.cpp @@ -1,12 +1,18 @@ #include "decode_image.h" +#include "decode_gif.h" #include "decode_jpeg.h" #include "decode_png.h" namespace vision { namespace image { -torch::Tensor decode_image(const torch::Tensor& data, ImageReadMode mode) { +torch::Tensor decode_image( + const torch::Tensor& data, + ImageReadMode mode, + bool apply_exif_orientation) { + // Check that tensor is a CPU tensor + TORCH_CHECK(data.device() == torch::kCPU, "Expected a CPU tensor"); // Check that the input tensor dtype is uint8 TORCH_CHECK(data.dtype() == torch::kU8, "Expected a torch.uint8 tensor"); // Check that the input tensor is 1-dimensional @@ -18,15 +24,24 @@ torch::Tensor decode_image(const torch::Tensor& data, ImageReadMode mode) { const uint8_t jpeg_signature[3] = {255, 216, 255}; // == "\xFF\xD8\xFF" const uint8_t png_signature[4] = {137, 80, 78, 71}; // == "\211PNG" + const uint8_t gif_signature_1[6] = { + 0x47, 0x49, 0x46, 0x38, 0x39, 0x61}; // == "GIF89a" + const uint8_t gif_signature_2[6] = { + 0x47, 0x49, 0x46, 0x38, 0x37, 0x61}; // == "GIF87a" if (memcmp(jpeg_signature, datap, 3) == 0) { - return decode_jpeg(data, mode); + return decode_jpeg(data, mode, apply_exif_orientation); } else if (memcmp(png_signature, datap, 4) == 0) { - return decode_png(data, mode); + return decode_png( + data, mode, /*allow_16_bits=*/false, apply_exif_orientation); + } else if ( + memcmp(gif_signature_1, datap, 6) == 0 || + memcmp(gif_signature_2, datap, 6) == 0) { + return decode_gif(data); } else { TORCH_CHECK( false, - "Unsupported image file. Only jpeg and png ", + "Unsupported image file. Only jpeg, png and gif ", "are currently supported."); } } diff --git a/torchvision/csrc/io/image/cpu/decode_image.h b/torchvision/csrc/io/image/cpu/decode_image.h index 853d6d91afa67f4ed3db95ba934a17aef4116c7d..f0e66d397ac7b94f42d8921cbb31f52eeb90e7d6 100644 --- a/torchvision/csrc/io/image/cpu/decode_image.h +++ b/torchvision/csrc/io/image/cpu/decode_image.h @@ -8,7 +8,8 @@ namespace image { C10_EXPORT torch::Tensor decode_image( const torch::Tensor& data, - ImageReadMode mode = IMAGE_READ_MODE_UNCHANGED); + ImageReadMode mode = IMAGE_READ_MODE_UNCHANGED, + bool apply_exif_orientation = false); } // namespace image } // namespace vision diff --git a/torchvision/csrc/io/image/cpu/decode_jpeg.cpp b/torchvision/csrc/io/image/cpu/decode_jpeg.cpp index c6e971c3b12d61c387e434929a7d665ba10d626a..ec5953e4106dc56c57fcebf307ca0fc8b3e8267d 100644 --- a/torchvision/csrc/io/image/cpu/decode_jpeg.cpp +++ b/torchvision/csrc/io/image/cpu/decode_jpeg.cpp @@ -1,17 +1,22 @@ #include "decode_jpeg.h" #include "common_jpeg.h" +#include "exif.h" namespace vision { namespace image { #if !JPEG_FOUND -torch::Tensor decode_jpeg(const torch::Tensor& data, ImageReadMode mode) { +torch::Tensor decode_jpeg( + const torch::Tensor& data, + ImageReadMode mode, + bool apply_exif_orientation) { TORCH_CHECK( false, "decode_jpeg: torchvision not compiled with libjpeg support"); } #else using namespace detail; +using namespace exif_private; namespace { @@ -65,11 +70,70 @@ static void torch_jpeg_set_source_mgr( src->len = len; src->pub.bytes_in_buffer = len; src->pub.next_input_byte = src->data; + + jpeg_save_markers(cinfo, APP1, 0xffff); +} + +inline unsigned char clamped_cmyk_rgb_convert( + unsigned char k, + unsigned char cmy) { + // Inspired from Pillow: + // https://github.com/python-pillow/Pillow/blob/07623d1a7cc65206a5355fba2ae256550bfcaba6/src/libImaging/Convert.c#L568-L569 + int v = k * cmy + 128; + v = ((v >> 8) + v) >> 8; + return std::clamp(k - v, 0, 255); +} + +void convert_line_cmyk_to_rgb( + j_decompress_ptr cinfo, + const unsigned char* cmyk_line, + unsigned char* rgb_line) { + int width = cinfo->output_width; + for (int i = 0; i < width; ++i) { + int c = cmyk_line[i * 4 + 0]; + int m = cmyk_line[i * 4 + 1]; + int y = cmyk_line[i * 4 + 2]; + int k = cmyk_line[i * 4 + 3]; + + rgb_line[i * 3 + 0] = clamped_cmyk_rgb_convert(k, 255 - c); + rgb_line[i * 3 + 1] = clamped_cmyk_rgb_convert(k, 255 - m); + rgb_line[i * 3 + 2] = clamped_cmyk_rgb_convert(k, 255 - y); + } +} + +inline unsigned char rgb_to_gray(int r, int g, int b) { + // Inspired from Pillow: + // https://github.com/python-pillow/Pillow/blob/07623d1a7cc65206a5355fba2ae256550bfcaba6/src/libImaging/Convert.c#L226 + return (r * 19595 + g * 38470 + b * 7471 + 0x8000) >> 16; +} + +void convert_line_cmyk_to_gray( + j_decompress_ptr cinfo, + const unsigned char* cmyk_line, + unsigned char* gray_line) { + int width = cinfo->output_width; + for (int i = 0; i < width; ++i) { + int c = cmyk_line[i * 4 + 0]; + int m = cmyk_line[i * 4 + 1]; + int y = cmyk_line[i * 4 + 2]; + int k = cmyk_line[i * 4 + 3]; + + int r = clamped_cmyk_rgb_convert(k, 255 - c); + int g = clamped_cmyk_rgb_convert(k, 255 - m); + int b = clamped_cmyk_rgb_convert(k, 255 - y); + + gray_line[i] = rgb_to_gray(r, g, b); + } } } // namespace -torch::Tensor decode_jpeg(const torch::Tensor& data, ImageReadMode mode) { +torch::Tensor decode_jpeg( + const torch::Tensor& data, + ImageReadMode mode, + bool apply_exif_orientation) { + C10_LOG_API_USAGE_ONCE( + "torchvision.csrc.io.image.cpu.decode_jpeg.decode_jpeg"); // Check that the input tensor dtype is uint8 TORCH_CHECK(data.dtype() == torch::kU8, "Expected a torch.uint8 tensor"); // Check that the input tensor is 1-dimensional @@ -100,20 +164,29 @@ torch::Tensor decode_jpeg(const torch::Tensor& data, ImageReadMode mode) { jpeg_read_header(&cinfo, TRUE); int channels = cinfo.num_components; + bool cmyk_to_rgb_or_gray = false; if (mode != IMAGE_READ_MODE_UNCHANGED) { switch (mode) { case IMAGE_READ_MODE_GRAY: - if (cinfo.jpeg_color_space != JCS_GRAYSCALE) { + if (cinfo.jpeg_color_space == JCS_CMYK || + cinfo.jpeg_color_space == JCS_YCCK) { + cinfo.out_color_space = JCS_CMYK; + cmyk_to_rgb_or_gray = true; + } else { cinfo.out_color_space = JCS_GRAYSCALE; - channels = 1; } + channels = 1; break; case IMAGE_READ_MODE_RGB: - if (cinfo.jpeg_color_space != JCS_RGB) { + if (cinfo.jpeg_color_space == JCS_CMYK || + cinfo.jpeg_color_space == JCS_YCCK) { + cinfo.out_color_space = JCS_CMYK; + cmyk_to_rgb_or_gray = true; + } else { cinfo.out_color_space = JCS_RGB; - channels = 3; } + channels = 3; break; /* * Libjpeg does not support converting from CMYK to grayscale etc. There @@ -128,6 +201,11 @@ torch::Tensor decode_jpeg(const torch::Tensor& data, ImageReadMode mode) { jpeg_calc_output_dimensions(&cinfo); } + int exif_orientation = -1; + if (apply_exif_orientation) { + exif_orientation = fetch_jpeg_exif_orientation(&cinfo); + } + jpeg_start_decompress(&cinfo); int height = cinfo.output_height; @@ -137,21 +215,57 @@ torch::Tensor decode_jpeg(const torch::Tensor& data, ImageReadMode mode) { auto tensor = torch::empty({int64_t(height), int64_t(width), channels}, torch::kU8); auto ptr = tensor.data_ptr(); + torch::Tensor cmyk_line_tensor; + if (cmyk_to_rgb_or_gray) { + cmyk_line_tensor = torch::empty({int64_t(width), 4}, torch::kU8); + } + while (cinfo.output_scanline < cinfo.output_height) { /* jpeg_read_scanlines expects an array of pointers to scanlines. * Here the array is only one element long, but you could ask for * more than one scanline at a time if that's more convenient. */ - jpeg_read_scanlines(&cinfo, &ptr, 1); + if (cmyk_to_rgb_or_gray) { + auto cmyk_line_ptr = cmyk_line_tensor.data_ptr(); + jpeg_read_scanlines(&cinfo, &cmyk_line_ptr, 1); + + if (channels == 3) { + convert_line_cmyk_to_rgb(&cinfo, cmyk_line_ptr, ptr); + } else if (channels == 1) { + convert_line_cmyk_to_gray(&cinfo, cmyk_line_ptr, ptr); + } + } else { + jpeg_read_scanlines(&cinfo, &ptr, 1); + } ptr += stride; } jpeg_finish_decompress(&cinfo); jpeg_destroy_decompress(&cinfo); - return tensor.permute({2, 0, 1}); + auto output = tensor.permute({2, 0, 1}); + + if (apply_exif_orientation) { + return exif_orientation_transform(output, exif_orientation); + } + return output; } +#endif // #if !JPEG_FOUND +int64_t _jpeg_version() { +#if JPEG_FOUND + return JPEG_LIB_VERSION; +#else + return -1; #endif +} + +bool _is_compiled_against_turbo() { +#ifdef LIBJPEG_TURBO_VERSION + return true; +#else + return false; +#endif +} } // namespace image } // namespace vision diff --git a/torchvision/csrc/io/image/cpu/decode_jpeg.h b/torchvision/csrc/io/image/cpu/decode_jpeg.h index 97ed3d51a54e625989d695c42ccf78f1e2e79d9f..e0c9a24c84604656e882e3851784010835b59fee 100644 --- a/torchvision/csrc/io/image/cpu/decode_jpeg.h +++ b/torchvision/csrc/io/image/cpu/decode_jpeg.h @@ -8,7 +8,11 @@ namespace image { C10_EXPORT torch::Tensor decode_jpeg( const torch::Tensor& data, - ImageReadMode mode = IMAGE_READ_MODE_UNCHANGED); + ImageReadMode mode = IMAGE_READ_MODE_UNCHANGED, + bool apply_exif_orientation = false); + +C10_EXPORT int64_t _jpeg_version(); +C10_EXPORT bool _is_compiled_against_turbo(); } // namespace image } // namespace vision diff --git a/torchvision/csrc/io/image/cpu/decode_png.cpp b/torchvision/csrc/io/image/cpu/decode_png.cpp index 5ee33635a1c1892f0a201273cf53a72d1b8f479f..ab4087fdfe21b5177997586937e9dd0aa6e66b8f 100644 --- a/torchvision/csrc/io/image/cpu/decode_png.cpp +++ b/torchvision/csrc/io/image/cpu/decode_png.cpp @@ -1,17 +1,34 @@ #include "decode_png.h" #include "common_png.h" +#include "exif.h" namespace vision { namespace image { +using namespace exif_private; + #if !PNG_FOUND -torch::Tensor decode_png(const torch::Tensor& data, ImageReadMode mode) { +torch::Tensor decode_png( + const torch::Tensor& data, + ImageReadMode mode, + bool allow_16_bits, + bool apply_exif_orientation) { TORCH_CHECK( false, "decode_png: torchvision not compiled with libPNG support"); } #else -torch::Tensor decode_png(const torch::Tensor& data, ImageReadMode mode) { +bool is_little_endian() { + uint32_t x = 1; + return *(uint8_t*)&x; +} + +torch::Tensor decode_png( + const torch::Tensor& data, + ImageReadMode mode, + bool allow_16_bits, + bool apply_exif_orientation) { + C10_LOG_API_USAGE_ONCE("torchvision.csrc.io.image.cpu.decode_png.decode_png"); // Check that the input tensor dtype is uint8 TORCH_CHECK(data.dtype() == torch::kU8, "Expected a torch.uint8 tensor"); // Check that the input tensor is 1-dimensional @@ -29,32 +46,43 @@ torch::Tensor decode_png(const torch::Tensor& data, ImageReadMode mode) { TORCH_CHECK(info_ptr, "libpng info structure allocation failed!") } - auto datap = data.accessor().data(); + auto accessor = data.accessor(); + auto datap = accessor.data(); + auto datap_len = accessor.size(0); if (setjmp(png_jmpbuf(png_ptr)) != 0) { png_destroy_read_struct(&png_ptr, &info_ptr, nullptr); TORCH_CHECK(false, "Internal error."); } + TORCH_CHECK(datap_len >= 8, "Content is too small for png!") auto is_png = !png_sig_cmp(datap, 0, 8); TORCH_CHECK(is_png, "Content is not png!") struct Reader { png_const_bytep ptr; + png_size_t count; } reader; reader.ptr = png_const_bytep(datap) + 8; + reader.count = datap_len - 8; - auto read_callback = - [](png_structp png_ptr, png_bytep output, png_size_t bytes) { - auto reader = static_cast(png_get_io_ptr(png_ptr)); - std::copy(reader->ptr, reader->ptr + bytes, output); - reader->ptr += bytes; - }; + auto read_callback = [](png_structp png_ptr, + png_bytep output, + png_size_t bytes) { + auto reader = static_cast(png_get_io_ptr(png_ptr)); + TORCH_CHECK( + reader->count >= bytes, + "Out of bound read in decode_png. Probably, the input image is corrupted"); + std::copy(reader->ptr, reader->ptr + bytes, output); + reader->ptr += bytes; + reader->count -= bytes; + }; png_set_sig_bytes(png_ptr, 8); png_set_read_fn(png_ptr, &reader, read_callback); png_read_info(png_ptr, info_ptr); png_uint_32 width, height; int bit_depth, color_type; + int interlace_type; auto retval = png_get_IHDR( png_ptr, info_ptr, @@ -62,7 +90,7 @@ torch::Tensor decode_png(const torch::Tensor& data, ImageReadMode mode) { &height, &bit_depth, &color_type, - nullptr, + &interlace_type, nullptr, nullptr); @@ -71,8 +99,26 @@ torch::Tensor decode_png(const torch::Tensor& data, ImageReadMode mode) { TORCH_CHECK(retval == 1, "Could read image metadata from content.") } + auto max_bit_depth = allow_16_bits ? 16 : 8; + auto err_msg = "At most " + std::to_string(max_bit_depth) + + "-bit PNG images are supported currently."; + if (bit_depth > max_bit_depth) { + png_destroy_read_struct(&png_ptr, &info_ptr, nullptr); + TORCH_CHECK(false, err_msg) + } + int channels = png_get_channels(png_ptr, info_ptr); + if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8) + png_set_expand_gray_1_2_4_to_8(png_ptr); + + int number_of_passes; + if (interlace_type == PNG_INTERLACE_ADAM7) { + number_of_passes = png_set_interlace_handling(png_ptr); + } else { + number_of_passes = 1; + } + if (mode != IMAGE_READ_MODE_UNCHANGED) { // TODO: consider supporting PNG_INFO_tRNS bool is_palette = (color_type & PNG_COLOR_MASK_PALETTE) != 0; @@ -152,16 +198,60 @@ torch::Tensor decode_png(const torch::Tensor& data, ImageReadMode mode) { png_read_update_info(png_ptr, info_ptr); } - auto tensor = - torch::empty({int64_t(height), int64_t(width), channels}, torch::kU8); - auto ptr = tensor.accessor().data(); - auto bytes = png_get_rowbytes(png_ptr, info_ptr); - for (png_uint_32 i = 0; i < height; ++i) { - png_read_row(png_ptr, ptr, nullptr); - ptr += bytes; + auto num_pixels_per_row = width * channels; + auto tensor = torch::empty( + {int64_t(height), int64_t(width), channels}, + bit_depth <= 8 ? torch::kU8 : torch::kI32); + + if (bit_depth <= 8) { + auto t_ptr = tensor.accessor().data(); + for (int pass = 0; pass < number_of_passes; pass++) { + for (png_uint_32 i = 0; i < height; ++i) { + png_read_row(png_ptr, t_ptr, nullptr); + t_ptr += num_pixels_per_row; + } + t_ptr = tensor.accessor().data(); + } + } else { + // We're reading a 16bits png, but pytorch doesn't support uint16. + // So we read each row in a 16bits tmp_buffer which we then cast into + // a int32 tensor instead. + if (is_little_endian()) { + png_set_swap(png_ptr); + } + int32_t* t_ptr = tensor.accessor().data(); + + // We create a tensor instead of malloc-ing for automatic memory management + auto tmp_buffer_tensor = torch::empty( + {int64_t(num_pixels_per_row * sizeof(uint16_t))}, torch::kU8); + uint16_t* tmp_buffer = + (uint16_t*)tmp_buffer_tensor.accessor().data(); + + for (int pass = 0; pass < number_of_passes; pass++) { + for (png_uint_32 i = 0; i < height; ++i) { + png_read_row(png_ptr, (uint8_t*)tmp_buffer, nullptr); + // Now we copy the uint16 values into the int32 tensor. + for (size_t j = 0; j < num_pixels_per_row; ++j) { + t_ptr[j] = (int32_t)tmp_buffer[j]; + } + t_ptr += num_pixels_per_row; + } + t_ptr = tensor.accessor().data(); + } + } + + int exif_orientation = -1; + if (apply_exif_orientation) { + exif_orientation = fetch_png_exif_orientation(png_ptr, info_ptr); } + png_destroy_read_struct(&png_ptr, &info_ptr, nullptr); - return tensor.permute({2, 0, 1}); + + auto output = tensor.permute({2, 0, 1}); + if (apply_exif_orientation) { + return exif_orientation_transform(output, exif_orientation); + } + return output; } #endif diff --git a/torchvision/csrc/io/image/cpu/decode_png.h b/torchvision/csrc/io/image/cpu/decode_png.h index 471bf77d935b5a21a8f2ca41e44428f94024baa9..b091f15e35f9defb177de88fba4342dcdfdc9193 100644 --- a/torchvision/csrc/io/image/cpu/decode_png.h +++ b/torchvision/csrc/io/image/cpu/decode_png.h @@ -8,7 +8,9 @@ namespace image { C10_EXPORT torch::Tensor decode_png( const torch::Tensor& data, - ImageReadMode mode = IMAGE_READ_MODE_UNCHANGED); + ImageReadMode mode = IMAGE_READ_MODE_UNCHANGED, + bool allow_16_bits = false, + bool apply_exif_orientation = false); } // namespace image } // namespace vision diff --git a/torchvision/csrc/io/image/cpu/encode_jpeg.cpp b/torchvision/csrc/io/image/cpu/encode_jpeg.cpp index c84ad37005d861cc3c177558293a391e0e1218ea..d2ed73071a2fb424ef7938f6aebaa7601446ba41 100644 --- a/torchvision/csrc/io/image/cpu/encode_jpeg.cpp +++ b/torchvision/csrc/io/image/cpu/encode_jpeg.cpp @@ -13,17 +13,27 @@ torch::Tensor encode_jpeg(const torch::Tensor& data, int64_t quality) { } #else +// For libjpeg version <= 9b, the out_size parameter in jpeg_mem_dest() is +// defined as unsigned long, whereas in later version, it is defined as size_t. +#if !defined(JPEG_LIB_VERSION_MAJOR) || JPEG_LIB_VERSION_MAJOR < 9 || \ + (JPEG_LIB_VERSION_MAJOR == 9 && JPEG_LIB_VERSION_MINOR <= 2) +using JpegSizeType = unsigned long; +#else +using JpegSizeType = size_t; +#endif using namespace detail; torch::Tensor encode_jpeg(const torch::Tensor& data, int64_t quality) { + C10_LOG_API_USAGE_ONCE( + "torchvision.csrc.io.image.cpu.encode_jpeg.encode_jpeg"); // Define compression structures and error handling - struct jpeg_compress_struct cinfo; - struct torch_jpeg_error_mgr jerr; + struct jpeg_compress_struct cinfo {}; + struct torch_jpeg_error_mgr jerr {}; // Define buffer to write JPEG information to and its size - unsigned long jpegSize = 0; - uint8_t* jpegBuf = NULL; + JpegSizeType jpegSize = 0; + uint8_t* jpegBuf = nullptr; cinfo.err = jpeg_std_error(&jerr.pub); jerr.pub.error_exit = torch_jpeg_error_exit; @@ -34,7 +44,7 @@ torch::Tensor encode_jpeg(const torch::Tensor& data, int64_t quality) { * We need to clean up the JPEG object and the buffer. */ jpeg_destroy_compress(&cinfo); - if (jpegBuf != NULL) { + if (jpegBuf != nullptr) { free(jpegBuf); } @@ -92,16 +102,10 @@ torch::Tensor encode_jpeg(const torch::Tensor& data, int64_t quality) { jpeg_destroy_compress(&cinfo); torch::TensorOptions options = torch::TensorOptions{torch::kU8}; - auto outTensor = torch::empty({(long)jpegSize}, options); - - // Copy memory from jpeg buffer, since torch cannot get ownership of it via - // `from_blob` - auto outPtr = outTensor.data_ptr(); - std::memcpy(outPtr, jpegBuf, sizeof(uint8_t) * outTensor.numel()); - - free(jpegBuf); - - return outTensor; + auto out_tensor = + torch::from_blob(jpegBuf, {(long)jpegSize}, ::free, options); + jpegBuf = nullptr; + return out_tensor; } #endif diff --git a/torchvision/csrc/io/image/cpu/encode_png.cpp b/torchvision/csrc/io/image/cpu/encode_png.cpp index d28bad958909f2f7eaa1c164cf326d49c511283a..5596d3a67896930dc0d39ee2ee044df14845d389 100644 --- a/torchvision/csrc/io/image/cpu/encode_png.cpp +++ b/torchvision/csrc/io/image/cpu/encode_png.cpp @@ -63,6 +63,7 @@ void torch_png_write_data( } // namespace torch::Tensor encode_png(const torch::Tensor& data, int64_t compression_level) { + C10_LOG_API_USAGE_ONCE("torchvision.csrc.io.image.cpu.encode_png.encode_png"); // Define compression structures and error handling png_structp png_write; png_infop info_ptr; @@ -70,7 +71,7 @@ torch::Tensor encode_png(const torch::Tensor& data, int64_t compression_level) { // Define output buffer struct torch_mem_encode buf_info; - buf_info.buffer = NULL; + buf_info.buffer = nullptr; buf_info.size = 0; /* Establish the setjmp return context for my_error_exit to use. */ @@ -78,15 +79,15 @@ torch::Tensor encode_png(const torch::Tensor& data, int64_t compression_level) { /* If we get here, the PNG code has signaled an error. * We need to clean up the PNG object and the buffer. */ - if (info_ptr != NULL) { + if (info_ptr != nullptr) { png_destroy_info_struct(png_write, &info_ptr); } - if (png_write != NULL) { - png_destroy_write_struct(&png_write, NULL); + if (png_write != nullptr) { + png_destroy_write_struct(&png_write, nullptr); } - if (buf_info.buffer != NULL) { + if (buf_info.buffer != nullptr) { free(buf_info.buffer); } @@ -120,12 +121,12 @@ torch::Tensor encode_png(const torch::Tensor& data, int64_t compression_level) { // Initialize PNG structures png_write = png_create_write_struct( - PNG_LIBPNG_VER_STRING, &err_ptr, torch_png_error, NULL); + PNG_LIBPNG_VER_STRING, &err_ptr, torch_png_error, nullptr); info_ptr = png_create_info_struct(png_write); // Define custom buffer output - png_set_write_fn(png_write, &buf_info, torch_png_write_data, NULL); + png_set_write_fn(png_write, &buf_info, torch_png_write_data, nullptr); // Set output image information auto color_type = channels == 1 ? PNG_COLOR_TYPE_GRAY : PNG_COLOR_TYPE_RGB; diff --git a/torchvision/csrc/io/image/cpu/exif.h b/torchvision/csrc/io/image/cpu/exif.h new file mode 100644 index 0000000000000000000000000000000000000000..61948bfe16a991e7bc42acab5d80e2f0a49cd572 --- /dev/null +++ b/torchvision/csrc/io/image/cpu/exif.h @@ -0,0 +1,256 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this +license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. +// Copyright (C) 2009, Willow Garage Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without +modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's 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. +// +// * The name of the copyright holders may not be used to endorse or promote +products +// derived from this software without specific prior written permission. +// +// 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 Intel Corporation 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. +// +//M*/ +#pragma once +// Functions in this module are taken from OpenCV +// https://github.com/opencv/opencv/blob/097891e311fae1d8354eb092a0fd0171e630d78c/modules/imgcodecs/src/exif.cpp + +#if JPEG_FOUND +#include +#endif +#if PNG_FOUND +#include +#endif + +#include + +namespace vision { +namespace image { +namespace exif_private { + +constexpr uint16_t APP1 = 0xe1; +constexpr uint16_t ENDIANNESS_INTEL = 0x49; +constexpr uint16_t ENDIANNESS_MOTO = 0x4d; +constexpr uint16_t REQ_EXIF_TAG_MARK = 0x2a; +constexpr uint16_t ORIENTATION_EXIF_TAG = 0x0112; +constexpr uint16_t INCORRECT_TAG = -1; + +class ExifDataReader { + public: + ExifDataReader(unsigned char* p, size_t s) : _ptr(p), _size(s) {} + size_t size() const { + return _size; + } + const unsigned char& operator[](size_t index) const { + TORCH_CHECK(index >= 0 && index < _size); + return _ptr[index]; + } + + protected: + unsigned char* _ptr; + size_t _size; +}; + +inline uint16_t get_endianness(const ExifDataReader& exif_data) { + if ((exif_data.size() < 1) || + (exif_data.size() > 1 && exif_data[0] != exif_data[1])) { + return 0; + } + if (exif_data[0] == 'I') { + return ENDIANNESS_INTEL; + } + if (exif_data[0] == 'M') { + return ENDIANNESS_MOTO; + } + return 0; +} + +inline uint16_t get_uint16( + const ExifDataReader& exif_data, + uint16_t endianness, + const size_t offset) { + if (offset + 1 >= exif_data.size()) { + return INCORRECT_TAG; + } + + if (endianness == ENDIANNESS_INTEL) { + return exif_data[offset] + (exif_data[offset + 1] << 8); + } + return (exif_data[offset] << 8) + exif_data[offset + 1]; +} + +inline uint32_t get_uint32( + const ExifDataReader& exif_data, + uint16_t endianness, + const size_t offset) { + if (offset + 3 >= exif_data.size()) { + return INCORRECT_TAG; + } + + if (endianness == ENDIANNESS_INTEL) { + return exif_data[offset] + (exif_data[offset + 1] << 8) + + (exif_data[offset + 2] << 16) + (exif_data[offset + 3] << 24); + } + return (exif_data[offset] << 24) + (exif_data[offset + 1] << 16) + + (exif_data[offset + 2] << 8) + exif_data[offset + 3]; +} + +inline int fetch_exif_orientation(unsigned char* exif_data_ptr, size_t size) { + int exif_orientation = -1; + + // Exif binary structure looks like this + // First 6 bytes: [E, x, i, f, 0, 0] + // Endianness, 2 bytes : [M, M] or [I, I] + // Tag mark, 2 bytes: [0, 0x2a] + // Offset, 4 bytes + // Num entries, 2 bytes + // Tag entries and data, tag has 2 bytes and its data has 10 bytes + // For more details: + // http://www.media.mit.edu/pia/Research/deepview/exif.html + + ExifDataReader exif_data(exif_data_ptr, size); + auto endianness = get_endianness(exif_data); + + // Checking whether Tag Mark (0x002A) correspond to one contained in the + // Jpeg file + uint16_t tag_mark = get_uint16(exif_data, endianness, 2); + if (tag_mark == REQ_EXIF_TAG_MARK) { + auto offset = get_uint32(exif_data, endianness, 4); + size_t num_entry = get_uint16(exif_data, endianness, offset); + offset += 2; // go to start of tag fields + constexpr size_t tiff_field_size = 12; + for (size_t entry = 0; entry < num_entry; entry++) { + // Here we just search for orientation tag and parse it + auto tag_num = get_uint16(exif_data, endianness, offset); + if (tag_num == INCORRECT_TAG) { + break; + } + if (tag_num == ORIENTATION_EXIF_TAG) { + exif_orientation = get_uint16(exif_data, endianness, offset + 8); + break; + } + offset += tiff_field_size; + } + } + return exif_orientation; +} + +#if JPEG_FOUND +inline int fetch_jpeg_exif_orientation(j_decompress_ptr cinfo) { + // Check for Exif marker APP1 + jpeg_saved_marker_ptr exif_marker = 0; + jpeg_saved_marker_ptr cmarker = cinfo->marker_list; + while (cmarker && exif_marker == 0) { + if (cmarker->marker == APP1) { + exif_marker = cmarker; + } + cmarker = cmarker->next; + } + + if (!exif_marker) { + return -1; + } + + constexpr size_t start_offset = 6; + if (exif_marker->data_length <= start_offset) { + return -1; + } + + auto* exif_data_ptr = exif_marker->data + start_offset; + auto size = exif_marker->data_length - start_offset; + + return fetch_exif_orientation(exif_data_ptr, size); +} +#endif // #if JPEG_FOUND + +#if PNG_FOUND && defined(PNG_eXIf_SUPPORTED) +inline int fetch_png_exif_orientation(png_structp png_ptr, png_infop info_ptr) { + png_uint_32 num_exif = 0; + png_bytep exif = 0; + + // Exif info could be in info_ptr + if (png_get_valid(png_ptr, info_ptr, PNG_INFO_eXIf)) { + png_get_eXIf_1(png_ptr, info_ptr, &num_exif, &exif); + } + + if (exif && num_exif > 0) { + return fetch_exif_orientation(exif, num_exif); + } + return -1; +} +#endif // #if PNG_FOUND && defined(PNG_eXIf_SUPPORTED) + +constexpr uint16_t IMAGE_ORIENTATION_TL = 1; // normal orientation +constexpr uint16_t IMAGE_ORIENTATION_TR = 2; // needs horizontal flip +constexpr uint16_t IMAGE_ORIENTATION_BR = 3; // needs 180 rotation +constexpr uint16_t IMAGE_ORIENTATION_BL = 4; // needs vertical flip +constexpr uint16_t IMAGE_ORIENTATION_LT = + 5; // mirrored horizontal & rotate 270 CW +constexpr uint16_t IMAGE_ORIENTATION_RT = 6; // rotate 90 CW +constexpr uint16_t IMAGE_ORIENTATION_RB = + 7; // mirrored horizontal & rotate 90 CW +constexpr uint16_t IMAGE_ORIENTATION_LB = 8; // needs 270 CW rotation + +inline torch::Tensor exif_orientation_transform( + const torch::Tensor& image, + int orientation) { + if (orientation == IMAGE_ORIENTATION_TL) { + return image; + } else if (orientation == IMAGE_ORIENTATION_TR) { + return image.flip(-1); + } else if (orientation == IMAGE_ORIENTATION_BR) { + // needs 180 rotation equivalent to + // flip both horizontally and vertically + return image.flip({-2, -1}); + } else if (orientation == IMAGE_ORIENTATION_BL) { + return image.flip(-2); + } else if (orientation == IMAGE_ORIENTATION_LT) { + return image.transpose(-1, -2); + } else if (orientation == IMAGE_ORIENTATION_RT) { + return image.transpose(-1, -2).flip(-1); + } else if (orientation == IMAGE_ORIENTATION_RB) { + return image.transpose(-1, -2).flip({-2, -1}); + } else if (orientation == IMAGE_ORIENTATION_LB) { + return image.transpose(-1, -2).flip(-2); + } + return image; +} + +} // namespace exif_private +} // namespace image +} // namespace vision diff --git a/torchvision/csrc/io/image/cpu/giflib/README b/torchvision/csrc/io/image/cpu/giflib/README new file mode 100644 index 0000000000000000000000000000000000000000..7353453e32e6d3d2ca6ba151670ed7478d3b042d --- /dev/null +++ b/torchvision/csrc/io/image/cpu/giflib/README @@ -0,0 +1,28 @@ +These files come from the GIFLIB project (https://giflib.sourceforge.net/) and +are licensed under the MIT license. + +Some modifications have been made to the original files: +- Remove use of "register" keyword in gifalloc.c for C++17 compatibility. +- Declare loop variable i in DGifGetImageHeader as int instead of unsigned int. + +Below is the original license text from the COPYING file of the GIFLIB project: + += MIT LICENSE + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/torchvision/csrc/io/image/cpu/giflib/dgif_lib.c b/torchvision/csrc/io/image/cpu/giflib/dgif_lib.c new file mode 100644 index 0000000000000000000000000000000000000000..297f12f15c422692cf345e141e7a261f34264b60 --- /dev/null +++ b/torchvision/csrc/io/image/cpu/giflib/dgif_lib.c @@ -0,0 +1,1312 @@ +/****************************************************************************** + +dgif_lib.c - GIF decoding + +The functions here and in egif_lib.c are partitioned carefully so that +if you only require one of read and write capability, only one of these +two modules will be linked. Preserve this property! + +*****************************************************************************/ +// SPDX-License-Identifier: MIT +// SPDX-FileCopyrightText: Copyright (C) Eric S. Raymond + +#include +#include +#include +#include +#include +#include + +#ifdef _WIN32 +#include +#else +#include +#endif /* _WIN32 */ + +#include "gif_lib.h" +#include "gif_lib_private.h" + +/* compose unsigned little endian value */ +#define UNSIGNED_LITTLE_ENDIAN(lo, hi) ((lo) | ((hi) << 8)) + +/* avoid extra function call in case we use fread (TVT) */ +static int InternalRead(GifFileType *gif, GifByteType *buf, int len) { + // fprintf(stderr, "### Read: %d\n", len); + return (((GifFilePrivateType *)gif->Private)->Read + ? ((GifFilePrivateType *)gif->Private)->Read(gif, buf, len) + : fread(buf, 1, len, + ((GifFilePrivateType *)gif->Private)->File)); +} + +static int DGifGetWord(GifFileType *GifFile, GifWord *Word); +static int DGifSetupDecompress(GifFileType *GifFile); +static int DGifDecompressLine(GifFileType *GifFile, GifPixelType *Line, + int LineLen); +static int DGifGetPrefixChar(const GifPrefixType *Prefix, int Code, + int ClearCode); +static int DGifDecompressInput(GifFileType *GifFile, int *Code); +static int DGifBufferedInput(GifFileType *GifFile, GifByteType *Buf, + GifByteType *NextByte); + +/****************************************************************************** + Open a new GIF file for read, given by its name. + Returns dynamically allocated GifFileType pointer which serves as the GIF + info record. +******************************************************************************/ +GifFileType *DGifOpenFileName(const char *FileName, int *Error) { + int FileHandle; + GifFileType *GifFile; + + if ((FileHandle = open(FileName, O_RDONLY)) == -1) { + if (Error != NULL) { + *Error = D_GIF_ERR_OPEN_FAILED; + } + return NULL; + } + + GifFile = DGifOpenFileHandle(FileHandle, Error); + return GifFile; +} + +/****************************************************************************** + Update a new GIF file, given its file handle. + Returns dynamically allocated GifFileType pointer which serves as the GIF + info record. +******************************************************************************/ +GifFileType *DGifOpenFileHandle(int FileHandle, int *Error) { + char Buf[GIF_STAMP_LEN + 1]; + GifFileType *GifFile; + GifFilePrivateType *Private; + FILE *f; + + GifFile = (GifFileType *)malloc(sizeof(GifFileType)); + if (GifFile == NULL) { + if (Error != NULL) { + *Error = D_GIF_ERR_NOT_ENOUGH_MEM; + } + (void)close(FileHandle); + return NULL; + } + + /*@i1@*/ memset(GifFile, '\0', sizeof(GifFileType)); + + /* Belt and suspenders, in case the null pointer isn't zero */ + GifFile->SavedImages = NULL; + GifFile->SColorMap = NULL; + + Private = (GifFilePrivateType *)calloc(1, sizeof(GifFilePrivateType)); + if (Private == NULL) { + if (Error != NULL) { + *Error = D_GIF_ERR_NOT_ENOUGH_MEM; + } + (void)close(FileHandle); + free((char *)GifFile); + return NULL; + } + + /*@i1@*/ memset(Private, '\0', sizeof(GifFilePrivateType)); + +#ifdef _WIN32 + _setmode(FileHandle, O_BINARY); /* Make sure it is in binary mode. */ +#endif /* _WIN32 */ + + f = fdopen(FileHandle, "rb"); /* Make it into a stream: */ + + /*@-mustfreeonly@*/ + GifFile->Private = (void *)Private; + Private->FileHandle = FileHandle; + Private->File = f; + Private->FileState = FILE_STATE_READ; + Private->Read = NULL; /* don't use alternate input method (TVT) */ + GifFile->UserData = NULL; /* TVT */ + /*@=mustfreeonly@*/ + + /* Let's see if this is a GIF file: */ + /* coverity[check_return] */ + if (InternalRead(GifFile, (unsigned char *)Buf, GIF_STAMP_LEN) != + GIF_STAMP_LEN) { + if (Error != NULL) { + *Error = D_GIF_ERR_READ_FAILED; + } + (void)fclose(f); + free((char *)Private); + free((char *)GifFile); + return NULL; + } + + /* Check for GIF prefix at start of file */ + Buf[GIF_STAMP_LEN] = 0; + if (strncmp(GIF_STAMP, Buf, GIF_VERSION_POS) != 0) { + if (Error != NULL) { + *Error = D_GIF_ERR_NOT_GIF_FILE; + } + (void)fclose(f); + free((char *)Private); + free((char *)GifFile); + return NULL; + } + + if (DGifGetScreenDesc(GifFile) == GIF_ERROR) { + (void)fclose(f); + free((char *)Private); + free((char *)GifFile); + return NULL; + } + + GifFile->Error = 0; + + /* What version of GIF? */ + Private->gif89 = (Buf[GIF_VERSION_POS + 1] == '9'); + + return GifFile; +} + +/****************************************************************************** + GifFileType constructor with user supplied input function (TVT) +******************************************************************************/ +GifFileType *DGifOpen(void *userData, InputFunc readFunc, int *Error) { + char Buf[GIF_STAMP_LEN + 1]; + GifFileType *GifFile; + GifFilePrivateType *Private; + + GifFile = (GifFileType *)malloc(sizeof(GifFileType)); + if (GifFile == NULL) { + if (Error != NULL) { + *Error = D_GIF_ERR_NOT_ENOUGH_MEM; + } + return NULL; + } + + memset(GifFile, '\0', sizeof(GifFileType)); + + /* Belt and suspenders, in case the null pointer isn't zero */ + GifFile->SavedImages = NULL; + GifFile->SColorMap = NULL; + + Private = (GifFilePrivateType *)calloc(1, sizeof(GifFilePrivateType)); + if (!Private) { + if (Error != NULL) { + *Error = D_GIF_ERR_NOT_ENOUGH_MEM; + } + free((char *)GifFile); + return NULL; + } + /*@i1@*/ memset(Private, '\0', sizeof(GifFilePrivateType)); + + GifFile->Private = (void *)Private; + Private->FileHandle = 0; + Private->File = NULL; + Private->FileState = FILE_STATE_READ; + + Private->Read = readFunc; /* TVT */ + GifFile->UserData = userData; /* TVT */ + + /* Lets see if this is a GIF file: */ + /* coverity[check_return] */ + if (InternalRead(GifFile, (unsigned char *)Buf, GIF_STAMP_LEN) != + GIF_STAMP_LEN) { + if (Error != NULL) { + *Error = D_GIF_ERR_READ_FAILED; + } + free((char *)Private); + free((char *)GifFile); + return NULL; + } + + /* Check for GIF prefix at start of file */ + Buf[GIF_STAMP_LEN] = '\0'; + if (strncmp(GIF_STAMP, Buf, GIF_VERSION_POS) != 0) { + if (Error != NULL) { + *Error = D_GIF_ERR_NOT_GIF_FILE; + } + free((char *)Private); + free((char *)GifFile); + return NULL; + } + + if (DGifGetScreenDesc(GifFile) == GIF_ERROR) { + free((char *)Private); + free((char *)GifFile); + if (Error != NULL) { + *Error = D_GIF_ERR_NO_SCRN_DSCR; + } + return NULL; + } + + GifFile->Error = 0; + + /* What version of GIF? */ + Private->gif89 = (Buf[GIF_VERSION_POS + 1] == '9'); + + return GifFile; +} + +/****************************************************************************** + This routine should be called before any other DGif calls. Note that + this routine is called automatically from DGif file open routines. +******************************************************************************/ +int DGifGetScreenDesc(GifFileType *GifFile) { + int BitsPerPixel; + bool SortFlag; + GifByteType Buf[3]; + GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private; + + if (!IS_READABLE(Private)) { + /* This file was NOT open for reading: */ + GifFile->Error = D_GIF_ERR_NOT_READABLE; + return GIF_ERROR; + } + + /* Put the screen descriptor into the file: */ + if (DGifGetWord(GifFile, &GifFile->SWidth) == GIF_ERROR || + DGifGetWord(GifFile, &GifFile->SHeight) == GIF_ERROR) { + return GIF_ERROR; + } + + if (InternalRead(GifFile, Buf, 3) != 3) { + GifFile->Error = D_GIF_ERR_READ_FAILED; + GifFreeMapObject(GifFile->SColorMap); + GifFile->SColorMap = NULL; + return GIF_ERROR; + } + GifFile->SColorResolution = (((Buf[0] & 0x70) + 1) >> 4) + 1; + SortFlag = (Buf[0] & 0x08) != 0; + BitsPerPixel = (Buf[0] & 0x07) + 1; + GifFile->SBackGroundColor = Buf[1]; + GifFile->AspectByte = Buf[2]; + if (Buf[0] & 0x80) { /* Do we have global color map? */ + int i; + + GifFile->SColorMap = GifMakeMapObject(1 << BitsPerPixel, NULL); + if (GifFile->SColorMap == NULL) { + GifFile->Error = D_GIF_ERR_NOT_ENOUGH_MEM; + return GIF_ERROR; + } + + /* Get the global color map: */ + GifFile->SColorMap->SortFlag = SortFlag; + for (i = 0; i < GifFile->SColorMap->ColorCount; i++) { + /* coverity[check_return] */ + if (InternalRead(GifFile, Buf, 3) != 3) { + GifFreeMapObject(GifFile->SColorMap); + GifFile->SColorMap = NULL; + GifFile->Error = D_GIF_ERR_READ_FAILED; + return GIF_ERROR; + } + GifFile->SColorMap->Colors[i].Red = Buf[0]; + GifFile->SColorMap->Colors[i].Green = Buf[1]; + GifFile->SColorMap->Colors[i].Blue = Buf[2]; + } + } else { + GifFile->SColorMap = NULL; + } + + /* + * No check here for whether the background color is in range for the + * screen color map. Possibly there should be. + */ + + return GIF_OK; +} + +const char *DGifGetGifVersion(GifFileType *GifFile) { + GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private; + + if (Private->gif89) { + return GIF89_STAMP; + } else { + return GIF87_STAMP; + } +} + +/****************************************************************************** + This routine should be called before any attempt to read an image. +******************************************************************************/ +int DGifGetRecordType(GifFileType *GifFile, GifRecordType *Type) { + GifByteType Buf; + GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private; + + if (!IS_READABLE(Private)) { + /* This file was NOT open for reading: */ + GifFile->Error = D_GIF_ERR_NOT_READABLE; + return GIF_ERROR; + } + + /* coverity[check_return] */ + if (InternalRead(GifFile, &Buf, 1) != 1) { + GifFile->Error = D_GIF_ERR_READ_FAILED; + return GIF_ERROR; + } + + // fprintf(stderr, "### DGifGetRecordType: %02x\n", Buf); + switch (Buf) { + case DESCRIPTOR_INTRODUCER: + *Type = IMAGE_DESC_RECORD_TYPE; + break; + case EXTENSION_INTRODUCER: + *Type = EXTENSION_RECORD_TYPE; + break; + case TERMINATOR_INTRODUCER: + *Type = TERMINATE_RECORD_TYPE; + break; + default: + *Type = UNDEFINED_RECORD_TYPE; + GifFile->Error = D_GIF_ERR_WRONG_RECORD; + return GIF_ERROR; + } + + return GIF_OK; +} + +int DGifGetImageHeader(GifFileType *GifFile) { + unsigned int BitsPerPixel; + GifByteType Buf[3]; + GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private; + + if (!IS_READABLE(Private)) { + /* This file was NOT open for reading: */ + GifFile->Error = D_GIF_ERR_NOT_READABLE; + return GIF_ERROR; + } + + if (DGifGetWord(GifFile, &GifFile->Image.Left) == GIF_ERROR || + DGifGetWord(GifFile, &GifFile->Image.Top) == GIF_ERROR || + DGifGetWord(GifFile, &GifFile->Image.Width) == GIF_ERROR || + DGifGetWord(GifFile, &GifFile->Image.Height) == GIF_ERROR) { + return GIF_ERROR; + } + if (InternalRead(GifFile, Buf, 1) != 1) { + GifFile->Error = D_GIF_ERR_READ_FAILED; + GifFreeMapObject(GifFile->Image.ColorMap); + GifFile->Image.ColorMap = NULL; + return GIF_ERROR; + } + BitsPerPixel = (Buf[0] & 0x07) + 1; + GifFile->Image.Interlace = (Buf[0] & 0x40) ? true : false; + + /* Setup the colormap */ + if (GifFile->Image.ColorMap) { + GifFreeMapObject(GifFile->Image.ColorMap); + GifFile->Image.ColorMap = NULL; + } + /* Does this image have local color map? */ + if (Buf[0] & 0x80) { + int i; + + GifFile->Image.ColorMap = + GifMakeMapObject(1 << BitsPerPixel, NULL); + if (GifFile->Image.ColorMap == NULL) { + GifFile->Error = D_GIF_ERR_NOT_ENOUGH_MEM; + return GIF_ERROR; + } + + /* Get the image local color map: */ + for (i = 0; i < GifFile->Image.ColorMap->ColorCount; i++) { + /* coverity[check_return] */ + if (InternalRead(GifFile, Buf, 3) != 3) { + GifFreeMapObject(GifFile->Image.ColorMap); + GifFile->Error = D_GIF_ERR_READ_FAILED; + GifFile->Image.ColorMap = NULL; + return GIF_ERROR; + } + GifFile->Image.ColorMap->Colors[i].Red = Buf[0]; + GifFile->Image.ColorMap->Colors[i].Green = Buf[1]; + GifFile->Image.ColorMap->Colors[i].Blue = Buf[2]; + } + } + + Private->PixelCount = + (long)GifFile->Image.Width * (long)GifFile->Image.Height; + + /* Reset decompress algorithm parameters. */ + return DGifSetupDecompress(GifFile); +} + +/****************************************************************************** + This routine should be called before any attempt to read an image. + Note it is assumed the Image desc. header has been read. +******************************************************************************/ +int DGifGetImageDesc(GifFileType *GifFile) { + GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private; + SavedImage *sp; + + if (!IS_READABLE(Private)) { + /* This file was NOT open for reading: */ + GifFile->Error = D_GIF_ERR_NOT_READABLE; + return GIF_ERROR; + } + + if (DGifGetImageHeader(GifFile) == GIF_ERROR) { + return GIF_ERROR; + } + + if (GifFile->SavedImages) { + SavedImage *new_saved_images = (SavedImage *)reallocarray( + GifFile->SavedImages, (GifFile->ImageCount + 1), + sizeof(SavedImage)); + if (new_saved_images == NULL) { + GifFile->Error = D_GIF_ERR_NOT_ENOUGH_MEM; + return GIF_ERROR; + } + GifFile->SavedImages = new_saved_images; + } else { + if ((GifFile->SavedImages = + (SavedImage *)malloc(sizeof(SavedImage))) == NULL) { + GifFile->Error = D_GIF_ERR_NOT_ENOUGH_MEM; + return GIF_ERROR; + } + } + + sp = &GifFile->SavedImages[GifFile->ImageCount]; + memcpy(&sp->ImageDesc, &GifFile->Image, sizeof(GifImageDesc)); + if (GifFile->Image.ColorMap != NULL) { + sp->ImageDesc.ColorMap = + GifMakeMapObject(GifFile->Image.ColorMap->ColorCount, + GifFile->Image.ColorMap->Colors); + if (sp->ImageDesc.ColorMap == NULL) { + GifFile->Error = D_GIF_ERR_NOT_ENOUGH_MEM; + return GIF_ERROR; + } + } + sp->RasterBits = (unsigned char *)NULL; + sp->ExtensionBlockCount = 0; + sp->ExtensionBlocks = (ExtensionBlock *)NULL; + + GifFile->ImageCount++; + + return GIF_OK; +} + +/****************************************************************************** + Get one full scanned line (Line) of length LineLen from GIF file. +******************************************************************************/ +int DGifGetLine(GifFileType *GifFile, GifPixelType *Line, int LineLen) { + GifByteType *Dummy; + GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private; + + if (!IS_READABLE(Private)) { + /* This file was NOT open for reading: */ + GifFile->Error = D_GIF_ERR_NOT_READABLE; + return GIF_ERROR; + } + + if (!LineLen) { + LineLen = GifFile->Image.Width; + } + + if ((Private->PixelCount -= LineLen) > 0xffff0000UL) { + GifFile->Error = D_GIF_ERR_DATA_TOO_BIG; + return GIF_ERROR; + } + + if (DGifDecompressLine(GifFile, Line, LineLen) == GIF_OK) { + if (Private->PixelCount == 0) { + /* We probably won't be called any more, so let's clean + * up everything before we return: need to flush out all + * the rest of image until an empty block (size 0) + * detected. We use GetCodeNext. + */ + do { + if (DGifGetCodeNext(GifFile, &Dummy) == + GIF_ERROR) { + return GIF_ERROR; + } + } while (Dummy != NULL); + } + return GIF_OK; + } else { + return GIF_ERROR; + } +} + +/****************************************************************************** + Put one pixel (Pixel) into GIF file. +******************************************************************************/ +int DGifGetPixel(GifFileType *GifFile, GifPixelType Pixel) { + GifByteType *Dummy; + GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private; + + if (!IS_READABLE(Private)) { + /* This file was NOT open for reading: */ + GifFile->Error = D_GIF_ERR_NOT_READABLE; + return GIF_ERROR; + } + if (--Private->PixelCount > 0xffff0000UL) { + GifFile->Error = D_GIF_ERR_DATA_TOO_BIG; + return GIF_ERROR; + } + + if (DGifDecompressLine(GifFile, &Pixel, 1) == GIF_OK) { + if (Private->PixelCount == 0) { + /* We probably won't be called any more, so let's clean + * up everything before we return: need to flush out all + * the rest of image until an empty block (size 0) + * detected. We use GetCodeNext. + */ + do { + if (DGifGetCodeNext(GifFile, &Dummy) == + GIF_ERROR) { + return GIF_ERROR; + } + } while (Dummy != NULL); + } + return GIF_OK; + } else { + return GIF_ERROR; + } +} + +/****************************************************************************** + Get an extension block (see GIF manual) from GIF file. This routine only + returns the first data block, and DGifGetExtensionNext should be called + after this one until NULL extension is returned. + The Extension should NOT be freed by the user (not dynamically allocated). + Note it is assumed the Extension description header has been read. +******************************************************************************/ +int DGifGetExtension(GifFileType *GifFile, int *ExtCode, + GifByteType **Extension) { + GifByteType Buf; + GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private; + + // fprintf(stderr, "### -> DGifGetExtension:\n"); + if (!IS_READABLE(Private)) { + /* This file was NOT open for reading: */ + GifFile->Error = D_GIF_ERR_NOT_READABLE; + return GIF_ERROR; + } + + /* coverity[check_return] */ + if (InternalRead(GifFile, &Buf, 1) != 1) { + GifFile->Error = D_GIF_ERR_READ_FAILED; + return GIF_ERROR; + } + *ExtCode = Buf; + // fprintf(stderr, "### <- DGifGetExtension: %02x, about to call + // next\n", Buf); + + return DGifGetExtensionNext(GifFile, Extension); +} + +/****************************************************************************** + Get a following extension block (see GIF manual) from GIF file. This + routine should be called until NULL Extension is returned. + The Extension should NOT be freed by the user (not dynamically allocated). +******************************************************************************/ +int DGifGetExtensionNext(GifFileType *GifFile, GifByteType **Extension) { + GifByteType Buf; + GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private; + + // fprintf(stderr, "### -> DGifGetExtensionNext\n"); + if (InternalRead(GifFile, &Buf, 1) != 1) { + GifFile->Error = D_GIF_ERR_READ_FAILED; + return GIF_ERROR; + } + // fprintf(stderr, "### DGifGetExtensionNext sees %d\n", Buf); + + if (Buf > 0) { + *Extension = Private->Buf; /* Use private unused buffer. */ + (*Extension)[0] = + Buf; /* Pascal strings notation (pos. 0 is len.). */ + /* coverity[tainted_data,check_return] */ + if (InternalRead(GifFile, &((*Extension)[1]), Buf) != Buf) { + GifFile->Error = D_GIF_ERR_READ_FAILED; + return GIF_ERROR; + } + } else { + *Extension = NULL; + } + // fprintf(stderr, "### <- DGifGetExtensionNext: %p\n", Extension); + + return GIF_OK; +} + +/****************************************************************************** + Extract a Graphics Control Block from raw extension data +******************************************************************************/ + +int DGifExtensionToGCB(const size_t GifExtensionLength, + const GifByteType *GifExtension, + GraphicsControlBlock *GCB) { + if (GifExtensionLength != 4) { + return GIF_ERROR; + } + + GCB->DisposalMode = (GifExtension[0] >> 2) & 0x07; + GCB->UserInputFlag = (GifExtension[0] & 0x02) != 0; + GCB->DelayTime = + UNSIGNED_LITTLE_ENDIAN(GifExtension[1], GifExtension[2]); + if (GifExtension[0] & 0x01) { + GCB->TransparentColor = (int)GifExtension[3]; + } else { + GCB->TransparentColor = NO_TRANSPARENT_COLOR; + } + + return GIF_OK; +} + +/****************************************************************************** + Extract the Graphics Control Block for a saved image, if it exists. +******************************************************************************/ + +int DGifSavedExtensionToGCB(GifFileType *GifFile, int ImageIndex, + GraphicsControlBlock *GCB) { + int i; + + if (ImageIndex < 0 || ImageIndex > GifFile->ImageCount - 1) { + return GIF_ERROR; + } + + GCB->DisposalMode = DISPOSAL_UNSPECIFIED; + GCB->UserInputFlag = false; + GCB->DelayTime = 0; + GCB->TransparentColor = NO_TRANSPARENT_COLOR; + + for (i = 0; i < GifFile->SavedImages[ImageIndex].ExtensionBlockCount; + i++) { + ExtensionBlock *ep = + &GifFile->SavedImages[ImageIndex].ExtensionBlocks[i]; + if (ep->Function == GRAPHICS_EXT_FUNC_CODE) { + return DGifExtensionToGCB(ep->ByteCount, ep->Bytes, + GCB); + } + } + + return GIF_ERROR; +} + +/****************************************************************************** + This routine should be called last, to close the GIF file. +******************************************************************************/ +int DGifCloseFile(GifFileType *GifFile, int *ErrorCode) { + GifFilePrivateType *Private; + + if (GifFile == NULL || GifFile->Private == NULL) { + return GIF_ERROR; + } + + if (GifFile->Image.ColorMap) { + GifFreeMapObject(GifFile->Image.ColorMap); + GifFile->Image.ColorMap = NULL; + } + + if (GifFile->SColorMap) { + GifFreeMapObject(GifFile->SColorMap); + GifFile->SColorMap = NULL; + } + + if (GifFile->SavedImages) { + GifFreeSavedImages(GifFile); + GifFile->SavedImages = NULL; + } + + GifFreeExtensions(&GifFile->ExtensionBlockCount, + &GifFile->ExtensionBlocks); + + Private = (GifFilePrivateType *)GifFile->Private; + + if (!IS_READABLE(Private)) { + /* This file was NOT open for reading: */ + if (ErrorCode != NULL) { + *ErrorCode = D_GIF_ERR_NOT_READABLE; + } + free((char *)GifFile->Private); + free(GifFile); + return GIF_ERROR; + } + + if (Private->File && (fclose(Private->File) != 0)) { + if (ErrorCode != NULL) { + *ErrorCode = D_GIF_ERR_CLOSE_FAILED; + } + free((char *)GifFile->Private); + free(GifFile); + return GIF_ERROR; + } + + free((char *)GifFile->Private); + free(GifFile); + if (ErrorCode != NULL) { + *ErrorCode = D_GIF_SUCCEEDED; + } + return GIF_OK; +} + +/****************************************************************************** + Get 2 bytes (word) from the given file: +******************************************************************************/ +static int DGifGetWord(GifFileType *GifFile, GifWord *Word) { + unsigned char c[2]; + + /* coverity[check_return] */ + if (InternalRead(GifFile, c, 2) != 2) { + GifFile->Error = D_GIF_ERR_READ_FAILED; + return GIF_ERROR; + } + + *Word = (GifWord)UNSIGNED_LITTLE_ENDIAN(c[0], c[1]); + return GIF_OK; +} + +/****************************************************************************** + Get the image code in compressed form. This routine can be called if the + information needed to be piped out as is. Obviously this is much faster + than decoding and encoding again. This routine should be followed by calls + to DGifGetCodeNext, until NULL block is returned. + The block should NOT be freed by the user (not dynamically allocated). +******************************************************************************/ +int DGifGetCode(GifFileType *GifFile, int *CodeSize, GifByteType **CodeBlock) { + GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private; + + if (!IS_READABLE(Private)) { + /* This file was NOT open for reading: */ + GifFile->Error = D_GIF_ERR_NOT_READABLE; + return GIF_ERROR; + } + + *CodeSize = Private->BitsPerPixel; + + return DGifGetCodeNext(GifFile, CodeBlock); +} + +/****************************************************************************** + Continue to get the image code in compressed form. This routine should be + called until NULL block is returned. + The block should NOT be freed by the user (not dynamically allocated). +******************************************************************************/ +int DGifGetCodeNext(GifFileType *GifFile, GifByteType **CodeBlock) { + GifByteType Buf; + GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private; + + /* coverity[tainted_data_argument] */ + /* coverity[check_return] */ + if (InternalRead(GifFile, &Buf, 1) != 1) { + GifFile->Error = D_GIF_ERR_READ_FAILED; + return GIF_ERROR; + } + + /* coverity[lower_bounds] */ + if (Buf > 0) { + *CodeBlock = Private->Buf; /* Use private unused buffer. */ + (*CodeBlock)[0] = + Buf; /* Pascal strings notation (pos. 0 is len.). */ + /* coverity[tainted_data] */ + if (InternalRead(GifFile, &((*CodeBlock)[1]), Buf) != Buf) { + GifFile->Error = D_GIF_ERR_READ_FAILED; + return GIF_ERROR; + } + } else { + *CodeBlock = NULL; + Private->Buf[0] = 0; /* Make sure the buffer is empty! */ + Private->PixelCount = + 0; /* And local info. indicate image read. */ + } + + return GIF_OK; +} + +/****************************************************************************** + Setup the LZ decompression for this image: +******************************************************************************/ +static int DGifSetupDecompress(GifFileType *GifFile) { + int i, BitsPerPixel; + GifByteType CodeSize; + GifPrefixType *Prefix; + GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private; + + /* coverity[check_return] */ + if (InternalRead(GifFile, &CodeSize, 1) < + 1) { /* Read Code size from file. */ + GifFile->Error = D_GIF_ERR_READ_FAILED; + return GIF_ERROR; /* Failed to read Code size. */ + } + BitsPerPixel = CodeSize; + + /* this can only happen on a severely malformed GIF */ + if (BitsPerPixel > 8) { + GifFile->Error = + D_GIF_ERR_READ_FAILED; /* somewhat bogus error code */ + return GIF_ERROR; /* Failed to read Code size. */ + } + + Private->Buf[0] = 0; /* Input Buffer empty. */ + Private->BitsPerPixel = BitsPerPixel; + Private->ClearCode = (1 << BitsPerPixel); + Private->EOFCode = Private->ClearCode + 1; + Private->RunningCode = Private->EOFCode + 1; + Private->RunningBits = BitsPerPixel + 1; /* Number of bits per code. */ + Private->MaxCode1 = 1 << Private->RunningBits; /* Max. code + 1. */ + Private->StackPtr = 0; /* No pixels on the pixel stack. */ + Private->LastCode = NO_SUCH_CODE; + Private->CrntShiftState = 0; /* No information in CrntShiftDWord. */ + Private->CrntShiftDWord = 0; + + Prefix = Private->Prefix; + for (i = 0; i <= LZ_MAX_CODE; i++) { + Prefix[i] = NO_SUCH_CODE; + } + + return GIF_OK; +} + +/****************************************************************************** + The LZ decompression routine: + This version decompress the given GIF file into Line of length LineLen. + This routine can be called few times (one per scan line, for example), in + order the complete the whole image. +******************************************************************************/ +static int DGifDecompressLine(GifFileType *GifFile, GifPixelType *Line, + int LineLen) { + int i = 0; + int j, CrntCode, EOFCode, ClearCode, CrntPrefix, LastCode, StackPtr; + GifByteType *Stack, *Suffix; + GifPrefixType *Prefix; + GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private; + + StackPtr = Private->StackPtr; + Prefix = Private->Prefix; + Suffix = Private->Suffix; + Stack = Private->Stack; + EOFCode = Private->EOFCode; + ClearCode = Private->ClearCode; + LastCode = Private->LastCode; + + if (StackPtr > LZ_MAX_CODE) { + return GIF_ERROR; + } + + if (StackPtr != 0) { + /* Let pop the stack off before continueing to read the GIF + * file: */ + while (StackPtr != 0 && i < LineLen) { + Line[i++] = Stack[--StackPtr]; + } + } + + while (i < LineLen) { /* Decode LineLen items. */ + if (DGifDecompressInput(GifFile, &CrntCode) == GIF_ERROR) { + return GIF_ERROR; + } + + if (CrntCode == EOFCode) { + /* Note however that usually we will not be here as we + * will stop decoding as soon as we got all the pixel, + * or EOF code will not be read at all, and + * DGifGetLine/Pixel clean everything. */ + GifFile->Error = D_GIF_ERR_EOF_TOO_SOON; + return GIF_ERROR; + } else if (CrntCode == ClearCode) { + /* We need to start over again: */ + for (j = 0; j <= LZ_MAX_CODE; j++) { + Prefix[j] = NO_SUCH_CODE; + } + Private->RunningCode = Private->EOFCode + 1; + Private->RunningBits = Private->BitsPerPixel + 1; + Private->MaxCode1 = 1 << Private->RunningBits; + LastCode = Private->LastCode = NO_SUCH_CODE; + } else { + /* Its regular code - if in pixel range simply add it to + * output stream, otherwise trace to codes linked list + * until the prefix is in pixel range: */ + if (CrntCode < ClearCode) { + /* This is simple - its pixel scalar, so add it + * to output: */ + Line[i++] = CrntCode; + } else { + /* Its a code to needed to be traced: trace the + * linked list until the prefix is a pixel, + * while pushing the suffix pixels on our stack. + * If we done, pop the stack in reverse (thats + * what stack is good for!) order to output. */ + if (Prefix[CrntCode] == NO_SUCH_CODE) { + CrntPrefix = LastCode; + + /* Only allowed if CrntCode is exactly + * the running code: In that case + * CrntCode = XXXCode, CrntCode or the + * prefix code is last code and the + * suffix char is exactly the prefix of + * last code! */ + if (CrntCode == + Private->RunningCode - 2) { + Suffix[Private->RunningCode - + 2] = Stack[StackPtr++] = + DGifGetPrefixChar( + Prefix, LastCode, + ClearCode); + } else { + Suffix[Private->RunningCode - + 2] = Stack[StackPtr++] = + DGifGetPrefixChar( + Prefix, CrntCode, + ClearCode); + } + } else { + CrntPrefix = CrntCode; + } + + /* Now (if image is O.K.) we should not get a + * NO_SUCH_CODE during the trace. As we might + * loop forever, in case of defective image, we + * use StackPtr as loop counter and stop before + * overflowing Stack[]. */ + while (StackPtr < LZ_MAX_CODE && + CrntPrefix > ClearCode && + CrntPrefix <= LZ_MAX_CODE) { + Stack[StackPtr++] = Suffix[CrntPrefix]; + CrntPrefix = Prefix[CrntPrefix]; + } + if (StackPtr >= LZ_MAX_CODE || + CrntPrefix > LZ_MAX_CODE) { + GifFile->Error = D_GIF_ERR_IMAGE_DEFECT; + return GIF_ERROR; + } + /* Push the last character on stack: */ + Stack[StackPtr++] = CrntPrefix; + + /* Now lets pop all the stack into output: */ + while (StackPtr != 0 && i < LineLen) { + Line[i++] = Stack[--StackPtr]; + } + } + if (LastCode != NO_SUCH_CODE && + Private->RunningCode - 2 < (LZ_MAX_CODE + 1) && + Prefix[Private->RunningCode - 2] == NO_SUCH_CODE) { + Prefix[Private->RunningCode - 2] = LastCode; + + if (CrntCode == Private->RunningCode - 2) { + /* Only allowed if CrntCode is exactly + * the running code: In that case + * CrntCode = XXXCode, CrntCode or the + * prefix code is last code and the + * suffix char is exactly the prefix of + * last code! */ + Suffix[Private->RunningCode - 2] = + DGifGetPrefixChar(Prefix, LastCode, + ClearCode); + } else { + Suffix[Private->RunningCode - 2] = + DGifGetPrefixChar(Prefix, CrntCode, + ClearCode); + } + } + LastCode = CrntCode; + } + } + + Private->LastCode = LastCode; + Private->StackPtr = StackPtr; + + return GIF_OK; +} + +/****************************************************************************** + Routine to trace the Prefixes linked list until we get a prefix which is + not code, but a pixel value (less than ClearCode). Returns that pixel value. + If image is defective, we might loop here forever, so we limit the loops to + the maximum possible if image O.k. - LZ_MAX_CODE times. +******************************************************************************/ +static int DGifGetPrefixChar(const GifPrefixType *Prefix, int Code, + int ClearCode) { + int i = 0; + + while (Code > ClearCode && i++ <= LZ_MAX_CODE) { + if (Code > LZ_MAX_CODE) { + return NO_SUCH_CODE; + } + Code = Prefix[Code]; + } + return Code; +} + +/****************************************************************************** + Interface for accessing the LZ codes directly. Set Code to the real code + (12bits), or to -1 if EOF code is returned. +******************************************************************************/ +int DGifGetLZCodes(GifFileType *GifFile, int *Code) { + GifByteType *CodeBlock; + GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private; + + if (!IS_READABLE(Private)) { + /* This file was NOT open for reading: */ + GifFile->Error = D_GIF_ERR_NOT_READABLE; + return GIF_ERROR; + } + + if (DGifDecompressInput(GifFile, Code) == GIF_ERROR) { + return GIF_ERROR; + } + + if (*Code == Private->EOFCode) { + /* Skip rest of codes (hopefully only NULL terminating block): + */ + do { + if (DGifGetCodeNext(GifFile, &CodeBlock) == GIF_ERROR) { + return GIF_ERROR; + } + } while (CodeBlock != NULL); + + *Code = -1; + } else if (*Code == Private->ClearCode) { + /* We need to start over again: */ + Private->RunningCode = Private->EOFCode + 1; + Private->RunningBits = Private->BitsPerPixel + 1; + Private->MaxCode1 = 1 << Private->RunningBits; + } + + return GIF_OK; +} + +/****************************************************************************** + The LZ decompression input routine: + This routine is responsable for the decompression of the bit stream from + 8 bits (bytes) packets, into the real codes. + Returns GIF_OK if read successfully. +******************************************************************************/ +static int DGifDecompressInput(GifFileType *GifFile, int *Code) { + static const unsigned short CodeMasks[] = { + 0x0000, 0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, + 0x007f, 0x00ff, 0x01ff, 0x03ff, 0x07ff, 0x0fff}; + + GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private; + + GifByteType NextByte; + + /* The image can't contain more than LZ_BITS per code. */ + if (Private->RunningBits > LZ_BITS) { + GifFile->Error = D_GIF_ERR_IMAGE_DEFECT; + return GIF_ERROR; + } + + while (Private->CrntShiftState < Private->RunningBits) { + /* Needs to get more bytes from input stream for next code: */ + if (DGifBufferedInput(GifFile, Private->Buf, &NextByte) == + GIF_ERROR) { + return GIF_ERROR; + } + Private->CrntShiftDWord |= ((unsigned long)NextByte) + << Private->CrntShiftState; + Private->CrntShiftState += 8; + } + *Code = Private->CrntShiftDWord & CodeMasks[Private->RunningBits]; + + Private->CrntShiftDWord >>= Private->RunningBits; + Private->CrntShiftState -= Private->RunningBits; + + /* If code cannot fit into RunningBits bits, must raise its size. Note + * however that codes above 4095 are used for special signaling. + * If we're using LZ_BITS bits already and we're at the max code, just + * keep using the table as it is, don't increment Private->RunningCode. + */ + if (Private->RunningCode < LZ_MAX_CODE + 2 && + ++Private->RunningCode > Private->MaxCode1 && + Private->RunningBits < LZ_BITS) { + Private->MaxCode1 <<= 1; + Private->RunningBits++; + } + return GIF_OK; +} + +/****************************************************************************** + This routines read one GIF data block at a time and buffers it internally + so that the decompression routine could access it. + The routine returns the next byte from its internal buffer (or read next + block in if buffer empty) and returns GIF_OK if succesful. +******************************************************************************/ +static int DGifBufferedInput(GifFileType *GifFile, GifByteType *Buf, + GifByteType *NextByte) { + if (Buf[0] == 0) { + /* Needs to read the next buffer - this one is empty: */ + /* coverity[check_return] */ + if (InternalRead(GifFile, Buf, 1) != 1) { + GifFile->Error = D_GIF_ERR_READ_FAILED; + return GIF_ERROR; + } + /* There shouldn't be any empty data blocks here as the LZW spec + * says the LZW termination code should come first. Therefore + * we shouldn't be inside this routine at that point. + */ + if (Buf[0] == 0) { + GifFile->Error = D_GIF_ERR_IMAGE_DEFECT; + return GIF_ERROR; + } + if (InternalRead(GifFile, &Buf[1], Buf[0]) != Buf[0]) { + GifFile->Error = D_GIF_ERR_READ_FAILED; + return GIF_ERROR; + } + *NextByte = Buf[1]; + Buf[1] = 2; /* We use now the second place as last char read! */ + Buf[0]--; + } else { + *NextByte = Buf[Buf[1]++]; + Buf[0]--; + } + + return GIF_OK; +} + +/****************************************************************************** + This routine is called in case of error during parsing image. We need to + decrease image counter and reallocate memory for saved images. Not decreasing + ImageCount may lead to null pointer dereference, because the last element in + SavedImages may point to the spoilt image and null pointer buffers. +*******************************************************************************/ +void DGifDecreaseImageCounter(GifFileType *GifFile) { + GifFile->ImageCount--; + if (GifFile->SavedImages[GifFile->ImageCount].RasterBits != NULL) { + free(GifFile->SavedImages[GifFile->ImageCount].RasterBits); + } + + // Realloc array according to the new image counter. + SavedImage *correct_saved_images = (SavedImage *)reallocarray( + GifFile->SavedImages, GifFile->ImageCount, sizeof(SavedImage)); + if (correct_saved_images != NULL) { + GifFile->SavedImages = correct_saved_images; + } +} + +/****************************************************************************** + This routine reads an entire GIF into core, hanging all its state info off + the GifFileType pointer. Call DGifOpenFileName() or DGifOpenFileHandle() + first to initialize I/O. Its inverse is EGifSpew(). +*******************************************************************************/ +int DGifSlurp(GifFileType *GifFile) { + size_t ImageSize; + GifRecordType RecordType; + SavedImage *sp; + GifByteType *ExtData; + int ExtFunction; + + GifFile->ExtensionBlocks = NULL; + GifFile->ExtensionBlockCount = 0; + + do { + if (DGifGetRecordType(GifFile, &RecordType) == GIF_ERROR) { + return (GIF_ERROR); + } + + switch (RecordType) { + case IMAGE_DESC_RECORD_TYPE: + if (DGifGetImageDesc(GifFile) == GIF_ERROR) { + return (GIF_ERROR); + } + + sp = &GifFile->SavedImages[GifFile->ImageCount - 1]; + /* Allocate memory for the image */ + if (sp->ImageDesc.Width <= 0 || + sp->ImageDesc.Height <= 0 || + sp->ImageDesc.Width > + (INT_MAX / sp->ImageDesc.Height)) { + DGifDecreaseImageCounter(GifFile); + return GIF_ERROR; + } + ImageSize = sp->ImageDesc.Width * sp->ImageDesc.Height; + + if (ImageSize > (SIZE_MAX / sizeof(GifPixelType))) { + DGifDecreaseImageCounter(GifFile); + return GIF_ERROR; + } + sp->RasterBits = (unsigned char *)reallocarray( + NULL, ImageSize, sizeof(GifPixelType)); + + if (sp->RasterBits == NULL) { + DGifDecreaseImageCounter(GifFile); + return GIF_ERROR; + } + + if (sp->ImageDesc.Interlace) { + int i, j; + /* + * The way an interlaced image should be read - + * offsets and jumps... + */ + static const int InterlacedOffset[] = {0, 4, 2, + 1}; + static const int InterlacedJumps[] = {8, 8, 4, + 2}; + /* Need to perform 4 passes on the image */ + for (i = 0; i < 4; i++) { + for (j = InterlacedOffset[i]; + j < sp->ImageDesc.Height; + j += InterlacedJumps[i]) { + if (DGifGetLine( + GifFile, + sp->RasterBits + + j * sp->ImageDesc + .Width, + sp->ImageDesc.Width) == + GIF_ERROR) { + DGifDecreaseImageCounter( + GifFile); + return GIF_ERROR; + } + } + } + } else { + if (DGifGetLine(GifFile, sp->RasterBits, + ImageSize) == GIF_ERROR) { + DGifDecreaseImageCounter(GifFile); + return GIF_ERROR; + } + } + + if (GifFile->ExtensionBlocks) { + sp->ExtensionBlocks = GifFile->ExtensionBlocks; + sp->ExtensionBlockCount = + GifFile->ExtensionBlockCount; + + GifFile->ExtensionBlocks = NULL; + GifFile->ExtensionBlockCount = 0; + } + break; + + case EXTENSION_RECORD_TYPE: + if (DGifGetExtension(GifFile, &ExtFunction, &ExtData) == + GIF_ERROR) { + return (GIF_ERROR); + } + /* Create an extension block with our data */ + if (ExtData != NULL) { + if (GifAddExtensionBlock( + &GifFile->ExtensionBlockCount, + &GifFile->ExtensionBlocks, ExtFunction, + ExtData[0], &ExtData[1]) == GIF_ERROR) { + return (GIF_ERROR); + } + } + for (;;) { + if (DGifGetExtensionNext(GifFile, &ExtData) == + GIF_ERROR) { + return (GIF_ERROR); + } + if (ExtData == NULL) { + break; + } + /* Continue the extension block */ + if (GifAddExtensionBlock( + &GifFile->ExtensionBlockCount, + &GifFile->ExtensionBlocks, + CONTINUE_EXT_FUNC_CODE, ExtData[0], + &ExtData[1]) == GIF_ERROR) { + return (GIF_ERROR); + } + } + break; + + case TERMINATE_RECORD_TYPE: + break; + + default: /* Should be trapped by DGifGetRecordType */ + break; + } + } while (RecordType != TERMINATE_RECORD_TYPE); + + /* Sanity check for corrupted file */ + if (GifFile->ImageCount == 0) { + GifFile->Error = D_GIF_ERR_NO_IMAG_DSCR; + return (GIF_ERROR); + } + + return (GIF_OK); +} + +/* end */ diff --git a/torchvision/csrc/io/image/cpu/giflib/gif_hash.c b/torchvision/csrc/io/image/cpu/giflib/gif_hash.c new file mode 100644 index 0000000000000000000000000000000000000000..e63a72accd4abb3bde133ba75e75a910353e3080 --- /dev/null +++ b/torchvision/csrc/io/image/cpu/giflib/gif_hash.c @@ -0,0 +1,128 @@ +/***************************************************************************** + +gif_hash.c -- module to support the following operations: + +1. InitHashTable - initialize hash table. +2. ClearHashTable - clear the hash table to an empty state. +2. InsertHashTable - insert one item into data structure. +3. ExistsHashTable - test if item exists in data structure. + +This module is used to hash the GIF codes during encoding. + +*****************************************************************************/ +// SPDX-License-Identifier: MIT +// SPDX-File-Copyright-Txt: (C) Copyright 1989 Gershon Elber + +#include +#include +#include +#include +#include + +#include "gif_hash.h" +#include "gif_lib.h" +#include "gif_lib_private.h" + +/* #define DEBUG_HIT_RATE Debug number of misses per hash Insert/Exists. */ + +#ifdef DEBUG_HIT_RATE +static long NumberOfTests = 0, NumberOfMisses = 0; +#endif /* DEBUG_HIT_RATE */ + +static int KeyItem(uint32_t Item); + +/****************************************************************************** + Initialize HashTable - allocate the memory needed and clear it. * +******************************************************************************/ +GifHashTableType *_InitHashTable(void) { + GifHashTableType *HashTable; + + if ((HashTable = (GifHashTableType *)malloc( + sizeof(GifHashTableType))) == NULL) { + return NULL; + } + + _ClearHashTable(HashTable); + + return HashTable; +} + +/****************************************************************************** + Routine to clear the HashTable to an empty state. * + This part is a little machine depended. Use the commented part otherwise. * +******************************************************************************/ +void _ClearHashTable(GifHashTableType *HashTable) { + memset(HashTable->HTable, 0xFF, HT_SIZE * sizeof(uint32_t)); +} + +/****************************************************************************** + Routine to insert a new Item into the HashTable. The data is assumed to be * + new one. * +******************************************************************************/ +void _InsertHashTable(GifHashTableType *HashTable, uint32_t Key, int Code) { + int HKey = KeyItem(Key); + uint32_t *HTable = HashTable->HTable; + +#ifdef DEBUG_HIT_RATE + NumberOfTests++; + NumberOfMisses++; +#endif /* DEBUG_HIT_RATE */ + + while (HT_GET_KEY(HTable[HKey]) != 0xFFFFFL) { +#ifdef DEBUG_HIT_RATE + NumberOfMisses++; +#endif /* DEBUG_HIT_RATE */ + HKey = (HKey + 1) & HT_KEY_MASK; + } + HTable[HKey] = HT_PUT_KEY(Key) | HT_PUT_CODE(Code); +} + +/****************************************************************************** + Routine to test if given Key exists in HashTable and if so returns its code * + Returns the Code if key was found, -1 if not. * +******************************************************************************/ +int _ExistsHashTable(GifHashTableType *HashTable, uint32_t Key) { + int HKey = KeyItem(Key); + uint32_t *HTable = HashTable->HTable, HTKey; + +#ifdef DEBUG_HIT_RATE + NumberOfTests++; + NumberOfMisses++; +#endif /* DEBUG_HIT_RATE */ + + while ((HTKey = HT_GET_KEY(HTable[HKey])) != 0xFFFFFL) { +#ifdef DEBUG_HIT_RATE + NumberOfMisses++; +#endif /* DEBUG_HIT_RATE */ + if (Key == HTKey) { + return HT_GET_CODE(HTable[HKey]); + } + HKey = (HKey + 1) & HT_KEY_MASK; + } + + return -1; +} + +/****************************************************************************** + Routine to generate an HKey for the hashtable out of the given unique key. * + The given Key is assumed to be 20 bits as follows: lower 8 bits are the * + new postfix character, while the upper 12 bits are the prefix code. * + Because the average hit ratio is only 2 (2 hash references per entry), * + evaluating more complex keys (such as twin prime keys) does not worth it! * +******************************************************************************/ +static int KeyItem(uint32_t Item) { + return ((Item >> 12) ^ Item) & HT_KEY_MASK; +} + +#ifdef DEBUG_HIT_RATE +/****************************************************************************** + Debugging routine to print the hit ratio - number of times the hash table * + was tested per operation. This routine was used to test the KeyItem routine * +******************************************************************************/ +void HashTablePrintHitRatio(void) { + printf("Hash Table Hit Ratio is %ld/%ld = %ld%%.\n", NumberOfMisses, + NumberOfTests, NumberOfMisses * 100 / NumberOfTests); +} +#endif /* DEBUG_HIT_RATE */ + +/* end */ diff --git a/torchvision/csrc/io/image/cpu/giflib/gif_hash.h b/torchvision/csrc/io/image/cpu/giflib/gif_hash.h new file mode 100644 index 0000000000000000000000000000000000000000..009cb5b80812b4b4cc5afdbe9f010cf3c7e35917 --- /dev/null +++ b/torchvision/csrc/io/image/cpu/giflib/gif_hash.h @@ -0,0 +1,42 @@ +/****************************************************************************** + +gif_hash.h - magfic constants and declarations for GIF LZW + +******************************************************************************/ +// SPDX-License-Identifier: MIT + +#ifndef _GIF_HASH_H_ +#define _GIF_HASH_H_ + +#ifndef _WIN32 +#include +#endif /* _WIN32 */ +#include + +#define HT_SIZE 8192 /* 12bits = 4096 or twice as big! */ +#define HT_KEY_MASK 0x1FFF /* 13bits keys */ +#define HT_KEY_NUM_BITS 13 /* 13bits keys */ +#define HT_MAX_KEY 8191 /* 13bits - 1, maximal code possible */ +#define HT_MAX_CODE 4095 /* Biggest code possible in 12 bits. */ + +/* The 32 bits of the long are divided into two parts for the key & code: */ +/* 1. The code is 12 bits as our compression algorithm is limited to 12bits */ +/* 2. The key is 12 bits Prefix code + 8 bit new char or 20 bits. */ +/* The key is the upper 20 bits. The code is the lower 12. */ +#define HT_GET_KEY(l) (l >> 12) +#define HT_GET_CODE(l) (l & 0x0FFF) +#define HT_PUT_KEY(l) (l << 12) +#define HT_PUT_CODE(l) (l & 0x0FFF) + +typedef struct GifHashTableType { + uint32_t HTable[HT_SIZE]; +} GifHashTableType; + +GifHashTableType *_InitHashTable(void); +void _ClearHashTable(GifHashTableType *HashTable); +void _InsertHashTable(GifHashTableType *HashTable, uint32_t Key, int Code); +int _ExistsHashTable(GifHashTableType *HashTable, uint32_t Key); + +#endif /* _GIF_HASH_H_ */ + +/* end */ diff --git a/torchvision/csrc/io/image/cpu/giflib/gif_lib.h b/torchvision/csrc/io/image/cpu/giflib/gif_lib.h new file mode 100644 index 0000000000000000000000000000000000000000..d0c61d516827916029415998e8ba30f5e83b90c3 --- /dev/null +++ b/torchvision/csrc/io/image/cpu/giflib/gif_lib.h @@ -0,0 +1,291 @@ +/****************************************************************************** + +gif_lib.h - service library for decoding and encoding GIF images + +SPDX-License-Identifier: MIT + +*****************************************************************************/ + +#ifndef _GIF_LIB_H_ +#define _GIF_LIB_H_ 1 + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#define GIFLIB_MAJOR 5 +#define GIFLIB_MINOR 2 +#define GIFLIB_RELEASE 2 + +#define GIF_ERROR 0 +#define GIF_OK 1 + +#include +#include + +#define GIF_STAMP "GIFVER" /* First chars in file - GIF stamp. */ +#define GIF_STAMP_LEN sizeof(GIF_STAMP) - 1 +#define GIF_VERSION_POS 3 /* Version first character in stamp. */ +#define GIF87_STAMP "GIF87a" /* First chars in file - GIF stamp. */ +#define GIF89_STAMP "GIF89a" /* First chars in file - GIF stamp. */ + +typedef unsigned char GifPixelType; +typedef unsigned char *GifRowType; +typedef unsigned char GifByteType; +typedef unsigned int GifPrefixType; +typedef int GifWord; + +typedef struct GifColorType { + GifByteType Red, Green, Blue; +} GifColorType; + +typedef struct ColorMapObject { + int ColorCount; + int BitsPerPixel; + bool SortFlag; + GifColorType *Colors; /* on malloc(3) heap */ +} ColorMapObject; + +typedef struct GifImageDesc { + GifWord Left, Top, Width, Height; /* Current image dimensions. */ + bool Interlace; /* Sequential/Interlaced lines. */ + ColorMapObject *ColorMap; /* The local color map */ +} GifImageDesc; + +typedef struct ExtensionBlock { + int ByteCount; + GifByteType *Bytes; /* on malloc(3) heap */ + int Function; /* The block function code */ +#define CONTINUE_EXT_FUNC_CODE 0x00 /* continuation subblock */ +#define COMMENT_EXT_FUNC_CODE 0xfe /* comment */ +#define GRAPHICS_EXT_FUNC_CODE 0xf9 /* graphics control (GIF89) */ +#define PLAINTEXT_EXT_FUNC_CODE 0x01 /* plaintext */ +#define APPLICATION_EXT_FUNC_CODE 0xff /* application block (GIF89) */ +} ExtensionBlock; + +typedef struct SavedImage { + GifImageDesc ImageDesc; + GifByteType *RasterBits; /* on malloc(3) heap */ + int ExtensionBlockCount; /* Count of extensions before image */ + ExtensionBlock *ExtensionBlocks; /* Extensions before image */ +} SavedImage; + +typedef struct GifFileType { + GifWord SWidth, SHeight; /* Size of virtual canvas */ + GifWord SColorResolution; /* How many colors can we generate? */ + GifWord SBackGroundColor; /* Background color for virtual canvas */ + GifByteType AspectByte; /* Used to compute pixel aspect ratio */ + ColorMapObject *SColorMap; /* Global colormap, NULL if nonexistent. */ + int ImageCount; /* Number of current image (both APIs) */ + GifImageDesc Image; /* Current image (low-level API) */ + SavedImage *SavedImages; /* Image sequence (high-level API) */ + int ExtensionBlockCount; /* Count extensions past last image */ + ExtensionBlock *ExtensionBlocks; /* Extensions past last image */ + int Error; /* Last error condition reported */ + void *UserData; /* hook to attach user data (TVT) */ + void *Private; /* Don't mess with this! */ +} GifFileType; + +#define GIF_ASPECT_RATIO(n) ((n) + 15.0 / 64.0) + +typedef enum { + UNDEFINED_RECORD_TYPE, + SCREEN_DESC_RECORD_TYPE, + IMAGE_DESC_RECORD_TYPE, /* Begin with ',' */ + EXTENSION_RECORD_TYPE, /* Begin with '!' */ + TERMINATE_RECORD_TYPE /* Begin with ';' */ +} GifRecordType; + +/* func type to read gif data from arbitrary sources (TVT) */ +typedef int (*InputFunc)(GifFileType *, GifByteType *, int); + +/* func type to write gif data to arbitrary targets. + * Returns count of bytes written. (MRB) + */ +typedef int (*OutputFunc)(GifFileType *, const GifByteType *, int); + +/****************************************************************************** + GIF89 structures +******************************************************************************/ + +typedef struct GraphicsControlBlock { + int DisposalMode; +#define DISPOSAL_UNSPECIFIED 0 /* No disposal specified. */ +#define DISPOSE_DO_NOT 1 /* Leave image in place */ +#define DISPOSE_BACKGROUND 2 /* Set area too background color */ +#define DISPOSE_PREVIOUS 3 /* Restore to previous content */ + bool UserInputFlag; /* User confirmation required before disposal */ + int DelayTime; /* pre-display delay in 0.01sec units */ + int TransparentColor; /* Palette index for transparency, -1 if none */ +#define NO_TRANSPARENT_COLOR -1 +} GraphicsControlBlock; + +/****************************************************************************** + GIF encoding routines +******************************************************************************/ + +/* Main entry points */ +GifFileType *EGifOpenFileName(const char *GifFileName, + const bool GifTestExistence, int *Error); +GifFileType *EGifOpenFileHandle(const int GifFileHandle, int *Error); +GifFileType *EGifOpen(void *userPtr, OutputFunc writeFunc, int *Error); +int EGifSpew(GifFileType *GifFile); +const char *EGifGetGifVersion(GifFileType *GifFile); /* new in 5.x */ +int EGifCloseFile(GifFileType *GifFile, int *ErrorCode); + +#define E_GIF_SUCCEEDED 0 +#define E_GIF_ERR_OPEN_FAILED 1 /* And EGif possible errors. */ +#define E_GIF_ERR_WRITE_FAILED 2 +#define E_GIF_ERR_HAS_SCRN_DSCR 3 +#define E_GIF_ERR_HAS_IMAG_DSCR 4 +#define E_GIF_ERR_NO_COLOR_MAP 5 +#define E_GIF_ERR_DATA_TOO_BIG 6 +#define E_GIF_ERR_NOT_ENOUGH_MEM 7 +#define E_GIF_ERR_DISK_IS_FULL 8 +#define E_GIF_ERR_CLOSE_FAILED 9 +#define E_GIF_ERR_NOT_WRITEABLE 10 + +/* These are legacy. You probably do not want to call them directly */ +int EGifPutScreenDesc(GifFileType *GifFile, const int GifWidth, + const int GifHeight, const int GifColorRes, + const int GifBackGround, + const ColorMapObject *GifColorMap); +int EGifPutImageDesc(GifFileType *GifFile, const int GifLeft, const int GifTop, + const int GifWidth, const int GifHeight, + const bool GifInterlace, + const ColorMapObject *GifColorMap); +void EGifSetGifVersion(GifFileType *GifFile, const bool gif89); +int EGifPutLine(GifFileType *GifFile, GifPixelType *GifLine, int GifLineLen); +int EGifPutPixel(GifFileType *GifFile, const GifPixelType GifPixel); +int EGifPutComment(GifFileType *GifFile, const char *GifComment); +int EGifPutExtensionLeader(GifFileType *GifFile, const int GifExtCode); +int EGifPutExtensionBlock(GifFileType *GifFile, const int GifExtLen, + const void *GifExtension); +int EGifPutExtensionTrailer(GifFileType *GifFile); +int EGifPutExtension(GifFileType *GifFile, const int GifExtCode, + const int GifExtLen, const void *GifExtension); +int EGifPutCode(GifFileType *GifFile, int GifCodeSize, + const GifByteType *GifCodeBlock); +int EGifPutCodeNext(GifFileType *GifFile, const GifByteType *GifCodeBlock); + +/****************************************************************************** + GIF decoding routines +******************************************************************************/ + +/* Main entry points */ +GifFileType *DGifOpenFileName(const char *GifFileName, int *Error); +GifFileType *DGifOpenFileHandle(int GifFileHandle, int *Error); +int DGifSlurp(GifFileType *GifFile); +GifFileType *DGifOpen(void *userPtr, InputFunc readFunc, + int *Error); /* new one (TVT) */ +int DGifCloseFile(GifFileType *GifFile, int *ErrorCode); + +#define D_GIF_SUCCEEDED 0 +#define D_GIF_ERR_OPEN_FAILED 101 /* And DGif possible errors. */ +#define D_GIF_ERR_READ_FAILED 102 +#define D_GIF_ERR_NOT_GIF_FILE 103 +#define D_GIF_ERR_NO_SCRN_DSCR 104 +#define D_GIF_ERR_NO_IMAG_DSCR 105 +#define D_GIF_ERR_NO_COLOR_MAP 106 +#define D_GIF_ERR_WRONG_RECORD 107 +#define D_GIF_ERR_DATA_TOO_BIG 108 +#define D_GIF_ERR_NOT_ENOUGH_MEM 109 +#define D_GIF_ERR_CLOSE_FAILED 110 +#define D_GIF_ERR_NOT_READABLE 111 +#define D_GIF_ERR_IMAGE_DEFECT 112 +#define D_GIF_ERR_EOF_TOO_SOON 113 + +/* These are legacy. You probably do not want to call them directly */ +int DGifGetScreenDesc(GifFileType *GifFile); +int DGifGetRecordType(GifFileType *GifFile, GifRecordType *GifType); +int DGifGetImageHeader(GifFileType *GifFile); +int DGifGetImageDesc(GifFileType *GifFile); +int DGifGetLine(GifFileType *GifFile, GifPixelType *GifLine, int GifLineLen); +int DGifGetPixel(GifFileType *GifFile, GifPixelType GifPixel); +int DGifGetExtension(GifFileType *GifFile, int *GifExtCode, + GifByteType **GifExtension); +int DGifGetExtensionNext(GifFileType *GifFile, GifByteType **GifExtension); +int DGifGetCode(GifFileType *GifFile, int *GifCodeSize, + GifByteType **GifCodeBlock); +int DGifGetCodeNext(GifFileType *GifFile, GifByteType **GifCodeBlock); +int DGifGetLZCodes(GifFileType *GifFile, int *GifCode); +const char *DGifGetGifVersion(GifFileType *GifFile); + +/****************************************************************************** + Error handling and reporting. +******************************************************************************/ +extern const char *GifErrorString(int ErrorCode); /* new in 2012 - ESR */ + +/***************************************************************************** + it g in core. +******************************************************************************/ + +/****************************************************************************** + Color map handling from gif_alloc.c +******************************************************************************/ + +extern ColorMapObject *GifMakeMapObject(int ColorCount, + const GifColorType *ColorMap); +extern void GifFreeMapObject(ColorMapObject *Object); +extern ColorMapObject *GifUnionColorMap(const ColorMapObject *ColorIn1, + const ColorMapObject *ColorIn2, + GifPixelType ColorTransIn2[]); +extern int GifBitSize(int n); + +/****************************************************************************** + Support for the in-core structures allocation (slurp mode). +******************************************************************************/ + +extern void GifApplyTranslation(SavedImage *Image, + const GifPixelType Translation[]); +extern int GifAddExtensionBlock(int *ExtensionBlock_Count, + ExtensionBlock **ExtensionBlocks, int Function, + unsigned int Len, unsigned char ExtData[]); +extern void GifFreeExtensions(int *ExtensionBlock_Count, + ExtensionBlock **ExtensionBlocks); +extern SavedImage *GifMakeSavedImage(GifFileType *GifFile, + const SavedImage *CopyFrom); +extern void GifFreeSavedImages(GifFileType *GifFile); + +/****************************************************************************** + 5.x functions for GIF89 graphics control blocks +******************************************************************************/ + +int DGifExtensionToGCB(const size_t GifExtensionLength, + const GifByteType *GifExtension, + GraphicsControlBlock *GCB); +size_t EGifGCBToExtension(const GraphicsControlBlock *GCB, + GifByteType *GifExtension); + +int DGifSavedExtensionToGCB(GifFileType *GifFile, int ImageIndex, + GraphicsControlBlock *GCB); +int EGifGCBToSavedExtension(const GraphicsControlBlock *GCB, + GifFileType *GifFile, int ImageIndex); + +/****************************************************************************** + The library's internal utility font +******************************************************************************/ + +#define GIF_FONT_WIDTH 8 +#define GIF_FONT_HEIGHT 8 +extern const unsigned char GifAsciiTable8x8[][GIF_FONT_WIDTH]; + +extern void GifDrawText8x8(SavedImage *Image, const int x, const int y, + const char *legend, const int color); + +extern void GifDrawBox(SavedImage *Image, const int x, const int y, const int w, + const int d, const int color); + +extern void GifDrawRectangle(SavedImage *Image, const int x, const int y, + const int w, const int d, const int color); + +extern void GifDrawBoxedText8x8(SavedImage *Image, const int x, const int y, + const char *legend, const int border, + const int bg, const int fg); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ +#endif /* _GIF_LIB_H */ + +/* end */ diff --git a/torchvision/csrc/io/image/cpu/giflib/gif_lib_private.h b/torchvision/csrc/io/image/cpu/giflib/gif_lib_private.h new file mode 100644 index 0000000000000000000000000000000000000000..19578d4530c6495322941c6c31418d1aa200f361 --- /dev/null +++ b/torchvision/csrc/io/image/cpu/giflib/gif_lib_private.h @@ -0,0 +1,72 @@ +/**************************************************************************** + +gif_lib_private.h - internal giflib routines and structures + +SPDX-License-Identifier: MIT + +****************************************************************************/ + +#ifndef _GIF_LIB_PRIVATE_H +#define _GIF_LIB_PRIVATE_H + +#include "gif_hash.h" +#include "gif_lib.h" + +#ifndef SIZE_MAX +#define SIZE_MAX UINTPTR_MAX +#endif + +#define EXTENSION_INTRODUCER 0x21 +#define DESCRIPTOR_INTRODUCER 0x2c +#define TERMINATOR_INTRODUCER 0x3b + +#define LZ_MAX_CODE 4095 /* Biggest code possible in 12 bits. */ +#define LZ_BITS 12 + +#define FLUSH_OUTPUT 4096 /* Impossible code, to signal flush. */ +#define FIRST_CODE 4097 /* Impossible code, to signal first. */ +#define NO_SUCH_CODE 4098 /* Impossible code, to signal empty. */ + +#define FILE_STATE_WRITE 0x01 +#define FILE_STATE_SCREEN 0x02 +#define FILE_STATE_IMAGE 0x04 +#define FILE_STATE_READ 0x08 + +#define IS_READABLE(Private) (Private->FileState & FILE_STATE_READ) +#define IS_WRITEABLE(Private) (Private->FileState & FILE_STATE_WRITE) + +typedef struct GifFilePrivateType { + GifWord FileState, FileHandle, /* Where all this data goes to! */ + BitsPerPixel, /* Bits per pixel (Codes uses at least this + 1). */ + ClearCode, /* The CLEAR LZ code. */ + EOFCode, /* The EOF LZ code. */ + RunningCode, /* The next code algorithm can generate. */ + RunningBits, /* The number of bits required to represent + RunningCode. */ + MaxCode1, /* 1 bigger than max. possible code, in RunningBits bits. + */ + LastCode, /* The code before the current code. */ + CrntCode, /* Current algorithm code. */ + StackPtr, /* For character stack (see below). */ + CrntShiftState; /* Number of bits in CrntShiftDWord. */ + unsigned long CrntShiftDWord; /* For bytes decomposition into codes. */ + unsigned long PixelCount; /* Number of pixels in image. */ + FILE *File; /* File as stream. */ + InputFunc Read; /* function to read gif input (TVT) */ + OutputFunc Write; /* function to write gif output (MRB) */ + GifByteType Buf[256]; /* Compressed input is buffered here. */ + GifByteType Stack[LZ_MAX_CODE]; /* Decoded pixels are stacked here. */ + GifByteType Suffix[LZ_MAX_CODE + 1]; /* So we can trace the codes. */ + GifPrefixType Prefix[LZ_MAX_CODE + 1]; + GifHashTableType *HashTable; + bool gif89; +} GifFilePrivateType; + +#ifndef HAVE_REALLOCARRAY +extern void *openbsd_reallocarray(void *optr, size_t nmemb, size_t size); +#define reallocarray openbsd_reallocarray +#endif + +#endif /* _GIF_LIB_PRIVATE_H */ + +/* end */ diff --git a/torchvision/csrc/io/image/cpu/giflib/gifalloc.c b/torchvision/csrc/io/image/cpu/giflib/gifalloc.c new file mode 100644 index 0000000000000000000000000000000000000000..926d54ebcf7327c9ee6a1c4a6982438515db1d9c --- /dev/null +++ b/torchvision/csrc/io/image/cpu/giflib/gifalloc.c @@ -0,0 +1,425 @@ +/***************************************************************************** + + GIF construction tools + +****************************************************************************/ +// SPDX-License-Identifier: MIT +// SPDX-FileCopyrightText: Copyright (C) Eric S. Raymond + +#include +#include +#include + +#include "gif_lib.h" +#include "gif_lib_private.h" + +#define MAX(x, y) (((x) > (y)) ? (x) : (y)) + +/****************************************************************************** + Miscellaneous utility functions +******************************************************************************/ + +/* return smallest bitfield size n will fit in */ +int GifBitSize(int n) { + int i; + + for (i = 1; i <= 8; i++) { + if ((1 << i) >= n) { + break; + } + } + return (i); +} + +/****************************************************************************** + Color map object functions +******************************************************************************/ + +/* + * Allocate a color map of given size; initialize with contents of + * ColorMap if that pointer is non-NULL. + */ +ColorMapObject *GifMakeMapObject(int ColorCount, const GifColorType *ColorMap) { + ColorMapObject *Object; + + /*** FIXME: Our ColorCount has to be a power of two. Is it necessary to + * make the user know that or should we automatically round up instead? + */ + if (ColorCount != (1 << GifBitSize(ColorCount))) { + return ((ColorMapObject *)NULL); + } + + Object = (ColorMapObject *)malloc(sizeof(ColorMapObject)); + if (Object == (ColorMapObject *)NULL) { + return ((ColorMapObject *)NULL); + } + + Object->Colors = + (GifColorType *)calloc(ColorCount, sizeof(GifColorType)); + if (Object->Colors == (GifColorType *)NULL) { + free(Object); + return ((ColorMapObject *)NULL); + } + + Object->ColorCount = ColorCount; + Object->BitsPerPixel = GifBitSize(ColorCount); + Object->SortFlag = false; + + if (ColorMap != NULL) { + memcpy((char *)Object->Colors, (char *)ColorMap, + ColorCount * sizeof(GifColorType)); + } + + return (Object); +} + +/******************************************************************************* + Free a color map object +*******************************************************************************/ +void GifFreeMapObject(ColorMapObject *Object) { + if (Object != NULL) { + (void)free(Object->Colors); + (void)free(Object); + } +} + +#ifdef DEBUG +void DumpColorMap(ColorMapObject *Object, FILE *fp) { + if (Object != NULL) { + int i, j, Len = Object->ColorCount; + + for (i = 0; i < Len; i += 4) { + for (j = 0; j < 4 && j < Len; j++) { + (void)fprintf(fp, "%3d: %02x %02x %02x ", + i + j, Object->Colors[i + j].Red, + Object->Colors[i + j].Green, + Object->Colors[i + j].Blue); + } + (void)fprintf(fp, "\n"); + } + } +} +#endif /* DEBUG */ + +/******************************************************************************* + Compute the union of two given color maps and return it. If result can't + fit into 256 colors, NULL is returned, the allocated union otherwise. + ColorIn1 is copied as is to ColorUnion, while colors from ColorIn2 are + copied iff they didn't exist before. ColorTransIn2 maps the old + ColorIn2 into the ColorUnion color map table./ +*******************************************************************************/ +ColorMapObject *GifUnionColorMap(const ColorMapObject *ColorIn1, + const ColorMapObject *ColorIn2, + GifPixelType ColorTransIn2[]) { + int i, j, CrntSlot, RoundUpTo, NewGifBitSize; + ColorMapObject *ColorUnion; + + /* + * We don't worry about duplicates within either color map; if + * the caller wants to resolve those, he can perform unions + * with an empty color map. + */ + + /* Allocate table which will hold the result for sure. */ + ColorUnion = GifMakeMapObject( + MAX(ColorIn1->ColorCount, ColorIn2->ColorCount) * 2, NULL); + + if (ColorUnion == NULL) { + return (NULL); + } + + /* + * Copy ColorIn1 to ColorUnion. + */ + for (i = 0; i < ColorIn1->ColorCount; i++) { + ColorUnion->Colors[i] = ColorIn1->Colors[i]; + } + CrntSlot = ColorIn1->ColorCount; + + /* + * Potentially obnoxious hack: + * + * Back CrntSlot down past all contiguous {0, 0, 0} slots at the end + * of table 1. This is very useful if your display is limited to + * 16 colors. + */ + while (ColorIn1->Colors[CrntSlot - 1].Red == 0 && + ColorIn1->Colors[CrntSlot - 1].Green == 0 && + ColorIn1->Colors[CrntSlot - 1].Blue == 0) { + CrntSlot--; + } + + /* Copy ColorIn2 to ColorUnion (use old colors if they exist): */ + for (i = 0; i < ColorIn2->ColorCount && CrntSlot <= 256; i++) { + /* Let's see if this color already exists: */ + for (j = 0; j < ColorIn1->ColorCount; j++) { + if (memcmp(&ColorIn1->Colors[j], &ColorIn2->Colors[i], + sizeof(GifColorType)) == 0) { + break; + } + } + + if (j < ColorIn1->ColorCount) { + ColorTransIn2[i] = j; /* color exists in Color1 */ + } else { + /* Color is new - copy it to a new slot: */ + ColorUnion->Colors[CrntSlot] = ColorIn2->Colors[i]; + ColorTransIn2[i] = CrntSlot++; + } + } + + if (CrntSlot > 256) { + GifFreeMapObject(ColorUnion); + return ((ColorMapObject *)NULL); + } + + NewGifBitSize = GifBitSize(CrntSlot); + RoundUpTo = (1 << NewGifBitSize); + + if (RoundUpTo != ColorUnion->ColorCount) { + GifColorType *Map = ColorUnion->Colors; + + /* + * Zero out slots up to next power of 2. + * We know these slots exist because of the way ColorUnion's + * start dimension was computed. + */ + for (j = CrntSlot; j < RoundUpTo; j++) { + Map[j].Red = Map[j].Green = Map[j].Blue = 0; + } + + /* perhaps we can shrink the map? */ + if (RoundUpTo < ColorUnion->ColorCount) { + GifColorType *new_map = (GifColorType *)reallocarray( + Map, RoundUpTo, sizeof(GifColorType)); + if (new_map == NULL) { + GifFreeMapObject(ColorUnion); + return ((ColorMapObject *)NULL); + } + ColorUnion->Colors = new_map; + } + } + + ColorUnion->ColorCount = RoundUpTo; + ColorUnion->BitsPerPixel = NewGifBitSize; + + return (ColorUnion); +} + +/******************************************************************************* + Apply a given color translation to the raster bits of an image +*******************************************************************************/ +void GifApplyTranslation(SavedImage *Image, const GifPixelType Translation[]) { + int i; + int RasterSize = + Image->ImageDesc.Height * Image->ImageDesc.Width; + + for (i = 0; i < RasterSize; i++) { + Image->RasterBits[i] = Translation[Image->RasterBits[i]]; + } +} + +/****************************************************************************** + Extension record functions +******************************************************************************/ +int GifAddExtensionBlock(int *ExtensionBlockCount, + ExtensionBlock **ExtensionBlocks, int Function, + unsigned int Len, unsigned char ExtData[]) { + ExtensionBlock *ep; + + if (*ExtensionBlocks == NULL) { + *ExtensionBlocks = + (ExtensionBlock *)malloc(sizeof(ExtensionBlock)); + } else { + ExtensionBlock *ep_new = (ExtensionBlock *)reallocarray( + *ExtensionBlocks, (*ExtensionBlockCount + 1), + sizeof(ExtensionBlock)); + if (ep_new == NULL) { + return (GIF_ERROR); + } + *ExtensionBlocks = ep_new; + } + + if (*ExtensionBlocks == NULL) { + return (GIF_ERROR); + } + + ep = &(*ExtensionBlocks)[(*ExtensionBlockCount)++]; + + ep->Function = Function; + ep->ByteCount = Len; + ep->Bytes = (GifByteType *)malloc(ep->ByteCount); + if (ep->Bytes == NULL) { + return (GIF_ERROR); + } + + if (ExtData != NULL) { + memcpy(ep->Bytes, ExtData, Len); + } + + return (GIF_OK); +} + +void GifFreeExtensions(int *ExtensionBlockCount, + ExtensionBlock **ExtensionBlocks) { + ExtensionBlock *ep; + + if (*ExtensionBlocks == NULL) { + return; + } + + for (ep = *ExtensionBlocks; + ep < (*ExtensionBlocks + *ExtensionBlockCount); ep++) { + (void)free((char *)ep->Bytes); + } + (void)free((char *)*ExtensionBlocks); + *ExtensionBlocks = NULL; + *ExtensionBlockCount = 0; +} + +/****************************************************************************** + Image block allocation functions +******************************************************************************/ + +/* Private Function: + * Frees the last image in the GifFile->SavedImages array + */ +void FreeLastSavedImage(GifFileType *GifFile) { + SavedImage *sp; + + if ((GifFile == NULL) || (GifFile->SavedImages == NULL)) { + return; + } + + /* Remove one SavedImage from the GifFile */ + GifFile->ImageCount--; + sp = &GifFile->SavedImages[GifFile->ImageCount]; + + /* Deallocate its Colormap */ + if (sp->ImageDesc.ColorMap != NULL) { + GifFreeMapObject(sp->ImageDesc.ColorMap); + sp->ImageDesc.ColorMap = NULL; + } + + /* Deallocate the image data */ + if (sp->RasterBits != NULL) { + free((char *)sp->RasterBits); + } + + /* Deallocate any extensions */ + GifFreeExtensions(&sp->ExtensionBlockCount, &sp->ExtensionBlocks); + + /*** FIXME: We could realloc the GifFile->SavedImages structure but is + * there a point to it? Saves some memory but we'd have to do it every + * time. If this is used in GifFreeSavedImages then it would be + * inefficient (The whole array is going to be deallocated.) If we just + * use it when we want to free the last Image it's convenient to do it + * here. + */ +} + +/* + * Append an image block to the SavedImages array + */ +SavedImage *GifMakeSavedImage(GifFileType *GifFile, + const SavedImage *CopyFrom) { + // cppcheck-suppress ctunullpointer + if (GifFile->SavedImages == NULL) { + GifFile->SavedImages = (SavedImage *)malloc(sizeof(SavedImage)); + } else { + SavedImage *newSavedImages = (SavedImage *)reallocarray( + GifFile->SavedImages, (GifFile->ImageCount + 1), + sizeof(SavedImage)); + if (newSavedImages == NULL) { + return ((SavedImage *)NULL); + } + GifFile->SavedImages = newSavedImages; + } + if (GifFile->SavedImages == NULL) { + return ((SavedImage *)NULL); + } else { + SavedImage *sp = &GifFile->SavedImages[GifFile->ImageCount++]; + + if (CopyFrom != NULL) { + memcpy((char *)sp, CopyFrom, sizeof(SavedImage)); + + /* + * Make our own allocated copies of the heap fields in + * the copied record. This guards against potential + * aliasing problems. + */ + + /* first, the local color map */ + if (CopyFrom->ImageDesc.ColorMap != NULL) { + sp->ImageDesc.ColorMap = GifMakeMapObject( + CopyFrom->ImageDesc.ColorMap->ColorCount, + CopyFrom->ImageDesc.ColorMap->Colors); + if (sp->ImageDesc.ColorMap == NULL) { + FreeLastSavedImage(GifFile); + return (SavedImage *)(NULL); + } + } + + /* next, the raster */ + sp->RasterBits = (unsigned char *)reallocarray( + NULL, + (CopyFrom->ImageDesc.Height * + CopyFrom->ImageDesc.Width), + sizeof(GifPixelType)); + if (sp->RasterBits == NULL) { + FreeLastSavedImage(GifFile); + return (SavedImage *)(NULL); + } + memcpy(sp->RasterBits, CopyFrom->RasterBits, + sizeof(GifPixelType) * + CopyFrom->ImageDesc.Height * + CopyFrom->ImageDesc.Width); + + /* finally, the extension blocks */ + if (CopyFrom->ExtensionBlocks != NULL) { + sp->ExtensionBlocks = + (ExtensionBlock *)reallocarray( + NULL, CopyFrom->ExtensionBlockCount, + sizeof(ExtensionBlock)); + if (sp->ExtensionBlocks == NULL) { + FreeLastSavedImage(GifFile); + return (SavedImage *)(NULL); + } + memcpy(sp->ExtensionBlocks, + CopyFrom->ExtensionBlocks, + sizeof(ExtensionBlock) * + CopyFrom->ExtensionBlockCount); + } + } else { + memset((char *)sp, '\0', sizeof(SavedImage)); + } + + return (sp); + } +} + +void GifFreeSavedImages(GifFileType *GifFile) { + SavedImage *sp; + + if ((GifFile == NULL) || (GifFile->SavedImages == NULL)) { + return; + } + for (sp = GifFile->SavedImages; + sp < GifFile->SavedImages + GifFile->ImageCount; sp++) { + if (sp->ImageDesc.ColorMap != NULL) { + GifFreeMapObject(sp->ImageDesc.ColorMap); + sp->ImageDesc.ColorMap = NULL; + } + + if (sp->RasterBits != NULL) { + free((char *)sp->RasterBits); + } + + GifFreeExtensions(&sp->ExtensionBlockCount, + &sp->ExtensionBlocks); + } + free((char *)GifFile->SavedImages); + GifFile->SavedImages = NULL; +} + +/* end */ diff --git a/torchvision/csrc/io/image/cpu/giflib/openbsd-reallocarray.c b/torchvision/csrc/io/image/cpu/giflib/openbsd-reallocarray.c new file mode 100644 index 0000000000000000000000000000000000000000..e09ab245ad4c617b3572cb619f1beecf177189b0 --- /dev/null +++ b/torchvision/csrc/io/image/cpu/giflib/openbsd-reallocarray.c @@ -0,0 +1,73 @@ +/* + * SPDX-FileCopyrightText: Copyright (C) 2008 Otto Moerbeek + * SPDX-License-Identifier: MIT + */ + +#include +#include +#include +#include + +#ifndef SIZE_MAX +#define SIZE_MAX UINTPTR_MAX +#endif + +/* + * This is sqrt(SIZE_MAX+1), as s1*s2 <= SIZE_MAX + * if both s1 < MUL_NO_OVERFLOW and s2 < MUL_NO_OVERFLOW + */ +#define MUL_NO_OVERFLOW ((size_t)1 << (sizeof(size_t) * 4)) + +void *openbsd_reallocarray(void *optr, size_t nmemb, size_t size) { + if ((nmemb >= MUL_NO_OVERFLOW || size >= MUL_NO_OVERFLOW) && + nmemb > 0 && SIZE_MAX / nmemb < size) { + errno = ENOMEM; + return NULL; + } + /* + * Head off variations in realloc behavior on different + * platforms (reported by MarkR ) + * + * The behaviour of reallocarray is implementation-defined if + * nmemb or size is zero. It can return NULL or non-NULL + * depending on the platform. + * https://www.securecoding.cert.org/confluence/display/c/MEM04-C.Beware+of+zero-lengthallocations + * + * Here are some extracts from realloc man pages on different platforms. + * + * void realloc( void memblock, size_t size ); + * + * Windows: + * + * If there is not enough available memory to expand the block + * to the given size, the original block is left unchanged, + * and NULL is returned. If size is zero, then the block + * pointed to by memblock is freed; the return value is NULL, + * and memblock is left pointing at a freed block. + * + * OpenBSD: + * + * If size or nmemb is equal to 0, a unique pointer to an + * access protected, zero sized object is returned. Access via + * this pointer will generate a SIGSEGV exception. + * + * Linux: + * + * If size was equal to 0, either NULL or a pointer suitable + * to be passed to free() is returned. + * + * OS X: + * + * If size is zero and ptr is not NULL, a new, minimum sized + * object is allocated and the original object is freed. + * + * It looks like images with zero width or height can trigger + * this, and fuzzing behaviour will differ by platform, so + * fuzzing on one platform may not detect zero-size allocation + * problems on other platforms. + */ + if (size == 0 || nmemb == 0) { + return NULL; + } + return realloc(optr, size * nmemb); +} diff --git a/torchvision/csrc/io/image/cpu/read_write_file.cpp b/torchvision/csrc/io/image/cpu/read_write_file.cpp index a0bb7df72d57915f5c03fbf8be1653ad3404b14c..06de72a5053c0028f2ee48947049b012e4cd912d 100644 --- a/torchvision/csrc/io/image/cpu/read_write_file.cpp +++ b/torchvision/csrc/io/image/cpu/read_write_file.cpp @@ -17,7 +17,7 @@ std::wstring utf8_decode(const std::string& str) { return std::wstring(); } int size_needed = MultiByteToWideChar( - CP_UTF8, 0, str.c_str(), static_cast(str.size()), NULL, 0); + CP_UTF8, 0, str.c_str(), static_cast(str.size()), nullptr, 0); TORCH_CHECK(size_needed > 0, "Error converting the content to Unicode"); std::wstring wstrTo(size_needed, 0); MultiByteToWideChar( @@ -33,6 +33,8 @@ std::wstring utf8_decode(const std::string& str) { #endif torch::Tensor read_file(const std::string& filename) { + C10_LOG_API_USAGE_ONCE( + "torchvision.csrc.io.image.cpu.read_write_file.read_file"); #ifdef _WIN32 // According to // https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/stat-functions?view=vs-2019, @@ -76,6 +78,8 @@ torch::Tensor read_file(const std::string& filename) { } void write_file(const std::string& filename, torch::Tensor& data) { + C10_LOG_API_USAGE_ONCE( + "torchvision.csrc.io.image.cpu.read_write_file.write_file"); // Check that the input tensor is on CPU TORCH_CHECK(data.device() == torch::kCPU, "Input tensor should be on CPU"); diff --git a/torchvision/csrc/io/image/cuda/decode_jpeg_cuda.cpp b/torchvision/csrc/io/image/cuda/decode_jpeg_cuda.cpp index 68f63ced427df927a1a789d68dbba0e58b9edf52..26fecc3e1f3d1fe01984c206b31a6c8c56272b9b 100644 --- a/torchvision/csrc/io/image/cuda/decode_jpeg_cuda.cpp +++ b/torchvision/csrc/io/image/cuda/decode_jpeg_cuda.cpp @@ -1,4 +1,4 @@ -#include "decode_jpeg_cuda.h" +#include "encode_decode_jpegs_cuda.h" #include @@ -33,6 +33,8 @@ torch::Tensor decode_jpeg_cuda( const torch::Tensor& data, ImageReadMode mode, torch::Device device) { + C10_LOG_API_USAGE_ONCE( + "torchvision.csrc.io.image.cuda.decode_jpeg_cuda.decode_jpeg_cuda"); TORCH_CHECK(data.dtype() == torch::kU8, "Expected a torch.uint8 tensor"); TORCH_CHECK( @@ -45,10 +47,31 @@ torch::Tensor decode_jpeg_cuda( TORCH_CHECK(device.is_cuda(), "Expected a cuda device") + int major_version; + int minor_version; + nvjpegStatus_t get_major_property_status = + nvjpegGetProperty(MAJOR_VERSION, &major_version); + nvjpegStatus_t get_minor_property_status = + nvjpegGetProperty(MINOR_VERSION, &minor_version); + + TORCH_CHECK( + get_major_property_status == NVJPEG_STATUS_SUCCESS, + "nvjpegGetProperty failed: ", + get_major_property_status); + TORCH_CHECK( + get_minor_property_status == NVJPEG_STATUS_SUCCESS, + "nvjpegGetProperty failed: ", + get_minor_property_status); + if ((major_version < 11) || ((major_version == 11) && (minor_version < 6))) { + TORCH_WARN_ONCE( + "There is a memory leak issue in the nvjpeg library for CUDA versions < 11.6. " + "Make sure to rely on CUDA 11.6 or above before using decode_jpeg(..., device='cuda')."); + } + at::cuda::CUDAGuard device_guard(device); // Create global nvJPEG handle - std::once_flag nvjpeg_handle_creation_flag; + static std::once_flag nvjpeg_handle_creation_flag; std::call_once(nvjpeg_handle_creation_flag, []() { if (nvjpeg_handle == nullptr) { nvjpegStatus_t create_status = nvjpegCreateSimple(&nvjpeg_handle); diff --git a/torchvision/csrc/io/image/cuda/decode_jpeg_cuda.h b/torchvision/csrc/io/image/cuda/encode_decode_jpegs_cuda.h similarity index 62% rename from torchvision/csrc/io/image/cuda/decode_jpeg_cuda.h rename to torchvision/csrc/io/image/cuda/encode_decode_jpegs_cuda.h index 496b355e9b743692ebacf3f440420e3da41d72a4..7723d11d621b10c70e6cb6ba5579b6703a6b1e8a 100644 --- a/torchvision/csrc/io/image/cuda/decode_jpeg_cuda.h +++ b/torchvision/csrc/io/image/cuda/encode_decode_jpegs_cuda.h @@ -2,6 +2,7 @@ #include #include "../image_read_mode.h" +#include "encode_jpegs_cuda.h" namespace vision { namespace image { @@ -11,5 +12,9 @@ C10_EXPORT torch::Tensor decode_jpeg_cuda( ImageReadMode mode, torch::Device device); +C10_EXPORT std::vector encode_jpegs_cuda( + const std::vector& decoded_images, + const int64_t quality); + } // namespace image } // namespace vision diff --git a/torchvision/csrc/io/image/cuda/encode_jpegs_cuda.cpp b/torchvision/csrc/io/image/cuda/encode_jpegs_cuda.cpp new file mode 100644 index 0000000000000000000000000000000000000000..1f10327ddbff8c5e23bfcb88878753d7bc31c45a --- /dev/null +++ b/torchvision/csrc/io/image/cuda/encode_jpegs_cuda.cpp @@ -0,0 +1,274 @@ +#include "encode_jpegs_cuda.h" +#if !NVJPEG_FOUND +namespace vision { +namespace image { +std::vector encode_jpegs_cuda( + const std::vector& decoded_images, + const int64_t quality) { + TORCH_CHECK( + false, "encode_jpegs_cuda: torchvision not compiled with nvJPEG support"); +} +} // namespace image +} // namespace vision +#else + +#include +#include +#include +#include +#include +#include +#include +#include +#include "c10/core/ScalarType.h" + +namespace vision { +namespace image { + +// We use global variables to cache the encoder and decoder instances and +// reuse them across calls to the corresponding pytorch functions +std::mutex encoderMutex; +std::unique_ptr cudaJpegEncoder; + +std::vector encode_jpegs_cuda( + const std::vector& decoded_images, + const int64_t quality) { + C10_LOG_API_USAGE_ONCE( + "torchvision.csrc.io.image.cuda.encode_jpegs_cuda.encode_jpegs_cuda"); + + // Some nvjpeg structures are not thread safe so we're keeping it single + // threaded for now. In the future this may be an opportunity to unlock + // further speedups + std::lock_guard lock(encoderMutex); + TORCH_CHECK(decoded_images.size() > 0, "Empty input tensor list"); + torch::Device device = decoded_images[0].device(); + at::cuda::CUDAGuard device_guard(device); + + // lazy init of the encoder class + // the encoder object holds on to a lot of state and is expensive to create, + // so we reuse it across calls. NB: the cached structures are device specific + // and cannot be reused across devices + if (cudaJpegEncoder == nullptr || device != cudaJpegEncoder->target_device) { + if (cudaJpegEncoder != nullptr) + delete cudaJpegEncoder.release(); + + cudaJpegEncoder = std::make_unique(device); + + // Unfortunately, we cannot rely on the smart pointer releasing the encoder + // object correctly upon program exit. This is because, when cudaJpegEncoder + // gets destroyed, the CUDA runtime may already be shut down, rendering all + // destroy* calls in the encoder destructor invalid. Instead, we use an + // atexit hook which executes after main() finishes, but hopefully before + // CUDA shuts down when the program exits. If CUDA is already shut down the + // destructor will detect this and will not attempt to destroy any encoder + // structures. + std::atexit([]() { delete cudaJpegEncoder.release(); }); + } + + std::vector contig_images; + contig_images.reserve(decoded_images.size()); + for (const auto& image : decoded_images) { + TORCH_CHECK( + image.dtype() == torch::kU8, "Input tensor dtype should be uint8"); + + TORCH_CHECK( + image.device() == device, + "All input tensors must be on the same CUDA device when encoding with nvjpeg") + + TORCH_CHECK( + image.dim() == 3 && image.numel() > 0, + "Input data should be a 3-dimensional tensor"); + + TORCH_CHECK( + image.size(0) == 3, + "The number of channels should be 3, got: ", + image.size(0)); + + // nvjpeg requires images to be contiguous + if (image.is_contiguous()) { + contig_images.push_back(image); + } else { + contig_images.push_back(image.contiguous()); + } + } + + cudaJpegEncoder->set_quality(quality); + std::vector encoded_images; + at::cuda::CUDAEvent event; + event.record(cudaJpegEncoder->stream); + for (const auto& image : contig_images) { + auto encoded_image = cudaJpegEncoder->encode_jpeg(image); + encoded_images.push_back(encoded_image); + } + + // We use a dedicated stream to do the encoding and even though the results + // may be ready on that stream we cannot assume that they are also available + // on the current stream of the calling context when this function returns. We + // use a blocking event to ensure that this is indeed the case. Crucially, we + // do not want to block the host at this particular point + // (which is what cudaStreamSynchronize would do.) Events allow us to + // synchronize the streams without blocking the host. + event.block(at::cuda::getCurrentCUDAStream( + cudaJpegEncoder->original_device.has_index() + ? cudaJpegEncoder->original_device.index() + : 0)); + return encoded_images; +} + +CUDAJpegEncoder::CUDAJpegEncoder(const torch::Device& target_device) + : original_device{torch::kCUDA, torch::cuda::current_device()}, + target_device{target_device}, + stream{ + target_device.has_index() + ? at::cuda::getStreamFromPool(false, target_device.index()) + : at::cuda::getStreamFromPool(false)} { + nvjpegStatus_t status; + status = nvjpegCreateSimple(&nvjpeg_handle); + TORCH_CHECK( + status == NVJPEG_STATUS_SUCCESS, + "Failed to create nvjpeg handle: ", + status); + + status = nvjpegEncoderStateCreate(nvjpeg_handle, &nv_enc_state, stream); + TORCH_CHECK( + status == NVJPEG_STATUS_SUCCESS, + "Failed to create nvjpeg encoder state: ", + status); + + status = nvjpegEncoderParamsCreate(nvjpeg_handle, &nv_enc_params, stream); + TORCH_CHECK( + status == NVJPEG_STATUS_SUCCESS, + "Failed to create nvjpeg encoder params: ", + status); +} + +CUDAJpegEncoder::~CUDAJpegEncoder() { + /* + The below code works on Mac and Linux, but fails on Windows. + This is because on Windows, the atexit hook which calls this + destructor executes after cuda is already shut down causing SIGSEGV. + We do not have a solution to this problem at the moment, so we'll + just leak the libnvjpeg & cuda variables for the time being and hope + that the CUDA runtime handles cleanup for us. + Please send a PR if you have a solution for this problem. + */ + + // // We run cudaGetDeviceCount as a dummy to test if the CUDA runtime is + // still + // // initialized. If it is not, we can skip the rest of this function as it + // is + // // unsafe to execute. + // int deviceCount = 0; + // cudaError_t error = cudaGetDeviceCount(&deviceCount); + // if (error != cudaSuccess) + // return; // CUDA runtime has already shut down. There's nothing we can do + // // now. + + // nvjpegStatus_t status; + + // status = nvjpegEncoderParamsDestroy(nv_enc_params); + // TORCH_CHECK( + // status == NVJPEG_STATUS_SUCCESS, + // "Failed to destroy nvjpeg encoder params: ", + // status); + + // status = nvjpegEncoderStateDestroy(nv_enc_state); + // TORCH_CHECK( + // status == NVJPEG_STATUS_SUCCESS, + // "Failed to destroy nvjpeg encoder state: ", + // status); + + // cudaStreamSynchronize(stream); + + // status = nvjpegDestroy(nvjpeg_handle); + // TORCH_CHECK( + // status == NVJPEG_STATUS_SUCCESS, "nvjpegDestroy failed: ", status); +} + +torch::Tensor CUDAJpegEncoder::encode_jpeg(const torch::Tensor& src_image) { + int channels = src_image.size(0); + int height = src_image.size(1); + int width = src_image.size(2); + + nvjpegStatus_t status; + cudaError_t cudaStatus; + status = nvjpegEncoderParamsSetSamplingFactors( + nv_enc_params, NVJPEG_CSS_444, stream); + TORCH_CHECK( + status == NVJPEG_STATUS_SUCCESS, + "Failed to set nvjpeg encoder params sampling factors: ", + status); + + nvjpegImage_t target_image; + for (int c = 0; c < channels; c++) { + target_image.channel[c] = src_image[c].data_ptr(); + // this is why we need contiguous tensors + target_image.pitch[c] = width; + } + for (int c = channels; c < NVJPEG_MAX_COMPONENT; c++) { + target_image.channel[c] = nullptr; + target_image.pitch[c] = 0; + } + // Encode the image + status = nvjpegEncodeImage( + nvjpeg_handle, + nv_enc_state, + nv_enc_params, + &target_image, + NVJPEG_INPUT_RGB, + width, + height, + stream); + + TORCH_CHECK( + status == NVJPEG_STATUS_SUCCESS, "image encoding failed: ", status); + // Retrieve length of the encoded image + size_t length; + status = nvjpegEncodeRetrieveBitstreamDevice( + nvjpeg_handle, nv_enc_state, NULL, &length, stream); + TORCH_CHECK( + status == NVJPEG_STATUS_SUCCESS, + "Failed to retrieve encoded image stream state: ", + status); + + // Synchronize the stream to ensure that the encoded image is ready + cudaStatus = cudaStreamSynchronize(stream); + TORCH_CHECK(cudaStatus == cudaSuccess, "CUDA ERROR: ", cudaStatus); + + // Reserve buffer for the encoded image + torch::Tensor encoded_image = torch::empty( + {static_cast(length)}, + torch::TensorOptions() + .dtype(torch::kByte) + .layout(torch::kStrided) + .device(target_device) + .requires_grad(false)); + cudaStatus = cudaStreamSynchronize(stream); + TORCH_CHECK(cudaStatus == cudaSuccess, "CUDA ERROR: ", cudaStatus); + // Retrieve the encoded image + status = nvjpegEncodeRetrieveBitstreamDevice( + nvjpeg_handle, + nv_enc_state, + encoded_image.data_ptr(), + &length, + 0); + TORCH_CHECK( + status == NVJPEG_STATUS_SUCCESS, + "Failed to retrieve encoded image: ", + status); + return encoded_image; +} + +void CUDAJpegEncoder::set_quality(const int64_t quality) { + nvjpegStatus_t paramsQualityStatus = + nvjpegEncoderParamsSetQuality(nv_enc_params, quality, stream); + TORCH_CHECK( + paramsQualityStatus == NVJPEG_STATUS_SUCCESS, + "Failed to set nvjpeg encoder params quality: ", + paramsQualityStatus); +} + +} // namespace image +} // namespace vision + +#endif // NVJPEG_FOUND diff --git a/torchvision/csrc/io/image/cuda/encode_jpegs_cuda.h b/torchvision/csrc/io/image/cuda/encode_jpegs_cuda.h new file mode 100644 index 0000000000000000000000000000000000000000..543940f1585f99d9f0b4b732a391dccce8d68079 --- /dev/null +++ b/torchvision/csrc/io/image/cuda/encode_jpegs_cuda.h @@ -0,0 +1,33 @@ +#pragma once +#include +#include +#if NVJPEG_FOUND + +#include +#include +#include + +namespace vision { +namespace image { + +class CUDAJpegEncoder { + public: + CUDAJpegEncoder(const torch::Device& device); + ~CUDAJpegEncoder(); + + torch::Tensor encode_jpeg(const torch::Tensor& src_image); + + void set_quality(const int64_t quality); + + const torch::Device original_device; + const torch::Device target_device; + const c10::cuda::CUDAStream stream; + + protected: + nvjpegEncoderState_t nv_enc_state; + nvjpegEncoderParams_t nv_enc_params; + nvjpegHandle_t nvjpeg_handle; +}; +} // namespace image +} // namespace vision +#endif diff --git a/torchvision/csrc/io/image/image.cpp b/torchvision/csrc/io/image/image.cpp index 37d64013cb26dd022c9e8a3e6da6eed4b0531986..68267b72604d2266c826bd0a20e7d8bdce8f7473 100644 --- a/torchvision/csrc/io/image/image.cpp +++ b/torchvision/csrc/io/image/image.cpp @@ -1,28 +1,35 @@ #include "image.h" -#include +#include // If we are in a Windows environment, we need to define // initialization functions for the _custom_ops extension #ifdef _WIN32 -PyMODINIT_FUNC PyInit_image(void) { - // No need to do anything. - return NULL; +void* PyInit_image(void) { + return nullptr; } #endif namespace vision { namespace image { -static auto registry = torch::RegisterOperators() - .op("image::decode_png", &decode_png) - .op("image::encode_png", &encode_png) - .op("image::decode_jpeg", &decode_jpeg) - .op("image::encode_jpeg", &encode_jpeg) - .op("image::read_file", &read_file) - .op("image::write_file", &write_file) - .op("image::decode_image", &decode_image) - .op("image::decode_jpeg_cuda", &decode_jpeg_cuda); +static auto registry = + torch::RegisterOperators() + .op("image::decode_gif", &decode_gif) + .op("image::decode_png(Tensor data, int mode, bool allow_16_bits = False, bool apply_exif_orientation=False) -> Tensor", + &decode_png) + .op("image::encode_png", &encode_png) + .op("image::decode_jpeg(Tensor data, int mode, bool apply_exif_orientation=False) -> Tensor", + &decode_jpeg) + .op("image::encode_jpeg", &encode_jpeg) + .op("image::read_file", &read_file) + .op("image::write_file", &write_file) + .op("image::decode_image(Tensor data, int mode, bool apply_exif_orientation=False) -> Tensor", + &decode_image) + .op("image::decode_jpeg_cuda", &decode_jpeg_cuda) + .op("image::encode_jpegs_cuda", &encode_jpegs_cuda) + .op("image::_jpeg_version", &_jpeg_version) + .op("image::_is_compiled_against_turbo", &_is_compiled_against_turbo); } // namespace image } // namespace vision diff --git a/torchvision/csrc/io/image/image.h b/torchvision/csrc/io/image/image.h index 05bac44c77d0329c96a3d3bbb3fe442d2288bf86..f7e9b63801cf572167ac0b03eec497d2fe033c75 100644 --- a/torchvision/csrc/io/image/image.h +++ b/torchvision/csrc/io/image/image.h @@ -1,9 +1,10 @@ #pragma once +#include "cpu/decode_gif.h" #include "cpu/decode_image.h" #include "cpu/decode_jpeg.h" #include "cpu/decode_png.h" #include "cpu/encode_jpeg.h" #include "cpu/encode_png.h" #include "cpu/read_write_file.h" -#include "cuda/decode_jpeg_cuda.h" +#include "cuda/encode_decode_jpegs_cuda.h" diff --git a/torchvision/csrc/io/video/video.cpp b/torchvision/csrc/io/video/video.cpp index d7d28a517702b624407a3295d230c6984924a77f..17ecce2b99e6c80c972c49d68469ac2d0fd754dd 100644 --- a/torchvision/csrc/io/video/video.cpp +++ b/torchvision/csrc/io/video/video.cpp @@ -2,6 +2,8 @@ #include +using namespace ffmpeg; + namespace vision { namespace video { @@ -77,7 +79,7 @@ std::tuple _parseStream(const std::string& streamString) { long index_ = -1; if (match[2].matched) { try { - index_ = c10::stoi(match[2].str()); + index_ = std::stoi(match[2].str()); } catch (const std::exception&) { TORCH_CHECK( false, @@ -98,14 +100,18 @@ void Video::_getDecoderParams( int64_t getPtsOnly, std::string stream, long stream_id = -1, + bool fastSeek = true, bool all_streams = false, + int64_t num_threads = 1, double seekFrameMarginUs = 10) { int64_t videoStartUs = int64_t(videoStartS * 1e6); params.timeoutMs = decoderTimeoutMs; params.startOffset = videoStartUs; params.seekAccuracy = seekFrameMarginUs; + params.fastSeek = fastSeek; params.headerOnly = false; + params.numThreads = num_threads; params.preventStaleness = false; // not sure what this is about @@ -152,25 +158,45 @@ void Video::_getDecoderParams( } // _get decoder params -Video::Video(std::string videoPath, std::string stream) { +void Video::initFromFile( + std::string videoPath, + std::string stream, + int64_t numThreads) { + TORCH_CHECK(!initialized, "Video object can only be initialized once"); + initialized = true; + params.uri = videoPath; + _init(stream, numThreads); +} + +void Video::initFromMemory( + torch::Tensor videoTensor, + std::string stream, + int64_t numThreads) { + TORCH_CHECK(!initialized, "Video object can only be initialized once"); + initialized = true; + callback = MemoryBuffer::getCallback( + videoTensor.data_ptr(), videoTensor.size(0)); + _init(stream, numThreads); +} + +void Video::_init(std::string stream, int64_t numThreads) { + // set number of threads global + numThreads_ = numThreads; // parse stream information current_stream = _parseStream(stream); // note that in the initial call we want to get all streams - Video::_getDecoderParams( + _getDecoderParams( 0, // video start 0, // headerOnly std::get<0>(current_stream), // stream info - remove that long(-1), // stream_id parsed from info above change to -2 - true // read all streams + false, // fastseek: we're using the default param here + true, // read all streams + numThreads_ // global number of Threads for decoding ); std::string logMessage, logType; - // TODO: add read from memory option - params.uri = videoPath; - logType = "file"; - logMessage = videoPath; - // locals std::vector audioFPS, videoFPS; std::vector audioDuration, videoDuration, ccDuration, subsDuration; @@ -180,8 +206,9 @@ Video::Video(std::string videoPath, std::string stream) { c10::Dict> ccMetadata; c10::Dict> subsMetadata; - // calback and metadata defined in struct - succeeded = decoder.init(params, std::move(callback), &metadata); + // callback and metadata defined in struct + DecoderInCallback tmp_callback = callback; + succeeded = decoder.init(params, std::move(tmp_callback), &metadata); if (succeeded) { for (const auto& header : metadata) { double fps = double(header.fps); @@ -216,16 +243,24 @@ Video::Video(std::string videoPath, std::string stream) { streamsMetadata.insert("subtitles", subsMetadata); streamsMetadata.insert("cc", ccMetadata); - succeeded = Video::setCurrentStream(stream); + succeeded = setCurrentStream(stream); LOG(INFO) << "\nDecoder inited with: " << succeeded << "\n"; if (std::get<1>(current_stream) != -1) { LOG(INFO) << "Stream index set to " << std::get<1>(current_stream) << ". If you encounter trouble, consider switching it to automatic stream discovery. \n"; } +} + +Video::Video(std::string videoPath, std::string stream, int64_t numThreads) { + C10_LOG_API_USAGE_ONCE("torchvision.csrc.io.video.video.Video"); + if (!videoPath.empty()) { + initFromFile(videoPath, stream, numThreads); + } } // video bool Video::setCurrentStream(std::string stream = "video") { + TORCH_CHECK(initialized, "Video object has to be initialized first"); if ((!stream.empty()) && (_parseStream(stream) != current_stream)) { current_stream = _parseStream(stream); } @@ -241,23 +276,29 @@ bool Video::setCurrentStream(std::string stream = "video") { std::get<0>(current_stream), // stream long(std::get<1>( current_stream)), // stream_id parsed from info above change to -2 - false // read all streams + false, // fastseek param set to 0 false by default (changed in seek) + false, // read all streams + numThreads_ // global number of threads ); - // calback and metadata defined in Video.h - return (decoder.init(params, std::move(callback), &metadata)); + // callback and metadata defined in Video.h + DecoderInCallback tmp_callback = callback; + return (decoder.init(params, std::move(tmp_callback), &metadata)); } std::tuple Video::getCurrentStream() const { + TORCH_CHECK(initialized, "Video object has to be initialized first"); return current_stream; } c10::Dict>> Video:: getStreamMetadata() const { + TORCH_CHECK(initialized, "Video object has to be initialized first"); return streamsMetadata; } -void Video::Seek(double ts) { +void Video::Seek(double ts, bool fastSeek = false) { + TORCH_CHECK(initialized, "Video object has to be initialized first"); // initialize the class variables used for seeking and retrurn _getDecoderParams( ts, // video start @@ -265,24 +306,29 @@ void Video::Seek(double ts) { std::get<0>(current_stream), // stream long(std::get<1>( current_stream)), // stream_id parsed from info above change to -2 - false // read all streams + fastSeek, // fastseek + false, // read all streams + numThreads_ // global number of threads ); - // calback and metadata defined in Video.h - succeeded = decoder.init(params, std::move(callback), &metadata); + // callback and metadata defined in Video.h + DecoderInCallback tmp_callback = callback; + succeeded = decoder.init(params, std::move(tmp_callback), &metadata); + LOG(INFO) << "Decoder init at seek " << succeeded << "\n"; } std::tuple Video::Next() { + TORCH_CHECK(initialized, "Video object has to be initialized first"); // if failing to decode simply return a null tensor (note, should we - // raise an exeption?) + // raise an exception?) double frame_pts_s; torch::Tensor outFrame = torch::zeros({0}, torch::kByte); // decode single frame DecoderOutputMessage out; int64_t res = decoder.decode(&out, decoderTimeoutMs); - // if successfull + // if successful if (res == 0) { frame_pts_s = double(double(out.header.pts) * 1e-6); @@ -308,7 +354,7 @@ std::tuple Video::Next() { static_cast(format.format.audio.format)); int frameSizeTotal = out.payload->length(); - CHECK_EQ(frameSizeTotal % (outAudioChannels * bytesPerSample), 0); + TORCH_CHECK_EQ(frameSizeTotal % (outAudioChannels * bytesPerSample), 0); int numAudioSamples = frameSizeTotal / (outAudioChannels * bytesPerSample); @@ -331,7 +377,9 @@ std::tuple Video::Next() { static auto registerVideo = torch::class_