Ejemplo n.º 1
0
 def metrics_zfilled():
     metrics = Metrics(METRIC_FUNCS)
     pred_and_gt = [
         reco_and_gt_zfilled_from_val_file(*val_gen_scaled[i])
         for i in tqdm(range(len(val_gen_scaled)), desc='Val files for z-filled')
     ]
     for im_recos, images in tqdm(pred_and_gt, desc='Stats for z-filled'):
         metrics.push(images, im_recos)
     return metrics
Ejemplo n.º 2
0
 def metrics_for_params(reco_function=None, val_gen=None, name=None, **net_params):
     model = unpack_model(**net_params)
     metrics = Metrics(METRIC_FUNCS)
     pred_and_gt = [
         reco_function(*val_gen[i], model)
         for i in tqdm(range(len(val_gen)), desc=f'Val files for {name}')
     ]
     for im_recos, images in tqdm(pred_and_gt, desc=f'Stats for {name}'):
         metrics.push(images, im_recos)
     return metrics
Ejemplo n.º 3
0
def evaluate_nc(
    model,
    multicoil=False,
    run_id=None,
    n_epochs=200,
    contrast=None,
    acq_type='radial',
    n_samples=None,
    cuda_visible_devices='0123',
    dcomp=False,
    **acq_kwargs,
):
    if multicoil:
        val_path = f'{FASTMRI_DATA_DIR}multicoil_val/'
    else:
        val_path = f'{FASTMRI_DATA_DIR}singlecoil_val/'

    os.environ["CUDA_VISIBLE_DEVICES"] = ','.join(cuda_visible_devices)

    if multicoil:
        dataset = multicoil_dataset
    else:
        dataset = singlecoil_dataset
    val_set = dataset(val_path,
                      IM_SIZE,
                      acq_type=acq_type,
                      compute_dcomp=dcomp,
                      contrast=contrast,
                      inner_slices=None,
                      rand=False,
                      scale_factor=1e6,
                      **acq_kwargs)
    if n_samples is not None:
        val_set = val_set.take(n_samples)
    else:
        val_set = val_set.take(199)

    example_input = next(iter(val_set))[0]
    inputs_shape = _extract_inputs_shape(example_input, no_batch=True)
    inputs_dtype = _extract_inputs_dtype(example_input)

    inputs = _zeros_from_shape(inputs_shape, inputs_dtype)
    # special case for the shape:
    inputs[-1][0] = tf.constant([[372]])
    model(inputs)
    if run_id is not None:
        model.load_weights(
            f'{CHECKPOINTS_DIR}checkpoints/{run_id}-{n_epochs:02d}.hdf5')
    m = Metrics(METRIC_FUNCS)
    for x, y_true in tqdm(val_set.as_numpy_iterator(),
                          total=199 if n_samples is None else n_samples):
        y_pred = model.predict(x, batch_size=1)
        m.push(y_true[..., 0], y_pred[..., 0])
    return METRIC_FUNCS, list(m.means().values())
Ejemplo n.º 4
0
 def metrics_for_params(val_gen=None, name=None, **net_params):
     if val_gen is None:
         val_gen = val_gen_mask
     model = unpack_model(**net_params)
     metrics = Metrics(METRIC_FUNCS)
     pred_and_gt = [
         reco_and_gt_net_from_val_file(*val_gen[i], model)
         for i in tqdm(range(len(val_gen)), desc=f'Val files for {name}')
     ]
     for im_recos, images in tqdm(pred_and_gt, desc=f'Stats for {name}'):
         metrics.push(images, im_recos)
     return metrics
