Repository: ad12/meddlr (language: python)

Issue:
Find long-term solution for hosting models 
Google Drive (gdrive) has quota limits on fetching files that bottlenecks CI and model validation. We may need to find a longer term solution for hosting models for free on a different. the new place for hosting, in theory, should be:

1. easy to visualize / interface with via UI
2. easy to download files from via command line (wget, etc)


Discussion / hints:

Fix patch:
diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml
index f8928f77..83fb9b80 100644
--- a/.github/workflows/ci.yaml
+++ b/.github/workflows/ci.yaml
@@ -32,7 +32,7 @@ jobs:
       - name: Install Dependencies
         run: |
           python -m pip install --upgrade pip
-          make dev
+          make dev-lint
       - name: Lint with isort, black, docformatter, flake8
         run: |
           make lint
@@ -68,13 +68,13 @@ jobs:
             pip install torchmetrics==$TORCHMETRICS
           fi
           make dev
-          pip install -e '.[dev]'
+          pip install -e '.[alldev]'
 
       - name: Test with pytest
         run: |
           pip install pytest
           pip install pytest-cov
-          make test-cov
+          MEDDLR_TEST_MODEL_ZOOS=True make test-cov
 
       - name: Upload to codecov.io
         uses: codecov/codecov-action@v1
diff --git a/MODEL_ZOO.md b/MODEL_ZOO.md
index 9cd17f5d..5ca714a7 100644
--- a/MODEL_ZOO.md
+++ b/MODEL_ZOO.md
@@ -1,1 +1,2 @@
 # Model Zoo
+A list of pre-trained models available in Meddlr's model zoo. More models can be found in the [projects](projects) folder.
diff --git a/Makefile b/Makefile
index 68aa78b0..63add37d 100644
--- a/Makefile
+++ b/Makefile
@@ -19,9 +19,12 @@ test-cov:
 	pytest tests/ --cov=./ --cov-report=xml
 
 dev:
-	pip install --upgrade black==21.10b0 coverage isort flake8 flake8-bugbear flake8-comprehensions pre-commit pooch
+	pip install --upgrade -e '.[alldev]'
 	pre-commit install
 
+dev-lint:
+	pip install --upgrade black==21.10b0 coverage isort flake8 flake8-bugbear flake8-comprehensions pre-commit pooch
+
 build-docs:
 	rm -rf docs/build
 	rm -rf docs/source/apidocs/generated
diff --git a/README.md b/README.md
index 6d1524a6..e61116ca 100644
--- a/README.md
+++ b/README.md
@@ -11,11 +11,16 @@ Meddlr is a config-driven ML framework built to simplify medical image reconstru
 
 ## ⚡ QuickStart
 ```bash
+# Install Meddlr with basic dependencies
 pip install meddlr
+
+# Install Meddlr with all dependencies (e.g. pretrained models, benchmarking)
+pip install 'meddlr[all]'
 ```
-> _Installing locally_: For local development, fork and clone the repo and run `pip install -e ".[dev]"`
 
-> _Installing from main: For most up-to-date code without a local install, run `pip install "meddlr @ git+https://github.com/ad12/meddlr@main"`
+> _Installing locally_: For local development, fork and clone the repo and run `pip install -e ".[alldev]"`
+
+> _Installing from main_: For most up-to-date code without a local install, run `pip install "meddlr @ git+https://github.com/ad12/meddlr@main"`
 
 Configure your paths and get going!
 ```python
@@ -35,17 +40,16 @@ os.environ["MEDDLR_DATASETS_DIR"] = "/path/to/datasets"
 Detailed instructions are available in [Getting Started](GETTING_STARTED.md).
 
 ## 🐘 Model Zoo
-Easily serve and download pretrained models from the model zoo. A (evolving) list of pre-trained models can be found [here](MODEL_ZOO.md), in [Google Drive](https://drive.google.com/drive/folders/1OJFM4GlFhLTrH6LzVwLdJS9IHytV9ZAx?usp=sharing), and in [project folders](projects).
+Easily serve and download pretrained models from the model zoo. A (evolving) list of pre-trained models can be found [here](MODEL_ZOO.md), on [HuggingFace 🤗](https://huggingface.co/arjundd), and in [project folders](projects).
 
-To use them, pass the google drive urls for the config and weights (model) files to `mr.get_model_from_zoo`:
+To use them, pass the URLs for the config and weights (model) files to `mr.get_model_from_zoo`:
 
 ```python
 import meddlr as mr
 
-# Make sure to add "download://" before the url!
 model = mr.get_model_from_zoo(
-  cfg_or_file="download://https://drive.google.com/file/d/1HQg_qGS8rZzL9Vt3tewX2J8pcK3VVDWF/view?usp=sharing",
-  weights_path="download://https://drive.google.com/file/d/1B4jw1yQtPSPY0P74g3ORcQpQ3Ue3XdJs/view?usp=sharing",
+  cfg_or_file="https://huggingface.co/arjundd/vortex-release/resolve/main/mridata_knee_3dfse/Supervised/config.yaml",
+  weights_path="https://huggingface.co/arjundd/vortex-release/resolve/main/mridata_knee_3dfse/Supervised/model.ckpt",
 )
 ```
 
diff --git a/meddlr/utils/path.py b/meddlr/utils/path.py
index fc8910f1..88ed7670 100644
--- a/meddlr/utils/path.py
+++ b/meddlr/utils/path.py
@@ -1,3 +1,4 @@
+import io
 import logging
 import os
 import shutil
@@ -18,6 +19,20 @@
 except ImportError:
     _GDOWN_AVAILABLE = False
 
+try:
+    import iocursor
+
+    _IOCURSOR_AVAILABLE = True
+except ImportError:
+    _IOCURSOR_AVAILABLE = False
+
+try:
+    import requests
+
+    _REQUESTS_AVAILABLE = True
+except ImportError:
+    _REQUESTS_AVAILABLE = False
+
 _REPO_DIR = os.path.join(os.path.dirname(__file__), "../..")
 _LOGGER = logging.getLogger(__name__)
 
@@ -238,7 +253,7 @@ def _get_local_path(
         self,
         path: str,
         force: bool = False,
-        cache_file: Optional[str] = None,
+        cache: Optional[str] = None,
         is_folder=None,
         **kwargs: Any,
     ) -> str:
@@ -251,13 +266,14 @@ def _get_local_path(
                 Must start with ``'gdrive://'``.
             force (bool, optional): If ``True``, force a download of the Github
                 repository. Defaults to ``False``.
-            cache_file (str, optional): The path to cache file to.
+            cache (str, optional): The path to cache file to.
 
         Returns:
             str: The local path to the file/directory.
         """
         if not _GDOWN_AVAILABLE:
             raise ModuleNotFoundError("`gdown` not installed. Install it via `pip install gdown`")
+
         path = str(path)
         path = path[len(self.PREFIX) :]
         self._check_kwargs(kwargs)
@@ -266,9 +282,9 @@ def _get_local_path(
             is_folder = "drive.google.com" in path and "folders" in path
 
         if is_folder:
-            path = self._handle_folder(path, cache_file, force)
+            path = self._handle_folder(path, cache, force)
         else:
-            path = self._handle_file(path, cache_file, force)
+            path = self._handle_file(path, cache, force)
         return path
 
     def _handle_file(self, path: str, cache: str, force: bool) -> str:
@@ -315,6 +331,135 @@ def _handle_folder(self, path: str, cache: str, force: bool) -> str:
         return cache
 
 
+class URLHandler(GeneralPathHandler):
+    """Handler to download, cache, and match HuggingFace files to local folder structure.
+
+    Publicly available files on HuggingFace can be downloaded using this handler.
+    By default, files are not cached.
+
+    Examples:
+
+    .. code-block:: python
+
+        handler = URLHandler()
+        >>> handler.get_local_path("wget://https://huggingface.co/arjundd/vortex-release/blob/main/mridata_knee_3dfse/Supervised/config.yaml")  # noqa: E501
+    """
+
+    # DO NOT REORDER.
+    PREFIX = ("https://", "http://")
+    LEGACY_PREFIX = ("download://",)
+
+    # Certain URLs have to be redirected to a different handler.
+    _DOMAIN_TO_PREFIX_MATCH = {"drive.google.com": "gdrive://"}
+
+    def __init__(self, path_manager: PathManager, cache_dir=None, **kwargs) -> None:
+        self.path_manager = weakref.proxy(path_manager)
+        self.cache_dir = cache_dir
+        super().__init__(**kwargs)
+
+    def _get_supported_prefixes(self):
+        return self.PREFIX + self.LEGACY_PREFIX
+
+    def _root_dir(self):
+        return None
+
+    def _check_other_prefixes(self, path: str) -> str:
+        path = str(path)
+        for domain, prefix in self._DOMAIN_TO_PREFIX_MATCH.items():
+            if domain in path:
+                path = self._parse_legacy_prefix(path)
+                return f"{prefix}{path}"
+        return False
+
+    def _parse_legacy_prefix(self, path: str) -> str:
+        """Parses legacy prefixes out of the url path."""
+        for prefix in self.LEGACY_PREFIX:
+            if path.startswith(prefix):
+                return path[len(prefix) :]
+        return path
+
+    def _open(self, path, mode="r", **kwargs):
+        if mode not in ("r", "rb"):
+            raise ValueError("Only file reading is supported.")
+
+        other_domain_path = self._check_other_prefixes(path)
+        if other_domain_path:
+            return self.path_manager.open(other_domain_path, mode=mode, **kwargs)
+
+        if not _REQUESTS_AVAILABLE:
+            raise ModuleNotFoundError(
+                "`requests` not installed. Install it via `pip install requests`"
+            )
+
+        path = self._parse_legacy_prefix(path)
+        r = requests.get(path, **kwargs)
+        r.raise_for_status()
+
+        if _IOCURSOR_AVAILABLE:
+            return iocursor.Cursor(r.content)
+        else:
+            return io.BytesIO(r.content)
+
+    def _get_local_path(
+        self,
+        path: str,
+        force: bool = False,
+        cache: Optional[str] = None,
+        **kwargs: Any,
+    ) -> str:
+        """Get local path to google drive file.
+
+        To force a download, set ``force=True``.
+
+        Args:
+            path (str): The relative file path in the GitHub repository.
+                Must start with ``'gdrive://'``.
+            force (bool, optional): If ``True``, force a download of the Github
+                repository. Defaults to ``False``.
+            cache (str, optional): The path to cache file to.
+
+        Returns:
+            str: The local path to the file/directory.
+        """
+        other_domain_path = self._check_other_prefixes(path)
+        if other_domain_path:
+            return self.path_manager.get_local_path(
+                other_domain_path, force=force, cache=cache, **kwargs
+            )
+
+        if not _REQUESTS_AVAILABLE:
+            raise ModuleNotFoundError(
+                "`requests` not installed. Install it via `pip install requests`"
+            )
+
+        path = self._parse_legacy_prefix(str(path))
+        self._check_kwargs(kwargs)
+
+        if cache is None:
+            cache = os.path.join(
+                env.get_path_manager().get_local_path(Cluster.working_cluster().cache_dir), "url"
+            )
+            base = path.split("://", 1)[1]
+            out_file = os.path.join(cache, base)
+        elif str(cache).endswith(os.pathsep) or os.path.isdir(path):
+            out_file = os.path.join(cache, os.path.basename(path))
+        else:
+            out_file = cache
+
+        # TODO: Make caching smarter based on time of file creation and update.
+        if force or not os.path.isfile(out_file):
+            logger = logging.getLogger(__name__)
+            logger.info("Downloading file from {}...".format(path))
+            r = requests.get(path)
+            r.raise_for_status()
+            os.makedirs(os.path.dirname(out_file), exist_ok=True)
+            with open(out_file, "wb") as f:
+                f.write(r.content)
+            logger.info("File cached to {}".format(out_file))
+
+        return out_file
+
+
 class DownloadHandler(GeneralPathHandler):
     """Handler to download files from a URL.
 
@@ -355,6 +500,8 @@ def _get_local_path(
 
         if "drive.google.com" in path:
             return self.path_manager.get_local_path(f"gdrive://{path}", **kwargs)
+        elif "huggingface.co" in path:
+            return self.path_manager.get_local_path(path, **kwargs)
         else:
             raise ValueError(f"Download not supported for url {path}")
 
@@ -378,7 +525,7 @@ def _get_local_path(
     ) -> str:
         path = f"{DownloadHandler.PREFIX}{path[len(self.PREFIX) :]}"
         kwargs.pop("force", None)
-        return super()._get_local_path(path, force=True, **kwargs)
+        return self.path_manager.get_local_path(path, force=True, **kwargs)
 
 
 def download_github_repository(url, cache_path, branch_or_tag="main", force=False) -> str:
@@ -427,5 +574,5 @@ def download_github_repository(url, cache_path, branch_or_tag="main", force=Fals
 _path_manager.register_handler(GithubHandler(env.get_github_url(), default_branch_or_tag=None))
 _path_manager.register_handler(AnnotationsHandler())
 _path_manager.register_handler(GoogleDriveHandler())
-_path_manager.register_handler(DownloadHandler(_path_manager))
 _path_manager.register_handler(ForceDownloadHandler(_path_manager))
+_path_manager.register_handler(URLHandler(_path_manager))
diff --git a/projects/noise2recon/MODEL_ZOO.md b/projects/noise2recon/MODEL_ZOO.md
index cde6e8c2..60e677e7 100644
--- a/projects/noise2recon/MODEL_ZOO.md
+++ b/projects/noise2recon/MODEL_ZOO.md
@@ -1,46 +1,45 @@
 # Noise2Recon Model Zoo
 Models and experimental configs for Noise2Recon and related baselines. Benchmarking was performed on the mridata 3D FSE Knee dataset.
 
-Each experiment has links to 1) the Google Drive folder where details of the experiment are stored (`gdrive`), 2) the config file to reproduce the experiment (`cfg`), 3) the model file for loading pretrained weights (`model`).
+Each experiment has links to 1) the HuggingFace folder where details of the experiment are stored (🤗), 2) the config file to reproduce the experiment (`cfg`), 3) the model file for loading pretrained weights (`model`).
 
 Models are trained with different extents of supervised data, indicated by the number of supervised scans, or *k* (`# Supervised (k)`). Noise2Recon can also leverage unsupervised examples (`# Unsupervised`). `FT` models are fine-tuned from a pretrained denoiser as described in the paper. All models are trained with the Adam optimizer (η=1e-3) using the complex-l1 loss. Checkpoints were selected using the best validation loss.
 
 ## mridata 3D FSE Knee (12x)
