https://qweme.dev
-
Автор темы
- #1
О чем гайд?
В этом руководстве я покажу вам, как создать датасет, обучить нейросеть на его основе и классифицировать изображения.
Что может классификация изображений?
Классификация изображений - это процесс, при котором нейросеть определяет, к какой категории относится данное изображение. В данном посте я буду анализировать качество ремонта квартир на основе фотографий.
Часть 1. Создание датасета изображений
Что такое датасет?
Датасет представляет собой набор изображений, связанных с какой-либо темой. Например, если у нас есть модель, различающая кошек и собак, то датасет будет содержать 1000 изображений кошек и 1000 изображений собак.
В данном случае мы собираем изображения плохих и хороших квартир, загружая их в соответствующие папки:
Я создал небольшой датасет из 500 изображений на каждую категорию (для более точных результатов рекомендуется собрать более обширный датасет).
Часть 2. Обучение на основе готовой нейросети
Начнем с загрузки датасета из папки:
Для обучения нейросети нужно разделить датасет на тренировочный и валидационный наборы. В данном случае 80% изображений используются для обучения, а остальные 20% для проверки качества обучения.
Затем определяем соответствие между метками и индексами:
Далее загружаем готовую нейросеть для классификации изображений, например, google/vit-base-patch16-224
Теперь создадим преобразования изображений, необходимые для обучения:
Этот код изменяет случайным образом размер и область изображения, затем превращает его в формат, понимаемый компьютером, и, делает яркость изображения более равномерной, чтобы подготовить его для использования в нейронных сетях.
Применим преобразования к изображениям в датасете:
Этот код определяет функцию transforms, которая применяет ранее созданный набор трансформаций _transforms к каждому изображению в наборе данных. Каждое изображение преобразуется в формат RGB (если он ещё не в таком формате), затем проходит через последовательность трансформаций для обрезки, преобразования в тензор и нормализации. Полученные тензоры исходных значений пикселей заменяют изображения в исходном наборе данных. После этого исходные изображения удаляются из набора данных, и обновленный набор данных сохраняется в переменной dataset.
Загрузим необходимые компоненты для обучения:
Мы создаем data_collator и подгружаем модель оценки нашей нейросети
Определим функцию вычисления метрик:
Этот код определяет функцию compute_metrics, которая используется для вычисления метрик оценки модели. Входными данными для этой функции является кортеж eval_pred, который содержит предсказания модели (predictions) и соответствующие метки (labels). Функция сначала преобразует предсказания модели в индексы классов с наибольшими значениями вероятности с помощью функции np.argmax(). Затем она вызывает какую функцию accuracy.compute(), передавая в неё предсказанные индексы классов и реальные метки. Эта функция вычисляет и возвращает значение точности модели на основе предсказаний и меток.
Загрузим модель классификации изображений и подготовим её к обучению:
Перенесем модель на GPU:
Подготовим аргументы для обучения:
output_dir:
Путь к каталогу, в который будут сохраняться файлы и результаты обучения модели.
remove_unused_columns:
Определяет, будут ли удалены неиспользуемые колонки из входных данных во время обучения.
evaluation_strategy:
Стратегия оценки модели, определяющая, когда выполнять процесс оценки на проверочных данных. Здесь установлено на "epoch", что означает выполнение оценки по завершении каждой эпохи обучения.
save_strategy:
Стратегия сохранения модели. Здесь установлено на "epoch", что означает сохранение модели по завершении каждой эпохи обучения.
learning_rate:
Скорость обучения (learning rate) - величина, определяющая, как быстро модель будет адаптироваться к данным.
per_device_train_batch_size:
Количество образцов (примеров) в пакете, которое будет использоваться для обучения на каждом устройстве.
gradient_accumulation_steps:
Количество шагов накопления градиентов перед выполнением обратного распространения ошибки. Это позволяет использовать более крупные пакеты для обучения при ограниченных ресурсах памяти.
per_device_eval_batch_size:
Количество образцов в пакете, используемом для оценки на каждом устройстве.
num_train_epochs:
Количество эпох обучения - сколько раз модель будет проходить через весь набор данных.
warmup_ratio:
Процент эпох, в течение которых будет выполняться "разогрев" (warm-up) оптимизатора перед тем, как начнется изменение скорости обучения.
logging_steps:
Через сколько шагов обучения производить вывод информации о процессе обучения и метриках.
load_best_model_at_end:
Определяет, будет ли лучшая модель автоматически загружена после завершения обучения.
metric_for_best_model:
Метрика, по которой будет выбрана лучшая модель для сохранения.
Запустим процесс обучения:
Часть 3. Оценка результатов
Для оценки результатов, используем следующий код:
Протестируем модель на конкретном изображении:
В этом руководстве я покажу вам, как создать датасет, обучить нейросеть на его основе и классифицировать изображения.
Что может классификация изображений?
Классификация изображений - это процесс, при котором нейросеть определяет, к какой категории относится данное изображение. В данном посте я буду анализировать качество ремонта квартир на основе фотографий.
Часть 1. Создание датасета изображений
Что такое датасет?
Датасет представляет собой набор изображений, связанных с какой-либо темой. Например, если у нас есть модель, различающая кошек и собак, то датасет будет содержать 1000 изображений кошек и 1000 изображений собак.
В данном случае мы собираем изображения плохих и хороших квартир, загружая их в соответствующие папки:
Код:
dataset
bad -
img1.jpg
img2.jpg
img3.jpg
...
good -
img1.jpg
img2.jpg
img3.jpg
...
Часть 2. Обучение на основе готовой нейросети
Начнем с загрузки датасета из папки:
Python:
from datasets import load_dataset
dataset = load_dataset("imagefolder", data_dir="./dataset", split="train")
dataset = dataset.train_test_split(test_size=0.2)
Затем определяем соответствие между метками и индексами:
Python:
label2id = {
"bad": 0,
"good": 1
}
id2label = {
0: "bad",
1: "good"
}
Python:
from transformers import AutoImageProcessor
checkpoint = "google/vit-base-patch16-224"
image_processor = AutoImageProcessor.from_pretrained(checkpoint)
Python:
from torchvision.transforms import RandomResizedCrop, Compose, Normalize, ToTensor
normalize = Normalize(mean=image_processor.image_mean, std=image_processor.image_std)
# Это нормализующая трансформация. Она выполняет нормализацию значений пикселей изображения. Нормализация в данном контексте означает приведение значений пикселей к определенному диапазону с использованием средних значений и стандартных отклонений.
size = (
image_processor.size["shortest_edge"]
if "shortest_edge" in image_processor.size
else (image_processor.size["height"], image_processor.size["width"])
)
_transforms = Compose([RandomResizedCrop(size), ToTensor(), normalize])
# ToTensor()
# Преобразует входное изображение в формат тензора PyTorch. Тензоры PyTorch - это многомерные массивы, которые могут быть использованы для обработки данных нейронными сетями.
Применим преобразования к изображениям в датасете:
Python:
def transforms(examples):
examples["pixel_values"] = [_transforms(img.convert("RGB")) for img in examples["image"]]
del examples["image"]
return examples
dataset = dataset.with_transform(transforms)
Загрузим необходимые компоненты для обучения:
Python:
import evaluate
from transformers import DefaultDataCollator
data_collator = DefaultDataCollator()
accuracy = evaluate.load("accuracy")
Определим функцию вычисления метрик:
Python:
import numpy as np
def compute_metrics(eval_pred):
predictions, labels = eval_pred
predictions = np.argmax(predictions, axis=1)
return accuracy.compute(predictions=predictions, references=labels)
Загрузим модель классификации изображений и подготовим её к обучению:
Python:
from transformers import AutoModelForImageClassification
model = AutoModelForImageClassification.from_pretrained(
checkpoint,
ignore_mismatched_sizes=True,
num_labels=2,
id2label=id2label,
label2id=label2id,
)
Python:
model.to("cuda")
Python:
from transformers import TrainingArguments, Trainer
training_args = TrainingArguments(
output_dir="flat-qweme-ai",
remove_unused_columns=False,
evaluation_strategy="epoch",
save_strategy="epoch",
learning_rate=5e-5,
per_device_train_batch_size=16,
gradient_accumulation_steps=4,
per_device_eval_batch_size=16,
num_train_epochs=5,
warmup_ratio=0.1,
logging_steps=10,
load_best_model_at_end=True,
metric_for_best_model="accuracy",
push_to_hub=False,
)
Путь к каталогу, в который будут сохраняться файлы и результаты обучения модели.
remove_unused_columns:
Определяет, будут ли удалены неиспользуемые колонки из входных данных во время обучения.
evaluation_strategy:
Стратегия оценки модели, определяющая, когда выполнять процесс оценки на проверочных данных. Здесь установлено на "epoch", что означает выполнение оценки по завершении каждой эпохи обучения.
save_strategy:
Стратегия сохранения модели. Здесь установлено на "epoch", что означает сохранение модели по завершении каждой эпохи обучения.
learning_rate:
Скорость обучения (learning rate) - величина, определяющая, как быстро модель будет адаптироваться к данным.
per_device_train_batch_size:
Количество образцов (примеров) в пакете, которое будет использоваться для обучения на каждом устройстве.
gradient_accumulation_steps:
Количество шагов накопления градиентов перед выполнением обратного распространения ошибки. Это позволяет использовать более крупные пакеты для обучения при ограниченных ресурсах памяти.
per_device_eval_batch_size:
Количество образцов в пакете, используемом для оценки на каждом устройстве.
num_train_epochs:
Количество эпох обучения - сколько раз модель будет проходить через весь набор данных.
warmup_ratio:
Процент эпох, в течение которых будет выполняться "разогрев" (warm-up) оптимизатора перед тем, как начнется изменение скорости обучения.
logging_steps:
Через сколько шагов обучения производить вывод информации о процессе обучения и метриках.
load_best_model_at_end:
Определяет, будет ли лучшая модель автоматически загружена после завершения обучения.
metric_for_best_model:
Метрика, по которой будет выбрана лучшая модель для сохранения.
Запустим процесс обучения:
Python:
trainer = Trainer(
model=model,
args=training_args,
data_collator=data_collator,
train_dataset=dataset["train"],
eval_dataset=dataset["test"],
tokenizer=image_processor,
compute_metrics=compute_metrics,
)
trainer.train()
Часть 3. Оценка результатов
Для оценки результатов, используем следующий код:
Python:
from PIL import Image
from transformers import pipeline
pipe = pipeline("image-classification", model="flat-qweme-ai")
Python:
result = pipe(Image.open("test.jpg"))
print("Results:", result)