خطا در dataloader پایتورچ - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

خطا در dataloader پایتورچ

0 امتیاز

من از dataloader خود پایتورج استفاده می کنم رو بعضی از تصاویر خطا میده فکر می کردم خودش هندل کنه ظاهرا خطا میخوره و می پره بیرون.

image_datasets = datasets.ImageFolder(src_path, transform=data_transforms)
 dataloaders =  torch.utils.data.DataLoader(image_datasets, batch_size=self.batch_size, shuffle=False, num_workers=4)  

 

خطا :

give such error PIL.UnidentifiedImageError: cannot identify image file <_io.BufferedReader name='D:\\database\\Sabt_asnad\\DB1402\\GT\\Train_Set_V2\\Train_Set_V2\\n_mine_1\\00\\1.000_00_1.000_00_1.000_00_1.000_00_1.000_00_1.000_00_15139_8e5fc11182034f619834c52537e3231b.tif'>

 

سوال شده مرداد 7, 1402  بوسیله ی ابید (امتیاز 781)   19 90 106

1 پاسخ

+2 امتیاز
 
بهترین پاسخ

کلاس datasets.ImageFolder را باید به صورت زیر بازنویسی کنید exception مدیریت کنید و برای تصاویری که قابل خواندن نیست یه تصویر سیاه ایجاد کنید تا پروسه خواندن batch به مشکل بر نخوره.

from torchvision import datasets
import torch
from PIL import Image

class CustomImageFolder(datasets.ImageFolder):
    def __init__(self, root, transform=None, target_transform=None,
                 loader=datasets.folder.default_loader, is_valid_file=None):
        super().__init__(root, transform=transform,
                         target_transform=target_transform,
                         loader=loader, is_valid_file=is_valid_file)

    def __getitem__(self, index):
        path, target = self.samples[index]
        try:
            sample = self.loader(path)
            if self.transform is not None:
                sample = self.transform(sample)
            if self.target_transform is not None:
                target = self.target_transform(target)
            return sample, target
        except (PIL.UnidentifiedImageError, OSError) as e:
            print(f"Unable to open image: {path}")
            # Return a black image of the same size as the other images in the dataset
            sample = Image.new("RGB", (224, 224))
            if self.transform is not None:
                sample = self.transform(sample)
            return sample, target

# Use your custom Dataset class
image_datasets = CustomImageFolder(src_path, transform=data_transforms)
dataloaders = torch.utils.data.DataLoader(image_datasets, batch_size=self.batch_size,
                                          shuffle=False, num_workers=4)

 

پاسخ داده شده مرداد 7, 1402 بوسیله ی farshid_siyah (امتیاز 1,463)   3 11 16
انتخاب شد شهریور 8, 1402 بوسیله ی مصطفی ساتکی
...