まず、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