示例#1
0
    def restore(self, predicted_array_list):
        predicted_array = np.zeros(self.label.GetSize()[::-1])
        z_size = self.label.GetSize()[2] - self.label_patch_width

        indices = [i for i in range(0, z_size + 1, self.z_slide)]
        with tqdm(total=len(indices), desc="Restoring image...",
                  ncols=60) as pbar:
            for pre_array, index in zip(predicted_array_list, indices):
                z_slice = slice(index, index + self.label_patch_width)
                predicted_array[z_slice, ...] = pre_array

                pbar.update(1)

        predicted = getImageWithMeta(predicted_array, self.label)

        predicted = cropping(predicted, self.lower_pad_size[1].tolist(),
                             self.upper_pad_size[1].tolist())

        if (self.diff > 0).any():
            lower_crop_size = (self.diff // 2).tolist()
            upper_crop_size = ((self.diff + 1) // 2).tolist()

            predicted = cropping(predicted, lower_crop_size, upper_crop_size)
        else:
            lower_pad_size = (abs(self.diff) // 2).tolist()
            upper_pad_size = ((abs(self.diff) + 1) // 2).tolist()

            predicted = padding(predicted, lower_pad_size, upper_pad_size)

        return predicted
示例#2
0
    def restore(self, predictArrayList):
        labelArray = sitk.GetArrayFromImage(self.label)
        outputArray = np.zeros_like(labelArray)
        for i in range(2):
            length = len(predictArrayList[i])
            largestSlice = self.meta[i]["largestSlice"]
            axialSlice = self.meta[i]["axialSlice"]
            paddingSize = self.paddingSize
            largestArray = outputArray[largestSlice, ...]
            p = (paddingSize, paddingSize)
            largestArray = np.pad(largestArray, [p, p, (0, 0)], "minimum")
            largestArray = largestArray[..., axialSlice]
            for x in tqdm(range(length), desc="Restoring images...", ncols=60):
                pre = getImageWithMeta(predictArrayList[i][x], self.sliceImage)
                sagittalSlice = self.meta[i]["sagittalSlice"][x]
                coronalSlice = self.meta[i]["coronalSlice"][x]
                size = self.meta[i]["size"][x]

                pre = resampleSize(pre, size[::-1], is_label=True)
                preArray = sitk.GetArrayFromImage(pre)
                largestArray[sagittalSlice, coronalSlice, x] = preArray

            largestArray = largestArray[paddingSize:-paddingSize,
                                        paddingSize:-paddingSize, :]

            if not self.noFlip:
                if i == 1:
                    largestArray = largestArray[::-1, ...]

            outputArray[largestSlice, :, axialSlice] += largestArray

        return outputArray
示例#3
0
    def restore(self, predict_array_list):
        predict_array = np.zeros_like(self.label_array)

        size = np.array(self.label_array.shape) - self.label_array_patch_size
        indices = []
        for i in range(self.label_array.ndim):
            r = range(0, size[i] + 1, self.slide[i])
            indices.append(r)
        indices = np.array([i for i in product(*indices)])

        with tqdm(total=len(predict_array_list),
                  desc="Restoring image...",
                  ncols=60) as pbar:
            for pre_array, idx in zip(predict_array_list,
                                      indices[self.masked_indices]):
                slices = []
                for i in range(self.label_array.ndim):
                    s = slice(idx[i], idx[i] + self.label_array_patch_size[i])
                    slices.append(s)
                slices = tuple(slices)

                predict_array[slices] = pre_array
                pbar.update(1)

        predict_array = croppingForNumpy(predict_array,
                                         self.lower_pad_size[1].tolist(),
                                         self.upper_pad_size[1].tolist())
        predict = getImageWithMeta(predict_array, self.org)
        predict.SetOrigin(self.org.GetOrigin())

        return predict
示例#4
0
    def restore(self, predict_array_list):
        predicted_array = np.zeros(self.image.GetSize()[::-1])
        """ Make patch. """
        total = self.z_length // self.slide[2]
        with tqdm(total=total, desc="Restoring images...", ncols=60) as pbar:
            for z, predict_array in zip(range(0, self.z_length, self.slide[2]),
                                        predict_array_list):
                z_slice = slice(z, z + self.patch_size[2])
                predicted_array[z_slice, ...] = predict_array

                pbar.update(1)

        predicted = getImageWithMeta(predicted_array, self.image)
        predicted = cropping(predicted, self.axial_lower_pad_size[0].tolist(),
                             self.axial_upper_pad_size[0].tolist())
        """ Raw data is clipped or padded for required_shape. """
        if (self.diff > 0).any():
            lower_crop_size = (abs(self.diff) // 2).tolist()
            upper_crop_size = [rounding(x, 1) for x in abs(self.diff) / 2]

            predicted = cropping(predicted, lower_crop_size, upper_crop_size)

        else:
            lower_pad_size = (abs(self.diff) // 2).tolist()
            upper_pad_size = [rounding(x, 1) for x in abs(self.diff) / 2]

            predicted = padding(predicted, lower_pad_size, upper_pad_size)

        return predicted
示例#5
0
    def restore(self, predict_array_list):
        predict_array = np.zeros_like(sitk.GetArrayFromImage(self.label))

        size = np.array(self.label.GetSize()) - self.label_patch_size
        indices = [
            i for i in product(range(0, size[0] + 1, self.slide[0]),
                               range(0, size[1] + 1, self.slide[1]),
                               range(0, size[2] + 1, self.slide[2]))
        ]

        with tqdm(total=len(predict_array_list),
                  desc="Restoring image...",
                  ncols=60) as pbar:
            for pre_array, idx in zip(predict_array_list, indices):
                x_slice = slice(idx[0], idx[0] + self.label_patch_size[0])
                y_slice = slice(idx[1], idx[1] + self.label_patch_size[1])
                z_slice = slice(idx[2], idx[2] + self.label_patch_size[2])

                predict_array[z_slice, y_slice, x_slice] = pre_array
                pbar.update(1)

        predict = getImageWithMeta(predict_array, self.label)
        predict = cropping(predict, self.lower_pad_size[1].tolist(),
                           self.upper_pad_size[1].tolist())
        predict.SetOrigin(self.label.GetOrigin())

        return predict
示例#6
0
def main(args):
    use_cuda = torch.cuda.is_available() and True
    device = torch.device("cuda" if use_cuda else "cpu")
    """ Slice module. """
    labelFile = Path(args.imageDirectory) / "segmentation.nii.gz"
    imageFile = Path(args.imageDirectory) / "imaging.nii.gz"

    label = sitk.ReadImage(str(labelFile))
    image = sitk.ReadImage(str(imageFile))

    slicer = sler(image=image,
                  label=label,
                  outputImageSize=args.patchSize,
                  widthSize=args.widthSize,
                  paddingSize=args.paddingSize,
                  noFlip=args.noFlip)

    slicer.execute()
    _, cuttedImageArrayList = slicer.output("Array")
    """ Load model. """

    with open(args.modelweightfile, 'rb') as f:
        model = cloudpickle.load(f)
        model = torch.nn.DataParallel(model, device_ids=args.gpuid)

    model.eval()
    """ Segmentation module. """

    segmentedArrayList = [[] for _ in range(2)]
    for i in range(2):
        length = len(cuttedImageArrayList[i])
        for x in tqdm(range(length), desc="Segmenting images...", ncols=60):
            imageArray = cuttedImageArrayList[i][x]
            imageArray = imageArray.transpose((2, 0, 1))
            imageArray = torch.from_numpy(imageArray[np.newaxis, ...]).to(
                device, dtype=torch.float)

            segmentedArray = model(imageArray)
            segmentedArray = segmentedArray.to("cpu").detach().numpy().astype(
                np.float)
            segmentedArray = np.squeeze(segmentedArray)
            segmentedArray = np.argmax(segmentedArray, axis=0).astype(np.uint8)
            segmentedArrayList[i].append(segmentedArray)
    """ Restore module. """
    segmentedArray = slicer.restore(segmentedArrayList)

    segmented = getImageWithMeta(segmentedArray, label)
    createParentPath(args.savePath)
    print("Saving image to {}".format(args.savePath))
    sitk.WriteImage(segmented, args.savePath, True)
示例#7
0
def main(args):
    image = sitk.ReadImage(args.image_path)
    image_array = sitk.GetArrayFromImage(image)

    image_array_win = setWindowSize(image_array=image_array,
                                    min_value=args.min_value,
                                    max_value=args.max_value)

    image_win = getImageWithMeta(image_array_win, image)

    save_path = Path(args.save_path)
    save_path.parent.mkdir(parents=True, exist_ok=True)
    print("Saving images to {} ...".format(str(save_path)))
    sitk.WriteImage(image_win, str(save_path), True)
    print("Done.")
示例#8
0
def main(args):
    label = sitk.ReadImage(args.label_path)
    label_array = sitk.GetArrayFromImage(label)

    if args.mask_number < 0:
        mask_array = (label_array > 0).astype(np.int)

    else:
        mask_array = (label_array == args.mask_number).astype(np.int)

    mask = getImageWithMeta(mask_array, label)
    createParentPath(args.save_path)
    print("Saving mask image to {} ...".format(args.save_path))
    sitk.WriteImage(mask, args.save_path, True)
    print("Done")
示例#9
0
    def restore(self, predict_array_list):
        predict_array = np.zeros_like(sitk.GetArrayFromImage(self.meta["padded_label"]))

        with tqdm(total=len(predict_array_list), desc="Restoring image...", ncols=60) as pbar:
            for pre_array, idx in zip(predict_array_list, self.meta["total_patch_idx"]):
                z_slice = slice(idx[0], idx[0] + self.meta["patch_size"][0])
                y_slice = slice(idx[1], idx[1] + self.meta["patch_size"][1])
                x_slice = slice(idx[2], idx[2] + self.meta["patch_size"][2])


                predict_array[x_slice, y_slice, z_slice] = pre_array
                pbar.update(1)


        predict = getImageWithMeta(predict_array, self.label)
        predict = cropping(predict, self.meta["lower_padding_size"], self.meta["upper_padding_size"])
        predict.SetOrigin(self.label.GetOrigin())
        

        return predict
示例#10
0
    def restore(self, predicted_array_list):
        predicted_array = np.zeros(self.padded_label.GetSize()[::-1])
        z_size = self.padded_label.GetSize()[2] - self.label_patch_width
        patch_size = np.array(self.padded_label.GetSize())
        patch_size[2] = self.label_patch_width

        indices = [i for i in range(0, z_size + 1, self.z_slide)]
        with tqdm(total=len(indices), desc="Restoring image...",
                  ncols=60) as pbar:
            for pre_array, index in zip(predicted_array_list, indices):
                z_slice = slice(index, index + patch_size[2])
                predicted_array[z_slice, ...] = pre_array

                pbar.update(1)

        predicted = getImageWithMeta(predicted_array, self.padded_label)

        predicted = cropping(predicted, self.lower_pad_size[1].tolist(),
                             self.upper_pad_size[1].tolist())

        return predicted
示例#11
0
    def execute(self):
        self.meta = [{} for _ in range(2)]
        labelArray = sitk.GetArrayFromImage(self.label)
        imageArray = sitk.GetArrayFromImage(self.image)

        matchobj = re.match("([0-9]+)-([0-9]+)-([0-9]+)", self.outputImageSize)
        if matchobj is None:
            print("[ERROR] Invalid patch size : {}".format(
                self.outputImageSize))
            sys.exit()

        self.outputImageSize = [int(s) for s in matchobj.groups()]
        self.outputLabelSize = self.outputImageSize[:2] + [1]

        startIndex, endIndex = searchBound(labelArray, "sagittal")
        if len(startIndex) != 2:
            print("The patient has horse shoe kidney")
            sys.exit()

        largestKidneyLabelArray = []
        largestKidneyImageArray = []

        largestSlice = slice(endIndex[0], labelArray.shape[0])
        largestKidneyLabelArray.append(labelArray[largestSlice, ...])
        largestKidneyImageArray.append(imageArray[largestSlice, ...])
        self.meta[0]["largestSlice"] = largestSlice

        largestSlice = slice(0, startIndex[1])
        largestKidneyLabelArray.append(labelArray[largestSlice, ...])
        largestKidneyImageArray.append(imageArray[largestSlice, ...])
        self.meta[1]["largestSlice"] = largestSlice

        if not self.noFlip:
            largestKidneyLabelArray[1] = largestKidneyLabelArray[1][::-1, ...]
            largestKidneyImageArray[1] = largestKidneyImageArray[1][::-1, ...]
        else:
            print("The kidney doesn't flip.")

        self.cuttedLabelArrayList = [[] for _ in range(2)]
        self.cuttedStackedLabelArrayList = [[] for _ in range(2)]
        self.cuttedImageArrayList = [[] for _ in range(2)]

        for i in range(2):
            p = (self.paddingSize, self.paddingSize)
            largestKidneyLabelArray[i] = np.pad(largestKidneyLabelArray[i],
                                                [p, p, (0, 0)], "minimum")
            largestKidneyImageArray[i] = np.pad(largestKidneyImageArray[i],
                                                [p, p, (0, 0)], "minimum")

            startIndex, endIndex = caluculateClipSize(
                largestKidneyLabelArray[i], "axial")
            axialSlice = slice(startIndex, endIndex)

            largestKidneyLabelArray[i] = largestKidneyLabelArray[i][...,
                                                                    axialSlice]
            largestKidneyImageArray[i] = largestKidneyImageArray[i][...,
                                                                    axialSlice]
            self.meta[i]["axialSlice"] = axialSlice

            length = largestKidneyLabelArray[i].shape[2]
            area = []
            for x in range(length):
                area.append(caluculateArea(largestKidneyLabelArray[i][..., x]))
                maxArea = np.argmax(area)

            maxAreaLabelArray = largestKidneyLabelArray[i][..., maxArea]

            s, e = caluculateClipSize(maxAreaLabelArray[..., np.newaxis],
                                      "sagittal")
            width = e - s
            s, e = caluculateClipSize(maxAreaLabelArray[..., np.newaxis],
                                      "coronal")
            height = e - s
            wh = max(width, height)

            margin = self.outputImageSize[2] // 2
            top, bottom = caluculateClipSize(largestKidneyLabelArray[i],
                                             "axial",
                                             widthSize=0)
            topSliceArray = largestKidneyLabelArray[i][..., top]
            bottomSliceArray = largestKidneyLabelArray[i][..., bottom - 1]

            check = False
            sagittalSlices = []
            coronalSlices = []
            size = []
            for x in tqdm(range(length), desc="Slicing images...", ncols=60):
                a = caluculateArea(largestKidneyLabelArray[i][..., x])
                if a == 0:
                    if not check:
                        sliceLabelArray = topSliceArray
                    else:
                        sliceLabelArray = bottomSliceArray

                else:
                    sliceLabelArray = largestKidneyLabelArray[i][..., x]
                    check = True

                center = getCenterOfGravity(sliceLabelArray)
                x0 = center[0] - wh // 2
                x1 = center[0] + wh // 2
                y0 = center[1] - wh // 2
                y1 = center[1] + wh // 2

                minLabelArray = np.zeros(
                    (x1 - x0, y1 - y0)) + largestKidneyLabelArray[i].min()
                minImageArray = np.zeros(
                    (x1 - x0, y1 - y0)) + largestKidneyImageArray[i].min()

                sagittalSlice = slice(x0, x1)
                coronalSlice = slice(y0, y1)
                sagittalSlices.append(sagittalSlice)
                coronalSlices.append(coronalSlice)

                cuttedImageArray = []
                cuttedStackedLabelArray = []
                for y in range(-margin, margin + 1):
                    if 0 <= x + y < length:
                        cuttedStackedLabelArray.append(
                            largestKidneyLabelArray[i][sagittalSlice,
                                                       coronalSlice, x + y])
                        cuttedImageArray.append(
                            largestKidneyImageArray[i][sagittalSlice,
                                                       coronalSlice, x + y])

                    else:
                        cuttedStackedLabelArray.append(minLabelArray)
                        cuttedImageArray.append(minImageArray)

                cuttedLabelArray = largestKidneyLabelArray[i][sagittalSlice,
                                                              coronalSlice, x]
                cuttedStackedLabelArray = np.dstack(cuttedStackedLabelArray)
                cuttedImageArray = np.dstack(cuttedImageArray)

                self.cuttedLabelArrayList[i].append(cuttedLabelArray)
                self.cuttedStackedLabelArrayList[i].append(
                    cuttedStackedLabelArray)
                self.cuttedImageArrayList[i].append(cuttedImageArray)

                size.append(cuttedLabelArray.shape)

            self.meta[i]["sagittalSlice"] = sagittalSlices
            self.meta[i]["coronalSlice"] = coronalSlices
            self.meta[i]["size"] = size
        """ For resampling, get direction, spacing, origin and minimun value in image and label in 2D. """
        extractSliceFilter = sitk.ExtractImageFilter()
        size = list(self.image.GetSize())
        size[0] = 0
        index = (0, 0, 0)
        extractSliceFilter.SetSize(size)
        extractSliceFilter.SetIndex(index)
        self.sliceImage = extractSliceFilter.Execute(self.image)

        self.cuttedLabelList = [[] for _ in range(2)]
        self.cuttedImageList = [[] for _ in range(2)]
        for i in range(2):
            length = len(self.cuttedLabelArrayList[i])
            for x in tqdm(range(length),
                          desc="Transforming images...",
                          ncols=60):
                cuttedLabel = getImageWithMeta(
                    self.cuttedLabelArrayList[i][x][..., np.newaxis],
                    self.image)
                cuttedImage = getImageWithMeta(self.cuttedImageArrayList[i][x],
                                               self.image)
                cuttedLabel = resampleSize(cuttedLabel,
                                           self.outputLabelSize[::-1],
                                           is_label=True)
                cuttedImage = resampleSize(cuttedImage,
                                           self.outputImageSize[::-1])

                cuttedLabelArray = sitk.GetArrayFromImage(cuttedLabel)
                cuttedImageArray = sitk.GetArrayFromImage(cuttedImage)

                self.cuttedLabelArrayList[i][x] = cuttedLabelArray
                self.cuttedImageArrayList[i][x] = cuttedImageArray

                self.cuttedLabelList[i].append(cuttedLabel)
                self.cuttedImageList[i].append(cuttedImage)
示例#12
0
def main(_):
    """ Slice module. """
    labelFile = Path(args.imageDirectory) / "segmentation.nii.gz"
    imageFile = Path(args.imageDirectory) / "imaging.nii.gz"

    label = sitk.ReadImage(str(labelFile))
    image = sitk.ReadImage(str(imageFile))

    slicer = sler(image,
                  label,
                  outputImageSize=args.outputImageSize,
                  widthSize=args.widthSize,
                  paddingSize=args.paddingSize,
                  noFlip=args.noFlip)

    slicer.execute()
    _, cuttedImageArrayList = slicer.output("Array")
    """ Segmentation module. """
    config = tf.compat.v1.ConfigProto()
    config.gpu_options.allow_growth = True
    config.allow_soft_placement = True
    config.log_device_placement = True
    sess = tf.compat.v1.Session(config=config)
    tf.compat.v1.keras.backend.set_session(sess)

    modelweightfile = os.path.expanduser(args.modelweightfile)

    with tf.device('/device:GPU:{}'.format(args.gpuid)):
        print('loading U-net model {}...'.format(modelweightfile),
              end='',
              flush=True)
        #with open(args.modelfile) as f:
        #     model = tf.compat.v1.keras.models.model_from_yaml(f.read())
        # model.load_weights(args.modelweightfile)
        model = tf.compat.v1.keras.models.load_model(modelweightfile,
                                                     custom_objects={
                                                         'penalty_categorical':
                                                         penalty_categorical,
                                                         'kidney_dice':
                                                         kidney_dice,
                                                         'cancer_dice':
                                                         cancer_dice
                                                     })

        print('done')

    segmentedArrayList = [[] for _ in range(2)]
    for i in range(2):
        length = len(cuttedImageArrayList[i])
        for x in tqdm(range(length), desc="Segmenting images...", ncols=60):
            imageArray = cuttedImageArrayList[i][x]
            imageArray = imageArray[np.newaxis, ...]

            segmentedArray = model.predict(imageArray,
                                           batch_size=args.batchsize,
                                           verbose=0)
            segmentedArray = np.squeeze(segmentedArray)
            segmentedArray = np.argmax(segmentedArray,
                                       axis=-1).astype(np.uint8)
            print((segmentedArray > 0).any())
            segmentedArrayList[i].append(segmentedArray)
    """ Restore module. """
    segmentedArray = slicer.restore(segmentedArrayList)

    segmented = getImageWithMeta(segmentedArray, label)
    createParentPath(args.savePath)
    print("Saving image to {}".format(args.savePath))
    sitk.WriteImage(segmented, args.savePath, True)