Почему билинейное масштабирование изображений с помощью PIL и pytorch дает разные результаты?Python

Программы на Python
Ответить
Anonymous
 Почему билинейное масштабирование изображений с помощью PIL и pytorch дает разные результаты?

Сообщение Anonymous »

Чтобы передать изображение в сеть pytorch, мне сначала нужно уменьшить его масштаб до некоторого фиксированного размера. Сначала я сделал это с помощью метода PIL.Image.resize() с режимом интерполяции, установленным на BILINEAR. Тогда я подумал, что было бы удобнее сначала преобразовать пакет изображений в тензор pytorch, а затем использовать функцию torch.nn.functional.interpolate() для одновременного масштабирования всего тензора на графическом процессоре (также «билинейный» режим интерполяции) . Это привело к снижению точности модели, поскольку теперь при выводе тип масштабирования (факел) отличался от того, который использовался при обучении (PIL). После этого я визуально сравнил два метода уменьшения масштаба и обнаружил, что они дают разные результаты. Уменьшение размера подушки кажется более плавным. Выполняют ли эти методы внутри себя разные операции, хотя оба они билинейны? Если да, то мне также интересно, есть ли способ добиться того же результата, что и масштабирование изображения подушки с масштабированием тензора факела?

Исходное изображение (известное изображение Ленны)

Изображение в масштабе подушки:

Изображение


Изображение в масштабе:

Изображение


Средний канал карта абсолютной разницы:

Изображение
< /p>

Демо код:

import numpy as np
from PIL import Image
import torch
import torch.nn.functional as F
from torchvision import transforms
import matplotlib.pyplot as plt

pil_to_torch = transforms.ToTensor()
res_shape = (128, 128)

pil_img = Image.open('Lenna.png')
torch_img = pil_to_torch(pil_img)

pil_image_scaled = pil_img.resize(res_shape, Image.BILINEAR)
torch_img_scaled = F.interpolate(torch_img.unsqueeze(0), res_shape, mode='bilinear').squeeze(0)

pil_image_scaled_on_torch = pil_to_torch(pil_image_scaled)
relative_diff = torch.abs((pil_image_scaled_on_torch - torch_img_scaled) / pil_image_scaled_on_torch).mean().item()
print('relative pixel diff:', relative_diff)

pil_image_scaled_numpy = pil_image_scaled_on_torch.cpu().numpy().transpose([1, 2, 0])
torch_img_scaled_numpy = torch_img_scaled.cpu().numpy().transpose([1, 2, 0])
plt.imsave('pil_scaled.png', pil_image_scaled_numpy)
plt.imsave('torch_scaled.png', torch_img_scaled_numpy)
plt.imsave('mean_diff.png', np.abs(pil_image_scaled_numpy - torch_img_scaled_numpy).mean(-1))


Python 3.6.6, требования:

cycler==0.10.0
kiwisolver==1.1.0
matplotlib==3.2.1
numpy==1.18.2
Pillow==7.0.0
pyparsing==2.4.6
python-dateutil==2.8.1
six==1.14.0
torch==1.4.0
torchvision==0.5.0


Подробнее здесь: https://stackoverflow.com/questions/609 ... nt-results
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»