Beispiel #1
0
def seg_pipeline4(rootdir, uid, save_name):
    # Read data
    t1ce_img, affine_t1ce, hdr_t1ce = file_io.read_nii(os.path.join(rootdir, uid, uid + '_t1ce.nii.gz'))
    t2_img, affine_t2, hdr_t2 = file_io.read_nii(os.path.join(rootdir, uid, uid + '_t2.nii.gz'))
    flair_img, affine_flair, hdr_flair = file_io.read_nii(os.path.join(rootdir, uid, uid + '_flair.nii.gz'))
    seg_img, affine_seg, hdr_seg = file_io.read_nii(os.path.join(rootdir, uid, uid + '_seg.nii.gz'))

    # Preprocess
    st1, et1 = img_utils.get_bbox(flair_img)
    flair_roi = img_utils.normalize_0_1(img_utils.crop_img(flair_img, st1, et1))

    # full tumor segmentation
    full_tumor = img_utils.clustering_img([flair_roi], 5, method='Kmeans')
    full_tumor = img_utils.rm_small_cc(full_tumor.astype(np.uint8), rate=0.3)
    nc_tumor_1 = img_utils.get_holes(full_tumor)
    full_tumor = img_utils.fill_full(full_tumor, )
    st_2, et_2 = img_utils.get_bbox(full_tumor)
    full_tumor_roi = img_utils.crop_img(full_tumor, st_2, et_2)
    nc_tumor_1 = img_utils.crop_img(img_utils.get_holes(nc_tumor_1), st_2, et_2)

    # ec tumor segmentation
    t1ce_roi = img_utils.normalize_0_1(img_utils.crop_img(img_utils.crop_img(t1ce_img, st1, et1), st_2, et_2))
    t1ce_roi[full_tumor_roi != 1] = 0
    ec_tumor = img_utils.clustering_img([t1ce_roi, ], 3, method='Kmeans')

    # necrotic segmentation
    nc_tumor_2 = img_utils.segment_necrotic(ec_tumor, 3, 1)
    nc_tumor = nc_tumor_1 + nc_tumor_2
    nc_tumor[nc_tumor == 2] = 1

    # Calculate metrics
    final_mask = np.zeros(full_tumor_roi.shape)
    final_mask[full_tumor_roi == 1] = 2
    final_mask[ec_tumor == 1] = 4
    final_mask[nc_tumor == 1] = 1
    final_mask = img_utils.crop2raw(seg_img.shape, img_utils.crop2raw(full_tumor.shape, final_mask, st_2, et_2), st1,
                                    et1)
    ec_result = metrics.test_result(final_mask, seg_img, mode='ec')
    core_result = metrics.test_result(final_mask, seg_img, mode='core')
    full_result = metrics.test_result(final_mask, seg_img, mode='full')

    if save_name is not None:
        file_io.save_nii(final_mask, affine_seg, hdr_seg, os.path.join(rootdir, uid, uid + save_name))
    return ec_result, core_result, full_result
Beispiel #2
0
      def train_step():
        """Train step."""
        batch = train_iter.next()

        feed_data = {
            m.input:
            np.expand_dims(batch["img"], axis=3),
            m.label:
            np.expand_dims(
                ut.crop_img(batch["label"], config.crop_border), axis=3)
        }

        cost, l2_loss, _ = sess.run(
            [m.cost, m.l2_loss, m.train_op], feed_dict=feed_data)
        return l2_loss
Beispiel #3
0
def seg_pipeline(flair_dir, save_dir, f_cluster=5,  c_method='Kmeans', ):
    """
    segment the full tumor by clustering.
    :param flair_dir: flair image.
    :param save_dir: the dir to save the segmentation result.
    :param f_cluster: The cluster number of clustering.
    :param c_method: The cluster method, such as Kmeans, GMM, minibatchkmeans et al.
    :return: None
    """
    assert os.path.isfile(flair_dir), print('There is not a file at %s' % flair_dir)
    # Read data
    flair_img, affine_flair, hdr_flair = file_io.read_nii(flair_dir)

    # Preprocess
    st1, et1 = img_utils.get_bbox(flair_img)
    flair_roi = img_utils.normalize_0_1(img_utils.crop_img(flair_img, st1, et1))

    # full tumor segmentation
    full_tumor = img_utils.clustering_img([flair_roi], int(f_cluster), method=c_method)
    full_tumor = img_utils.rm_small_cc(full_tumor.astype(np.uint8), rate=0.3)
    full_tumor = img_utils.fill_full(full_tumor)
    final_mask = img_utils.crop2raw(flair_img.shape, full_tumor, st1, et1)
    if save_dir is not None:
        file_io.save_nii(final_mask, affine_flair, hdr_flair, save_dir)
