Инструкция
На данной странице я расскажу, как запустить и использовать именно мою нейросеть. Инструменты и библиотеки сами по себе могут быть разные, но я буду говорить только о тех, которые сам использовал.
Для начала работы нужно иметь на компьютере: Python, PyCharm, установленные в PyCharm библиотеки. Список необходимых библиотек: Pytorch, numpy, random, torchvision, PIL, tqdm.
1 шаг: установка необходимых и вспомогательных библиотек в изолированную среду разработки в PyCharm. Устанавливать их можно через консоль командой pip или через настройки, по пути - project:(название проекта)/python interpreter. Установку нужно проводить с использованием VPN, так как из-за санкций пользователи из России не могут скачивать ПО.
2 шаг: нужно перекинуть код нейросети и файл best_model.pth в папку с проектом.
3 шаг: запускаем код, выделяем всю первую часть кода до части с обучением (помечена комментарием), и выполняем её через команду execute selection in python console. Пропускаем часть с обучением (у нас уже есть обученные веса). Эта часть кода представлена снизу.
import torch # Вызов библиотек
import torch.nn as nn
import torchvision.models as models
import torchvision.transforms as transforms
from torchvision.datasets import ImageFolder
from torch.utils.data import DataLoader
import torch.optim as optim
from tqdm import tqdm
import random
import numpy as np
from sklearn.metrics import confusion_matrix, classification_report
import mpld3
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.metrics import f1_score
from PIL import Image
# Установка Seed для воспроизводимости
seed = 42
torch.manual_seed(seed)
torch.cuda.manual_seed(seed)
torch.cuda.manual_seed_all(seed)
np.random.seed(seed)
random.seed(seed)
torch.backends.cudnn.benchmark = False
torch.backends.cudnn.deterministic = True
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
# Загрузим предварительно обученную модель ResNet18
model = models.resnet18(pretrained=True)
# Заменим последний слой (fully connected) так, чтобы количество выходных каналов соответствовало необходимому нам количеству классов, количество классов зависит от выбранной вами нейросети
num_classes = 10
model.fc = nn.Linear(model.fc.in_features, num_classes)
# Определим пути к данным
train_data_dir = 'dataset/train'
val_data_dir = 'dataset/validation'
# Определим трансформации
train_transforms = transforms.Compose([
transforms.Resize(256),
transforms.RandomRotation(10),
transforms.CenterCrop(224),
transforms.RandomHorizontalFlip(0.5), # Добавим вертикальное отражение
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])
val_transforms = transforms.Compose([
transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])
# Создадим датасеты
train_dataset = ImageFolder(train_data_dir, transform=train_transforms)
val_dataset = ImageFolder(val_data_dir, transform=val_transforms)
# Создадим датагенераторы
batch_size = 64
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
val_loader = DataLoader(val_dataset, batch_size=batch_size, shuffle=False)
4 шаг: таким же образом запускаем эту часть кода.
# Загрузим предварительно обученную модель ResNet18
model = models.resnet18()
# Заменим последний слой (fully connected) так, чтобы количество выходных каналов соответствовало 3 классам
num_classes = 10
model.fc = nn.Linear(model.fc.in_features, num_classes)
# Загрузка весов модели
model.load_state_dict(torch.load('best_model.pth'))
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model.to(device)
model.eval()
# Предобработка изображения
preprocess = transforms.Compose([
transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
])
5 шаг: меняем путь к изображению на свой, меняется он в этой строчке - image_path = 'dataset/9.webp'.
Конец! Нейросеть можно использовать, для этого нужно запустить оставшуюся часть кода, а именно:
# Загружаем изображение для инференса
image_path = 'dataset/9.webp' # Замените на путь к вашему изображению
image = Image.open(image_path)
image_tensor = preprocess(image)
image_tensor = image_tensor.unsqueeze(0).to(device) # Добавляем размер батча
# Прогоняем изображение через модель
with torch.no_grad():
output = model(image_tensor)
# Применяем softmax для получения вероятностей классов
probabilities = torch.nn.functional.softmax(output[0], dim=0).cpu()
# Отображение результатов
top_prob, top_class = torch.topk(probabilities, 1)
top_prob = top_prob.item()
top_class = top_class.item()
# Получить имя класса
class_names = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'] # имя классов зависит от выбранной вами нейросети
class_name = class_names[top_class]
# Отобразить изображение
fig, ax = plt.subplots(figsize=(8, 6))
# Отображаем изображение
ax.imshow(image)
ax.axis('off')
ax.set_title(f'Predicted: {class_name} ({top_prob*100:.2f}%)', fontsize=14)
fig.savefig("output_image.png", bbox_inches='tight', pad_inches=0)
print("Изображение сохранено в 'output_image.png'")
Ответ сохраняется в виде изображения в папке с проектом.