phenotypic.abc_.PrefabPipeline#

class phenotypic.abc_.PrefabPipeline(*, name: str = <factory>, desc: str | None = None, benchmark: bool = False, verbose: bool = False, reset: bool = False, nrows: int | None = None, ncols: int | None = None, ops: ~typing.Dict[str, ~phenotypic.abc_._image_operation.ImageOperation | ~phenotypic._core._pipeline_parts._image_pipeline_core.ImagePipelineCore] = <factory>, meas: ~typing.Dict[str, ~phenotypic.abc_._measure_features.MeasureFeatures] = {}, post: ~typing.Dict[str, ~phenotypic.abc_._post_measurement.PostMeasurement] = {}, filters: ~typing.Dict[str, ~phenotypic.analysis.abc_._set_analyzer.SetAnalyzer] = {}, model: ~phenotypic.analysis.abc_._model_fitter.ModelFitter | None = None, qc: ~typing.List[~phenotypic.sdk_._qc_recipe._recipe.QcRecipeEntry] = <factory>)[source]#

Bases: ImagePipeline

Marker class for pre-built, validated image processing pipelines from the PhenoTypic team.

PrefabPipeline is a specialized subclass of ImagePipeline that distinguishes “official” pre-built pipelines maintained by the PhenoTypic development team from user-created custom pipelines. It serves as a marker class (no additional functionality) that signals “this pipeline is validated, documented, and recommended for specific use cases in microbe colony phenotyping.”

What is PrefabPipeline?

PrefabPipeline is NOT an operation ABC and does NOT inherit from BaseOperation. Instead, it’s a subclass of ImagePipeline that:

  • Is a marker class: Inherits all ImagePipeline functionality unchanged; no new methods.

  • Indicates official status: Subclasses of PrefabPipeline are pre-built, validated pipelines with documented performance, parameter settings, and recommended use cases.

  • Enables classification: Code can distinguish official pipelines (isinstance(obj, PrefabPipeline)) from user-defined pipelines for documentation, discovery, or defaulting.

  • Provides templates: Each PrefabPipeline subclass is a complete processing workflow (enhancement, detection, refinement, measurement) ready to use out-of-the-box.

Quick Decision Guide: PrefabPipeline vs Custom ImagePipeline

  • Use PrefabPipeline for standard colony phenotyping on agar plates with validated workflows

  • Use custom ImagePipeline for novel imaging scenarios, optimization experiments, or specialized workflows

  • Start with PrefabPipeline to understand the pipeline structure, then customize via parameter tuning

  • Clone and modify a PrefabPipeline subclass when you need significant algorithm changes

  • Combine multiple PrefabPipelines sequentially for complex multi-stage workflows

Available PrefabPipeline Subclasses

The PhenoTypic team maintains several pre-built pipelines optimized for different imaging scenarios:

  1. [HeavyOtsuPipeline](src/phenotypic/prefab/_heavy_otsu_pipeline.py): Multi-layer Otsu detection with aggressive refinement. Robust detection on challenging images (uneven lighting, varied sizes). Computationally expensive.

  2. [HeavyWatershedPipeline](src/phenotypic/prefab/_heavy_watershed_pipeline.py): Watershed segmentation for separated colonies. Handles closely-spaced or merged colonies. Very expensive; for small batches or deep analysis.

  3. [RoundPeaksPipeline](src/phenotypic/prefab/_round_peaks_pipeline.py): Peak detection for circular, well-separated colonies. Fast and suitable for high-throughput screening of early-time-point growth.

  4. [GridSectionPipeline](src/phenotypic/prefab/_grid_section_pipeline.py): Per-well section extraction and fine-grained analysis. Moderate cost; enables per-well quality control and segmentation.

  5. [FilamentousFungiPipeline](src/phenotypic/prefab/_filamentous_fungi_pipeline.py): Two-stage filamentous fungi detection with optional Dijkstra branch reconnection. For irregular spreading colonies.

When to use PrefabPipeline vs Custom ImagePipeline

  • Use PrefabPipeline if: - You’re analyzing colony growth on agar plates (the intended use case). - You want an immediately usable, tested workflow without configuration. - You want to reproduce results matching published benchmarks or team documentation. - You need a baseline for custom extensions (subclass or copy and modify).

  • Create a custom ImagePipeline if: - Your imaging scenario is novel (unusual plate format, different organisms, special preparation). - You want to experiment with different detector/refiner/measurement combinations. - You have labeled ground truth and want to optimize parameters for your specific images. - You need pipeline extensions (custom operations not in standard library).

Using a PrefabPipeline

PrefabPipeline subclasses are used exactly like ImagePipeline:

from phenotypic import Image, GridImage
from phenotypic.prefab import HeavyOtsuPipeline

# Load image(s)
image = GridImage.imread('plate.jpg', nrows=8, ncols=12)

# Instantiate and apply pipeline
pipeline = HeavyOtsuPipeline()
result = pipeline.apply(image)  # or .operate([image])

# Access results
colonies = result.objects
measurements = result.measurements
print(f"Detected: {len(colonies)} colonies")
print(f"Measurements shape: {measurements.shape}")

Customizing a PrefabPipeline

PrefabPipelines accept tunable parameters in __init__() to adapt to your images without rebuilding the pipeline structure:

from phenotypic.prefab import HeavyOtsuPipeline

# Use defaults (recommended for most cases)
pipeline1 = HeavyOtsuPipeline()

# Tune for noisier images
pipeline2 = HeavyOtsuPipeline(
    gaussian_sigma=7,                    # Stronger blur
    small_object_min_size=150,           # More aggressive noise removal
    border_remover_size=2                # Remove more edge objects
)

# Parameters are typically named after the algorithm or parameter they control.
# See pipeline docstring for available parameters and typical values.

When Parameters Fail: Creating a Custom Pipeline

If PrefabPipeline parameter tuning doesn’t solve your problem:

  1. Analyze failures: Which step fails (detection, refinement, measurement)?

  • Use pipeline.benchmark=True, verbose=True to trace execution.

  • Visually inspect intermediate results (detection masks, refined masks).

  1. Create a custom pipeline:

from phenotypic import ImagePipeline
from phenotypic.enhance import GaussianBlur, EnhanceLocalContrast
from phenotypic.detect import CannyDetector  # Different detector
from phenotypic.refine import SmallObjectRemover, MaskFill
from phenotypic.measure import MeasureShape, MeasureColor

# Custom pipeline for your specific use case
custom = ImagePipeline()
custom.add(GaussianBlur(sigma=3))
custom.add(EnhanceLocalContrast())
custom.add(CannyDetector(sigma=1.5, low_threshold=0.1, high_threshold=0.4))
custom.add(SmallObjectRemover(min_size=100))
custom.add(MaskFill())
custom.add(MeasureShape())
custom.add(MeasureColor())

