###挨拶
超解像初学者です.読みにくいコードかもしれませんが,よろしくお願いします.
###やりたいこと
SRCNN超解像で学習して保存したモデルを用いて,超解像を複数画像に適応させたい.適応する画像は学習画像に比べると大きいものを想定しています.モデル適応時に画像を学習画像と同じサイズにクロップしてリストに保存し,それを超解像した後に画像を結合して大きな画像を超解像しようとしています.これを画像枚数分繰り返します.
###現状
今回は,33×33の学習画像で学習をしたモデルを用いて,超解像適応プログラムを組んでみました.すると,下記のようなエラーが出てしましました.
調べても解決法がわかりませんでした.
ほかにも,間違っている点を指摘してくださるとありがたいです.
作成したプログラム
import torch import torchvision as tv import torch.nn as nn import numpy as np import os import time import cv2 from natsort import natsorted from PIL import Image from torch.nn.functional import relu from torchsummary import summary #モデル class SRCNN(nn.Module): def __init__(self): super(SRCNN, self).__init__() self.conv1 = nn.Conv2d(in_channels=3, out_channels=64, kernel_size=9, padding=4) self.conv2 = nn.Conv2d(in_channels=64, out_channels=32, kernel_size=1, padding=0) self.conv3 = nn.Conv2d(in_channels=32, out_channels=3, kernel_size=5, padding=2) #モデル全体の記述 def forward(self, INPUT): CONV1 = self.conv1(INPUT) RELU1 = relu(CONV1) CONV2 = self.conv2(RELU1) RELU2 = relu(CONV2) CONV3 = self.conv3(RELU2) return CONV3 def main(): input_dir = r"C:\Users\81703\Super_resolution\test\cal\1" save_dir = r"C:\Users\81703\Super_resolution\test\cal_sr\1" model_dir = r"C:\Users\81703\Super_resolution\SRCNN\dataset\model" train_dir = r"C:\Users\81703\Super_resolution\SRCNN\dataset\train" #モデルの読み込みと適応画像のリスト取得等々 device = torch.device("cuda" if torch.cuda.is_available() else "cpu") model = SRCNN().to(device) model.load_state_dict(torch.load(os.path.join(model_dir,"model_SRCNN.pth"), map_location=device)) sample_img = Image.open(os.path.join(train_dir, "0.png")) summary(model,(3,sample_img.height,sample_img.width)) start = time.time() apply_imgs_list = os.listdir(input_dir) apply_imgs_list = natsorted(apply_imgs_list) model.eval() with torch.no_grad(): for n in apply_imgs_list: #画像の読み込みと名前,拡張子の取得 os.chdir(input_dir) apply_img = Image.open(n).convert("RGB") img_name, img_ext = os.path.splitext(n) print(img_name) #画像サイズとクロップ数の計算部分 numX = apply_img.width // sample_img.width numY = apply_img.height // sample_img.height crop_imgs = [] out_imgs = [] #画像を分割 for i in range(numY): for j in range(numX): input_img = apply_img.crop((sample_img.width * j, sample_img.height*i, sample_img.width * j + sample_img.width, sample_img.height * i + sample_img.height)) input_img_tensor = tv.transforms.ToTensor()(input_img) crop_imgs.append(input_img_tensor) #分割をモデルに適用 for m in crop_imgs: prediction = model(m) out_imgs.append(prediction) #モデルの出力画像を繋げる append_imgs = out_imgs v_img = [] for y in range(numY): u_img = [] for x in range(numX): num = x + y * numX u_img.append(append_imgs[num]) imgU = cv2.hconcat(u_img) v_img.append(imgU) append_img = cv2.vconcat(v_img) append_img = Image.fromarray(np.unit8(append_img)) save_name = str(n) save_name_dir = os.path.join(save_dir, save_name) append_img.save(save_name_dir) end = time.time() - start print(end) print("finish") if __name__ == "__main__": main()
エラー内容
RuntimeError: Expected 4-dimensional input for 4-dimensional weight 64 3 9, but got 3-dimensional input of size [3, 33, 33] instead
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/04/09 15:57 編集