簡便な画像生成アプリ

2025年技術ブログ集

その1 CPUで動く画像生成アプリの開発(txt2img) 

Stable-diffusionは画像生成AIとして有名です。GUIとしてはAutomatic1111やComfyUIなどがあります。Automatic1111はtxt2imgの他にimg2imgや各種設定ができる一方で、GPUを前提に作られています。ComfyUIはCPUにも対応しますがブロックプログラムなので扱いにくいように思います。何とかCPUでも動かせるものがないかを調べているうちに、日経ソフトウェア2025年7月号(P025-P029)にdiffusersライブラリを使って、「stable-diffusion-v1-5」モデルを動かすコードが提供されていました。ただし、使っているpython3.11の環境内に6GB程度のモデルのDLが必要です。以下にコードを示します。
仮想環境の肥大化を回避するためには、GPUを主にする場合Automatic1111のREST_API機能を使ったほうが合理的です。また、CPUの場合仮想環境にモデルを置くのではなくカレントディレクトリにより軽量なモデルを配置したほうがコードをコンパイルした場合に移植性という観点からは使い易いです。後ほどそれぞれの方法を説明します。
まず、日経ソフトウェア2025年7月号のコードを動かしてみました。また塩漬け状態にあったRTX5060ですが、cudaの導入時に変更を加えることで動くようになりました。

また、P29にtkinterを使ったGUIコードが掲載されていたので、追試してみました。

折角追試したので、GPUモードでAutomatic1111とtkinterアプリを比較してみました。プロンプトに「Avocado illustration」と「1robot with UFO in the forest」を入れて、TkinterアプリとAutomatic1111での生成速度を比較しました。Tkinterアプリは11秒、Automatic1111は4秒でした。モデルは、Stable-diffusion-v1-5で画像は512×512で同じですが,,,この違いは、GUIライブラリ(gradioとtkinter)の違いなのでしょうか。

本題に戻ります。簡便でかつCPUで動かせる画像生成AIアプリの開発です。相談する相棒はCopilotさんでした。軽量化のための軽量モデルでカレントフォルダに配置できるものとして、bk-sdm-tiny(1.55GB)を候補に挙げてくれました。また、モデルのDL方法を教えてくれました。ついでに簡単なコードもお願いしました。以下のコードです。
まず、MODELフォルダにbk-sdm-tiny1をDLするコードです。

画像生成のテストコードです。

tkinterを使ったGUIアプリの仕様は、posi/negaのプロンプトが入力できること(negaプロンプトがないと黒画面生成が多くなります)、GPUとCPUが使えること(cuda/cpuの選択)、ロゴマーク入りのアイコン画像を作る機能としてロゴ文字を入力とサイズを指定できること(ロゴ文字入力しない場合は普通の画像)、画像サイズは256×256をデフォルトにすること(CPUでの負荷考慮)、保存するファイル名が入力できることです。
以下にコードを示します。

以下に、簡易画像生成アプリ「iconAI」の操作画面を示します。犬の顔画像を生成し、dogAI3というロゴをサイズ50で追加します。ロゴの位置は下半分の中央です。(変更できません) コードをコンパイルすると3GB程度に巨大化しました。モデルと合わせて4.5GBの容量が必要ですが、Automatic1111の10.5GBに比べ容量は半分以下ですし、仮想環境は必要ありません。CPUでも動かすことができます。アイコンも作れます。まだまだ至らないところもありますが、専用チャットボットの画像生成などいろいろ使えると思います。

その2 CPUで動く画像生成アプリの開発(img2img) 

その1でtxt2imgアプリ開発の話をしましたが、Automatic1111はimg2imgの機能を持っています。これもやっておかなければいけないと思い、その2ではimg2imgの簡易画像生成AIアプリを開発することにしました。
img2imgの場合のコードは、generate関数の記述にimageを加えるだけです。以下にコードを示します。

以下に、簡易img2img画像生成アプリ「img2imgGUI」の操作画面を示します。左の顔を笑い顔にしようとしましたが、うまくいきませんでした。仕様としては、入力BOXは小さいですが、posi/negaのプロンプトを入力できます。GPUとCPUに切り替え(cude/cpu選択)、元画像入力(ブラウズ機能)、生成した画像ファイル名の指定と保存機能があります。正直に言って、あまり出来は良くないです。少し笑った風な顔にした修正をしたかったのですが、大幅に修正が加わってしまいます。まるで別人です。
generate関数のstrength=0.5にしているためでもあります。

元画像の変形を抑えるように、プロンプトに「laughing」ではなく「laughing cat」と念押しをすることで、余分な変形を防げました。

同じように元画像の変形を抑えるように、プロンプトに「wearing glasses dog」としました。少し変形が進んでしまいましたが、意図した画像が得られました。
やっぱり軽量モデルがちゃちなのかもしれませんね。

その3 Automatic1111のREST API機能活用 

ローカルでLLMを使用する場合、ollamaのREST_API機能が便利でアプリ開発に使用しました。画像生成の場合も同じようにAutomatic1111でREST_API機能が使えることがわかりました。すでにStable Diffusion WebUI(Automatic1111)をインストール済みななので、webui-user.batファイルを編集します。このファイルはWebUIの起動時に使用される設定を管理しています。webui-user.batを右クリックして編集モードで開きます。そしてCOMMANDLINE_ARGSにAPIを有効化するオプションを追加します。  set COMMANDLINE_ARGS=–api これだけです。localhost:7860がAPIのurlです。以下に簡単なテストコードを示します。注意点としては、ollamaは起動時に常駐するように設定されていると思いますが、Automatic1111は、GUIを起動しないとapiの機能が得られません。