Beispiel #4
0
def seg_pipeline(
    t1ce_dir,
    flair_dir,
    save_dir,
    bbox=None,
    nc_seg_mode='cc',
    t2_dir=None,
    t2_cluster=3,
    f_cluster=5,
    ec_cluster=4,
    c_method='Kmeans',
):
    assert os.path.isfile(t1ce_dir), print('There is not a file at %s' %
                                           t1ce_dir)
    assert os.path.isfile(flair_dir), print('There is not a file at %s' %
                                            flair_dir)
    # if not os.path.isdir(save_dir):
    #     os.mkdir(save_dir)
    # Read data
    t1ce_img, affine_t1ce, hdr_t1ce = file_io.read_nii(t1ce_dir)
    flair_img, affine_flair, hdr_flair = file_io.read_nii(flair_dir)
    if bbox is not None:
        st1, et1 = bbox[0], bbox[1]
    else:
        st1, et1 = img_utils.get_bbox(flair_img)

    # Preprocess
    flair_roi = img_utils.normalize_0_1(img_utils.crop_img(
        flair_img, st1, et1))

    # full tumor segmentation
    full_tumor = img_utils.clustering_img([flair_roi],
                                          int(f_cluster),
                                          method=c_method)
    full_tumor = img_utils.rm_small_cc(full_tumor.astype(np.uint8), rate=0.3)
    full_tumor = img_utils.fill_full(full_tumor)
    st_2, et_2 = img_utils.get_bbox(full_tumor)
    full_tumor_roi = img_utils.crop_img(full_tumor, st_2, et_2)

    # ec tumor segmentation
    t1ce_roi = img_utils.normalize_0_1(
        img_utils.crop_img(img_utils.crop_img(t1ce_img, st1, et1), st_2, et_2))
    t1ce_roi[full_tumor_roi != 1] = 0
    ec_tumor = img_utils.clustering_img([
        t1ce_roi,
    ],
                                        int(ec_cluster),
                                        method=c_method)

    # necrotic segmentation
    if nc_seg_mode == 'cc':
        nc_tumor = img_utils.segment_necrotic(ec_tumor, 3, 1)
        # integrate mask
        final_mask = np.zeros(full_tumor_roi.shape)
        final_mask[full_tumor_roi == 1] = 2
        final_mask[ec_tumor == 1] = 4
        final_mask[nc_tumor == 1] = 1
    elif nc_seg_mode == 't2':
        # core segmentation
        assert os.path.isfile(t2_dir), print('There is not a file at %s' %
                                             t2_dir)
        t2_img, affine_t2, hdr_t2 = file_io.read_nii(t2_dir)
        t2_roi = img_utils.normalize_0_1(
            img_utils.crop_img(img_utils.crop_img(t2_img, st1, et1), st_2,
                               et_2))
        t2_roi[full_tumor_roi != 1] = 0
        core_tumor = img_utils.clustering_img([
            t2_roi,
        ],
                                              int(t2_cluster),
                                              method=c_method)
        # integrate mask
        final_mask = np.zeros(full_tumor_roi.shape)
        final_mask[full_tumor_roi == 1] = 2
        final_mask[core_tumor == 1] = 1
        final_mask[ec_tumor == 1] = 4
    else:
        raise Exception(
            'This necrotic region segmentation method have not been defined!')
    final_mask = img_utils.crop2raw(
        flair_img.shape,
        img_utils.crop2raw(full_tumor.shape, final_mask, st_2, et_2), st1, et1)
    if save_dir is not None:
        file_io.save_nii_sitk(final_mask, save_dir)
    return final_mask
