Skip to content

Commit 89d7466

Browse files
committed
replace get_proc_class with get_proc
1 parent fc3a03f commit 89d7466

File tree

3 files changed

+85
-189
lines changed

3 files changed

+85
-189
lines changed

README.md

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,7 @@ functionality, but not any functionality depending on model prediction.
275275
To install additional deep learning libraries add `pytorch`, `onnxruntime`, `keras` or `tensorflow`.
276276

277277
Deeplearning frameworks to consider installing alongside `bioimageio.core`:
278+
278279
- [Pytorch/Torchscript](https://pytorch.org/get-started/locally/)
279280
- [TensorFlow](https://www.tensorflow.org/install)
280281
- [ONNXRuntime](https://onnxruntime.ai/docs/install/#python-installs)
@@ -297,13 +298,16 @@ These models are described by---and can be loaded with---the bioimageio.spec pac
297298
In addition bioimageio.core provides functionality to convert model weight formats.
298299

299300
### Documentation
301+
300302
[Here you find the bioimageio.core documentation.](https://bioimage-io.github.io/core-bioimage-io-python/bioimageio/core.html)
301303

302304
#### Presentations
305+
303306
- [Create a model from scratch](https://bioimage-io.github.io/core-bioimage-io-python/presentations/create_ambitious_sloth.slides.html) ([source](https://github.com/bioimage-io/core-bioimage-io-python/tree/main/presentations))
304307

305308
#### Examples
306-
<dl>
309+
310+
<dl>
307311
<dt>Notebooks that save and load resource descriptions and validate their format (using <a href="https://bioimage-io.github.io/core-bioimage-io-python/bioimageio/spec.html">bioimageio.spec</a>, a dependency of bioimageio.core)</dt>
308312
<dd><a href="https://github.com/bioimage-io/spec-bioimage-io/blob/main/example/load_model_and_create_your_own.ipynb">load_model_and_create_your_own.ipynb</a> <a target="_blank" href="https://colab.research.google.com/github/bioimage-io/spec-bioimage-io/blob/main/example/load_model_and_create_your_own.ipynb">
309313
<img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Open In Colab"/>
@@ -327,7 +331,6 @@ bioimageio
327331

328332
For examples see [Get started](#get-started).
329333

330-
331334
### CLI inputs from file
332335

333336
For convenience the command line options (not arguments) may be given in a `bioimageio-cli.json`
@@ -342,7 +345,6 @@ blockwise: true
342345
stats: inputs/dataset_statistics.json
343346
```
344347
345-
346348
## Set up Development Environment
347349
348350
To set up a development conda environment run the following commands:
@@ -355,13 +357,11 @@ pip install -e . --no-deps
355357

356358
There are different environment files available that only install tensorflow or pytorch as dependencies, see [dev folder](https://github.com/bioimage-io/core-bioimage-io-python/tree/main/dev).
357359

358-
359360
## Logging level
360361

361362
`bioimageio.spec` and `bioimageio.core` use [loguru](https://github.com/Delgan/loguru) for logging, hence the logging level
362363
may be controlled with the `LOGURU_LEVEL` environment variable.
363364

364-
365365
## Changelog
366366

367367
### 0.7.1 (to be released)
@@ -370,6 +370,7 @@ may be controlled with the `LOGURU_LEVEL` environment variable.
370370
- New feature: `bioimageio.core.test_description` accepts **runtime_env** and **run_command** to test a resource
371371
using the conda environment described by that resource (or another specified conda env)
372372
- new CLI command: `bioimageio add-weights` (and utility function: bioimageio.core.add_weights)
373+
- removed `bioimageio.core.proc_ops.get_proc_class` in favor of `bioimageio.core.proc_ops.get_proc`
373374

374375
### 0.7.0
375376

bioimageio/core/proc_ops.py

Lines changed: 43 additions & 134 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@
1616
import xarray as xr
1717
from typing_extensions import Self, assert_never
1818

19+
from bioimageio.core.digest_spec import get_member_id
1920
from bioimageio.spec.model import v0_4, v0_5
20-
from bioimageio.spec.model.v0_5 import TensorId
2121
from bioimageio.spec.model.v0_5 import (
2222
_convert_proc, # pyright: ignore [reportPrivateUsage]
2323
)
@@ -672,144 +672,53 @@ def _apply(self, input: Tensor, stat: Stat) -> Tensor:
672672
]
673673

674674

675-
def get_proc_class(proc_spec: ProcDescr):
676-
if isinstance(proc_spec, (v0_4.BinarizeDescr, v0_5.BinarizeDescr)):
677-
return Binarize
678-
elif isinstance(proc_spec, (v0_4.ClipDescr, v0_5.ClipDescr)):
679-
return Clip
680-
elif isinstance(proc_spec, v0_5.EnsureDtypeDescr):
681-
return EnsureDtype
682-
elif isinstance(proc_spec, v0_5.FixedZeroMeanUnitVarianceDescr):
683-
return FixedZeroMeanUnitVariance
684-
elif isinstance(proc_spec, (v0_4.ScaleLinearDescr, v0_5.ScaleLinearDescr)):
685-
return ScaleLinear
675+
def get_proc(
676+
proc_descr: ProcDescr,
677+
tensor_descr: Union[
678+
v0_4.InputTensorDescr,
679+
v0_4.OutputTensorDescr,
680+
v0_5.InputTensorDescr,
681+
v0_5.OutputTensorDescr,
682+
],
683+
) -> Processing:
684+
member_id = get_member_id(tensor_descr)
685+
686+
if isinstance(proc_descr, (v0_4.BinarizeDescr, v0_5.BinarizeDescr)):
687+
return Binarize.from_proc_descr(proc_descr, member_id)
688+
elif isinstance(proc_descr, (v0_4.ClipDescr, v0_5.ClipDescr)):
689+
return Clip.from_proc_descr(proc_descr, member_id)
690+
elif isinstance(proc_descr, v0_5.EnsureDtypeDescr):
691+
return EnsureDtype.from_proc_descr(proc_descr, member_id)
692+
elif isinstance(proc_descr, v0_5.FixedZeroMeanUnitVarianceDescr):
693+
return FixedZeroMeanUnitVariance.from_proc_descr(proc_descr, member_id)
694+
elif isinstance(proc_descr, (v0_4.ScaleLinearDescr, v0_5.ScaleLinearDescr)):
695+
return ScaleLinear.from_proc_descr(proc_descr, member_id)
686696
elif isinstance(
687-
proc_spec, (v0_4.ScaleMeanVarianceDescr, v0_5.ScaleMeanVarianceDescr)
697+
proc_descr, (v0_4.ScaleMeanVarianceDescr, v0_5.ScaleMeanVarianceDescr)
688698
):
689-
return ScaleMeanVariance
690-
elif isinstance(proc_spec, (v0_4.ScaleRangeDescr, v0_5.ScaleRangeDescr)):
691-
return ScaleRange
692-
elif isinstance(proc_spec, (v0_4.SigmoidDescr, v0_5.SigmoidDescr)):
693-
return Sigmoid
699+
return ScaleMeanVariance.from_proc_descr(proc_descr, member_id)
700+
elif isinstance(proc_descr, (v0_4.ScaleRangeDescr, v0_5.ScaleRangeDescr)):
701+
return ScaleRange.from_proc_descr(proc_descr, member_id)
702+
elif isinstance(proc_descr, (v0_4.SigmoidDescr, v0_5.SigmoidDescr)):
703+
return Sigmoid.from_proc_descr(proc_descr, member_id)
694704
elif (
695-
isinstance(proc_spec, v0_4.ZeroMeanUnitVarianceDescr)
696-
and proc_spec.kwargs.mode == "fixed"
705+
isinstance(proc_descr, v0_4.ZeroMeanUnitVarianceDescr)
706+
and proc_descr.kwargs.mode == "fixed"
697707
):
698-
return FixedZeroMeanUnitVariance
708+
if not isinstance(
709+
tensor_descr, (v0_4.InputTensorDescr, v0_4.OutputTensorDescr)
710+
):
711+
raise TypeError(
712+
"Expected v0_4 tensor description for v0_4 processing description"
713+
)
714+
715+
v5_proc_descr = _convert_proc(proc_descr, tensor_descr.axes)
716+
assert isinstance(v5_proc_descr, v0_5.FixedZeroMeanUnitVarianceDescr)
717+
return FixedZeroMeanUnitVariance.from_proc_descr(v5_proc_descr, member_id)
699718
elif isinstance(
700-
proc_spec,
719+
proc_descr,
701720
(v0_4.ZeroMeanUnitVarianceDescr, v0_5.ZeroMeanUnitVarianceDescr),
702721
):
703-
return ZeroMeanUnitVariance
704-
else:
705-
assert_never(proc_spec)
706-
707-
708-
def preproc_v4_to_processing(
709-
inp: v0_4.InputTensorDescr,
710-
proc_spec: v0_4.PreprocessingDescr,
711-
) -> Processing:
712-
member_id = TensorId(str(inp.name))
713-
if isinstance(proc_spec, v0_4.BinarizeDescr):
714-
return Binarize.from_proc_descr(proc_spec, member_id)
715-
elif isinstance(proc_spec, v0_4.ClipDescr):
716-
return Clip.from_proc_descr(proc_spec, member_id)
717-
elif isinstance(proc_spec, v0_4.ScaleLinearDescr):
718-
return ScaleLinear.from_proc_descr(proc_spec, member_id)
719-
elif isinstance(proc_spec, v0_4.ScaleRangeDescr):
720-
return ScaleRange.from_proc_descr(proc_spec, member_id)
721-
elif isinstance(proc_spec, v0_4.SigmoidDescr):
722-
return Sigmoid.from_proc_descr(proc_spec, member_id)
723-
elif isinstance(proc_spec, v0_4.ZeroMeanUnitVarianceDescr):
724-
if proc_spec.kwargs.mode == "fixed":
725-
axes = inp.axes
726-
v5_proc_spec = _convert_proc(proc_spec, axes)
727-
assert isinstance(
728-
v5_proc_spec, v0_5.FixedZeroMeanUnitVarianceDescr
729-
) # FIXME
730-
return FixedZeroMeanUnitVariance.from_proc_descr(v5_proc_spec, member_id)
731-
else:
732-
return ZeroMeanUnitVariance.from_proc_descr(proc_spec, member_id)
733-
else:
734-
assert_never(proc_spec)
735-
736-
737-
def postproc_v4_to_processing(
738-
inp: v0_4.OutputTensorDescr,
739-
proc_spec: v0_4.PostprocessingDescr,
740-
) -> Processing:
741-
member_id = TensorId(str(inp.name))
742-
if isinstance(proc_spec, v0_4.BinarizeDescr):
743-
return Binarize.from_proc_descr(proc_spec, member_id)
744-
if isinstance(proc_spec, v0_4.ScaleMeanVarianceDescr):
745-
return ScaleMeanVariance.from_proc_descr(proc_spec, member_id)
746-
elif isinstance(proc_spec, v0_4.ClipDescr):
747-
return Clip.from_proc_descr(proc_spec, member_id)
748-
elif isinstance(proc_spec, v0_4.ScaleLinearDescr):
749-
return ScaleLinear.from_proc_descr(proc_spec, member_id)
750-
elif isinstance(proc_spec, v0_4.ScaleRangeDescr):
751-
return ScaleRange.from_proc_descr(proc_spec, member_id)
752-
elif isinstance(proc_spec, v0_4.SigmoidDescr):
753-
return Sigmoid.from_proc_descr(proc_spec, member_id)
754-
elif isinstance(proc_spec, v0_4.ZeroMeanUnitVarianceDescr):
755-
if proc_spec.kwargs.mode == "fixed":
756-
axes = inp.axes
757-
v5_proc_spec = _convert_proc(proc_spec, axes)
758-
assert isinstance(
759-
v5_proc_spec, v0_5.FixedZeroMeanUnitVarianceDescr
760-
) # FIXME
761-
return FixedZeroMeanUnitVariance.from_proc_descr(v5_proc_spec, member_id)
762-
else:
763-
return ZeroMeanUnitVariance.from_proc_descr(proc_spec, member_id)
764-
else:
765-
assert_never(proc_spec)
766-
767-
768-
def preproc_v5_to_processing(
769-
inp: v0_5.InputTensorDescr,
770-
proc_spec: v0_5.PreprocessingDescr,
771-
) -> Processing:
772-
if isinstance(proc_spec, v0_5.BinarizeDescr):
773-
return Binarize.from_proc_descr(proc_spec, inp.id)
774-
elif isinstance(proc_spec, v0_5.ClipDescr):
775-
return Clip.from_proc_descr(proc_spec, inp.id)
776-
elif isinstance(proc_spec, v0_5.ScaleLinearDescr):
777-
return ScaleLinear.from_proc_descr(proc_spec, inp.id)
778-
elif isinstance(proc_spec, v0_5.ScaleRangeDescr):
779-
return ScaleRange.from_proc_descr(proc_spec, inp.id)
780-
elif isinstance(proc_spec, v0_5.SigmoidDescr):
781-
return Sigmoid.from_proc_descr(proc_spec, inp.id)
782-
elif isinstance(proc_spec, v0_5.EnsureDtypeDescr):
783-
return EnsureDtype.from_proc_descr(proc_spec, inp.id)
784-
elif isinstance(proc_spec, v0_5.ZeroMeanUnitVarianceDescr):
785-
return ZeroMeanUnitVariance.from_proc_descr(proc_spec, inp.id)
786-
elif isinstance(proc_spec, v0_5.FixedZeroMeanUnitVarianceDescr):
787-
return FixedZeroMeanUnitVariance.from_proc_descr(proc_spec, inp.id)
788-
else:
789-
assert_never(proc_spec)
790-
791-
792-
def postproc_v5_to_processing(
793-
inp: v0_5.OutputTensorDescr,
794-
proc_spec: v0_5.PostprocessingDescr,
795-
) -> Processing:
796-
if isinstance(proc_spec, v0_5.BinarizeDescr):
797-
return Binarize.from_proc_descr(proc_spec, inp.id)
798-
if isinstance(proc_spec, v0_5.ScaleMeanVarianceDescr):
799-
return ScaleMeanVariance.from_proc_descr(proc_spec, inp.id)
800-
elif isinstance(proc_spec, v0_5.ClipDescr):
801-
return Clip.from_proc_descr(proc_spec, inp.id)
802-
elif isinstance(proc_spec, v0_5.ScaleLinearDescr):
803-
return ScaleLinear.from_proc_descr(proc_spec, inp.id)
804-
elif isinstance(proc_spec, v0_5.ScaleRangeDescr):
805-
return ScaleRange.from_proc_descr(proc_spec, inp.id)
806-
elif isinstance(proc_spec, v0_5.SigmoidDescr):
807-
return Sigmoid.from_proc_descr(proc_spec, inp.id)
808-
elif isinstance(proc_spec, v0_5.EnsureDtypeDescr):
809-
return EnsureDtype.from_proc_descr(proc_spec, inp.id)
810-
elif isinstance(proc_spec, v0_5.ZeroMeanUnitVarianceDescr):
811-
return ZeroMeanUnitVariance.from_proc_descr(proc_spec, inp.id)
812-
elif isinstance(proc_spec, v0_5.FixedZeroMeanUnitVarianceDescr):
813-
return FixedZeroMeanUnitVariance.from_proc_descr(proc_spec, inp.id)
722+
return ZeroMeanUnitVariance.from_proc_descr(proc_descr, member_id)
814723
else:
815-
assert_never(proc_spec)
724+
assert_never(proc_descr)

bioimageio/core/proc_setup.py

Lines changed: 36 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,15 @@
1212

1313
from typing_extensions import assert_never
1414

15+
from bioimageio.core.digest_spec import get_member_id
1516
from bioimageio.spec.model import AnyModelDescr, v0_4, v0_5
16-
from bioimageio.spec.model.v0_5 import TensorId
1717

1818
from .proc_ops import (
1919
AddKnownDatasetStats,
2020
EnsureDtype,
2121
Processing,
2222
UpdateStats,
23-
postproc_v4_to_processing,
24-
postproc_v5_to_processing,
25-
preproc_v4_to_processing,
26-
preproc_v5_to_processing,
23+
get_proc,
2724
)
2825
from .sample import Sample
2926
from .stat_calculators import StatsCalculator
@@ -173,61 +170,50 @@ def get_requried_sample_measures(model: AnyModelDescr) -> RequiredSampleMeasures
173170
)
174171

175172

176-
def _prepare_v4_preprocs(
177-
tensor_descrs: Sequence[v0_4.InputTensorDescr],
173+
def _prepare_procs(
174+
tensor_descrs: Union[
175+
Sequence[v0_4.InputTensorDescr],
176+
Sequence[v0_5.InputTensorDescr],
177+
Sequence[v0_4.OutputTensorDescr],
178+
Sequence[v0_5.OutputTensorDescr],
179+
],
178180
) -> List[Processing]:
179181
procs: List[Processing] = []
180182
for t_descr in tensor_descrs:
181-
member_id = TensorId(str(t_descr.name))
182-
procs.append(
183-
EnsureDtype(input=member_id, output=member_id, dtype=t_descr.data_type)
184-
)
185-
for proc_d in t_descr.preprocessing:
186-
procs.append(preproc_v4_to_processing(t_descr, proc_d))
187-
return procs
188-
189-
190-
def _prepare_v4_postprocs(
191-
tensor_descrs: Sequence[v0_4.OutputTensorDescr],
192-
) -> List[Processing]:
193-
procs: List[Processing] = []
194-
for t_descr in tensor_descrs:
195-
member_id = TensorId(str(t_descr.name))
196-
procs.append(
197-
EnsureDtype(input=member_id, output=member_id, dtype=t_descr.data_type)
198-
)
199-
for proc_d in t_descr.postprocessing:
200-
procs.append(postproc_v4_to_processing(t_descr, proc_d))
201-
return procs
202-
183+
if isinstance(t_descr, (v0_4.InputTensorDescr, v0_4.OutputTensorDescr)):
184+
member_id = get_member_id(t_descr)
185+
procs.append(
186+
EnsureDtype(input=member_id, output=member_id, dtype=t_descr.data_type)
187+
)
188+
189+
if isinstance(t_descr, (v0_4.InputTensorDescr, v0_5.InputTensorDescr)):
190+
for proc_d in t_descr.preprocessing:
191+
procs.append(get_proc(proc_d, t_descr))
192+
elif isinstance(t_descr, (v0_4.OutputTensorDescr, v0_5.OutputTensorDescr)):
193+
for proc_d in t_descr.postprocessing:
194+
procs.append(get_proc(proc_d, t_descr))
195+
else:
196+
assert_never(t_descr)
197+
198+
if isinstance(
199+
t_descr,
200+
(v0_4.InputTensorDescr, (v0_4.InputTensorDescr, v0_4.OutputTensorDescr)),
201+
) and not isinstance(procs[-1], EnsureDtype):
202+
member_id = get_member_id(t_descr)
203+
procs.append(
204+
EnsureDtype(input=member_id, output=member_id, dtype=t_descr.data_type)
205+
)
203206

204-
def _prepare_v5_preprocs(
205-
tensor_descrs: Sequence[v0_5.InputTensorDescr],
206-
) -> List[Processing]:
207-
procs: List[Processing] = []
208-
for t_descr in tensor_descrs:
209-
for proc_d in t_descr.preprocessing:
210-
procs.append(preproc_v5_to_processing(t_descr, proc_d))
211-
return procs
212-
213-
214-
def _prepare_v5_postprocs(
215-
tensor_descrs: Sequence[v0_5.OutputTensorDescr],
216-
) -> List[Processing]:
217-
procs: List[Processing] = []
218-
for t_descr in tensor_descrs:
219-
for proc_d in t_descr.postprocessing:
220-
procs.append(postproc_v5_to_processing(t_descr, proc_d))
221207
return procs
222208

223209

224210
def _prepare_setup_pre_and_postprocessing(model: AnyModelDescr) -> _SetupProcessing:
225211
if isinstance(model, v0_4.ModelDescr):
226-
pre = _prepare_v4_preprocs(model.inputs)
227-
post = _prepare_v4_postprocs(model.outputs)
212+
pre = _prepare_procs(model.inputs)
213+
post = _prepare_procs(model.outputs)
228214
elif isinstance(model, v0_5.ModelDescr):
229-
pre = _prepare_v5_preprocs(model.inputs)
230-
post = _prepare_v5_postprocs(model.outputs)
215+
pre = _prepare_procs(model.inputs)
216+
post = _prepare_procs(model.outputs)
231217
else:
232218
assert_never(model)
233219

0 commit comments

Comments
 (0)