nnUNetコードを読む際のいくつかの小さな詳細の記録

まず、nnUNetプロジェクトの説明をしてくれたPaper Sangのおかげで、私はそれから多くの恩恵を受けました。この映画は、私が重要だと思ったnnUNetコードで見たいくつかの詳細の記録です。

1.推論段階。nnUNet / nnunet / preprocessing /cropping.pyのcrop_to_nonzero関数

def crop_to_nonzero(data, seg=None, nonzero_label=-1):
    """

    :param data:
    :param seg:
    :param nonzero_label: this will be written into the segmentation map
    :return:
    """
    nonzero_mask = create_nonzero_mask(data)
    bbox = get_bbox_from_mask(nonzero_mask, 0)

    cropped_data = []
    for c in range(data.shape[0]):
        cropped = crop_to_bbox(data[c], bbox)
        cropped_data.append(cropped[None])
    data = np.vstack(cropped_data)

    if seg is not None:
        cropped_seg = []
        for c in range(seg.shape[0]):
            cropped = crop_to_bbox(seg[c], bbox)
            cropped_seg.append(cropped[None])
        seg = np.vstack(cropped_seg)

    nonzero_mask = crop_to_bbox(nonzero_mask, bbox)[None]
    if seg is not None:
        seg[(seg == 0) & (nonzero_mask == 0)] = nonzero_label
    else:
        nonzero_mask = nonzero_mask.astype(int)
        nonzero_mask[nonzero_mask == 0] = nonzero_label
        nonzero_mask[nonzero_mask > 0] = 0
        seg = nonzero_mask
    return data, seg, bbox

nonzero_maskの場合、値が0のデータは-1に設定されます(もちろん、binary_fill_holesはcreate_nonzero_mask関数でパーツを埋めるために使用されます)

 

2.推論段階。nnUNet / nnunet / preprocessing /preprocessing.pyの311行目

data, seg, properties = self.resample_and_normalize(data, target_spacing, properties, seg, force_separate_z=force_separate_z)

データのリサンプリングと正規化を実現します。

 

3.推論段階:nnUNet / nnunet / preprocessing /preprocessing.pyの150行

reshaped_data.append(resize_fn(data[c, slice_id], new_shape_2d, order, cval=cval, **kwargs))

各512 * 512はここでリサンプリングされます。ここでのresize_fnは、skimage.transform.resize()関数のorder = 3を表します。

言及する価値があります。これがマスクのリサンプリングである場合、resize_fnはbatchgenerators.augmentations.utils.resize_segmentation()を表します。ここでorder = 3の場合、理由は(​​[0、0、2]-> [0、1、2])ケースを防ぐためです。マスクは、背景が0、前景が1、前景の病変が2である可能性があるためです。0から1は、背景を前景にすることです。

4.推論段階:nnUNet / nnunet / preprocessing /preprocessing.pyの174行目

reshaped_final_data.append(map_coordinates(reshaped_data, coord_map, order=order_z, cval=cval,mode='nearest')[None])

z軸方向の場合、scipy.ndimage.interpolation.map_coordinates()関数を使用して、中央のレイヤー数を処理および追加します(3dmap座標を作成します。z軸3dマトリックス、x 1、y1。最も近い元の座標値の座標を入力します)。例は次のとおりです

#原数据
reshaped_data[0][300][300]=-94.4081754097679
reshaped_data[1][300][300]=-38.33892068143663

reshaped_data[0][301][300]=-100.75139288087729


#map_coordinates采样后
#z轴在变,但值还是那些值(分辨率改变)
reshaped_final_data[0][0][0][300][300]=-94.4081754097679
reshaped_final_data[0][0][1][300][300]=-94.4081754097679
reshaped_final_data[0][0][2][300][300]=-94.4081754097679
reshaped_final_data[0][0][3][300][300]=-38.33892068143663
reshaped_final_data[0][0][4][300][300]=-38.33892068143663
reshaped_final_data[0][0][5][300][300]=-38.33892068143663
reshaped_final_data[0][0][6][300][300]= 46.13715590124825
#x轴不变,x分辨率不变。
reshaped_final_data[0][0][0][301][300]=-100.75139288087729

 

おすすめ

転載: blog.csdn.net/qq_36401512/article/details/109245636