-| Name                     | Train Acc.   |   # Supervised (k) |   # Unsupervised | Description                                                                         | Download                                                                                                                                                                                                                                                                                   |
-|:-------------------------|:-------------|-------------------:|-----------------:|:------------------------------------------------------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| Supervised (1sub)        | 12x          |                  1 |                0 | Supervised baseline w/ 1 supervised training scan                                   | [gdrive](https://drive.google.com/drive/folders/1neRAcCplUqJduxpzb4VEpU1eBsaPDDWv?usp=sharing) \| [cfg](https://drive.google.com/file/d/1nh18LBPYce-VEEEfP_BupUSKOG_i2Uoe/view?usp=sharing) \| [model](https://drive.google.com/file/d/1-3aR1637LbLZGXI23DKsDd16pzWZHwDm/view?usp=sharing) |
-| Supervised (2sub)        | 12x          |                  2 |                0 | Supervised baseline                                                                 | [gdrive](https://drive.google.com/drive/folders/1sdXZ1atBiFFc9X5VMVc-r1GXTPmxYTmz?usp=sharing) \| [cfg](https://drive.google.com/file/d/1KZxZEwlylPVLqBUDC27rxwsFEiTH0vZC/view?usp=sharing) \| [model](https://drive.google.com/file/d/1mYt6H-8bB9_J_4FSVPh_u-M9YwBgIS_G/view?usp=sharing) |
-| Supervised (3sub)        | 12x          |                  3 |                0 | Supervised baseline                                                                 | [gdrive](https://drive.google.com/drive/folders/1JdRUQBvwycMHxVhrXVf86jBqfLYshyD-?usp=sharing) \| [cfg](https://drive.google.com/file/d/1z6Fd8iq5ULJOHnFDYFJyKCiDI3S0txxf/view?usp=sharing) \| [model](https://drive.google.com/file/d/1rMNGvQjR2bHX5rdub2F31IB4aU_u33jK/view?usp=sharing) |
-| Supervised (14sub)       | 12x          |                 14 |                0 | Supervised baseline                                                                 | [gdrive](https://drive.google.com/drive/folders/1ok0kRaLZ4bMxkT-JmW43AwKKkfG0hEl_?usp=sharing) \| [cfg](https://drive.google.com/file/d/1FzEFcLRksneqj0RCZR5z6KtCYwLF0XwA/view?usp=sharing) \| [model](https://drive.google.com/file/d/1bS4sZX8g0LUIFY0uG_lc-5g3uJ0xd8og/view?usp=sharing) |
-| Supervised+Aug (1sub)    | 12x          |                  1 |                0 | Supervised baseline with noise augmentations (p=0.2)                                | [gdrive](https://drive.google.com/drive/folders/1CNZnjPhWixhP4E6eUgBHCEJzdmoJ_9hK?usp=sharing) \| [cfg](https://drive.google.com/file/d/13a94c1NfOcHlWJ-JlyB9RCvDL0NogwSA/view?usp=sharing) \| [model](https://drive.google.com/file/d/1C38_KDadbWzKajewpQfJ7YxwjgVUI_oE/view?usp=sharing) |
-| Supervised+Aug (2sub)    | 12x          |                  2 |                0 | Supervised baseline with noise augmentations (p=0.2)                                | [gdrive](https://drive.google.com/drive/folders/1RxvFuz_FXS-Jn7YA-0q9loEhdIFkzK4W?usp=sharing) \| [cfg](https://drive.google.com/file/d/1p0oHtiO4E_VahybwInHi9Egi_NwU3JaB/view?usp=sharing) \| [model](https://drive.google.com/file/d/1iOMTPAyH606nRQvtJsMrsYdiUR287pdT/view?usp=sharing) |
-| Supervised+Aug (3sub)    | 12x          |                  3 |                0 | Supervised baseline with noise augmentations (p=0.2)                                | [gdrive](https://drive.google.com/drive/folders/1cG7dWKHlmzbosnBpK5uWAyKlUJeZEmtF?usp=sharing) \| [cfg](https://drive.google.com/file/d/1gHDS85bbwWvMONqb013vAeFUnLTqo8EF/view?usp=sharing) \| [model](https://drive.google.com/file/d/1weD75cS7Wx5s0JEFwUMHio_oZMl27AX-/view?usp=sharing) |
-| Supervised-FT (1sub)     | 12x          |                  1 |                0 | Supervised baseline fine-tuned from a pre-trained denoiser                          | [gdrive](https://drive.google.com/drive/folders/1ETf4zxSQ8LM5tTF0lbK3YYirP8zdPs_R?usp=sharing) \| [cfg](https://drive.google.com/file/d/1fOX9nUzJb9fZlCQ1nmurPJi7gF_rKfC0/view?usp=sharing) \| [model](https://drive.google.com/file/d/1vWXGDTr_NToF9Dn5N_S8BG6eR3NRusw1/view?usp=sharing) |
-| Supervised-FT (2sub)     | 12x          |                  2 |                0 | Supervised baseline fine-tuned from a pre-trained denoiser                          | [gdrive](https://drive.google.com/drive/folders/1Al1kS5Mgd7sO8CYfDOQGB4hab9pfQ-7-?usp=sharing) \| [cfg](https://drive.google.com/file/d/1rEJnY2TWnK9IxAD4zgyENxdXhaLjIGxM/view?usp=sharing) \| [model](https://drive.google.com/file/d/1ZhtpIOx5ypvPFYL1QoVx1gCpd5I4O1Y_/view?usp=sharing) |
-| Supervised-FT (3sub)     | 12x          |                  3 |                0 | Supervised baseline fine-tuned from a pre-trained denoiser                          | [gdrive](https://drive.google.com/drive/folders/1dvqKyGFnXWnEv4J81C1md97TtgvxIYSY?usp=sharing) \| [cfg](https://drive.google.com/file/d/1CDznyrhl8aVKkrxd7cQ9ySa5OYATVz8k/view?usp=sharing) \| [model](https://drive.google.com/file/d/1c36nKk9yRbnPj1Fd4f6sXuaOPv6XVC_C/view?usp=sharing) |
-| Supervised+Aug-FT (1sub) | 12x          |                  1 |                0 | Supervised baseline with noise augmentations fine-tuned from a pre-trained denoiser | [gdrive](https://drive.google.com/drive/folders/1SLuHdJVW2ii7YERFgagxS1cAoBsOgopy?usp=sharing) \| [cfg](https://drive.google.com/file/d/1pb2mckL2C7spIYJ6_EKddGqtmhBP6Sfa/view?usp=sharing) \| [model](https://drive.google.com/file/d/1D9mUbYaW3_fbn8uUvWNxk2yxTlzu8wB9/view?usp=sharing) |
-| Supervised+Aug-FT (2sub) | 12x          |                  2 |                0 | Supervised baseline with noise augmentations fine-tuned from a pre-trained denoiser | [gdrive](https://drive.google.com/drive/folders/11ozh_rzW_sn-FsHRBlmantMvWiGy4lbM?usp=sharing) \| [cfg](https://drive.google.com/file/d/1pjovCuwW2wDPaSz4Bpk6S2TpcOvhY-AL/view?usp=sharing) \| [model](https://drive.google.com/file/d/1d_fy4iMzDsbemd3jTyMC0GIFTfAFjxie/view?usp=sharing) |
-| Supervised+Aug-FT (3sub) | 12x          |                  3 |                0 | Supervised baseline with noise augmentations fine-tuned from a pre-trained denoiser | [gdrive](https://drive.google.com/drive/folders/1kOJq7szwm9Qx0Q5bRI8DBOIYGZF5Ioo0?usp=sharing) \| [cfg](https://drive.google.com/file/d/1g-u63VFePBV-hP9ibNVnxlpwiu1HmUS9/view?usp=sharing) \| [model](https://drive.google.com/file/d/1QqoHOe3ZMrqTO8qWrRzOqSegAXI_s0B7/view?usp=sharing) |
-| Noise2Recon (1sub)       | 12x          |                  1 |               13 | Noise2Recon w/ 1:1 balanced sampling                                                | [gdrive](https://drive.google.com/drive/folders/1DBqk1YcMhhs3TPb6hHcv057ZWvWtgk8s?usp=sharing) \| [cfg](https://drive.google.com/file/d/1_1SgXnmuxPBPvOv0Z5w7V1tb5whcsfbm/view?usp=sharing) \| [model](https://drive.google.com/file/d/1cd28LJDtI6RU4BUMWuLtdB_TST3UBYh7/view?usp=sharing) |
-| Noise2Recon (2sub)       | 12x          |                  2 |               12 | Noise2Recon w/ 1:1 balanced sampling                                                | [gdrive](https://drive.google.com/drive/folders/1qblaJaiFp0HDoN6vhanrnAnj2b5CnkKF?usp=sharing) \| [cfg](https://drive.google.com/file/d/1hMbKiB9ztIhYeU0XdJgyATL-ZomorHHR/view?usp=sharing) \| [model](https://drive.google.com/file/d/1wfO9Pcgo0VE-iRYTLoTMLkwmkymQ9v9g/view?usp=sharing) |
-| Noise2Recon (3sub)       | 12x          |                  3 |               11 | Noise2Recon w/ 1:1 balanced sampling                                                | [gdrive](https://drive.google.com/drive/folders/1pSCVz-g9rdvSVZFnTwftG-x6nYuPOSUL?usp=sharing) \| [cfg](https://drive.google.com/file/d/18w3T5W3Ro1eODjIrrWaNrtaciQr6U0nX/view?usp=sharing) \| [model](https://drive.google.com/file/d/1AdCXrl1rljvTJVV3Yhpx9b9xLqrhAQyq/view?usp=sharing) |
-
+| Name                     | Train Acc.   |   # Supervised (k) |   # Unsupervised | Description                                                                         | Download                                                                                                                                                                                                                                                                                                                                                                              |
+|:-------------------------|:-------------|-------------------:|-----------------:|:------------------------------------------------------------------------------------|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| Supervised (1sub)        | 12x          |                  1 |                0 | Supervised baseline w/ 1 supervised training scan                                   | [🤗](https://huggingface.co/arjundd/noise2recon-release/tree/main/mridata_knee_3dfse/12x/Supervised_1sub) \| [cfg](https://huggingface.co/arjundd/noise2recon-release/raw/main/mridata_knee_3dfse/12x/Supervised_1sub/config.yaml) \| [model](https://huggingface.co/arjundd/noise2recon-release/resolve/main/mridata_knee_3dfse/12x/Supervised_1sub/model.ckpt)                      |
+| Supervised (2sub)        | 12x          |                  2 |                0 | Supervised baseline                                                                 | [🤗](https://huggingface.co/arjundd/noise2recon-release/tree/main/mridata_knee_3dfse/12x/Supervised_2sub) \| [cfg](https://huggingface.co/arjundd/noise2recon-release/raw/main/mridata_knee_3dfse/12x/Supervised_2sub/config.yaml) \| [model](https://huggingface.co/arjundd/noise2recon-release/resolve/main/mridata_knee_3dfse/12x/Supervised_2sub/model.ckpt)                      |
+| Supervised (3sub)        | 12x          |                  3 |                0 | Supervised baseline                                                                 | [🤗](https://huggingface.co/arjundd/noise2recon-release/tree/main/mridata_knee_3dfse/12x/Supervised_3sub) \| [cfg](https://huggingface.co/arjundd/noise2recon-release/raw/main/mridata_knee_3dfse/12x/Supervised_3sub/config.yaml) \| [model](https://huggingface.co/arjundd/noise2recon-release/resolve/main/mridata_knee_3dfse/12x/Supervised_3sub/model.ckpt)                      |
+| Supervised (14sub)       | 12x          |                 14 |                0 | Supervised baseline                                                                 | [🤗](https://huggingface.co/arjundd/noise2recon-release/tree/main/mridata_knee_3dfse/12x/Supervised_14sub) \| [cfg](https://huggingface.co/arjundd/noise2recon-release/raw/main/mridata_knee_3dfse/12x/Supervised_14sub/config.yaml) \| [model](https://huggingface.co/arjundd/noise2recon-release/resolve/main/mridata_knee_3dfse/12x/Supervised_14sub/model.ckpt)                   |
+| Supervised+Aug (1sub)    | 12x          |                  1 |                0 | Supervised baseline with noise augmentations (p=0.2)                                | [🤗](https://huggingface.co/arjundd/noise2recon-release/tree/main/mridata_knee_3dfse/12x/Supervised+Aug_1sub) \| [cfg](https://huggingface.co/arjundd/noise2recon-release/raw/main/mridata_knee_3dfse/12x/Supervised+Aug_1sub/config.yaml) \| [model](https://huggingface.co/arjundd/noise2recon-release/resolve/main/mridata_knee_3dfse/12x/Supervised+Aug_1sub/model.ckpt)          |
+| Supervised+Aug (2sub)    | 12x          |                  2 |                0 | Supervised baseline with noise augmentations (p=0.2)                                | [🤗](https://huggingface.co/arjundd/noise2recon-release/tree/main/mridata_knee_3dfse/12x/Supervised+Aug_2sub) \| [cfg](https://huggingface.co/arjundd/noise2recon-release/raw/main/mridata_knee_3dfse/12x/Supervised+Aug_2sub/config.yaml) \| [model](https://huggingface.co/arjundd/noise2recon-release/resolve/main/mridata_knee_3dfse/12x/Supervised+Aug_2sub/model.ckpt)          |
+| Supervised+Aug (3sub)    | 12x          |                  3 |                0 | Supervised baseline with noise augmentations (p=0.2)                                | [🤗](https://huggingface.co/arjundd/noise2recon-release/tree/main/mridata_knee_3dfse/12x/Supervised+Aug_3sub) \| [cfg](https://huggingface.co/arjundd/noise2recon-release/raw/main/mridata_knee_3dfse/12x/Supervised+Aug_3sub/config.yaml) \| [model](https://huggingface.co/arjundd/noise2recon-release/resolve/main/mridata_knee_3dfse/12x/Supervised+Aug_3sub/model.ckpt)          |
+| Supervised-FT (1sub)     | 12x          |                  1 |                0 | Supervised baseline fine-tuned from a pre-trained denoiser                          | [🤗](https://huggingface.co/arjundd/noise2recon-release/tree/main/mridata_knee_3dfse/12x/Supervised-FT_1sub) \| [cfg](https://huggingface.co/arjundd/noise2recon-release/raw/main/mridata_knee_3dfse/12x/Supervised-FT_1sub/config.yaml) \| [model](https://huggingface.co/arjundd/noise2recon-release/resolve/main/mridata_knee_3dfse/12x/Supervised-FT_1sub/model.ckpt)             |
+| Supervised-FT (2sub)     | 12x          |                  2 |                0 | Supervised baseline fine-tuned from a pre-trained denoiser                          | [🤗](https://huggingface.co/arjundd/noise2recon-release/tree/main/mridata_knee_3dfse/12x/Supervised-FT_2sub) \| [cfg](https://huggingface.co/arjundd/noise2recon-release/raw/main/mridata_knee_3dfse/12x/Supervised-FT_2sub/config.yaml) \| [model](https://huggingface.co/arjundd/noise2recon-release/resolve/main/mridata_knee_3dfse/12x/Supervised-FT_2sub/model.ckpt)             |
+| Supervised-FT (3sub)     | 12x          |                  3 |                0 | Supervised baseline fine-tuned from a pre-trained denoiser                          | [🤗](https://huggingface.co/arjundd/noise2recon-release/tree/main/mridata_knee_3dfse/12x/Supervised-FT_3sub) \| [cfg](https://huggingface.co/arjundd/noise2recon-release/raw/main/mridata_knee_3dfse/12x/Supervised-FT_3sub/config.yaml) \| [model](https://huggingface.co/arjundd/noise2recon-release/resolve/main/mridata_knee_3dfse/12x/Supervised-FT_3sub/model.ckpt)             |
+| Supervised+Aug-FT (1sub) | 12x          |                  1 |                0 | Supervised baseline with noise augmentations fine-tuned from a pre-trained denoiser | [🤗](https://huggingface.co/arjundd/noise2recon-release/tree/main/mridata_knee_3dfse/12x/Supervised+Aug-FT_1sub) \| [cfg](https://huggingface.co/arjundd/noise2recon-release/raw/main/mridata_knee_3dfse/12x/Supervised+Aug-FT_1sub/config.yaml) \| [model](https://huggingface.co/arjundd/noise2recon-release/resolve/main/mridata_knee_3dfse/12x/Supervised+Aug-FT_1sub/model.ckpt) |
+| Supervised+Aug-FT (2sub) | 12x          |                  2 |                0 | Supervised baseline with noise augmentations fine-tuned from a pre-trained denoiser | [🤗](https://huggingface.co/arjundd/noise2recon-release/tree/main/mridata_knee_3dfse/12x/Supervised+Aug-FT_2sub) \| [cfg](https://huggingface.co/arjundd/noise2recon-release/raw/main/mridata_knee_3dfse/12x/Supervised+Aug-FT_2sub/config.yaml) \| [model](https://huggingface.co/arjundd/noise2recon-release/resolve/main/mridata_knee_3dfse/12x/Supervised+Aug-FT_2sub/model.ckpt) |
+| Supervised+Aug-FT (3sub) | 12x          |                  3 |                0 | Supervised baseline with noise augmentations fine-tuned from a pre-trained denoiser | [🤗](https://huggingface.co/arjundd/noise2recon-release/tree/main/mridata_knee_3dfse/12x/Supervised+Aug-FT_3sub) \| [cfg](https://huggingface.co/arjundd/noise2recon-release/raw/main/mridata_knee_3dfse/12x/Supervised+Aug-FT_3sub/config.yaml) \| [model](https://huggingface.co/arjundd/noise2recon-release/resolve/main/mridata_knee_3dfse/12x/Supervised+Aug-FT_3sub/model.ckpt) |
+| Noise2Recon (1sub)       | 12x          |                  1 |               13 | Noise2Recon w/ 1:1 balanced sampling                                                | [🤗](https://huggingface.co/arjundd/noise2recon-release/tree/main/mridata_knee_3dfse/12x/Noise2Recon_1sub) \| [cfg](https://huggingface.co/arjundd/noise2recon-release/raw/main/mridata_knee_3dfse/12x/Noise2Recon_1sub/config.yaml) \| [model](https://huggingface.co/arjundd/noise2recon-release/resolve/main/mridata_knee_3dfse/12x/Noise2Recon_1sub/model.ckpt)                   |
+| Noise2Recon (2sub)       | 12x          |                  2 |               12 | Noise2Recon w/ 1:1 balanced sampling                                                | [🤗](https://huggingface.co/arjundd/noise2recon-release/tree/main/mridata_knee_3dfse/12x/Noise2Recon_2sub) \| [cfg](https://huggingface.co/arjundd/noise2recon-release/raw/main/mridata_knee_3dfse/12x/Noise2Recon_2sub/config.yaml) \| [model](https://huggingface.co/arjundd/noise2recon-release/resolve/main/mridata_knee_3dfse/12x/Noise2Recon_2sub/model.ckpt)                   |
+| Noise2Recon (3sub)       | 12x          |                  3 |               11 | Noise2Recon w/ 1:1 balanced sampling                                                | [🤗](https://huggingface.co/arjundd/noise2recon-release/tree/main/mridata_knee_3dfse/12x/Noise2Recon_3sub) \| [cfg](https://huggingface.co/arjundd/noise2recon-release/raw/main/mridata_knee_3dfse/12x/Noise2Recon_3sub/config.yaml) \| [model](https://huggingface.co/arjundd/noise2recon-release/resolve/main/mridata_knee_3dfse/12x/Noise2Recon_3sub/model.ckpt)                   |
 ## mridata 3D FSE Knee (16x)
-| Name                     | Train Acc.   |   # Supervised (k) |   # Unsupervised | Description                                                                         | Download                                                                                                                                                                                                                                                                                   |
-|:-------------------------|:-------------|-------------------:|-----------------:|:------------------------------------------------------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| Supervised (1sub)        | 16x          |                  1 |                0 | Supervised baseline w/ 1 supervised training scan                                   | [gdrive](https://drive.google.com/drive/folders/19-hsDwx9EDoYAT5I9Fz_RN8--jkHl_Bm?usp=sharing) \| [cfg](https://drive.google.com/file/d/1P6j3QvQeWUM-RBeMiXaIhwOGQ2hIqwz5/view?usp=sharing) \| [model](https://drive.google.com/file/d/1oiwerYOfDdySDDZ5W5IMdK0-3SUv-8r4/view?usp=sharing) |
-| Supervised (2sub)        | 16x          |                  2 |                0 | Supervised baseline                                                                 | [gdrive](https://drive.google.com/drive/folders/1RTfsOtmRc-4IBfvtVsdxYNN0AN7sYZDk?usp=sharing) \| [cfg](https://drive.google.com/file/d/1P_X6ANCCN1Gft_HeUFKfojNW9EyHZ7u3/view?usp=sharing) \| [model](https://drive.google.com/file/d/1_VNprzccr2Q3HjQ6CDSDrFTvYFHbyqjN/view?usp=sharing) |
-| Supervised (3sub)        | 16x          |                  3 |                0 | Supervised baseline                                                                 | [gdrive](https://drive.google.com/drive/folders/1tkEbKaWt6QnSpGl05-C5JF_PSkNraFhN?usp=sharing) \| [cfg](https://drive.google.com/file/d/1T4brVfmuJzrJDdXH30N3XNcwPC9lYP2M/view?usp=sharing) \| [model](https://drive.google.com/file/d/1T9qaWe6be_RvnD76ut6eM4D-qheZ0YFi/view?usp=sharing) |
-| Supervised (14sub)       | 16x          |                 14 |                0 | Supervised baseline                                                                 | [gdrive](https://drive.google.com/drive/folders/1DuFK87rNoB7quldCBU_XYHzeytIJwmt8?usp=sharing) \| [cfg](https://drive.google.com/file/d/1KOhFLBECYBBPccnJOYbKC_JKWwYeglfS/view?usp=sharing) \| [model](https://drive.google.com/file/d/1iCed12FmNJWOxvg5pZ_YPsUhCy54eg7C/view?usp=sharing) |
-| Supervised+Aug (1sub)    | 16x          |                  1 |                0 | Supervised baseline with noise augmentations (p=0.2)                                | [gdrive](https://drive.google.com/drive/folders/1gzjsVMLlmmLvRKQrHt2uTRqe3KSjzief?usp=sharing) \| [cfg](https://drive.google.com/file/d/1raLhyX_TMJl4Go8Pp9TQxRhaLJ_Y513f/view?usp=sharing) \| [model](https://drive.google.com/file/d/11YMGN2m9E-oPcL3PJpsX3B3oOZY9Ogr0/view?usp=sharing) |
-| Supervised+Aug (2sub)    | 16x          |                  2 |                0 | Supervised baseline with noise augmentations (p=0.2)                                | [gdrive](https://drive.google.com/drive/folders/1L0ZeiS-XrJFXQFfFlWZSOZCda23E2LJB?usp=sharing) \| [cfg](https://drive.google.com/file/d/1TQ11T42N_5saOmyWhq09JrHQtrhJQYiG/view?usp=sharing) \| [model](https://drive.google.com/file/d/1eSOz0pwmuBlCTyEYW1PfS1zz_ftzZDvX/view?usp=sharing) |
-| Supervised+Aug (3sub)    | 16x          |                  3 |                0 | Supervised baseline with noise augmentations (p=0.2)                                | [gdrive](https://drive.google.com/drive/folders/1aP9veDf8zocD0zET3JI9AP9_aUxCrn6D?usp=sharing) \| [cfg](https://drive.google.com/file/d/1eng2B7PypOft1DlG9BxnsMB6dfFD0eru/view?usp=sharing) \| [model](https://drive.google.com/file/d/1cniX4PLnD5TuG_45ak4NpL1890FPEfyf/view?usp=sharing) |
-| Supervised-FT (1sub)     | 16x          |                  1 |                0 | Supervised baseline fine-tuned from a pre-trained denoiser                          | [gdrive](https://drive.google.com/drive/folders/1bDFTIqnku21pD3NuAP8CCHZtO8anbVhf?usp=sharing) \| [cfg](https://drive.google.com/file/d/1oCabozKupg-274dR2bPIXfRexOY-7mOB/view?usp=sharing) \| [model](https://drive.google.com/file/d/1AxKJZCyObTaXcO1nkJ7N6Xl9aAw3opXQ/view?usp=sharing) |
-| Supervised-FT (2sub)     | 16x          |                  2 |                0 | Supervised baseline fine-tuned from a pre-trained denoiser                          | [gdrive](https://drive.google.com/drive/folders/1XJX8F-HPDGeHH8npnro3QUp0hzcwYJjz?usp=sharing) \| [cfg](https://drive.google.com/file/d/16Ix4-O3Nm0wTV2ztZB6OEYL_8IlLrOtb/view?usp=sharing) \| [model](https://drive.google.com/file/d/1WlBBGIc8zdIxM8GCZcw2YTN5kYVsISoc/view?usp=sharing) |
-| Supervised-FT (3sub)     | 16x          |                  3 |                0 | Supervised baseline fine-tuned from a pre-trained denoiser                          | [gdrive](https://drive.google.com/drive/folders/1mWDet7Y4747MYTV7sDDUSN-wWD4IdM2_?usp=sharing) \| [cfg](https://drive.google.com/file/d/1kRZqTilXhPbd1jNnMZZkuJbzdlmkqnkf/view?usp=sharing) \| [model](https://drive.google.com/file/d/10vwvt6UNMzxFSlG01zztnEuX8WguY3ZD/view?usp=sharing) |
-| Supervised+Aug-FT (1sub) | 16x          |                  1 |                0 | Supervised baseline with noise augmentations fine-tuned from a pre-trained denoiser | [gdrive](https://drive.google.com/drive/folders/1LTyqvcGzNY728dWZ2f5xLZKFuHkpz2N8?usp=sharing) \| [cfg](https://drive.google.com/file/d/1UhW4s_n7Lr9VJizLMY0_-0V7vnvZ2vLm/view?usp=sharing) \| [model](https://drive.google.com/file/d/1V3ox-70NLt6_x9wyNn_wcviVCPBqK_3e/view?usp=sharing) |
-| Supervised+Aug-FT (2sub) | 16x          |                  2 |                0 | Supervised baseline with noise augmentations fine-tuned from a pre-trained denoiser | [gdrive](https://drive.google.com/drive/folders/1KtZ_MXQ4I2l93jOBitlsSyr8-17zieEM?usp=sharing) \| [cfg](https://drive.google.com/file/d/1zRBrs81g3GBVlqfRDR1861xYuRwsxNbk/view?usp=sharing) \| [model](https://drive.google.com/file/d/1u_hH_3mL5BOVr_bnAUBc0z13Wl792LEC/view?usp=sharing) |
-| Supervised+Aug-FT (3sub) | 16x          |                  3 |                0 | Supervised baseline with noise augmentations fine-tuned from a pre-trained denoiser | [gdrive](https://drive.google.com/drive/folders/1jrzGB4S6O3PWWJA6txZxA5yaoUrsbr48?usp=sharing) \| [cfg](https://drive.google.com/file/d/1SBpMhM8om50j1aVVXVyM8ndfMI03fcKv/view?usp=sharing) \| [model](https://drive.google.com/file/d/1SdijJMn6acBjTkzgbH6jaJRLHexGxmPW/view?usp=sharing) |
-| Noise2Recon (1sub)       | 16x          |                  1 |               13 | Noise2Recon w/ 1:1 balanced sampling                                                | [gdrive](https://drive.google.com/drive/folders/1nkLvP65C4zRaei_T04TvJKs7fZzH3qKk?usp=sharing) \| [cfg](https://drive.google.com/file/d/1SX57-TBEfk9_agH9FxAh-a3gE6ZDsL0o/view?usp=sharing) \| [model](https://drive.google.com/file/d/1XAFJkNg3HYv-X73vfycjytCTJP5Vn59k/view?usp=sharing) |
-| Noise2Recon (2sub)       | 16x          |                  2 |               12 | Noise2Recon w/ 1:1 balanced sampling                                                | [gdrive](https://drive.google.com/drive/folders/1czKZkyY5lin2T99U1yFRiSMuEGrXBCwq?usp=sharing) \| [cfg](https://drive.google.com/file/d/1hMXBcWDIGH7lXoz6ZB2nRaF9Q7-w8bSl/view?usp=sharing) \| [model](https://drive.google.com/file/d/1yrQCwsn-uC7p1QZgAPkb6fk7vwhilHJu/view?usp=sharing) |
-| Noise2Recon (3sub)       | 16x          |                  3 |               11 | Noise2Recon w/ 1:1 balanced sampling                                                | [gdrive](https://drive.google.com/drive/folders/1b4XffDIyfJLhiGWa23HKJKxTxYZOxxyu?usp=sharing) \| [cfg](https://drive.google.com/file/d/17OJNbke4AcXtF6pm6zDjhWkp2L4vyQk9/view?usp=sharing) \| [model](https://drive.google.com/file/d/1AM76A51aJ0yseE-vQerufGapW4arhGeG/view?usp=sharing) |
\ No newline at end of file
+| Name                     | Train Acc.   |   # Supervised (k) |   # Unsupervised | Description                                                                         | Download                                                                                                                                                                                                                                                                                                                                                                              |
+|:-------------------------|:-------------|-------------------:|-----------------:|:------------------------------------------------------------------------------------|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| Supervised (1sub)        | 16x          |                  1 |                0 | Supervised baseline w/ 1 supervised training scan                                   | [🤗](https://huggingface.co/arjundd/noise2recon-release/tree/main/mridata_knee_3dfse/16x/Supervised_1sub) \| [cfg](https://huggingface.co/arjundd/noise2recon-release/raw/main/mridata_knee_3dfse/16x/Supervised_1sub/config.yaml) \| [model](https://huggingface.co/arjundd/noise2recon-release/resolve/main/mridata_knee_3dfse/16x/Supervised_1sub/model.ckpt)                      |
+| Supervised (2sub)        | 16x          |                  2 |                0 | Supervised baseline                                                                 | [🤗](https://huggingface.co/arjundd/noise2recon-release/tree/main/mridata_knee_3dfse/16x/Supervised_2sub) \| [cfg](https://huggingface.co/arjundd/noise2recon-release/raw/main/mridata_knee_3dfse/16x/Supervised_2sub/config.yaml) \| [model](https://huggingface.co/arjundd/noise2recon-release/resolve/main/mridata_knee_3dfse/16x/Supervised_2sub/model.ckpt)                      |
+| Supervised (3sub)        | 16x          |                  3 |                0 | Supervised baseline                                                                 | [🤗](https://huggingface.co/arjundd/noise2recon-release/tree/main/mridata_knee_3dfse/16x/Supervised_3sub) \| [cfg](https://huggingface.co/arjundd/noise2recon-release/raw/main/mridata_knee_3dfse/16x/Supervised_3sub/config.yaml) \| [model](https://huggingface.co/arjundd/noise2recon-release/resolve/main/mridata_knee_3dfse/16x/Supervised_3sub/model.ckpt)                      |
+| Supervised (14sub)       | 16x          |                 14 |                0 | Supervised baseline                                                                 | [🤗](https://huggingface.co/arjundd/noise2recon-release/tree/main/mridata_knee_3dfse/16x/Supervised_14sub) \| [cfg](https://huggingface.co/arjundd/noise2recon-release/raw/main/mridata_knee_3dfse/16x/Supervised_14sub/config.yaml) \| [model](https://huggingface.co/arjundd/noise2recon-release/resolve/main/mridata_knee_3dfse/16x/Supervised_14sub/model.ckpt)                   |
+| Supervised+Aug (1sub)    | 16x          |                  1 |                0 | Supervised baseline with noise augmentations (p=0.2)                                | [🤗](https://huggingface.co/arjundd/noise2recon-release/tree/main/mridata_knee_3dfse/16x/Supervised+Aug_1sub) \| [cfg](https://huggingface.co/arjundd/noise2recon-release/raw/main/mridata_knee_3dfse/16x/Supervised+Aug_1sub/config.yaml) \| [model](https://huggingface.co/arjundd/noise2recon-release/resolve/main/mridata_knee_3dfse/16x/Supervised+Aug_1sub/model.ckpt)          |
+| Supervised+Aug (2sub)    | 16x          |                  2 |                0 | Supervised baseline with noise augmentations (p=0.2)                                | [🤗](https://huggingface.co/arjundd/noise2recon-release/tree/main/mridata_knee_3dfse/16x/Supervised+Aug_2sub) \| [cfg](https://huggingface.co/arjundd/noise2recon-release/raw/main/mridata_knee_3dfse/16x/Supervised+Aug_2sub/config.yaml) \| [model](https://huggingface.co/arjundd/noise2recon-release/resolve/main/mridata_knee_3dfse/16x/Supervised+Aug_2sub/model.ckpt)          |
+| Supervised+Aug (3sub)    | 16x          |                  3 |                0 | Supervised baseline with noise augmentations (p=0.2)                                | [🤗](https://huggingface.co/arjundd/noise2recon-release/tree/main/mridata_knee_3dfse/16x/Supervised+Aug_3sub) \| [cfg](https://huggingface.co/arjundd/noise2recon-release/raw/main/mridata_knee_3dfse/16x/Supervised+Aug_3sub/config.yaml) \| [model](https://huggingface.co/arjundd/noise2recon-release/resolve/main/mridata_knee_3dfse/16x/Supervised+Aug_3sub/model.ckpt)          |
+| Supervised-FT (1sub)     | 16x          |                  1 |                0 | Supervised baseline fine-tuned from a pre-trained denoiser                          | [🤗](https://huggingface.co/arjundd/noise2recon-release/tree/main/mridata_knee_3dfse/16x/Supervised-FT_1sub) \| [cfg](https://huggingface.co/arjundd/noise2recon-release/raw/main/mridata_knee_3dfse/16x/Supervised-FT_1sub/config.yaml) \| [model](https://huggingface.co/arjundd/noise2recon-release/resolve/main/mridata_knee_3dfse/16x/Supervised-FT_1sub/model.ckpt)             |
+| Supervised-FT (2sub)     | 16x          |                  2 |                0 | Supervised baseline fine-tuned from a pre-trained denoiser                          | [🤗](https://huggingface.co/arjundd/noise2recon-release/tree/main/mridata_knee_3dfse/16x/Supervised-FT_2sub) \| [cfg](https://huggingface.co/arjundd/noise2recon-release/raw/main/mridata_knee_3dfse/16x/Supervised-FT_2sub/config.yaml) \| [model](https://huggingface.co/arjundd/noise2recon-release/resolve/main/mridata_knee_3dfse/16x/Supervised-FT_2sub/model.ckpt)             |
+| Supervised-FT (3sub)     | 16x          |                  3 |                0 | Supervised baseline fine-tuned from a pre-trained denoiser                          | [🤗](https://huggingface.co/arjundd/noise2recon-release/tree/main/mridata_knee_3dfse/16x/Supervised-FT_3sub) \| [cfg](https://huggingface.co/arjundd/noise2recon-release/raw/main/mridata_knee_3dfse/16x/Supervised-FT_3sub/config.yaml) \| [model](https://huggingface.co/arjundd/noise2recon-release/resolve/main/mridata_knee_3dfse/16x/Supervised-FT_3sub/model.ckpt)             |
+| Supervised+Aug-FT (1sub) | 16x          |                  1 |                0 | Supervised baseline with noise augmentations fine-tuned from a pre-trained denoiser | [🤗](https://huggingface.co/arjundd/noise2recon-release/tree/main/mridata_knee_3dfse/16x/Supervised+Aug-FT_1sub) \| [cfg](https://huggingface.co/arjundd/noise2recon-release/raw/main/mridata_knee_3dfse/16x/Supervised+Aug-FT_1sub/config.yaml) \| [model](https://huggingface.co/arjundd/noise2recon-release/resolve/main/mridata_knee_3dfse/16x/Supervised+Aug-FT_1sub/model.ckpt) |
+| Supervised+Aug-FT (2sub) | 16x          |                  2 |                0 | Supervised baseline with noise augmentations fine-tuned from a pre-trained denoiser | [🤗](https://huggingface.co/arjundd/noise2recon-release/tree/main/mridata_knee_3dfse/16x/Supervised+Aug-FT_2sub) \| [cfg](https://huggingface.co/arjundd/noise2recon-release/raw/main/mridata_knee_3dfse/16x/Supervised+Aug-FT_2sub/config.yaml) \| [model](https://huggingface.co/arjundd/noise2recon-release/resolve/main/mridata_knee_3dfse/16x/Supervised+Aug-FT_2sub/model.ckpt) |
+| Supervised+Aug-FT (3sub) | 16x          |                  3 |                0 | Supervised baseline with noise augmentations fine-tuned from a pre-trained denoiser | [🤗](https://huggingface.co/arjundd/noise2recon-release/tree/main/mridata_knee_3dfse/16x/Supervised+Aug-FT_3sub) \| [cfg](https://huggingface.co/arjundd/noise2recon-release/raw/main/mridata_knee_3dfse/16x/Supervised+Aug-FT_3sub/config.yaml) \| [model](https://huggingface.co/arjundd/noise2recon-release/resolve/main/mridata_knee_3dfse/16x/Supervised+Aug-FT_3sub/model.ckpt) |
+| Noise2Recon (1sub)       | 16x          |                  1 |               13 | Noise2Recon w/ 1:1 balanced sampling                                                | [🤗](https://huggingface.co/arjundd/noise2recon-release/tree/main/mridata_knee_3dfse/16x/Noise2Recon_1sub) \| [cfg](https://huggingface.co/arjundd/noise2recon-release/raw/main/mridata_knee_3dfse/16x/Noise2Recon_1sub/config.yaml) \| [model](https://huggingface.co/arjundd/noise2recon-release/resolve/main/mridata_knee_3dfse/16x/Noise2Recon_1sub/model.ckpt)                   |
+| Noise2Recon (2sub)       | 16x          |                  2 |               12 | Noise2Recon w/ 1:1 balanced sampling                                                | [🤗](https://huggingface.co/arjundd/noise2recon-release/tree/main/mridata_knee_3dfse/16x/Noise2Recon_2sub) \| [cfg](https://huggingface.co/arjundd/noise2recon-release/raw/main/mridata_knee_3dfse/16x/Noise2Recon_2sub/config.yaml) \| [model](https://huggingface.co/arjundd/noise2recon-release/resolve/main/mridata_knee_3dfse/16x/Noise2Recon_2sub/model.ckpt)                   |
+| Noise2Recon (3sub)       | 16x          |                  3 |               11 | Noise2Recon w/ 1:1 balanced sampling                                                | [🤗](https://huggingface.co/arjundd/noise2recon-release/tree/main/mridata_knee_3dfse/16x/Noise2Recon_3sub) \| [cfg](https://huggingface.co/arjundd/noise2recon-release/raw/main/mridata_knee_3dfse/16x/Noise2Recon_3sub/config.yaml) \| [model](https://huggingface.co/arjundd/noise2recon-release/resolve/main/mridata_knee_3dfse/16x/Noise2Recon_3sub/model.ckpt)                   |
\ No newline at end of file
diff --git a/projects/vortex/MODEL_ZOO.md b/projects/vortex/MODEL_ZOO.md
index e07632b1..504b7647 100644
--- a/projects/vortex/MODEL_ZOO.md
+++ b/projects/vortex/MODEL_ZOO.md
@@ -1,7 +1,7 @@
 # VORTEX Models and Baselines
 This file contains the list of models, baselines, and experimental configs for benchmarking VORTEX on the mridata 3D FSE Knee dataset and the fastMRI Multi-coil Brain Mini dataset.
 
-Each experiment has links to 1) the Google Drive folder where details of the experiment are stored (`gdrive`), 2) the config file to reproduce the experiment (`cfg`), 3) the model file for loading pretrained weights (`model`).
+Each experiment has links to 1) the HuggingFace folder where details of the experiment are stored (🤗), 2) the config file to reproduce the experiment (`cfg`), 3) the model file for loading pretrained weights (`model`).
 
 Image augmentations correspond to the set of augmentations used in MRAugment (e.g. scaling, shearing, rotation, etc.), as these augmentations operate in the image domain. Motion and noise augmentations are applied in the frequency domain (k-space) as detailed in the text.
 
@@ -13,33 +13,32 @@ All models are trained with the complex-l1 loss with the Adam optimizer. Checkpo
 
 
 ## mridata - 3D FSE Knee Dataset
-
-| Name                       | Train Acc.   | Description                                                                                                                   | Download                                                                                                                                                                                                                                                                                   |
-|:---------------------------|:-------------|:------------------------------------------------------------------------------------------------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| Supervised                 | 16x          | Supervised baseline                                                                                                           | [gdrive](https://drive.google.com/drive/folders/1LGCdh88a9nqpZP5zSyKQS97rW0jjvnnE?usp=sharing) \| [cfg](https://drive.google.com/file/d/1w9WbObfugSvqRWz7XlXgBtTmS__T5nkj/view?usp=sharing) \| [model](https://drive.google.com/file/d/1LmCHFIQDzr2MbSibvU8Pj_iKPvGdJ2Dd/view?usp=sharing) |
-| MRAugment (Image)          | 16x          | MRAugment (based on parameters in [original text](https://arxiv.org/abs/2106.14947))                                          | [gdrive](https://drive.google.com/drive/folders/1yFj7rL5z0wzukck_b0NUOY54AT83ilPL?usp=sharing) \| [cfg](https://drive.google.com/file/d/1SjHN1ip7Q3I1oiYrZmPr-JG7FLqlmHBS/view?usp=sharing) \| [model](https://drive.google.com/file/d/1cGNctKbU9Y9fCIbhJOLUO-xmNPPOw22L/view?usp=sharing) |
-| Aug (Motion)               | 16x          | Supervised training with motion augmentations (p=0.2) and MRAugment scheduling                                                | [gdrive](https://drive.google.com/drive/folders/1wG952ygITGwr0Asd04OMr89gg6SFJu5J?usp=sharing) \| [cfg](https://drive.google.com/file/d/1BVrJQ84czbmXUZ3Dn8eMNVIA0ZO-ObZC/view?usp=sharing) \| [model](https://drive.google.com/file/d/1LRuzy3GuRpwJnsDXsMQmYzOj7-mZkuOw/view?usp=sharing) |
-| Aug (Noise)                | 16x          | Supervised training with noise augmentations (p=0.2) and MRAugment scheduling                                                 | [gdrive](https://drive.google.com/drive/folders/112IBEyaCpFg3fOQfWPO3Qpt65EnUP7tY?usp=sharing) \| [cfg](https://drive.google.com/file/d/1iCPlR8xDkWriPKPyZYXG2t7GOSL20k5M/view?usp=sharing) \| [model](https://drive.google.com/file/d/1b5FBhMw8CHSoOkYfCVaOuhQT2UU3K4GR/view?usp=sharing) |
-| Aug (Physics)              | 16x          | Supervised training with motion+noise augmentations (p=0.2) and MRAugment scheduling                                          | [gdrive](https://drive.google.com/drive/folders/10lpNKluD9hylNIZb58Fs_6eKhvdbh6sn?usp=sharing) \| [cfg](https://drive.google.com/file/d/1ll6QuEiX722rd88keq0BtPt-MntpOqqT/view?usp=sharing) \| [model](https://drive.google.com/file/d/1Igry2B2_H6xcWUchHm9pJGK1wrEYK1BW/view?usp=sharing) |
-| Aug (Image+Physics)        | 16x          | Supervised training with image+motion+noise augmentations and MRAugment scheduling                                            | [gdrive](https://drive.google.com/drive/folders/1iU24y6qjE2Y1DFrc-dgbTTOSd-KjctYr?usp=sharing) \| [cfg](https://drive.google.com/file/d/1mdRKuN4LfBLLiI342WBueroZUKEmIQz6/view?usp=sharing) \| [model](https://drive.google.com/file/d/1cdbrZxIYljcsTt7wKS89p8HmysDWgS5t/view?usp=sharing) |
-| SSDU                       | 16x          | [Self-supervised reconstruction via data undersampling](https://pubmed.ncbi.nlm.nih.gov/32614100/) with uniform undersampling | [gdrive](https://drive.google.com/drive/folders/14H0MCPR7OxmxD5hCckZZvaaxh4chtD-g?usp=sharing) \| [cfg](https://drive.google.com/file/d/1SUzQxFahnc_0HDmrV9hVJdQpjwtF2lCt/view?usp=sharing) \| [model](https://drive.google.com/file/d/1Iz3XFYf1kQWq3Qq-V01MbuMaHkuFum3i/view?usp=sharing) |
-| VORTEX (Image)             | 16x          | VORTEX with image augmentations for consistency training                                                                      | [gdrive](https://drive.google.com/drive/folders/1BrVIS9McWevQkrgnPqlqNEuEr08giPDI?usp=sharing) \| [cfg](https://drive.google.com/file/d/1evUFuIc02fB_Xnwl1tv2L0TMPCOnehfI/view?usp=sharing) \| [model](https://drive.google.com/file/d/1HWmq9VxWNDdR3otvzURvd5_moq7BTvRW/view?usp=sharing) |
-| VORTEX (Physics)           | 16x          | VORTEX with motion+noise augmentations for consistency training                                                               | [gdrive](https://drive.google.com/drive/folders/1U-QYKFGrMoDwIqthlhNgx9uJL3xu00di?usp=sharing) \| [cfg](https://drive.google.com/file/d/1KlV0aaUQRpuqbLQPQIeqE-L3Gcx3kIjq/view?usp=sharing) \| [model](https://drive.google.com/file/d/1Nor54dU-GIX-UIvqK5uEZqDNafn4E1W2/view?usp=sharing) |
-| VORTEX (Image+Physics)     | 16x          | VORTEX with image+motion+noise augmentations for consistency training                                                         | [gdrive](https://drive.google.com/drive/folders/12lLKDTn0MjWYIv98TM77nH9SfEjoSRn3?usp=sharing) \| [cfg](https://drive.google.com/file/d/1mtwsNZglb5ncY5_sZX5oUVgFGLF1cuj4/view?usp=sharing) \| [model](https://drive.google.com/file/d/1LgZdoXL8LVidwRxwk0p3vqfJ8nkVV_sd/view?usp=sharing) |
-| VORTEX (Motion-Curricula)  | 16x          | VORTEX with difficulty-based curricula for motion augmentations                                                               | [gdrive](https://drive.google.com/drive/folders/1OOQdSLCE1DhrvCA-A6Py98kXroaySbOV?usp=sharing) \| [cfg](https://drive.google.com/file/d/1on-AxdIzq8fkshPcjKdg_ap50SxFoROY/view?usp=sharing) \| [model](https://drive.google.com/file/d/1j_Ps_Ldbzy7euBWwP_Cx2uVQ9w6xYn2I/view?usp=sharing) |
-| VORTEX (Noise-Curricula)   | 16x          | VORTEX with difficulty-based curricula for noise augmentations                                                                | [gdrive](https://drive.google.com/drive/folders/1iXntwR7LAoGAbcyc0vWbXTOPIc8FqpVP?usp=sharing) \| [cfg](https://drive.google.com/file/d/1dq7NAIo2p6beIu5sRqbuGLFApuCK2QkL/view?usp=sharing) \| [model](https://drive.google.com/file/d/1GTUl-F1VYsR-jxRR2VXwGYqAzFEWwPB_/view?usp=sharing) |
-| VORTEX (Physics-Curricula) | 16x          | VORTEX with difficulty-based curricula for motion+noise augmentations                                                         | [gdrive](https://drive.google.com/drive/folders/1U1rvrwtv_7NKacwyokeKOQZDFTR3l86x?usp=sharing) \| [cfg](https://drive.google.com/file/d/1vmV33t7fD6LRG82fEIlnlyIlTEZCJGnj/view?usp=sharing) \| [model](https://drive.google.com/file/d/10vlCrXQEGmLrOEvR6GJ6XcvyNyzGZJat/view?usp=sharing) |
+| Name                       | Train Acc.   | Description                                                                                                                   | Download                                                                                                                                                                                                                                                                                                                                                         |
+|:---------------------------|:-------------|:------------------------------------------------------------------------------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| Supervised                 | 16x          | Supervised baseline                                                                                                           | [🤗](https://huggingface.co/arjundd/vortex-release/tree/main/mridata_knee_3dfse/Supervised) \| [cfg](https://huggingface.co/arjundd/vortex-release/raw/main/mridata_knee_3dfse/Supervised/config.yaml) \| [model](https://huggingface.co/arjundd/vortex-release/resolve/main/mridata_knee_3dfse/Supervised/model.ckpt)                                           |
+| MRAugment (Image)          | 16x          | MRAugment (based on parameters in [original text](https://arxiv.org/abs/2106.14947))                                          | [🤗](https://huggingface.co/arjundd/vortex-release/tree/main/mridata_knee_3dfse/MRAugment_Image) \| [cfg](https://huggingface.co/arjundd/vortex-release/raw/main/mridata_knee_3dfse/MRAugment_Image/config.yaml) \| [model](https://huggingface.co/arjundd/vortex-release/resolve/main/mridata_knee_3dfse/MRAugment_Image/model.ckpt)                            |
+| Aug (Motion)               | 16x          | Supervised training with motion augmentations (p=0.2) and MRAugment scheduling                                                | [🤗](https://huggingface.co/arjundd/vortex-release/tree/main/mridata_knee_3dfse/Aug_Motion) \| [cfg](https://huggingface.co/arjundd/vortex-release/raw/main/mridata_knee_3dfse/Aug_Motion/config.yaml) \| [model](https://huggingface.co/arjundd/vortex-release/resolve/main/mridata_knee_3dfse/Aug_Motion/model.ckpt)                                           |
+| Aug (Noise)                | 16x          | Supervised training with noise augmentations (p=0.2) and MRAugment scheduling                                                 | [🤗](https://huggingface.co/arjundd/vortex-release/tree/main/mridata_knee_3dfse/Aug_Noise) \| [cfg](https://huggingface.co/arjundd/vortex-release/raw/main/mridata_knee_3dfse/Aug_Noise/config.yaml) \| [model](https://huggingface.co/arjundd/vortex-release/resolve/main/mridata_knee_3dfse/Aug_Noise/model.ckpt)                                              |
+| Aug (Physics)              | 16x          | Supervised training with motion+noise augmentations (p=0.2) and MRAugment scheduling                                          | [🤗](https://huggingface.co/arjundd/vortex-release/tree/main/mridata_knee_3dfse/Aug_Physics) \| [cfg](https://huggingface.co/arjundd/vortex-release/raw/main/mridata_knee_3dfse/Aug_Physics/config.yaml) \| [model](https://huggingface.co/arjundd/vortex-release/resolve/main/mridata_knee_3dfse/Aug_Physics/model.ckpt)                                        |
+| Aug (Image+Physics)        | 16x          | Supervised training with image+motion+noise augmentations and MRAugment scheduling                                            | [🤗](https://huggingface.co/arjundd/vortex-release/tree/main/mridata_knee_3dfse/Aug_Image+Physics) \| [cfg](https://huggingface.co/arjundd/vortex-release/raw/main/mridata_knee_3dfse/Aug_Image+Physics/config.yaml) \| [model](https://huggingface.co/arjundd/vortex-release/resolve/main/mridata_knee_3dfse/Aug_Image+Physics/model.ckpt)                      |
+| SSDU                       | 16x          | [Self-supervised reconstruction via data undersampling](https://pubmed.ncbi.nlm.nih.gov/32614100/) with uniform undersampling | [🤗](https://huggingface.co/arjundd/vortex-release/tree/main/mridata_knee_3dfse/SSDU) \| [cfg](https://huggingface.co/arjundd/vortex-release/raw/main/mridata_knee_3dfse/SSDU/config.yaml) \| [model](https://huggingface.co/arjundd/vortex-release/resolve/main/mridata_knee_3dfse/SSDU/model.ckpt)                                                             |
+| VORTEX (Image)             | 16x          | VORTEX with image augmentations for consistency training                                                                      | [🤗](https://huggingface.co/arjundd/vortex-release/tree/main/mridata_knee_3dfse/VORTEX_Image) \| [cfg](https://huggingface.co/arjundd/vortex-release/raw/main/mridata_knee_3dfse/VORTEX_Image/config.yaml) \| [model](https://huggingface.co/arjundd/vortex-release/resolve/main/mridata_knee_3dfse/VORTEX_Image/model.ckpt)                                     |
+| VORTEX (Physics)           | 16x          | VORTEX with motion+noise augmentations for consistency training                                                               | [🤗](https://huggingface.co/arjundd/vortex-release/tree/main/mridata_knee_3dfse/VORTEX_Physics) \| [cfg](https://huggingface.co/arjundd/vortex-release/raw/main/mridata_knee_3dfse/VORTEX_Physics/config.yaml) \| [model](https://huggingface.co/arjundd/vortex-release/resolve/main/mridata_knee_3dfse/VORTEX_Physics/model.ckpt)                               |
+| VORTEX (Image+Physics)     | 16x          | VORTEX with image+motion+noise augmentations for consistency training                                                         | [🤗](https://huggingface.co/arjundd/vortex-release/tree/main/mridata_knee_3dfse/VORTEX_Image+Physics) \| [cfg](https://huggingface.co/arjundd/vortex-release/raw/main/mridata_knee_3dfse/VORTEX_Image+Physics/config.yaml) \| [model](https://huggingface.co/arjundd/vortex-release/resolve/main/mridata_knee_3dfse/VORTEX_Image+Physics/model.ckpt)             |
+| VORTEX (Curricula_Motion)  | 16x          | VORTEX with difficulty-based curricula for motion augmentations                                                               | [🤗](https://huggingface.co/arjundd/vortex-release/tree/main/mridata_knee_3dfse/VORTEX_Curricula_Motion) \| [cfg](https://huggingface.co/arjundd/vortex-release/raw/main/mridata_knee_3dfse/VORTEX_Curricula_Motion/config.yaml) \| [model](https://huggingface.co/arjundd/vortex-release/resolve/main/mridata_knee_3dfse/VORTEX_Curricula_Motion/model.ckpt)    |
+| VORTEX (Curricula_Noise)   | 16x          | VORTEX with difficulty-based curricula for noise augmentations                                                                | [🤗](https://huggingface.co/arjundd/vortex-release/tree/main/mridata_knee_3dfse/VORTEX_Curricula_Noise) \| [cfg](https://huggingface.co/arjundd/vortex-release/raw/main/mridata_knee_3dfse/VORTEX_Curricula_Noise/config.yaml) \| [model](https://huggingface.co/arjundd/vortex-release/resolve/main/mridata_knee_3dfse/VORTEX_Curricula_Noise/model.ckpt)       |
+| VORTEX (Curricula_Physics) | 16x          | VORTEX with difficulty-based curricula for motion+noise augmentations                                                         | [🤗](https://huggingface.co/arjundd/vortex-release/tree/main/mridata_knee_3dfse/VORTEX_Curricula_Physics) \| [cfg](https://huggingface.co/arjundd/vortex-release/raw/main/mridata_knee_3dfse/VORTEX_Curricula_Physics/config.yaml) \| [model](https://huggingface.co/arjundd/vortex-release/resolve/main/mridata_knee_3dfse/VORTEX_Curricula_Physics/model.ckpt) |
 
 ## fastMRI Multi-coil Brain Mini Dataset
-| Name                                | Train Acc.   | Description                                                                                                                   | Download                                                                                                                                                                                                                                                                                   |
-|:------------------------------------|:-------------|:------------------------------------------------------------------------------------------------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| Supervised                          | 8x           | Supervised baseline                                                                                                           | [gdrive](https://drive.google.com/drive/folders/18vp9KZRFagxJ6LKpSJrZ0H_1NUNx_i3z?usp=sharing) \| [cfg](https://drive.google.com/file/d/1TT1YZmpl70ICNXSoaxBE5yE5qcKNJqhZ/view?usp=sharing) \| [model](https://drive.google.com/file/d/18YUHpCmfQqVtVG8qN8eWo2lhecwyOhAU/view?usp=sharing) |
-| MRAugment (Image)                   | 8x           | MRAugment (based on parameters in [original text](https://arxiv.org/abs/2106.14947))                                          | [gdrive](https://drive.google.com/drive/folders/1jnf7632UIXqc0jbnsQoJG03XpLdavqno?usp=sharing) \| [cfg](https://drive.google.com/file/d/1Qol3G_CVP_mDBrPPNNArXxMefJzGb0uc/view?usp=sharing) \| [model](https://drive.google.com/file/d/1Pad1j2CQ6dg6WWvPD3S7wR8IPZlZZUfA/view?usp=sharing) |
-| Aug (Motion)                        | 8x           | Supervised training with motion augmentations (p=0.2) and MRAugment scheduling                                                | [gdrive](https://drive.google.com/drive/folders/1f-37eJQetL-1gtAOQiqUMekzptvtVWHE?usp=sharing) \| [cfg](https://drive.google.com/file/d/1t3CT4W1K1WFwGaOG29zuu2i0CoA6khIB/view?usp=sharing) \| [model](https://drive.google.com/file/d/1JCmtkhS7M_HrhMWdc6fZTDeESI1losRQ/view?usp=sharing) |
-| Aug (Motion, super-heavy)           | 8x           | Aug (Motion) with super heavy motion augmentations - R(α) = [0.5, 0.7]                                                        | [gdrive](https://drive.google.com/drive/folders/16FHKM0DVhzT3xORtQWoyqD9IzTkVTWhV?usp=sharing) \| [cfg](https://drive.google.com/file/d/1C-w8wyNtJZfoLKQVLNJvZCEbYU6_0YAL/view?usp=sharing) \| [model](https://drive.google.com/file/d/19W9aEoFlzurmKLR3O-r0Yk_hoGpnb1P2/view?usp=sharing) |
-| SSDU                                | 8x           | [Self-supervised reconstruction via data undersampling](https://pubmed.ncbi.nlm.nih.gov/32614100/) with uniform undersampling | [gdrive](https://drive.google.com/drive/folders/1v2oSpMOPrlrOyH9iSBHO-7eUtf1anSzf?usp=sharing) \| [cfg](https://drive.google.com/file/d/14bl8z8FhT5KJRepsxNXftI1waZIUggdT/view?usp=sharing) \| [model](https://drive.google.com/file/d/1hxN-L5LDUJNDurf-IJMH_a-0E0dnhWMR/view?usp=sharing) |
-| Noise2Recon (super-heavy)           | 8x           | [Noise2Recon](https://arxiv.org/abs/2110.00075) with super-heavy noise augmentations - R(σ) = [0.5, 0.7]                      | [gdrive](https://drive.google.com/drive/folders/1VFzWBOodzveNZwnZIOqEJ7GMLSTEVSlX?usp=sharing) \| [cfg](https://drive.google.com/file/d/1VBseRYeLqYaFSGwbRKCnFNqBKvI-1pRB/view?usp=sharing) \| [model](https://drive.google.com/file/d/1JThgWglhX8GqAte86lpeZj7lX2wv54mB/view?usp=sharing) |
-| VORTEX (Motion)                     | 8x           | VORTEX with motion augmentations for consistency training                                                                     | [gdrive](https://drive.google.com/drive/folders/17mR2M0Ig8QlQ73O-8icgQeIWc_YDUxzD?usp=sharing) \| [cfg](https://drive.google.com/file/d/1FP50C-LHfAhdjFQdTHl4Z_e_aaBfRqhH/view?usp=sharing) \| [model](https://drive.google.com/file/d/1UXW_JLcugDR8vxDHPkwZ6unNBwcYAcaP/view?usp=sharing) |
-| VORTEX (Motion, super-heavy)        | 8x           | VORTEX (Motion) with super heavy motion augmentations - R(α) = [0.5, 0.7]                                                     | [gdrive](https://drive.google.com/drive/folders/1ZnNfHF3zy-UFOWGtfUIG4FAMe9nRQXCU?usp=sharing) \| [cfg](https://drive.google.com/file/d/11QorwixMYRZ7UYsK_W4fvwaaKzz2HLoE/view?usp=sharing) \| [model](https://drive.google.com/file/d/1BnYaQbVXP5noCVEYMzcfZEQhk0MZKFv_/view?usp=sharing) |
-| VORTEX (Image+Motion, super-heavy)  | 8x           | VORTEX (Image+Motion) with super heavy motion augmentations - R(α) = [0.5, 0.7]                                               | [gdrive](https://drive.google.com/drive/folders/1j2IFSX3jRh6i4fZNe0yHKScYmLYc2rY2?usp=sharing) \| [cfg](https://drive.google.com/file/d/19FeJs95FWXZZ3aVhYQcIXzI4gM_yyyjC/view?usp=sharing) \| [model](https://drive.google.com/file/d/1PBXzxYE9t7JaMxhvpSReMC63s17TyoXc/view?usp=sharing) |
-| VORTEX (Image+Physics, super-heavy) | 8x           | VORTEX (Image+Physics) with super heavy motion and noise augmentations - R(α) = R(σ) = [0.5, 0.7]                             | [gdrive](https://drive.google.com/drive/folders/1FMn9v7X5Tcw6P36J_qag-sikgjD0v9c2?usp=sharing) \| [cfg](https://drive.google.com/file/d/1VkOsjD07cOmdYJYK2pWJq3fW4d1bCo6G/view?usp=sharing) \| [model](https://drive.google.com/file/d/1G-_ckXo34Dw-nzrqIeJ803HDW1x04ZJS/view?usp=sharing) |
\ No newline at end of file
+| Name                                | Train Acc.   | Description                                                                                                                   | Download                                                                                                                                                                                                                                                                                                                                                                                    |
+|:------------------------------------|:-------------|:------------------------------------------------------------------------------------------------------------------------------|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| Supervised                          | 8x           | Supervised baseline                                                                                                           | [🤗](https://huggingface.co/arjundd/vortex-release/tree/main/fastmri_brain_mini/Supervised) \| [cfg](https://huggingface.co/arjundd/vortex-release/raw/main/fastmri_brain_mini/Supervised/config.yaml) \| [model](https://huggingface.co/arjundd/vortex-release/resolve/main/fastmri_brain_mini/Supervised/model.ckpt)                                                                      |
+| MRAugment (Image)                   | 8x           | MRAugment (based on parameters in [original text](https://arxiv.org/abs/2106.14947))                                          | [🤗](https://huggingface.co/arjundd/vortex-release/tree/main/fastmri_brain_mini/MRAugment_Image) \| [cfg](https://huggingface.co/arjundd/vortex-release/raw/main/fastmri_brain_mini/MRAugment_Image/config.yaml) \| [model](https://huggingface.co/arjundd/vortex-release/resolve/main/fastmri_brain_mini/MRAugment_Image/model.ckpt)                                                       |
+| Aug (Motion)                        | 8x           | Supervised training with motion augmentations (p=0.2) and MRAugment scheduling                                                | [🤗](https://huggingface.co/arjundd/vortex-release/tree/main/fastmri_brain_mini/Aug_Motion) \| [cfg](https://huggingface.co/arjundd/vortex-release/raw/main/fastmri_brain_mini/Aug_Motion/config.yaml) \| [model](https://huggingface.co/arjundd/vortex-release/resolve/main/fastmri_brain_mini/Aug_Motion/model.ckpt)                                                                      |
+| Aug (Motion, super-heavy)           | 8x           | Aug (Motion) with super heavy motion augmentations - R(α) = [0.5, 0.7]                                                        | [🤗](https://huggingface.co/arjundd/vortex-release/tree/main/fastmri_brain_mini/Aug_Motion__super-heavy) \| [cfg](https://huggingface.co/arjundd/vortex-release/raw/main/fastmri_brain_mini/Aug_Motion__super-heavy/config.yaml) \| [model](https://huggingface.co/arjundd/vortex-release/resolve/main/fastmri_brain_mini/Aug_Motion__super-heavy/model.ckpt)                               |
+| SSDU                                | 8x           | [Self-supervised reconstruction via data undersampling](https://pubmed.ncbi.nlm.nih.gov/32614100/) with uniform undersampling | [🤗](https://huggingface.co/arjundd/vortex-release/tree/main/fastmri_brain_mini/SSDU) \| [cfg](https://huggingface.co/arjundd/vortex-release/raw/main/fastmri_brain_mini/SSDU/config.yaml) \| [model](https://huggingface.co/arjundd/vortex-release/resolve/main/fastmri_brain_mini/SSDU/model.ckpt)                                                                                        |
+| Noise2Recon (super-heavy)           | 8x           | [Noise2Recon](https://arxiv.org/abs/2110.00075) with super-heavy noise augmentations - R(σ) = [0.5, 0.7]                      | [🤗](https://huggingface.co/arjundd/vortex-release/tree/main/fastmri_brain_mini/Noise2Recon_super-heavy) \| [cfg](https://huggingface.co/arjundd/vortex-release/raw/main/fastmri_brain_mini/Noise2Recon_super-heavy/config.yaml) \| [model](https://huggingface.co/arjundd/vortex-release/resolve/main/fastmri_brain_mini/Noise2Recon_super-heavy/model.ckpt)                               |
+| VORTEX (Motion)                     | 8x           | VORTEX with motion augmentations for consistency training                                                                     | [🤗](https://huggingface.co/arjundd/vortex-release/tree/main/fastmri_brain_mini/VORTEX_Motion) \| [cfg](https://huggingface.co/arjundd/vortex-release/raw/main/fastmri_brain_mini/VORTEX_Motion/config.yaml) \| [model](https://huggingface.co/arjundd/vortex-release/resolve/main/fastmri_brain_mini/VORTEX_Motion/model.ckpt)                                                             |
+| VORTEX (Motion, super-heavy)        | 8x           | VORTEX (Motion) with super heavy motion augmentations - R(α) = [0.5, 0.7]                                                     | [🤗](https://huggingface.co/arjundd/vortex-release/tree/main/fastmri_brain_mini/VORTEX_Motion__super-heavy) \| [cfg](https://huggingface.co/arjundd/vortex-release/raw/main/fastmri_brain_mini/VORTEX_Motion__super-heavy/config.yaml) \| [model](https://huggingface.co/arjundd/vortex-release/resolve/main/fastmri_brain_mini/VORTEX_Motion__super-heavy/model.ckpt)                      |
+| VORTEX (Image+Motion, super-heavy)  | 8x           | VORTEX (Image+Motion) with super heavy motion augmentations - R(α) = [0.5, 0.7]                                               | [🤗](https://huggingface.co/arjundd/vortex-release/tree/main/fastmri_brain_mini/VORTEX_Image+Motion__super-heavy) \| [cfg](https://huggingface.co/arjundd/vortex-release/raw/main/fastmri_brain_mini/VORTEX_Image+Motion__super-heavy/config.yaml) \| [model](https://huggingface.co/arjundd/vortex-release/resolve/main/fastmri_brain_mini/VORTEX_Image+Motion__super-heavy/model.ckpt)    |
+| VORTEX (Image+Physics, super-heavy) | 8x           | VORTEX (Image+Physics) with super heavy motion and noise augmentations - R(α) = R(σ) = [0.5, 0.7]                             | [🤗](https://huggingface.co/arjundd/vortex-release/tree/main/fastmri_brain_mini/VORTEX_Image+Physics__super-heavy) \| [cfg](https://huggingface.co/arjundd/vortex-release/raw/main/fastmri_brain_mini/VORTEX_Image+Physics__super-heavy/config.yaml) \| [model](https://huggingface.co/arjundd/vortex-release/resolve/main/fastmri_brain_mini/VORTEX_Image+Physics__super-heavy/model.ckpt) |
\ No newline at end of file
diff --git a/setup.py b/setup.py
index 5fda6d1d..349871ac 100644
--- a/setup.py
+++ b/setup.py
@@ -69,6 +69,55 @@ def get_version():
 URL = "https://github.com/ad12/meddlr"
 REQUIRES_PYTHON = ">=3.6"
 
+REQUIRED = [
+    "pyxb",  # need to install before ismrmrd
+    "h5py",
+    "matplotlib",
+    "numpy",
+    "tensorboard",
+    "fvcore",
+    "mridata",
+    "scikit-image>=0.18.2",
+    "sigpy>=0.1.17",
+    "ismrmrd",
+    "pandas",
+    "silx",
+    "tqdm",
+    "omegaconf",
+    "torchmetrics>=0.5.1",
+    "iopath",
+    "packaging",
+]
+
+EXTRAS = {
+    "dev": [
+        # Formatting
+        "coverage",
+        "flake8",
+        "isort",
+        "black==21.10b0",
+        "flake8-bugbear",
+        "flake8-comprehensions",
+        "pre-commit>=2.9.3",
+        # Testing
+        "medpy",
+        "pooch",
+        "gdown",
+        # Documentation
+        "sphinx",
+        "sphinxcontrib-bibtex",
+        "sphinx-rtd-theme",
+        "m2r2",
+    ],
+    "benchmarking": ["medpy"],
+    "deployment": ["gdown", "requests", "iocursor"],
+    "docs": ["sphinx", "sphinxcontrib.bibtex", "sphinx-rtd-theme", "m2r2"],
+}
+
+base_extras = [EXTRAS[k] for k in EXTRAS.keys() if k not in ["dev", "docs"]]
+EXTRAS["all"] = list(set(sum(base_extras, [])))
+EXTRAS["alldev"] = list(set(sum(EXTRAS.values(), [])))
+
 with open("README.md", "r", encoding="utf-8") as fh:
     long_description = fh.read()
 
@@ -83,49 +132,8 @@ def get_version():
     long_description_content_type="text/markdown",
     packages=find_packages(exclude=("configs", "tests", "*.tests", "*.tests.*", "tests.*")),
     python_requires=REQUIRES_PYTHON,
-    install_requires=[
-        "pyxb",  # need to install before ismrmrd
-        "h5py",
-        "matplotlib",
-        "numpy",
-        "tensorboard",
-        "fvcore",
-        "mridata",
-        "scikit-image>=0.18.2",
-        "sigpy>=0.1.17",
-        "ismrmrd",
-        "pandas",
-        "silx",
-        "tqdm",
-        "omegaconf",
-        "torchmetrics>=0.5.1",
-        "iopath",
-        "packaging",
-    ],
-    extras_require={
-        "dev": [
-            # Formatting
-            "coverage",
-            "flake8",
-            "isort",
-            "black==21.10b0",
-            "flake8-bugbear",
-            "flake8-comprehensions",
-            "pre-commit>=2.9.3",
-            # Testing
-            "medpy",
-            "pooch",
-            "gdown",
-            # Documentation
-            "sphinx",
-            "sphinxcontrib-bibtex",
-            "sphinx-rtd-theme",
-            "m2r2",
-        ],
-        "benchmarking": ["medpy"],
-        "deployment": ["gdown"],
-        "docs": ["sphinx", "sphinxcontrib.bibtex", "sphinx-rtd-theme", "m2r2"],
-    },
+    install_requires=REQUIRED,
+    extras_require=EXTRAS,
     classifiers=[
         # Trove classifiers
         # Full list: https://pypi.python.org/pypi?%3Aaction=list_classifiers


Test patch:
diff --git a/tests/engine/test_model_zoo.py b/tests/engine/test_model_zoo.py
index 0f8e3d14..09ceaa33 100644
--- a/tests/engine/test_model_zoo.py
+++ b/tests/engine/test_model_zoo.py
@@ -88,7 +88,8 @@ def test_load_weights_find_device():
 
 
 @pytest.mark.skipif(not util.TEST_MODEL_ZOOS, reason="Model zoo testing not activated")
-@pytest.mark.parametrize("project", ["noise2recon", "vortex"])
+@util.temp_env
+@pytest.mark.parametrize("project", ["vortex"])
 def test_model_zoo_configs_for_projects(project):
     """
     Test that all models in the zoo can be built with the appropriate config
@@ -100,21 +101,25 @@ def test_model_zoo_configs_for_projects(project):
     """
     model_zoo_file = REPO_DIR / "projects" / project / "MODEL_ZOO.md"
     models = _parse_model_zoo(model_zoo_file)
+
+    # Temporarily set cache dir to tmpdir
+    os.environ["MEDDLR_CACHE_DIR"] = str(
+        util.TEMP_CACHE_DIR / "test_model_zoo_configs_for_projects" / project
+    )
+
     for name, model_info in models.items():
         # Skip models that have failed dependencies (for now).
         # TODO: Auto-configure github actions to run this test with different
         # combinations of dependencies.
         path_manager = env.get_path_manager()
-        cfg_file = path_manager.get_local_path(f"download://{model_info['cfg_url']}", force=True)
+        cfg_file = path_manager.get_local_path(model_info["cfg_url"], force=True)
         failed_deps = config_util.check_dependencies(cfg_file, return_failed_deps=True)
         if len(failed_deps) > 0:
             continue
 
         try:
             model = get_model_from_zoo(
-                f"download://{model_info['cfg_url']}",
-                f"download://{model_info['weights_url']}",
-                force_download=True,
+                model_info["cfg_url"], model_info["weights_url"], force_download=True
             )
             assert isinstance(model, nn.Module)
         except Exception as e:
diff --git a/tests/evaluation/test_testing.py b/tests/evaluation/test_testing.py
index 04ea35e2..8b1ef6fe 100644
--- a/tests/evaluation/test_testing.py
+++ b/tests/evaluation/test_testing.py
@@ -54,7 +54,7 @@ def test_find_weights_basic(func_kwargs, expected_file):
     pm = env.get_path_manager()
     exp_dir = pm.get_local_path(
         "gdrive://https://drive.google.com/drive/folders/1XS6OfRSWYx_hX6AxefNuqbmSmCH0WtNp?usp=sharing",  # noqa: E501
-        cache_file=util.TEMP_CACHE_DIR / "basic-cpu",
+        cache=util.TEMP_CACHE_DIR / "basic-cpu",
     )
     exp_dir = Path(exp_dir)
     assert os.path.isdir(exp_dir)
diff --git a/tests/util.py b/tests/util.py
index 0c36d1a0..293d91a9 100644
--- a/tests/util.py
+++ b/tests/util.py
@@ -1,4 +1,5 @@
 """Utilities for testing."""
+import inspect
 import os
 import pathlib
 import re
@@ -27,7 +28,17 @@ def wrapper(self, *args, **kwargs):
         os.environ.update(old_env)
         return out
 
-    return wrapper
+    @wraps(func)
+    def wrapper_func(*args, **kwargs):
+        old_env = dict(os.environ)
+
+        out = func(*args, **kwargs)
+
+        os.environ.clear()
+        os.environ.update(old_env)
+        return out
+
+    return wrapper if "self" in inspect.signature(func).parameters else wrapper_func
 
 
 def get_cfg_path(cfg_filename):
diff --git a/tests/utils/test_path.py b/tests/utils/test_path.py
index 95b67116..0ad5d221 100644
--- a/tests/utils/test_path.py
+++ b/tests/utils/test_path.py
@@ -1,10 +1,13 @@
 import os
 
+import yaml
+
 from meddlr.utils import env
 from meddlr.utils.path import (
     ForceDownloadHandler,
     GithubHandler,
     GoogleDriveHandler,
+    URLHandler,
     download_github_repository,
 )
 
@@ -40,10 +43,10 @@ def test_gdrive_handler(tmpdir):
 
     handler = GoogleDriveHandler(cache_dir=tmpdir)
 
-    cache_file = download_dir / "sample-download.zip"
+    cache = download_dir / "sample-download.zip"
     path = handler._get_local_path(
         f"gdrive://https://drive.google.com/file/d/{gdrive_id}/view?usp=sharing",
-        cache_file=cache_file,
+        cache=cache,
         force=True,
     )
     assert os.path.exists(path)
@@ -51,13 +54,13 @@ def test_gdrive_handler(tmpdir):
 
     path = handler._get_local_path(
         f"gdrive://https://drive.google.com/file/d/{gdrive_id}/view?usp=sharing",
-        cache_file=cache_file,
+        cache=cache,
     )
     mtime2 = os.path.getmtime(path)
     assert mtime2 == mtime
 
-    cache_file = download_dir / "sample-download2.zip"
-    path = handler._get_local_path(f"gdrive://{gdrive_id}", cache_file=cache_file)
+    cache = download_dir / "sample-download2.zip"
+    path = handler._get_local_path(f"gdrive://{gdrive_id}", cache=cache)
     assert os.path.exists(path)
 
     # Folder
@@ -70,31 +73,67 @@ def test_gdrive_handler(tmpdir):
     mtime2 = os.path.getmtime(path)
     assert mtime2 == mtime
 
-    cache_file = download_dir / "sample-dir"
-    path = handler._get_local_path(folder_url, cache_file=cache_file)
-    assert os.path.isdir(cache_file)
+    cache = download_dir / "sample-dir"
+    path = handler._get_local_path(folder_url, cache=cache)
+    assert os.path.isdir(cache)
 
 
 def test_force_download(tmpdir):
     download_dir = tmpdir.mkdir("download")
     gdrive_id = "1fWgHNUljPrJj-97YPbbrqugSPnS2zXnx"
-    cache_file = download_dir / "sample-download.zip"
+    cache = download_dir / "sample-download.zip"
 
     path_manager = env.get_path_manager("meddlr_test")
     path_manager.register_handler(GoogleDriveHandler())
+    path_manager.register_handler(URLHandler(path_manager))
     handler = ForceDownloadHandler(path_manager)
 
     path = handler._get_local_path(
         f"force-download://https://drive.google.com/file/d/{gdrive_id}/view?usp=sharing",
-        cache_file=cache_file,
+        cache=cache,
     )
     assert os.path.exists(path)
     mtime = os.path.getmtime(path)
 
     path = handler._get_local_path(
         f"force-download://https://drive.google.com/file/d/{gdrive_id}/view?usp=sharing",
-        cache_file=cache_file,
+        cache=cache,
     )
     mtime2 = os.path.getmtime(path)
 
     assert mtime2 != mtime
+
+
+def test_url_local_path(tmpdir):
+    download_dir = tmpdir.mkdir("download")
+    url = "https://huggingface.co/arjundd/vortex-release/raw/main/fastmri_brain_mini/Aug_Motion/config.yaml"  # noqa: E501
+
+    path_manager = env.get_path_manager("meddlr_test")
+    handler = URLHandler(path_manager, cache_dir=tmpdir)
+
+    cache = download_dir / "config.yaml"
+    path = handler._get_local_path(url, cache=cache, force=True)
+    assert os.path.exists(path)
+    mtime = os.path.getmtime(path)
+
+    path = handler._get_local_path(url, cache=cache)
+    mtime2 = os.path.getmtime(path)
+    assert mtime2 == mtime
+
+
+def test_url_open(tmpdir):
+    download_dir = tmpdir.mkdir("download")
+    url = "https://huggingface.co/arjundd/vortex-release/raw/main/fastmri_brain_mini/Aug_Motion/config.yaml"  # noqa: E501
+
+    path_manager = env.get_path_manager("meddlr_test")
+    handler = URLHandler(path_manager, cache_dir=tmpdir)
+
+    cache = download_dir / "config.yaml"
+    path = handler._get_local_path(url, cache=cache, force=True)
+    with open(path) as f:
+        expected = yaml.safe_load(f)
+
+    with handler._open(url) as f:
+        out = yaml.safe_load(f)
+
+    assert out == expected