Есть некоторые проблемы с предварительной обработкой изображения. Во-первых, нормализация рассчитывается как (value - mean) / std)
, а не value * mean + std
. Во-вторых, значения не должны быть обрезаны до [0, 1], нормализация намеренно смещает значения от [0, 1]. Во-вторых, изображение в виде массива NumPy имеет форму [высота, ширина, 3] , когда вы переставляете размеры, вы меняете местами высоту и ширину, создавая тензор с формой [batch_size, каналы , width, height] .
img = resize(image,(224,224,3))
# Normalizing input for vgg16
mean = [0.485, 0.456, 0.406]
std = [0.229, 0.224, 0.225]
img1 = (img1 - mean) / std
img1 = torch.from_numpy(img1).unsqueeze(0)
img1 = img1.permute(0, 3, 1, 2) # batch_size x channels x height x width
Вместо того, чтобы делать это вручную, вы можете использовать torchvision.transforms
.
from torchvision import transforms
preprocess = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])
img = resize(image,(224,224,3))
img1 = preprocess(img)
img1 = img1.unsqueeze(0)
Если вы используете PIL для загрузки изображений вы также можете изменить размер изображений, добавив transforms.Resize((224, 224))
в конвейер предварительной обработки, или вы даже можете добавить transforms.ToPILImage()
, чтобы сначала преобразовать изображение в изображение PIL (transforms.Resize
требуется образ PIL).