@@ -158,13 +158,15 @@ Pour ce 2e problème un peu plus concret, nous disposons d'images et nous voudri
...
@@ -158,13 +158,15 @@ Pour ce 2e problème un peu plus concret, nous disposons d'images et nous voudri
exemple, pour reconnaitre le nombre à partir de l'image du nombre écrit ou reconnaitre la figure géométrique à partir d'un dessin, ou plus largement reconnaitre une famille d'objets (chat, voiture, avion, fourchette, etc.).
exemple, pour reconnaitre le nombre à partir de l'image du nombre écrit ou reconnaitre la figure géométrique à partir d'un dessin, ou plus largement reconnaitre une famille d'objets (chat, voiture, avion, fourchette, etc.).
Pour ce type de tâche, le réseau approprié est le ConvNET ou CNN : Convolution Neural Network. Vous pouvez lire des explications sur ce qu'est un CNN :
Pour ce type de tâche, le réseau approprié est le ConvNET ou CNN : Convolution Neural Network. Vous pouvez lire des explications sur ce qu'est un CNN dans le cours ou éventuellement sur internet (par exemple une [explication intuitive ici](https://ujjwalkarn.me/2016/08/11/intuitive-explanation-convnets/) ).
Pour du code avec pytorch, [https://pytorch.org/tutorials/beginner/blitz/cifar10_tutorial.html](regardez ici).


## Les données
Pour ce TP, nous vous invitons à utiliser [une base de données d'images issue d'un projet de L3 qui cherche à reconnaitre 5 formes dessinés](https://github.com/ucacaxm/DeepLearning_Vision_SimpleExamples/blob/master/data/shapes5_preprocessed.zip) : carré, cercle, triangle, sablier, étoile. Il y a que quelques centaines d'images par forme, c'est un bon challenge de voir ce que la reconnaissance donne avec finalement assez peu d'images. Il est également intéressant d'augmenter les données. Dans le cas d'images comme ici, vous pouvez faire de petites rotations aléatoires aux images pour en augmenter le nombre.
Pour ce TP, nous vous invitons à utiliser [une base de données d'images issue d'un projet de L3 qui cherche à reconnaitre 5 formes dessinés](https://github.com/ucacaxm/DeepLearning_Vision_SimpleExamples/blob/master/data/shapes5_preprocessed.zip) : carré, cercle, triangle, sablier, étoile. Il y a que quelques centaines d'images par forme, c'est un bon challenge de voir ce que la reconnaissance donne avec finalement assez peu d'images. Il est également intéressant d'augmenter les données. Dans le cas d'images comme ici, vous pouvez faire de petites rotations aléatoires aux images pour en augmenter le nombre.
...
@@ -176,7 +178,7 @@ Il est également possible d'utiliser différentes base de données plus classiq
...
@@ -176,7 +178,7 @@ Il est également possible d'utiliser différentes base de données plus classiq
Un exemple de code qui charge une base d'images, voir également la doc de [imagefolder](https://pytorch.org/docs/stable/torchvision/datasets.html#imagefolder) et de [DataLoader](https://pytorch.org/docs/stable/data.html#) :
Un exemple de code qui charge une base d'images, voir également la doc de [DataLoader](https://pytorch.org/docs/stable/data.html#) :
```
```
from torchvision import datasets, transforms
from torchvision import datasets, transforms
from torch.autograd import Variable
from torch.autograd import Variable
...
@@ -187,7 +189,7 @@ Un exemple de code qui charge une base d'images, voir également la doc de [imag
...
@@ -187,7 +189,7 @@ Un exemple de code qui charge une base d'images, voir également la doc de [imag
from torch.utils.data.sampler import SubsetRandomSampler
from torch.utils.data.sampler import SubsetRandomSampler
class MyTransform(object): # Votre propre fonction de transfo d'images utilisée en preprocessing
class MyTransform(object): # Votre propre fonction de transfo d'images utilisée en preprocessing (si besoin)
def __call__(self, x):
def __call__(self, x):
y = preprocess(x)
y = preprocess(x)
return y
return y
...
@@ -204,7 +206,7 @@ Un exemple de code qui charge une base d'images, voir également la doc de [imag
...
@@ -204,7 +206,7 @@ Un exemple de code qui charge une base d'images, voir également la doc de [imag
TRANSFORM_IMG = transforms.Compose([
transform_img = transforms.Compose([
MyTransform(), # Votre propre fonction de transfo d'images utilisée en preprocessing
MyTransform(), # Votre propre fonction de transfo d'images utilisée en preprocessing
transforms.Resize(16),
transforms.Resize(16),
#transforms.CenterCrop(256),
#transforms.CenterCrop(256),
...
@@ -212,8 +214,8 @@ Un exemple de code qui charge une base d'images, voir également la doc de [imag
...
@@ -212,8 +214,8 @@ Un exemple de code qui charge une base d'images, voir également la doc de [imag
@@ -221,6 +223,36 @@ Un exemple de code qui charge une base d'images, voir également la doc de [imag
...
@@ -221,6 +223,36 @@ Un exemple de code qui charge une base d'images, voir également la doc de [imag
*[Un très bon tutoriel sur le chargement de données avec PyTorch](https://github.com/ncullen93/torchsample/blob/master/examples/Transforms%20with%20Pytorch%20and%20Torchsample.ipynb)
*[Un très bon tutoriel sur le chargement de données avec PyTorch](https://github.com/ncullen93/torchsample/blob/master/examples/Transforms%20with%20Pytorch%20and%20Torchsample.ipynb)
## Le réseau
Le code d'un réseau ressemble à ceci
```
class Classifier(nn.Module):
def __init__(self):
super(Discriminator, self).__init__()
nc = 3 # 3 channels RGB
self.model = nn.Sequential(
nn.Conv2d(nc, ndf, 4, 2, 1, bias=False),
nn.LeakyReLU(0.2, inplace=True),
nn.Conv2d(ndf, ndf * 2, 4, 2, 1, bias=False),
nn.BatchNorm2d(ndf * 2),
nn.LeakyReLU(0.2, inplace=True),
... # a completer
nn.Conv2d(ndf * 8, 1, 4, 1, 0, bias=False),
nn.Sigmoid()
).to( torch.float32)
print(self.model)
def forward(self, input):
return self.model(input)
```
## L'entrainement
De manière assez similaire au classifier de nuages de point plus haut, il faut entrainer le réseau en déclarant également le DataLoader.