Skip to content

Commit d68aaf5

Browse files
authored
encode nifti correctly when uploading lazily (#7892)
* encode nifti correctly when uploading lazily * update docstring for nifti functionality
1 parent c5a4b62 commit d68aaf5

File tree

2 files changed

+9
-3
lines changed

2 files changed

+9
-3
lines changed

src/datasets/features/features.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
from ..utils.py_utils import asdict, first_non_null_value, zip_dict
4343
from .audio import Audio
4444
from .image import Image, encode_pil_image
45-
from .nifti import Nifti
45+
from .nifti import Nifti, encode_nibabel_image
4646
from .pdf import Pdf, encode_pdfplumber_pdf
4747
from .translation import Translation, TranslationVariableLanguages
4848
from .video import Video
@@ -307,6 +307,9 @@ def _cast_to_python_objects(obj: Any, only_1d_for_numpy: bool, optimize_list_cas
307307
if config.PDFPLUMBER_AVAILABLE and "pdfplumber" in sys.modules:
308308
import pdfplumber
309309

310+
if config.NIBABEL_AVAILABLE and "nibabel" in sys.modules:
311+
import nibabel as nib
312+
310313
if config.TORCHCODEC_AVAILABLE and "torchcodec" in sys.modules:
311314
from torchcodec.decoders import AudioDecoder, VideoDecoder
312315

@@ -380,6 +383,8 @@ def _cast_to_python_objects(obj: Any, only_1d_for_numpy: bool, optimize_list_cas
380383
return encode_pil_image(obj), True
381384
elif config.PDFPLUMBER_AVAILABLE and "pdfplumber" in sys.modules and isinstance(obj, pdfplumber.pdf.PDF):
382385
return encode_pdfplumber_pdf(obj), True
386+
elif config.NIBABEL_AVAILABLE and "nibabel" in sys.modules and isinstance(obj, nib.analyze.AnalyzeImage):
387+
return encode_nibabel_image(obj, force_bytes=True), True
383388
elif isinstance(obj, pd.Series):
384389
return (
385390
_cast_to_python_objects(

src/datasets/features/nifti.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,7 @@ def cast_storage(self, storage: Union[pa.StringArray, pa.StructArray, pa.BinaryA
300300
return array_cast(storage, self.pa_type)
301301

302302

303-
def encode_nibabel_image(img: "nib.Nifti1Image") -> dict[str, Optional[Union[str, bytes]]]:
303+
def encode_nibabel_image(img: "nib.Nifti1Image", force_bytes: bool = False) -> dict[str, Optional[Union[str, bytes]]]:
304304
"""
305305
Encode a nibabel image object into a dictionary.
306306
@@ -309,11 +309,12 @@ def encode_nibabel_image(img: "nib.Nifti1Image") -> dict[str, Optional[Union[str
309309
310310
Args:
311311
img: A nibabel image object (e.g., Nifti1Image).
312+
force_bytes: If `True`, always serialize to bytes even if a file path exists. Needed to upload bytes properly.
312313
313314
Returns:
314315
dict: A dictionary with "path" or "bytes" field.
315316
"""
316-
if hasattr(img, "file_map") and img.file_map is not None:
317+
if hasattr(img, "file_map") and img.file_map is not None and not force_bytes:
317318
filename = img.file_map["image"].filename
318319
return {"path": filename, "bytes": None}
319320

0 commit comments

Comments
 (0)