Stable-diffusionをurlで操作できるようになったので、軽量化とかは置いておいてGPUをフル活用したいと思います。Stable-diffusionのネックであるプロンプトは基本英語という面倒さを無くすため、日本語でこんな画像が欲しいと言えば、適切な長文の英文プロンプトを生成するAIエージェントが欲しくなりました。AIエージェントは自律的にユーザーの意思をくみ取り処理してくれる優秀な部下のようなものです。ローカルでエージェントを動かす方法は、pinokioでAutoGPTを使うとか調べればやり方はあると思いますが、CrewAIをローカルで使う場合、LM-Studioで動くCrewAI用のLLM(mistral_7b_crewai)をセットする必要があります。面倒ですね。しかし、用途としては、プロンプト生成、銘柄分析、旅行計画などに使われているようです。
詳しくは、マルチエージェントフレームワークCrewAIのチュートリアルを解説 を参照してください。
CrewAIをローカルで使うための準備として、LM-Studio本体のインストルールとCrewAI用のLLM(mistral_7b_crewai)を準備します。Ollamaと同じくREST_APIの機能があり、urlはlocalhost:1234です。(ollamaは、localhost:11434)(automatic1111は、localhost:7860) また、CrewAIはpythonのライブラリで提供されていて、>pip install crewai⏎でだけでOKです。
まず、完全ローカルで仕事自動化、自律型AIエージェントCrewAI × LM Studioを動かす!(基礎編・自動AI画像生成)|umanikomi を参考に、CrewAIを使って短い日本語の画像生成指示を長い英文のプロンプトに変換する追試を行います。

ゴールは、「最高の美少女の画像生成AIのプロンプトを作成する」とのことです。この人はかなりオタクな人に違いありません。まあそれは置いておいて、このために2人の異なるエージェントを作り役割を与えています。「designer」と「generator」です。

オタクさんのテストプログラムをそのまま以下に掲載させていただきました

CrewAiで生成したプロンプトは、「A summer-announcing maiden in an enchanted forest, Lumina; long silver hair cascading, shimmering under dappled sunlight, emerald eyes alluring and otherworldly, porcelain skin glowing, silk gown with gold thread embroidery, golden diadem, iridescent pink-gold wings, gentle disposition, laughter like wind chimes, soft melodic voice, tranquil aura, craving companionship, yearns to share her world,」でした。長い!
このプロンプトを「iconAI」に入れて画像生成してみました。果たしてこれが最高の美少女でしょうか。私にはよくわかりません。軽量モデルでは良し悪しがよくわかりませんね。

ここまで来たら、CrewAiで変換したプロンプトをAutomatic1111に渡して画像生成までの一気通貫で処理がしたくなります。Copilotさんと5時間くらいやり取りして、先ほどのテストコードをベースに画像生成AIとの接続を行いました。
CrewAIのエージェント設定は、Roal(優秀な絵師)とGoal(最高のプロンプトを生成する)としました。Backstory(どんな状況でも最善を尽くす)とかTaskDescription(プロンプトは英語でコンマ区切り)とかExpectedOutput(描きたい画像の説明)などを指定できるようにしています。ここまでの入力情報をもとにCrewAIが英文プロンプトを生成します。前半は先ほどのテストコードに同じです。

後半はコードは、生成した英文プロンプトとネガティブプロンプトにパラメータを加えjson形式にまとめ、Automatic1111のAPIに送信の準備をします。

GUI操作関連のコードです。画像は一度に5枚生成します。サイズも指定できますがGUIに収まりの良い512×768をデフォルトにしています。(変更可能です) 保存する際は、画像左のマルにチェックを入れて名前を付けて保存します。1枚ずつです。次の5枚を生成したいときには、再度、画像生成ボタンを押して操作を繰り返します。

GUI画面を示します。RoleやGoalなどを変更すると、少女画像以外のものも生成できます。今回のAgentアプリの名前は「crewAISD_GUI」としました。その1やその2で開発した簡便な画像生成AIアプリはコンパイルして動かすことができましたが、AgentAIは、Python311をベースにした仮想環境中にCrewAIを内包し3.8GBの容量が必要でした。また同時に使用するAPIは、LM-Studio(lovcalhost:1234)とAutomatic1111(localhost:7860)と連携する必要があります。ローカルAgentとしてはシンプルではなくかなり複雑になりましたが、なんか便利かもしれません。論文を生成する「WEBbaseAI」もAgentAIの仲間です。LangChainとollamaによる構成でした。
これからは、Agent関連の開発が盛んになるのでしょう。オタクさんの英文プロンプトに類似したもので「最高の美少女」を生成しました。やはり。軽量モデルでなく、Stable-diffusionモデルの差なのか最高に近いレベルの画像が生成されているような気がします。

英文プロンプト自動生成の品質を確認するため、浮世絵美人の浮世絵風アニメを生成してもらいました。やはりAIエージェントは北川歌麿のような凄い能力がありそうですね。

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