Вам нужно подавать изображения в сеть так же, как на тренировке: то есть вы должны применять точно такие же преобразования, чтобы получить похожие результаты.
Предполагая, что ваша сеть была обучена с использованием этого кода (или аналогичного), вы можете видеть, что входное изображение (для проверки) претерпевает следующие преобразования :
transforms.Compose([
transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
normalize,
])),
После torchvision.transforms
документов вы можете видеть, что входное изображение проходит:
- Изменение размера до 256x256 пикс.
- Обрезка прямоугольника 224x224 от центра изображения
- Изображение преобразуется из типа данных uint8 в число с плавающей точкой в диапазоне
[0, 1]
и переносится в массив 3 на 224 на 224
- Изображение нормализует путем вычитания среднего значения и деления на стандартное значение
Вы можете сделать все это вручную для любого изображения
import numpy as np
from PIL import Image
pil_img = Image.open('image.jpg').resize((256, 256), Image.BILINEAR) # read and resize
# center crop
w, h = pil_img.size
i = int(round((h - 224) / 2.))
j = int(round((w - 224) / 2.))
pil_img = pil_img.crop((j, i, j+224, i+224))
np_img = np.array(pil_img).astype(np.float32) / 255.
np_img = np.transpose(np_img, (2, 0, 1))
# normalize
mean = [0.485, 0.456, 0.406]
std = [0.229, 0.224, 0.225]
for c in range(3):
np_img = (np_img[c, ...] - mean[c]) / std[c]
Как только вы подготовите np_img
для вашей модели, вы можете запустить проход прямой передачи:
pred = model(np_img[None, ...]) # note that we add a singleton leading dim for batch