NoneType object is not iterableが発生したときの対処法

トラブルシューティング

Stable DiffusionでNoneType object is not iterable

Stable DiffusionのWebUIで画像生成していると急に発生するエラー‘NoneType’ object is not iterable

Generate中急に生成画像処理が停止して画面には↓のエラーが表示されます。

TypeError: 'NoneType' object is not iterable
Stable Diffusion WebUIで「'NoneType' object is not iterable」が発生した状態

このエラーはStable Diffusion固有のものではなくPythonで発生しているエラーでパッと見なぜエラーになったのか分かりづらいですよね。

Stable Diffusionでこのエラーが発生する理由は複数あるので、それぞれ解決策も含めて紹介します。

ただ、一部Githubのissueで議論されているもので有効な解決策が見つかっていないものもあります。

バージョンが最新かどうかは確認しましょう

AUTOMATIC1111やForgeなどのUI自体が古いと最新版では修正されているバグが発生するかもしれないので、なるべく最新版にしておきましょう!

ただし、最新版にすることで新しいバグが発生する可能性もなくはないので、自己判断の元アップデートしてくださいね!

原因1: 画像の保存先のドライブに空き容量が無い

それではここからはエラーが発生するパターンと対策方法を紹介します。

まず1つ目ですが、単純に画像保存先のドライブの容量がいっぱいの時に'NoneType' object is not iterableが発生します。

「'NoneType' object is not iterable」の原因1: 容量がいっぱい

Stable Diffusionはモデルやら生成画像やらであっという間に空き容量食っていきます!

いっぱいになった時にちょっとずつ容量をあけてだましだましやっていると度々発生して毎回焦ります。

モデルなり生成画像を整理して容量をあけましょう。保存先を別のドライブにしてしまうのもよいかもしれません。

解決策

Stable Diffusion WebUIをインストールしているフォルダのドライブの容量をあけましょう!

原因2: image to imageで元画像を指定し忘れている

こちらも割と単純なエラーです。

img2imgでは元画像を指定して使うものですが、元画像に何も指定しないままgenerateボタンクリックすると'NoneType' object is not iterableになります。

「'NoneType' object is not iterable」の原因2: i2iで画像指定していない

解決策

img2imgでは元画像を指定してからgenerateしましょう!

プロンプトだけで画像生成する場合はtxt2imgタブからやりましょう。

原因3: 存在しないファイルを読み込もうとしている

あまり無いケースかも知れませんがX/Y/Z plotでCheckpoint nameなど、何かしらファイルを読み込む必要がある機能を使用し、存在していない(ついさっき削除した様な)ファイルを指定している場合、画像生成時に'NoneType' object is not iterableが発生します。

「'NoneType' object is not iterable」の原因3: 削除済みファイル読み込み

モデルファイルを削除した後、リロードボタンを押さずにモデルを選択した場合、うっかり選択してしまうこともあるかもしれません。

X/Y/Z plotを使うつもりがなくても前回生成時にONにしたのが残ったままという可能性もあるので、念の為確認してみてください!

解決策

存在しないファイル(モデル、LoRA、プリプロセッサ等)を読み込んでいないか確認してみてください。

ぱっと見は読み込む設定になっていなくても、X/Y/Z plotあたりが有効になっていていてそこから読み込んでいる可能性もあります。

原因4: ControlNetのプリプロセッサとモデルが対応していない

ControlNetを使用する際、Preprocessor(プリプロセッサ)とControlNet用のModelを指定しますが、選択したControlNet用のモデルに対して対応していないプリプロセッサを指定するとNoneType object is not iterableが発生します。

私の場合、ControlNetのモデルとプリプロセッサーをテキトーにし、更にAnimateDiffを使用したら'NoneType' object is not iterableが発生しました。

「'NoneType' object is not iterable」の原因4: ControlNetのプリプロセッサとモデル未対応

その後プリプロセッサーとモデルを合わせたら無事生成出来るようになりました。

ControlNetはControl typeを選択すれば対応するプリプロセッサーとモデルだけが表示されるようになるので、Control Typeは設定したほうがよさそうです。

ControlNetでプリプロセッサとモデルをフィルタする

解決策

ControlNetのプリプロセッサとモデルをControl Typeに対応したもので統一する。

その他の原因(issueで議論されている未解決の内容)

ここから先紹介しているものは、WebUIやControlNetのissueを確認しても解決した様子が無いものが含まれています。

現状解決策が無いものもあると思うので、アップデートで解消されることに期待するか、別の設定で回避できないか試してみるしかなさそうです。

SDXLでControlNetを使用している

こちらはForgeのissueで言及されていた内容です。

環境や設定によってはSDXLのモデルでControlNetを使用すると必ずこのエラーになることがあるようです。

私の環境でもいくつかのControlTypeで試してみましたが発生しませんでした。

ControlNetのIP-AdapterでAnimateDiffを使用している

こちらもForgeのissueで報告されていました。

ControlNetのIP-AdapterとAnimateDiffを同時に使用すると'NoneType' object is not iterableが発生する可能性があるようです。

発生した場合、UIを再起動すると同じ設定でも無事生成完了することもあるようです。

私の環境では発生しませんでした。

まとめ

このエラーは原因がわかりにくいので、突然発生すると焦りますよね。

ここで挙げた原因以外でも発生しうるパターンは色々ありそうです。

ControlNetやらAnimateDiffやら色々詰め込んで生成しようとした時に起こりがちな印象です。

ものによってはWebUIのいちユーザーにとっては避けようのないバグの可能性があります。

そういう場合は自力でなんとかするのは難しいので、アップデートで修正されるのを待つか、なんとかバグを回避する方法を探すしかなさそうです。

同じ様に困ってる人の参考になれるとうれしいです!

コメント

タイトルとURLをコピーしました