diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml
index d40fb9bb..f36bf6d1 100644
--- a/.github/workflows/build.yaml
+++ b/.github/workflows/build.yaml
@@ -174,7 +174,7 @@ jobs:
path: bioimageio_cache
key: ${{matrix.run-expensive-tests && needs.populate-cache.outputs.cache-key || needs.populate-cache.outputs.cache-key-light}}
- name: pytest
- run: pytest --disable-pytest-warnings
+ run: pytest --cov bioimageio --cov-report xml --cov-append --capture no --disable-pytest-warnings
env:
BIOIMAGEIO_CACHE_PATH: bioimageio_cache
RUN_EXPENSIVE_TESTS: ${{ matrix.run-expensive-tests && 'true' || 'false' }}
diff --git a/bioimageio/core/__init__.py b/bioimageio/core/__init__.py
index c7554372..d37be4d4 100644
--- a/bioimageio/core/__init__.py
+++ b/bioimageio/core/__init__.py
@@ -3,6 +3,7 @@
"""
from bioimageio.spec import (
+ ValidationSummary,
build_description,
dump_description,
load_dataset_description,
@@ -112,4 +113,5 @@
"test_model",
"test_resource",
"validate_format",
+ "ValidationSummary",
]
diff --git a/bioimageio/core/backends/keras_backend.py b/bioimageio/core/backends/keras_backend.py
index 1c10da7d..7b661f23 100644
--- a/bioimageio/core/backends/keras_backend.py
+++ b/bioimageio/core/backends/keras_backend.py
@@ -4,17 +4,18 @@
from loguru import logger
from numpy.typing import NDArray
-from bioimageio.spec._internal.io import download
-from bioimageio.spec._internal.type_guards import is_list, is_tuple
from bioimageio.spec.model import v0_4, v0_5
from bioimageio.spec.model.v0_5 import Version
+from bioimageio.spec.utils import download
from .._settings import settings
from ..digest_spec import get_axes_infos
+from ..utils._type_guards import is_list, is_tuple
from ._model_adapter import ModelAdapter
os.environ["KERAS_BACKEND"] = settings.keras_backend
+
# by default, we use the keras integrated with tensorflow
# TODO: check if we should prefer keras
try:
diff --git a/bioimageio/core/backends/onnx_backend.py b/bioimageio/core/backends/onnx_backend.py
index d5b89152..c81dc7d5 100644
--- a/bioimageio/core/backends/onnx_backend.py
+++ b/bioimageio/core/backends/onnx_backend.py
@@ -5,11 +5,11 @@
import onnxruntime as rt # pyright: ignore[reportMissingTypeStubs]
from numpy.typing import NDArray
-from bioimageio.spec._internal.type_guards import is_list, is_tuple
from bioimageio.spec.model import v0_4, v0_5
from bioimageio.spec.utils import download
from ..model_adapters import ModelAdapter
+from ..utils._type_guards import is_list, is_tuple
class ONNXModelAdapter(ModelAdapter):
diff --git a/bioimageio/core/backends/pytorch_backend.py b/bioimageio/core/backends/pytorch_backend.py
index af1ea85d..c0c11717 100644
--- a/bioimageio/core/backends/pytorch_backend.py
+++ b/bioimageio/core/backends/pytorch_backend.py
@@ -11,12 +11,13 @@
from torch import nn
from typing_extensions import assert_never
-from bioimageio.spec._internal.type_guards import is_list, is_ndarray, is_tuple
+from bioimageio.spec._internal.version_type import Version
from bioimageio.spec.common import ZipPath
from bioimageio.spec.model import AnyModelDescr, v0_4, v0_5
from bioimageio.spec.utils import download
from ..digest_spec import import_callable
+from ..utils._type_guards import is_list, is_ndarray, is_tuple
from ._model_adapter import ModelAdapter
@@ -143,7 +144,10 @@ def load_torch_state_dict(
model = model.to(devices[0])
with path.open("rb") as f:
assert not isinstance(f, TextIOWrapper)
- state = torch.load(f, map_location=devices[0], weights_only=True)
+ if Version(str(torch.__version__)) < Version("1.13"):
+ state = torch.load(f, map_location=devices[0])
+ else:
+ state = torch.load(f, map_location=devices[0], weights_only=True)
incompatible = model.load_state_dict(state)
if (
diff --git a/bioimageio/core/backends/torchscript_backend.py b/bioimageio/core/backends/torchscript_backend.py
index ce3ba131..a9801401 100644
--- a/bioimageio/core/backends/torchscript_backend.py
+++ b/bioimageio/core/backends/torchscript_backend.py
@@ -6,11 +6,11 @@
import torch
from numpy.typing import NDArray
-from bioimageio.spec._internal.type_guards import is_list, is_tuple
from bioimageio.spec.model import v0_4, v0_5
from bioimageio.spec.utils import download
from ..model_adapters import ModelAdapter
+from ..utils._type_guards import is_list, is_tuple
class TorchscriptModelAdapter(ModelAdapter):
diff --git a/bioimageio/core/io.py b/bioimageio/core/io.py
index dc5b70db..5c643b15 100644
--- a/bioimageio/core/io.py
+++ b/bioimageio/core/io.py
@@ -1,7 +1,6 @@
import collections.abc
import warnings
import zipfile
-from io import TextIOWrapper
from pathlib import Path, PurePosixPath
from shutil import copyfileobj
from typing import (
@@ -15,15 +14,16 @@
)
import h5py # pyright: ignore[reportMissingTypeStubs]
-import numpy as np
from imageio.v3 import imread, imwrite # type: ignore
from loguru import logger
from numpy.typing import NDArray
from pydantic import BaseModel, ConfigDict, TypeAdapter
from typing_extensions import assert_never
-from bioimageio.spec._internal.io import interprete_file_source
+from bioimageio.spec._internal.io import get_reader, interprete_file_source
+from bioimageio.spec._internal.type_guards import is_ndarray
from bioimageio.spec.common import (
+ FileSource,
HttpUrl,
PermissiveFileSource,
RelativeFilePath,
@@ -65,51 +65,51 @@ def load_image(
else:
src = parsed_source
- # FIXME: why is pyright complaining about giving the union to _split_dataset_path?
if isinstance(src, Path):
- file_source, subpath = _split_dataset_path(src)
+ file_source, suffix, subpath = _split_dataset_path(src)
elif isinstance(src, HttpUrl):
- file_source, subpath = _split_dataset_path(src)
+ file_source, suffix, subpath = _split_dataset_path(src)
elif isinstance(src, ZipPath):
- file_source, subpath = _split_dataset_path(src)
+ file_source, suffix, subpath = _split_dataset_path(src)
else:
assert_never(src)
- path = download(file_source).path
-
- if path.suffix == ".npy":
+ if suffix == ".npy":
if subpath is not None:
- raise ValueError(f"Unexpected subpath {subpath} for .npy path {path}")
- return load_array(path)
- elif path.suffix in SUFFIXES_WITH_DATAPATH:
+ logger.warning(
+ "Unexpected subpath {} for .npy source {}", subpath, file_source
+ )
+
+ image = load_array(file_source)
+ elif suffix in SUFFIXES_WITH_DATAPATH:
if subpath is None:
dataset_path = DEFAULT_H5_DATASET_PATH
else:
dataset_path = str(subpath)
- with h5py.File(path, "r") as f:
+ reader = download(file_source)
+
+ with h5py.File(reader, "r") as f:
h5_dataset = f.get( # pyright: ignore[reportUnknownVariableType]
dataset_path
)
if not isinstance(h5_dataset, h5py.Dataset):
raise ValueError(
- f"{path} is not of type {h5py.Dataset}, but has type "
+ f"{file_source} did not load as {h5py.Dataset}, but has type "
+ str(
type(h5_dataset) # pyright: ignore[reportUnknownArgumentType]
)
)
image: NDArray[Any]
image = h5_dataset[:] # pyright: ignore[reportUnknownVariableType]
- assert isinstance(image, np.ndarray), type(
- image # pyright: ignore[reportUnknownArgumentType]
- )
- return image # pyright: ignore[reportUnknownVariableType]
- elif isinstance(path, ZipPath):
- return imread(
- path.read_bytes(), extension=path.suffix
- ) # pyright: ignore[reportUnknownVariableType]
else:
- return imread(path) # pyright: ignore[reportUnknownVariableType]
+ reader = download(file_source)
+ image = imread( # pyright: ignore[reportUnknownVariableType]
+ reader.read(), extension=suffix
+ )
+
+ assert is_ndarray(image)
+ return image
def load_tensor(
@@ -123,19 +123,21 @@ def load_tensor(
_SourceT = TypeVar("_SourceT", Path, HttpUrl, ZipPath)
+Suffix = str
+
def _split_dataset_path(
source: _SourceT,
-) -> Tuple[_SourceT, Optional[PurePosixPath]]:
+) -> Tuple[_SourceT, Suffix, Optional[PurePosixPath]]:
"""Split off subpath (e.g. internal h5 dataset path)
from a file path following a file extension.
Examples:
>>> _split_dataset_path(Path("my_file.h5/dataset"))
- (...Path('my_file.h5'), PurePosixPath('dataset'))
+ (...Path('my_file.h5'), '.h5', PurePosixPath('dataset'))
>>> _split_dataset_path(Path("my_plain_file"))
- (...Path('my_plain_file'), None)
+ (...Path('my_plain_file'), '', None)
"""
if isinstance(source, RelativeFilePath):
@@ -148,42 +150,47 @@ def _split_dataset_path(
def separate_pure_path(path: PurePosixPath):
for p in path.parents:
if p.suffix in SUFFIXES_WITH_DATAPATH:
- return p, PurePosixPath(path.relative_to(p))
+ return p, p.suffix, PurePosixPath(path.relative_to(p))
- return path, None
+ return path, path.suffix, None
if isinstance(src, HttpUrl):
- file_path, data_path = separate_pure_path(PurePosixPath(src.path or ""))
+ file_path, suffix, data_path = separate_pure_path(PurePosixPath(src.path or ""))
if data_path is None:
- return src, None
+ return src, suffix, None
return (
HttpUrl(str(file_path).replace(f"/{data_path}", "")),
+ suffix,
data_path,
)
if isinstance(src, ZipPath):
- file_path, data_path = separate_pure_path(PurePosixPath(str(src)))
+ file_path, suffix, data_path = separate_pure_path(PurePosixPath(str(src)))
if data_path is None:
- return src, None
+ return src, suffix, None
return (
ZipPath(str(file_path).replace(f"/{data_path}", "")),
+ suffix,
data_path,
)
- file_path, data_path = separate_pure_path(PurePosixPath(src))
- return Path(file_path), data_path
+ file_path, suffix, data_path = separate_pure_path(PurePosixPath(src))
+ return Path(file_path), suffix, data_path
def save_tensor(path: Union[Path, str], tensor: Tensor) -> None:
# TODO: save axis meta data
- data: NDArray[Any] = tensor.data.to_numpy()
- file_path, subpath = _split_dataset_path(Path(path))
- if not file_path.suffix:
+ data: NDArray[Any] = ( # pyright: ignore[reportUnknownVariableType]
+ tensor.data.to_numpy()
+ )
+ assert is_ndarray(data)
+ file_path, suffix, subpath = _split_dataset_path(Path(path))
+ if not suffix:
raise ValueError(f"No suffix (needed to decide file format) found in {path}")
file_path.parent.mkdir(exist_ok=True, parents=True)
@@ -191,7 +198,7 @@ def save_tensor(path: Union[Path, str], tensor: Tensor) -> None:
if subpath is not None:
raise ValueError(f"Unexpected subpath {subpath} found in .npy path {path}")
save_array(file_path, data)
- elif file_path.suffix in (".h5", ".hdf", ".hdf5"):
+ elif suffix in (".h5", ".hdf", ".hdf5"):
if subpath is None:
dataset_path = DEFAULT_H5_DATASET_PATH
else:
@@ -275,22 +282,39 @@ def load_dataset_stat(path: Path):
def ensure_unzipped(source: Union[PermissiveFileSource, ZipPath], folder: Path):
"""unzip a (downloaded) **source** to a file in **folder** if source is a zip archive.
Always returns the path to the unzipped source (maybe source itself)"""
- local_weights_file = download(source).path
- if isinstance(local_weights_file, ZipPath):
- # source is inside a zip archive
- out_path = folder / local_weights_file.filename
- with local_weights_file.open("rb") as src, out_path.open("wb") as dst:
- assert not isinstance(src, TextIOWrapper)
- copyfileobj(src, dst)
-
- local_weights_file = out_path
-
- if zipfile.is_zipfile(local_weights_file):
+ weights_reader = get_reader(source)
+ out_path = folder / (
+ weights_reader.original_file_name or f"file{weights_reader.suffix}"
+ )
+
+ if zipfile.is_zipfile(weights_reader):
+ out_path = out_path.with_name(out_path.name + ".unzipped")
+ out_path.parent.mkdir(exist_ok=True, parents=True)
# source itself is a zipfile
- out_path = folder / local_weights_file.with_suffix(".unzipped").name
- with zipfile.ZipFile(local_weights_file, "r") as f:
+ with zipfile.ZipFile(weights_reader, "r") as f:
f.extractall(out_path)
- return out_path
else:
- return local_weights_file
+ out_path.parent.mkdir(exist_ok=True, parents=True)
+ with out_path.open("wb") as f:
+ copyfileobj(weights_reader, f)
+
+ return out_path
+
+
+def get_suffix(source: Union[ZipPath, FileSource]) -> str:
+ if isinstance(source, Path):
+ return source.suffix
+ elif isinstance(source, ZipPath):
+ return source.suffix
+ if isinstance(source, RelativeFilePath):
+ return source.path.suffix
+ elif isinstance(source, ZipPath):
+ return source.suffix
+ elif isinstance(source, HttpUrl):
+ if source.path is None:
+ return ""
+ else:
+ return PurePosixPath(source.path).suffix
+ else:
+ assert_never(source)
diff --git a/bioimageio/core/utils/_type_guards.py b/bioimageio/core/utils/_type_guards.py
new file mode 100644
index 00000000..3785c5e7
--- /dev/null
+++ b/bioimageio/core/utils/_type_guards.py
@@ -0,0 +1,8 @@
+"""use these type guards with caution!
+They widen the type to T[Any], which is not always correct."""
+
+from bioimageio.spec._internal import type_guards
+
+is_list = type_guards.is_list # pyright: ignore[reportPrivateImportUsage]
+is_ndarray = type_guards.is_ndarray # pyright: ignore[reportPrivateImportUsage]
+is_tuple = type_guards.is_tuple # pyright: ignore[reportPrivateImportUsage]
diff --git a/dev/env-dev.yaml b/dev/env-dev.yaml
index 13378376..38cbb289 100644
--- a/dev/env-dev.yaml
+++ b/dev/env-dev.yaml
@@ -5,10 +5,11 @@ channels:
- nodefaults
- pytorch
dependencies:
- - bioimageio.spec==0.5.4.1
+ - bioimageio.spec==0.5.4.3
- black
# - crick # currently requires python<=3.9
- h5py
+ - httpx
- imagecodecs
- imageio>=2.5
- jupyter
@@ -16,6 +17,7 @@ dependencies:
- keras>=3.0,<4
- loguru
- matplotlib
+ - napari
- numpy
- onnx
- onnxruntime
@@ -31,7 +33,7 @@ dependencies:
- pytest-cov
# - python=3.11 # removed
- pytorch>=2.1,<3
- - requests
+ - respx
- rich
- ruff
- ruyaml
diff --git a/dev/env-full.yaml b/dev/env-full.yaml
index a9dc0132..50c636c7 100644
--- a/dev/env-full.yaml
+++ b/dev/env-full.yaml
@@ -4,9 +4,9 @@ channels:
- nodefaults
- pytorch
dependencies:
- - bioimageio.spec==0.5.4.1
+ - bioimageio.spec==0.5.4.3
- black
- # - careamics # TODO: add careamics for model testing (currently pins pydantic to <2.9)
+ - careamics
- cellpose # for model testing
# - crick # currently requires python<=3.9
- h5py
@@ -18,6 +18,8 @@ dependencies:
- loguru
- matplotlib
- monai # for model testing
+ - napari
+
- numpy
- onnx
- onnxruntime
@@ -33,7 +35,8 @@ dependencies:
- pytest-cov
- python=3.11 # 3.12 not supported by cellpose->fastremap
- pytorch>=2.1,<3
- - requests
+ - httpx
+ - respx-mock
- rich
- ruff
- ruyaml
diff --git a/dev/env-gpu.yaml b/dev/env-gpu.yaml
index 7fc2123c..0cb97d73 100644
--- a/dev/env-gpu.yaml
+++ b/dev/env-gpu.yaml
@@ -4,7 +4,7 @@ channels:
- conda-forge
- nodefaults
dependencies:
- - bioimageio.spec==0.5.4.1
+ - bioimageio.spec==0.5.4.3
- black
- cellpose # for model testing
# - crick # currently requires python<=3.9
@@ -30,7 +30,8 @@ dependencies:
- pytest
- pytest-cov
- python=3.11
- - requests
+ - httpx
+ - respx-mock
- rich
- ruff
- ruyaml
diff --git a/dev/env-py38.yaml b/dev/env-py38.yaml
index 6fc6597a..490b8d50 100644
--- a/dev/env-py38.yaml
+++ b/dev/env-py38.yaml
@@ -5,7 +5,7 @@ channels:
- nodefaults
- pytorch
dependencies:
- - bioimageio.spec==0.5.4.1
+ - bioimageio.spec==0.5.4.3
- black
- crick # uncommented
- h5py
@@ -31,7 +31,8 @@ dependencies:
- pytest-cov
- python=3.8 # changed
- pytorch>=2.1,<3
- - requests
+ - httpx
+ - respx-mock
- rich
- ruff
- ruyaml
diff --git a/example/model_usage.ipynb b/example/model_usage.ipynb
index 8801b440..d6111a00 100644
--- a/example/model_usage.ipynb
+++ b/example/model_usage.ipynb
@@ -4,10 +4,11 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "# Bioimage Model Zoo Core Example notebook\n",
+ "# How to use bioimage.io models with bioimageio.core\n",
"\n",
- "This notebook shows how to interact with the `bioimageio.core` programmatically to explore, load, use, and export content from the [BioImage Model Zoo](https://bioimage.io).\n",
+ "This notebook shows how `bioimageio.core` can be used to load and deploy AI models shared in the [bioimage.io Model Zoo](https://bioimage.io).\n",
"\n",
+ "See the `bioimageio.spec` example notebook [load_model_and_create_your_own.ipynb](https://github.com/bioimage-io/spec-bioimage-io/blob/main/example/load_model_and_create_your_own.ipynb) for more details on loading and inspecting a model descriptions as well as how to create such descriptions in Python.\n",
"\n",
"quick links:\n",
"- [Create an input sample for a given model](#create_sample_for_model)"
@@ -17,43 +18,55 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "## 0. Activate human readable output error messages and load dependencies"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### 0.1. Install necessary dependencies"
+ "## 0. Setup\n",
+ "\n",
+ "### 0.1. Install dependencies"
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
+ "# type: ignore\n",
+ "dry_run: bool = True\n",
+ "\n",
+ "def install_missing(name: str, version: str):\n",
+ " if dry_run:\n",
+ " print(f\"Missing dependency {name}; would install {name}=={version}\")\n",
+ " else:\n",
+ " %pip install {name}=={version}\n",
+ "\n",
+ "\n",
+ "try:\n",
+ " import bioimageio.core\n",
+ "except ImportError:\n",
+ " install_missing(\"bioimageio.core\", \"0.8.0\")\n",
+ "\n",
"try:\n",
- " import matplotlib\n",
" import torch\n",
+ "except ImportError:\n",
+ " install_missing(\"torch\", \"2.5.1\")\n",
"\n",
- " import bioimageio.core\n",
+ "try:\n",
+ " import matplotlib\n",
"except ImportError:\n",
- " %pip install bioimageio.core==0.6.7 torch==2.3.1 matplotlib==3.9.0"
+ " install_missing(\"matplotlib\", \"3.9.0\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "### 0.2.Enable pretty_validation_errors\n",
+ "### 0.2 Prettify validation errors\n",
"\n",
- "This function displays validation errors in a human readable format."
+ "The `enable_pretty_validation_errors_in_ipynb` function registers an IPython exception handler to prettify raised validation errors."
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
@@ -68,51 +81,39 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "### 0.3. Load general dependencies"
+ "### 0.3. Utility functions\n",
+ "\n",
+ "Helper functions that are used in this notebook."
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
- "# Load general dependencies\n",
- "from pprint import pprint\n",
- "\n",
- "import matplotlib.pyplot as plt\n",
- "import numpy as np\n",
- "from imageio.v2 import imread\n",
- "\n",
+ "from bioimageio.core import Tensor\n",
"from bioimageio.spec.utils import download\n",
+ "from typing import Mapping\n",
"\n",
"\n",
- "# Function to display input and prediction output images\n",
- "def show_images(sample_tensor, prediction_tensor):\n",
- " input_array = sample_tensor.members[\"input0\"].data\n",
- "\n",
- " # Check for the number of channels to enable display\n",
- " input_array = np.squeeze(input_array)\n",
- " if len(input_array.shape) > 2:\n",
- " input_array = input_array[0]\n",
- "\n",
- " output_array = prediction_tensor.members[\"output0\"].data\n",
+ "try:\n",
+ " import napari\n",
+ "except ImportError:\n",
"\n",
- " # Check for the number of channels to enable display\n",
- " output_array = np.squeeze(output_array)\n",
- " if len(output_array.shape) > 2:\n",
- " output_array = output_array[0]\n",
+ " def show_images(images: Mapping[str, Tensor]):\n",
+ " for name, im in images.items():\n",
+ " im = im.data\n",
+ " print(f\"{name}: {im.shape}\")\n",
+ " # TODO: add plt.imshow\n",
"\n",
- " plt.figure()\n",
- " ax1 = plt.subplot(1, 2, 1)\n",
- " ax1.set_title(\"Input\")\n",
- " ax1.axis(\"off\")\n",
- " plt.imshow(input_array)\n",
- " ax2 = plt.subplot(1, 2, 2)\n",
- " ax2.set_title(\"Prediction\")\n",
- " ax2.axis(\"off\")\n",
- " plt.imshow(output_array)\n",
- " plt.show()"
+ "else:\n",
+ " def show_images(images: Mapping[str, Tensor]):\n",
+ " v = napari.Viewer()\n",
+ " for name, tensor in images.items():\n",
+ " im = tensor.data.data\n",
+ " print(f\"napari viewer: adding {name}\")\n",
+ " _ = v.add_image(im, name=name)\n"
]
},
{
@@ -151,18 +152,19 @@
"\n",
"Both of these options may be version specific (\"affable-shark/1\" or a version specific [__Zenodo__](https://zenodo.org/) backup [__DOI__](https://doi.org/)).\n",
"\n",
- "Alternatively, any rdf.yaml source, single file or in a .zip, may be loaded by providing its __local path__ or __URL__."
+ "Alternatively, any bioimageio.yaml source --- a single YAML file or a .zip package, may be loaded by providing its __local path__ or __URL__."
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
- "BMZ_MODEL_ID = \"\" # \"affable-shark\"\n",
- "BMZ_MODEL_DOI = \"\" # \"10.5281/zenodo.6287342\"\n",
- "BMZ_MODEL_URL = \"https://uk1s3.embassy.ebi.ac.uk/public-datasets/bioimage.io/affable-shark/draft/files/rdf.yaml\""
+ "MODEL_SOURCE = \"affable-shark\" # bioimageio ID\n",
+ "# MODEL_SOURCE = \"10.5281/zenodo.6287342\" # DOI of the backup hosted on Zenodo\n",
+ "# MODEL_SOURCE = \"https://uk1s3.embassy.ebi.ac.uk/public-datasets/bioimage.io/affable-shark/1.1/files/rdf.yaml\" # URL to bioimageio.yaml file\n",
+ "# MODEL_SOURCE = \"bioimageio_package.zip\" # path to a local zip file"
]
},
{
@@ -176,70 +178,573 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 5,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ " 0%| | 0.00/1.57k [00:00, ?B/s]\n",
+ " 0%| | 0.00/1.57k [00:00, ?B/s]\n",
+ "\n",
+ "Downloading documentation.md: 1571it [00:00, 117173.50it/s]\n",
+ " 0%| | 0.00/1.57k [00:00, ?B/s]\n",
+ " 0%| | 0.00/1.57k [00:00, ?B/s]\n",
+ "\n",
+ "Downloading documentation.md: 1571it [00:00, 262071.02it/s]\n"
+ ]
+ }
+ ],
"source": [
- "from bioimageio.core import load_description\n",
- "\n",
- "# Load the model description\n",
- "# ------------------------------------------------------------------------------\n",
- "if BMZ_MODEL_ID != \"\":\n",
- " model = load_description(BMZ_MODEL_ID)\n",
- " print(\n",
- " f\"\\nThe model '{model.name}' with ID '{BMZ_MODEL_ID}' has been correctly loaded.\"\n",
- " )\n",
- "elif BMZ_MODEL_DOI != \"\":\n",
- " model = load_description(BMZ_MODEL_DOI)\n",
- " print(\n",
- " f\"\\nThe model '{model.name}' with DOI '{BMZ_MODEL_DOI}' has been correctly loaded.\"\n",
- " )\n",
- "elif BMZ_MODEL_URL != \"\":\n",
- " model = load_description(BMZ_MODEL_URL)\n",
- " print(\n",
- " f\"\\nThe model '{model.name}' with URL '{BMZ_MODEL_URL}' has been correctly loaded.\"\n",
- " )\n",
- "else:\n",
- " print(\"\\nPlease specify a model ID, DOI or URL\")\n",
+ "from bioimageio.core import load_model_description\n",
+ "from bioimageio.spec import InvalidDescr, ModelDescr\n",
"\n",
- "if \"draft\" in BMZ_MODEL_ID or \"draft\" in BMZ_MODEL_DOI or \"draft\" in BMZ_MODEL_URL:\n",
- " print(\n",
- " f\"\\nThis is the DRAFT version of '{model.name}'. \\nDraft versions have not been reviewed by the Bioimage Model Zoo Team and may contain harmful code. Run with caution.\"\n",
- " )"
+ "model = load_model_description(MODEL_SOURCE)\n",
+ "if isinstance(model, InvalidDescr):\n",
+ " model.validation_summary.display()\n",
+ " raise TypeError(\"Invalid model description\")\n",
+ "elif not isinstance(model, ModelDescr):\n",
+ " model.validation_summary.display()\n",
+ " raise TypeError(f\"This notebook requires the latest model format version {ModelDescr.implemented_format_version}.\")\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "### 1.3 Inspect the model metadata\n",
+ "### 1.3 (optional) Inspect the model metadata\n",
"\n",
- "Let's inspect all the model metadata. For a step-by-step inspection refer to [bioimageio.spec package example notebook](https://github.com/bioimage-io/spec-bioimage-io/blob/main/example/load_model_and_create_your_own.ipynb)."
+ "Here is the complete metadata of the loaded model.\n",
+ "The model fields are documented [as part of our json schema documentation](https://bioimage-io.github.io/spec-bioimage-io/bioimageio/spec.html#ModelDescr) and in the [bioimageio.spec developer documentation](https://bioimage-io.github.io/spec-bioimage-io/bioimageio/spec.html#ModelDescr)."
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 6,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
ModelDescr ( \n",
+ " name ='NucleiSegmentationBoundaryModel' ,\n",
+ " description ='Nucleus segmentation for fluorescence microscopy' ,\n",
+ " covers =[ RelativeFilePath ( root =PureWindowsPath ( 'cover.png' ))] ,\n",
+ " id_emoji ='๐ฆ' ,\n",
+ " authors =[ \n",
+ " Author ( \n",
+ " affiliation ='EMBL Heidelberg' ,\n",
+ " email =None ,\n",
+ " orcid =None ,\n",
+ " name ='Constantin Pape' ,\n",
+ " github_user ='constantinpape' \n",
+ " ) \n",
+ " ] ,\n",
+ " attachments =[ \n",
+ " FileDescr ( \n",
+ " source =RelativeFilePath ( root =PureWindowsPath ( 'zero_mean_unit_variance.ijm' )) ,\n",
+ " sha256 ='767f2c3a50e36365c30b9e46e57fcf82e606d337e8a48d4a2440dc512813d186' \n",
+ " ) \n",
+ " ] ,\n",
+ " cite =[ \n",
+ " CiteEntry ( text ='training library' , doi ='10.5281/zenodo.5108853' , url =None ) ,\n",
+ " CiteEntry ( text ='architecture' , doi ='10.1007/978-3-319-24574-4_28' , url =None ) ,\n",
+ " CiteEntry ( text ='segmentation algorithm' , doi ='10.1038/nmeth.4151' , url =None ) ,\n",
+ " CiteEntry ( text ='data' , doi =None , url ='https://www.nature.com/articles/s41592-019-0612-7' ) \n",
+ " ] ,\n",
+ " license ='CC-BY-4.0' ,\n",
+ " git_repo =None ,\n",
+ " icon =None ,\n",
+ " links =[ \n",
+ " 'ilastik/stardist_dsb_training_data' ,\n",
+ " 'ilastik/ilastik' ,\n",
+ " 'deepimagej/deepimagej' ,\n",
+ " 'imjoy/BioImageIO-Packager' \n",
+ " ] ,\n",
+ " uploader =Uploader ( email ='thefynnbe@gmail.com' , name ='Fynn Beuttenmรผller' ) ,\n",
+ " maintainers =[ \n",
+ " Maintainer ( \n",
+ " affiliation =None ,\n",
+ " email =None ,\n",
+ " orcid =None ,\n",
+ " name ='Constantin Pape' ,\n",
+ " github_user ='constantinpape' \n",
+ " ) \n",
+ " ] ,\n",
+ " tags =[ 'fluorescence-light-microscopy' , 'nuclei' , 'instance-segmentation' , 'unet' , '2d' ] ,\n",
+ " version =Version ( root =1.1 ) ,\n",
+ " format_version ='0.5.4' ,\n",
+ " type ='model' ,\n",
+ " id ='10.5281/zenodo.5764892/6647674' ,\n",
+ " documentation =RelativeFilePath ( root =PureWindowsPath ( 'documentation.md' )) ,\n",
+ " inputs =[ \n",
+ " InputTensorDescr ( \n",
+ " id ='input0' ,\n",
+ " description ='' ,\n",
+ " axes =[ \n",
+ " BatchAxis ( id ='batch' , description ='' , type ='batch' , size =None ) ,\n",
+ " ChannelAxis ( id ='channel' , description ='' , type ='channel' , channel_names =[ 'channel0' ]) ,\n",
+ " SpaceInputAxis ( \n",
+ " size =ParameterizedSize ( min =64 , step =16 ) ,\n",
+ " id ='y' ,\n",
+ " description ='' ,\n",
+ " type ='space' ,\n",
+ " unit =None ,\n",
+ " scale =1.0 ,\n",
+ " concatenable =False \n",
+ " ) ,\n",
+ " SpaceInputAxis ( \n",
+ " size =ParameterizedSize ( min =64 , step =16 ) ,\n",
+ " id ='x' ,\n",
+ " description ='' ,\n",
+ " type ='space' ,\n",
+ " unit =None ,\n",
+ " scale =1.0 ,\n",
+ " concatenable =False \n",
+ " ) \n",
+ " ] ,\n",
+ " test_tensor =FileDescr ( \n",
+ " source =RelativeFilePath ( root =PureWindowsPath ( 'test_input_0.npy' )) ,\n",
+ " sha256 ='c29bd6e16e3f7856217b407ba948222b1c2a0da41922a0f79297e25588614fe2' \n",
+ " ) ,\n",
+ " sample_tensor =FileDescr ( \n",
+ " source =RelativeFilePath ( root =PureWindowsPath ( 'sample_input_0.tif' )) ,\n",
+ " sha256 ='a24b3c708b6ca6825494eb7c5a4d221335fb3eef5eb9d03f4108907cdaad2bf9' \n",
+ " ) ,\n",
+ " data =IntervalOrRatioDataDescr ( \n",
+ " type ='float32' ,\n",
+ " range =( None , None ) ,\n",
+ " unit ='arbitrary unit' ,\n",
+ " scale =1.0 ,\n",
+ " offset =None \n",
+ " ) ,\n",
+ " optional =False ,\n",
+ " preprocessing =[ \n",
+ " EnsureDtypeDescr ( id ='ensure_dtype' , kwargs =EnsureDtypeKwargs ( dtype ='float32' )) ,\n",
+ " ZeroMeanUnitVarianceDescr ( \n",
+ " id ='zero_mean_unit_variance' ,\n",
+ " kwargs =ZeroMeanUnitVarianceKwargs ( axes =[ 'channel' , 'y' , 'x' ] , eps =1e-06 ) \n",
+ " ) ,\n",
+ " EnsureDtypeDescr ( id ='ensure_dtype' , kwargs =EnsureDtypeKwargs ( dtype ='float32' )) \n",
+ " ] \n",
+ " ) \n",
+ " ] ,\n",
+ " outputs =[ \n",
+ " OutputTensorDescr ( \n",
+ " id ='output0' ,\n",
+ " description ='' ,\n",
+ " axes =[ \n",
+ " BatchAxis ( id ='batch' , description ='' , type ='batch' , size =None ) ,\n",
+ " ChannelAxis ( id ='channel' , description ='' , type ='channel' , channel_names =[ 'channel0' , 'channel1' ]) ,\n",
+ " SpaceOutputAxisWithHalo ( \n",
+ " halo =16 ,\n",
+ " size =SizeReference ( tensor_id ='input0' , axis_id ='y' , offset =0 ) ,\n",
+ " id ='y' ,\n",
+ " description ='' ,\n",
+ " type ='space' ,\n",
+ " unit =None ,\n",
+ " scale =1.0 \n",
+ " ) ,\n",
+ " SpaceOutputAxisWithHalo ( \n",
+ " halo =16 ,\n",
+ " size =SizeReference ( tensor_id ='input0' , axis_id ='x' , offset =0 ) ,\n",
+ " id ='x' ,\n",
+ " description ='' ,\n",
+ " type ='space' ,\n",
+ " unit =None ,\n",
+ " scale =1.0 \n",
+ " ) \n",
+ " ] ,\n",
+ " test_tensor =FileDescr ( \n",
+ " source =RelativeFilePath ( root =PureWindowsPath ( 'test_output_0.npy' )) ,\n",
+ " sha256 ='510181f38930e59e4fd8ecc03d6ea7c980eb6609759655f2d4a41fe36108d5f5' \n",
+ " ) ,\n",
+ " sample_tensor =FileDescr ( \n",
+ " source =RelativeFilePath ( root =PureWindowsPath ( 'sample_output_0.tif' )) ,\n",
+ " sha256 ='e8f99aabe8405427f515eba23a49f58ba50302f57d1fdfd07026e1984f836c5e' \n",
+ " ) ,\n",
+ " data =IntervalOrRatioDataDescr ( \n",
+ " type ='float32' ,\n",
+ " range =( None , None ) ,\n",
+ " unit ='arbitrary unit' ,\n",
+ " scale =1.0 ,\n",
+ " offset =None \n",
+ " ) ,\n",
+ " postprocessing =[ EnsureDtypeDescr ( id ='ensure_dtype' , kwargs =EnsureDtypeKwargs ( dtype ='float32' ))] \n",
+ " ) \n",
+ " ] ,\n",
+ " packaged_by =[] ,\n",
+ " parent =None ,\n",
+ " run_mode =None ,\n",
+ " timestamp =Datetime ( root =datetime .datetime ( 2022 , 6 , 15 , 20 , 6 , 22 , 658325 , tzinfo =datetime .timezone.utc)) ,\n",
+ " training_data =LinkedDataset ( version =None , id ='ilastik/stradist_dsb_training_data' ) ,\n",
+ " weights =WeightsDescr ( \n",
+ " keras_hdf5 =None ,\n",
+ " onnx =OnnxWeightsDescr ( \n",
+ " source =RelativeFilePath ( root =PureWindowsPath ( 'weights.onnx' )) ,\n",
+ " sha256 ='df913b85947f5132bcdaf81d91af0963f60d44f4caf8a4fec672d96a2f327b44' ,\n",
+ " authors =None ,\n",
+ " parent ='pytorch_state_dict' ,\n",
+ " comment ='' ,\n",
+ " opset_version =12 \n",
+ " ) ,\n",
+ " pytorch_state_dict =PytorchStateDictWeightsDescr ( \n",
+ " source =RelativeFilePath ( root =PureWindowsPath ( 'weights.pt' )) ,\n",
+ " sha256 ='608f52cd7f5119f7a7b8272395b0c169714e8be34536eaf159820f72a1d6a5b7' ,\n",
+ " authors =None ,\n",
+ " parent =None ,\n",
+ " comment ='' ,\n",
+ " architecture =ArchitectureFromFileDescr ( \n",
+ " source =RelativeFilePath ( root =PureWindowsPath ( 'unet.py' )) ,\n",
+ " sha256 ='7f5b15948e8e2c91f78dcff34fbf30af517073e91ba487f3edb982b948d099b3' ,\n",
+ " callable ='UNet2d' ,\n",
+ " kwargs ={ \n",
+ " 'depth' : 4 ,\n",
+ " 'final_activation' : 'Sigmoid' ,\n",
+ " 'gain' : 2 ,\n",
+ " 'in_channels' : 1 ,\n",
+ " 'initial_features' : 64 ,\n",
+ " 'out_channels' : 2 ,\n",
+ " 'postprocessing' : None ,\n",
+ " 'return_side_outputs' : False \n",
+ " } \n",
+ " ) ,\n",
+ " pytorch_version =Version ( root ='1.10' ) ,\n",
+ " dependencies =None \n",
+ " ) ,\n",
+ " tensorflow_js =None ,\n",
+ " tensorflow_saved_model_bundle =None ,\n",
+ " torchscript =TorchscriptWeightsDescr ( \n",
+ " source =RelativeFilePath ( root =PureWindowsPath ( 'weights-torchscript.pt' )) ,\n",
+ " sha256 ='8410950508655a300793b389c815dc30b1334062fc1dadb1e15e55a93cbb99a0' ,\n",
+ " authors =None ,\n",
+ " parent ='pytorch_state_dict' ,\n",
+ " comment ='' ,\n",
+ " pytorch_version =Version ( root ='1.10' ) \n",
+ " ) \n",
+ " ) ,\n",
+ " config =Config ( \n",
+ " bioimageio =BioimageioConfig ( \n",
+ " reproducibility_tolerance =() ,\n",
+ " nickname ='affable-shark' ,\n",
+ " nickname_icon ='๐ฆ' ,\n",
+ " thumbnails ={ 'cover.png' : 'cover.thumbnail.png' } \n",
+ " ) ,\n",
+ " _conceptdoi ='10.5281/zenodo.5764892' ,\n",
+ " deepimagej ={ \n",
+ " 'allow_tiling' : True ,\n",
+ " 'model_keys' : None ,\n",
+ " 'prediction' : { \n",
+ " 'postprocess' : [{ 'spec' : None }] ,\n",
+ " 'preprocess' : [{ 'kwargs' : 'zero_mean_unit_variance.ijm' , 'spec' : 'ij.IJ::runMacroFile' }] \n",
+ " } ,\n",
+ " 'pyramidal_model' : False ,\n",
+ " 'test_information' : { \n",
+ " 'inputs' : [ \n",
+ " { \n",
+ " 'name' : 'sample_input_0.tif' ,\n",
+ " 'pixel_size' : { 'x' : 1 , 'y' : 1 , 'z' : 1 } ,\n",
+ " 'size' : '256 x 256 x 1 x 1' \n",
+ " } \n",
+ " ] ,\n",
+ " 'memory_peak' : None ,\n",
+ " 'outputs' : [{ 'name' : 'sample_output_0.tif' , 'size' : '256 x 256 x 1 x 2' , 'type' : 'image' }] ,\n",
+ " 'runtime' : None \n",
+ " } \n",
+ " } \n",
+ " ) \n",
+ ") \n",
+ " \n"
+ ],
+ "text/plain": [
+ "\u001b[1;35mModelDescr\u001b[0m\u001b[1m(\u001b[0m\n",
+ " \u001b[33mname\u001b[0m=\u001b[32m'NucleiSegmentationBoundaryModel'\u001b[0m,\n",
+ " \u001b[33mdescription\u001b[0m=\u001b[32m'Nucleus segmentation for fluorescence microscopy'\u001b[0m,\n",
+ " \u001b[33mcovers\u001b[0m=\u001b[1m[\u001b[0m\u001b[1;35mRelativeFilePath\u001b[0m\u001b[1m(\u001b[0m\u001b[33mroot\u001b[0m=\u001b[1;35mPureWindowsPath\u001b[0m\u001b[1m(\u001b[0m\u001b[32m'cover.png'\u001b[0m\u001b[1m)\u001b[0m\u001b[1m)\u001b[0m\u001b[1m]\u001b[0m,\n",
+ " \u001b[33mid_emoji\u001b[0m=\u001b[32m'๐ฆ'\u001b[0m,\n",
+ " \u001b[33mauthors\u001b[0m=\u001b[1m[\u001b[0m\n",
+ " \u001b[1;35mAuthor\u001b[0m\u001b[1m(\u001b[0m\n",
+ " \u001b[33maffiliation\u001b[0m=\u001b[32m'EMBL Heidelberg'\u001b[0m,\n",
+ " \u001b[33memail\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
+ " \u001b[33morcid\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
+ " \u001b[33mname\u001b[0m=\u001b[32m'Constantin Pape'\u001b[0m,\n",
+ " \u001b[33mgithub_user\u001b[0m=\u001b[32m'constantinpape'\u001b[0m\n",
+ " \u001b[1m)\u001b[0m\n",
+ " \u001b[1m]\u001b[0m,\n",
+ " \u001b[33mattachments\u001b[0m=\u001b[1m[\u001b[0m\n",
+ " \u001b[1;35mFileDescr\u001b[0m\u001b[1m(\u001b[0m\n",
+ " \u001b[33msource\u001b[0m=\u001b[1;35mRelativeFilePath\u001b[0m\u001b[1m(\u001b[0m\u001b[33mroot\u001b[0m=\u001b[1;35mPureWindowsPath\u001b[0m\u001b[1m(\u001b[0m\u001b[32m'zero_mean_unit_variance.ijm'\u001b[0m\u001b[1m)\u001b[0m\u001b[1m)\u001b[0m,\n",
+ " \u001b[33msha256\u001b[0m=\u001b[32m'767f2c3a50e36365c30b9e46e57fcf82e606d337e8a48d4a2440dc512813d186'\u001b[0m\n",
+ " \u001b[1m)\u001b[0m\n",
+ " \u001b[1m]\u001b[0m,\n",
+ " \u001b[33mcite\u001b[0m=\u001b[1m[\u001b[0m\n",
+ " \u001b[1;35mCiteEntry\u001b[0m\u001b[1m(\u001b[0m\u001b[33mtext\u001b[0m=\u001b[32m'training library'\u001b[0m, \u001b[33mdoi\u001b[0m=\u001b[32m'10.5281/zenodo.5108853'\u001b[0m, \u001b[33murl\u001b[0m=\u001b[3;35mNone\u001b[0m\u001b[1m)\u001b[0m,\n",
+ " \u001b[1;35mCiteEntry\u001b[0m\u001b[1m(\u001b[0m\u001b[33mtext\u001b[0m=\u001b[32m'architecture'\u001b[0m, \u001b[33mdoi\u001b[0m=\u001b[32m'10.1007/978-3-319-24574-4_28'\u001b[0m, \u001b[33murl\u001b[0m=\u001b[3;35mNone\u001b[0m\u001b[1m)\u001b[0m,\n",
+ " \u001b[1;35mCiteEntry\u001b[0m\u001b[1m(\u001b[0m\u001b[33mtext\u001b[0m=\u001b[32m'segmentation algorithm'\u001b[0m, \u001b[33mdoi\u001b[0m=\u001b[32m'10.1038/nmeth.4151'\u001b[0m, \u001b[33murl\u001b[0m=\u001b[3;35mNone\u001b[0m\u001b[1m)\u001b[0m,\n",
+ " \u001b[1;35mCiteEntry\u001b[0m\u001b[1m(\u001b[0m\u001b[33mtext\u001b[0m=\u001b[32m'data'\u001b[0m, \u001b[33mdoi\u001b[0m=\u001b[3;35mNone\u001b[0m, \u001b[33murl\u001b[0m=\u001b[32m'https://www.nature.com/articles/s41592-019-0612-7'\u001b[0m\u001b[1m)\u001b[0m\n",
+ " \u001b[1m]\u001b[0m,\n",
+ " \u001b[33mlicense\u001b[0m=\u001b[32m'CC-BY-4.0'\u001b[0m,\n",
+ " \u001b[33mgit_repo\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
+ " \u001b[33micon\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
+ " \u001b[33mlinks\u001b[0m=\u001b[1m[\u001b[0m\n",
+ " \u001b[32m'ilastik/stardist_dsb_training_data'\u001b[0m,\n",
+ " \u001b[32m'ilastik/ilastik'\u001b[0m,\n",
+ " \u001b[32m'deepimagej/deepimagej'\u001b[0m,\n",
+ " \u001b[32m'imjoy/BioImageIO-Packager'\u001b[0m\n",
+ " \u001b[1m]\u001b[0m,\n",
+ " \u001b[33muploader\u001b[0m=\u001b[1;35mUploader\u001b[0m\u001b[1m(\u001b[0m\u001b[33memail\u001b[0m=\u001b[32m'thefynnbe@gmail.com'\u001b[0m, \u001b[33mname\u001b[0m=\u001b[32m'Fynn Beuttenmรผller'\u001b[0m\u001b[1m)\u001b[0m,\n",
+ " \u001b[33mmaintainers\u001b[0m=\u001b[1m[\u001b[0m\n",
+ " \u001b[1;35mMaintainer\u001b[0m\u001b[1m(\u001b[0m\n",
+ " \u001b[33maffiliation\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
+ " \u001b[33memail\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
+ " \u001b[33morcid\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
+ " \u001b[33mname\u001b[0m=\u001b[32m'Constantin Pape'\u001b[0m,\n",
+ " \u001b[33mgithub_user\u001b[0m=\u001b[32m'constantinpape'\u001b[0m\n",
+ " \u001b[1m)\u001b[0m\n",
+ " \u001b[1m]\u001b[0m,\n",
+ " \u001b[33mtags\u001b[0m=\u001b[1m[\u001b[0m\u001b[32m'fluorescence-light-microscopy'\u001b[0m, \u001b[32m'nuclei'\u001b[0m, \u001b[32m'instance-segmentation'\u001b[0m, \u001b[32m'unet'\u001b[0m, \u001b[32m'2d'\u001b[0m\u001b[1m]\u001b[0m,\n",
+ " \u001b[33mversion\u001b[0m=\u001b[1;35mVersion\u001b[0m\u001b[1m(\u001b[0m\u001b[33mroot\u001b[0m=\u001b[1;36m1\u001b[0m\u001b[1;36m.1\u001b[0m\u001b[1m)\u001b[0m,\n",
+ " \u001b[33mformat_version\u001b[0m=\u001b[32m'0.5.4'\u001b[0m,\n",
+ " \u001b[33mtype\u001b[0m=\u001b[32m'model'\u001b[0m,\n",
+ " \u001b[33mid\u001b[0m=\u001b[32m'10.5281/zenodo.5764892/6647674'\u001b[0m,\n",
+ " \u001b[33mdocumentation\u001b[0m=\u001b[1;35mRelativeFilePath\u001b[0m\u001b[1m(\u001b[0m\u001b[33mroot\u001b[0m=\u001b[1;35mPureWindowsPath\u001b[0m\u001b[1m(\u001b[0m\u001b[32m'documentation.md'\u001b[0m\u001b[1m)\u001b[0m\u001b[1m)\u001b[0m,\n",
+ " \u001b[33minputs\u001b[0m=\u001b[1m[\u001b[0m\n",
+ " \u001b[1;35mInputTensorDescr\u001b[0m\u001b[1m(\u001b[0m\n",
+ " \u001b[33mid\u001b[0m=\u001b[32m'input0'\u001b[0m,\n",
+ " \u001b[33mdescription\u001b[0m=\u001b[32m''\u001b[0m,\n",
+ " \u001b[33maxes\u001b[0m=\u001b[1m[\u001b[0m\n",
+ " \u001b[1;35mBatchAxis\u001b[0m\u001b[1m(\u001b[0m\u001b[33mid\u001b[0m=\u001b[32m'batch'\u001b[0m, \u001b[33mdescription\u001b[0m=\u001b[32m''\u001b[0m, \u001b[33mtype\u001b[0m=\u001b[32m'batch'\u001b[0m, \u001b[33msize\u001b[0m=\u001b[3;35mNone\u001b[0m\u001b[1m)\u001b[0m,\n",
+ " \u001b[1;35mChannelAxis\u001b[0m\u001b[1m(\u001b[0m\u001b[33mid\u001b[0m=\u001b[32m'channel'\u001b[0m, \u001b[33mdescription\u001b[0m=\u001b[32m''\u001b[0m, \u001b[33mtype\u001b[0m=\u001b[32m'channel'\u001b[0m, \u001b[33mchannel_names\u001b[0m=\u001b[1m[\u001b[0m\u001b[32m'channel0'\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
+ " \u001b[1;35mSpaceInputAxis\u001b[0m\u001b[1m(\u001b[0m\n",
+ " \u001b[33msize\u001b[0m=\u001b[1;35mParameterizedSize\u001b[0m\u001b[1m(\u001b[0m\u001b[33mmin\u001b[0m=\u001b[1;36m64\u001b[0m, \u001b[33mstep\u001b[0m=\u001b[1;36m16\u001b[0m\u001b[1m)\u001b[0m,\n",
+ " \u001b[33mid\u001b[0m=\u001b[32m'y'\u001b[0m,\n",
+ " \u001b[33mdescription\u001b[0m=\u001b[32m''\u001b[0m,\n",
+ " \u001b[33mtype\u001b[0m=\u001b[32m'space'\u001b[0m,\n",
+ " \u001b[33munit\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
+ " \u001b[33mscale\u001b[0m=\u001b[1;36m1\u001b[0m\u001b[1;36m.0\u001b[0m,\n",
+ " \u001b[33mconcatenable\u001b[0m=\u001b[3;91mFalse\u001b[0m\n",
+ " \u001b[1m)\u001b[0m,\n",
+ " \u001b[1;35mSpaceInputAxis\u001b[0m\u001b[1m(\u001b[0m\n",
+ " \u001b[33msize\u001b[0m=\u001b[1;35mParameterizedSize\u001b[0m\u001b[1m(\u001b[0m\u001b[33mmin\u001b[0m=\u001b[1;36m64\u001b[0m, \u001b[33mstep\u001b[0m=\u001b[1;36m16\u001b[0m\u001b[1m)\u001b[0m,\n",
+ " \u001b[33mid\u001b[0m=\u001b[32m'x'\u001b[0m,\n",
+ " \u001b[33mdescription\u001b[0m=\u001b[32m''\u001b[0m,\n",
+ " \u001b[33mtype\u001b[0m=\u001b[32m'space'\u001b[0m,\n",
+ " \u001b[33munit\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
+ " \u001b[33mscale\u001b[0m=\u001b[1;36m1\u001b[0m\u001b[1;36m.0\u001b[0m,\n",
+ " \u001b[33mconcatenable\u001b[0m=\u001b[3;91mFalse\u001b[0m\n",
+ " \u001b[1m)\u001b[0m\n",
+ " \u001b[1m]\u001b[0m,\n",
+ " \u001b[33mtest_tensor\u001b[0m=\u001b[1;35mFileDescr\u001b[0m\u001b[1m(\u001b[0m\n",
+ " \u001b[33msource\u001b[0m=\u001b[1;35mRelativeFilePath\u001b[0m\u001b[1m(\u001b[0m\u001b[33mroot\u001b[0m=\u001b[1;35mPureWindowsPath\u001b[0m\u001b[1m(\u001b[0m\u001b[32m'test_input_0.npy'\u001b[0m\u001b[1m)\u001b[0m\u001b[1m)\u001b[0m,\n",
+ " \u001b[33msha256\u001b[0m=\u001b[32m'c29bd6e16e3f7856217b407ba948222b1c2a0da41922a0f79297e25588614fe2'\u001b[0m\n",
+ " \u001b[1m)\u001b[0m,\n",
+ " \u001b[33msample_tensor\u001b[0m=\u001b[1;35mFileDescr\u001b[0m\u001b[1m(\u001b[0m\n",
+ " \u001b[33msource\u001b[0m=\u001b[1;35mRelativeFilePath\u001b[0m\u001b[1m(\u001b[0m\u001b[33mroot\u001b[0m=\u001b[1;35mPureWindowsPath\u001b[0m\u001b[1m(\u001b[0m\u001b[32m'sample_input_0.tif'\u001b[0m\u001b[1m)\u001b[0m\u001b[1m)\u001b[0m,\n",
+ " \u001b[33msha256\u001b[0m=\u001b[32m'a24b3c708b6ca6825494eb7c5a4d221335fb3eef5eb9d03f4108907cdaad2bf9'\u001b[0m\n",
+ " \u001b[1m)\u001b[0m,\n",
+ " \u001b[33mdata\u001b[0m=\u001b[1;35mIntervalOrRatioDataDescr\u001b[0m\u001b[1m(\u001b[0m\n",
+ " \u001b[33mtype\u001b[0m=\u001b[32m'float32'\u001b[0m,\n",
+ " \u001b[33mrange\u001b[0m=\u001b[1m(\u001b[0m\u001b[3;35mNone\u001b[0m, \u001b[3;35mNone\u001b[0m\u001b[1m)\u001b[0m,\n",
+ " \u001b[33munit\u001b[0m=\u001b[32m'arbitrary unit'\u001b[0m,\n",
+ " \u001b[33mscale\u001b[0m=\u001b[1;36m1\u001b[0m\u001b[1;36m.0\u001b[0m,\n",
+ " \u001b[33moffset\u001b[0m=\u001b[3;35mNone\u001b[0m\n",
+ " \u001b[1m)\u001b[0m,\n",
+ " \u001b[33moptional\u001b[0m=\u001b[3;91mFalse\u001b[0m,\n",
+ " \u001b[33mpreprocessing\u001b[0m=\u001b[1m[\u001b[0m\n",
+ " \u001b[1;35mEnsureDtypeDescr\u001b[0m\u001b[1m(\u001b[0m\u001b[33mid\u001b[0m=\u001b[32m'ensure_dtype'\u001b[0m, \u001b[33mkwargs\u001b[0m=\u001b[1;35mEnsureDtypeKwargs\u001b[0m\u001b[1m(\u001b[0m\u001b[33mdtype\u001b[0m=\u001b[32m'float32'\u001b[0m\u001b[1m)\u001b[0m\u001b[1m)\u001b[0m,\n",
+ " \u001b[1;35mZeroMeanUnitVarianceDescr\u001b[0m\u001b[1m(\u001b[0m\n",
+ " \u001b[33mid\u001b[0m=\u001b[32m'zero_mean_unit_variance'\u001b[0m,\n",
+ " \u001b[33mkwargs\u001b[0m=\u001b[1;35mZeroMeanUnitVarianceKwargs\u001b[0m\u001b[1m(\u001b[0m\u001b[33maxes\u001b[0m=\u001b[1m[\u001b[0m\u001b[32m'channel'\u001b[0m, \u001b[32m'y'\u001b[0m, \u001b[32m'x'\u001b[0m\u001b[1m]\u001b[0m, \u001b[33meps\u001b[0m=\u001b[1;36m1e\u001b[0m\u001b[1;36m-06\u001b[0m\u001b[1m)\u001b[0m\n",
+ " \u001b[1m)\u001b[0m,\n",
+ " \u001b[1;35mEnsureDtypeDescr\u001b[0m\u001b[1m(\u001b[0m\u001b[33mid\u001b[0m=\u001b[32m'ensure_dtype'\u001b[0m, \u001b[33mkwargs\u001b[0m=\u001b[1;35mEnsureDtypeKwargs\u001b[0m\u001b[1m(\u001b[0m\u001b[33mdtype\u001b[0m=\u001b[32m'float32'\u001b[0m\u001b[1m)\u001b[0m\u001b[1m)\u001b[0m\n",
+ " \u001b[1m]\u001b[0m\n",
+ " \u001b[1m)\u001b[0m\n",
+ " \u001b[1m]\u001b[0m,\n",
+ " \u001b[33moutputs\u001b[0m=\u001b[1m[\u001b[0m\n",
+ " \u001b[1;35mOutputTensorDescr\u001b[0m\u001b[1m(\u001b[0m\n",
+ " \u001b[33mid\u001b[0m=\u001b[32m'output0'\u001b[0m,\n",
+ " \u001b[33mdescription\u001b[0m=\u001b[32m''\u001b[0m,\n",
+ " \u001b[33maxes\u001b[0m=\u001b[1m[\u001b[0m\n",
+ " \u001b[1;35mBatchAxis\u001b[0m\u001b[1m(\u001b[0m\u001b[33mid\u001b[0m=\u001b[32m'batch'\u001b[0m, \u001b[33mdescription\u001b[0m=\u001b[32m''\u001b[0m, \u001b[33mtype\u001b[0m=\u001b[32m'batch'\u001b[0m, \u001b[33msize\u001b[0m=\u001b[3;35mNone\u001b[0m\u001b[1m)\u001b[0m,\n",
+ " \u001b[1;35mChannelAxis\u001b[0m\u001b[1m(\u001b[0m\u001b[33mid\u001b[0m=\u001b[32m'channel'\u001b[0m, \u001b[33mdescription\u001b[0m=\u001b[32m''\u001b[0m, \u001b[33mtype\u001b[0m=\u001b[32m'channel'\u001b[0m, \u001b[33mchannel_names\u001b[0m=\u001b[1m[\u001b[0m\u001b[32m'channel0'\u001b[0m, \u001b[32m'channel1'\u001b[0m\u001b[1m]\u001b[0m\u001b[1m)\u001b[0m,\n",
+ " \u001b[1;35mSpaceOutputAxisWithHalo\u001b[0m\u001b[1m(\u001b[0m\n",
+ " \u001b[33mhalo\u001b[0m=\u001b[1;36m16\u001b[0m,\n",
+ " \u001b[33msize\u001b[0m=\u001b[1;35mSizeReference\u001b[0m\u001b[1m(\u001b[0m\u001b[33mtensor_id\u001b[0m=\u001b[32m'input0'\u001b[0m, \u001b[33maxis_id\u001b[0m=\u001b[32m'y'\u001b[0m, \u001b[33moffset\u001b[0m=\u001b[1;36m0\u001b[0m\u001b[1m)\u001b[0m,\n",
+ " \u001b[33mid\u001b[0m=\u001b[32m'y'\u001b[0m,\n",
+ " \u001b[33mdescription\u001b[0m=\u001b[32m''\u001b[0m,\n",
+ " \u001b[33mtype\u001b[0m=\u001b[32m'space'\u001b[0m,\n",
+ " \u001b[33munit\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
+ " \u001b[33mscale\u001b[0m=\u001b[1;36m1\u001b[0m\u001b[1;36m.0\u001b[0m\n",
+ " \u001b[1m)\u001b[0m,\n",
+ " \u001b[1;35mSpaceOutputAxisWithHalo\u001b[0m\u001b[1m(\u001b[0m\n",
+ " \u001b[33mhalo\u001b[0m=\u001b[1;36m16\u001b[0m,\n",
+ " \u001b[33msize\u001b[0m=\u001b[1;35mSizeReference\u001b[0m\u001b[1m(\u001b[0m\u001b[33mtensor_id\u001b[0m=\u001b[32m'input0'\u001b[0m, \u001b[33maxis_id\u001b[0m=\u001b[32m'x'\u001b[0m, \u001b[33moffset\u001b[0m=\u001b[1;36m0\u001b[0m\u001b[1m)\u001b[0m,\n",
+ " \u001b[33mid\u001b[0m=\u001b[32m'x'\u001b[0m,\n",
+ " \u001b[33mdescription\u001b[0m=\u001b[32m''\u001b[0m,\n",
+ " \u001b[33mtype\u001b[0m=\u001b[32m'space'\u001b[0m,\n",
+ " \u001b[33munit\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
+ " \u001b[33mscale\u001b[0m=\u001b[1;36m1\u001b[0m\u001b[1;36m.0\u001b[0m\n",
+ " \u001b[1m)\u001b[0m\n",
+ " \u001b[1m]\u001b[0m,\n",
+ " \u001b[33mtest_tensor\u001b[0m=\u001b[1;35mFileDescr\u001b[0m\u001b[1m(\u001b[0m\n",
+ " \u001b[33msource\u001b[0m=\u001b[1;35mRelativeFilePath\u001b[0m\u001b[1m(\u001b[0m\u001b[33mroot\u001b[0m=\u001b[1;35mPureWindowsPath\u001b[0m\u001b[1m(\u001b[0m\u001b[32m'test_output_0.npy'\u001b[0m\u001b[1m)\u001b[0m\u001b[1m)\u001b[0m,\n",
+ " \u001b[33msha256\u001b[0m=\u001b[32m'510181f38930e59e4fd8ecc03d6ea7c980eb6609759655f2d4a41fe36108d5f5'\u001b[0m\n",
+ " \u001b[1m)\u001b[0m,\n",
+ " \u001b[33msample_tensor\u001b[0m=\u001b[1;35mFileDescr\u001b[0m\u001b[1m(\u001b[0m\n",
+ " \u001b[33msource\u001b[0m=\u001b[1;35mRelativeFilePath\u001b[0m\u001b[1m(\u001b[0m\u001b[33mroot\u001b[0m=\u001b[1;35mPureWindowsPath\u001b[0m\u001b[1m(\u001b[0m\u001b[32m'sample_output_0.tif'\u001b[0m\u001b[1m)\u001b[0m\u001b[1m)\u001b[0m,\n",
+ " \u001b[33msha256\u001b[0m=\u001b[32m'e8f99aabe8405427f515eba23a49f58ba50302f57d1fdfd07026e1984f836c5e'\u001b[0m\n",
+ " \u001b[1m)\u001b[0m,\n",
+ " \u001b[33mdata\u001b[0m=\u001b[1;35mIntervalOrRatioDataDescr\u001b[0m\u001b[1m(\u001b[0m\n",
+ " \u001b[33mtype\u001b[0m=\u001b[32m'float32'\u001b[0m,\n",
+ " \u001b[33mrange\u001b[0m=\u001b[1m(\u001b[0m\u001b[3;35mNone\u001b[0m, \u001b[3;35mNone\u001b[0m\u001b[1m)\u001b[0m,\n",
+ " \u001b[33munit\u001b[0m=\u001b[32m'arbitrary unit'\u001b[0m,\n",
+ " \u001b[33mscale\u001b[0m=\u001b[1;36m1\u001b[0m\u001b[1;36m.0\u001b[0m,\n",
+ " \u001b[33moffset\u001b[0m=\u001b[3;35mNone\u001b[0m\n",
+ " \u001b[1m)\u001b[0m,\n",
+ " \u001b[33mpostprocessing\u001b[0m=\u001b[1m[\u001b[0m\u001b[1;35mEnsureDtypeDescr\u001b[0m\u001b[1m(\u001b[0m\u001b[33mid\u001b[0m=\u001b[32m'ensure_dtype'\u001b[0m, \u001b[33mkwargs\u001b[0m=\u001b[1;35mEnsureDtypeKwargs\u001b[0m\u001b[1m(\u001b[0m\u001b[33mdtype\u001b[0m=\u001b[32m'float32'\u001b[0m\u001b[1m)\u001b[0m\u001b[1m)\u001b[0m\u001b[1m]\u001b[0m\n",
+ " \u001b[1m)\u001b[0m\n",
+ " \u001b[1m]\u001b[0m,\n",
+ " \u001b[33mpackaged_by\u001b[0m=\u001b[1m[\u001b[0m\u001b[1m]\u001b[0m,\n",
+ " \u001b[33mparent\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
+ " \u001b[33mrun_mode\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
+ " \u001b[33mtimestamp\u001b[0m=\u001b[1;35mDatetime\u001b[0m\u001b[1m(\u001b[0m\u001b[33mroot\u001b[0m=\u001b[1;35mdatetime\u001b[0m\u001b[1;35m.datetime\u001b[0m\u001b[1m(\u001b[0m\u001b[1;36m2022\u001b[0m, \u001b[1;36m6\u001b[0m, \u001b[1;36m15\u001b[0m, \u001b[1;36m20\u001b[0m, \u001b[1;36m6\u001b[0m, \u001b[1;36m22\u001b[0m, \u001b[1;36m658325\u001b[0m, \u001b[33mtzinfo\u001b[0m=\u001b[35mdatetime\u001b[0m.timezone.utc\u001b[1m)\u001b[0m\u001b[1m)\u001b[0m,\n",
+ " \u001b[33mtraining_data\u001b[0m=\u001b[1;35mLinkedDataset\u001b[0m\u001b[1m(\u001b[0m\u001b[33mversion\u001b[0m=\u001b[3;35mNone\u001b[0m, \u001b[33mid\u001b[0m=\u001b[32m'ilastik/stradist_dsb_training_data'\u001b[0m\u001b[1m)\u001b[0m,\n",
+ " \u001b[33mweights\u001b[0m=\u001b[1;35mWeightsDescr\u001b[0m\u001b[1m(\u001b[0m\n",
+ " \u001b[33mkeras_hdf5\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
+ " \u001b[33monnx\u001b[0m=\u001b[1;35mOnnxWeightsDescr\u001b[0m\u001b[1m(\u001b[0m\n",
+ " \u001b[33msource\u001b[0m=\u001b[1;35mRelativeFilePath\u001b[0m\u001b[1m(\u001b[0m\u001b[33mroot\u001b[0m=\u001b[1;35mPureWindowsPath\u001b[0m\u001b[1m(\u001b[0m\u001b[32m'weights.onnx'\u001b[0m\u001b[1m)\u001b[0m\u001b[1m)\u001b[0m,\n",
+ " \u001b[33msha256\u001b[0m=\u001b[32m'df913b85947f5132bcdaf81d91af0963f60d44f4caf8a4fec672d96a2f327b44'\u001b[0m,\n",
+ " \u001b[33mauthors\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
+ " \u001b[33mparent\u001b[0m=\u001b[32m'pytorch_state_dict'\u001b[0m,\n",
+ " \u001b[33mcomment\u001b[0m=\u001b[32m''\u001b[0m,\n",
+ " \u001b[33mopset_version\u001b[0m=\u001b[1;36m12\u001b[0m\n",
+ " \u001b[1m)\u001b[0m,\n",
+ " \u001b[33mpytorch_state_dict\u001b[0m=\u001b[1;35mPytorchStateDictWeightsDescr\u001b[0m\u001b[1m(\u001b[0m\n",
+ " \u001b[33msource\u001b[0m=\u001b[1;35mRelativeFilePath\u001b[0m\u001b[1m(\u001b[0m\u001b[33mroot\u001b[0m=\u001b[1;35mPureWindowsPath\u001b[0m\u001b[1m(\u001b[0m\u001b[32m'weights.pt'\u001b[0m\u001b[1m)\u001b[0m\u001b[1m)\u001b[0m,\n",
+ " \u001b[33msha256\u001b[0m=\u001b[32m'608f52cd7f5119f7a7b8272395b0c169714e8be34536eaf159820f72a1d6a5b7'\u001b[0m,\n",
+ " \u001b[33mauthors\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
+ " \u001b[33mparent\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
+ " \u001b[33mcomment\u001b[0m=\u001b[32m''\u001b[0m,\n",
+ " \u001b[33marchitecture\u001b[0m=\u001b[1;35mArchitectureFromFileDescr\u001b[0m\u001b[1m(\u001b[0m\n",
+ " \u001b[33msource\u001b[0m=\u001b[1;35mRelativeFilePath\u001b[0m\u001b[1m(\u001b[0m\u001b[33mroot\u001b[0m=\u001b[1;35mPureWindowsPath\u001b[0m\u001b[1m(\u001b[0m\u001b[32m'unet.py'\u001b[0m\u001b[1m)\u001b[0m\u001b[1m)\u001b[0m,\n",
+ " \u001b[33msha256\u001b[0m=\u001b[32m'7f5b15948e8e2c91f78dcff34fbf30af517073e91ba487f3edb982b948d099b3'\u001b[0m,\n",
+ " \u001b[33mcallable\u001b[0m=\u001b[32m'UNet2d'\u001b[0m,\n",
+ " \u001b[33mkwargs\u001b[0m=\u001b[1m{\u001b[0m\n",
+ " \u001b[32m'depth'\u001b[0m: \u001b[1;36m4\u001b[0m,\n",
+ " \u001b[32m'final_activation'\u001b[0m: \u001b[32m'Sigmoid'\u001b[0m,\n",
+ " \u001b[32m'gain'\u001b[0m: \u001b[1;36m2\u001b[0m,\n",
+ " \u001b[32m'in_channels'\u001b[0m: \u001b[1;36m1\u001b[0m,\n",
+ " \u001b[32m'initial_features'\u001b[0m: \u001b[1;36m64\u001b[0m,\n",
+ " \u001b[32m'out_channels'\u001b[0m: \u001b[1;36m2\u001b[0m,\n",
+ " \u001b[32m'postprocessing'\u001b[0m: \u001b[3;35mNone\u001b[0m,\n",
+ " \u001b[32m'return_side_outputs'\u001b[0m: \u001b[3;91mFalse\u001b[0m\n",
+ " \u001b[1m}\u001b[0m\n",
+ " \u001b[1m)\u001b[0m,\n",
+ " \u001b[33mpytorch_version\u001b[0m=\u001b[1;35mVersion\u001b[0m\u001b[1m(\u001b[0m\u001b[33mroot\u001b[0m=\u001b[32m'1.10'\u001b[0m\u001b[1m)\u001b[0m,\n",
+ " \u001b[33mdependencies\u001b[0m=\u001b[3;35mNone\u001b[0m\n",
+ " \u001b[1m)\u001b[0m,\n",
+ " \u001b[33mtensorflow_js\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
+ " \u001b[33mtensorflow_saved_model_bundle\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
+ " \u001b[33mtorchscript\u001b[0m=\u001b[1;35mTorchscriptWeightsDescr\u001b[0m\u001b[1m(\u001b[0m\n",
+ " \u001b[33msource\u001b[0m=\u001b[1;35mRelativeFilePath\u001b[0m\u001b[1m(\u001b[0m\u001b[33mroot\u001b[0m=\u001b[1;35mPureWindowsPath\u001b[0m\u001b[1m(\u001b[0m\u001b[32m'weights-torchscript.pt'\u001b[0m\u001b[1m)\u001b[0m\u001b[1m)\u001b[0m,\n",
+ " \u001b[33msha256\u001b[0m=\u001b[32m'8410950508655a300793b389c815dc30b1334062fc1dadb1e15e55a93cbb99a0'\u001b[0m,\n",
+ " \u001b[33mauthors\u001b[0m=\u001b[3;35mNone\u001b[0m,\n",
+ " \u001b[33mparent\u001b[0m=\u001b[32m'pytorch_state_dict'\u001b[0m,\n",
+ " \u001b[33mcomment\u001b[0m=\u001b[32m''\u001b[0m,\n",
+ " \u001b[33mpytorch_version\u001b[0m=\u001b[1;35mVersion\u001b[0m\u001b[1m(\u001b[0m\u001b[33mroot\u001b[0m=\u001b[32m'1.10'\u001b[0m\u001b[1m)\u001b[0m\n",
+ " \u001b[1m)\u001b[0m\n",
+ " \u001b[1m)\u001b[0m,\n",
+ " \u001b[33mconfig\u001b[0m=\u001b[1;35mConfig\u001b[0m\u001b[1m(\u001b[0m\n",
+ " \u001b[33mbioimageio\u001b[0m=\u001b[1;35mBioimageioConfig\u001b[0m\u001b[1m(\u001b[0m\n",
+ " \u001b[33mreproducibility_tolerance\u001b[0m=\u001b[1m(\u001b[0m\u001b[1m)\u001b[0m,\n",
+ " \u001b[33mnickname\u001b[0m=\u001b[32m'affable-shark'\u001b[0m,\n",
+ " \u001b[33mnickname_icon\u001b[0m=\u001b[32m'๐ฆ'\u001b[0m,\n",
+ " \u001b[33mthumbnails\u001b[0m=\u001b[1m{\u001b[0m\u001b[32m'cover.png'\u001b[0m: \u001b[32m'cover.thumbnail.png'\u001b[0m\u001b[1m}\u001b[0m\n",
+ " \u001b[1m)\u001b[0m,\n",
+ " \u001b[33m_conceptdoi\u001b[0m=\u001b[32m'10.5281/zenodo.5764892'\u001b[0m,\n",
+ " \u001b[33mdeepimagej\u001b[0m=\u001b[1m{\u001b[0m\n",
+ " \u001b[32m'allow_tiling'\u001b[0m: \u001b[3;92mTrue\u001b[0m,\n",
+ " \u001b[32m'model_keys'\u001b[0m: \u001b[3;35mNone\u001b[0m,\n",
+ " \u001b[32m'prediction'\u001b[0m: \u001b[1m{\u001b[0m\n",
+ " \u001b[32m'postprocess'\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m{\u001b[0m\u001b[32m'spec'\u001b[0m: \u001b[3;35mNone\u001b[0m\u001b[1m}\u001b[0m\u001b[1m]\u001b[0m,\n",
+ " \u001b[32m'preprocess'\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m{\u001b[0m\u001b[32m'kwargs'\u001b[0m: \u001b[32m'zero_mean_unit_variance.ijm'\u001b[0m, \u001b[32m'spec'\u001b[0m: \u001b[32m'ij.IJ::runMacroFile'\u001b[0m\u001b[1m}\u001b[0m\u001b[1m]\u001b[0m\n",
+ " \u001b[1m}\u001b[0m,\n",
+ " \u001b[32m'pyramidal_model'\u001b[0m: \u001b[3;91mFalse\u001b[0m,\n",
+ " \u001b[32m'test_information'\u001b[0m: \u001b[1m{\u001b[0m\n",
+ " \u001b[32m'inputs'\u001b[0m: \u001b[1m[\u001b[0m\n",
+ " \u001b[1m{\u001b[0m\n",
+ " \u001b[32m'name'\u001b[0m: \u001b[32m'sample_input_0.tif'\u001b[0m,\n",
+ " \u001b[32m'pixel_size'\u001b[0m: \u001b[1m{\u001b[0m\u001b[32m'x'\u001b[0m: \u001b[1;36m1\u001b[0m, \u001b[32m'y'\u001b[0m: \u001b[1;36m1\u001b[0m, \u001b[32m'z'\u001b[0m: \u001b[1;36m1\u001b[0m\u001b[1m}\u001b[0m,\n",
+ " \u001b[32m'size'\u001b[0m: \u001b[32m'256 x 256 x 1 x 1'\u001b[0m\n",
+ " \u001b[1m}\u001b[0m\n",
+ " \u001b[1m]\u001b[0m,\n",
+ " \u001b[32m'memory_peak'\u001b[0m: \u001b[3;35mNone\u001b[0m,\n",
+ " \u001b[32m'outputs'\u001b[0m: \u001b[1m[\u001b[0m\u001b[1m{\u001b[0m\u001b[32m'name'\u001b[0m: \u001b[32m'sample_output_0.tif'\u001b[0m, \u001b[32m'size'\u001b[0m: \u001b[32m'256 x 256 x 1 x 2'\u001b[0m, \u001b[32m'type'\u001b[0m: \u001b[32m'image'\u001b[0m\u001b[1m}\u001b[0m\u001b[1m]\u001b[0m,\n",
+ " \u001b[32m'runtime'\u001b[0m: \u001b[3;35mNone\u001b[0m\n",
+ " \u001b[1m}\u001b[0m\n",
+ " \u001b[1m}\u001b[0m\n",
+ " \u001b[1m)\u001b[0m\n",
+ "\u001b[1m)\u001b[0m\n"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
"source": [
- "pprint(model)"
+ "from rich import print\n",
+ "\n",
+ "print(model)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We can use this metadata programmatically to explore and deploy (next section) the model. \n",
+ "For example we can checkout the model's cover images.\n",
+ "For a step-by-step inspection of other metadata fields, please refer to the [bioimageio.spec example notebook](https://github.com/bioimage-io/spec-bioimage-io/blob/main/example/load_model_and_create_your_own.ipynb)."
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 7,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ " 0%| | 0.00/89.1k [00:00, ?B/s]\n",
+ " 0%| | 0.00/89.1k [00:00, ?B/s]\n",
+ "\n",
+ "Downloading cover.png: 89114it [00:00, 17813897.94it/s]\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "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BQsWBG1uGUIIZyXOzB30EEJoGXbt2kWmTp1K2rVrR3Q6HXMv+MQTT3h59HG73eTll18mnTp1IlqtlsTGxpLJkyczd5ZiPProowQASUtLY558xPj+++/JsGHDSHh4ONHr9SQ9PZ1cddVVXu5dp06dSsxmc8D1kfM6xXs3okhPTyeXXHKJz3OIPC3V1NSQm266icTHxxOTyUTOP/988vvvv5MhQ4b4eHvat28fueiii4jBYCDR0dHkpptuIp988gkBQHbv3u2VdsOGDeSSSy4h0dHRRKvVkpSUFHLJJZeQr7/+2m89qTcuqX+BeAHau3cvGT9+PImIiCA6nY706tVL1ttTW3idEuO6664jAHz6pa6ujtx8880kISGBmM1mMn78eJKfny/pJebAgQNk4sSJJCYmhuh0OtKuXTsybdo05hpTynMUIafcMF999dUkPj6eaLVakpiYSIYPH04WLFjA0kh9+95775ErrriCtG/fnphMJqLT6UhWVha5/fbbJefBxx9/TAYOHEjMZjMxGo0kKyuLTJkyxcv7mcfjIc899xxJTU0lOp2O9OzZkyxbtoz06tXLy0MQ790nkDZ+8sknCQDmSjYYmuTmi9gLFCGELF26lHTp0oVotVqvPiosLCRXXnkliYqKImFhYWT06NFk3759Pl6XCCFk3rx5JDMzk6jVaq/xK1Vec3MzmTVrFklPTydarZYkJSWRGTNmkJqaGq90cnNbPGelvE6ZzWbSrVs38uSTT5K6uroWlW+328lDDz1E0tLSiNFoJEOGDCG7du2S9Tol7j+p8We328kDDzxA4uPjicFgIIMGDSKbNm3yydNut5OZM2eSlJQUYjAYSN++fcn333/v057U69Qrr7zi0048pk2bRjQaDSksLPR5JzcuxRB7nSIkuLYMpN6EEFJRUUHuuecekpmZSbRaLYmOjib9+vUjjz32GGlsbGTppNaTEEL4p0Ag5P9dNIQQQgghALj11luxdOlSVFVVnVaTqBD+HTh+/Di6dOmCJ598Eo8++uiZJieE/2E4HA5kZGTg/PPPb7W3uBBCCKFtEDKdCiGE/2E888wzSE5ORvv27dHY2Ihly5bhww8/DNjsIIT/LezevRtLly7F4MGDER4ejsOHD2POnDkIDw9nplghhPB3o6KiAocPH8bChQtRVlbmdak/hBBCOLMICRohhPA/DK1W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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
"source": [
- "print(f\"\\n Covers of the model '{model.name}' are: \")\n",
- "for cover in model.covers:\n",
- " cover_data = imread(download(cover).path)\n",
- " plt.figure(figsize=(10, 10))\n",
- " plt.imshow(cover_data)\n",
- " plt.xticks([])\n",
- " plt.yticks([])\n",
- " plt.show()"
+ "from bioimageio.core.io import load_image\n",
+ "import matplotlib.pyplot as plt\n",
+ "\n",
+ "for i, cover in enumerate(model.covers):\n",
+ " cover_data = load_image(cover)\n",
+ " _ = plt.figure(figsize=(10, 10))\n",
+ " _ = plt.imshow(cover_data)\n",
+ " _ = plt.xticks([])\n",
+ " _ = plt.yticks([])\n",
+ " _ = plt.title(f\"Cover image {i+1} of '{model.name}'\")\n",
+ " _ = plt.show()"
]
},
{
@@ -260,29 +765,798 @@
"\n",
"----\n",
"\n",
- "`bioimageio.core.test_model` returns a validation dictionary with 'status'='passed'/'failed' and other detailed information that can be inspected by calling `.display()` on it.\n",
+ "`bioimageio.core.test_model` returns a validation dictionary with `status='passed'/'failed'` and other detailed information that can be inspected by calling `.display()` on it.\n",
+ "The validation sumary may also be saved (`.save()`) as JSON, Markdown or HTML file.\n",
+ "Validation summaries may be loaded from json (`.load_json()`).\n",
"\n",
"The validation summary will indicate:\n",
"- the versions of the `bioimageio.spec` and `bioimageio.core` libraries used to run the validation\n",
"- the status of several validation steps\n",
" - โ๏ธ: Success\n",
- " - ๐: information about the validation context\n",
" - โ : Warning\n",
" - โ: Error"
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 8,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "\u001b[32m2025-04-02 16:57:44.264\u001b[0m | \u001b[34m\u001b[1mDEBUG \u001b[0m | \u001b[36mbioimageio.core._resource_tests\u001b[0m:\u001b[36m_test_model_inference\u001b[0m:\u001b[36m593\u001b[0m - \u001b[34m\u001b[1mstarting 'Reproduce test outputs from test inputs (onnx)'\u001b[0m\n",
+ " 0%| | 0.00/116M [00:00, ?B/s]\n",
+ " 0%| | 0.00/116M [00:00, ?B/s]\n",
+ "\n",
+ "Downloading weights.onnx: 747520it [00:00, 7457356.27it/s]\u001b[A\n",
+ "Downloading weights.onnx: 1494016it [00:00, 5640249.61it/s]\u001b[A\n",
+ "Downloading weights.onnx: 2084864it [00:00, 5003463.79it/s]\u001b[A\n",
+ "Downloading weights.onnx: 2656256it [00:00, 5211926.35it/s]\u001b[A\n",
+ "Downloading weights.onnx: 3191808it [00:00, 3923556.48it/s]\u001b[A\n",
+ "Downloading weights.onnx: 3627008it [00:00, 3752310.19it/s]\u001b[A\n",
+ "Downloading weights.onnx: 4029440it [00:01, 2879318.34it/s]\u001b[A\n",
+ "Downloading weights.onnx: 4357120it [00:01, 2793145.91it/s]\u001b[A\n",
+ "Downloading weights.onnx: 4864000it [00:01, 3137680.94it/s]\u001b[A\n",
+ "Downloading weights.onnx: 5568512it [00:01, 4037576.22it/s]\u001b[A\n",
+ "Downloading weights.onnx: 6202368it [00:01, 4388215.33it/s]\u001b[A\n",
+ "Downloading weights.onnx: 6675456it [00:01, 4308212.74it/s]\u001b[A\n",
+ "Downloading weights.onnx: 7178240it [00:01, 4488625.22it/s]\u001b[A\n",
+ "Downloading weights.onnx: 7905280it [00:01, 5140979.02it/s]\u001b[A\n",
+ "Downloading weights.onnx: 8581120it [00:01, 5449346.08it/s]\u001b[A\n",
+ "Downloading weights.onnx: 9140224it [00:02, 5145952.55it/s]\u001b[A\n",
+ "Downloading weights.onnx: 9666560it [00:02, 5123670.63it/s]\u001b[A\n",
+ "Downloading weights.onnx: 10215424it [00:02, 5207147.43it/s]\u001b[A\n",
+ "Downloading weights.onnx: 10818560it [00:02, 5431647.78it/s]\u001b[A\n",
+ "Downloading weights.onnx: 11367424it [00:02, 5033995.04it/s]\u001b[A\n",
+ "Downloading weights.onnx: 12201984it [00:02, 5816593.70it/s]\u001b[A\n",
+ "Downloading weights.onnx: 12792832it [00:02, 5699246.20it/s]\u001b[A\n",
+ "Downloading weights.onnx: 13557760it [00:02, 6132405.30it/s]\u001b[A\n",
+ "Downloading weights.onnx: 14249984it [00:02, 6225987.98it/s]\u001b[A\n",
+ "Downloading weights.onnx: 14876672it [00:03, 5807525.87it/s]\u001b[A\n",
+ "Downloading weights.onnx: 15670272it [00:03, 6051735.67it/s]\u001b[A\n",
+ "Downloading weights.onnx: 16279552it [00:03, 5453016.86it/s]\u001b[A\n",
+ "Downloading weights.onnx: 16945152it [00:03, 5491399.11it/s]\u001b[A\n",
+ "Downloading weights.onnx: 17590272it [00:03, 5598958.35it/s]\u001b[A\n",
+ "Downloading weights.onnx: 18156544it [00:03, 5360464.56it/s]\u001b[A\n",
+ "Downloading weights.onnx: 18704384it [00:03, 5389189.81it/s]\u001b[A\n",
+ "Downloading weights.onnx: 19247104it [00:03, 4824748.42it/s]\u001b[A\n",
+ "Downloading weights.onnx: 19757056it [00:04, 4889333.50it/s]\u001b[A\n",
+ "Downloading weights.onnx: 20254720it [00:04, 4535987.42it/s]\u001b[A\n",
+ "Downloading weights.onnx: 20717568it [00:04, 3718293.09it/s]\u001b[A\n",
+ "Downloading weights.onnx: 21115904it [00:04, 3683192.89it/s]\u001b[A\n",
+ "Downloading weights.onnx: 21735424it [00:04, 4142190.80it/s]\u001b[A\n",
+ "Downloading weights.onnx: 22410240it [00:04, 4723752.57it/s]\u001b[A\n",
+ "Downloading weights.onnx: 22902784it [00:04, 4636206.05it/s]\u001b[A\n",
+ "Downloading weights.onnx: 23397376it [00:04, 4690370.05it/s]\u001b[A\n",
+ "Downloading weights.onnx: 23876608it [00:05, 4493356.55it/s]\u001b[A\n",
+ "Downloading weights.onnx: 24560640it [00:05, 5122858.04it/s]\u001b[A\n",
+ "Downloading weights.onnx: 25628672it [00:05, 6664966.49it/s]\u001b[A\n",
+ "Downloading weights.onnx: 26314752it [00:05, 5641898.14it/s]\u001b[A\n",
+ "Downloading weights.onnx: 26917888it [00:05, 5511901.97it/s]\u001b[A\n",
+ "Downloading weights.onnx: 27495424it [00:05, 5166688.36it/s]\u001b[A\n",
+ "Downloading weights.onnx: 28290048it [00:05, 5865978.94it/s]\u001b[A\n",
+ "Downloading weights.onnx: 28903424it [00:05, 5172856.67it/s]\u001b[A\n",
+ "Downloading weights.onnx: 29713408it [00:05, 5884755.83it/s]\u001b[A\n",
+ "Downloading weights.onnx: 30639104it [00:06, 6748463.38it/s]\u001b[A\n",
+ "Downloading weights.onnx: 31529984it [00:06, 7261889.31it/s]\u001b[A\n",
+ "Downloading weights.onnx: 32351232it [00:06, 7406924.35it/s]\u001b[A\n",
+ "Downloading weights.onnx: 33113088it [00:06, 7006432.93it/s]\u001b[A\n",
+ "Downloading weights.onnx: 34101248it [00:06, 7782871.94it/s]\u001b[A\n",
+ "Downloading weights.onnx: 35035136it [00:06, 8202863.30it/s]\u001b[A\n",
+ "Downloading weights.onnx: 35872768it [00:06, 8151952.36it/s]\u001b[A\n",
+ "Downloading weights.onnx: 36700160it [00:06, 6539430.01it/s]\u001b[A\n",
+ "Downloading weights.onnx: 37411840it [00:07, 6358759.98it/s]\u001b[A\n",
+ "Downloading weights.onnx: 38086656it [00:07, 6332002.65it/s]\u001b[A\n",
+ "Downloading weights.onnx: 38747136it [00:07, 6133307.64it/s]\u001b[A\n",
+ "Downloading weights.onnx: 39543808it [00:07, 6573190.31it/s]\u001b[A\n",
+ "Downloading weights.onnx: 40219648it [00:07, 6317514.75it/s]\u001b[A\n",
+ "Downloading weights.onnx: 40864768it [00:07, 6304207.62it/s]\u001b[A\n",
+ "Downloading weights.onnx: 41504768it [00:07, 6328402.40it/s]\u001b[A\n",
+ "Downloading weights.onnx: 42632192it [00:07, 7465112.01it/s]\u001b[A\n",
+ "Downloading weights.onnx: 43860992it [00:07, 8815127.66it/s]\u001b[A\n",
+ "Downloading weights.onnx: 44992512it [00:08, 9504099.39it/s]\u001b[A\n",
+ "Downloading weights.onnx: 46254080it [00:08, 10387934.46it/s]\u001b[A\n",
+ "Downloading weights.onnx: 47302656it [00:08, 9138494.71it/s] \u001b[A\n",
+ "Downloading weights.onnx: 48273408it [00:08, 9281755.37it/s]\u001b[A\n",
+ "Downloading weights.onnx: 49360896it [00:08, 9427531.89it/s]\u001b[A\n",
+ "Downloading weights.onnx: 50631680it [00:08, 10315502.07it/s]\u001b[A\n",
+ "Downloading weights.onnx: 51682304it [00:08, 9590561.32it/s] \u001b[A\n",
+ "Downloading weights.onnx: 52663296it [00:08, 6490448.02it/s]\u001b[A\n",
+ "Downloading weights.onnx: 54035456it [00:09, 7979632.17it/s]\u001b[A\n",
+ "Downloading weights.onnx: 55419904it [00:09, 9309806.80it/s]\u001b[A\n",
+ "Downloading weights.onnx: 56783872it [00:09, 10370883.25it/s]\u001b[A\n",
+ "Downloading weights.onnx: 57970688it [00:09, 10717484.29it/s]\u001b[A\n",
+ "Downloading weights.onnx: 59141120it [00:09, 10754681.66it/s]\u001b[A\n",
+ "Downloading weights.onnx: 60487680it [00:09, 11496754.05it/s]\u001b[A\n",
+ "Downloading weights.onnx: 62031872it [00:09, 12581063.53it/s]\u001b[A\n",
+ "Downloading weights.onnx: 63431680it [00:09, 12972844.52it/s]\u001b[A\n",
+ "Downloading weights.onnx: 64997376it [00:09, 13746808.08it/s]\u001b[A\n",
+ "Downloading weights.onnx: 66398208it [00:10, 12873549.50it/s]\u001b[A\n",
+ "Downloading weights.onnx: 67929088it [00:10, 13555558.33it/s]\u001b[A\n",
+ "Downloading weights.onnx: 69401600it [00:10, 13889888.96it/s]\u001b[A\n",
+ "Downloading weights.onnx: 71205888it [00:10, 15091125.77it/s]\u001b[A\n",
+ "Downloading weights.onnx: 72782848it [00:10, 15270183.61it/s]\u001b[A\n",
+ "Downloading weights.onnx: 74322944it [00:10, 13531120.17it/s]\u001b[A\n",
+ "Downloading weights.onnx: 76383232it [00:10, 15436055.08it/s]\u001b[A\n",
+ "Downloading weights.onnx: 78266368it [00:10, 16375638.02it/s]\u001b[A\n",
+ "Downloading weights.onnx: 80284672it [00:10, 17455574.18it/s]\u001b[A\n",
+ "Downloading weights.onnx: 82224128it [00:10, 17977952.75it/s]\u001b[A\n",
+ "Downloading weights.onnx: 84048896it [00:11, 15885686.17it/s]\u001b[A\n",
+ "Downloading weights.onnx: 86522880it [00:11, 18223227.50it/s]\u001b[A\n",
+ "Downloading weights.onnx: 88441856it [00:11, 18452125.62it/s]\u001b[A\n",
+ "Downloading weights.onnx: 90688512it [00:11, 19554632.14it/s]\u001b[A\n",
+ "Downloading weights.onnx: 93255680it [00:11, 21310912.71it/s]\u001b[A\n",
+ "Downloading weights.onnx: 95423488it [00:11, 20239294.45it/s]\u001b[A\n",
+ "Downloading weights.onnx: 98495488it [00:11, 23189305.42it/s]\u001b[A\n",
+ "Downloading weights.onnx: 100857856it [00:11, 21696860.11it/s]\u001b[A\n",
+ "Downloading weights.onnx: 103231488it [00:11, 22255986.78it/s]\u001b[A\n",
+ "Downloading weights.onnx: 105494528it [00:12, 21838479.91it/s]\u001b[A\n",
+ "Downloading weights.onnx: 107705344it [00:12, 17520936.37it/s]\u001b[A\n",
+ "Downloading weights.onnx: 109604864it [00:12, 17574392.77it/s]\u001b[A\n",
+ "Downloading weights.onnx: 111705088it [00:12, 18405804.51it/s]\u001b[A\n",
+ "Downloading weights.onnx: 113632256it [00:12, 15202236.72it/s]\u001b[A\n",
+ "Downloading weights.onnx: 115294208it [00:12, 14940717.92it/s]\u001b[A\n",
+ "Downloading weights.onnx: 115839324it [00:00, 23161812461.77it/s]\n",
+ "C:\\repos\\bioimage-io\\core-bioimage-io-python\\bioimageio\\core\\backends\\onnx_backend.py:51: UserWarning: Device management is not implemented for onnx yet, cannot unload model\n",
+ " warnings.warn(\n",
+ "\u001b[32m2025-04-02 16:58:00.933\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mbioimageio.core._resource_tests\u001b[0m:\u001b[36m_test_model_inference_parametrized\u001b[0m:\u001b[36m705\u001b[0m - \u001b[1mTesting inference with 6 different inputs (B, N): {(1, 2), (2, 1), (1, 1), (2, 0), (2, 2), (1, 0)}\u001b[0m\n",
+ " 0%| | 0.00/116M [00:00, ?B/s]\n",
+ " 0%| | 0.00/116M [00:00, ?B/s]\n",
+ "\n",
+ "Downloading weights.onnx: 1213440it [00:00, 11925824.10it/s]\u001b[A\n",
+ "Downloading weights.onnx: 4080640it [00:00, 20426786.71it/s]\u001b[A\n",
+ "Downloading weights.onnx: 7800832it [00:00, 26856081.00it/s]\u001b[A\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "Downloading weights.onnx: 11738112it [00:00, 30494902.93it/s]\u001b[A\n",
+ "Downloading weights.onnx: 15595520it [00:00, 32514206.82it/s]\u001b[A\n",
+ "Downloading weights.onnx: 18839552it [00:00, 31371778.59it/s]\u001b[A\n",
+ "Downloading weights.onnx: 23169024it [00:00, 34021512.63it/s]\u001b[A\n",
+ "Downloading weights.onnx: 27544576it [00:00, 35884769.59it/s]\u001b[A\n",
+ "Downloading weights.onnx: 31130624it [00:01, 28918307.90it/s]\u001b[A\n",
+ "Downloading weights.onnx: 34211840it [00:01, 28421154.75it/s]\u001b[A\n",
+ "Downloading weights.onnx: 37179392it [00:01, 27274237.67it/s]\u001b[A\n",
+ "Downloading weights.onnx: 41015296it [00:01, 30001068.43it/s]\u001b[A\n",
+ "Downloading weights.onnx: 44786688it [00:01, 32036752.85it/s]\u001b[A\n",
+ "Downloading weights.onnx: 48084992it [00:01, 28120950.01it/s]\u001b[A\n",
+ "Downloading weights.onnx: 51550208it [00:01, 29033171.23it/s]\u001b[A\n",
+ "Downloading weights.onnx: 54559744it [00:01, 27212068.64it/s]\u001b[A\n",
+ "Downloading weights.onnx: 57363456it [00:01, 27317758.33it/s]\u001b[A\n",
+ "Downloading weights.onnx: 60654592it [00:02, 28780403.90it/s]\u001b[A\n",
+ "Downloading weights.onnx: 63590400it [00:02, 28688697.48it/s]\u001b[A\n",
+ "Downloading weights.onnx: 66499584it [00:02, 24436743.49it/s]\u001b[A\n",
+ "Downloading weights.onnx: 69095424it [00:02, 24818039.74it/s]\u001b[A\n",
+ "Downloading weights.onnx: 72160256it [00:02, 26339440.72it/s]\u001b[A\n",
+ "Downloading weights.onnx: 74880000it [00:02, 23996105.76it/s]\u001b[A\n",
+ "Downloading weights.onnx: 78693376it [00:02, 27377011.52it/s]\u001b[A\n",
+ "Downloading weights.onnx: 82987008it [00:02, 31444232.46it/s]\u001b[A\n",
+ "Downloading weights.onnx: 86346752it [00:02, 31722329.01it/s]\u001b[A\n",
+ "Downloading weights.onnx: 91658240it [00:03, 36658059.60it/s]\u001b[A\n",
+ "Downloading weights.onnx: 95374336it [00:03, 34233433.00it/s]\u001b[A\n",
+ "Downloading weights.onnx: 98855936it [00:03, 32105913.59it/s]\u001b[A\n",
+ "Downloading weights.onnx: 102121472it [00:03, 27457034.48it/s]\u001b[A\n",
+ "Downloading weights.onnx: 105535488it [00:03, 28979784.42it/s]\u001b[A\n",
+ "Downloading weights.onnx: 108558336it [00:03, 28991133.23it/s]\u001b[A\n",
+ "Downloading weights.onnx: 111545344it [00:03, 27989996.65it/s]\u001b[A\n",
+ "Downloading weights.onnx: 114405376it [00:03, 25987279.27it/s]\u001b[A\n",
+ "Downloading weights.onnx: 115839324it [00:00, 19230006333.04it/s]\n",
+ "C:\\repos\\bioimage-io\\core-bioimage-io-python\\bioimageio\\core\\backends\\onnx_backend.py:51: UserWarning: Device management is not implemented for onnx yet, cannot unload model\n",
+ " warnings.warn(\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "โญโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ Traceback (most recent call last) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฎ \n",
+ "โ C:\\repos\\bioimage-io\\core-bioimage-io-python\\bioimageio\\core\\_resource_tests.py :768 in _test_mod โ \n",
+ "โ โ \n",
+ "โ 765 โ โ ) as prediction_pipeline: โ \n",
+ "โ 766 โ โ โ for n, batch_size, inputs, exptected_output_shape in generate_test_cases(): โ \n",
+ "โ 767 โ โ โ โ error: Optional[str ] = None โ \n",
+ "โ โฑ 768 โ โ โ โ result = prediction_pipeline.predict_sample_without_blocking(inputs) โ \n",
+ "โ 769 โ โ โ โ if len (result.members) != len (exptected_output_shape): โ \n",
+ "โ 770 โ โ โ โ โ error = ( โ \n",
+ "โ 771 โ โ โ โ โ โ f\"Expected { len (exptected_output_shape)} outputs,\" โ \n",
+ "โ โ \n",
+ "โ C:\\repos\\bioimage-io\\core-bioimage-io-python\\bioimageio\\core\\_prediction_pipeline.py :160 in pred โ \n",
+ "โ โ \n",
+ "โ 157 โ โ if not skip_preprocessing: โ \n",
+ "โ 158 โ โ โ self .apply_preprocessing(sample) โ \n",
+ "โ 159 โ โ โ \n",
+ "โ โฑ 160 โ โ output = self ._adapter.forward(sample) โ \n",
+ "โ 161 โ โ if not skip_postprocessing: โ \n",
+ "โ 162 โ โ โ self .apply_postprocessing(output) โ \n",
+ "โ 163 โ \n",
+ "โ โ \n",
+ "โ C:\\repos\\bioimage-io\\core-bioimage-io-python\\bioimageio\\core\\backends\\_model_adapter.py :205 in f โ \n",
+ "โ โ \n",
+ "โ 202 โ โ โ ) โ \n",
+ "โ 203 โ โ โ for in_id, in_order in zip (self ._input_ids, self ._input_axes) โ \n",
+ "โ 204 โ โ ] โ \n",
+ "โ โฑ 205 โ โ output_arrays = self ._forward_impl(input_arrays) โ \n",
+ "โ 206 โ โ assert len (output_arrays) <= len (self ._output_ids) โ \n",
+ "โ 207 โ โ output_tensors = [ โ \n",
+ "โ 208 โ โ โ None if a is None else Tensor(a, dims=d) โ \n",
+ "โ โ \n",
+ "โ C:\\repos\\bioimage-io\\core-bioimage-io-python\\bioimageio\\core\\backends\\onnx_backend.py :40 in _for โ \n",
+ "โ โ \n",
+ "โ 37 โ def _forward_impl ( โ \n",
+ "โ 38 โ โ self , input_arrays: Sequence[Optional[NDArray[Any]]] โ \n",
+ "โ 39 โ ) -> List[Optional[NDArray[Any]]]: โ \n",
+ "โ โฑ 40 โ โ result: Any = self ._session.run( โ \n",
+ "โ 41 โ โ โ None , dict ( zip ( self ._input_names, input_arrays)) โ \n",
+ "โ 42 โ โ ) โ \n",
+ "โ 43 โ โ if is_list(result) or is_tuple(result): โ \n",
+ "โ โ \n",
+ "โ C:\\Users\\fbeut\\miniforge3\\envs\\core\\Lib\\site-packages\\onnxruntime\\capi\\onnxruntime_inference_col โ \n",
+ "โ โ \n",
+ "โ 263 โ โ if not output_names: โ \n",
+ "โ 264 โ โ โ output_names = [output.name for output in self ._outputs_meta] โ \n",
+ "โ 265 โ โ try : โ \n",
+ "โ โฑ 266 โ โ โ return self ._sess.run(output_names, input_feed, run_options) โ \n",
+ "โ 267 โ โ except C.EPFail as err: โ \n",
+ "โ 268 โ โ โ if self ._enable_fallback: โ \n",
+ "โ 269 โ โ โ โ print (f\"EP Error: { err!s} using { self ._providers}\" ) โ \n",
+ "โฐโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฏ \n",
+ "InvalidArgument: [ ONNXRuntimeError] : 2 : INVALID_ARGUMENT : Got invalid dimensions for input: input.1 for the following indices\n",
+ " index: 2 Got: 64 Expected: 256 \n",
+ " index: 3 Got: 64 Expected: 256 \n",
+ " Please fix either the inputs/outputs or the model.\n",
+ " \n"
+ ],
+ "text/plain": [
+ "\u001b[31mโญโ\u001b[0m\u001b[31mโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\u001b[0m\u001b[31m \u001b[0m\u001b[1;31mTraceback \u001b[0m\u001b[1;2;31m(most recent call last)\u001b[0m\u001b[31m \u001b[0m\u001b[31mโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\u001b[0m\u001b[31mโโฎ\u001b[0m\n",
+ "\u001b[31mโ\u001b[0m \u001b[33mC:\\repos\\bioimage-io\\core-bioimage-io-python\\bioimageio\\core\\_resource_tests.py\u001b[0m:\u001b[94m768\u001b[0m in \u001b[92m_test_mod\u001b[0m \u001b[31mโ\u001b[0m\n",
+ "\u001b[31mโ\u001b[0m \u001b[31mโ\u001b[0m\n",
+ "\u001b[31mโ\u001b[0m \u001b[2m765 \u001b[0m\u001b[2mโ โ \u001b[0m) \u001b[94mas\u001b[0m prediction_pipeline: \u001b[31mโ\u001b[0m\n",
+ "\u001b[31mโ\u001b[0m \u001b[2m766 \u001b[0m\u001b[2mโ โ โ \u001b[0m\u001b[94mfor\u001b[0m n, batch_size, inputs, exptected_output_shape \u001b[95min\u001b[0m generate_test_cases(): \u001b[31mโ\u001b[0m\n",
+ "\u001b[31mโ\u001b[0m \u001b[2m767 \u001b[0m\u001b[2mโ โ โ โ \u001b[0merror: Optional[\u001b[96mstr\u001b[0m] = \u001b[94mNone\u001b[0m \u001b[31mโ\u001b[0m\n",
+ "\u001b[31mโ\u001b[0m \u001b[31mโฑ \u001b[0m768 \u001b[2mโ โ โ โ \u001b[0mresult = prediction_pipeline.predict_sample_without_blocking(inputs) \u001b[31mโ\u001b[0m\n",
+ "\u001b[31mโ\u001b[0m \u001b[2m769 \u001b[0m\u001b[2mโ โ โ โ \u001b[0m\u001b[94mif\u001b[0m \u001b[96mlen\u001b[0m(result.members) != \u001b[96mlen\u001b[0m(exptected_output_shape): \u001b[31mโ\u001b[0m\n",
+ "\u001b[31mโ\u001b[0m \u001b[2m770 \u001b[0m\u001b[2mโ โ โ โ โ \u001b[0merror = ( \u001b[31mโ\u001b[0m\n",
+ "\u001b[31mโ\u001b[0m \u001b[2m771 \u001b[0m\u001b[2mโ โ โ โ โ โ \u001b[0m\u001b[33mf\u001b[0m\u001b[33m\"\u001b[0m\u001b[33mExpected \u001b[0m\u001b[33m{\u001b[0m\u001b[96mlen\u001b[0m(exptected_output_shape)\u001b[33m}\u001b[0m\u001b[33m outputs,\u001b[0m\u001b[33m\"\u001b[0m \u001b[31mโ\u001b[0m\n",
+ "\u001b[31mโ\u001b[0m \u001b[31mโ\u001b[0m\n",
+ "\u001b[31mโ\u001b[0m \u001b[33mC:\\repos\\bioimage-io\\core-bioimage-io-python\\bioimageio\\core\\_prediction_pipeline.py\u001b[0m:\u001b[94m160\u001b[0m in \u001b[92mpred\u001b[0m \u001b[31mโ\u001b[0m\n",
+ "\u001b[31mโ\u001b[0m \u001b[31mโ\u001b[0m\n",
+ "\u001b[31mโ\u001b[0m \u001b[2m157 \u001b[0m\u001b[2mโ โ \u001b[0m\u001b[94mif\u001b[0m \u001b[95mnot\u001b[0m skip_preprocessing: \u001b[31mโ\u001b[0m\n",
+ "\u001b[31mโ\u001b[0m \u001b[2m158 \u001b[0m\u001b[2mโ โ โ \u001b[0m\u001b[96mself\u001b[0m.apply_preprocessing(sample) \u001b[31mโ\u001b[0m\n",
+ "\u001b[31mโ\u001b[0m \u001b[2m159 \u001b[0m\u001b[2mโ โ \u001b[0m \u001b[31mโ\u001b[0m\n",
+ "\u001b[31mโ\u001b[0m \u001b[31mโฑ \u001b[0m160 \u001b[2mโ โ \u001b[0moutput = \u001b[1;4;96mself\u001b[0m\u001b[1;4m._adapter.forward(sample)\u001b[0m \u001b[31mโ\u001b[0m\n",
+ "\u001b[31mโ\u001b[0m \u001b[2m161 \u001b[0m\u001b[2mโ โ \u001b[0m\u001b[94mif\u001b[0m \u001b[95mnot\u001b[0m skip_postprocessing: \u001b[31mโ\u001b[0m\n",
+ "\u001b[31mโ\u001b[0m \u001b[2m162 \u001b[0m\u001b[2mโ โ โ \u001b[0m\u001b[96mself\u001b[0m.apply_postprocessing(output) \u001b[31mโ\u001b[0m\n",
+ "\u001b[31mโ\u001b[0m \u001b[2m163 \u001b[0m \u001b[31mโ\u001b[0m\n",
+ "\u001b[31mโ\u001b[0m \u001b[31mโ\u001b[0m\n",
+ "\u001b[31mโ\u001b[0m \u001b[33mC:\\repos\\bioimage-io\\core-bioimage-io-python\\bioimageio\\core\\backends\\_model_adapter.py\u001b[0m:\u001b[94m205\u001b[0m in \u001b[92mf\u001b[0m \u001b[31mโ\u001b[0m\n",
+ "\u001b[31mโ\u001b[0m \u001b[31mโ\u001b[0m\n",
+ "\u001b[31mโ\u001b[0m \u001b[2m202 \u001b[0m\u001b[2mโ โ โ \u001b[0m) \u001b[31mโ\u001b[0m\n",
+ "\u001b[31mโ\u001b[0m \u001b[2m203 \u001b[0m\u001b[2mโ โ โ \u001b[0m\u001b[94mfor\u001b[0m in_id, in_order \u001b[95min\u001b[0m \u001b[96mzip\u001b[0m(\u001b[96mself\u001b[0m._input_ids, \u001b[96mself\u001b[0m._input_axes) \u001b[31mโ\u001b[0m\n",
+ "\u001b[31mโ\u001b[0m \u001b[2m204 \u001b[0m\u001b[2mโ โ \u001b[0m] \u001b[31mโ\u001b[0m\n",
+ "\u001b[31mโ\u001b[0m \u001b[31mโฑ \u001b[0m205 \u001b[2mโ โ \u001b[0moutput_arrays = \u001b[1;4;96mself\u001b[0m\u001b[1;4m._forward_impl(input_arrays)\u001b[0m \u001b[31mโ\u001b[0m\n",
+ "\u001b[31mโ\u001b[0m \u001b[2m206 \u001b[0m\u001b[2mโ โ \u001b[0m\u001b[94massert\u001b[0m \u001b[96mlen\u001b[0m(output_arrays) <= \u001b[96mlen\u001b[0m(\u001b[96mself\u001b[0m._output_ids) \u001b[31mโ\u001b[0m\n",
+ "\u001b[31mโ\u001b[0m \u001b[2m207 \u001b[0m\u001b[2mโ โ \u001b[0moutput_tensors = [ \u001b[31mโ\u001b[0m\n",
+ "\u001b[31mโ\u001b[0m \u001b[2m208 \u001b[0m\u001b[2mโ โ โ \u001b[0m\u001b[94mNone\u001b[0m \u001b[94mif\u001b[0m a \u001b[95mis\u001b[0m \u001b[94mNone\u001b[0m \u001b[94melse\u001b[0m Tensor(a, dims=d) \u001b[31mโ\u001b[0m\n",
+ "\u001b[31mโ\u001b[0m \u001b[31mโ\u001b[0m\n",
+ "\u001b[31mโ\u001b[0m \u001b[33mC:\\repos\\bioimage-io\\core-bioimage-io-python\\bioimageio\\core\\backends\\onnx_backend.py\u001b[0m:\u001b[94m40\u001b[0m in \u001b[92m_for\u001b[0m \u001b[31mโ\u001b[0m\n",
+ "\u001b[31mโ\u001b[0m \u001b[31mโ\u001b[0m\n",
+ "\u001b[31mโ\u001b[0m \u001b[2m37 \u001b[0m\u001b[2mโ \u001b[0m\u001b[94mdef\u001b[0m \u001b[92m_forward_impl\u001b[0m( \u001b[31mโ\u001b[0m\n",
+ "\u001b[31mโ\u001b[0m \u001b[2m38 \u001b[0m\u001b[2mโ โ \u001b[0m\u001b[96mself\u001b[0m, input_arrays: Sequence[Optional[NDArray[Any]]] \u001b[31mโ\u001b[0m\n",
+ "\u001b[31mโ\u001b[0m \u001b[2m39 \u001b[0m\u001b[2mโ \u001b[0m) -> List[Optional[NDArray[Any]]]: \u001b[31mโ\u001b[0m\n",
+ "\u001b[31mโ\u001b[0m \u001b[31mโฑ \u001b[0m40 \u001b[2mโ โ \u001b[0mresult: Any = \u001b[1;4;96mself\u001b[0m\u001b[1;4m._session.run(\u001b[0m \u001b[31mโ\u001b[0m\n",
+ "\u001b[31mโ\u001b[0m \u001b[2m41 \u001b[0m\u001b[1;2;4mโ โ โ \u001b[0m\u001b[1;4;94mNone\u001b[0m\u001b[1;4m, \u001b[0m\u001b[1;4;96mdict\u001b[0m\u001b[1;4m(\u001b[0m\u001b[1;4;96mzip\u001b[0m\u001b[1;4m(\u001b[0m\u001b[1;4;96mself\u001b[0m\u001b[1;4m._input_names, input_arrays))\u001b[0m \u001b[31mโ\u001b[0m\n",
+ "\u001b[31mโ\u001b[0m \u001b[2m42 \u001b[0m\u001b[1;2;4mโ โ \u001b[0m\u001b[1;4m)\u001b[0m \u001b[31mโ\u001b[0m\n",
+ "\u001b[31mโ\u001b[0m \u001b[2m43 \u001b[0m\u001b[2mโ โ \u001b[0m\u001b[94mif\u001b[0m is_list(result) \u001b[95mor\u001b[0m is_tuple(result): \u001b[31mโ\u001b[0m\n",
+ "\u001b[31mโ\u001b[0m \u001b[31mโ\u001b[0m\n",
+ "\u001b[31mโ\u001b[0m \u001b[33mC:\\Users\\fbeut\\miniforge3\\envs\\core\\Lib\\site-packages\\onnxruntime\\capi\\onnxruntime_inference_col\u001b[0m \u001b[31mโ\u001b[0m\n",
+ "\u001b[31mโ\u001b[0m \u001b[31mโ\u001b[0m\n",
+ "\u001b[31mโ\u001b[0m \u001b[2m 263 \u001b[0m\u001b[2mโ โ \u001b[0m\u001b[94mif\u001b[0m \u001b[95mnot\u001b[0m output_names: \u001b[31mโ\u001b[0m\n",
+ "\u001b[31mโ\u001b[0m \u001b[2m 264 \u001b[0m\u001b[2mโ โ โ \u001b[0moutput_names = [output.name \u001b[94mfor\u001b[0m output \u001b[95min\u001b[0m \u001b[96mself\u001b[0m._outputs_meta] \u001b[31mโ\u001b[0m\n",
+ "\u001b[31mโ\u001b[0m \u001b[2m 265 \u001b[0m\u001b[2mโ โ \u001b[0m\u001b[94mtry\u001b[0m: \u001b[31mโ\u001b[0m\n",
+ "\u001b[31mโ\u001b[0m \u001b[31mโฑ \u001b[0m 266 \u001b[2mโ โ โ \u001b[0m\u001b[94mreturn\u001b[0m \u001b[96mself\u001b[0m._sess.run(output_names, input_feed, run_options) \u001b[31mโ\u001b[0m\n",
+ "\u001b[31mโ\u001b[0m \u001b[2m 267 \u001b[0m\u001b[2mโ โ \u001b[0m\u001b[94mexcept\u001b[0m C.EPFail \u001b[94mas\u001b[0m err: \u001b[31mโ\u001b[0m\n",
+ "\u001b[31mโ\u001b[0m \u001b[2m 268 \u001b[0m\u001b[2mโ โ โ \u001b[0m\u001b[94mif\u001b[0m \u001b[96mself\u001b[0m._enable_fallback: \u001b[31mโ\u001b[0m\n",
+ "\u001b[31mโ\u001b[0m \u001b[2m 269 \u001b[0m\u001b[2mโ โ โ โ \u001b[0m\u001b[96mprint\u001b[0m(\u001b[33mf\u001b[0m\u001b[33m\"\u001b[0m\u001b[33mEP Error: \u001b[0m\u001b[33m{\u001b[0merr\u001b[33m!s}\u001b[0m\u001b[33m using \u001b[0m\u001b[33m{\u001b[0m\u001b[96mself\u001b[0m._providers\u001b[33m}\u001b[0m\u001b[33m\"\u001b[0m) \u001b[31mโ\u001b[0m\n",
+ "\u001b[31mโฐโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฏ\u001b[0m\n",
+ "\u001b[1;91mInvalidArgument: \u001b[0m\u001b[1m[\u001b[0mONNXRuntimeError\u001b[1m]\u001b[0m : \u001b[1;36m2\u001b[0m : INVALID_ARGUMENT : Got invalid dimensions for input: input.\u001b[1;36m1\u001b[0m for the following indices\n",
+ " index: \u001b[1;36m2\u001b[0m Got: \u001b[1;36m64\u001b[0m Expected: \u001b[1;36m256\u001b[0m\n",
+ " index: \u001b[1;36m3\u001b[0m Got: \u001b[1;36m64\u001b[0m Expected: \u001b[1;36m256\u001b[0m\n",
+ " Please fix either the inputs/outputs or the model.\n"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "\u001b[32m2025-04-02 16:58:06.465\u001b[0m | \u001b[34m\u001b[1mDEBUG \u001b[0m | \u001b[36mbioimageio.core._resource_tests\u001b[0m:\u001b[36m_test_model_inference\u001b[0m:\u001b[36m593\u001b[0m - \u001b[34m\u001b[1mstarting 'Reproduce test outputs from test inputs (pytorch_state_dict)'\u001b[0m\n",
+ "\u001b[32m2025-04-02 16:58:09.841\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mbioimageio.core._resource_tests\u001b[0m:\u001b[36m_test_model_inference_parametrized\u001b[0m:\u001b[36m705\u001b[0m - \u001b[1mTesting inference with 6 different inputs (B, N): {(1, 2), (2, 1), (1, 1), (2, 0), (2, 2), (1, 0)}\u001b[0m\n",
+ "\u001b[32m2025-04-02 16:58:13.088\u001b[0m | \u001b[34m\u001b[1mDEBUG \u001b[0m | \u001b[36mbioimageio.core._resource_tests\u001b[0m:\u001b[36m_test_model_inference\u001b[0m:\u001b[36m593\u001b[0m - \u001b[34m\u001b[1mstarting 'Reproduce test outputs from test inputs (torchscript)'\u001b[0m\n",
+ " 0%| | 0.00/116M [00:00, ?B/s]\n",
+ " 0%| | 0.00/116M [00:00, ?B/s]\n",
+ "\n",
+ "Downloading weights-torchscript.pt: 894976it [00:00, 8733873.63it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 1768448it [00:00, 8396108.75it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 2921472it [00:00, 9321468.85it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 3851264it [00:00, 5874623.61it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 5862400it [00:00, 9481269.08it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 7655424it [00:00, 11719703.56it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 9225216it [00:00, 12794031.75it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 11330560it [00:00, 15101676.51it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 14648320it [00:01, 20276207.83it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 16819200it [00:01, 20577310.72it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 19944448it [00:01, 23644868.93it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 23445504it [00:01, 26277136.42it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 26584064it [00:01, 27755556.24it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 29401088it [00:01, 27560779.65it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 32506880it [00:01, 27233015.54it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 35324928it [00:01, 27471550.15it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 38159360it [00:01, 27652577.94it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 41143296it [00:02, 27148740.44it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 44180480it [00:02, 28049175.29it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 46998528it [00:02, 26639068.45it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 50567168it [00:02, 28471034.04it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 53429248it [00:02, 26991429.56it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 56147968it [00:02, 25858136.63it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 58750976it [00:02, 25778668.00it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 62239744it [00:02, 28264768.33it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 65651712it [00:02, 29913030.82it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 69788672it [00:03, 32055773.56it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 73001984it [00:03, 31841055.72it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 76190720it [00:03, 25478995.72it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 78935040it [00:03, 22838685.67it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 81386496it [00:03, 22558542.82it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 83755008it [00:03, 20803266.45it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 86515712it [00:03, 22435040.58it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 88857600it [00:03, 22337307.69it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 92630016it [00:04, 26392196.54it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 96082944it [00:04, 27543879.15it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 101073920it [00:04, 32311540.81it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 104481792it [00:04, 32617090.73it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 107863040it [00:04, 31591406.04it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 111047680it [00:04, 31501527.29it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 114214912it [00:04, 28757914.70it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 115899173it [00:00, ?it/s] \u001b[A\n",
+ "\u001b[32m2025-04-02 16:58:21.352\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mbioimageio.core._resource_tests\u001b[0m:\u001b[36m_test_model_inference_parametrized\u001b[0m:\u001b[36m705\u001b[0m - \u001b[1mTesting inference with 6 different inputs (B, N): {(1, 2), (2, 1), (1, 1), (2, 0), (2, 2), (1, 0)}\u001b[0m\n",
+ " 0%| | 0.00/116M [00:00, ?B/s]\n",
+ " 0%| | 0.00/116M [00:00, ?B/s]\n",
+ "\n",
+ "Downloading weights-torchscript.pt: 445440it [00:00, 4432633.69it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 3464192it [00:00, 19265268.62it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 6596608it [00:00, 23521059.56it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 10233856it [00:00, 28219059.57it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 13051904it [00:00, 22325004.78it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 15434752it [00:00, 20317162.49it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 17798144it [00:00, 21176347.34it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 20009984it [00:00, 19742883.48it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 22054912it [00:01, 19384965.46it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 24038400it [00:01, 18607986.16it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 25928704it [00:01, 17567778.82it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 27708416it [00:01, 15395773.90it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 29296640it [00:01, 14754894.68it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 31273984it [00:01, 16010669.71it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 33406976it [00:01, 16965136.00it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 36571136it [00:01, 20318068.86it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 39216128it [00:02, 21637978.44it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 41415680it [00:02, 21660449.82it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 44575744it [00:02, 24344829.81it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 47041536it [00:02, 24196845.78it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 51279872it [00:02, 28838110.39it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 54668288it [00:02, 29349026.38it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 58583040it [00:02, 31140050.96it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 63879168it [00:02, 36155422.20it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 67487744it [00:02, 33588655.88it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 70865920it [00:02, 33138770.27it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 74190848it [00:03, 30445832.57it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 77272064it [00:03, 26696917.11it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 80028672it [00:03, 24703280.06it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 82567168it [00:03, 23830349.13it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 84990976it [00:03, 23315270.29it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 87346176it [00:03, 22755528.66it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 89775104it [00:03, 23141468.58it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 93842432it [00:03, 26467350.34it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 96484352it [00:04, 25703078.19it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 99230720it [00:04, 25495766.86it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 101776384it [00:04, 25130747.77it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 104570880it [00:04, 25867496.07it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 107159552it [00:04, 24416196.40it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 110129152it [00:04, 25743779.91it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 113443840it [00:04, 27559258.39it/s]\u001b[A\n",
+ "Downloading weights-torchscript.pt: 115899173it [00:00, 7323456038.30it/s]A\n"
+ ]
+ }
+ ],
"source": [
"from bioimageio.core import test_model\n",
"\n",
- "test_summary = test_model(model)\n",
+ "test_summary = test_model(model)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ " โ \n",
+ " bioimageio format validation \n",
+ " \n",
+ " \n",
+ " status \n",
+ " failed \n",
+ " \n",
+ " \n",
+ " source \n",
+ " https://hypha.aicell.io/bioimage-io/artifacts/affable-shark/files/rdf.yaml \n",
+ " \n",
+ " \n",
+ " id \n",
+ " 10.5281/zenodo.5764892/6647674 \n",
+ " \n",
+ " \n",
+ " format version \n",
+ " model 0.5.4 \n",
+ " \n",
+ " \n",
+ " bioimageio.core \n",
+ " 0.8.0 \n",
+ " \n",
+ " \n",
+ " bioimageio.spec \n",
+ " 0.5.4.2 \n",
+ " \n",
+ "
\n",
+ "\n",
+ " \n",
+ " \n",
+ " Location \n",
+ " Details \n",
+ " \n",
+ " \n",
+ " โ๏ธ \n",
+ " \n",
+ " Successfully created `ModelDescr` instance. \n",
+ " \n",
+ " \n",
+ " โ๏ธ \n",
+ " \n",
+ " bioimageio.spec format validation model 0.5.4 \n",
+ " \n",
+ " \n",
+ " โ๏ธ \n",
+ " type
\n",
+ " Has expected resource type \n",
+ " \n",
+ " \n",
+ " โ๏ธ \n",
+ " weights.onnx
\n",
+ " Reproduce test outputs from test inputs (onnx) \n",
+ " \n",
+ " \n",
+ " \n",
+ " weights.onnx
\n",
+ " recommended conda environment (Reproduce test outputs from test inputs (onnx)) \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " %YAML 1.2\n",
+ "---\n",
+ "channels:\n",
+ " - conda-forge\n",
+ " - nodefaults\n",
+ "dependencies:\n",
+ " - conda-forge::bioimageio.core\n",
+ " - onnxruntime\n",
+ " - pip\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " weights.onnx
\n",
+ " conda compare (Reproduce test outputs from test inputs (onnx)) \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " bioimageio.core not found \n",
+ " \n",
+ " \n",
+ " โ \n",
+ " weights.onnx
\n",
+ " Run onnx inference for parametrized inputs \n",
+ " \n",
+ " \n",
+ " โ \n",
+ " weights.onnx
\n",
+ " [ONNXRuntimeError] : 2 : INVALID_ARGUMENT : Got invalid dimensions for input: input.1 for the following indices\n",
+ " index: 2 Got: 64 Expected: 256\n",
+ " index: 3 Got: 64 Expected: 256\n",
+ " Please fix either the inputs/outputs or the model. \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " See Traceback 1 . \n",
+ " \n",
+ " \n",
+ " โ๏ธ \n",
+ " weights.pytorch_state_dict
\n",
+ " Reproduce test outputs from test inputs (pytorch_state_dict) \n",
+ " \n",
+ " \n",
+ " \n",
+ " weights.pytorch_state_dict
\n",
+ " recommended conda environment (Reproduce test outputs from test inputs (pytorch_state_dict)) \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " %YAML 1.2\n",
+ "---\n",
+ "channels:\n",
+ " - pytorch\n",
+ " - conda-forge\n",
+ " - nodefaults\n",
+ "dependencies:\n",
+ " - conda-forge::bioimageio.core\n",
+ " - mkl ==2024.0.0\n",
+ " - numpy <2\n",
+ " - pip\n",
+ " - pytorch==1.10.0\n",
+ " - setuptools <70.0.0\n",
+ " - torchaudio==0.10.0\n",
+ " - torchvision==0.11.0\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " weights.pytorch_state_dict
\n",
+ " conda compare (Reproduce test outputs from test inputs (pytorch_state_dict)) \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " bioimageio.core not found mkl found but mismatch. Specification pkg: mkl==2024.0.0, Running pkg:\n",
+ "mkl==2024.2.2=h66d3029_15 pytorch found but mismatch. Specification pkg: pytorch==1.10.0,\n",
+ "Running pkg: pytorch==2.6.0=cpu_mkl_py311_hde8219b_101 setuptools found but mismatch.\n",
+ "Specification pkg: setuptools[version='<70.0.0'], Running pkg: setuptools==75.3.0=pyhd8ed1ab_0\n",
+ "torchaudio not found torchvision found but mismatch. Specification pkg: torchvision==0.11.0,\n",
+ "Running pkg: torchvision==0.21.0=cpu_py311_hc601fa1_0 \n",
+ " \n",
+ " \n",
+ " โ๏ธ \n",
+ " weights.pytorch_state_dict
\n",
+ " Run pytorch_state_dict inference for inputs with batch_size: 1 and size parameter n: 0 \n",
+ " \n",
+ " \n",
+ " โ๏ธ \n",
+ " weights.pytorch_state_dict
\n",
+ " Run pytorch_state_dict inference for inputs with batch_size: 1 and size parameter n: 1 \n",
+ " \n",
+ " \n",
+ " โ๏ธ \n",
+ " weights.pytorch_state_dict
\n",
+ " Run pytorch_state_dict inference for inputs with batch_size: 1 and size parameter n: 2 \n",
+ " \n",
+ " \n",
+ " โ๏ธ \n",
+ " weights.pytorch_state_dict
\n",
+ " Run pytorch_state_dict inference for inputs with batch_size: 2 and size parameter n: 0 \n",
+ " \n",
+ " \n",
+ " โ๏ธ \n",
+ " weights.pytorch_state_dict
\n",
+ " Run pytorch_state_dict inference for inputs with batch_size: 2 and size parameter n: 1 \n",
+ " \n",
+ " \n",
+ " โ๏ธ \n",
+ " weights.pytorch_state_dict
\n",
+ " Run pytorch_state_dict inference for inputs with batch_size: 2 and size parameter n: 2 \n",
+ " \n",
+ " \n",
+ " โ๏ธ \n",
+ " weights.torchscript
\n",
+ " Reproduce test outputs from test inputs (torchscript) \n",
+ " \n",
+ " \n",
+ " \n",
+ " weights.torchscript
\n",
+ " recommended conda environment (Reproduce test outputs from test inputs (torchscript)) \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " %YAML 1.2\n",
+ "---\n",
+ "channels:\n",
+ " - pytorch\n",
+ " - conda-forge\n",
+ " - nodefaults\n",
+ "dependencies:\n",
+ " - conda-forge::bioimageio.core\n",
+ " - mkl ==2024.0.0\n",
+ " - numpy <2\n",
+ " - pip\n",
+ " - pytorch==1.10.0\n",
+ " - setuptools <70.0.0\n",
+ " - torchaudio==0.10.0\n",
+ " - torchvision==0.11.0\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " weights.torchscript
\n",
+ " conda compare (Reproduce test outputs from test inputs (torchscript)) \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " bioimageio.core not found mkl found but mismatch. Specification pkg: mkl==2024.0.0, Running pkg:\n",
+ "mkl==2024.2.2=h66d3029_15 pytorch found but mismatch. Specification pkg: pytorch==1.10.0,\n",
+ "Running pkg: pytorch==2.6.0=cpu_mkl_py311_hde8219b_101 setuptools found but mismatch.\n",
+ "Specification pkg: setuptools[version='<70.0.0'], Running pkg: setuptools==75.3.0=pyhd8ed1ab_0\n",
+ "torchaudio not found torchvision found but mismatch. Specification pkg: torchvision==0.11.0,\n",
+ "Running pkg: torchvision==0.21.0=cpu_py311_hc601fa1_0 \n",
+ " \n",
+ " \n",
+ " โ๏ธ \n",
+ " weights.torchscript
\n",
+ " Run torchscript inference for inputs with batch_size: 1 and size parameter n: 0 \n",
+ " \n",
+ " \n",
+ " โ๏ธ \n",
+ " weights.torchscript
\n",
+ " Run torchscript inference for inputs with batch_size: 1 and size parameter n: 1 \n",
+ " \n",
+ " \n",
+ " โ๏ธ \n",
+ " weights.torchscript
\n",
+ " Run torchscript inference for inputs with batch_size: 1 and size parameter n: 2 \n",
+ " \n",
+ " \n",
+ " โ๏ธ \n",
+ " weights.torchscript
\n",
+ " Run torchscript inference for inputs with batch_size: 2 and size parameter n: 0 \n",
+ " \n",
+ " \n",
+ " โ๏ธ \n",
+ " weights.torchscript
\n",
+ " Run torchscript inference for inputs with batch_size: 2 and size parameter n: 1 \n",
+ " \n",
+ " \n",
+ " โ๏ธ \n",
+ " weights.torchscript
\n",
+ " Run torchscript inference for inputs with batch_size: 2 and size parameter n: 2 \n",
+ " \n",
+ "
\n",
+ "Traceback 1 \n",
+ "\n",
+ "\n",
+ "\n",
+ " \n",
+ "\n",
+ "\n",
+ "\n",
+ " โญโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ Traceback (most recent call last) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฎ \n",
+ "โ C:\\repos\\bioimage-io\\core-bioimage-io-python\\bioimageio\\core\\_resource_tests.py :768 in _test_mod โ \n",
+ "โ โ \n",
+ "โ 765 โ โ ) as prediction_pipeline: โ \n",
+ "โ 766 โ โ โ for n, batch_size, inputs, exptected_output_shape in generate_test_cases(): โ \n",
+ "โ 767 โ โ โ โ error: Optional[str ] = None โ \n",
+ "โ โฑ 768 โ โ โ โ result = prediction_pipeline.predict_sample_without_blocking(inputs) โ \n",
+ "โ 769 โ โ โ โ if len (result.members) != len (exptected_output_shape): โ \n",
+ "โ 770 โ โ โ โ โ error = ( โ \n",
+ "โ 771 โ โ โ โ โ โ f"Expected { len (exptected_output_shape)} outputs," โ \n",
+ "โ โ \n",
+ "โ C:\\repos\\bioimage-io\\core-bioimage-io-python\\bioimageio\\core\\_prediction_pipeline.py :160 in pred โ \n",
+ "โ โ \n",
+ "โ 157 โ โ if not skip_preprocessing: โ \n",
+ "โ 158 โ โ โ self .apply_preprocessing(sample) โ \n",
+ "โ 159 โ โ โ \n",
+ "โ โฑ 160 โ โ output = self ._adapter.forward(sample) โ \n",
+ "โ 161 โ โ if not skip_postprocessing: โ \n",
+ "โ 162 โ โ โ self .apply_postprocessing(output) โ \n",
+ "โ 163 โ \n",
+ "โ โ \n",
+ "โ C:\\repos\\bioimage-io\\core-bioimage-io-python\\bioimageio\\core\\backends\\_model_adapter.py :205 in f โ \n",
+ "โ โ \n",
+ "โ 202 โ โ โ ) โ \n",
+ "โ 203 โ โ โ for in_id, in_order in zip (self ._input_ids, self ._input_axes) โ \n",
+ "โ 204 โ โ ] โ \n",
+ "โ โฑ 205 โ โ output_arrays = self ._forward_impl(input_arrays) โ \n",
+ "โ 206 โ โ assert len (output_arrays) <= len (self ._output_ids) โ \n",
+ "โ 207 โ โ output_tensors = [ โ \n",
+ "โ 208 โ โ โ None if a is None else Tensor(a, dims=d) โ \n",
+ "โ โ \n",
+ "โ C:\\repos\\bioimage-io\\core-bioimage-io-python\\bioimageio\\core\\backends\\onnx_backend.py :40 in _for โ \n",
+ "โ โ \n",
+ "โ 37 โ def _forward_impl ( โ \n",
+ "โ 38 โ โ self , input_arrays: Sequence[Optional[NDArray[Any]]] โ \n",
+ "โ 39 โ ) -> List[Optional[NDArray[Any]]]: โ \n",
+ "โ โฑ 40 โ โ result: Any = self ._session.run( โ \n",
+ "โ 41 โ โ โ None , dict ( zip ( self ._input_names, input_arrays)) โ \n",
+ "โ 42 โ โ ) โ \n",
+ "โ 43 โ โ if is_list(result) or is_tuple(result): โ \n",
+ "โ โ \n",
+ "โ C:\\Users\\fbeut\\miniforge3\\envs\\core\\Lib\\site-packages\\onnxruntime\\capi\\onnxruntime_inference_col โ \n",
+ "โ โ \n",
+ "โ 263 โ โ if not output_names: โ \n",
+ "โ 264 โ โ โ output_names = [output.name for output in self ._outputs_meta] โ \n",
+ "โ 265 โ โ try : โ \n",
+ "โ โฑ 266 โ โ โ return self ._sess.run(output_names, input_feed, run_options) โ \n",
+ "โ 267 โ โ except C.EPFail as err: โ \n",
+ "โ 268 โ โ โ if self ._enable_fallback: โ \n",
+ "โ 269 โ โ โ โ print (f"EP Error: { err!s} using { self ._providers}" ) โ \n",
+ "โฐโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฏ \n",
+ "InvalidArgument: [ ONNXRuntimeError] : 2 : INVALID_ARGUMENT : Got invalid dimensions for input: input.1 for the following indices\n",
+ " index: 2 Got: 64 Expected: 256 \n",
+ " index: 3 Got: 64 Expected: 256 \n",
+ " Please fix either the inputs/outputs or the model.\n",
+ "
\n",
+ "\n",
+ "\n",
+ " "
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
"test_summary.display()"
]
},
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "\u001b[32m2025-04-02 20:48:09.875\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mbioimageio.spec.summary\u001b[0m:\u001b[36msave_json\u001b[0m:\u001b[36m443\u001b[0m - \u001b[1mSaved summary to C:\\repos\\bioimage-io\\core-bioimage-io-python\\example\\summary\\summary.json\u001b[0m\n",
+ "\u001b[32m2025-04-02 20:48:09.898\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mbioimageio.spec.summary\u001b[0m:\u001b[36msave_markdown\u001b[0m:\u001b[36m450\u001b[0m - \u001b[1mSaved Markdown formatted summary to C:\\repos\\bioimage-io\\core-bioimage-io-python\\example\\summary\\summary.md\u001b[0m\n",
+ "\u001b[32m2025-04-02 20:48:09.962\u001b[0m | \u001b[1mINFO \u001b[0m | \u001b[36mbioimageio.spec.summary\u001b[0m:\u001b[36msave_html\u001b[0m:\u001b[36m458\u001b[0m - \u001b[1mSaved HTML formatted summary to C:\\repos\\bioimage-io\\core-bioimage-io-python\\example\\summary\\summary.html\u001b[0m\n"
+ ]
+ }
+ ],
+ "source": [
+ "_ = test_summary.save(\"summary\")"
+ ]
+ },
{
"cell_type": "markdown",
"metadata": {},
@@ -298,14 +1572,28 @@
"\n",
"This includes functions to run predictions on `numpy.ndarray`/`xarray.DataArray` as input and convenience functions to run predictions for images stored on disc.\n",
"\n",
- "### 3.1. Load the test image and convert into a tensor"
+ "### 3.1. Create an input sample"
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 11,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "array shape: ( 1 , 1 , 256 , 256 ) \n",
+ " \n"
+ ],
+ "text/plain": [
+ "array shape: \u001b[1m(\u001b[0m\u001b[1;36m1\u001b[0m, \u001b[1;36m1\u001b[0m, \u001b[1;36m256\u001b[0m, \u001b[1;36m256\u001b[0m\u001b[1m)\u001b[0m\n"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
"source": [
"from bioimageio.spec.model import v0_5\n",
"from bioimageio.spec.utils import load_array\n",
@@ -328,9 +1616,23 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 12,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "tensor shape: Frozen ({ 'batch' : 1 , 'channel' : 1 , 'y' : 256 , 'x' : 256 }) \n",
+ " \n"
+ ],
+ "text/plain": [
+ "tensor shape: \u001b[1;35mFrozen\u001b[0m\u001b[1m(\u001b[0m\u001b[1m{\u001b[0m\u001b[32m'batch'\u001b[0m: \u001b[1;36m1\u001b[0m, \u001b[32m'channel'\u001b[0m: \u001b[1;36m1\u001b[0m, \u001b[32m'y'\u001b[0m: \u001b[1;36m256\u001b[0m, \u001b[32m'x'\u001b[0m: \u001b[1;36m256\u001b[0m\u001b[1m}\u001b[0m\u001b[1m)\u001b[0m\n"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
"source": [
"from bioimageio.core import Tensor\n",
"\n",
@@ -351,9 +1653,20 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 13,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "Sample(members={'raw': }, stat=None, id='sample-from-numpy')"
+ ]
+ },
+ "execution_count": 13,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
"source": [
"from bioimageio.core import Sample\n",
"\n",
@@ -366,15 +1679,44 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "`bioimageio.core` provides the helper function `create_sample_for_model` to automatically create the `Sample` for the given model.\n",
- " "
+ "#### 3.1.1 Create an input sample with create_sample_for_model\n",
+ "\n",
+ "`bioimageio.core` provides the helper function `create_sample_for_model` to automatically create the `Sample` for the given model. "
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 14,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "input paths: { 'input0' : \n",
+ "WindowsPath ( 'C:/Users/fbeut/AppData/Local/bioimageio/bioimageio/Cache/277e1abf8d7287b159459f2288fbcfa1-test_input_0 \n",
+ ".npy' )} \n",
+ " \n"
+ ],
+ "text/plain": [
+ "input paths: \u001b[1m{\u001b[0m\u001b[32m'input0'\u001b[0m: \n",
+ "\u001b[1;35mWindowsPath\u001b[0m\u001b[1m(\u001b[0m\u001b[32m'C:/Users/fbeut/AppData/Local/bioimageio/bioimageio/Cache/277e1abf8d7287b159459f2288fbcfa1-test_input_0\u001b[0m\n",
+ "\u001b[32m.npy'\u001b[0m\u001b[1m)\u001b[0m\u001b[1m}\u001b[0m\n"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/plain": [
+ "Sample(members={'input0': }, stat={}, id='my_demo_sample')"
+ ]
+ },
+ "execution_count": 14,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
"source": [
"from bioimageio.core.digest_spec import create_sample_for_model\n",
"from bioimageio.spec.utils import download\n",
@@ -393,14 +1735,26 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "There is also a helper function `get_test_inputs` to directly import the test input sample for a given model."
+ "#### 3.1.2 Get the test input sample\n",
+ "There is also a helper function `get_test_inputs` to directly import the test input sample for a given model."
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 15,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "Sample(members={'input0': }, stat={}, id='test-sample')"
+ ]
+ },
+ "execution_count": 15,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
"source": [
"from bioimageio.core.digest_spec import get_test_inputs\n",
"\n",
@@ -432,7 +1786,7 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
@@ -457,9 +1811,21 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 17,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "ename": "TypeError",
+ "evalue": "show_images() takes 1 positional argument but 2 were given",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
+ "\u001b[1;31mTypeError\u001b[0m Traceback (most recent call last)",
+ "Cell \u001b[1;32mIn[17], line 4\u001b[0m\n\u001b[0;32m 1\u001b[0m prediction: Sample \u001b[38;5;241m=\u001b[39m prediction_pipeline\u001b[38;5;241m.\u001b[39mpredict_sample_without_blocking(sample)\n\u001b[0;32m 3\u001b[0m \u001b[38;5;66;03m# show the prediction result\u001b[39;00m\n\u001b[1;32m----> 4\u001b[0m \u001b[43mshow_images\u001b[49m\u001b[43m(\u001b[49m\u001b[43msample\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mprediction\u001b[49m\u001b[43m)\u001b[49m\n",
+ "\u001b[1;31mTypeError\u001b[0m: show_images() takes 1 positional argument but 2 were given"
+ ]
+ }
+ ],
"source": [
"prediction: Sample = prediction_pipeline.predict_sample_without_blocking(sample)\n",
"\n",
@@ -544,7 +1910,7 @@
],
"metadata": {
"kernelspec": {
- "display_name": "bioimageio-core",
+ "display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
@@ -558,7 +1924,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.9.19"
+ "version": "3.11.11"
}
},
"nbformat": 4,
diff --git a/pyproject.toml b/pyproject.toml
index 5d58fe72..db264984 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -40,7 +40,7 @@ typeCheckingMode = "strict"
useLibraryCodeForTypes = true
[tool.pytest.ini_options]
-addopts = "--cov bioimageio --cov-report xml --cov-append --capture no --doctest-modules --failed-first --ignore dogfood --ignore bioimageio/core/backends --ignore bioimageio/core/weight_converters"
+addopts = "--doctest-modules --failed-first --ignore dogfood --ignore bioimageio/core/backends --ignore bioimageio/core/weight_converters"
testpaths = ["bioimageio/core", "tests"]
[tool.ruff]
diff --git a/setup.py b/setup.py
index f4e975a5..bfaa4f4b 100644
--- a/setup.py
+++ b/setup.py
@@ -30,7 +30,7 @@
],
packages=find_namespace_packages(exclude=["tests"]),
install_requires=[
- "bioimageio.spec ==0.5.4.1",
+ "bioimageio.spec ==0.5.4.3",
"h5py",
"imagecodecs",
"imageio>=2.10",
@@ -38,7 +38,6 @@
"numpy",
"pydantic-settings>=2.5,<3",
"pydantic>=2.7.0,<3",
- "requests",
"ruyaml",
"tqdm",
"typing-extensions",
@@ -58,6 +57,7 @@
+ [
"black",
"cellpose", # for model testing
+ "httpx",
"jupyter-black",
"jupyter",
"matplotlib",
@@ -67,7 +67,7 @@
"packaging>=17.0",
"pdoc",
"pre-commit",
- "pyright==1.1.396",
+ "pyright==1.1.401",
"segment-anything", # for model testing
"timm", # for model testing
# "crick", # currently requires python<=3.9
diff --git a/tests/test_bioimageio_collection.py b/tests/test_bioimageio_collection.py
index fc81034c..d01868e6 100644
--- a/tests/test_bioimageio_collection.py
+++ b/tests/test_bioimageio_collection.py
@@ -1,8 +1,8 @@
import os
from typing import Any, Collection, Dict, Iterable, Mapping, Tuple
+import httpx
import pytest
-import requests
from pydantic import HttpUrl
from bioimageio.spec import InvalidDescr
@@ -13,7 +13,7 @@
def _get_latest_rdf_sources():
- entries: Any = requests.get(BASE_URL + "all_versions.json").json()["entries"]
+ entries: Any = httpx.get(BASE_URL + "all_versions.json").json()["entries"]
ret: Dict[str, Tuple[HttpUrl, Sha256]] = {}
for entry in entries:
version = entry["versions"][0]
@@ -40,7 +40,6 @@ def yield_bioimageio_yaml_urls() -> Iterable[ParameterSet]:
KNOWN_INVALID: Collection[str] = {
- "affable-shark/1.1", # onnx weights expect fixed input shape
"affectionate-cow/0.1.0", # custom dependencies
"ambitious-sloth/1.2", # requires inferno
"committed-turkey/1.2", # error deserializing VarianceScaling