diff --git a/.dockerignore b/.dockerignore
old mode 100644
new mode 100755
diff --git a/.flake8 b/.flake8
old mode 100644
new mode 100755
diff --git a/.gitattributes b/.gitattributes
old mode 100644
new mode 100755
diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
old mode 100644
new mode 100755
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
old mode 100644
new mode 100755
diff --git a/.github/workflows/conda-env.yml b/.github/workflows/conda-env.yml
old mode 100644
new mode 100755
diff --git a/.github/workflows/docker-push.yml b/.github/workflows/docker-push.yml
old mode 100644
new mode 100755
diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
old mode 100644
new mode 100755
diff --git a/.github/workflows/pypi-publish.yml b/.github/workflows/pypi-publish.yml
old mode 100644
new mode 100755
diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml
old mode 100644
new mode 100755
diff --git a/.gitignore b/.gitignore
old mode 100644
new mode 100755
diff --git a/CHANGELOG.md b/CHANGELOG.md
old mode 100644
new mode 100755
diff --git a/LICENSE b/LICENSE
old mode 100644
new mode 100755
diff --git a/MANIFEST.in b/MANIFEST.in
old mode 100644
new mode 100755
diff --git a/README.md b/README.md
old mode 100644
new mode 100755
diff --git a/backup-conda-lock.yml b/backup-conda-lock.yml
new file mode 100755
index 0000000..d8cc331
--- /dev/null
+++ b/backup-conda-lock.yml
@@ -0,0 +1,1353 @@
+# This lock file was generated by conda-lock (https://github.com/conda/conda-lock). DO NOT EDIT!
+#
+# A "lock file" contains a concrete list of package versions (with checksums) to be installed. Unlike
+# e.g. `conda env create`, the resulting environment will not change as new package versions become
+# available, unless you explicitly update the lock file.
+#
+# Install this environment as "YOURENV" with:
+# conda-lock install -n YOURENV --file new.conda-lock.yml
+# To update a single package to the latest version compatible with the version constraints in the source:
+# conda-lock lock --lockfile new.conda-lock.yml --update PACKAGE
+# To re-solve the entire environment, e.g. after changing a version constraint in the source file:
+# conda-lock -f environment.yml --lockfile new.conda-lock.yml
+version: 1
+metadata:
+ content_hash:
+ linux-64: 5ad884989a8a0f7345918559305173543c2fbcef136f2c97eab4d8e066b16def
+ channels:
+ - url: conda-forge
+ used_env_vars: []
+ platforms:
+ - linux-64
+ sources:
+ - environment.yml
+package:
+- name: _libgcc_mutex
+ version: '0.1'
+ manager: conda
+ platform: linux-64
+ dependencies: {}
+ url: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2
+ hash:
+ md5: d7c89558ba9fa0495403155b64376d81
+ sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726
+ category: main
+ optional: false
+- name: _openmp_mutex
+ version: '4.5'
+ manager: conda
+ platform: linux-64
+ dependencies:
+ _libgcc_mutex: '0.1'
+ llvm-openmp: '>=9.0.1'
+ url: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_kmp_llvm.tar.bz2
+ hash:
+ md5: 562b26ba2e19059551a811e72ab7f793
+ sha256: 84a66275da3a66e3f3e70e9d8f10496d807d01a9e4ec16cd2274cc5e28c478fc
+ category: main
+ optional: false
+- name: antlr-python-runtime
+ version: 4.9.3
+ manager: conda
+ platform: linux-64
+ dependencies:
+ python: '>=3.6'
+ url: https://conda.anaconda.org/conda-forge/noarch/antlr-python-runtime-4.9.3-pyhd8ed1ab_1.tar.bz2
+ hash:
+ md5: c88eaec8de9ae1fa161205aa18e7a5b1
+ sha256: b91f8ab4ac2b48972fbee1fc8e092cc452fdf59156e4ff2322c94bbf73650f94
+ category: main
+ optional: false
+- name: beautifulsoup4
+ version: 4.12.3
+ manager: conda
+ platform: linux-64
+ dependencies:
+ python: '>=3.6'
+ soupsieve: '>=1.2'
+ url: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_0.conda
+ hash:
+ md5: 332493000404d8411859539a5a630865
+ sha256: 7b05b2d0669029326c623b9df7a29fa49d1982a9e7e31b2fea34b4c9a4a72317
+ category: main
+ optional: false
+- name: brotli-python
+ version: 1.1.0
+ manager: conda
+ platform: linux-64
+ dependencies:
+ libgcc-ng: '>=12'
+ libstdcxx-ng: '>=12'
+ python: '>=3.11,<3.12.0a0'
+ python_abi: 3.11.*
+ url: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311hb755f60_1.conda
+ hash:
+ md5: cce9e7c3f1c307f2a5fb08a2922d6164
+ sha256: 559093679e9fdb6061b7b80ca0f9a31fe6ffc213f1dae65bc5c82e2cd1a94107
+ category: main
+ optional: false
+- name: bzip2
+ version: 1.0.8
+ manager: conda
+ platform: linux-64
+ dependencies:
+ libgcc-ng: '>=12'
+ url: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda
+ hash:
+ md5: 69b8b6202a07720f448be700e300ccf4
+ sha256: 242c0c324507ee172c0e0dd2045814e746bb303d1eb78870d182ceb0abc726a8
+ category: main
+ optional: false
+- name: ca-certificates
+ version: 2024.2.2
+ manager: conda
+ platform: linux-64
+ dependencies: {}
+ url: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda
+ hash:
+ md5: 2f4327a1cbe7f022401b236e915a5fef
+ sha256: 91d81bfecdbb142c15066df70cc952590ae8991670198f92c66b62019b251aeb
+ category: main
+ optional: false
+- name: certifi
+ version: 2024.2.2
+ manager: conda
+ platform: linux-64
+ dependencies:
+ python: '>=3.7'
+ url: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda
+ hash:
+ md5: 0876280e409658fc6f9e75d035960333
+ sha256: f1faca020f988696e6b6ee47c82524c7806380b37cfdd1def32f92c326caca54
+ category: main
+ optional: false
+- name: charset-normalizer
+ version: 3.3.2
+ manager: conda
+ platform: linux-64
+ dependencies:
+ python: '>=3.7'
+ url: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda
+ hash:
+ md5: 7f4a9e3fcff3f6356ae99244a014da6a
+ sha256: 20cae47d31fdd58d99c4d2e65fbdcefa0b0de0c84e455ba9d6356a4bdbc4b5b9
+ category: main
+ optional: false
+- name: codetiming
+ version: 1.4.0
+ manager: conda
+ platform: linux-64
+ dependencies:
+ dataclasses: ''
+ python: '>=3.6'
+ url: https://conda.anaconda.org/conda-forge/noarch/codetiming-1.4.0-pyhd8ed1ab_0.tar.bz2
+ hash:
+ md5: a1f3168974155fc60367ef1a88e57569
+ sha256: fe95abca179c43648fb36957d7dd5526c5e28ee04092e303e7b1778c9e964355
+ category: main
+ optional: false
+- name: colorama
+ version: 0.4.6
+ manager: conda
+ platform: linux-64
+ dependencies:
+ python: '>=3.7'
+ url: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2
+ hash:
+ md5: 3faab06a954c2a04039983f2c4a50d99
+ sha256: 2c1b2e9755ce3102bca8d69e8f26e4f087ece73f50418186aee7c74bef8e1698
+ category: main
+ optional: false
+- name: dataclasses
+ version: '0.8'
+ manager: conda
+ platform: linux-64
+ dependencies:
+ python: '>=3.7'
+ url: https://conda.anaconda.org/conda-forge/noarch/dataclasses-0.8-pyhc8e2a94_3.tar.bz2
+ hash:
+ md5: a362b2124b06aad102e2ee4581acee7d
+ sha256: 63a83e62e0939bc1ab32de4ec736f6403084198c4639638b354a352113809c92
+ category: main
+ optional: false
+- name: filelock
+ version: 3.13.1
+ manager: conda
+ platform: linux-64
+ dependencies:
+ python: '>=3.7'
+ url: https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.1-pyhd8ed1ab_0.conda
+ hash:
+ md5: 0c1729b74a8152fde6a38ba0a2ab9f45
+ sha256: 4d742d91412d1f163e5399d2b50c5d479694ebcd309127abb549ca3977f89d2b
+ category: main
+ optional: false
+- name: freetype
+ version: 2.12.1
+ manager: conda
+ platform: linux-64
+ dependencies:
+ libgcc-ng: '>=12'
+ libpng: '>=1.6.39,<1.7.0a0'
+ libzlib: '>=1.2.13,<1.3.0a0'
+ url: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda
+ hash:
+ md5: 9ae35c3d96db2c94ce0cef86efdfa2cb
+ sha256: b2e3c449ec9d907dd4656cb0dc93e140f447175b125a3824b31368b06c666bb6
+ category: main
+ optional: false
+- name: fsspec
+ version: 2024.2.0
+ manager: conda
+ platform: linux-64
+ dependencies:
+ python: '>=3.8'
+ url: https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.2.0-pyhca7485f_0.conda
+ hash:
+ md5: fad86b90138cf5d82c6f5a2ed6e683d9
+ sha256: 3f7e123dd82fe99450d1e0ffa389e8218ef8c9ee257c836e21b489548c039ae6
+ category: main
+ optional: false
+- name: gdown
+ version: 5.1.0
+ manager: conda
+ platform: linux-64
+ dependencies:
+ beautifulsoup4: ''
+ filelock: ''
+ python: '>=3.8'
+ requests: ''
+ tqdm: ''
+ url: https://conda.anaconda.org/conda-forge/noarch/gdown-5.1.0-pyhd8ed1ab_0.conda
+ hash:
+ md5: 6f880647c0270648f710f334c60bc76c
+ sha256: 1ab1e5cf5c851f91abebfc6a6c094bc6e2afa3639e6586f6ff890acc8551a63d
+ category: main
+ optional: false
+- name: gmp
+ version: 6.3.0
+ manager: conda
+ platform: linux-64
+ dependencies:
+ libgcc-ng: '>=12'
+ libstdcxx-ng: '>=12'
+ url: https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-h59595ed_0.conda
+ hash:
+ md5: 0e33ef437202db431aa5a928248cf2e8
+ sha256: 2a50495b6bbbacb03107ea0b752d8358d4a40b572d124a8cade068c147f344f5
+ category: main
+ optional: false
+- name: gmpy2
+ version: 2.1.2
+ manager: conda
+ platform: linux-64
+ dependencies:
+ gmp: '>=6.2.1,<7.0a0'
+ libgcc-ng: '>=12'
+ mpc: '>=1.2.1,<2.0a0'
+ mpfr: '>=4.1.0,<5.0a0'
+ python: '>=3.11,<3.12.0a0'
+ python_abi: 3.11.*
+ url: https://conda.anaconda.org/conda-forge/linux-64/gmpy2-2.1.2-py311h6a5fa03_1.tar.bz2
+ hash:
+ md5: 3515bd4a3d92bbd3cc2d25aac335e34d
+ sha256: 20862200f4d07ba583ab6ae9b56d7de2462474240872100973711dfa20d562d7
+ category: main
+ optional: false
+- name: googleapis-common-protos
+ version: 1.62.0
+ manager: conda
+ platform: linux-64
+ dependencies:
+ protobuf: '>=3.19.5,<5.0.0dev0,!=3.20.0,!=3.20.1,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5'
+ python: '>=3.7'
+ url: https://conda.anaconda.org/conda-forge/noarch/googleapis-common-protos-1.62.0-pyhd8ed1ab_0.conda
+ hash:
+ md5: ca3d0c7ba3a15e943d9c715aba03ae62
+ sha256: 70da3fc08a742022c666d9807f0caba60be1ddbf09b6642c168001bace18c724
+ category: main
+ optional: false
+- name: hydra-core
+ version: 1.3.2
+ manager: conda
+ platform: linux-64
+ dependencies:
+ antlr-python-runtime: 4.9.*
+ importlib_resources: ''
+ omegaconf: '>=2.2,<2.4'
+ packaging: ''
+ python: '>=3.6'
+ url: https://conda.anaconda.org/conda-forge/noarch/hydra-core-1.3.2-pyhd8ed1ab_0.conda
+ hash:
+ md5: 297d09ccdcec5b347d44c88f2b61cf03
+ sha256: 35044b4bb1059c4ed7d8392b776e663a390ad7a2bb6f7e2f09ecd5e9b5d40b75
+ category: main
+ optional: false
+- name: icu
+ version: '73.2'
+ manager: conda
+ platform: linux-64
+ dependencies:
+ libgcc-ng: '>=12'
+ libstdcxx-ng: '>=12'
+ url: https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda
+ hash:
+ md5: cc47e1facc155f91abd89b11e48e72ff
+ sha256: e12fd90ef6601da2875ebc432452590bc82a893041473bc1c13ef29001a73ea8
+ category: main
+ optional: false
+- name: idna
+ version: '3.6'
+ manager: conda
+ platform: linux-64
+ dependencies:
+ python: '>=3.6'
+ url: https://conda.anaconda.org/conda-forge/noarch/idna-3.6-pyhd8ed1ab_0.conda
+ hash:
+ md5: 1a76f09108576397c41c0b0c5bd84134
+ sha256: 6ee4c986d69ce61e60a20b2459b6f2027baeba153f0a64995fd3cb47c2cc7e07
+ category: main
+ optional: false
+- name: importlib_resources
+ version: 6.1.1
+ manager: conda
+ platform: linux-64
+ dependencies:
+ python: '>=3.8'
+ zipp: '>=3.1.0'
+ url: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.1.1-pyhd8ed1ab_0.conda
+ hash:
+ md5: 3d5fa25cf42f3f32a12b2d874ace8574
+ sha256: e584f9ae08fb2d242af0ce7e19e3cd2f85f362d8523119e08f99edb962db99ed
+ category: main
+ optional: false
+- name: jinja2
+ version: 3.1.3
+ manager: conda
+ platform: linux-64
+ dependencies:
+ markupsafe: '>=2.0'
+ python: '>=3.7'
+ url: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.3-pyhd8ed1ab_0.conda
+ hash:
+ md5: e7d8df6509ba635247ff9aea31134262
+ sha256: fd517b7dd3a61eca34f8a6f9f92f306397149cae1204fce72ac3d227107dafdc
+ category: main
+ optional: false
+- name: lcms2
+ version: '2.16'
+ manager: conda
+ platform: linux-64
+ dependencies:
+ libgcc-ng: '>=12'
+ libjpeg-turbo: '>=3.0.0,<4.0a0'
+ libtiff: '>=4.6.0,<4.7.0a0'
+ url: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda
+ hash:
+ md5: 51bb7010fc86f70eee639b4bb7a894f5
+ sha256: 5c878d104b461b7ef922abe6320711c0d01772f4cd55de18b674f88547870041
+ category: main
+ optional: false
+- name: ld_impl_linux-64
+ version: '2.40'
+ manager: conda
+ platform: linux-64
+ dependencies: {}
+ url: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda
+ hash:
+ md5: 7aca3059a1729aa76c597603f10b0dd3
+ sha256: f6cc89d887555912d6c61b295d398cff9ec982a3417d38025c45d5dd9b9e79cd
+ category: main
+ optional: false
+- name: lerc
+ version: 4.0.0
+ manager: conda
+ platform: linux-64
+ dependencies:
+ libgcc-ng: '>=12'
+ libstdcxx-ng: '>=12'
+ url: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2
+ hash:
+ md5: 76bbff344f0134279f225174e9064c8f
+ sha256: cb55f36dcd898203927133280ae1dc643368af041a48bcf7c026acb7c47b0c12
+ category: main
+ optional: false
+- name: libabseil
+ version: '20230802.1'
+ manager: conda
+ platform: linux-64
+ dependencies:
+ libgcc-ng: '>=12'
+ libstdcxx-ng: '>=12'
+ url: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20230802.1-cxx17_h59595ed_0.conda
+ hash:
+ md5: 2785ddf4cb0e7e743477991d64353947
+ sha256: 8729021a93e67bb93b4e73ef0a132499db516accfea11561b667635bcd0507e7
+ category: main
+ optional: false
+- name: libblas
+ version: 3.9.0
+ manager: conda
+ platform: linux-64
+ dependencies:
+ libopenblas: '>=0.3.26,<1.0a0'
+ url: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-21_linux64_openblas.conda
+ hash:
+ md5: 0ac9f44fc096772b0aa092119b00c3ca
+ sha256: ebd5c91f029f779fb88a1fcbd1e499559a9c258e3674ff58a2fbb4e375ae56d9
+ category: main
+ optional: false
+- name: libcblas
+ version: 3.9.0
+ manager: conda
+ platform: linux-64
+ dependencies:
+ libblas: 3.9.0
+ url: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-21_linux64_openblas.conda
+ hash:
+ md5: 4a3816d06451c4946e2db26b86472cb6
+ sha256: 467bbfbfe1a1aeb8b1f9f6485eedd8ed1b6318941bf3702da72336ccf4dc25a6
+ category: main
+ optional: false
+- name: libdeflate
+ version: '1.19'
+ manager: conda
+ platform: linux-64
+ dependencies:
+ libgcc-ng: '>=12'
+ url: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.19-hd590300_0.conda
+ hash:
+ md5: 1635570038840ee3f9c71d22aa5b8b6d
+ sha256: 985ad27aa0ba7aad82afa88a8ede6a1aacb0aaca950d710f15d85360451e72fd
+ category: main
+ optional: false
+- name: libexpat
+ version: 2.5.0
+ manager: conda
+ platform: linux-64
+ dependencies:
+ libgcc-ng: '>=12'
+ url: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.5.0-hcb278e6_1.conda
+ hash:
+ md5: 6305a3dd2752c76335295da4e581f2fd
+ sha256: 74c98a563777ae2ad71f1f74d458a8ab043cee4a513467c159ccf159d0e461f3
+ category: main
+ optional: false
+- name: libffi
+ version: 3.4.2
+ manager: conda
+ platform: linux-64
+ dependencies:
+ libgcc-ng: '>=9.4.0'
+ url: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2
+ hash:
+ md5: d645c6d2ac96843a2bfaccd2d62b3ac3
+ sha256: ab6e9856c21709b7b517e940ae7028ae0737546122f83c2aa5d692860c3b149e
+ category: main
+ optional: false
+- name: libgcc-ng
+ version: 13.2.0
+ manager: conda
+ platform: linux-64
+ dependencies:
+ _libgcc_mutex: '0.1'
+ _openmp_mutex: '>=4.5'
+ url: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_5.conda
+ hash:
+ md5: d4ff227c46917d3b4565302a2bbb276b
+ sha256: d32f78bfaac282cfe5205f46d558704ad737b8dbf71f9227788a5ca80facaba4
+ category: main
+ optional: false
+- name: libgfortran-ng
+ version: 13.2.0
+ manager: conda
+ platform: linux-64
+ dependencies:
+ libgfortran5: 13.2.0
+ url: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_5.conda
+ hash:
+ md5: e73e9cfd1191783392131e6238bdb3e9
+ sha256: 238c16c84124d58307376715839aa152bd4a1bf5a043052938ad6c3137d30245
+ category: main
+ optional: false
+- name: libgfortran5
+ version: 13.2.0
+ manager: conda
+ platform: linux-64
+ dependencies:
+ libgcc-ng: '>=13.2.0'
+ url: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-ha4646dd_5.conda
+ hash:
+ md5: 7a6bd7a12a4bd359e2afe6c0fa1acace
+ sha256: ba8d94e8493222ce155bb264d9de4200e41498a458e866fedf444de809bde8b6
+ category: main
+ optional: false
+- name: libhwloc
+ version: 2.9.3
+ manager: conda
+ platform: linux-64
+ dependencies:
+ libgcc-ng: '>=12'
+ libstdcxx-ng: '>=12'
+ libxml2: '>=2.11.5,<3.0.0a0'
+ url: https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.9.3-default_h554bfaf_1009.conda
+ hash:
+ md5: f36ddc11ca46958197a45effdd286e45
+ sha256: 6950fee24766d03406e0f6f965262a5d98829c71eed8d1004f313892423b559b
+ category: main
+ optional: false
+- name: libiconv
+ version: '1.17'
+ manager: conda
+ platform: linux-64
+ dependencies:
+ libgcc-ng: '>=12'
+ url: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda
+ hash:
+ md5: d66573916ffcf376178462f1b61c941e
+ sha256: 8ac2f6a9f186e76539439e50505d98581472fedb347a20e7d1f36429849f05c9
+ category: main
+ optional: false
+- name: libjpeg-turbo
+ version: 3.0.0
+ manager: conda
+ platform: linux-64
+ dependencies:
+ libgcc-ng: '>=12'
+ url: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda
+ hash:
+ md5: ea25936bb4080d843790b586850f82b8
+ sha256: b954e09b7e49c2f2433d6f3bb73868eda5e378278b0f8c1dd10a7ef090e14f2f
+ category: main
+ optional: false
+- name: liblapack
+ version: 3.9.0
+ manager: conda
+ platform: linux-64
+ dependencies:
+ libblas: 3.9.0
+ url: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-21_linux64_openblas.conda
+ hash:
+ md5: 1a42f305615c3867684e049e85927531
+ sha256: 64b5c35dce00dd6f9f53178b2fe87116282e00967970bd6551a5a42923806ded
+ category: main
+ optional: false
+- name: libnsl
+ version: 2.0.1
+ manager: conda
+ platform: linux-64
+ dependencies:
+ libgcc-ng: '>=12'
+ url: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda
+ hash:
+ md5: 30fd6e37fe21f86f4bd26d6ee73eeec7
+ sha256: 26d77a3bb4dceeedc2a41bd688564fe71bf2d149fdcf117049970bc02ff1add6
+ category: main
+ optional: false
+- name: libopenblas
+ version: 0.3.26
+ manager: conda
+ platform: linux-64
+ dependencies:
+ libgcc-ng: '>=12'
+ libgfortran-ng: ''
+ libgfortran5: '>=12.3.0'
+ url: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.26-pthreads_h413a1c8_0.conda
+ hash:
+ md5: 760ae35415f5ba8b15d09df5afe8b23a
+ sha256: b626954b5a1113dafec8df89fa8bf18ce9b4701464d9f084ddd7fc9fac404bbd
+ category: main
+ optional: false
+- name: libpng
+ version: 1.6.42
+ manager: conda
+ platform: linux-64
+ dependencies:
+ libgcc-ng: '>=12'
+ libzlib: '>=1.2.13,<1.3.0a0'
+ url: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.42-h2797004_0.conda
+ hash:
+ md5: d67729828dc6ff7ba44a61062ad79880
+ sha256: 1a0c3a4b7fd1e101cb37dd6d2f8b5ec93409c8cae422f04470fe39a01ef59024
+ category: main
+ optional: false
+- name: libprotobuf
+ version: 4.24.4
+ manager: conda
+ platform: linux-64
+ dependencies:
+ libabseil: '>=20230802.1,<20230803.0a0'
+ libgcc-ng: '>=12'
+ libstdcxx-ng: '>=12'
+ libzlib: '>=1.2.13,<1.3.0a0'
+ url: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-4.24.4-hf27288f_0.conda
+ hash:
+ md5: 1a0287ab734591ad63603734f923016b
+ sha256: 3e0f6454190abb27edd2aeb724688ee440de133edb02cbb17d5609ba36aa8be0
+ category: main
+ optional: false
+- name: libsqlite
+ version: 3.45.1
+ manager: conda
+ platform: linux-64
+ dependencies:
+ libgcc-ng: '>=12'
+ libzlib: '>=1.2.13,<1.3.0a0'
+ url: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.1-h2797004_0.conda
+ hash:
+ md5: fc4ccadfbf6d4784de88c41704792562
+ sha256: 1b379d1c652b25d0540251d422ef767472e768fd36b77261045e97f9ba6d3faa
+ category: main
+ optional: false
+- name: libstdcxx-ng
+ version: 13.2.0
+ manager: conda
+ platform: linux-64
+ dependencies: {}
+ url: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-h7e041cc_5.conda
+ hash:
+ md5: f6f6600d18a4047b54f803cf708b868a
+ sha256: a56c5b11f1e73a86e120e6141a42d9e935a99a2098491ac9e15347a1476ce777
+ category: main
+ optional: false
+- name: libtiff
+ version: 4.6.0
+ manager: conda
+ platform: linux-64
+ dependencies:
+ lerc: '>=4.0.0,<5.0a0'
+ libdeflate: '>=1.19,<1.20.0a0'
+ libgcc-ng: '>=12'
+ libjpeg-turbo: '>=3.0.0,<4.0a0'
+ libstdcxx-ng: '>=12'
+ libwebp-base: '>=1.3.2,<2.0a0'
+ libzlib: '>=1.2.13,<1.3.0a0'
+ xz: '>=5.2.6,<6.0a0'
+ zstd: '>=1.5.5,<1.6.0a0'
+ url: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-ha9c0a0a_2.conda
+ hash:
+ md5: 55ed21669b2015f77c180feb1dd41930
+ sha256: 45158f5fbee7ee3e257e6b9f51b9f1c919ed5518a94a9973fe7fa4764330473e
+ category: main
+ optional: false
+- name: libuuid
+ version: 2.38.1
+ manager: conda
+ platform: linux-64
+ dependencies:
+ libgcc-ng: '>=12'
+ url: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda
+ hash:
+ md5: 40b61aab5c7ba9ff276c41cfffe6b80b
+ sha256: 787eb542f055a2b3de553614b25f09eefb0a0931b0c87dbcce6efdfd92f04f18
+ category: main
+ optional: false
+- name: libuv
+ version: 1.47.0
+ manager: conda
+ platform: linux-64
+ dependencies:
+ libgcc-ng: '>=12'
+ url: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.47.0-hd590300_0.conda
+ hash:
+ md5: a7a94e1b751a9fe2be88f3934b3a0739
+ sha256: 53bd8f6bebc85555c5dd648072693e37fcdf777f993e9a108c4a7badf2e8810c
+ category: main
+ optional: false
+- name: libwebp-base
+ version: 1.3.2
+ manager: conda
+ platform: linux-64
+ dependencies:
+ libgcc-ng: '>=12'
+ url: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.2-hd590300_0.conda
+ hash:
+ md5: 30de3fd9b3b602f7473f30e684eeea8c
+ sha256: 68764a760fa81ef35dacb067fe8ace452bbb41476536a4a147a1051df29525f0
+ category: main
+ optional: false
+- name: libxcb
+ version: '1.15'
+ manager: conda
+ platform: linux-64
+ dependencies:
+ libgcc-ng: '>=12'
+ pthread-stubs: ''
+ xorg-libxau: ''
+ xorg-libxdmcp: ''
+ url: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda
+ hash:
+ md5: 33277193f5b92bad9fdd230eb700929c
+ sha256: a670902f0a3173a466c058d2ac22ca1dd0df0453d3a80e0212815c20a16b0485
+ category: main
+ optional: false
+- name: libxcrypt
+ version: 4.4.36
+ manager: conda
+ platform: linux-64
+ dependencies:
+ libgcc-ng: '>=12'
+ url: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda
+ hash:
+ md5: 5aa797f8787fe7a17d1b0821485b5adc
+ sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c
+ category: main
+ optional: false
+- name: libxml2
+ version: 2.12.5
+ manager: conda
+ platform: linux-64
+ dependencies:
+ icu: '>=73.2,<74.0a0'
+ libgcc-ng: '>=12'
+ libiconv: '>=1.17,<2.0a0'
+ libzlib: '>=1.2.13,<1.3.0a0'
+ xz: '>=5.2.6,<6.0a0'
+ url: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.5-h232c23b_0.conda
+ hash:
+ md5: c442ebfda7a475f5e78f1c8e45f1e919
+ sha256: db9bf97e9e367985204331b58a059ebd5a4e0cb9e1c8754e9ecb23046b7b7bc1
+ category: main
+ optional: false
+- name: libzlib
+ version: 1.2.13
+ manager: conda
+ platform: linux-64
+ dependencies:
+ libgcc-ng: '>=12'
+ url: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda
+ hash:
+ md5: f36c115f1ee199da648e0597ec2047ad
+ sha256: 370c7c5893b737596fd6ca0d9190c9715d89d888b8c88537ae1ef168c25e82e4
+ category: main
+ optional: false
+- name: llvm-openmp
+ version: 17.0.6
+ manager: conda
+ platform: linux-64
+ dependencies:
+ libzlib: '>=1.2.13,<1.3.0a0'
+ zstd: '>=1.5.5,<1.6.0a0'
+ url: https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-17.0.6-h4dfa4b3_0.conda
+ hash:
+ md5: c1665f9c1c9f6c93d8b4e492a6a39056
+ sha256: 18a9db4cc139e72e8eac80a34f6536491fe318d3785bc2c35fac42cd00676376
+ category: main
+ optional: false
+- name: markupsafe
+ version: 2.1.5
+ manager: conda
+ platform: linux-64
+ dependencies:
+ libgcc-ng: '>=12'
+ python: '>=3.11,<3.12.0a0'
+ python_abi: 3.11.*
+ url: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py311h459d7ec_0.conda
+ hash:
+ md5: a322b4185121935c871d201ae00ac143
+ sha256: 14912e557a6576e03f65991be89e9d289c6e301921b6ecfb4e7186ba974f453d
+ category: main
+ optional: false
+- name: mkl
+ version: 2022.2.1
+ manager: conda
+ platform: linux-64
+ dependencies:
+ _openmp_mutex: '>=4.5'
+ llvm-openmp: '>=15.0.6'
+ tbb: 2021.*
+ url: https://conda.anaconda.org/conda-forge/linux-64/mkl-2022.2.1-h84fe81f_16997.conda
+ hash:
+ md5: a7ce56d5757f5b57e7daabe703ade5bb
+ sha256: 5322750d5e96ff5d96b1457db5fb6b10300f2bc4030545e940e17b57c4e96d00
+ category: main
+ optional: false
+- name: mpc
+ version: 1.3.1
+ manager: conda
+ platform: linux-64
+ dependencies:
+ gmp: '>=6.2.1,<7.0a0'
+ libgcc-ng: '>=12'
+ mpfr: '>=4.1.0,<5.0a0'
+ url: https://conda.anaconda.org/conda-forge/linux-64/mpc-1.3.1-hfe3b2da_0.conda
+ hash:
+ md5: 289c71e83dc0daa7d4c81f04180778ca
+ sha256: 2f88965949ba7b4b21e7e5facd62285f7c6efdb17359d1b365c3bb4ecc968d29
+ category: main
+ optional: false
+- name: mpfr
+ version: 4.2.1
+ manager: conda
+ platform: linux-64
+ dependencies:
+ gmp: '>=6.2.1,<7.0a0'
+ libgcc-ng: '>=12'
+ url: https://conda.anaconda.org/conda-forge/linux-64/mpfr-4.2.1-h9458935_0.conda
+ hash:
+ md5: 4c28f3210b30250037a4a627eeee9e0f
+ sha256: 008230a53ff15cf61966476b44f7ba2c779826825b9ca639a0a2b44d8f7aa6cb
+ category: main
+ optional: false
+- name: mpmath
+ version: 1.3.0
+ manager: conda
+ platform: linux-64
+ dependencies:
+ python: '>=3.6'
+ url: https://conda.anaconda.org/conda-forge/noarch/mpmath-1.3.0-pyhd8ed1ab_0.conda
+ hash:
+ md5: dbf6e2d89137da32fa6670f3bffc024e
+ sha256: a4f025c712ec1502a55c471b56a640eaeebfce38dd497d5a1a33729014cac47a
+ category: main
+ optional: false
+- name: ncurses
+ version: '6.4'
+ manager: conda
+ platform: linux-64
+ dependencies:
+ libgcc-ng: '>=12'
+ url: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4-h59595ed_2.conda
+ hash:
+ md5: 7dbaa197d7ba6032caf7ae7f32c1efa0
+ sha256: 91cc03f14caf96243cead96c76fe91ab5925a695d892e83285461fb927dece5e
+ category: main
+ optional: false
+- name: networkx
+ version: 3.2.1
+ manager: conda
+ platform: linux-64
+ dependencies:
+ python: '>=3.9'
+ url: https://conda.anaconda.org/conda-forge/noarch/networkx-3.2.1-pyhd8ed1ab_0.conda
+ hash:
+ md5: 425fce3b531bed6ec3c74fab3e5f0a1c
+ sha256: 7629aa4f9f8cdff45ea7a4701fe58dccce5bf2faa01c26eb44cbb27b7e15ca9d
+ category: main
+ optional: false
+- name: numpy
+ version: 1.26.4
+ manager: conda
+ platform: linux-64
+ dependencies:
+ libblas: '>=3.9.0,<4.0a0'
+ libcblas: '>=3.9.0,<4.0a0'
+ libgcc-ng: '>=12'
+ liblapack: '>=3.9.0,<4.0a0'
+ libstdcxx-ng: '>=12'
+ python: '>=3.11,<3.12.0a0'
+ python_abi: 3.11.*
+ url: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py311h64a7726_0.conda
+ hash:
+ md5: a502d7aad449a1206efb366d6a12c52d
+ sha256: 3f4365e11b28e244c95ba8579942b0802761ba7bb31c026f50d1a9ea9c728149
+ category: main
+ optional: false
+- name: omegaconf
+ version: 2.3.0
+ manager: conda
+ platform: linux-64
+ dependencies:
+ antlr-python-runtime: 4.9.*
+ python: '>=3.7'
+ pyyaml: '>=5.1.0'
+ typing_extensions: ''
+ url: https://conda.anaconda.org/conda-forge/noarch/omegaconf-2.3.0-pyhd8ed1ab_0.conda
+ hash:
+ md5: 23cc056834cab53849b91f78d6ee3ea0
+ sha256: df806841be847e5287b22b6ae7f380874f81ea51f1b51ae14a570f3385c7b133
+ category: main
+ optional: false
+- name: openjpeg
+ version: 2.5.0
+ manager: conda
+ platform: linux-64
+ dependencies:
+ libgcc-ng: '>=12'
+ libpng: '>=1.6.39,<1.7.0a0'
+ libstdcxx-ng: '>=12'
+ libtiff: '>=4.6.0,<4.7.0a0'
+ libzlib: '>=1.2.13,<1.3.0a0'
+ url: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-h488ebb8_3.conda
+ hash:
+ md5: 128c25b7fe6a25286a48f3a6a9b5b6f3
+ sha256: 9fe91b67289267de68fda485975bb48f0605ac503414dc663b50d8b5f29bc82a
+ category: main
+ optional: false
+- name: openssl
+ version: 3.2.1
+ manager: conda
+ platform: linux-64
+ dependencies:
+ ca-certificates: ''
+ libgcc-ng: '>=12'
+ url: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.2.1-hd590300_0.conda
+ hash:
+ md5: 51a753e64a3027bd7e23a189b1f6e91e
+ sha256: c02c12bdb898daacf7eb3d09859f93ea8f285fd1a6132ff6ff0493ab52c7fe57
+ category: main
+ optional: false
+- name: packaging
+ version: '23.2'
+ manager: conda
+ platform: linux-64
+ dependencies:
+ python: '>=3.7'
+ url: https://conda.anaconda.org/conda-forge/noarch/packaging-23.2-pyhd8ed1ab_0.conda
+ hash:
+ md5: 79002079284aa895f883c6b7f3f88fd6
+ sha256: 69b3ace6cca2dab9047b2c24926077d81d236bef45329d264b394001e3c3e52f
+ category: main
+ optional: false
+- name: pillow
+ version: 10.2.0
+ manager: conda
+ platform: linux-64
+ dependencies:
+ freetype: '>=2.12.1,<3.0a0'
+ lcms2: '>=2.16,<3.0a0'
+ libgcc-ng: '>=12'
+ libjpeg-turbo: '>=3.0.0,<4.0a0'
+ libtiff: '>=4.6.0,<4.7.0a0'
+ libwebp-base: '>=1.3.2,<2.0a0'
+ libxcb: '>=1.15,<1.16.0a0'
+ libzlib: '>=1.2.13,<1.3.0a0'
+ openjpeg: '>=2.5.0,<3.0a0'
+ python: '>=3.11,<3.12.0a0'
+ python_abi: 3.11.*
+ tk: '>=8.6.13,<8.7.0a0'
+ url: https://conda.anaconda.org/conda-forge/linux-64/pillow-10.2.0-py311ha6c5da5_0.conda
+ hash:
+ md5: a5ccd7f2271f28b7d2de0b02b64e3796
+ sha256: 3cd4827d822c9888b672bfac9017e905348ac5bd2237a98b30a734ed6573b248
+ category: main
+ optional: false
+- name: pip
+ version: '24.0'
+ manager: conda
+ platform: linux-64
+ dependencies:
+ python: '>=3.7'
+ setuptools: ''
+ wheel: ''
+ url: https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda
+ hash:
+ md5: f586ac1e56c8638b64f9c8122a7b8a67
+ sha256: b7c1c5d8f13e8cb491c4bd1d0d1896a4cf80fc47de01059ad77509112b664a4a
+ category: main
+ optional: false
+- name: protobuf
+ version: 4.24.4
+ manager: conda
+ platform: linux-64
+ dependencies:
+ libabseil: '>=20230802.1,<20230803.0a0'
+ libgcc-ng: '>=12'
+ libprotobuf: '>=4.24.4,<4.24.5.0a0'
+ libstdcxx-ng: '>=12'
+ python: '>=3.11,<3.12.0a0'
+ python_abi: 3.11.*
+ setuptools: ''
+ url: https://conda.anaconda.org/conda-forge/linux-64/protobuf-4.24.4-py311h46cbc50_0.conda
+ hash:
+ md5: 83b241e2db8adb55d7ec110a913fea80
+ sha256: 1f664f5fc370c28809024387e2f991003fcabf8b025c787c70dbc99a8fcb2088
+ category: main
+ optional: false
+- name: pthread-stubs
+ version: '0.4'
+ manager: conda
+ platform: linux-64
+ dependencies:
+ libgcc-ng: '>=7.5.0'
+ url: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2
+ hash:
+ md5: 22dad4df6e8630e8dff2428f6f6a7036
+ sha256: 67c84822f87b641d89df09758da498b2d4558d47b920fd1d3fe6d3a871e000ff
+ category: main
+ optional: false
+- name: pysocks
+ version: 1.7.1
+ manager: conda
+ platform: linux-64
+ dependencies:
+ __unix: ''
+ python: '>=3.8'
+ url: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2
+ hash:
+ md5: 2a7de29fb590ca14b5243c4c812c8025
+ sha256: a42f826e958a8d22e65b3394f437af7332610e43ee313393d1cf143f0a2d274b
+ category: main
+ optional: false
+- name: python
+ version: 3.11.7
+ manager: conda
+ platform: linux-64
+ dependencies:
+ bzip2: '>=1.0.8,<2.0a0'
+ ld_impl_linux-64: '>=2.36.1'
+ libexpat: '>=2.5.0,<3.0a0'
+ libffi: '>=3.4,<4.0a0'
+ libgcc-ng: '>=12'
+ libnsl: '>=2.0.1,<2.1.0a0'
+ libsqlite: '>=3.44.2,<4.0a0'
+ libuuid: '>=2.38.1,<3.0a0'
+ libxcrypt: '>=4.4.36'
+ libzlib: '>=1.2.13,<1.3.0a0'
+ ncurses: '>=6.4,<7.0a0'
+ openssl: '>=3.2.0,<4.0a0'
+ readline: '>=8.2,<9.0a0'
+ tk: '>=8.6.13,<8.7.0a0'
+ tzdata: ''
+ xz: '>=5.2.6,<6.0a0'
+ url: https://conda.anaconda.org/conda-forge/linux-64/python-3.11.7-hab00c5b_1_cpython.conda
+ hash:
+ md5: 27cf681282c11dba7b0b1fd266e8f289
+ sha256: 8266801d3f21ae3018b997dcd05503b034016a3335aa3ab5b8c3f482af1e6580
+ category: main
+ optional: false
+- name: python-json-logger
+ version: 2.0.7
+ manager: conda
+ platform: linux-64
+ dependencies:
+ python: '>=3.6'
+ url: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda
+ hash:
+ md5: a61bf9ec79426938ff785eb69dbb1960
+ sha256: 4790787fe1f4e8da616edca4acf6a4f8ed4e7c6967aa31b920208fc8f95efcca
+ category: main
+ optional: false
+- name: python_abi
+ version: '3.11'
+ manager: conda
+ platform: linux-64
+ dependencies: {}
+ url: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-4_cp311.conda
+ hash:
+ md5: d786502c97404c94d7d58d258a445a65
+ sha256: 0be3ac1bf852d64f553220c7e6457e9c047dfb7412da9d22fbaa67e60858b3cf
+ category: main
+ optional: false
+- name: pytorch
+ version: 2.1.0
+ manager: conda
+ platform: linux-64
+ dependencies:
+ __glibc: '>=2.17,<3.0.a0'
+ _openmp_mutex: '>=4.5'
+ filelock: ''
+ fsspec: ''
+ jinja2: ''
+ libcblas: '>=3.9.0,<4.0a0'
+ libgcc-ng: '>=12'
+ libprotobuf: '>=4.24.4,<4.24.5.0a0'
+ libstdcxx-ng: '>=12'
+ libuv: '>=1.46.0,<2.0a0'
+ mkl: '>=2022.2.1,<2023.0a0'
+ networkx: ''
+ numpy: '>=1.23.5,<2.0a0'
+ python: '>=3.11,<3.12.0a0'
+ python_abi: 3.11.*
+ sleef: '>=3.5.1,<4.0a0'
+ sympy: ''
+ typing_extensions: ''
+ url: https://conda.anaconda.org/conda-forge/linux-64/pytorch-2.1.0-cpu_mkl_py311h0c8a311_100.conda
+ hash:
+ md5: 81dafdfca905f63e43094252048446b4
+ sha256: 17da98806c1b87a2c81eaf59b6e781ced850733bb4ea90046da3aa1ba85138ec
+ category: main
+ optional: false
+- name: pytorch-cpu
+ version: 2.1.0
+ manager: conda
+ platform: linux-64
+ dependencies:
+ pytorch: 2.1.0
+ url: https://conda.anaconda.org/conda-forge/linux-64/pytorch-cpu-2.1.0-cpu_mkl_py311ha33ad28_100.conda
+ hash:
+ md5: 3c54dcbd0f2605c9234f4edc1565c8a1
+ sha256: 7c5005eeff582c6e0f20897dfc8c303f45baaf3d51fbc69e601dee8fe7fa77eb
+ category: main
+ optional: false
+- name: pyyaml
+ version: 6.0.1
+ manager: conda
+ platform: linux-64
+ dependencies:
+ libgcc-ng: '>=12'
+ python: '>=3.11,<3.12.0a0'
+ python_abi: 3.11.*
+ yaml: '>=0.2.5,<0.3.0a0'
+ url: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py311h459d7ec_1.conda
+ hash:
+ md5: 52719a74ad130de8fb5d047dc91f247a
+ sha256: 28729ef1ffa7f6f9dfd54345a47c7faac5d34296d66a2b9891fb147f4efe1348
+ category: main
+ optional: false
+- name: readline
+ version: '8.2'
+ manager: conda
+ platform: linux-64
+ dependencies:
+ libgcc-ng: '>=12'
+ ncurses: '>=6.3,<7.0a0'
+ url: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda
+ hash:
+ md5: 47d31b792659ce70f470b5c82fdfb7a4
+ sha256: 5435cf39d039387fbdc977b0a762357ea909a7694d9528ab40f005e9208744d7
+ category: main
+ optional: false
+- name: requests
+ version: 2.31.0
+ manager: conda
+ platform: linux-64
+ dependencies:
+ certifi: '>=2017.4.17'
+ charset-normalizer: '>=2,<4'
+ idna: '>=2.5,<4'
+ python: '>=3.7'
+ urllib3: '>=1.21.1,<3'
+ url: https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda
+ hash:
+ md5: a30144e4156cdbb236f99ebb49828f8b
+ sha256: 9f629d6fd3c8ac5f2a198639fe7af87c4db2ac9235279164bfe0fcb49d8c4bad
+ category: main
+ optional: false
+- name: setuptools
+ version: 69.0.3
+ manager: conda
+ platform: linux-64
+ dependencies:
+ python: '>=3.7'
+ url: https://conda.anaconda.org/conda-forge/noarch/setuptools-69.0.3-pyhd8ed1ab_0.conda
+ hash:
+ md5: 40695fdfd15a92121ed2922900d0308b
+ sha256: 0fe2a0473ad03dac6c7f5c42ef36a8e90673c88a0350dfefdea4b08d43803db2
+ category: main
+ optional: false
+- name: sleef
+ version: 3.5.1
+ manager: conda
+ platform: linux-64
+ dependencies:
+ _openmp_mutex: '>=4.5'
+ libgcc-ng: '>=9.4.0'
+ url: https://conda.anaconda.org/conda-forge/linux-64/sleef-3.5.1-h9b69904_2.tar.bz2
+ hash:
+ md5: 6e016cf4c525d04a7bd038cee53ad3fd
+ sha256: 77d644a16f682e6d01df63fe9d25315011393498b63cf08c0e548780e46b2170
+ category: main
+ optional: false
+- name: soupsieve
+ version: '2.5'
+ manager: conda
+ platform: linux-64
+ dependencies:
+ python: '>=3.8'
+ url: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda
+ hash:
+ md5: 3f144b2c34f8cb5a9abd9ed23a39c561
+ sha256: 54ae221033db8fbcd4998ccb07f3c3828b4d77e73b0c72b18c1d6a507059059c
+ category: main
+ optional: false
+- name: sympy
+ version: '1.12'
+ manager: conda
+ platform: linux-64
+ dependencies:
+ __unix: ''
+ gmpy2: '>=2.0.8'
+ mpmath: '>=0.19'
+ python: '>=3.8'
+ url: https://conda.anaconda.org/conda-forge/noarch/sympy-1.12-pypyh9d50eac_103.conda
+ hash:
+ md5: 2f7d6347d7acf6edf1ac7f2189f44c8f
+ sha256: 0025dd4e6411423903bf478d1b9fbff0cbbbe546f51c9375dfd6729ef2e1a1ac
+ category: main
+ optional: false
+- name: tbb
+ version: 2021.11.0
+ manager: conda
+ platform: linux-64
+ dependencies:
+ libgcc-ng: '>=12'
+ libhwloc: '>=2.9.3,<2.9.4.0a0'
+ libstdcxx-ng: '>=12'
+ url: https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.11.0-h00ab1b0_1.conda
+ hash:
+ md5: 4531d2927578e7e254ff3bcf6457518c
+ sha256: ded4de0d5a3eb7b47ed829f0ed0e3c61ccd428308bde52d8d22ced228038223b
+ category: main
+ optional: false
+- name: tk
+ version: 8.6.13
+ manager: conda
+ platform: linux-64
+ dependencies:
+ libgcc-ng: '>=12'
+ libzlib: '>=1.2.13,<1.3.0a0'
+ url: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda
+ hash:
+ md5: d453b98d9c83e71da0741bb0ff4d76bc
+ sha256: e0569c9caa68bf476bead1bed3d79650bb080b532c64a4af7d8ca286c08dea4e
+ category: main
+ optional: false
+- name: torchvision
+ version: 0.16.1
+ manager: conda
+ platform: linux-64
+ dependencies:
+ __glibc: '>=2.17,<3.0.a0'
+ libgcc-ng: '>=12'
+ libjpeg-turbo: '>=3.0.0,<4.0a0'
+ libpng: '>=1.6.39,<1.7.0a0'
+ libstdcxx-ng: '>=12'
+ numpy: '>=1.23.5,<2.0a0'
+ pillow: '>=5.3.0,!=8.3.0,!=8.3.1'
+ python: '>=3.11,<3.12.0a0'
+ python_abi: 3.11.*
+ pytorch: '>=2.1.0,<2.2.0a0'
+ requests: ''
+ url: https://conda.anaconda.org/conda-forge/linux-64/torchvision-0.16.1-cpu_py311h38ab453_2.conda
+ hash:
+ md5: 6796c9f44a0fe55fc064007dc3ac65ef
+ sha256: 2852110869387876c291a8c911b30336b7fec5c543cd58ddee4db1fc5555b3e0
+ category: main
+ optional: false
+- name: tqdm
+ version: 4.66.2
+ manager: conda
+ platform: linux-64
+ dependencies:
+ colorama: ''
+ python: '>=3.7'
+ url: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.66.2-pyhd8ed1ab_0.conda
+ hash:
+ md5: 2b8dfb969f984497f3f98409a9545776
+ sha256: 416d1d9318f3267325ad7e2b8a575df20ff9031197b30c0222c3d3b023877260
+ category: main
+ optional: false
+- name: typing_extensions
+ version: 4.9.0
+ manager: conda
+ platform: linux-64
+ dependencies:
+ python: '>=3.8'
+ url: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.9.0-pyha770c72_0.conda
+ hash:
+ md5: a92a6440c3fe7052d63244f3aba2a4a7
+ sha256: f3c5be8673bfd905c4665efcb27fa50192f24f84fa8eff2f19cba5d09753d905
+ category: main
+ optional: false
+- name: tzdata
+ version: 2024a
+ manager: conda
+ platform: linux-64
+ dependencies: {}
+ url: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda
+ hash:
+ md5: 161081fc7cec0bfda0d86d7cb595f8d8
+ sha256: 7b2b69c54ec62a243eb6fba2391b5e443421608c3ae5dbff938ad33ca8db5122
+ category: main
+ optional: false
+- name: urllib3
+ version: 2.2.0
+ manager: conda
+ platform: linux-64
+ dependencies:
+ brotli-python: '>=1.0.9'
+ pysocks: '>=1.5.6,<2.0,!=1.5.7'
+ python: '>=3.7'
+ url: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.0-pyhd8ed1ab_0.conda
+ hash:
+ md5: 6a7e0694921f668a030d52f0c47baebd
+ sha256: 61a8a3bd36d235c349aedaf1aa6a79cce15d6fe89dca4bb593b596d0211513c6
+ category: main
+ optional: false
+- name: wheel
+ version: 0.42.0
+ manager: conda
+ platform: linux-64
+ dependencies:
+ python: '>=3.7'
+ url: https://conda.anaconda.org/conda-forge/noarch/wheel-0.42.0-pyhd8ed1ab_0.conda
+ hash:
+ md5: 1cdea58981c5cbc17b51973bcaddcea7
+ sha256: 80be0ccc815ce22f80c141013302839b0ed938a2edb50b846cf48d8a8c1cfa01
+ category: main
+ optional: false
+- name: xorg-libxau
+ version: 1.0.11
+ manager: conda
+ platform: linux-64
+ dependencies:
+ libgcc-ng: '>=12'
+ url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hd590300_0.conda
+ hash:
+ md5: 2c80dc38fface310c9bd81b17037fee5
+ sha256: 309751371d525ce50af7c87811b435c176915239fc9e132b99a25d5e1703f2d4
+ category: main
+ optional: false
+- name: xorg-libxdmcp
+ version: 1.1.3
+ manager: conda
+ platform: linux-64
+ dependencies:
+ libgcc-ng: '>=9.3.0'
+ url: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.3-h7f98852_0.tar.bz2
+ hash:
+ md5: be93aabceefa2fac576e971aef407908
+ sha256: 4df7c5ee11b8686d3453e7f3f4aa20ceef441262b49860733066c52cfd0e4a77
+ category: main
+ optional: false
+- name: xz
+ version: 5.2.6
+ manager: conda
+ platform: linux-64
+ dependencies:
+ libgcc-ng: '>=12'
+ url: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2
+ hash:
+ md5: 2161070d867d1b1204ea749c8eec4ef0
+ sha256: 03a6d28ded42af8a347345f82f3eebdd6807a08526d47899a42d62d319609162
+ category: main
+ optional: false
+- name: yaml
+ version: 0.2.5
+ manager: conda
+ platform: linux-64
+ dependencies:
+ libgcc-ng: '>=9.4.0'
+ url: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2
+ hash:
+ md5: 4cb3ad778ec2d5a7acbdf254eb1c42ae
+ sha256: a4e34c710eeb26945bdbdaba82d3d74f60a78f54a874ec10d373811a5d217535
+ category: main
+ optional: false
+- name: zipp
+ version: 3.17.0
+ manager: conda
+ platform: linux-64
+ dependencies:
+ python: '>=3.8'
+ url: https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda
+ hash:
+ md5: 2e4d6bc0b14e10f895fc6791a7d9b26a
+ sha256: bced1423fdbf77bca0a735187d05d9b9812d2163f60ab426fc10f11f92ecbe26
+ category: main
+ optional: false
+- name: zstd
+ version: 1.5.5
+ manager: conda
+ platform: linux-64
+ dependencies:
+ libgcc-ng: '>=12'
+ libstdcxx-ng: '>=12'
+ libzlib: '>=1.2.13,<1.3.0a0'
+ url: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.5-hfc55251_0.conda
+ hash:
+ md5: 04b88013080254850d6c01ed54810589
+ sha256: 607cbeb1a533be98ba96cf5cdf0ddbb101c78019f1fda063261871dad6248609
+ category: main
+ optional: false
diff --git a/conda-lock.yml b/conda-lock.yml
old mode 100644
new mode 100755
diff --git a/conf/analyzer/default.yaml b/conf/analyzer/default.yaml
old mode 100644
new mode 100755
diff --git a/conf/analyzer/detector/retinaface.yaml b/conf/analyzer/detector/retinaface.yaml
old mode 100644
new mode 100755
diff --git a/conf/analyzer/logger/json_format.yaml b/conf/analyzer/logger/json_format.yaml
old mode 100644
new mode 100755
diff --git a/conf/analyzer/predictor/align/synergy_mobilenet_v2.yaml b/conf/analyzer/predictor/align/synergy_mobilenet_v2.yaml
old mode 100644
new mode 100755
diff --git a/conf/analyzer/predictor/au/open_graph_swin_base.yaml b/conf/analyzer/predictor/au/open_graph_swin_base.yaml
old mode 100644
new mode 100755
diff --git a/conf/analyzer/predictor/deepfake/efficientnet_b7.yaml b/conf/analyzer/predictor/deepfake/efficientnet_b7.yaml
old mode 100644
new mode 100755
diff --git a/conf/analyzer/predictor/embed/r50_vggface_1m.yaml b/conf/analyzer/predictor/embed/r50_vggface_1m.yaml
old mode 100644
new mode 100755
diff --git a/conf/analyzer/predictor/fer/efficientnet_b0_7.yaml b/conf/analyzer/predictor/fer/efficientnet_b0_7.yaml
old mode 100644
new mode 100755
diff --git a/conf/analyzer/predictor/fer/efficientnet_b2_8.yaml b/conf/analyzer/predictor/fer/efficientnet_b2_8.yaml
old mode 100644
new mode 100755
diff --git a/conf/analyzer/predictor/va/elim_al_alexnet.yaml b/conf/analyzer/predictor/va/elim_al_alexnet.yaml
old mode 100644
new mode 100755
diff --git a/conf/analyzer/predictor/verify/adaface_ir101_webface12m.yaml b/conf/analyzer/predictor/verify/adaface_ir101_webface12m.yaml
old mode 100644
new mode 100755
diff --git a/conf/analyzer/predictor/verify/r100_magface_unpg.yaml b/conf/analyzer/predictor/verify/r100_magface_unpg.yaml
old mode 100644
new mode 100755
diff --git a/conf/analyzer/reader/default.yaml b/conf/analyzer/reader/default.yaml
old mode 100644
new mode 100755
diff --git a/conf/analyzer/reader/file.yaml b/conf/analyzer/reader/file.yaml
old mode 100644
new mode 100755
diff --git a/conf/analyzer/reader/tensor.yaml b/conf/analyzer/reader/tensor.yaml
old mode 100644
new mode 100755
diff --git a/conf/analyzer/reader/universal.yaml b/conf/analyzer/reader/universal.yaml
old mode 100644
new mode 100755
diff --git a/conf/analyzer/unifier/img_244.yaml b/conf/analyzer/unifier/img_244.yaml
old mode 100644
new mode 100755
diff --git a/conf/analyzer/unifier/img_260.yaml b/conf/analyzer/unifier/img_260.yaml
old mode 100644
new mode 100755
diff --git a/conf/analyzer/unifier/img_380.yaml b/conf/analyzer/unifier/img_380.yaml
old mode 100644
new mode 100755
diff --git a/conf/analyzer/utilizer/align/lmk3d_mesh_pose.yaml b/conf/analyzer/utilizer/align/lmk3d_mesh_pose.yaml
old mode 100644
new mode 100755
diff --git a/conf/analyzer/utilizer/draw_boxes/torchvision_boxes.yaml b/conf/analyzer/utilizer/draw_boxes/torchvision_boxes.yaml
old mode 100644
new mode 100755
diff --git a/conf/analyzer/utilizer/draw_landmarks/torchvision_keypoints.yaml b/conf/analyzer/utilizer/draw_landmarks/torchvision_keypoints.yaml
old mode 100644
new mode 100755
diff --git a/conf/analyzer/utilizer/save/image_saver.yaml b/conf/analyzer/utilizer/save/image_saver.yaml
old mode 100644
new mode 100755
diff --git a/conf/config.yaml b/conf/config.yaml
old mode 100644
new mode 100755
diff --git a/conf/merged/gpu.merged.config.yaml b/conf/merged/gpu.merged.config.yaml
old mode 100644
new mode 100755
diff --git a/conf/merged/merged.config.yaml b/conf/merged/merged.config.yaml
old mode 100644
new mode 100755
diff --git a/conf/tensor.config.yaml b/conf/tensor.config.yaml
old mode 100644
new mode 100755
diff --git a/conf/tests.config.1.yaml b/conf/tests.config.1.yaml
old mode 100644
new mode 100755
diff --git a/conf/tests.config.2.yaml b/conf/tests.config.2.yaml
old mode 100644
new mode 100755
diff --git a/conf/tests.config.3.yaml b/conf/tests.config.3.yaml
old mode 100644
new mode 100755
diff --git a/conf/tests.config.4.yaml b/conf/tests.config.4.yaml
old mode 100644
new mode 100755
diff --git a/conf/tests.config.5.yaml b/conf/tests.config.5.yaml
old mode 100644
new mode 100755
diff --git a/data/facetorch-logo-42.png b/data/facetorch-logo-42.png
old mode 100644
new mode 100755
diff --git a/data/facetorch-logo-64.png b/data/facetorch-logo-64.png
old mode 100644
new mode 100755
diff --git a/data/input/tensor.pt b/data/input/tensor.pt
old mode 100644
new mode 100755
diff --git a/data/input/test.jpg b/data/input/test.jpg
old mode 100644
new mode 100755
diff --git a/data/input/test2.jpg b/data/input/test2.jpg
old mode 100644
new mode 100755
diff --git a/data/input/test3.jpg b/data/input/test3.jpg
old mode 100644
new mode 100755
diff --git a/data/input/test4.jpg b/data/input/test4.jpg
old mode 100644
new mode 100755
diff --git a/data/input/test5.jpg b/data/input/test5.jpg
old mode 100644
new mode 100755
diff --git a/data/output/test.png b/data/output/test.png
old mode 100644
new mode 100755
diff --git a/data/output/test2.png b/data/output/test2.png
old mode 100644
new mode 100755
diff --git a/data/output/test3.png b/data/output/test3.png
old mode 100644
new mode 100755
diff --git a/data/output/test4.png b/data/output/test4.png
old mode 100644
new mode 100755
diff --git a/data/output/test5.png b/data/output/test5.png
old mode 100644
new mode 100755
diff --git a/data/output/test_tensor.png b/data/output/test_tensor.png
old mode 100644
new mode 100755
diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml
old mode 100644
new mode 100755
diff --git a/docker-compose.yml b/docker-compose.yml
old mode 100644
new mode 100755
diff --git a/docker/Dockerfile b/docker/Dockerfile
old mode 100644
new mode 100755
diff --git a/docker/Dockerfile.dev b/docker/Dockerfile.dev
old mode 100644
new mode 100755
diff --git a/docker/Dockerfile.dev.gpu b/docker/Dockerfile.dev.gpu
old mode 100644
new mode 100755
diff --git a/docker/Dockerfile.gpu b/docker/Dockerfile.gpu
old mode 100644
new mode 100755
diff --git a/docker/Dockerfile.lock b/docker/Dockerfile.lock
old mode 100644
new mode 100755
diff --git a/docker/Dockerfile.tests b/docker/Dockerfile.tests
old mode 100644
new mode 100755
diff --git a/docs/doc-search.html b/docs/doc-search.html
index 0f0cf80..ff3beb0 100644
--- a/docs/doc-search.html
+++ b/docs/doc-search.html
@@ -4,8 +4,8 @@
Search
-
-
+
+
-
+
+
+
+
+
+
-
-
+
+
@@ -22,204 +25,6 @@
Module facetorch.analyzer.core
-
-
-Expand source code
-
-from typing import Optional, Union
-
-import torch
-import numpy as np
-from codetiming import Timer
-from PIL import Image
-from facetorch.analyzer.predictor.core import FacePredictor
-from facetorch.datastruct import ImageData, Response
-from facetorch.logger import LoggerJsonFile
-from importlib.metadata import version
-from hydra.utils import instantiate
-from omegaconf import OmegaConf
-
-logger = LoggerJsonFile().logger
-
-
-class FaceAnalyzer(object):
- @Timer(
- "FaceAnalyzer.__init__", "{name}: {milliseconds:.2f} ms", logger=logger.debug
- )
- def __init__(self, cfg: OmegaConf):
- """FaceAnalyzer is the main class that reads images, runs face detection, tensor unification and facial feature prediction.
- It also draws bounding boxes and facial landmarks over the image.
-
- The following components are used:
-
- 1. Reader - reads the image and returns an ImageData object containing the image tensor.
- 2. Detector - wrapper around a neural network that detects faces.
- 3. Unifier - processor that unifies sizes of all faces and normalizes them between 0 and 1.
- 4. Predictor dict - dict of wrappers around neural networks trained to analyze facial features.
- 5. Utilizer dict - dict of utilizer processors that can for example extract 3D face landmarks or draw boxes over the image.
-
- Args:
- cfg (OmegaConf): Config object with image reader, face detector, unifier and predictor configurations.
-
- Attributes:
- cfg (OmegaConf): Config object with image reader, face detector, unifier and predictor configurations.
- reader (BaseReader): Reader object that reads the image and returns an ImageData object containing the image tensor.
- detector (FaceDetector): FaceDetector object that wraps a neural network that detects faces.
- unifier (FaceUnifier): FaceUnifier object that unifies sizes of all faces and normalizes them between 0 and 1.
- predictors (Dict[str, FacePredictor]): Dict of FacePredictor objects that predict facial features. Key is the name of the predictor.
- utilizers (Dict[str, FaceUtilizer]): Dict of FaceUtilizer objects that can extract 3D face landmarks, draw boxes over the image, etc. Key is the name of the utilizer.
- logger (logging.Logger): Logger object that logs messages to the console or to a file.
-
- """
- self.cfg = cfg
- self.logger = instantiate(self.cfg.logger).logger
-
- self.logger.info("Initializing FaceAnalyzer")
- self.logger.debug("Config", extra=self.cfg.__dict__["_content"])
-
- self.logger.info("Initializing BaseReader")
- self.reader = instantiate(self.cfg.reader)
-
- self.logger.info("Initializing FaceDetector")
- self.detector = instantiate(self.cfg.detector)
-
- self.logger.info("Initializing FaceUnifier")
- if "unifier" in self.cfg:
- self.unifier = instantiate(self.cfg.unifier)
- else:
- self.unifier = None
-
- self.logger.info("Initializing FacePredictor objects")
- self.predictors = {}
- if "predictor" in self.cfg:
- for predictor_name in self.cfg.predictor:
- self.logger.info(f"Initializing FacePredictor {predictor_name}")
- self.predictors[predictor_name] = instantiate(
- self.cfg.predictor[predictor_name]
- )
-
- self.utilizers = {}
- if "utilizer" in self.cfg:
- self.logger.info("Initializing BaseUtilizer objects")
- for utilizer_name in self.cfg.utilizer:
- self.logger.info(f"Initializing BaseUtilizer {utilizer_name}")
- self.utilizers[utilizer_name] = instantiate(
- self.cfg.utilizer[utilizer_name]
- )
-
- @Timer("FaceAnalyzer.run", "{name}: {milliseconds:.2f} ms", logger=logger.debug)
- def run(
- self,
- image_source: Optional[
- Union[str, torch.Tensor, np.ndarray, bytes, Image.Image]
- ] = None,
- path_image: Optional[str] = None,
- batch_size: int = 8,
- fix_img_size: bool = False,
- return_img_data: bool = False,
- include_tensors: bool = False,
- path_output: Optional[str] = None,
- tensor: Optional[torch.Tensor] = None,
- ) -> Union[Response, ImageData]:
- """Reads image, detects faces, unifies the detected faces, predicts facial features
- and returns analyzed data.
-
- Args:
- image_source (Optional[Union[str, torch.Tensor, np.ndarray, bytes, Image.Image]]): Input to be analyzed. If None, path_image or tensor must be provided. Default: None.
- path_image (Optional[str]): Path to the image to be analyzed. If None, tensor must be provided. Default: None.
- batch_size (int): Batch size for making predictions on the faces. Default is 8.
- fix_img_size (bool): If True, resizes the image to the size specified in reader. Default is False.
- return_img_data (bool): If True, returns all image data including tensors, otherwise only returns the faces. Default is False.
- include_tensors (bool): If True, removes tensors from the returned data object. Default is False.
- path_output (Optional[str]): Path where to save the image with detected faces. If None, the image is not saved. Default: None.
- tensor (Optional[torch.Tensor]): Image tensor to be analyzed. If None, path_image must be provided. Default: None.
-
- Returns:
- Union[Response, ImageData]: If return_img_data is False, returns a Response object containing the faces and their facial features. If return_img_data is True, returns the entire ImageData object.
-
- """
-
- def _predict_batch(
- data: ImageData, predictor: FacePredictor, predictor_name: str
- ) -> ImageData:
- n_faces = len(data.faces)
-
- for face_indx_start in range(0, n_faces, batch_size):
- face_indx_end = min(face_indx_start + batch_size, n_faces)
-
- face_batch_tensor = torch.stack(
- [face.tensor for face in data.faces[face_indx_start:face_indx_end]]
- )
- preds = predictor.run(face_batch_tensor)
- data.add_preds(preds, predictor_name, face_indx_start)
-
- return data
-
- self.logger.info("Running FaceAnalyzer")
-
- if path_image is None and tensor is None and image_source is None:
- raise ValueError("Either input, path_image or tensor must be provided.")
-
- if image_source is not None:
- self.logger.debug("Using image_source as input")
- reader_input = image_source
- elif path_image is not None:
- self.logger.debug(
- "Using path_image as input", extra={"path_image": path_image}
- )
- reader_input = path_image
- else:
- self.logger.debug("Using tensor as input")
- reader_input = tensor
-
- self.logger.info("Reading image", extra={"input": reader_input})
- data = self.reader.run(reader_input, fix_img_size=fix_img_size)
-
- path_output = None if path_output == "None" else path_output
- data.path_output = path_output
-
- try:
- data.version = version("facetorch")
- except Exception as e:
- self.logger.warning("Could not get version number", extra={"error": e})
-
- self.logger.info("Detecting faces")
- data = self.detector.run(data)
- n_faces = len(data.faces)
- self.logger.info(f"Number of faces: {n_faces}")
-
- if n_faces > 0 and self.unifier is not None:
- self.logger.info("Unifying faces")
- data = self.unifier.run(data)
-
- self.logger.info("Predicting facial features")
- for predictor_name, predictor in self.predictors.items():
- self.logger.info(f"Running FacePredictor: {predictor_name}")
- data = _predict_batch(data, predictor, predictor_name)
-
- self.logger.info("Utilizing facial features")
- for utilizer_name, utilizer in self.utilizers.items():
- self.logger.info(f"Running BaseUtilizer: {utilizer_name}")
- data = utilizer.run(data)
- else:
- if "save" in self.utilizers:
- self.utilizers["save"].run(data)
-
- if not include_tensors:
- self.logger.debug(
- "Removing tensors from response as include_tensors is False"
- )
- data.reset_tensors()
-
- response = Response(faces=data.faces, version=data.version)
-
- if return_img_data:
- self.logger.debug("Returning image data object", extra=data.__dict__)
- return data
- else:
- self.logger.debug("Returning response with faces", extra=response.__dict__)
- return response
-
@@ -481,123 +286,6 @@ Returns
Union[Response, ImageData]
If return_img_data is False, returns a Response object containing the faces and their facial features. If return_img_data is True, returns the entire ImageData object.
-
-
-Expand source code
-
-@Timer("FaceAnalyzer.run", "{name}: {milliseconds:.2f} ms", logger=logger.debug)
-def run(
- self,
- image_source: Optional[
- Union[str, torch.Tensor, np.ndarray, bytes, Image.Image]
- ] = None,
- path_image: Optional[str] = None,
- batch_size: int = 8,
- fix_img_size: bool = False,
- return_img_data: bool = False,
- include_tensors: bool = False,
- path_output: Optional[str] = None,
- tensor: Optional[torch.Tensor] = None,
-) -> Union[Response, ImageData]:
- """Reads image, detects faces, unifies the detected faces, predicts facial features
- and returns analyzed data.
-
- Args:
- image_source (Optional[Union[str, torch.Tensor, np.ndarray, bytes, Image.Image]]): Input to be analyzed. If None, path_image or tensor must be provided. Default: None.
- path_image (Optional[str]): Path to the image to be analyzed. If None, tensor must be provided. Default: None.
- batch_size (int): Batch size for making predictions on the faces. Default is 8.
- fix_img_size (bool): If True, resizes the image to the size specified in reader. Default is False.
- return_img_data (bool): If True, returns all image data including tensors, otherwise only returns the faces. Default is False.
- include_tensors (bool): If True, removes tensors from the returned data object. Default is False.
- path_output (Optional[str]): Path where to save the image with detected faces. If None, the image is not saved. Default: None.
- tensor (Optional[torch.Tensor]): Image tensor to be analyzed. If None, path_image must be provided. Default: None.
-
- Returns:
- Union[Response, ImageData]: If return_img_data is False, returns a Response object containing the faces and their facial features. If return_img_data is True, returns the entire ImageData object.
-
- """
-
- def _predict_batch(
- data: ImageData, predictor: FacePredictor, predictor_name: str
- ) -> ImageData:
- n_faces = len(data.faces)
-
- for face_indx_start in range(0, n_faces, batch_size):
- face_indx_end = min(face_indx_start + batch_size, n_faces)
-
- face_batch_tensor = torch.stack(
- [face.tensor for face in data.faces[face_indx_start:face_indx_end]]
- )
- preds = predictor.run(face_batch_tensor)
- data.add_preds(preds, predictor_name, face_indx_start)
-
- return data
-
- self.logger.info("Running FaceAnalyzer")
-
- if path_image is None and tensor is None and image_source is None:
- raise ValueError("Either input, path_image or tensor must be provided.")
-
- if image_source is not None:
- self.logger.debug("Using image_source as input")
- reader_input = image_source
- elif path_image is not None:
- self.logger.debug(
- "Using path_image as input", extra={"path_image": path_image}
- )
- reader_input = path_image
- else:
- self.logger.debug("Using tensor as input")
- reader_input = tensor
-
- self.logger.info("Reading image", extra={"input": reader_input})
- data = self.reader.run(reader_input, fix_img_size=fix_img_size)
-
- path_output = None if path_output == "None" else path_output
- data.path_output = path_output
-
- try:
- data.version = version("facetorch")
- except Exception as e:
- self.logger.warning("Could not get version number", extra={"error": e})
-
- self.logger.info("Detecting faces")
- data = self.detector.run(data)
- n_faces = len(data.faces)
- self.logger.info(f"Number of faces: {n_faces}")
-
- if n_faces > 0 and self.unifier is not None:
- self.logger.info("Unifying faces")
- data = self.unifier.run(data)
-
- self.logger.info("Predicting facial features")
- for predictor_name, predictor in self.predictors.items():
- self.logger.info(f"Running FacePredictor: {predictor_name}")
- data = _predict_batch(data, predictor, predictor_name)
-
- self.logger.info("Utilizing facial features")
- for utilizer_name, utilizer in self.utilizers.items():
- self.logger.info(f"Running BaseUtilizer: {utilizer_name}")
- data = utilizer.run(data)
- else:
- if "save" in self.utilizers:
- self.utilizers["save"].run(data)
-
- if not include_tensors:
- self.logger.debug(
- "Removing tensors from response as include_tensors is False"
- )
- data.reset_tensors()
-
- response = Response(faces=data.faces, version=data.version)
-
- if return_img_data:
- self.logger.debug("Returning image data object", extra=data.__dict__)
- return data
- else:
- self.logger.debug("Returning response with faces", extra=response.__dict__)
- return response
-
@@ -651,7 +339,6 @@ Returns
}).setContent('').open();
}
-Index
@@ -675,7 +362,7 @@