質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

0回答

1523閲覧

SwinIRとPythonを使った画像の高解像度化

shiba-ken

総合スコア1

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

1クリップ

投稿2023/01/26 11:52

編集2023/01/31 15:57

前提

プログラミングを始めて半年の初心者です。
実行環境:Python3.8.10 , Google Colaboratory
低解像度の画像をSwinIRとPythonを使って高解像度の画像に変換させようとしています。
ネット(https://tt-tsukumochi.com/archives/4716)
を真似てコードを記述したのですが、
エラーで動きませんでした。SwinIRのことも調べたのですが、
ネット上や書店での情報が少なくて行き詰り、こちらでご相談させていただきました。
皆様のお力を貸していただきたいです。よろしくお願いいたします。

実現したいこと

SwinIRを使って、低解像度の画像をSwinIRとPythonを使って高解像度の画像に変換させたい

発生している問題・エラーメッセージ

エラー内容
File "main_test_swinir.py", line 112, in main if img_gt is not None: UnboundLocalError: local variable 'img_gt' referenced before assignment
>>main_test_swinir.pyファイルのコードが、該当ソースコード欄の長いコードの方です。長いので129行目以降は削除してます。
該当ソースコード欄の短いほうのコードはエラーメッセージの全文です。
122行目のimg_gtが、宣言される前に呼び出されているということがエラーメッセージの意味と思っています。
ですが、ソースコードを見ても同じ関数内(72行目)でその変数が使用されているので
問題ないのではないのかと思い、何が原因でどうすればよいのかがわかりません。

該当のソースコード

Python

1loading model from C:/Users/hirashiba-ju/Desktop/SwinIR-main/003_realSR_BSRGAN_DFOWMFC_s64w8_ 2SwinIR-L_x4_GAN.pth /usr/local/lib/python3.8/dist-packages/torch/functional.py:504: 3 UserWarning: torch.meshgrid: in an upcoming release, it will be required to pass the indexing 4 argument. (Triggered internally at ../aten/src/ATen/native/TensorShape.cpp:3190.) 5return _VF.meshgrid(tensors, **kwargs) # type: ignore[attr-defined] Traceback 6(most recent call last): File "main_test_swinir.py", line 309, in <module> 7 main() **File "main_test_swinir.py", line 112, in main if img_gt is not None: 8 UnboundLocalError: local variable 'img_gt' referenced before assignment** 9 10 11import argparse 12import cv2 13import glob 14import numpy as np 15from collections import OrderedDict 16import os 17import torch 18import requests 19 20from models.network_swinir import SwinIR as net 21from utils import util_calculate_psnr_ssim as util 22 23 24def main(): 25 parser = argparse.ArgumentParser() 26 parser.add_argument('--task', type=str, default='color_dn', help='classical_sr, lightweight_sr, real_sr, ' 27 'gray_dn, color_dn, jpeg_car, color_jpeg_car') 28 parser.add_argument('--scale', type=int, default=1, help='scale factor: 1, 2, 3, 4, 8') # 1 for dn and jpeg car 29 parser.add_argument('--noise', type=int, default=15, help='noise level: 15, 25, 50') 30 parser.add_argument('--jpeg', type=int, default=40, help='scale factor: 10, 20, 30, 40') 31 parser.add_argument('--training_patch_size', type=int, default=128, help='patch size used in training SwinIR. ' 32 'Just used to differentiate two different settings in Table 2 of the paper. ' 33 'Images are NOT tested patch by patch.') 34 parser.add_argument('--large_model', action='store_true', help='use large model, only provided for real image sr') 35 parser.add_argument('--model_path', type=str, 36 default='model_zoo/swinir/001_classicalSR_DIV2K_s48w8_SwinIR-M_x2.pth') 37 parser.add_argument('--folder_lq', type=str, default=None, help='input low-quality test image folder') 38 parser.add_argument('--folder_gt', type=str, default=None, help='input ground-truth test image folder') 39 parser.add_argument('--tile', type=int, default=None, help='Tile size, None for no tile during testing (testing as a whole)') 40 parser.add_argument('--tile_overlap', type=int, default=32, help='Overlapping of different tiles') 41 args = parser.parse_args() 42 43 device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') 44 # set up model 45 if os.path.exists(args.model_path): 46 print(f'loading model from {args.model_path}') 47 else: 48 os.makedirs(os.path.dirname(args.model_path), exist_ok=True) 49 url = 'https://github.com/JingyunLiang/SwinIR/releases/download/v0.0/{}'.format(os.path.basename(args.model_path)) 50 r = requests.get(url, allow_redirects=True) 51 print(f'downloading model {args.model_path}') 52 open(args.model_path, 'wb').write(r.content) 53 54 model = define_model(args) 55 model.eval() 56 model = model.to(device) 57 58 # setup folder and path 59 folder, save_dir, border, window_size = setup(args) 60 os.makedirs(save_dir, exist_ok=True) 61 test_results = OrderedDict() 62 test_results['psnr'] = [] 63 test_results['ssim'] = [] 64 test_results['psnr_y'] = [] 65 test_results['ssim_y'] = [] 66 test_results['psnrb'] = [] 67 test_results['psnrb_y'] = [] 68 psnr, ssim, psnr_y, ssim_y, psnrb, psnrb_y = 0, 0, 0, 0, 0, 0 69 70 for idx, path in enumerate(sorted(glob.glob(os.path.join(folder, '*')))): 71 # read image 72 imgname, img_lq, img_gt = get_image_pair(args, path) # image to HWC-BGR, float32 73 img_lq = np.transpose(img_lq if img_lq.shape[2] == 1 else img_lq[:, :, [2, 1, 0]], (2, 0, 1)) # HCW-BGR to CHW-RGB 74 img_lq = torch.from_numpy(img_lq).float().unsqueeze(0).to(device) # CHW-RGB to NCHW-RGB 75 76 # inference 77 with torch.no_grad(): 78 # pad input image to be a multiple of window_size 79 _, _, h_old, w_old = img_lq.size() 80 h_pad = (h_old // window_size + 1) * window_size - h_old 81 w_pad = (w_old // window_size + 1) * window_size - w_old 82 img_lq = torch.cat([img_lq, torch.flip(img_lq, [2])], 2)[:, :, :h_old + h_pad, :] 83 img_lq = torch.cat([img_lq, torch.flip(img_lq, [3])], 3)[:, :, :, :w_old + w_pad] 84 output = test(img_lq, model, args, window_size) 85 output = output[..., :h_old * args.scale, :w_old * args.scale] 86 87 # save image 88 output = output.data.squeeze().float().cpu().clamp_(0, 1).numpy() 89 if output.ndim == 3: 90 output = np.transpose(output[[2, 1, 0], :, :], (1, 2, 0)) # CHW-RGB to HCW-BGR 91 output = (output * 255.0).round().astype(np.uint8) # float32 to uint8 92 cv2.imwrite(f'{save_dir}/{imgname}_SwinIR.png', output) 93 94 # evaluate psnr/ssim/psnr_b 95 if img_gt is not None: 96 img_gt = (img_gt * 255.0).round().astype(np.uint8) # float32 to uint8 97 img_gt = img_gt[:h_old * args.scale, :w_old * args.scale, ...] # crop gt 98 img_gt = np.squeeze(img_gt) 99 100 psnr = util.calculate_psnr(output, img_gt, crop_border=border) 101 ssim = util.calculate_ssim(output, img_gt, crop_border=border) 102 test_results['psnr'].append(psnr) 103 test_results['ssim'].append(ssim) 104 if img_gt.ndim == 3: # RGB image 105 psnr_y = util.calculate_psnr(output, img_gt, crop_border=border, test_y_channel=True) 106 ssim_y = util.calculate_ssim(output, img_gt, crop_border=border, test_y_channel=True) 107 test_results['psnr_y'].append(psnr_y) 108 test_results['ssim_y'].append(ssim_y) 109 if args.task in ['jpeg_car', 'color_jpeg_car']: 110 psnrb = util.calculate_psnrb(output, img_gt, crop_border=border, test_y_channel=False) 111 test_results['psnrb'].append(psnrb) 112 if args.task in ['color_jpeg_car']: 113 psnrb_y = util.calculate_psnrb(output, img_gt, crop_border=border, test_y_channel=True) 114 test_results['psnrb_y'].append(psnrb_y) 115 print('Testing {:d} {:20s} - PSNR: {:.2f} dB; SSIM: {:.4f}; PSNRB: {:.2f} dB;' 116 'PSNR_Y: {:.2f} dB; SSIM_Y: {:.4f}; PSNRB_Y: {:.2f} dB.'. 117 format(idx, imgname, psnr, ssim, psnrb, psnr_y, ssim_y, psnrb_y)) 118 else: 119 print('Testing {:d} {:20s}'.format(idx, imgname)) 120 121 # summarize psnr/ssim 122 if img_gt is not None: 123 ave_psnr = sum(test_results['psnr']) / len(test_results['psnr']) 124 ave_ssim = sum(test_results['ssim']) / len(test_results['ssim']) 125 print('\n{} \n-- Average PSNR/SSIM(RGB): {:.2f} dB; {:.4f}'.format(save_dir, ave_psnr, ave_ssim)) 126 if img_gt.ndim == 3: 127 ave_psnr_y = sum(test_results['psnr_y']) / len(test_results['psnr_y']) 128 ave_ssim_y = sum(test_results['ssim_y']) / len(test_results['ssim_y']) 129 print('-- Average PSNR_Y/SSIM_Y: {:.2f} dB; {:.4f}'.format(ave_psnr_y, ave_ssim_y)) 130 if args.task in ['jpeg_car', 'color_jpeg_car']: 131 ave_psnrb = sum(test_results['psnrb']) / len(test_results['psnrb']) 132 print('-- Average PSNRB: {:.2f} dB'.format(ave_psnrb)) 133 if args.task in ['color_jpeg_car']: 134 ave_psnrb_y = sum(test_results['psnrb_y']) / len(test_results['psnrb_y']) 135 print('-- Average PSNRB_Y: {:.2f} dB'.format(ave_psnrb_y)) 136

試したこと

ネット、書籍を探しましたがSwinIRに関する情報が少なく解決できていません。

補足情報(FW/ツールのバージョンなど)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shiba-ken

2023/01/26 11:57

投稿者です。 エラーは112行目でなく、115行目の img_gt です。誤記でした、すみません。 65行目にimg_gtを使っているので115行目で呼び出しても問題ないのでは?と悩んでいます。 よろしくお願いいたします
PondVillege

2023/01/26 12:01

ここに追記するのではなく,質問自体を編集していただけると見やすくなります.検討の程お願いします.また,序盤のリンクの扱いも少し不具合があるようです.
melian

2023/01/26 12:01

質問はいつでも編集可能です。質問文を訂正する方がよいでしょう。
shiba-ken

2023/01/26 12:04

ありがとうございます。修正いたします。
jbpb0

2023/01/27 00:02

> 該当ソースコード欄の短いほうのコードはエラーメッセージの全文です。 がありません
shiba-ken

2023/01/27 02:20

ありがとうございます 1行目がエラーメッセージ全文になります。
jbpb0

2023/01/27 03:44 編集

> 1行目がエラーメッセージ全文 かなり長い行ですが、実際の表示もこのように一つの行なのでしょうか? もしそうなら、「UserWarning:」なのでエラーでは無いと思うのですが (本当は複数行で表示されてるのを一つの行につなげたのなら話は変わってきますが、行が長いので行の後ろの方は見てません)
shiba-ken

2023/01/27 06:02

すみません、複数行を1行にしてしまったと思います。Google colaboratoryでは複数行のエラーコードだったのを丸ごとコピペしたらこのようになりました。私のスマホで見ると複数行で見えていたのですが、後ほど修正しておきます。
jbpb0

2023/01/30 07:03

まだ > 後ほど修正しておきます。 がされてませんが、長ーーーい行を最後まで見たら、最後に > エラー内容 File "main_test_swinir.py", line 112, in main if img_gt is not None: UnboundLocalError: local variable 'img_gt' referenced before assignment がありました > 同じ関数内(65行目)でその変数が使用されている 質問のコードの「# read image」のすぐ上か下に(インデントを合わせて)下記を追加して実行したら、何て表示されますでしょうか? print("idx: " + str(idx) + ", path: " + str(path))
shiba-ken

2023/01/31 15:59

jbpb0様 ご検討いただきありがとうございます。返事が遅くなりすみません。 投稿修正しました。コードは明日トライしてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問