def evaluate_xpdnet_dealiasing(
    model_fun,
    model_kwargs,
    run_id,
    n_scales=0,
    n_epochs=200,
    contrast='CORPD_FBK',
    af=4,
    n_samples=None,
    cuda_visible_devices='0123',
):

    val_path = f'{FASTMRI_DATA_DIR}singlecoil_val/'

    os.environ["CUDA_VISIBLE_DEVICES"] = ','.join(cuda_visible_devices)

    val_set = singlecoil_dataset(
        val_path,
        AF=af,
        contrast=contrast,
        inner_slices=None,
        rand=False,
        scale_factor=1e6,
    )
    if n_samples is not None:
        val_set = val_set.take(n_samples)
    else:
        val_set = val_set.take(199)

    model = MultiscaleComplex(
        model_fun=model_fun,
        model_kwargs=model_kwargs,
        res=False,
        n_scales=n_scales,
        fastmri_format=True,
    )
    model(next(iter(val_set))[0])
    model.load_weights(
        f'{CHECKPOINTS_DIR}checkpoints/{run_id}-{n_epochs:02d}.hdf5')
    m = Metrics(METRIC_FUNCS)
    for x, y_true in tqdm(val_set.as_numpy_iterator(),
                          total=199 if n_samples is None else n_samples):
        y_pred = model.predict(x, batch_size=1)
        m.push(y_true[..., 0], y_pred[..., 0])
    return ['PSNR', 'SSIM'], list(m.means().values())
Ejemplo n.º 6
0
def evaluate_xpdnet_denoising(
    model,
    run_id,
    n_epochs=200,
    contrast='CORPD_FBK',
    noise_std=30,
    n_samples=100,
    cuda_visible_devices='0123',
):
    os.environ["CUDA_VISIBLE_DEVICES"] = ','.join(cuda_visible_devices)

    val_set = NoisyFastMRIDatasetBuilder(
        dataset='val',
        noise_power_spec=noise_std,
        noise_input=False,
        contrast=contrast,
        slice_random=True,
        scale_factor=1e4,
        force_determinism=True,
    ).preprocessed_ds
    val_set = val_set.take(n_samples)

    if isinstance(model, tuple):
        model = build_model_from_specs(*model)
    model.load_weights(
        f'{CHECKPOINTS_DIR}checkpoints/{run_id}-{n_epochs:02d}.hdf5')
    eval_res = Metrics(METRIC_FUNCS)
    for x, y_true in tqdm(val_set.as_numpy_iterator(), total=n_samples):
        y_pred = model.predict(x)
        eval_res.push(y_true[..., 0], y_pred[..., 0])
    return METRIC_FUNCS, (list(eval_res.means().values()),
                          list(eval_res.stddevs().values()))
def evaluate_vnet_postproc(
    original_run_id,
    run_id,
    brain=False,
    n_epochs=200,
    contrast=None,
    af=4,
    n_samples=None,
    base_n_filters=16,
    n_scales=4,
    non_linearity='prelu',
):
    if brain:
        val_path = f'{FASTMRI_DATA_DIR}brain_multicoil_val/'
    else:
        val_path = f'{FASTMRI_DATA_DIR}multicoil_val/'

    af = int(af)
    run_params = dict(
        layers_n_channels=[base_n_filters * 2**i for i in range(n_scales)],
        layers_n_non_lins=2,
        non_linearity=non_linearity,
        res=True,
    )
    model = PostProcessVnet(None, run_params)
    model(tf.zeros([2, 320, 320, 1]))
    model.load_weights(
        f'{CHECKPOINTS_DIR}checkpoints/{run_id}-{n_epochs:02d}.hdf5')
    val_set = train_postproc_dataset_from_tfrecords(
        val_path,
        original_run_id,
        n_samples=n_samples,
    )
    if brain:
        n_volumes = brain_n_volumes_validation
        if contrast is not None:
            n_volumes = brain_volumes_per_contrast['validation'][contrast]
    else:
        n_volumes = n_volumes_val
        if contrast is not None:
            n_volumes //= 2
            n_volumes += 1
    if n_samples is not None:
        val_set = val_set.take(n_samples)
    else:
        val_set = val_set.take(n_volumes)

    eval_res = Metrics(METRIC_FUNCS)
    for x, y_true in tqdm(val_set.as_numpy_iterator(),
                          total=n_volumes if n_samples is None else n_samples):
        y_pred = model.predict_batched(x, batch_size=4)
        eval_res.push(y_true[..., 0], y_pred[..., 0])
    return METRIC_FUNCS, (list(eval_res.means().values()),
                          list(eval_res.stddevs().values()))
