首先,感谢paper桑大佬关于nnUNet项目的解释,我从中获益很多。本片是关于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_labelelse:nonzero_mask = nonzero_mask.astype(int)nonzero_mask[nonzero_mask == 0] = nonzero_labelnonzero_mask[nonzero_mask > 0] = 0seg = nonzero_maskreturn data, seg, bbox

data中值为0的对于nonzero_mask中都设置为了-1.(当然其中create_nonzero_mask函数时用到了binary_fill_holes,填充了一部分)

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一个,y一个。填充坐标最近的原坐标值)。实例如下

#原数据
reshaped_data[0][300][300]=-94.4081754097679
reshaped_data[1][300][300]=-38.33892068143663reshaped_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

5.2d数据转nii格式阶段:在/home/pacs/nnUNet/nnunet/dataset_conversion/Task120_Massachusetts_RoadSegm.py中66行

transform=lambda x: (x == 255).astype(int)

单标签:

import numpy as npa=[[0,60,120,180,240],[0,0,0,0,0],[0,0,0,0,0],[240,180,120,60,0]]
a=np.array(a)
transform=lambda x: (x == 240).astype(int)
b=transform(a)
print(b)[[0 0 0 0 1][0 0 0 0 0][0 0 0 0 0][1 0 0 0 0]]

多标签:

import numpy as npa=[[0,60,120,180,240],[0,0,0,0,0],[0,0,0,0,0],[240,180,120,60,0]]
a=np.array(a)
transform=lambda x: (x == 240).astype(int)*1
transform1=lambda x: (x == 180).astype(int)*2
transform2=lambda x: (x == 120).astype(int)*3
transform3=lambda x: (x == 60).astype(int)*4
b=transform(a)+transform1(a)+transform2(a)+transform3(a)
print(b)[[0 4 3 2 1][0 0 0 0 0][0 0 0 0 0][1 2 3 4 0]]

关于在阅读nnUNet代码中的一些小细节的记录(一)相关推荐

  1. 关于在阅读nnUNet代码中的一些小细节的记录(二)

    1.推理阶段:在nnUNet/nnunet/network_architecture/neural_network.py的250行的_get_gaussian函数. def _get_gaussian ...

  2. 关于在阅读nnUNet代码中的一些小细节的记录(三)

    1.推理阶段:nnUNet/nnunet/training/model_restore.py的60行的recursive_find_python_class函数的参数current_module. 改 ...

  3. 工作中遇到的小问题的记录

    工作中遇到的小问题的记录 ①Android:open failed: EEXIST  (file exists) 现象: ⑴在实现一个SD卡中的文件从一个路径拷贝到另一个路径的功能时,需要测试当SD卡 ...

  4. 【山东日照seo招聘】网站SEO优化中注意哪些小细节?

    [山东日照seo招聘]网站SEO优化中注意哪些小细节? 1.网页标题要合理     网页标题的重用占SEO优化过程中的40%,如果网页标题没有做好,那么在后期的优化过程中,就会事倍功半,网页标题主要从 ...

  5. 长假多图-生活中产品的小细节

    再长的休假也有结束的时候,今天第一天上班.假期中跑了一些地方,拍了一些照片,晚上整理起来,发现还是挺职业病的,特地拍摄了一些生活中产品的小细节,分享给大家. 先是在南京,国庆节前几天,都是街头随意拍摄 ...

  6. C语言中的这个小细节你知道吗?

    文章目录 计算型细节 表达式细节 大家回答对了几道题?欢迎评论 1.现在正式讲解上面所有的题设计到的内容--------表达式求值 1.1隐式类型转换 (整型截断与提升) 1.1.1 第一题讲解 1. ...

  7. openFOAM代码阅读——基础代码中的wchar

    路径src/OpenFOAM/primitives/chars中还有另外一个文件夹wchar,我们这里来看看这里面有什么. 头文件wchar.H的内容如下: #include <cwchar&g ...

  8. 微信小程序的冥冥中拥有的小细节

    1.微信小程序的多目运算符 {{问题一?问题一成功:(问题一失败且判断)?问题二成功:问题二失败}} 2.关于微信小程序分包 小程序分包,一个包不能超过2m,不能超过8个分包,主包不能超过2m 3.微 ...

  9. 【c++师傅领进门,修行靠个人】第五篇:C++类和对象中的一些小细节

    面向对象的总结 1 初始化列表 2 如何突破封装 3 了解静态成员 4 类也能套娃 5 面向对象总结 1 初始化列表 初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成 ...

最新文章

  1. 系统芯片(SOC)架构- Aviral Mittal
  2. Tessellation (曲面细分) Displacement Mapping (贴图置换)
  3. 从Java到Kotlin(三)
  4. 正确使用Windows Azure 中的VM Role
  5. 神经网络迭代次数的数学构成
  6. Coding:就地合并两个排序数组
  7. jsr303jsp页面怎么显示错误信息_springmvc使用JSR-303进行数据校验实例
  8. 早起21天,奖你 1000元!
  9. HTML5----热区(在图片img上第一超链接选区)
  10. python中easygui有几种_一、Python 模块EasyGui详细介绍
  11. Qt Designer界面简介
  12. 组态王c语言延时1秒,(组态王软件详细教程第三讲让画面动起来.doc
  13. 网课答题查题公众号助手搭建教程
  14. Collaborative Filtering with Temporal Dynamics
  15. 在 pygame 中好好玩玩精灵,滚雪球学 Python 游戏番
  16. 互联网快讯:国家植物园在北京正式揭牌;极米Z6X Pro、极米H3S获赞赏;人民币兑日元逼近20大关
  17. PV140R1K1T1NMR1派克柱塞泵
  18. php大文件读取excel分割,如何用phpspreadsheet来切割excel大文件(附代码)
  19. 热门Java开发工具IDEA入门指南——IntelliJ IDEA概述(下)
  20. 编译原理之词法分析、语法分析、语义分析

热门文章

  1. php中这个向右的箭头怎么理解呢?$db-query
  2. django之orm的高级操作以及xcc安全攻击
  3. java webservice wsimport 无法将名称 'soapenc:Array' 解析为 'type definition' 组件 时对应的解决方法...
  4. CentOS下mysql安装
  5. [转载]对称加密DES和TripleDES
  6. hibernate 第二天
  7. JDK安装、java环境配置
  8. 【LeetCode】231. Power of Two
  9. SIP中第三方呼叫控制(3PCC)建立流程
  10. oracle odbc配置