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