Ejemplo n.º 8
0
def evaluate_xpdnet(
    model_fun,
    model_kwargs,
    run_id,
    multicoil=True,
    brain=False,
    n_epochs=200,
    contrast=None,
    af=4,
    n_iter=10,
    res=True,
    n_scales=0,
    n_primal=5,
    refine_smaps=False,
    refine_big=False,
    n_samples=None,
    cuda_visible_devices='0123',
    equidistant_fake=False,
    mask_type=None,
    primal_only=True,
    n_dual=1,
    n_dual_filters=16,
    multiscale_kspace_learning=False,
):
    if multicoil:
        if brain:
            val_path = f'{FASTMRI_DATA_DIR}brain_multicoil_val/'
        else:
            val_path = f'{FASTMRI_DATA_DIR}multicoil_val/'
    else:
        val_path = f'{FASTMRI_DATA_DIR}singlecoil_val/'

    os.environ["CUDA_VISIBLE_DEVICES"] = ','.join(cuda_visible_devices)
    af = int(af)

    run_params = {
        'n_primal': n_primal,
        'multicoil': multicoil,
        'n_scales': n_scales,
        'n_iter': n_iter,
        'refine_smaps': refine_smaps,
        'res': res,
        'output_shape_spec': brain,
        'refine_big': refine_big,
        'primal_only': primal_only,
        'n_dual': n_dual,
        'n_dual_filters': n_dual_filters,
        'multiscale_kspace_learning': multiscale_kspace_learning,
    }

    if multicoil:
        dataset = multicoil_dataset
        if mask_type is None:
            if brain:
                if equidistant_fake:
                    mask_type = 'equidistant_fake'
                else:
                    mask_type = 'equidistant'
            else:
                mask_type = 'random'
        kwargs = {
            'parallel': False,
            'output_shape_spec': brain,
            'mask_type': mask_type,
        }
    else:
        dataset = singlecoil_dataset
        kwargs = {}
    val_set = dataset(
        val_path,
        AF=af,
        contrast=contrast,
        inner_slices=None,
        rand=False,
        scale_factor=1e6,
        **kwargs,
    )
    if brain:
        n_volumes = brain_n_volumes_validation
        if contrast is not None:
            n_volumes = brain_volumes_per_contrast['validation'][contrast]
    else:
        n_volumes = n_volumes_val
        if contrast is not None:
            n_volumes //= 2
            n_volumes += 1
    if n_samples is not None:
        val_set = val_set.take(n_samples)
    else:
        val_set = val_set.take(n_volumes)

    mirrored_strategy = tf.distribute.MirroredStrategy()
    with mirrored_strategy.scope():
        if multicoil:
            kspace_size = [1, 15, 640, 372]
        else:
            kspace_size = [1, 640, 372]

        model = XPDNet(model_fun, model_kwargs, **run_params)
        inputs = [
            tf.zeros(kspace_size + [1], dtype=tf.complex64),
            tf.zeros(kspace_size, dtype=tf.complex64),
        ]
        if multicoil:
            inputs.append(tf.zeros(kspace_size, dtype=tf.complex64))
        if brain:
            inputs.append(tf.constant([[320, 320]]))
        model(inputs)
    model.load_weights(
        f'{CHECKPOINTS_DIR}checkpoints/{run_id}-{n_epochs:02d}.hdf5')
    eval_res = Metrics(METRIC_FUNCS)
    for x, y_true in tqdm(val_set.as_numpy_iterator(),
                          total=n_volumes if n_samples is None else n_samples):
        y_pred = model.predict(x, batch_size=4)
        eval_res.push(y_true[..., 0], y_pred[..., 0])
    return METRIC_FUNCS, (list(eval_res.means().values()),
                          list(eval_res.stddevs().values()))
