当列车图像过大而无法一次送入网络时,如何处理?

2024-09-30 16:33:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我用voxelmorph做肺部图像的配准。但是我的火车图像太大了,无法输入到网络中,图像的形状不同,形状也不规则。有些是513436…(不是2的幂次,所以我不能直接使用U-NET或其他CNN)。在

为了解决这些问题,我将列车图像分割成128x128x128的子图像,其中step=100。看起来像这样:

split image into sub-images

在预测阶段,我还将图像分割成若干子图像,利用网络对每个子图像进行预测,然后对结果进行组合。但问题是子图像的边界看起来与内部区域不同,如下所示:

boundaries problem

我天真的方法是平滑的,但我发现它行不通。我认为这是一个常见的问题。怎么解决这个问题?请帮忙。在

这个数据问题有点小不同。因为简单列车图像的形状超过300x300x300。所以不是整个数据集太大,一个简单的数据就太大了。在

有一些例子:

(430, 318, 168)  
(434, 354, 349)  
(428, 290, 439)  
(446, 290, 466)  
(452, 382, 373)  
(464, 290, 378)  
(424, 278, 217)  
(308, 202, 109)  
(420, 312, 537)  
(444, 314, 399)  
(418, 368, 323)  
(384, 432, 396)  
(412, 282, 408)  
(314, 188, 239)  
(428, 308, 422)  
(412, 302, 471)  
(276, 158, 127)  
(384, 432, 396)  
(394, 322, 370)  
(412, 322, 289)  
(412, 296, 458)  
(323, 250, 127)  
(448, 296, 431)  
(420, 302, 446)  
(438, 314, 393)  
(386, 424, 386) 

像这样的骨网:

^{pr2}$

CNN上有一篇文章提到大图像,A New Approach to Compute CNNs for Extremely Large ImagesA same boundary problem它使用了一个自适应填充来解决边界问题,但是描述不清楚。我认为这类似于重叠策略。在


Tags: 数据图像image网络netstepcnnsplit
3条回答

对于U-net模型,可以将输入分成几部分并分别处理。在

需要注意的是图像的边界:将256x256分割成4幅128x128的图像可能会在分割时产生明显的边界(图像中心有一个十字)。为了避免这一点,将图像分割为稍微重叠并忽略边界是有意义的。在

换句话说。对于大小为256x256的图像,可放入内存的最大可能输入为128,请遵循下一个算法:

  1. 选择边框大小。对于具有4个下采样层的unet,选择与2^number_of_downsamplings=2^4=16成比例的边框是合理的。在
  2. 将输入图像拆分为96x96的正方形,其中96=128-2*边框大小
  3. 对于每个方块,从每边附加一个16px的原始图像。产生128x128的图像
  4. 在对图像进行处理后,剪下96x96的内部正方形,并用它来缝合最终的预测。在

解决方案

你好@ruokuanwu这是一个很常见的问题,我们有很多数据需要训练,在深入学习,我们不能存储所有这些到我们的记忆一次。为了解决这个问题,keras有一个flow_from_directory的函数,keras可以直接从磁盘上获取数据。现在我们不必一次上传所有数据。这个功能从磁盘中取出一批,将其加载到内存中,并将其送入模型进行处理。解决了大数据集的训练问题。在

您可以在这里看到通过图像生成器进行训练的示例。在

Example Notebook Kaggle Link

要求:

如果你正在进行图像分类,你必须把你的每个类放在单独的文件夹中,并给出你的独立类文件夹所在的父文件夹的路径。在

如果您的问题可以通过使形状大小为2的倍数来解决,我建议使用openCV。在

您可以简单地通过添加白/黑边框来扩展图像。您也可以缩放图像,这取决于在您的情况下哪个效果更好。在

另一个选项-运行ImageMagic来增加较小图像的图像大小。 示例:

magick convert -resize 400% smallImage.png Enlarged.png

这将使较小图像的大小增加4倍。在

相关问题 更多 >