# Test and iterate
result = custom.operate([image])
  1. Share successful custom pipelines: If you develop a successful custom pipeline for a new imaging scenario, consider contributing it as a PrefabPipeline subclass to the project.

Pipeline Composition Pattern

Combine multiple PrefabPipelinesor mix PrefabPipeline with custom operations:

from phenotypic import ImagePipeline
from phenotypic.prefab import HeavyOtsuPipeline, RoundPeaksPipeline
from phenotypic.refine import SmallObjectRemover
from phenotypic.measure import MeasureIntensity

# Combine different detection strategies with shared refinement
pipeline = ImagePipeline()
pipeline.add(HeavyOtsuPipeline())  # First detection attempt
pipeline.add(SmallObjectRemover(min_size=100))  # Noise removal
pipeline.add(MeasureIntensity())  # Measurement

# Apply to image
result = pipeline.apply(image)

Pipeline Serialization Pattern

Save and load pipelines for reproducible batch processing:

from phenotypic.prefab import HeavyOtsuPipeline

# Create, configure, and save
pipeline = HeavyOtsuPipeline(gaussian_sigma=2.0, small_object_min_size=150)
pipeline.to_json('my_colony_pipeline.json')  # Save configuration
# pipeline.to_yaml('my_colony_pipeline.yaml')  # Alternative format

# Load for batch processing (reproducible results)
loaded = HeavyOtsuPipeline.from_json('my_colony_pipeline.json')
results = loaded.operate([image1, image2, image3])

Extending PrefabPipeline

To create a new official PrefabPipeline subclass:

from phenotypic.abc_ import PrefabPipeline
from phenotypic.enhance import GaussianBlur, EnhanceLocalContrast
from phenotypic.detect import OtsuDetector
from phenotypic.refine import SmallObjectRemover
from phenotypic.measure import MeasureShape

class MyCustomPrefabPipeline(PrefabPipeline):
    '''Brief description of when to use this pipeline.'''

    def __init__(self, param1: int = 100, param2: float = 1.5,
                 benchmark: bool = False, verbose: bool = False):
        '''Initialize with tunable parameters.'''
        pipe_cfgs = [
            GaussianBlur(sigma=param2),
            EnhanceLocalContrast(),
            OtsuDetector(),
            SmallObjectRemover(min_size=param1),
        ]
        meas = [MeasureShape()]
        super().__init__(pipe_cfgs=pipe_cfgs, meas=meas, benchmark=benchmark,
                       verbose=verbose)

Notes

  • Is a marker, not an operation: PrefabPipeline does not inherit from BaseOperation. It’s a convenient subclass of ImagePipeline for classification and discovery.

  • Inheritance of ImagePipeline features: PrefabPipeline inherits all ImagePipeline functionality: sequential operation chaining, benchmarking, verbose logging, batch processing via .operate(), and serialization via .to_yaml() / .from_yaml().

  • Parameter tuning via __init__(): Most PrefabPipeline subclasses expose key algorithm parameters in __init__() (e.g., detection threshold, smoothing sigma, refinement shape). Adjust these for your specific images before scaling to large batches.

  • Benchmarking for profiling: Set benchmark=True when instantiating to track execution time and memory usage per operation. Useful for identifying bottlenecks in large batch runs.

  • Documentation and examples: Each PrefabPipeline subclass is documented with use cases, typical parameters, performance characteristics, and example code. Check the subclass docstring for guidance.

  • Not for operations: Use PrefabPipeline only for complete pipelines. For individual operations (detection, enhancement, measurement), use operation ABCs directly.

Examples

Quick start: Detect colonies with HeavyOtsuPipeline:

>>> from phenotypic import GridImage
>>> from phenotypic.prefab import HeavyOtsuPipeline
>>> # Load a 96-well plate image
>>> image = GridImage.imread('agar_plate.jpg', nrows=8, ncols=12)
>>> # Use the pre-built, validated pipeline
>>> pipeline = HeavyOtsuPipeline()
>>> result = pipeline.apply(image)
>>> # Access results
>>> print(f"Detected {len(result.objects)} colonies")
>>> print(f"Measurements: {result.measurements.columns.tolist()}")

Batch processing multiple plates with a PrefabPipeline:

>>> from phenotypic import GridImage
>>> from phenotypic.prefab import HeavyOtsuPipeline
>>> import glob
>>> # Load multiple plate images
>>> image_paths = glob.glob('batch_*.jpg')
>>> images = [GridImage.imread(p, nrows=8, ncols=12)
...           for p in image_paths]
>>> # Create pipeline (reusable for all images)
>>> pipeline = HeavyOtsuPipeline(benchmark=True)
>>> # Batch process
>>> results = pipeline.operate(images)
>>> # Collect results
>>> for i, result in enumerate(results):
...     print(f"Image {i}: {len(result.objects)} colonies")
...     print(f"Measurements shape: {result.measurements.shape}")

Customizing pipeline parameters for difficult images:

>>> from phenotypic import GridImage
>>> from phenotypic.prefab import HeavyOtsuPipeline
>>> image = GridImage.imread('noisy_plate.jpg', nrows=8, ncols=12)
>>> # Increase smoothing and noise removal for difficult images
>>> pipeline = HeavyOtsuPipeline(
...     gaussian_sigma=8,                      # Stronger blur
...     small_object_min_size=200,             # Aggressive noise removal
...     border_remover_size=2                  # More border filtering
... )
>>> result = pipeline.apply(image)
>>> print(f"Robust detection: {len(result.objects)} colonies")

Comparing PrefabPipeline vs custom pipeline:

>>> from phenotypic import GridImage, ImagePipeline
>>> from phenotypic.prefab import HeavyOtsuPipeline
>>> from phenotypic.detect import CannyDetector
>>> from phenotypic.refine import SmallObjectRemover
>>> image = GridImage.imread('plate.jpg', nrows=8, ncols=12)
>>> # Option 1: Use pre-built validated pipeline
>>> prefab = HeavyOtsuPipeline()
>>> result1 = prefab.apply(image)
>>> # Option 2: Create custom pipeline for comparison
>>> custom = ImagePipeline()
>>> from phenotypic.enhance import GaussianBlur
>>> custom.add(GaussianBlur(sigma=2))
>>> custom.add(CannyDetector(sigma=1.5, low_threshold=0.1, high_threshold=0.4))
>>> custom.add(SmallObjectRemover(min_size=100))
>>> result2 = custom.apply(image)
>>> # Compare results
>>> print(f"Prefab: {len(result1.objects)}, Custom: {len(result2.objects)}")

Methods

__init__

Create a new model by parsing and validating input data from keyword arguments.

analyze

Run the analysis chain (filters then model) against an aggregate frame.

apply

The class provides an interface to process and apply a series of operations on an Image.

