image_classification.md 6.77 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
<!--Copyright 2022 The HuggingFace Team. All rights reserved.

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
specific language governing permissions and limitations under the License.
11
12
13
14

鈿狅笍 Note that this file is in Markdown but contain specific syntax for our doc-builder (similar to MDX) that may not be
rendered properly in your Markdown viewer.

15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
-->

# Clasificaci贸n de im谩genes

<Youtube id="tjAIM7BOYhw"/>

La clasificaci贸n de im谩genes asigna una etiqueta o clase a una imagen. A diferencia de la clasificaci贸n de texto o audio, las entradas son los valores de los p铆xeles que representan una imagen. La clasificaci贸n de im谩genes tiene muchos usos, como la detecci贸n de da帽os tras una cat谩strofe, el control de la salud de los cultivos o la b煤squeda de signos de enfermedad en im谩genes m茅dicas.

Esta gu铆a te mostrar谩 como hacer fine-tune al [ViT](https://huggingface.co/docs/transformers/v4.16.2/en/model_doc/vit) en el dataset [Food-101](https://huggingface.co/datasets/food101) para clasificar un alimento en una imagen.

<Tip>

Consulta la [p谩gina de la tarea](https://huggingface.co/tasks/audio-classification) de clasificaci贸n de im谩genes para obtener m谩s informaci贸n sobre sus modelos, datasets y m茅tricas asociadas.

</Tip>

## Carga el dataset Food-101

Carga solo las primeras 5000 im谩genes del dataset Food-101 de la biblioteca 馃 de Datasets ya que es bastante grande:

```py
>>> from datasets import load_dataset

>>> food = load_dataset("food101", split="train[:5000]")
```

Divide el dataset en un train y un test set:

```py
>>> food = food.train_test_split(test_size=0.2)
```

A continuaci贸n, observa un ejemplo:

```py
>>> food["train"][0]
{'image': <PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=512x512 at 0x7F52AFC8AC50>,
 'label': 79}
```

El campo `image` contiene una imagen PIL, y cada `label` es un n煤mero entero que representa una clase. Crea un diccionario que asigne un nombre de label a un entero y viceversa. El mapeo ayudar谩 al modelo a recuperar el nombre de label a partir del n煤mero de la misma:

```py
>>> labels = food["train"].features["label"].names
>>> label2id, id2label = dict(), dict()
>>> for i, label in enumerate(labels):
...     label2id[label] = str(i)
...     id2label[str(i)] = label
```

Ahora puedes convertir el n煤mero de label en un nombre de label para obtener m谩s informaci贸n:

```py
>>> id2label[str(79)]
'prime_rib'
```

Cada clase de alimento - o label - corresponde a un n煤mero; `79` indica una costilla de primera en el ejemplo anterior.

## Preprocesa

76
Carga el image processor de ViT para procesar la imagen en un tensor:
77
78

```py
79
>>> from transformers import AutoImageProcessor
80

81
>>> image_processor = AutoImageProcessor.from_pretrained("google/vit-base-patch16-224-in21k")
82
83
84
85
86
87
88
```

Aplica varias transformaciones de imagen al dataset para hacer el modelo m谩s robusto contra el overfitting. En este caso se utilizar谩 el m贸dulo [`transforms`](https://pytorch.org/vision/stable/transforms.html) de torchvision. Recorta una parte aleatoria de la imagen, cambia su tama帽o y normal铆zala con la media y la desviaci贸n est谩ndar de la imagen:

```py
>>> from torchvision.transforms import RandomResizedCrop, Compose, Normalize, ToTensor

89
90
>>> normalize = Normalize(mean=image_processor.image_mean, std=image_processor.image_std)
>>> _transforms = Compose([RandomResizedCrop(image_processor.size["height"]), ToTensor(), normalize])
91
92
93
94
95
96
97
98
99
100
101
```

Crea una funci贸n de preprocesamiento que aplique las transformaciones y devuelva los `pixel_values` - los inputs al modelo - de la imagen:

```py
>>> def transforms(examples):
...     examples["pixel_values"] = [_transforms(img.convert("RGB")) for img in examples["image"]]
...     del examples["image"]
...     return examples
```

102
Utiliza el m茅todo [`with_transform`](https://huggingface.co/docs/datasets/package_reference/main_classes?#datasets.Dataset.with_transform) de 馃 Dataset para aplicar las transformaciones sobre todo el dataset. Las transformaciones se aplican sobre la marcha cuando se carga un elemento del dataset:
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145

```py
>>> food = food.with_transform(transforms)
```

Utiliza [`DefaultDataCollator`] para crear un batch de ejemplos. A diferencia de otros data collators en 馃 Transformers, el DefaultDataCollator no aplica un preprocesamiento adicional como el padding.

```py
>>> from transformers import DefaultDataCollator

>>> data_collator = DefaultDataCollator()
```

## Entrena
Carga ViT con [`AutoModelForImageClassification`]. Especifica el n煤mero de labels, y pasa al modelo el mapping entre el n煤mero de label y la clase de label:

```py
>>> from transformers import AutoModelForImageClassification, TrainingArguments, Trainer

>>> model = AutoModelForImageClassification.from_pretrained(
...     "google/vit-base-patch16-224-in21k",
...     num_labels=len(labels),
...     id2label=id2label,
...     label2id=label2id,
... )
```

<Tip>

Si no est谩s familiarizado con el fine-tuning de un modelo con el [`Trainer`], echa un vistazo al tutorial b谩sico [aqu铆](../training#finetune-with-trainer)!

</Tip>

Al llegar a este punto, solo quedan tres pasos:

1. Define tus hiperpar谩metros de entrenamiento en [`TrainingArguments`]. Es importante que no elimines las columnas que no se utilicen, ya que esto har谩 que desaparezca la columna `image`. Sin la columna `image` no puedes crear `pixel_values`. Establece `remove_unused_columns=False` para evitar este comportamiento.
2. Pasa los training arguments al [`Trainer`] junto con el modelo, los datasets, tokenizer y data collator.
3. Llama [`~Trainer.train`] para hacer fine-tune de tu modelo.

```py
>>> training_args = TrainingArguments(
...     output_dir="./results",
...     per_device_train_batch_size=16,
146
...     eval_strategy="steps",
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
...     num_train_epochs=4,
...     fp16=True,
...     save_steps=100,
...     eval_steps=100,
...     logging_steps=10,
...     learning_rate=2e-4,
...     save_total_limit=2,
...     remove_unused_columns=False,
... )

>>> trainer = Trainer(
...     model=model,
...     args=training_args,
...     data_collator=data_collator,
...     train_dataset=food["train"],
...     eval_dataset=food["test"],
NielsRogge's avatar
NielsRogge committed
163
...     tokenizer=image_processor,
164
165
166
167
168
169
170
171
172
173
... )

>>> trainer.train()
```

<Tip>

Para ver un ejemplo m谩s a profundidad de c贸mo hacer fine-tune a un modelo para clasificaci贸n de im谩genes, echa un vistazo al correspondiente [PyTorch notebook](https://colab.research.google.com/github/huggingface/notebooks/blob/main/examples/image_classification.ipynb).

</Tip>