Ejemplo n.º 9
0
def evaluate_nc(
    model,
    multicoil=False,
    three_d=False,
    run_id=None,
    n_epochs=200,
    contrast=None,
    acq_type='radial',
    n_samples=None,
    cuda_visible_devices='0123',
    dcomp=False,
    brain=False,
    **acq_kwargs,
):
    if multicoil:
        if brain:
            val_path = f'{FASTMRI_DATA_DIR}brain_multicoil_val/'
        else:
            val_path = f'{FASTMRI_DATA_DIR}multicoil_val/'
    elif three_d:
        val_path = f'{OASIS_DATA_DIR}/val/'
    else:
        val_path = f'{FASTMRI_DATA_DIR}singlecoil_val/'

    os.environ["CUDA_VISIBLE_DEVICES"] = ','.join(cuda_visible_devices)

    if multicoil:
        dataset = multicoil_dataset
        image_size = IM_SIZE
    elif three_d:
        dataset = three_d_dataset
        image_size = VOLUME_SIZE
    else:
        dataset = singlecoil_dataset
        image_size = IM_SIZE
    if not three_d:
        add_kwargs = {
            'contrast': contrast,
            'rand': False,
            'inner_slices': None,
        }
        if multicoil:
            add_kwargs.update(brain=brain)
    else:
        add_kwargs = {}
    add_kwargs.update(**acq_kwargs)
    val_set = dataset(val_path,
                      image_size,
                      acq_type=acq_type,
                      compute_dcomp=dcomp,
                      scale_factor=1e6 if not three_d else 1e-2,
                      **add_kwargs)
    if n_samples is not None:
        val_set = val_set.take(n_samples)
    else:
        val_set = val_set.take(199)

    example_input = next(iter(val_set))[0]
    inputs = _extract_first_elem_of_batch(example_input)
    model(inputs)
    if run_id is not None:
        model.load_weights(
            f'{CHECKPOINTS_DIR}checkpoints/{run_id}-{n_epochs:02d}.hdf5')
    if three_d:
        m = Metrics({'PSNR': METRIC_FUNCS['PSNR']})
    else:
        m = Metrics(METRIC_FUNCS)
    for x, y_true in tqdm(val_set.as_numpy_iterator(),
                          total=199 if n_samples is None else n_samples):
        y_pred = model.predict(x, batch_size=1)
        m.push(y_true[..., 0], y_pred[..., 0])
        del x
        del y_true
        del y_pred
    print(METRIC_FUNCS.keys())
    print(list(m.means().values()))
    return METRIC_FUNCS, list(m.means().values())
    else:
        add_kwargs = {}
    add_kwargs.update(**acq_kwargs)
    val_set = dataset(val_path,
                      image_size,
                      acq_type=acq_type,
                      compute_dcomp=False,
                      scale_factor=1e6 if not three_d else 1e-2,
                      **add_kwargs)
    if n_samples is not None:
        val_set = val_set.take(n_samples)
    else:
        val_set = val_set.take(199)

    if three_d:
        m = Metrics({'PSNR': METRIC_FUNCS['PSNR']})
    else:
        m = Metrics(METRIC_FUNCS)
    model_checkpoint = None
    model_path = f'dip_model_weights_{acq_type}'
    if contrast is not None:
        model_path += f'{contrast}'
    if multicoil:
        model_path += '_mc'
    if acq_kwargs:
        af = acq_kwargs['af']
        model_path += f'_af{af}'
    model_path += '.h5'
    save_path = str(Path(CHECKPOINTS_DIR) / model_path)
    x, y_true = next(val_set.as_numpy_iterator())
    x = x[0:2]
 if multicoil:
     res_name += '_mc'
     if brain:
         res_name += '_brain'
 if three_d:
     res_name += '_3d'
 if contrast is not None:
     res_name += f'_{contrast}'
 if acq_kwargs:
     af = acq_kwargs['af']
     if af != 4:
         res_name += f'_af{af}'
 else:
     af = None
 if three_d:
     m = Metrics({'PSNR': METRIC_FUNCS['PSNR']}, res_name)
 else:
     m = Metrics(METRIC_FUNCS, res_name)
 model_path = f'dip_model_weights_{acq_type}'
 if contrast is not None:
     model_path += f'{contrast}'
 if multicoil:
     model_path += '_mc'
 if af is not None:
     model_path += f'_af{af}'
 if brain:
     model_checkpoints = {}
     model_path += '_brain_{n_coils}.h5'
 else:
     model_checkpoint = None
     model_path += '.h5'
