Skip to content
Snippets Groups Projects
Commit 8b257b3e authored by Alexandre MEYER's avatar Alexandre MEYER
Browse files

Update file TP_Classification.md

parent 4b165709
No related branches found
No related tags found
No related merge requests found
Pipeline #137781 passed
...@@ -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/) ).
* [Plutôt vulgarisation](https://medium.com/@CharlesCrouspeyrecomment-les-r%C3%A9seaux-de-neurones-%C3%A0-convolution-fonctionnent-b288519dbcf8])
* [Explication intuitive](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).
![Image alt](../images/convnet.png) ![Image alt](../images/convnet.png)
## 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
transforms.Normalize(mean=[0., 0., 0.], transforms.Normalize(mean=[0., 0., 0.],
std=[0.5, 0.5, 0.5] ) std=[0.5, 0.5, 0.5] )
]) ])
mydata = ImageFolder(root="../data/shapes5_preprocessed", transform=TRANSFORM_IMG) mydata = ImageFolder(root="../data/shapes5_preprocessed", transform=transform_img)
loader = DataLoader(mydata, batch_size=32, shuffle=True, num_workers=2) loader = DataLoader(mydata, batch_size=32, shuffle=True, num_workers=1)
``` ```
...@@ -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.
[https://pytorch.org/tutorials/beginner/blitz/cifar10_tutorial.html](Regardez ici).
## Conclusion
Il est intéressant de voir que chaque couche de convolutions devient de plus en plus spécifiques à l'objet : Il est intéressant de voir que chaque couche de convolutions devient de plus en plus spécifiques à l'objet :
![Image alt](../images/dl_cnn_progression.png) ![Image alt](../images/dl_cnn_progression.png)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment