#numpy #opencv #pytorch #python-imaging-library
Вопрос:
Я пытаюсь переключиться с OpenCV на PIL, потому что некоторые библиотеки работают с PIL, и я не хочу продолжать конвертировать изображения туда и обратно. Я упростил свою проблему, чтобы показать, что происходит не так. Я написал сеть, которая принимает координаты пикселей и возвращает значение RGB. Я хочу обновить сеть для создания целевого изображения. Этот процесс, похоже, отлично работает для 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
методы?