NiBabel 3.2.1加载14.4MB NIFTI标签文件报ImageFileError问题
Nibabel加载大体积NIFTI文件报错解决方案
问题描述
使用NiBabel 3.2.1版本加载14.4MB的标记NIFTI文件时抛出文件类型识别错误,小体积KB级同类文件可正常加载,且报错文件可通过FreeSurfer FreeView正常打开,内容无异常。
报错信息如下:
Traceback (most recent call last): File "/home/miran045/reine097/projects2/lab2im/lab2im/dcan/reproduce_load_error.py", line 7, in <module> img = nib.load(file_path) File "/home/miran045/reine097/.local/lib/python3.7/site-packages/nibabel/loadsave.py", line 55, in load raise ImageFileError(f'Cannot work out file type of "{filename}"') nibabel.filebasedimages.ImageFileError: Cannot work out file type of "/home/feczk001/shared/data/nnUNet/nnUNet_raw_data_base/nnUNet_raw_data/Task509_Paper/labelsTr1/1mo_sub-375518.nii.gz"
复现代码
import nibabel as nib print(nib.__version__) file_path = '/home/feczk001/shared/data/nnUNet/nnUNet_raw_data_base/nnUNet_raw_data/Task509_Paper/labelsTr1/1mo_sub' \ '-375518.nii.gz' img = nib.load(file_path) print(img.shape)
解决方案
按优先级依次尝试以下方法:
- 指定加载器强制加载:NiBabel自动识别文件类型时对大文件的头部扫描存在阈值限制,可直接指定NIFTI加载器跳过自动识别步骤
调整代码如下:import nibabel as nib from nibabel import nifti1 file_path = '/home/feczk001/shared/data/nnUNet/nnUNet_raw_data_base/nnUNet_raw_data/Task509_Paper/labelsTr1/1mo_sub-375518.nii.gz' # 直接用nifti1加载器读取,兼容.nii/.nii.gz格式 img = nifti1.load(file_path) print(img.shape) - 调整NiBabel文件类型检测阈值:3.2.1版本默认仅读取文件前少量内容做类型判断,大文件头部如果存在填充冗余数据会导致识别失败,可手动调高检测字节数:
import nibabel as nib # 调高类型检测的读取字节数,改为读取前1MB内容做判断 nib.arrayproxy._header_size_limit = 1024 * 1024 file_path = '/home/feczk001/shared/data/nnUNet/nnUNet_raw_data_base/nnUNet_raw_data/Task509_Paper/labelsTr1/1mo_sub-375518.nii.gz' img = nib.load(file_path) print(img.shape) - 升级NiBabel版本:3.x版本存在多个大体积压缩NIFTI文件识别的bug,升级到4.0及以上版本可直接修复该类问题,升级命令:
pip install --upgrade nibabel - 验证文件完整性:如果上述方法都无效,可重新导出/解压该文件,避免压缩包局部损坏导致的识别异常。
内容的提问来源于stack exchange,提问作者Paul Reiners
相关产品推荐
相关产品推荐

