Le guide ultime sur la classification d’images multiclasses à l’aide de Pytorch
Se transforme:
1. Prétraitement Imagenet
Afin d’utiliser nos images avec un réseau formé sur le jeu de données Imagenet, nous devons prétraiter nos images de la même manière que le réseau Imagenet. Pour cela, nous devons redimensionner les images à 224 × 224 et les normaliser selon les normes Imagenet. Nous pouvons utiliser la torche transforms
bibliothèque pour le faire. Ici, nous prenons un CenterCrop
de 224 × 224 et normaliser selon les normes Imagenet. Les opérations définies ci-dessous se déroulent séquentiellement. Vous pouvez trouver une liste de toutes les transformations fournies par PyTorch ici.
transforms.Compose([
transforms.CenterCrop(size=224),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406],
[0.229, 0.224, 0.225])
])
2. Augmentations de données
Nous pouvons faire beaucoup plus de prétraitement pour les augmentations de données. Les réseaux de neurones fonctionnent mieux avec beaucoup de données. Augmentation des données est une stratégie que nous utilisons au moment de la formation pour augmenter la quantité de données dont nous disposons.
Par exemple, nous pouvons retourner l’image d’un bateau horizontalement, et ce sera toujours un bateau. Ou nous pouvons recadrer des images au hasard ou ajouter des tremblements de couleur. Voici le dictionnaire de transformations d’images que j’ai utilisé qui s’applique à la fois au prétraitement Imagenet et aux augmentations. Ce dictionnaire contient les différentes transformations que nous avons pour les données de train, de test et de validation utilisées dans ce grand article. Comme vous vous en doutez, nous n’appliquons pas les retournements horizontaux ou autres transformations d’augmentation de données aux données de test et aux données de validation, car nous ne voulons pas obtenir de prédictions sur une image augmentée.
# Image transformations
image_transforms = {
# Train uses data augmentation
'train':
transforms.Compose([
transforms.RandomResizedCrop(size=256, scale=(0.8, 1.0)),
transforms.RandomRotation(degrees=15),
transforms.ColorJitter(),
transforms.RandomHorizontalFlip(),
transforms.CenterCrop(size=224), # Image net standards
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406],
[0.229, 0.224, 0.225]) # Imagenet standards
]),
# Validation does not use augmentation
'valid':
transforms.Compose([
transforms.Resize(size=256),
transforms.CenterCrop(size=224),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
]),# Test does not use augmentation
'test':
transforms.Compose([
transforms.Resize(size=256),
transforms.CenterCrop(size=224),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
]),
}
Voici un exemple des transformations de train appliquées à une image dans le jeu de données de formation. Non seulement nous obtenons beaucoup d’images différentes à partir d’une seule image, mais cela aide également notre réseau à devenir invariant à l’orientation de l’objet.
ex_img = Image.open('/home/rahul/projects/compvisblog/data/train/cruise ship/cruise-ship-oasis-of-the-seas-boat-water-482183.jpg')t = image_transforms['train']
plt.figure(figsize=(24, 24))for i in range(16):
ax = plt.subplot(4, 4, i + 1)
_ = imshow_tensor(t(ex_img), ax=ax)plt.tight_layout()
DataLoaders
L’étape suivante consiste à fournir la formation, la validation et les emplacements des jeux de données de test à PyTorch. Nous pouvons le faire en utilisant le PyTorch datasets
et DataLoader
classe. Cette partie du code restera essentiellement la même si nous avons nos données dans les structures de répertoires requises.
# Datasets from folderstraindir = "data/train"
validdir = "data/val"
testdir = "data/test"data = {
'train':
datasets.ImageFolder(root=traindir, transform=image_transforms['train']),
'valid':
datasets.ImageFolder(root=validdir, transform=image_transforms['valid']),
'test':
datasets.ImageFolder(root=testdir, transform=image_transforms['test'])
}# Dataloader iterators, make sure to shuffle
dataloaders = {
'train': DataLoader(data['train'], batch_size=batch_size, shuffle=True,num_workers=10),
'val': DataLoader(data['valid'], batch_size=batch_size, shuffle=True,num_workers=10),
'test': DataLoader(data['test'], batch_size=batch_size, shuffle=True,num_workers=10)
}
Ces chargeurs de données nous aident à parcourir le jeu de données. Par exemple, nous utiliserons le chargeur de données ci-dessous dans notre formation sur le modèle. La variable de données contiendra des données sous la forme (batch_size, color_channels, height, width)
tandis que la cible est en forme (batch_size)
et tenez les informations d’étiquette.
train_loader = dataloaders['train']
for ii, (data, target) in enumerate(train_loader):