apply_and_measure

Applies processing to the given image and measures the results.

apply_napari

Apply the pipeline and progressively add layers to a napari viewer.

apply_with_intermediates

Apply the pipeline and capture a snapshot of the image after each operation.

benchmark_results

Return execution times and memory usage for operations and measurements.

construct

copy

Returns a copy of the model.

dict

from_json

Deserialize a PrefabPipeline from JSON.

from_orm

get_filters

Get a copy of the analysis filter chain.

get_meas

Get a copy of the measurements dictionary.

get_model

Get the analysis endpoint model, if configured.

get_ops

Get a copy of the operations dictionary.

get_post

Get a copy of the post-measurement transforms dictionary.

get_qc

Get a copy of the QC config entry list.

json

measure

Measures properties of a given image and optionally includes metadata.

model_construct

Creates a new instance of the Model class with validated data.

model_copy

!!! abstract "Usage Documentation"

model_dump

!!! abstract "Usage Documentation"

model_dump_json

!!! abstract "Usage Documentation"

model_json_schema

Generates a JSON schema for a model class.

model_parametrized_name

Compute the class name for parametrizations of generic classes.

model_post_init

Initialize logging and memory tracking after model construction.

model_rebuild

Try to rebuild the pydantic-core schema for the model.

model_validate

Validate a pydantic model instance.

model_validate_json

!!! abstract "Usage Documentation"

model_validate_strings

Validate the given object with string data against the Pydantic model.

parse_file

parse_obj

parse_raw

schema

schema_json

set_filters

Set the analysis filter chain.

set_meas

Sets the measurements to be used for further computation.

set_model

Set the analysis endpoint model.

set_ops

Sets the operations to be performed.

set_post

Set the post-measurement transforms.

set_qc

Set the QC config entry list.

to_json

Serialize the pipeline configuration to JSON format.

update_forward_refs

validate

widget

Return (and optionally display) the root widget.

Attributes

desc

Get pipeline description.

model_computed_fields

model_config

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

model_extra

Get extra fields set during validation.

model_fields

model_fields_set

Returns the set of fields that have been explicitly set on this model instance.

name

desc_value

benchmark

verbose

reset

nrows

ncols

ops

meas

post

filters

model

qc

Parameters:
classmethod from_json(json_data: str | Path | dict, benchmark: bool = False, verbose: bool = False) PrefabPipeline[source]#

Deserialize a PrefabPipeline from JSON.

PrefabPipeline subclasses build their ops/meas inside __init__, so the base from_json (which passes ops= directly) would conflict. This override deserializes via ImagePipeline and re-tags the instance as the correct PrefabPipeline subclass.

Parameters:
  • json_data (str | Path | dict) – A JSON string, path to a JSON file, or a pre-parsed dict.

  • benchmark (bool) – Whether to enable benchmarking for the pipeline.

  • verbose (bool) – Whether to enable verbose output.

Returns:

A PrefabPipeline (or subclass) instance with the loaded configuration.

Return type:

PrefabPipeline

__copy__() Self#

Returns a shallow copy of the model.

Return type:

Self

__deepcopy__(memo: dict[int, Any] | None = None) Self#

Returns a deep copy of the model.

Parameters:

memo (dict[int, Any] | None)

Return type:

Self

__del__()#

Automatically stop tracemalloc when the object is deleted.

classmethod __get_pydantic_json_schema__(core_schema: CoreSchema, handler: GetJsonSchemaHandler, /) JsonSchemaValue#

Hook into generating the model’s JSON schema.

Parameters:
  • core_schema (CoreSchema) – A pydantic-core CoreSchema. You can ignore this argument and call the handler with a new CoreSchema, wrap this CoreSchema ({‘type’: ‘nullable’, ‘schema’: current_schema}), or just call the handler with the original schema.

  • handler (GetJsonSchemaHandler) – Call into Pydantic’s internal JSON schema generation. This will raise a pydantic.errors.PydanticInvalidForJsonSchema if JSON schema generation fails. Since this gets called by BaseModel.model_json_schema you can override the schema_generator argument to that function to change JSON schema generation globally for a type.

Returns:

A JSON schema, as a Python object.

Return type:

JsonSchemaValue

__init__(**data: Any) None#

Create a new model by parsing and validating input data from keyword arguments.

Raises [ValidationError][pydantic_core.ValidationError] if the input data cannot be validated to form a valid model.

self is explicitly positional-only to allow self as a field name.

Parameters:

data (Any)

Return type:

None

__iter__() Generator[tuple[str, Any], None, None]#

So dict(model) works.

Return type:

Generator[tuple[str, Any], None, None]

__pretty__(fmt: Callable[[Any], Any], **kwargs: Any) Generator[Any]#

