Пикселизированное изображение PIL по сравнению с OpenCV

#numpy #opencv #pytorch #python-imaging-library

Вопрос:

Я пытаюсь переключиться с OpenCV на PIL, потому что некоторые библиотеки работают с PIL, и я не хочу продолжать конвертировать изображения туда и обратно. Я упростил свою проблему, чтобы показать, что происходит не так. Я написал сеть, которая принимает координаты пикселей и возвращает значение RGB. Я хочу обновить сеть для создания целевого изображения. Этот процесс, похоже, отлично работает для OpenCV. Смотрите изображение цели и OpenCV ниже.

цель opencv

Сделано со следующим кодом:

 import torch
import numpy as np
from torchvision import transforms
from PIL import Image 
import cv2
from torchvision.transforms import ToTensor

target = cv2.imread("target.png")
target = ToTensor()(target).float().to(device)

epochs = 10000
img = None
for epoch in range(epochs):
    optimiser.zero_grad()
    img = network(visualisation_tensor).reshape(224, 224, 3)

    loss = criterion(img.unsqueeze(0), target.permute(1,2,0).unsqueeze(0).to(device))
    print(loss)
    loss.backward()
    
    optimiser.step()

    if epoch0==0:
        cv2.imwrite("output/{0:06d}.png".format(epoch), img.detach().cpu().numpy()*255)
 

Изображение PIL выглядит сглаженным. Если вы увеличите масштаб, вы увидите, что изображение пиксельное и не имеет типичного вида CPPN.

ПИЛ

Я использовал следующий код для создания изображения PIL.

 target = Image.open("target.png").convert("RGB")
target = ToTensor()(target).float().unsqueeze(0).to(device)


epochs = 10000
for epoch in range(epochs):
    optimiser.zero_grad()
    img = network(visualisation_tensor).reshape(3, 224, 224)

    loss = criterion(img.unsqueeze(0), target)
    loss.backward()
    
    optimiser.step()

    if epoch0==0:

        img = Image.fromarray((img.permute(1,2,0).cpu().detach().numpy()*255.).astype(np.uint8))
        img.save("output/{0:06d}.png".format(epoch))
 

В обоих случаях используется одна и та же небольшая сеть прямой связи и обычный оптимизатор Adam. Тензор визуализации-это тензор со всеми координатами пикселей.
Что я делаю не так? Все эти перестановки и изменения формы сбивают меня с толку

Комментарии:

1. существует несоответствие между версиями «opencv» и «PIL»: в «opencv» вы переставляете «цель», но оставляете прогноз «как есть», в то время как для версии «PIL» вы переставляете прогноз. Можете ли вы сделать код идентичным для двух вариантов и изменить только imread / imwrite методы?