class ParametrizedInputShape(SharedBioImageIOSchema): min = fields.List( fields.Integer(), required=True, bioimageio_description="The minimum input shape with same length as `axes`" ) step = fields.List( fields.Integer(), required=True, bioimageio_description="The minimum shape change with same length as `axes`" ) @validates_schema def matching_lengths(self, data, **kwargs): min_ = data["min"] step = data["step"] if min_ is None or step is None: return if len(min_) != len(step): raise ValidationError(f"'min' and 'step' have to have the same length! (min: {min_}, step: {step})")
class OutputTensor(_TensorBase): shape = fields.Union( [ fields.ExplicitShape(), fields.Nested( ImplicitOutputShape(), bioimageio_description= "In reference to the shape of an input tensor, the shape of the output " "tensor is `shape = shape(input_tensor) * scale + 2 * offset`.", ), ], required=True, bioimageio_description="Specification of output tensor shape.", ) halo = fields.List( fields.Integer(), bioimageio_description= "The halo to crop from the output tensor (for example to crop away boundary effects or " "for tiling). The halo should be cropped from both sides, i.e. `shape_after_crop = shape - 2 * halo`. The " "`halo` is not cropped by the bioimage.io model, but is left to be cropped by the consumer software. Use " "`shape:offset` if the model output itself is cropped and input and output shapes not fixed.", ) postprocessing = fields.List( fields.Nested(Postprocessing()), bioimageio_description= "Description of how this output should be postprocessed.", ) processing_name = "postprocessing" @validates_schema def matching_halo_length(self, data, **kwargs): shape = data.get("shape") halo = data.get("halo") if halo is None: return elif isinstance(shape, list) or isinstance( shape, raw_nodes.ImplicitOutputShape): if shape is None or len(halo) != len(shape): raise ValidationError( f"halo {halo} has to have same length as shape {shape}!") else: raise NotImplementedError(type(shape))
class OutputTensor(_TensorBase): shape = fields.Union( [ fields.ExplicitShape(), fields.Nested( ImplicitOutputShape(), bioimageio_description="In reference to the shape of an input tensor, the shape of the output " "tensor is `shape = shape(input_tensor) * scale + 2 * offset`.", ), ], required=True, bioimageio_description="Specification of output tensor shape.", ) halo = fields.List( fields.Integer(), bioimageio_description=lambda: "Hint to describe the potentially corrupted edge region of the output tensor, due to " "boundary effects. " "The `halo` is not cropped by the bioimage.io model, but is left to be cropped by the consumer software. " f"An example implementation of prediction with tiling, accounting for the halo can be found [here](" f"{get_ref_url('function', '_predict_with_tiling_impl', 'https://github.com/bioimage-io/core-bioimage-io-python/blob/main/bioimageio/core/prediction.py')}). " "Use `shape:offset` if the model output itself is cropped and input and output shapes not fixed. ", ) postprocessing = fields.List( fields.Nested(Postprocessing()), bioimageio_description="Description of how this output should be postprocessed.", ) processing_name = "postprocessing" @validates_schema def matching_halo_length(self, data, **kwargs): shape = data["shape"] halo = data.get("halo") if halo is None: return elif isinstance(shape, list) or isinstance(shape, raw_nodes.ImplicitOutputShape): if len(halo) != len(shape): raise ValidationError(f"halo {halo} has to have same length as shape {shape}!") else: raise NotImplementedError(type(shape))
class OnnxWeightsEntry(_WeightsEntryBase): bioimageio_description = "ONNX weights format" weights_format = fields.String(validate=field_validators.Equal("onnx"), required=True, load_only=True) opset_version = fields.Integer()
def test_wrong_dtype(self): data = [[1, 2], [3, 4.5]] with raises(ValidationError): fields.Array(fields.Integer(strict=True)).deserialize(data)
def test_2d(self): data = [[1, 2], [3, 4]] expected = numpy.array(data, dtype=int) actual = fields.Array(fields.Integer(strict=True)).deserialize(data) assert_equal(actual, expected)
def test_invalid_scalar(self): data = "invalid" with raises(ValidationError): fields.Array(fields.Integer(strict=True)).deserialize(data)
def test_scalar(self): data = 1 expected = data actual = fields.Array(fields.Integer(strict=True)).deserialize(data) assert_equal(actual, expected)
def test_uneuqal_sublen(self): with raises(ValidationError): fields.Array(fields.Integer(strict=True)).deserialize([[1, 2], [3]])
def test_unequal_nesting_depth(self): with raises(ValidationError): fields.Array(fields.Integer(strict=True)).deserialize([[1, 2], 3])