Ejemplo n.º 12
0
def evaluate_updnet(
        multicoil=True,
        brain=False,
        run_id='updnet_sense_af4_1588609141',
        n_epochs=200,
        contrast=None,
        af=4,
        n_iter=10,
        n_layers=3,
        base_n_filter=16,
        non_linearity='relu',
        channel_attention_kwargs=None,
        refine_smaps=False,
        n_samples=None,
        cuda_visible_devices='0123',
        verbose=False,
        equidistant_fake=False,
        mask_type=None,
    ):
    if verbose:
        print(f'Evaluating {run_id}')
    if multicoil:
        if brain:
            val_path = f'{FASTMRI_DATA_DIR}brain_multicoil_val/'
        else:
            val_path = f'{FASTMRI_DATA_DIR}multicoil_val/'
    else:
        val_path = f'{FASTMRI_DATA_DIR}singlecoil_val/'

    os.environ["CUDA_VISIBLE_DEVICES"] = ','.join(cuda_visible_devices)
    af = int(af)

    run_params = {
        'n_primal': 5,
        'n_dual': 1,
        'primal_only': True,
        'multicoil': multicoil,
        'n_layers': n_layers,
        'layers_n_channels': [base_n_filter * 2**i for i in range(n_layers)],
        'non_linearity': non_linearity,
        'n_iter': n_iter,
        'channel_attention_kwargs': channel_attention_kwargs,
        'refine_smaps': refine_smaps,
        'output_shape_spec': brain,
    }

    if multicoil:
        dataset = multicoil_dataset
        if mask_type is None:
            if brain:
                if equidistant_fake:
                    mask_type = 'equidistant_fake'
                else:
                    mask_type = 'equidistant'
            else:
                mask_type = 'random'
        kwargs = {
            'parallel': False,
            'output_shape_spec': brain,
            'mask_type': mask_type,
        }
    else:
        dataset = singlecoil_dataset
        kwargs = {}
    val_set = dataset(
        val_path,
        AF=af,
        contrast=contrast,
        inner_slices=None,
        rand=False,
        scale_factor=1e6,
        **kwargs,
    )
    if brain:
        n_volumes = brain_n_volumes_validation
        if contrast is not None:
            n_volumes = brain_volumes_per_contrast['validation'][contrast]
    else:
        n_volumes = n_volumes_val
        if contrast is not None:
            n_volumes //= 2
            n_volumes += 1
    if n_samples is not None:
        val_set = val_set.take(n_samples)
    else:
        val_set = val_set.take(n_volumes)

    mirrored_strategy = tf.distribute.MirroredStrategy()
    with mirrored_strategy.scope():
        if multicoil:
            kspace_size = [1, 15, 640, 372]
        else:
            kspace_size = [1, 640, 372]
        model = UPDNet(**run_params)
        inputs = [
            tf.zeros(kspace_size + [1], dtype=tf.complex64),
            tf.zeros(kspace_size, dtype=tf.complex64),
        ]
        if multicoil:
            inputs.append(tf.zeros(kspace_size, dtype=tf.complex64))
        if brain:
            inputs.append(tf.constant([[320, 320]]))
        model(inputs)
    model.load_weights(f'{CHECKPOINTS_DIR}checkpoints/{run_id}-{n_epochs:02d}.hdf5')
    m = Metrics(METRIC_FUNCS)
    for x, y_true in tqdm(val_set.as_numpy_iterator(), total=n_volumes if n_samples is None else n_samples):
        y_pred = model.predict(x, batch_size=4)
        m.push(y_true[..., 0], y_pred[..., 0])
    return METRIC_FUNCS, list(m.means().values())