回心誌

日々是回心

Stable Diffusion Web UI(AUTOMATIC1111)にWD14を導入する際のエラーとその対処法


Stable Diffusion Web UI(AUTOMATIC1111)にWD14Taggerを導入しようとしたけど、不具合が多くて面倒くさい思いをした。

前提

A1111(Stable Diffusion Web UI)の以下のものを使用。
11/4に更新されたバージョン。コミットハッシュ値 4afaaf8a020c1df457bcf7250cb1c7f609699fa7
https://github.com/AUTOMATIC1111/stable-diffusion-webui/tree/4afaaf8a020c1df457bcf7250cb1c7f609699fa7

WD14はこれ。最終更新7月17日。
https://github.com/toriato/stable-diffusion-webui-wd14-tagger/tree/99bf7d8132cb757edbcdfaad654f31f32f3500a5

A1111にWD14を追加

WD14をA1111に追加しようとした。
A1111のExtentionsのInstall from URLで「https://github.com/toriato/stable-diffusion-webui-wd14-tagger」と指定。

エラー1: ImportError: cannot import name 'wrap_gradio_gpu_call' from 'webui'

起動を試みたところ、コマンドプロンプト側でエラーが表示されていた。

*** Error loading script: tagger.py
    Traceback (most recent call last):
      File "D:\Program\stable-diffusion-webui\modules\scripts.py", line 382, in load_scripts
        script_module = script_loading.load_module(scriptfile.path)
                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "D:\Program\stable-diffusion-webui\modules\script_loading.py", line 10, in load_module
        module_spec.loader.exec_module(module)
      File "<frozen importlib._bootstrap_external>", line 940, in exec_module
      File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
      File "D:\Program\stable-diffusion-webui\extensions\stable-diffusion-webui-wd14-tagger\scripts\tagger.py", line 5, in <module>
        from tagger.ui import on_ui_tabs
      File "D:\Program\stable-diffusion-webui\extensions\stable-diffusion-webui-wd14-tagger\tagger\ui.py", line 10, in <module>
        from webui import wrap_gradio_gpu_call
    ImportError: cannot import name 'wrap_gradio_gpu_call' from 'webui' (D:\Program\stable-diffusion-webui\webui.py)
対処法

ここに対処法の記載あり。
qiita.com

修正ファイル
{パス}\stable-diffusion-webui\extensions\stable-diffusion-webui-wd14-tagger\tagger\ui.py
修正内容
from webui import wrap_gradio_gpu_call

from modules.call_queue import wrap_gradio_gpu_call

考察

おそらくだけど、A1111側のコードの変更にTaggerのコードが追随できていないのが原因。
wrap_gradio_gpu_callという関数の位置がどこかのバージョンで変わったのだろう。

コードを追いかけるとmodules\call_queue.pyにwrap_gradio_gpu_callが定義されていることがわかる。
したがって、前述のとおり修正すればいいと確認できる。

エラー2: AttributeError: 'Namespace' object has no attribute 'deepdanbooru_projects_path'

とりあえず上のエラーについて修正し、もう1度やってみたら、以下のエラー。

*** Error executing callback ui_tabs_callback for D:\Program\stable-diffusion-webui\extensions\stable-diffusion-webui-wd14-tagger\scripts\tagger.py
    Traceback (most recent call last):
      File "D:\Program\stable-diffusion-webui\modules\script_callbacks.py", line 166, in ui_tabs_callback
        res += c.callback() or []
               ^^^^^^^^^^^^
      File "D:\Program\stable-diffusion-webui\extensions\stable-diffusion-webui-wd14-tagger\tagger\ui.py", line 329, in on_ui_tabs
        interrogator_names = utils.refresh_interrogators()
                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "D:\Program\stable-diffusion-webui\extensions\stable-diffusion-webui-wd14-tagger\tagger\utils.py", line 70, in refresh_interrogators
        for path in os.scandir(shared.cmd_opts.deepdanbooru_projects_path):
                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    AttributeError: 'Namespace' object has no attribute 'deepdanbooru_projects_path'
対処法

{パス}\stable-diffusion-webui\extensions\stable-diffusion-webui-wd14-tagger\tagger\utils.pyを開き、
70行目あたりの
for path in os.scandir(shared.cmd_opts.deepdanbooru_projects_path):
を下のように変更した。
for path in os.scandir(getattr(shared.cmd_opts, 'deepdanbooru_projects_path', default_ddp_path)):

ググったら、こういう解決策もあった。
素敵な画像からプロンプトを組み立てよう!【HowTo】|BD

今回、Taggerをインストールしようとすると、
「AttributeError: 'Namespace' object has no attribute 'deepdanbooru_projects_path'」