Beispiel #5
0
      def evaluate(data_iter, nbatches):
        """Runs evaluation."""
        count = 0
        PSNR = 0.0
        SSIM = 0.0
        crop_border = config.crop_border

        if nbatches == -1:
          iter_ = data_iter
        else:
          iter_ = range(nbatches)

        for bb in iter_:
          if nbatches == -1:
            batch = bb
          else:
            batch = data_iter.next()

          # deal with gray images
          is_rgb_img = False if len(batch["img"].shape) < 3 else True

          if not is_rgb_img:
            img_y = batch["img"]
            label_y = batch["label"]
          else:
            # note Matlab format is Ycbcr
            img_y = batch["img"][:, :, 0]
            img_cb = batch["img"][:, :, 1]
            img_cr = batch["img"][:, :, 2]
            label_y = batch["label"][:, :, 0]

          label_y = ut.crop_img(label_y, crop_border)
          feed_data = {
              mvalid.input:
              np.expand_dims(np.expand_dims(img_y, axis=0), axis=3)
          }

          output_img = sess.run(mvalid.output, feed_dict=feed_data)
          output_img = ut.clip_img(np.squeeze(output_img *
                                              255.0))  # clip pixel value
          PSNR += ut.compute_psnr(output_img, label_y)
          SSIM += ut.compute_ssim(output_img, label_y)

          if not is_rgb_img:
            save_input_img = ut.crop_img(
                ut.post_process(img_y * 255.0), crop_border)
            save_output_img = ut.post_process(output_img)
          else:
            save_input_img = np.zeros_like(batch["img"])
            # note OpenCV format is Ycrcb
            save_input_img[:, :, 0] = ut.clip_img(img_y * 255.0)
            save_input_img[:, :, 1] = img_cr
            save_input_img[:, :, 2] = img_cb

            save_input_img = ut.crop_img(
                ut.post_process(
                    cv2.cvtColor(
                        save_input_img.astype(np.uint8), cv2.COLOR_YCR_CB2BGR)),
                crop_border)

            save_output_img = np.zeros_like(save_input_img)
            save_output_img[:, :, 0] = output_img
            save_output_img[:, :, 1] = img_cr[crop_border:-crop_border,
                                              crop_border:-crop_border]
            save_output_img[:, :, 2] = img_cb[crop_border:-crop_border,
                                              crop_border:-crop_border]

            save_output_img = ut.post_process(
                cv2.cvtColor(
                    save_output_img.astype(np.uint8), cv2.COLOR_YCR_CB2BGR))

          cv2.imwrite(
              os.path.join(save_folder,
                           "test_input_{:05d}.png".format(count + 1)),
              save_input_img)

          cv2.imwrite(
              os.path.join(save_folder,
                           "test_output_{:05d}.png".format(count + 1)),
              save_output_img)

          count += 1

        PSNR /= count
        SSIM /= count

        return PSNR, SSIM
