PaddlePaddle / PaddleSeg

Easy-to-use image segmentation library with awesome pre-trained model zoo, supporting wide-range of practical tasks in Semantic Segmentation, Interactive Segmentation, Panoptic Segmentation, Image Matting, 3D Segmentation, etc.
https://arxiv.org/abs/2101.06175
Apache License 2.0
8.69k stars 1.68k forks source link

nnunet模型修改 #3245

Closed iyangiii closed 8 months ago

iyangiii commented 1 year ago

问题确认 Search before asking

请提出你的问题 Please ask your question

如果想修改nnunet网络的结构应该是在哪个文件进行修改? 比如将普通卷积改为可变形卷积

Bobholamovic commented 1 year ago

你好,在这里可以找到nnUNet的模型定义:https://github.com/PaddlePaddle/PaddleSeg/blob/release/2.8/contrib/MedicalSeg/medicalseg/models/nnunet.py

iyangiii commented 1 year ago

你好,在这里可以找到nnUNet的模型定义:https://github.com/PaddlePaddle/PaddleSeg/blob/release/2.8/contrib/MedicalSeg/medicalseg/models/nnunet.py

嗯 这个文件我知道 这个模型 不是很懂在哪里修改 能给点思路吗 比如想把最后一层卷积改为可变形卷积

Bobholamovic commented 1 year ago

从代码上看,将最后数层改成可变形卷积可以考虑把此处conv_op修改为DeformConv2D。如果只想要修改最后一层,只需修改self.seg_heads的最后一个元素。不过可变形卷积可能需要不止一个输入,为此也需要修改此处的调用。

iyangiii commented 1 year ago

从代码上看,将最后数层改成可变形卷积可以考虑把此处conv_op修改为DeformConv2D。如果只想要修改最后一层,只需修改self.seg_heads的最后一个元素。不过可变形卷积可能需要不止一个输入,为此也需要修改此处的调用。

请问这个修改最后一个元素是什么意思呢

Bobholamovic commented 1 year ago

从代码上看,将最后数层改成可变形卷积可以考虑把此处conv_op修改为DeformConv2D。如果只想要修改最后一层,只需修改self.seg_heads的最后一个元素。不过可变形卷积可能需要不止一个输入,为此也需要修改此处的调用。

请问这个修改最后一个元素是什么意思呢

self.seg_heads是一个列表,其中有很多个元素(对象),每个元素对应模型中的一层。只修改最后一个元素(self.seg_heads[-1])就是只修改模型的最后一层。

iyangiii commented 1 year ago

从代码上看,将最后数层改成可变形卷积可以考虑把此处conv_op修改为DeformConv2D。如果只想要修改最后一层,只需修改self.seg_heads的最后一个元素。不过可变形卷积可能需要不止一个输入,为此也需要修改此处的调用。

请问这个修改最后一个元素是什么意思呢

self.seg_heads是一个列表,其中有很多个元素(对象),每个元素对应模型中的一层。只修改最后一个元素(self.seg_heads[-1])就是只修改模型的最后一层。

就是说我需要在这个 self.seg_heads.append 结束后对最后一个元素进行修改吗 然后可变形卷积中的offset和mask是需要自己实现吗

Bobholamovic commented 1 year ago

就是说我需要在这个 self.seg_heads.append 结束后对最后一个元素进行修改吗

是的,这是一个办法,也可以通过修改循环体部分的逻辑来实现『最后一个元素与列表中其它元素不同』。

然后可变形卷积中的offset和mask是需要自己实现吗

这是一个算法层面的问题。如果确定使用可变形卷积,应该在算法设计上考虑如何获取offset,例如通过另一个普通卷积从上一层输入中获取。

iyangiii commented 1 year ago

就是说我需要在这个 self.seg_heads.append 结束后对最后一个元素进行修改吗

是的,这是一个办法,也可以通过修改循环体部分的逻辑来实现『最后一个元素与列表中其它元素不同』。

然后可变形卷积中的offset和mask是需要自己实现吗

这是一个算法层面的问题。如果确定使用可变形卷积,应该在算法设计上考虑如何获取offset,例如通过另一个普通卷积从上一层输入中获取。

怎么从上一层获取输出定义offset 搞蒙了....

Bobholamovic commented 1 year ago

使用什么作为offset或者如何构造offset是一个算法层面的问题,严格来说与本issue无关。在设计模型时,如果希望使用可变形卷积的话,需要制定好相关的策略。

iyangiii commented 1 year ago

使用什么作为offset或者如何构造offset是一个算法层面的问题,严格来说与本issue无关。在设计模型时,如果希望使用可变形卷积的话,需要制定好相关的策略。

修改过程中 原本的x是一个五维张量 但是DeformConv2D只能接受一个四维张量 就会报错 这个有解决方法吗

Bobholamovic commented 1 year ago

使用什么作为offset或者如何构造offset是一个算法层面的问题,严格来说与本issue无关。在设计模型时,如果希望使用可变形卷积的话,需要制定好相关的策略。

修改过程中 原本的x是一个五维张量 但是DeformConv2D只能接受一个四维张量 就会报错 这个有解决方法吗

这样的话看起来没有简单的实现了……可能需要自己实现一个DeformConv3D来处理5D输入的情况,可以参考DeformConv2D的实现:https://github.com/PaddlePaddle/Paddle/blob/release/2.4/python/paddle/vision/ops.py#L1093