というエラーが出ました。エラー解消方法をネットで調べ、

"automatic\extensions\stable-diffusion-webui-wd14-tagger\tagger\utils.py"

の65行目コメント直下に以下を追加することで解決しました。

    • -

deepdanbooru_projects_path = "models/torch_deepdanbooru"
shared.cmd_opts.deepdanbooru_projects_path = deepdanbooru_projects_path

    • -

まあこれでも解消はされるだろうけど、引数でDeepDanbooruのパスを指定できなくなるのでちょっと微妙。

考察

そもそもDeepDanboorというアニメ調の画像にタグ付けする拡張機能があって、WD14はDeepDanbooruを使用している。
この点はWD14のREADMEにも明記がある。
https://github.com/toriato/stable-diffusion-webui-wd14-tagger/blob/99bf7d8132cb757edbcdfaad654f31f32f3500a5/README.md

Disclaimer
I didn't make any models, and most of the code was heavily borrowed from the DeepDanbooru and MrSmillingWolf's tagger.

エラー箇所のコードはDeepDanbooruで使用するフォルダを設定するためのものっぽい。
古いバージョンのA1111にはDeepDanbooruが含まれていたようだが、あるバージョン以降は含まれていないようになって、WD14を利用する際自動でインストールするようになっているっぽい。
WD14のinterrogator.pyにこんなコメントがある。

        # deepdanbooru package is not include in web-sd anymore
        # https://github.com/AUTOMATIC1111/stable-diffusion-webui/commit/c81d440d876dfd2ab3560410f37442ef56fc663

で、DeepDanboorを自動インストールの際のフォルダ設定のコードにバグがあり、古いA1111から継続して使用する場合には発生しないエラーが混入してたんじゃないかと思われる。

エラー報告が2023/5ですでにされているのを見るに、このバグはA1111に比べてWD14が古いせいで発生するものではなく、最終リリースである7月時点ですでに混入していたようだ。

エラー3: ImportError: cannot import name 'models_path' from partially initialized module 'modules.shared' (most likely due to a circular import)

で、エラー2を修正して実行したら、またエラー。

*** Error running preload() for D:\Program\stable-diffusion-webui\extensions\stable-diffusion-webui-wd14-tagger\preload.py
    Traceback (most recent call last):
      File "D:\Program\stable-diffusion-webui\modules\script_loading.py", line 26, in preload_extensions
        module = load_module(preload_script)
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "D:\Program\stable-diffusion-webui\modules\script_loading.py", line 10, in load_module
        module_spec.loader.exec_module(module)
      File "<frozen importlib._bootstrap_external>", line 940, in exec_module
      File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
      File "D:\Program\stable-diffusion-webui\extensions\stable-diffusion-webui-wd14-tagger\preload.py", line 4, in <module>
        from modules.shared import models_path
    ImportError: cannot import name 'models_path' from partially initialized module 'modules.shared' (most likely due to a circular import) (D:\Program\stable-diffusion-webui\modules\shared.py)

循環参照してエラーしてるという記述。

対処法

結論から言うと、stable-diffusion-webui\extensions\stable-diffusion-webui-wd14-tagger\preload.pyの冒頭の
from modules.shared import models_path

from modules.paths_internal import models_path
に修正した。

考察

循環参照ってどういうことかというと、トレース見る限り、script_loadingからなんやかんやあってpreload.pyが呼ばれてる。
で、各コードのfrom hoge import fugaってところを見ると、script_loadingはshared_cmd_optionから呼ばれてて、さらにshared_cmd_optionはsharedから呼ばれてる。
さらに prealoadのコード内でsharedを呼んでいる。
で、結局下のような参照関係になってて、

shared -> shared_cmd_option -> script_loading -> preaload -> shared

循環参照になってるっぽい。


なんか楽に解決する方法無いかなーと思ってああこうだやってたけど、preloadがsharedからインポートしているmodels_pathだが、これって実はpaths_internalにあるものをshared経由でインポートしている。
だから直接paths_internalからインポートしちゃえば済むってわけ。

これでようやくエラー無く起動できた。

動作確認


1girl, solo, animal ears, fangs, heart hands, red hair, virtual youtuber, heart, smile, multicolored hair, white background, looking at viewer, blue eyes, simple background, ahoge, choker, :d, bangs, open mouth, animal ear fluff, bow, ribbon, twintails, cat ears, blush, hair ornament, hair ribbon, upper body, red bow, streaked hair, white hair, portrait, frills, hands up, heart hair ornament

なんとなくできてそうだけど、「virtual youtuber」ってなんで知ってんだ?