PythonとReal-ESRGANで画像を明瞭化するプログラムを試作していた際にハマった[例外が発生しました: RuntimeError Error(s) in loading state_dict for RRDBNet: Missing key(s) in state_dict:]の対処法を備忘録的に投稿しておきます。
画像を高解像度化する
chatGPT が提案してくれたサンプルコードが、こんな感じ。今回は一般的な画像に対応したモデルファイル(RealESRGAN_x2plus.pth の場合です)
より高スケールな RealESRGAN_x4plus.pth の場合は別記事をご覧ください
import torch
from realesrgan import RealESRGANer
from basicsr.archs.rrdbnet_arch import RRDBNet
pth_path = 'RealESRGAN_x2plus.pth'
model = RRDBNet(
num_in_ch=3,
num_out_ch=3,
num_feat=64,
num_block=23,
num_grow_ch=32,
scale=2
)
upsampler = RealESRGANer(
scale=2,
model_path=pth_path,
model=model,
tile=0,
half=True
)
...
実行すると例外が発生します。
例外が発生しました: RuntimeError Error(s) in loading state_dict for RRDBNet: Missing key(s) in state_dict: ...
どうやら、[RealESRGAN_x2plus.pth]ファイルに格納されている型が一致しない模様。
その後も、chatGPTに質問を続けてみましたが最新の[RealESRGAN_x4plus.pth]をダウンロードするか、別の[.pth]ファイルにするという提案の繰り返しでした。
自己解決
色々、調べてみて自己解決できました。
model で設定するpsampler で設定する “half=False” を変更すると例外を回避できました。
import torch
from realesrgan import RealESRGANer
from basicsr.archs.rrdbnet_arch import RRDBNet
pth_path = 'RealESRGAN_x4plus.pth'
model = RRDBNet(
num_in_ch=3,
num_out_ch=3,
num_feat=64,
num_block=23,
num_grow_ch=32,
scale=2
)
upsampler = RealESRGANer(
scale=4,
model_path=pth_path,
model=model,
tile=0,
half=False
)
[half]オプションは False にすると、単精度(float32) で実行されます。
half=True の方が、メモリ消費や計算速度などメリットがあるようですが、エラーで前に進まないよりマシです。
まとめ
今回は短い記事ですが、PythonとReal-ESRGANを実行する際に[例外が発生しました: RuntimeError Error(s) in loading state_dict for RRDBNet: Missing key(s) in state_dict:]の対処法について書きました。
[RealESRGAN_x2plus.pth]を利用する場合はupsampler で設定する “half=False” を変更すると例外を回避できました。
chatGPTに提案されたサンプルコードを試していて、どうしてもエラー回避が出来なかった部分が自己解決できたので備忘録ように記録しておきます。
RealESRGANerで[Missing key(s) in state_dict]が発生する方の参考になれば幸いです。
スポンサーリンク
最後までご覧いただき、ありがとうございます。
