С помощью этого руководства вы проведете классификацию изображений с использованием предобученной модели ResNet18. Вы создадите среду для работы с машинным обучением, загрузите и подготовите изображение, а также выполните инференс модели для получения топ-5 предсказаний.
Вы будете использовать следующие сервисы и библиотеки:
Notebooks — сервис для запуска сред ML и работы DS-специалистов в ноутбуках на платформе Evolution.
torchvision — позволяет использовать предобученные модели, такие как ResNet18, и предоставляет инструменты для преобразования и обработки изображений.
PIL — используется для работы с изображениями в формате PIL, включая их открытие, изменение размера и конвертацию.
requests — позволяет загружать изображения и другие данные с веб-ресурсов по URL.
BytesIO из модуля io — создает файлоподобный объект в памяти для работы с байтовыми данными, как с файлом, что удобно при обработке изображений из потока.
json и urllib.request — библиотеки для загрузки, обработки и сериализации данных, например, при работе с веб-API или метаданными.
Шаги:
Перед началом работы
Если вы уже зарегистрированы, войдите под своей учетной записью.
1. Подготовьте среду
-
Создайте ноутбук на основе образа с поддержкой CUDA.
-
Установите PyTorch и torchvision:
pip install torchpip install torchvisionПодробнее об установке PyTorch на официальном сайте.
-
Проверьте доступность GPU:
import torch# Check GPU availabilitycuda_available = torch.cuda.is_available()print(f"CUDA доступен: {cuda_available}")# If GPU is available, display the number of GPUs and the GPU nameif cuda_available:print(f"Количество доступных GPU: {torch.cuda.device_count()}")print(f"Название GPU: {torch.cuda.get_device_name(0)}")device = torch.device("cuda")else:print("Используется CPU")device = torch.device("cpu") -
Импортируйте библиотеки для работы:
from torchvision import models, transformsfrom PIL import Imageimport requestsfrom io import BytesIOimport jsonimport urllib.request
2. Используйте предобученную модель для инференса
На этом шаге вы будете использовать предобученную модель для инференса, то есть для классификации изображений. Мы загрузим изображение из интернета и обработаем его с помощью модели ResNet18, которая уже обучена на большом наборе данных.
-
Загрузите изображение из интернета:
url = "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSlSaRKDvkuC2_Qyfnt8jMDmZzphQbIrz-TSg&s"response = requests.get(url)img = Image.open(BytesIO(response.content)).convert('RGB')В результате мы получим объект изображения в формате RGB, готовый для дальнейшей обработки и анализа моделью.
-
Загрузите модель ResNet18 и переведите ее в режим инференса:
model = models.resnet18(pretrained=True)model = model.to(device)model.eval()В результате мы загрузили модель, перевели ее в режим инференса и переместили на выбранное устройство GPU, если оно доступно, или CPU. Это необходимо для того, чтобы модель была готова к обработке изображений и выдавала предсказания.
3. Подготовьте изображение и получите топ-5 предсказаний
-
Выполните преобразование изображения для инференса:
preprocess = transforms.Compose([transforms.Resize(256),transforms.CenterCrop(224),transforms.ToTensor()])Перед тем как подавать изображение на вход модели, необходимо преобразовать его в нужный формат. В данном случае мы применили три преобразования: изменение размера изображения до 256 пикселей, центрированный обрез до размера 224x224 пикселей и преобразование в tensor. Это необходимо для того, чтобы изображение соответствовало требованиям модели и могло быть обработано корректно.
-
Загрузите имена классов:
url = "https://raw.githubusercontent.com/pytorch/hub/master/imagenet_classes.txt"urllib.request.urlretrieve(url, "imagenet_classes.txt")with open("imagenet_classes.txt") as f:class_names = [line.strip() for line in f.readlines()]В результате мы загрузили файл с именами классов ImageNet, которые используются в предобученной модели ResNet18. Это нужно для интерпретации результатов работы модели и понимания какие классы она может предсказывать.
-
Подготовьте изображение и выведите топ-5 предсказаний:
# Preprocess the imageinput_tensor = preprocess(img).unsqueeze(0).to(device)# Perform inferencewith torch.no_grad():output = model(input_tensor)# Apply softmax to get probabilitiesprobabilities = torch.nn.functional.softmax(output[0], dim=0)# Get the top-5 predictionstop5_prob, top5_idx = torch.topk(probabilities, 5)# Print the top-5 predictionsprint("Топ-5 предсказаний:")for i in range(top5_prob.size(0)):class_name = class_names[top5_idx[i]]prob = top5_prob[i].item()print(f"{i+1}: {class_name} ({prob:.4f})")В результате мы получили Топ-5 предсказаний:
Топ-5 предсказаний:1: tabby (0.5923)2: tiger cat (0.2160)3: Egyptian cat (0.1611)4: paper towel (0.0057)5: plastic bag (0.0037)
Результат
В ходе практической работы вы подготовили среду для работы с предобученной моделью ResNet18, загрузили и подготовили изображение, а также выполнили инференс модели для получения топ-5 предсказаний. Этот подход позволяет быстро и эффективно классифицировать изображения без необходимости обучения модели с нуля.
Вы можете экспериментировать с разными изображениями и настройками, чтобы лучше понять, как работает модель, и улучшить ее производительность для ваших задач.
- Перед началом работы
- 1. Подготовьте среду
- 2. Используйте предобученную модель для инференса
- 3. Подготовьте изображение и получите топ-5 предсказаний
- Результат