- 前提
- A1111にWD14を追加
- エラー1: ImportError: cannot import name 'wrap_gradio_gpu_call' from 'webui'
- エラー2: AttributeError: 'Namespace' object has no attribute 'deepdanbooru_projects_path'
- エラー3: ImportError: cannot import name 'models_path' from partially initialized module 'modules.shared' (most likely due to a circular import)
- 動作確認
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)
エラー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」ってなんで知ってんだ?