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)
6 Réponses :
Merci votre commentaire! J'ai attrapé une erreur. mais je ne peux pas comprendre cette solution. Pourriez-vous me l'expliquer ?? Merci !
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 ...
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'
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. :)
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 !!
Apparemment, la solution consiste simplement à rendre le nom de l'image alphanumérique. Ils peuvent être une autre solution, mais ce travail.
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.
Comment vos images sont-elles stockées? Vérifiez github.com/pytorch/examples/issues/236#issuecomment-43269725 2