9
votes

"RuntimeError: 0 fichiers trouvés dans les sous-dossiers de" .. Erreur sur le sous-dossier dans Pytorch

Je suis basé sur Windows 10, Jupyter Notebook, Pytorch 1.0, Python 3.6.x actuellement.

Dans un premier temps, je confirme le chemin correct des fichiers en utilisant ce code: print (os.listdir (' ./Dataset/images/')).

et j'ai pu vérifier que ce chemin est correct.

mais j'ai rencontré Erreur :

RuntimeError: 0 fichier trouvé dans les sous-dossiers de: ./Dataset/images/ Les extensions prises en charge sont: .jpg, .jpeg, .png, .ppm, .bmp, .pgm, .tif "

Quel est le problème? Pouvez-vous suggérer une solution?

J'ai essayé de ./dataset/1/images comme cette méthode. mais le résultat était le même ....

img_dir = './Dataset/images/'
img_data = torchvision.datasets.ImageFolder(os.path.join(img_dir), transforms.Compose([
            transforms.Scale(256),
            transforms.RandomResizedCrop(224),
            transforms.RandomHorizontalFlip(),
            transforms.ToTensor(),
            ]))
img_batch = data.DataLoader(img_data, batch_size=batch_size,
                               shuffle = True, drop_last=True)


1 commentaires

Comment vos images sont-elles stockées? Vérifiez github.com/pytorch/examples/issues/236#issuecomment-43269725‌ 2


6 Réponses :



5
votes

Pouvez-vous publier la structure de vos fichiers? Dans votre cas, il est censé être:

img_dir
|_class1
  |_a.jpg
  |_b.jpg
|_class2
  |_a.jpg
  |_b.jpg
...


2 commentaires

Ouais. Complètement vrai ! Je recherche d'autres documents, puis j'ai trouvé la même conclusion que votre commentaire :) Pytorch ImageFolder s'attend à une classe de fichiers! Merci pour votre commentaire !!


contre-voté - fait face au même problème mais nous avons eu des classes de fichiers 'test' et 'train'



1
votes

Selon les règles du DataLoader dans pytorch, vous devez choisir le chemin supérieur du chemin de l'image. Cela signifie que si vos images se trouvent dans './Dataset/images/' , le chemin du chargeur de données doit être './Dataset' à la place. J'espère que cela pourra corriger votre bogue. :)


0 commentaires

10
votes

J'ai rencontré le même problème lors de l'utilisation de celebA, avec 200 000 images. Comme on peut le voir, il y a de nombreuses images. Mais dans un petit exemple de situation (j'ai essayé 20 images), j'ai vérifié, l'erreur ne sera pas soulevée, ce qui signifie que nous pouvons lire les images avec succès. Mais lorsque le nombre augmente, nous devrions utiliser d'autres méthodes.

J'ai résolu le problème grâce à ce site Web. Merci à QimingChen Solution Github

Simplement, ajouter un autre dossier nommé 1 (/ train / ---> train / 1 /) dans le dossier d'origine permettra à notre programme de fonctionner, sans changer le chemin. En effet, face à de grands ensembles de données, les images doivent être triées dans des sous-dossiers de différentes classes.

La réponse originale sur Github:

Disons que je vais utiliser ImageFolder (" / train / ") pour lire les fichiers jpg dans le train de dossiers. La structure du fichier est /train/ - 1.jpg - 2.jpg - 3.jpg

Je n'ai pas réussi à les charger, ce qui a entraîné des erreurs: RuntimeError: 0 image trouvée dans les sous-dossiers de: ./data Les extensions d'image prises en charge sont: .jpg, .JPG, .jpeg, .JPEG, .png, .PNG, .ppm, .PPM, .bmp, .BMP

J'ai lu la solution ci-dessus et essayé des dizaines de fois. Quand j'ai changé la structure en /train/1/

- 1.jpg - 2.jpg - 3.jpg

Mais la lecture du code est toujours - ImageFolder ("/ train /"), ÇA MARCHE.

Il semble que le programme ait tendance à lire récursivement dans les fichiers, ce qui est pratique dans certains cas.

J'espère que cela vous aidera !!


0 commentaires

0
votes

Apparemment, la solution consiste simplement à rendre le nom de l'image alphanumérique. Ils peuvent être une autre solution, mais ce travail.


0 commentaires

0
votes

Vous pouvez modifier la classe ImageFolder pour accéder directement au dossier racine (sans sous-dossiers):

def make_dataset(dir):
    import os
    images = []
    d = os.path.expanduser(dir)

    if not os.path.exists(dir):
        print('path does not exist')

    for root, _, fnames in sorted(os.walk(d)):
        for fname in sorted(fnames):
            path = os.path.join(root, fname)
            images.append(path)
    return images    

Nous appelons la méthode make_dataset pour collecter nos fichiers:

class ImageFolder(Dataset):
    def __init__(self, root, transform=None):
        #Call make_dataset to collect files. 
        self.samples = make_dataset(opt.dataroot)
        self.imgs = self.samples
        self.transformA = transformA

        ...

Toute l'action se déroule dans la boucle contenant os.walk. Ici, les fichiers sont collectés à partir du répertoire 'root', que nous spécifions comme répertoire contenant nos fichiers.


0 commentaires