python - MemoryError:无法为 DIPY 图像配准中形状 (344、344、127) 和数据类型 float64 的数组分配 115.MiB
问题描述
我正在尝试使用 DIPY 进行图像注册(3d 仿射注册)我尝试运行以下代码(实际上我尝试使用不同的 nifti 文件重现示例代码)
from os.path import join as pjoin
import numpy as np
from dipy.viz import regtools
from dipy.data import fetch_mni_template, read_mni_template
from dipy.data.fetcher import fetch_syn_data, read_syn_data
from dipy.io.image import load_nifti
from dipy.align.imaffine import (transform_centers_of_mass,
AffineMap,
MutualInformationMetric,
AffineRegistration)
from dipy.align.transforms import (TranslationTransform3D,
RigidTransform3D,
AffineTransform3D)
files, folder = fetch_mni_template()
static_data, static_affine = load_nifti(pjoin(folder, 'mni_icbm152_t1_tal_nlin_asym_09a.nii'))
static = np.squeeze(static_data)
static_grid2world = static_affine
files, folder = fetch_syn_data()
moving_data, moving_affine = load_nifti(pjoin(folder, '2018.nii'))
moving = moving_data
moving_grid2world = moving_affine
identity = np.eye(4)
affine_map = AffineMap(identity,
static.shape, static_grid2world,
moving.shape, moving_grid2world)
print(static.shape)
resampled = affine_map.transform(moving)
regtools.overlay_slices(static, resampled, None, 0,
"Static", "Moving", "resampled_0.png")
regtools.overlay_slices(static, resampled, None, 1,
"Static", "Moving", "resampled_1.png")
regtools.overlay_slices(static, resampled, None, 2,
"Static", "Moving", "resampled_2.png")
c_of_mass = transform_centers_of_mass(static, static_grid2world,
moving, moving_grid2world)
transformed = c_of_mass.transform(moving)
regtools.overlay_slices(static, transformed, None, 0,
"Static", "Transformed", "transformed_com_0.png")
regtools.overlay_slices(static, transformed, None, 1,
"Static", "Transformed", "transformed_com_1.png")
regtools.overlay_slices(static, transformed, None, 2,
"Static", "Transformed", "transformed_com_2.png")
nbins = 32
sampling_prop = None
metric = MutualInformationMetric(nbins, sampling_prop)
level_iters = [10000, 1000, 100]
sigmas = [3.0, 1.0, 0.0]
factors = [4, 2, 1]
affreg = AffineRegistration(metric=metric,
level_iters=level_iters,
sigmas=sigmas,
factors=factors)
transform = TranslationTransform3D()
params0 = None
starting_affine = c_of_mass.affine
translation = affreg.optimize(static, moving, transform, params0,
static_grid2world, moving_grid2world,
starting_affine=starting_affine)
但我收到以下错误
MemoryError: Unable to allocate 115. MiB for an array with shape (344, 344, 127) and data type float64
我找不到解决方案。
解决方案
我通过从 32 位版本的 python 迁移到 64 位版本解决了这个问题
谢谢,玛尼
推荐阅读
- javascript - 为所有用户刷新一次页面
- r - R在ggplot2的x轴上绘制年龄(以年和月为单位)
- powershell - 命令提示符 powershell 命令以提升批处理文件传递参数
- mongodb - 如何使用 MongoDB PHP 库仅返回匹配的数组项
- mysql - MySQL 将字符串从一个字符替换为另一个字符
- kubernetes - Kubernetes - 将损坏的 pod 的名称和命名空间记录到文件中
- mysql - 如何设计 SQL 表以允许存储和检索当前和历史实体配置记录?
- javascript - 获取相对于 svg 元素的鼠标坐标
- c++ - 如何正确打印堆栈向量?
- java - Jackson @JsonProperty 创建重复名称