Used by devtools (https://python-devtools.helpmanual.io/) to pretty print objects.

Parameters:
Return type:

Generator[Any]

classmethod __pydantic_init_subclass__(**kwargs: Any) None#

Populate field descriptions from the subclass docstring.

Runs once per concrete subclass after pydantic has built its model. Copies parameter descriptions parsed from the Google-style Args: docstring block onto each field’s description slot so they surface in model_json_schema() — the machine-readable contract used by downstream tooling (e.g. an MCP server).

Parameters:

**kwargs (Any) – Class-keyword arguments forwarded by pydantic.

Return type:

None

classmethod __pydantic_on_complete__() None#

This is called once the class and its fields are fully initialized and ready to be used.

This typically happens when the class is created (just before [__pydantic_init_subclass__()][pydantic.main.BaseModel.__pydantic_init_subclass__] is called on the superclass), except when forward annotations are used that could not immediately be resolved. In that case, it will be called later, when the model is rebuilt automatically or explicitly using [model_rebuild()][pydantic.main.BaseModel.model_rebuild].

Return type:

None

__repr_name__() str#

Name of the instance’s class, used in __repr__.

Return type:

str

__repr_recursion__(object: Any) str#

Returns the string representation of a recursive object.

Parameters:

object (Any)

Return type:

str

__rich_repr__() RichReprResult#

Used by Rich (https://rich.readthedocs.io/en/stable/pretty.html) to pretty print objects.

Return type:

RichReprResult

__str__() str#

Return a JSON-formatted string representation of the pipeline.

The generated JSON string provides a structured representation of the object’s current state, including its operations and measurements. This output can be used for logging, debugging, or to recreate the object’s configuration in another context.

Returns:

A JSON-formatted string that encodes the object’s current configuration in a human-readable manner. This includes the phenotypic version, pipeline name, description, and the lists of operations and measurements.

Return type:

str

analyze(df: pandas.DataFrame) pandas.DataFrame#

Run the analysis chain (filters then model) against an aggregate frame.

Applies each filter in order — each transforms a DataFrame into another DataFrame — then runs the configured terminal model to produce a fit summary (typically one row per group).

The expected input is the post-applied, aggregated DataFrame the CLI seeds into measurements.parquet. analyze does not apply post itself: by default measure() runs self._post before returning, and the CLI applies post explicitly to a copy of the aggregated master before invoking analyze. Callers passing apply_post=False to measure() are responsible for applying post (or accepting that filters/model see pre-post data) before calling analyze.

Parameters:

df (pandas.DataFrame) – The aggregate measurements DataFrame.

Returns:

The model-fit output (one row per group, plus shared

MODEL_METRICS columns for fit quality).

Return type:

pd.DataFrame

Raises:

ValueError – If no model is configured. Configure via set_model() (or pass model= at construction).

apply(image: Image, inplace: bool = False, reset: bool | None = None) GridImage | Image#

The class provides an interface to process and apply a series of operations on an Image. The operations are maintained in a queue and executed sequentially when applied to the given Image.

Parameters:
  • image (Image) – The arr Image to be processed. The type Image refers to an instance of the Image object to which transformations are applied.

  • inplace (bool, optional) – A flag indicating whether to apply the transformations directly on the provided Image (True) or create a copy of the Image before performing transformations (False). Defaults to False.

  • reset (bool, optional) – Whether to reset the image before applying the pipeline. If None (default), uses the pipeline’s reset setting from __init__. If explicitly set to True or False, overrides the pipeline setting.

Return type:

Union[GridImage, Image]

apply_and_measure(image: Image, inplace: bool = False, reset: bool | None = None, include_metadata: bool = True, apply_post: bool = True) pd.DataFrame#

Applies processing to the given image and measures the results.

This function first applies a processing method to the supplied image, adjusting it based on the given parameters. After processing, the resulting image is measured, and a DataFrame containing the measurement data is returned.

Parameters:
  • image (Image) – The image to process and measure.

  • inplace (bool) – Whether to modify the original image directly or work on a copy. Default is False.

  • reset (bool, optional) – Whether to reset any previous processing on the image before applying the current method. If None (default), uses the pipeline’s reset setting. If explicitly set, overrides the pipeline setting.

  • include_metadata (bool) – Whether to include metadata in the measurement results. Default is True.

  • apply_post (bool) – Forwarded to measure(). When False, the returned DataFrame skips PostMeasurement ops. Defaults to True.

Returns:

A DataFrame containing measurement data for the processed image.

Return type:

pd.DataFrame

apply_napari(image: Image, inplace: bool = False, reset: bool | None = None, viewer: napari.Viewer | None = None) NapariPipelineResult#

Apply the pipeline and progressively add layers to a napari viewer.

Creates (or reuses) a napari viewer and adds the original image layers as a baseline, then adds the modified layer after each operation completes. Layer names follow the pattern {step:02d}_{OperationName}_{accessor}.

Parameters:
  • image (Image) – The input image to process.

  • inplace (bool) – If True the image is modified in place; otherwise a copy is made first. Defaults to False.

  • reset (bool | None) – Whether to reset the image before applying operations. None (default) uses the pipeline-level setting.

  • viewer (napari.Viewer | None) – An existing napari viewer to add layers to. If None (default), a new viewer is created.

Returns:

Named tuple with the final image and the napari viewer reference.

Return type:

NapariPipelineResult

Raises:

ImportError – If napari is not installed.

apply_with_intermediates(image: Image, inplace: bool = False, reset: bool | None = None, output_dir: str | Path | None = None) IntermediateResult#

Apply the pipeline and capture a snapshot of the image after each operation.

Behaves identically to apply() (respecting inplace, reset, benchmark timing, and verbose/tqdm progress) but additionally records the image state after every operation completes.

Parameters:
  • image (Image) – The input image to process.

  • inplace (bool) – If True the image is modified in place; otherwise a copy is made first. Defaults to False.

  • reset (Optional[bool]) – Whether to reset the image before applying operations. None (default) uses the pipeline-level setting.

  • output_dir (Optional[Union[str, Path]]) – Optional directory path. When provided, each intermediate image is persisted to an HDF5 file inside this directory (created automatically) and the corresponding dict value is set to None to conserve memory. When None, intermediates are kept in memory as Image copies.

Returns:

A named tuple containing the final image and a dictionary mapping operation names to intermediate snapshots (or None when output_dir is used).

Return type:

IntermediateResult

benchmark_results() pandas.DataFrame#

Return execution times and memory usage for operations and measurements.

This method should be called after applying the pipeline on an image to get the execution times and memory consumption of the different processes.

When an operation is itself an ImagePipelineCore (nested pipeline), its sub-operations are expanded as indented sub-rows beneath the parent entry with names like "ParentOp > ChildOp".

Returns:

A DataFrame with columns Process Type,

Process Name, Execution Time (s), Memory Delta (MB), and RSS After (MB).

Return type:

pd.DataFrame

classmethod construct(_fields_set: set[str] | None = None, **values: Any) Self#
Parameters:
Return type:

Self

copy(*, include: AbstractSetIntStr | MappingIntStrAny | None = None, exclude: AbstractSetIntStr | MappingIntStrAny | None = None, update: Dict[str, Any] | None = None, deep: bool = False) Self#

Returns a copy of the model.

!!! warning “Deprecated”

This method is now deprecated; use model_copy instead.

If you need include or exclude, use:

`python {test="skip" lint="skip"} data = self.model_dump(include=include, exclude=exclude, round_trip=True) data = {**data, **(update or {})} copied = self.model_validate(data) `

Parameters:
  • include (AbstractSetIntStr | MappingIntStrAny | None) – Optional set or mapping specifying which fields to include in the copied model.

  • exclude (AbstractSetIntStr | MappingIntStrAny | None) – Optional set or mapping specifying which fields to exclude in the copied model.

  • update (Dict[str, Any] | None) – Optional dictionary of field-value pairs to override field values in the copied model.

  • deep (bool) – If True, the values of fields that are Pydantic models will be deep-copied.

Returns:

A copy of the model with included, excluded and updated fields as specified.

Return type:

Self

property desc: str#

Get pipeline description. Returns class docstring if no description set.

dict(*, include: set[int] | set[str] | Mapping[int, set[int] | set[str] | Mapping[int, IncEx | bool] | Mapping[str, IncEx | bool] | bool] | Mapping[str, set[int] | set[str] | Mapping[int, IncEx | bool] | Mapping[str, IncEx | bool] | bool] | None = None, exclude: set[int] | set[str] | Mapping[int, set[int] | set[str] | Mapping[int, IncEx | bool] | Mapping[str, IncEx | bool] | bool] | Mapping[str, set[int] | set[str] | Mapping[int, IncEx | bool] | Mapping[str, IncEx | bool] | bool] | None = None, by_alias: bool = False, exclude_unset: bool = False, exclude_defaults: bool = False, exclude_none: bool = False) Dict[str, Any]#
Parameters:
Return type:

Dict[str, Any]

classmethod from_orm(obj: Any) Self#
Parameters:

obj (Any)

Return type:

Self

get_filters() Dict[str, SetAnalyzer]#

Get a copy of the analysis filter chain.

Returns a shallow copy to prevent accidental mutation of internal state.

Returns:

Ordered dict mapping filter names to

SetAnalyzer instances. Empty when no filters configured.

Return type:

Dict[str, SetAnalyzer]

get_meas() Dict[str, MeasureFeatures]#

Get a copy of the measurements dictionary.

Returns a shallow copy to prevent accidental mutation of internal state.

Returns:

Dictionary mapping measurement names to

MeasureFeatures instances.

Return type:

Dict[str, MeasureFeatures]

get_model() ModelFitter | None#

Get the analysis endpoint model, if configured.

Returns:

The configured ModelFitter instance,

or None when no model is set.

Return type:

Optional[ModelFitter]

get_ops() Dict[str, ImageOperation | ImagePipelineCore]#

Get a copy of the operations dictionary.

Returns a shallow copy to prevent accidental mutation of internal state.

Returns:

Dictionary mapping

operation names to ImageOperation instances (or nested pipelines).

Return type:

Dict[str, ImageOperation | ImagePipelineCore]

get_post() Dict[str, PostMeasurement]#

Get a copy of the post-measurement transforms dictionary.

Returns a shallow copy to prevent accidental mutation of internal state.

Returns:

Dictionary mapping post-measurement

names to PostMeasurement instances.

Return type:

Dict[str, PostMeasurement]

get_qc() List[QcRecipeEntry]#

Get a copy of the QC config entry list.

Returns a shallow copy so callers cannot mutate the pipeline’s internal list by appending/removing. The entries themselves are shared (they are lightweight config dataclasses); run_qc and the GUI only read them and instantiate fresh checks from their params.

Returns:

Ordered QC config entries. Empty when no

checks are configured.

Return type:

List[QcRecipeEntry]

json(*, include: set[int] | set[str] | Mapping[int, set[int] | set[str] | Mapping[int, IncEx | bool] | Mapping[str, IncEx | bool] | bool] | Mapping[str, set[int] | set[str] | Mapping[int, IncEx | bool] | Mapping[str, IncEx | bool] | bool] | None = None, exclude: set[int] | set[str] | Mapping[int, set[int] | set[str] | Mapping[int, IncEx | bool] | Mapping[str, IncEx | bool] | bool] | Mapping[str, set[int] | set[str] | Mapping[int, IncEx | bool] | Mapping[str, IncEx | bool] | bool] | None = None, by_alias: bool = False, exclude_unset: bool = False, exclude_defaults: bool = False, exclude_none: bool = False, encoder: Callable[[Any], Any] | None = PydanticUndefined, models_as_dict: bool = PydanticUndefined, **dumps_kwargs: Any) str#
Parameters:
Return type:

str

measure(image: Image, include_metadata: bool = True, apply_post: bool = True) pd.DataFrame#

Measures properties of a given image and optionally includes metadata. The method performs measurements using a set of predefined measurement operations. If benchmarking is enabled, the execution time of each measurement is recorded. When verbose mode is active, detailed logging of the measurement process is displayed. A progress bar is used to track progress if the tqdm library is available.

Parameters:
  • image (Image) – The image object for which measurements are performed. It must support the info method and optionally a grid or objects attribute.

  • include_metadata (bool, optional) – Indicates whether metadata should be included in the measurements. Defaults to True.

  • apply_post (bool, optional) – Whether to apply the configured PostMeasurement operations to the merged frame before returning. Defaults to True. Pass False to obtain the pre-post merged DataFrame — useful when the caller (e.g. the CLI) wants to persist a clean copy and apply post separately.

Returns:

A DataFrame containing the results of all performed measurements combined

on the same index.

Return type:

pd.DataFrame

Raises:

Exception – An exception is raised if a measurement operation fails while being applied to the image.

model_computed_fields = {}#
model_config: ClassVar[ConfigDict] = {'arbitrary_types_allowed': True, 'extra': 'forbid', 'validate_assignment': True, 'validate_by_name': True}#

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

classmethod model_construct(_fields_set: set[str] | None = None, **values: Any) Self#

Creates a new instance of the Model class with validated data.

Creates a new model setting __dict__ and __pydantic_fields_set__ from trusted or pre-validated data. Default values are respected, but no other validation is performed.

!!! note

model_construct() generally respects the model_config.extra setting on the provided model. That is, if model_config.extra == ‘allow’, then all extra passed values are added to the model instance’s __dict__ and __pydantic_extra__ fields. If model_config.extra == ‘ignore’ (the default), then all extra passed values are ignored. Because no validation is performed with a call to model_construct(), having model_config.extra == ‘forbid’ does not result in an error if extra values are passed, but they will be ignored.

Parameters:
  • _fields_set (set[str] | None) – A set of field names that were originally explicitly set during instantiation. If provided, this is directly used for the [model_fields_set][pydantic.BaseModel.model_fields_set] attribute. Otherwise, the field names from the values argument will be used.

  • values (Any) – Trusted or pre-validated data dictionary.

Returns:

A new instance of the Model class with validated data.

Return type:

Self

model_copy(*, update: Mapping[str, Any] | None = None, deep: bool = False) Self#
!!! abstract “Usage Documentation”

[model_copy](../concepts/models.md#model-copy)

Returns a copy of the model.

!!! note

The underlying instance’s [__dict__][object.__dict__] attribute is copied. This might have unexpected side effects if you store anything in it, on top of the model fields (e.g. the value of [cached properties][functools.cached_property]).

Parameters:
  • update (Mapping[str, Any] | None) – Values to change/add in the new model. Note: the data is not validated before creating the new model. You should trust this data.

  • deep (bool) – Set to True to make a deep copy of the model.

Returns:

New model instance.

Return type:

Self

model_dump(*, mode: Literal['json', 'python'] | str = 'python', include: set[int] | set[str] | Mapping[int, set[int] | set[str] | Mapping[int, IncEx | bool] | Mapping[str, IncEx | bool] | bool] | Mapping[str, set[int] | set[str] | Mapping[int, IncEx | bool] | Mapping[str, IncEx | bool] | bool] | None = None, exclude: set[int] | set[str] | Mapping[int, set[int] | set[str] | Mapping[int, IncEx | bool] | Mapping[str, IncEx | bool] | bool] | Mapping[str, set[int] | set[str] | Mapping[int, IncEx | bool] | Mapping[str, IncEx | bool] | bool] | None = None, context: Any | None = None, by_alias: bool | None = None, exclude_unset: bool = False, exclude_defaults: bool = False, exclude_none: bool = False, exclude_computed_fields: bool = False, round_trip: bool = False, warnings: bool | Literal['none', 'warn', 'error'] = True, fallback: Callable[[Any], Any] | None = None, serialize_as_any: bool = False) dict[str, Any]#
!!! abstract “Usage Documentation”

[model_dump](../concepts/serialization.md#python-mode)

Generate a dictionary representation of the model, optionally specifying which fields to include or exclude.

Parameters:
  • mode (Literal['json', 'python'] | str) – The mode in which to_python should run. If mode is ‘json’, the output will only contain JSON serializable types. If mode is ‘python’, the output may contain non-JSON-serializable Python objects.

  • include (set[int] | set[str] | Mapping[int, set[int] | set[str] | Mapping[int, IncEx | bool] | Mapping[str, IncEx | bool] | bool] | Mapping[str, set[int] | set[str] | Mapping[int, IncEx | bool] | Mapping[str, IncEx | bool] | bool] | None) – A set of fields to include in the output.

  • exclude (set[int] | set[str] | Mapping[int, set[int] | set[str] | Mapping[int, IncEx | bool] | Mapping[str, IncEx | bool] | bool] | Mapping[str, set[int] | set[str] | Mapping[int, IncEx | bool] | Mapping[str, IncEx | bool] | bool] | None) – A set of fields to exclude from the output.

  • context (Any | None) – Additional context to pass to the serializer.

  • by_alias (bool | None) – Whether to use the field’s alias in the dictionary key if defined.

  • exclude_unset (bool) – Whether to exclude fields that have not been explicitly set.

  • exclude_defaults (bool) – Whether to exclude fields that are set to their default value.

  • exclude_none (bool) – Whether to exclude fields that have a value of None.

  • exclude_computed_fields (bool) – Whether to exclude computed fields. While this can be useful for round-tripping, it is usually recommended to use the dedicated round_trip parameter instead.

  • round_trip (bool) – If True, dumped values should be valid as input for non-idempotent types such as Json[T].

  • warnings (bool | Literal['none', 'warn', 'error']) – How to handle serialization errors. False/”none” ignores them, True/”warn” logs errors, “error” raises a [PydanticSerializationError][pydantic_core.PydanticSerializationError].

  • fallback (Callable[[Any], Any] | None) – A function to call when an unknown value is encountered. If not provided, a [PydanticSerializationError][pydantic_core.PydanticSerializationError] error is raised.

  • serialize_as_any (bool) – Whether to serialize fields with duck-typing serialization behavior.

Returns:

A dictionary representation of the model.

Return type:

dict[str, Any]

model_dump_json(*, indent: int | None = None, ensure_ascii: bool = False, include: set[int] | set[str] | Mapping[int, set[int] | set[str] | Mapping[int, IncEx | bool] | Mapping[str, IncEx | bool] | bool] | Mapping[str, set[int] | set[str] | Mapping[int, IncEx | bool] | Mapping[str, IncEx | bool] | bool] | None = None, exclude: set[int] | set[str] | Mapping[int, set[int] | set[str] | Mapping[int, IncEx | bool] | Mapping[str, IncEx | bool] | bool] | Mapping[str, set[int] | set[str] | Mapping[int, IncEx | bool] | Mapping[str, IncEx | bool] | bool] | None = None, context: Any | None = None, by_alias: bool | None = None, exclude_unset: bool = False, exclude_defaults: bool = False, exclude_none: bool = False, exclude_computed_fields: bool = False, round_trip: bool = False, warnings: bool | Literal['none', 'warn', 'error'] = True, fallback: Callable[[Any], Any] | None = None, serialize_as_any: bool = False) str#
!!! abstract “Usage Documentation”

[model_dump_json](../concepts/serialization.md#json-mode)

Generates a JSON representation of the model using Pydantic’s to_json method.

Parameters:
  • indent (int | None) – Indentation to use in the JSON output. If None is passed, the output will be compact.

  • ensure_ascii (bool) – If True, the output is guaranteed to have all incoming non-ASCII characters escaped. If False (the default), these characters will be output as-is.

  • include (set[int] | set[str] | Mapping[int, set[int] | set[str] | Mapping[int, IncEx | bool] | Mapping[str, IncEx | bool] | bool] | Mapping[str, set[int] | set[str] | Mapping[int, IncEx | bool] | Mapping[str, IncEx | bool] | bool] | None) – Field(s) to include in the JSON output.

  • exclude (set[int] | set[str] | Mapping[int, set[int] | set[str] | Mapping[int, IncEx | bool] | Mapping[str, IncEx | bool] | bool] | Mapping[str, set[int] | set[str] | Mapping[int, IncEx | bool] | Mapping[str, IncEx | bool] | bool] | None) – Field(s) to exclude from the JSON output.

  • context (Any | None) – Additional context to pass to the serializer.

  • by_alias (bool | None) – Whether to serialize using field aliases.

  • exclude_unset (bool) – Whether to exclude fields that have not been explicitly set.

  • exclude_defaults (bool) – Whether to exclude fields that are set to their default value.

  • exclude_none (bool) – Whether to exclude fields that have a value of None.

  • exclude_computed_fields (bool) – Whether to exclude computed fields. While this can be useful for round-tripping, it is usually recommended to use the dedicated round_trip parameter instead.

  • round_trip (bool) – If True, dumped values should be valid as input for non-idempotent types such as Json[T].

  • warnings (bool | Literal['none', 'warn', 'error']) – How to handle serialization errors. False/”none” ignores them, True/”warn” logs errors, “error” raises a [PydanticSerializationError][pydantic_core.PydanticSerializationError].

  • fallback (Callable[[Any], Any] | None) – A function to call when an unknown value is encountered. If not provided, a [PydanticSerializationError][pydantic_core.PydanticSerializationError] error is raised.

  • serialize_as_any (bool) – Whether to serialize fields with duck-typing serialization behavior.

Returns:

A JSON string representation of the model.

Return type:

str

property model_extra: dict[str, Any] | None#

Get extra fields set during validation.

Returns:

A dictionary of extra fields, or None if config.extra is not set to “allow”.

model_fields = {'benchmark': FieldInfo(annotation=bool, required=False, default=False, description='Whether to enable execution time tracking for operations and measurements.'), 'desc_value': FieldInfo(annotation=Union[str, NoneType], required=False, default=None, alias='desc', alias_priority=2), 'filters': FieldInfo(annotation=Dict[str, SetAnalyzer], required=False, default={}), 'meas': FieldInfo(annotation=Dict[str, MeasureFeatures], required=False, default={}), 'model': FieldInfo(annotation=Union[ModelFitter, NoneType], required=False, default=None), 'name': FieldInfo(annotation=str, required=False, default_factory=<lambda>, description='A unique identifier for this pipeline. Defaults to a randomly generated UUID4 string if not provided during initialization.'), 'ncols': FieldInfo(annotation=Union[int, NoneType], required=False, default=None), 'nrows': FieldInfo(annotation=Union[int, NoneType], required=False, default=None), 'ops': FieldInfo(annotation=Dict[str, Union[ImageOperation, ImagePipelineCore]], required=False, default_factory=dict, alias_priority=2, validation_alias=AliasChoices(choices=['ops', 'pipe_cfgs'])), 'post': FieldInfo(annotation=Dict[str, PostMeasurement], required=False, default={}), 'qc': FieldInfo(annotation=List[QcRecipeEntry], required=False, default_factory=list, exclude=True), 'reset': FieldInfo(annotation=bool, required=False, default=False), 'verbose': FieldInfo(annotation=bool, required=False, default=False, description='Whether to enable verbose logging during pipeline execution.')}#
property model_fields_set: set[str]#

Returns the set of fields that have been explicitly set on this model instance.

Returns:

A set of strings representing the fields that have been set,

i.e. that were not filled from defaults.

classmethod model_json_schema(by_alias: bool = True, ref_template: str = '#/$defs/{model}', schema_generator: type[~pydantic.json_schema.GenerateJsonSchema] = <class 'pydantic.json_schema.GenerateJsonSchema'>, mode: ~typing.Literal['validation', 'serialization'] = 'validation', *, union_format: ~typing.Literal['any_of', 'primitive_type_array'] = 'any_of') dict[str, Any]#

Generates a JSON schema for a model class.

Parameters:
  • by_alias (bool) – Whether to use attribute aliases or not.

  • ref_template (str) – The reference template.

  • union_format (Literal['any_of', 'primitive_type_array']) –

    The format to use when combining schemas from unions together. Can be one of:

    keyword to combine schemas (the default). - ‘primitive_type_array’: Use the [type](https://json-schema.org/understanding-json-schema/reference/type) keyword as an array of strings, containing each type of the combination. If any of the schemas is not a primitive type (string, boolean, null, integer or number) or contains constraints/metadata, falls back to any_of.

  • schema_generator (type[GenerateJsonSchema]) – To override the logic used to generate the JSON schema, as a subclass of GenerateJsonSchema with your desired modifications

  • mode (Literal['validation', 'serialization']) – The mode in which to generate the schema.

Returns:

The JSON schema for the given model class.

Return type:

dict[str, Any]

classmethod model_parametrized_name(params: tuple[type[Any], ...]) str#

Compute the class name for parametrizations of generic classes.

This method can be overridden to achieve a custom naming scheme for generic BaseModels.

Parameters:

params (tuple[type[Any], ...]) – Tuple of types of the class. Given a generic class Model with 2 type variables and a concrete model Model[str, int], the value (str, int) would be passed to params.

Returns:

String representing the new class where params are passed to cls as type variables.

Raises:

TypeError – Raised when trying to generate concrete names for non-generic models.

Return type:

str

model_post_init(_BaseOperation__context: Any) None#

Initialize logging and memory tracking after model construction.

Replaces the legacy __init__ body: creates the per-class logger and, when that logger is enabled for INFO level or higher, starts tracemalloc so per-operation memory usage can be logged.

Parameters:
  • __context – Pydantic post-init context (unused).

  • _BaseOperation__context (Any)

Return type:

None

classmethod model_rebuild(*, force: bool = False, raise_errors: bool = True, _parent_namespace_depth: int = 2, _types_namespace: MappingNamespace | None = None) bool | None#

Try to rebuild the pydantic-core schema for the model.

This may be necessary when one of the annotations is a ForwardRef which could not be resolved during the initial attempt to build the schema, and automatic rebuilding fails.

Parameters:
  • force (bool) – Whether to force the rebuilding of the model schema, defaults to False.

  • raise_errors (bool) – Whether to raise errors, defaults to True.

  • _parent_namespace_depth (int) – The depth level of the parent namespace, defaults to 2.

  • _types_namespace (MappingNamespace | None) – The types namespace, defaults to None.

Returns:

Returns None if the schema is already “complete” and rebuilding was not required. If rebuilding _was_ required, returns True if rebuilding was successful, otherwise False.

Return type:

bool | None

classmethod model_validate(obj: Any, *, strict: bool | None = None, extra: Literal['allow', 'ignore', 'forbid'] | None = None, from_attributes: bool | None = None, context: Any | None = None, by_alias: bool | None = None, by_name: bool | None = None) Self#

Validate a pydantic model instance.

Parameters:
  • obj (Any) – The object to validate.

  • strict (bool | None) – Whether to enforce types strictly.

  • extra (Literal['allow', 'ignore', 'forbid'] | None) – Whether to ignore, allow, or forbid extra data during model validation. See the [extra configuration value][pydantic.ConfigDict.extra] for details.

  • from_attributes (bool | None) – Whether to extract data from object attributes.

  • context (Any | None) – Additional context to pass to the validator.

  • by_alias (bool | None) – Whether to use the field’s alias when validating against the provided input data.

  • by_name (bool | None) – Whether to use the field’s name when validating against the provided input data.

Raises:

ValidationError – If the object could not be validated.

Returns:

The validated model instance.

Return type:

Self

classmethod model_validate_json(json_data: str | bytes | bytearray, *, strict: bool | None = None, extra: Literal['allow', 'ignore', 'forbid'] | None = None, context: Any | None = None, by_alias: bool | None = None, by_name: bool | None = None) Self#
!!! abstract “Usage Documentation”

[JSON Parsing](../concepts/json.md#json-parsing)

Validate the given JSON data against the Pydantic model.

Parameters:
  • json_data (str | bytes | bytearray) – The JSON data to validate.

  • strict (bool | None) – Whether to enforce types strictly.

  • extra (Literal['allow', 'ignore', 'forbid'] | None) – Whether to ignore, allow, or forbid extra data during model validation. See the [extra configuration value][pydantic.ConfigDict.extra] for details.

  • context (Any | None) – Extra variables to pass to the validator.

  • by_alias (bool | None) – Whether to use the field’s alias when validating against the provided input data.

  • by_name (bool | None) – Whether to use the field’s name when validating against the provided input data.

Returns:

The validated Pydantic model.

Raises:

ValidationError – If json_data is not a JSON string or the object could not be validated.

Return type:

Self

classmethod model_validate_strings(obj: Any, *, strict: bool | None = None, extra: Literal['allow', 'ignore', 'forbid'] | None = None, context: Any | None = None, by_alias: bool | None = None, by_name: bool | None = None) Self#

Validate the given object with string data against the Pydantic model.

Parameters:
  • obj (Any) – The object containing string data to validate.

  • strict (bool | None) – Whether to enforce types strictly.

  • extra (Literal['allow', 'ignore', 'forbid'] | None) – Whether to ignore, allow, or forbid extra data during model validation. See the [extra configuration value][pydantic.ConfigDict.extra] for details.

  • context (Any | None) – Extra variables to pass to the validator.

  • by_alias (bool | None) – Whether to use the field’s alias when validating against the provided input data.

  • by_name (bool | None) – Whether to use the field’s name when validating against the provided input data.

Returns:

The validated Pydantic model.

Return type:

Self

classmethod parse_file(path: str | Path, *, content_type: str | None = None, encoding: str = 'utf8', proto: DeprecatedParseProtocol | None = None, allow_pickle: bool = False) Self#
Parameters:
  • path (str | Path)

  • content_type (str | None)

  • encoding (str)

  • proto (DeprecatedParseProtocol | None)

  • allow_pickle (bool)

Return type:

Self

classmethod parse_obj(obj: Any) Self#
Parameters:

obj (Any)

Return type:

Self

classmethod parse_raw(b: str | bytes, *, content_type: str | None = None, encoding: str = 'utf8', proto: DeprecatedParseProtocol | None = None, allow_pickle: bool = False) Self#
Parameters:
  • b (str | bytes)

  • content_type (str | None)

  • encoding (str)

  • proto (DeprecatedParseProtocol | None)

  • allow_pickle (bool)

Return type:

Self

classmethod schema(by_alias: bool = True, ref_template: str = '#/$defs/{model}') Dict[str, Any]#
Parameters:
  • by_alias (bool)

  • ref_template (str)

Return type:

Dict[str, Any]

classmethod schema_json(*, by_alias: bool = True, ref_template: str = '#/$defs/{model}', **dumps_kwargs: Any) str#
Parameters:
  • by_alias (bool)

  • ref_template (str)

  • dumps_kwargs (Any)

Return type:

str

set_filters(filters: List[SetAnalyzer] | Dict[str, SetAnalyzer]) None#

Set the analysis filter chain.

Parameters:

filters (List[SetAnalyzer] | Dict[str, SetAnalyzer]) – A list or dictionary of SetAnalyzer instances. If a list, class names (deduplicated by suffix) are used as keys.

Raises:

TypeError – If filters is neither a list nor a dictionary.

Return type:

None

set_meas(measurements: List[MeasureFeatures] | Dict[str, MeasureFeatures])#

Sets the measurements to be used for further computation. The input can be either a list of MeasureFeatures objects or a dictionary with string keys and MeasureFeatures objects as values.

The method processes the given input to construct a dictionary mapping measurement names to MeasureFeatures instances. If a list is passed, unique class names of the MeasureFeatures instances in the list are used as keys.

Parameters:

measurements (List[MeasureFeatures] | Dict[str, MeasureFeatures]) – A collection of measurement features either as a list of MeasureFeatures objects, where class names are used as keys for dictionary creation, or as a dictionary where keys are predefined strings and values are MeasureFeatures objects.

Raises:

TypeError – If the measurements argument is neither a list nor a dictionary.

set_model(model: ModelFitter | None) None#

Set the analysis endpoint model.

Only one model can be configured per pipeline; assigning a new value replaces any prior model. Pass None to clear.

Parameters:

model (ModelFitter | None) – A ModelFitter instance, or None to clear.

Raises:

TypeError – If model is not a ModelFitter instance and not None.

Return type:

None

set_ops(ops: List[ImageOperation | ImagePipeline] | Dict[str, ImageOperation | ImagePipeline])#

Sets the operations to be performed. The operations can be passed as either a list of ImageOperation or ImagePipeline instances or a dictionary mapping operation names to ImageOperation or ImagePipeline instances. This method ensures that each operation in the list has a unique name. Raises a TypeError if the input is neither a list nor a dictionary.

Parameters:

ops (List[ImageOperation | ImagePipeline] | Dict[str, ImageOperation | ImagePipeline]) – A list of ImageOperation or ImagePipeline objects, or a dictionary where keys are operation names and values are ImageOperation or ImagePipeline objects.

Raises:

TypeError – If the input is not a list or a dictionary.

set_post(post: List[PostMeasurement] | Dict[str, PostMeasurement])#

Set the post-measurement transforms.

Parameters:

post (List[PostMeasurement] | Dict[str, PostMeasurement]) – A list or dictionary of PostMeasurement objects. If a list, class names are used as keys.

Raises:

TypeError – If post is neither a list nor a dictionary.

set_qc(qc: List[QcRecipeEntry] | None) None#

Set the QC config entry list.

Mirrors set_post() / set_filters() but the QC section is an ordered list of QcRecipeEntry (carrying stable instance_id/enabled metadata), not a name-keyed dict.

Parameters:

qc (List[QcRecipeEntry] | None) – A list of QcRecipeEntry, or None to clear.

Raises:

TypeError – If qc is neither a list nor None (raised by the _normalize_qc validator on assignment).

Return type:

None

to_json(filepath: str | Path | None = None) str | None#

Serialize the pipeline configuration to JSON format.

This method captures the pipeline’s operations and measurements. It excludes internal state (pydantic PrivateAttr fields) and pandas DataFrames to keep the serialization clean and focused on reproducible configuration.

Parameters:

filepath (str | Path | None) – Optional path to save the JSON. If None, returns JSON string. Can be a string or Path object.

Returns:

JSON string representation of the pipeline configuration.

Return type:

str

Example

Serialize a pipeline to JSON format:

>>> from phenotypic import ImagePipeline
>>> from phenotypic.detect import OtsuDetector
>>> from phenotypic.measure import MeasureShape
>>> pipe = ImagePipeline(pipe_cfgs=[OtsuDetector()], meas=[MeasureShape()])
>>> json_str = pipe.to_json()
>>> pipe.to_json('my_pipeline')  # Save to typed config file
classmethod update_forward_refs(**localns: Any) None#
Parameters:

localns (Any)

Return type:

None

classmethod validate(value: Any) Self#
Parameters:

value (Any)

Return type:

Self

widget(image: Image | None = None, show: bool = False) Widget#

Return (and optionally display) the root widget.

Parameters:
  • image (Image | None) – Optional image to visualize. If provided, visualization controls will be added to the widget.

  • show (bool) – Whether to display the widget immediately. Defaults to False.

Returns:

The root widget.

Return type:

ipywidgets.Widget

Raises:

ImportError – If ipywidgets or IPython are not installed.

name: str#
desc_value: str | None#
benchmark: bool#
verbose: bool#
reset: bool#
nrows: int | None#
ncols: int | None#
ops: Dict[str, ImageOperation | 'ImagePipelineCore']#
meas: Dict[str, MeasureFeatures]#
post: Dict[str, PostMeasurement]#
filters: Dict[str, SetAnalyzer]#
model: ModelFitter | None#
qc: List[QcRecipeEntry]#