Beispiel #6
0
def seg_pipeline_adjusted(rootdir, uid, save_name, mode):
    # Read data
    t1ce_img, affine_t1ce, hdr_t1ce = file_io.read_nii(
        os.path.join(rootdir, uid, uid + '_t1ce.nii.gz'))
    t2_img, affine_t2, hdr_t2 = file_io.read_nii(
        os.path.join(rootdir, uid, uid + '_t2.nii.gz'))
    flair_img, affine_flair, hdr_flair = file_io.read_nii(
        os.path.join(rootdir, uid, uid + '_flair.nii.gz'))
    seg_img, affine_seg, hdr_seg = file_io.read_nii(
        os.path.join(rootdir, uid, uid + '_seg.nii.gz'))

    # Preprocess
    st1, et1 = img_utils.get_bbox(flair_img)
    flair_roi = img_utils.normalize_0_1(img_utils.crop_img(
        flair_img, st1, et1))
    seg_roi = img_utils.crop_img(seg_img, st1, et1)

    # full tumor segmentation
    full_re = [None, -1, 0]
    for n_c in range(3, 25):
        full_tumor = img_utils.clustering_img([flair_roi], n_c, method=mode)
        full_tumor = img_utils.rm_small_cc(full_tumor.astype(np.uint8),
                                           rate=0.3)
        full_tumor = img_utils.fill_full(full_tumor)
        temp_seg = seg_roi.copy()
        temp_seg[seg_roi != 0] = 1
        full_re_metric = metrics.Seg_metric(temp_seg, full_tumor)
        # print('full_re_metric {}: dice:{}'.format(n_c, full_re_metric.dice()))
        if full_re_metric.dice() > full_re[-1]:
            full_re[0] = full_tumor
            full_re[1] = n_c
            full_re[2] = full_re_metric.dice()
        if full_re_metric.dice() < full_re[-1] - 0.1:
            break

    st_2, et_2 = img_utils.get_bbox(full_re[0])
    full_tumor_roi = img_utils.crop_img(full_re[0], st_2, et_2)

    # ec tumor segmentation
    t1ce_roi = img_utils.normalize_0_1(
        img_utils.crop_img(img_utils.crop_img(t1ce_img, st1, et1), st_2, et_2))
    t1ce_roi[full_tumor_roi != 1] = 0
    EC_re = [None, -1, 0]
    for n_c in range(3, 6):
        ec_tumor = img_utils.clustering_img([
            t1ce_roi,
        ], n_c, method=mode)
        ec_tumor_de = img_utils.crop2raw(full_re[0].shape, ec_tumor, st_2,
                                         et_2)
        temp_seg = np.zeros(seg_roi.shape)
        temp_seg[seg_roi == 4] = 1
        ec_re_metric = metrics.Seg_metric(temp_seg, ec_tumor_de)
        # print('ec_re_metric {}: dice:{}'.format(n_c, ec_re_metric.dice()))
        if ec_re_metric.dice() >= EC_re[-1]:
            EC_re = [ec_tumor, n_c, ec_re_metric.dice()]
    ec_tumor = EC_re[0]

    # necrotic segmentation
    nc_tumor_1 = img_utils.segment_necrotic(ec_tumor, 3, 1)
    final_mask = np.zeros(full_tumor_roi.shape)
    final_mask[full_tumor_roi == 1] = 2
    final_mask[ec_tumor == 1] = 4
    final_mask[nc_tumor_1 == 1] = 1
    final_mask = img_utils.crop2raw(
        seg_img.shape,
        img_utils.crop2raw(full_re[0].shape, final_mask, st_2, et_2), st1, et1)
    core_re = [
        final_mask, 'cc',
        metrics.test_result(final_mask, seg_img, mode='core')[0]
    ]
    # print('core_metric cc:dice:{}'.format(core_re[-1]))
    t2_roi = img_utils.normalize_0_1(
        img_utils.crop_img(img_utils.crop_img(t2_img, st1, et1), st_2, et_2))
    t2_roi[full_tumor_roi != 1] = 0
    for n_c in range(3, 6):
        core_tumor = img_utils.clustering_img([
            t2_roi,
        ], n_c, method=mode)
        final_mask = np.zeros(full_tumor_roi.shape)
        final_mask[full_tumor_roi == 1] = 2
        final_mask[core_tumor == 1] = 1
        final_mask[ec_tumor == 1] = 4
        final_mask = img_utils.crop2raw(
            seg_img.shape,
            img_utils.crop2raw(full_re[0].shape, final_mask, st_2, et_2), st1,
            et1)
        core_metric = metrics.test_result(final_mask, seg_img, mode='core')
        # print('core_metric {}:dice:{}'.format(n_c, core_metric[0]))
        if core_metric[0] >= core_re[-1]:
            core_re = [final_mask, n_c, core_metric[0]]

    final_mask = core_re[0]
    # Calculate metrics
    ec_result = metrics.test_result(final_mask, seg_img, mode='ec')
    core_result = metrics.test_result(final_mask, seg_img, mode='core')
    full_result = metrics.test_result(final_mask, seg_img, mode='full')

    if save_name is not None:
        file_io.save_nii_sitk(final_mask,
                              os.path.join(rootdir, uid, uid + save_name))
    return ec_result, core_result, full_result, [
        full_re[1], EC_re[1], core_re[1]
    ]