{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "provenance": [], "gpuType": "T4", "include_colab_link": true }, "kernelspec": { "name": "python3", "display_name": "Python 3" }, "language_info": { "name": "python" }, "accelerator": "GPU" }, "cells": [ { "cell_type": "markdown", "metadata": { "id": "view-in-github", "colab_type": "text" }, "source": [ "\"Open" ] }, { "cell_type": "markdown", "source": [ "![](https://i.imgur.com/WaGbhNe.png)\n", "\n", "\n", "----\n", "- とにかく試したいなら「ランタイム」メニューで「すべてのセルを実行」を選び、2の下部の「**約5分かかります**」に進んでください。\n", "- 無料ユーザの場合、GPUが割り当てられないことがあります。「**GPUバックエンドに接続できません**」と表示された場合は、GPUが使えません。その場合、制限はありますが、CPUだけで動作するようにしてあります。\n", "- CPUだけの場合、相当時間がかかります(体感で10倍ぐらい)。メモリも不足するため、速度重視で質を落とす設定となっております。本来の画像品質は得られなことをご承知ください。\n", "----\n", "# Foooocus + MM LoRA\n", "\n", "lllyasvielさんの作られた [Fooocus Fooocus](https://github.com/lllyasviel/Fooocus) に\n", "\n", "- 日本語メニューのリソース\n", "- 画家 [渡辺美香子さんの色鉛筆画](https://www.facebook.com/mikakostudio/)風LoRA のプリセット (絵の例は[こちら](https://wgarts.stores.jp/))\n", "- [Fooocus_Extensions_AlekPet](https://github.com/AlekPet/Fooocus_Extensions_AlekPet)\n", "\n", "を加えて起動できるようにした Google Colaboratory のノート(pythonプログラム)を作りました。 \n", "日本語化しての起動については、[Fooocus 日本語アニメ特化版 j.aicu.ai/FoooC](https://j.aicu.ai/FoooC)を参考にさせてもらっています。\n", "さらに、[Fooocus_Extensions_AlekPet](https://github.com/AlekPet/)のプロンプト翻訳機能も使えるようにしてあります。\n", "\n", "\n", "## 変更点\n", "1. pygit2==1.12.2 →1.15.1\n", "2. アニメ用のモデルを、animaPencilXL_v310.safetensors から animagine-xl-3.0.safetensors に変更\n", "3. MM(Mikako Method)のプリセットを追加\n", "4. 日本語化リソースの強化\n", "5. CPU Only対応 (ただし10倍ほど時間がかかるので実用性は低い)\n", "\n", "# 1.画像出力フォルダの設定\n", "\n", "- 出力画像をGoogle Driveに残すことができます。 \n", "残したい場合は下のセルで「Google Driveに保存」にチェックを入れ、パスをセットしてください。\n", "> - /content/gdrive/MyDrive/がGoogle Drive 直下を意味します。 \n", "> - ローカルなストレージ(例えばCドライブ)は指定できません。 \n", "> - 出力画像をGoogle ドライブに残す場合は、アクセスを許可を求めるダイアログが開きますので、許可し「Googleドライブに接続」を完了してください。\n", "- Google Driveに残さない場合でも、セッションが生きている間は画像を参照可能です。「高度な設定」にチェックを入れ、Setting タブの一番下のHistory Logからアクセスできます。\n", "\n", "### 参考\n", "- 生成画像は1枚2MB前後、約500枚で1GB\n", "- Google ドライブの無料ユーザーの容量は15 GB\n", "\n", "\n", "### ↓実行してください\n" ], "metadata": { "id": "xwciD8nyDILt" } }, { "cell_type": "code", "source": [ "# GPU のチェック\n", "import torch\n", "# Check for GPU availability\n", "GPU_ready = torch.cuda.is_available()\n", "if GPU_ready:\n", " print(\"GPU が使えます\")\n", "else:\n", " print(\"GPU が割り当てられていないため CPUのみで実行します\")\n", " print(\"非常に時間がかかりますがご了承ください\")\n", "\n", "# @markdown #保存フォルダの選択\n", "from google.colab import drive\n", "import os\n", "\n", "# オプションの設定\n", "\n", "Googleドライブに保存 = False # @param {type:\"boolean\"}\n", "\n", "if Googleドライブに保存:\n", " # Google Driveをマウント\n", " drive.mount('/content/gdrive')\n", " 保存フォルダ = \"/content/gdrive/MyDrive/Fooocus-outputs\" # @param {type:\"string\"}\n", "\n", "target_local_dir = \"/content/Fooocus/outputs\"\n", "\n", "%cd /content\n", "try:\n", " setup_finished\n", "except NameError:\n", " # 必要なパッケージのインストール\n", " !pip -qq install pygit2==1.15.1\n", " !pip -qq install torchsde==0.2.6\n", " !rm -fr Fooocus\n", " !git clone https://github.com/lllyasviel/Fooocus.git\n", "\n", " if Googleドライブに保存:\n", " # シンボリックリンクの作成\n", " if os.path.exists(保存フォルダ ):\n", " if os.path.islink(保存フォルダ ):\n", " os.unlink(保存フォルダ )\n", " os.symlink(保存フォルダ,target_local_dir)\n", " else:\n", " # Google 出力ディレクトリを作成\n", " os.makedirs(target_local_dir, exist_ok=True)\n", "\n", "# 日本語パッチを追加\n", "ja_json_url = \"https://raw.githubusercontent.com/aquapathos/FooocusJAni/refs/heads/main/ja.json\"\n", "ja_json_path = \"/content/Fooocus/language/ja.json\"\n", "os.makedirs(os.path.dirname(ja_json_path), exist_ok=True)\n", "!curl -L -o {ja_json_path} {ja_json_url}\n", "print(f\"ja.json downloaded and saved to {ja_json_path}\")\n", "\n", "setup_finished = True" ], "metadata": { "id": "L6hh5BedZ0VJ", "cellView": "form" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "\n", "## 2.ウェブアプリの起動\n", "\n", "#### モデルタイプ: 次の3つから選んでください\n", "- デフォルト : Fooocus のデフォルト設定\n", "- アニメ: アニメ画生成\n", "- MM:Mikako Methodの風景画生成\n", "\n", "モデルのダウンロードに少し時間がかかります。しばらくお待ちください。\n", "\n", "### 日本語メニュー,翻訳機能の利用の有無,モデルタイプを選び↓実行してください" ], "metadata": { "id": "smqqaM5UI9zo" } }, { "cell_type": "code", "source": [ "%cd /content/Fooocus\n", "\n", "# オプションの設定\n", "日本語メニュー = True # @param {type:\"boolean\"}\n", "翻訳機能 = True # @param {type:\"boolean\"}\n", "モデルタイプ = \"MM\" # @param [\"デフォルト\", \"アニメ\",\"MM\"] {allow-input: true}\n", "\n", "# MM用のプリセットを追加\n", "mm_json_url = \"mm_preset.json\" if GPU_ready else \"mm_cpu_preset.json\"\n", "mm_json_url = f\"https://raw.githubusercontent.com/aquapathos/FooocusJAni/refs/heads/main/{mm_json_url}\"\n", "mm_json_path = \"/content/Fooocus/presets/mm_preset.json\"\n", "os.makedirs(os.path.dirname(mm_json_path), exist_ok=True)\n", "!curl -L -o {mm_json_path} {mm_json_url}\n", "print(f\"mm_preset.json downloaded and saved to {mm_json_path}\")\n", "\n", "# アニメ版の設定ファイルのパッチ(最新版)を追加\n", "anime_json_url = \"anime.json\" if GPU_ready else \"anime_cpu.json\"\n", "anime_json_url = f\"https://raw.githubusercontent.com/aquapathos/FooocusJAni/refs/heads/main/{anime_json_url}\"\n", "anime_json_path = \"/content/Fooocus/presets/anime.json\"\n", "os.makedirs(os.path.dirname(anime_json_path), exist_ok=True)\n", "!curl -L -o {anime_json_path} {anime_json_url}\n", "print(f\"anime.json downloaded and saved to {anime_json_path}\")\n", "\n", "if 翻訳機能:\n", " !git clone https://github.com/AlekPet/Fooocus_Extensions_AlekPet.git\n", " !mv Fooocus_Extensions_AlekPet/prompt_translate/webui.py .\n", " !mv Fooocus_Extensions_AlekPet/prompt_translate/modules/* ./modules\n", " !sed -i.bak \"s/label='Enable translate', value=False/label='Enable translate', value=True/\" modules/module_translate.py\n", " !sed -i.bak 's/\"default_prompt\": \"[^\"]*\"/\"default_prompt\": \"湖に映る逆さ絵の風景、人はいない、小さな田舎の家が建っている、家の前には赤いレトロな車、手前には色とりどりのコスモス畑\"/' presets/mm_preset.json\n", " if not GPU_ready:\n", " !sed -i.bak 's/\"default_prompt\": \"[^\"]*\"/\"default_prompt\": \"湖に映る逆さ絵の風景、人はいない、小さな田舎の家が建っている、家の前には赤いレトロな車、手前には色とりどりのコスモス畑\"/' presets/mm_cpu_preset.json\n", " # !sed -i.bak 's/HYPER_SD = 4/HYPER_SD = 3/' modules/flags.py\n", " !sed -i.bak 's/1664\\*576/832\\*576/' modules/flags.py\n", "\n", "if GPU_ready:\n", " # GPUが使える場合\n", " if モデルタイプ == \"デフォルト\" and not 日本語メニュー:\n", " !python entry_with_update.py --always-high-vram --output-path {target_local_dir} --share\n", " elif モデルタイプ == \"デフォルト\" and 日本語メニュー :\n", " !python entry_with_update.py --always-high-vram --output-path {target_local_dir} --share --language ja\n", " elif モデルタイプ == \"アニメ\" and not 日本語メニュー:\n", " !python entry_with_update.py --preset anime --always-high-vram --output-path {target_local_dir} --share\n", " elif モデルタイプ == \"アニメ\" and 日本語メニュー:\n", " !python entry_with_update.py --preset anime --always-high-vram --output-path {target_local_dir} --share --language ja\n", " elif モデルタイプ == \"MM\" and not 日本語メニュー:\n", " !python entry_with_update.py --preset mm_preset --always-high-vram --output-path {target_local_dir} --share\n", " elif モデルタイプ == \"MM\" and 日本語メニュー:\n", " !python entry_with_update.py --preset mm_preset --always-high-vram --output-path {target_local_dir} --share --language ja\n", "else:\n", " # CPU Only\n", " if モデルタイプ == \"デフォルト\" and not 日本語メニュー:\n", " !python entry_with_update.py --always-cpu 1 --vae-in-bf16 --unet-in-fp8-e5m2 --clip-in-fp8-e5m2 --output-path {target_local_dir} --share\n", " elif モデルタイプ == \"デフォルト\" and 日本語メニュー :\n", " !python entry_with_update.py --always-cpu 1 --vae-in-bf16 --unet-in-fp8-e5m2 --clip-in-fp8-e5m2 --output-path {target_local_dir} --share --language ja\n", " elif モデルタイプ == \"アニメ\" and not 日本語メニュー:\n", " !python entry_with_update.py --always-cpu 1 --vae-in-bf16 --unet-in-fp8-e5m2 --clip-in-fp8-e5m2 --preset anime --output-path {target_local_dir} --share\n", " elif モデルタイプ == \"アニメ\" and 日本語メニュー:\n", " !python entry_with_update.py --always-cpu 1 --vae-in-bf16 --unet-in-fp8-e5m2 --clip-in-fp8-e5m2 --preset anime --output-path {target_local_dir} --share --language ja\n", " elif モデルタイプ == \"MM\" and not 日本語メニュー:\n", " !python entry_with_update.py --always-cpu 1 --vae-in-bf16 --unet-in-fp8-e5m2 --clip-in-fp8-e5m2 --preset mm_preset --output-path {target_local_dir} --share\n", " elif モデルタイプ == \"MM\" and 日本語メニュー:\n", " # !python entry_with_update.py --always-cpu 1 --vae-in-bf16 --vae-in-cpu --unet-in-fp8-e5m2 --clip-in-fp8-e5m2 --all-in-fp16 --attention-split --preset mm_preset --output-path {target_local_dir} --share --language ja\n", " !python entry_with_update.py --always-cpu 1 --vae-in-bf16 --unet-in-fp8-e5m2 --clip-in-fp8-e5m2 --preset mm_preset --output-path {target_local_dir} --share --language ja\n" ], "metadata": { "id": "4AUIG7Xsutxx", "cellView": "form" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "上欄に**gradio.live** で終わるURLが表示されるまでお待ちください(下図参照)。 \n", "**約5分かかります**。 \n", "\n", "URLが表示されたらクリックしてください。自動的にブラウザが開き、Fooocusアプリが表示されます。\n", "\n", "\n", "\n", "## 翻訳機能\n", "アプリが立ち上がったあと、アプリ上で「**翻訳機能 有効**」にチェックをいれておけば,日本語でプロンプトを入力することができます。(翻訳機能はデフォルトでオン,日本語以外でもOK)\n", "\n", ">\n" ], "metadata": { "id": "UvvvOfoFjz_E" } }, { "cell_type": "markdown", "source": [ "\n", "|||\n", "| ---- | ---- |\n", "|![](https://i.imgur.com/jaQBei0.png)|![](https://i.imgur.com/XwvS5Zx.png)|\n", "\n", "----\n", ">#### 左\n", ">upside-down landscape reflected in lake, no human, a small country house stands, a red roadster in front of the house, a colorful cosmos field in the foreground\n", "\n", ">#### 右\n", ">flower, outdoors, sky, tree, no humans, night, traditional media, grass, star sky, night sky, scenery, starry sky, mountain, painting medium, field, house\n", "\n", "\n" ], "metadata": { "id": "fhRcsWfAmd42" } }, { "cell_type": "markdown", "source": [ "## 参考URL\n", "- [Fooocusのスタイル一覧](https://note.com/disc225/n/n2599cab73410)\n", "- [Fooocus_Style_Reference](https://docs.google.com/spreadsheets/d/1AF5bd-fALxlu0lguZQiQVn1yZwxUiBJGyh2eyJJWl74/edit?gid=0#gid=0)\n", "- [fooocusの使い方](https://poseroboegaki.com/ai-illust/)" ], "metadata": { "id": "aPaMqFmf6TAW" } } ] }