Skip to content

'Model-less' models

The model infrastructure can be used to read DICOM for 'noisy' labeling and to do pixel analysis and traditional computer vision labeling. Outputs are model prediction labels.

Mask label outputs:

Create 2 mask labels in the UI, one for Fat and one for Lung.

Below is some sample code which reads the DICOM tags to check modality and then creates fat and lung masks on the pixel array. Arguments for the minimum and maximum have default values but can be adjusted when the model is run. Outputs can be any type of label such as boxes, freeform shapes, global labels, etc

from io import BytesIO
import pydicom
from pydicom.pixel_data_handlers.util import apply_modality_lut

class MDAIModel:
    def __init__(self):
        self.model = None

    def default_output(self, ds):
        output = {
            "type": "NONE",
            "study_uid": str(ds.StudyInstanceUID),
            "series_uid": str(ds.SeriesInstanceUID),
            "instance_uid": str(ds.SOPInstanceUID),
        }
        return output

    def predict(self, data):
        input_files = data["files"]
        outputs = []

        for file in input_files:
            if file["content_type"] != "application/dicom":
                continue

            ds = pydicom.dcmread(BytesIO(file["content"]))
            if "Modality" in ds and ds.Modality != "CT":
                continue

            try:
                array  = apply_modality_lut(ds.pixel_array, ds)
            except:
                continue

            # mask
            # Load the input data arguments (if any)
            input_args = data["args"]
            # fat
            mask = (array > int(input_args['Fat Min'])) & (array < int(input_args['Fat Max']))
            outputs.append(
                {
                    "type": "ANNOTATION",
                    "study_uid": str(ds.StudyInstanceUID),
                    "series_uid": str(ds.SeriesInstanceUID),
                    "instance_uid": str(ds.SOPInstanceUID),
                    "class_index": 0,
                    "data": {"mask": mask.tolist()}
                }
            )
            # lung
            mask = (array > int(input_args['Lung Min'])) & (array < int(input_args['Lung Max']))
            outputs.append(
                {
                    "type": "ANNOTATION",
                    "study_uid": str(ds.StudyInstanceUID),
                    "series_uid": str(ds.SeriesInstanceUID),
                    "instance_uid": str(ds.SOPInstanceUID),
                    "class_index": 1,
                    "data": {"mask": mask.tolist()}
                }
            )
        return outputs