Why not login to Qiita and try out its useful features?

We'll deliver articles that match you.

You can read useful information later.

7
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

画像生成AIから画像作成するWebサイト作ってみた。

Last updated at Posted at 2024-08-04

はじめに

naritomoと申します。

本職はインフラエンジニアを行っています。

前に作成した以下記事の発展として、画像生成AI APIから画像生成させる
Webサイトを作ってみました。

StableDiffusion APIから画像生成してみる。

概要

以下の仕様を満たすサイトを作成する。

前作成した記事で自作Pythonスクリプト使用して画像生成する仕組みはできていたため、これを再利用する前提で、フレームワークは比較的学習コストの低いFlaskを採用しました。

StableDiffusion WebUIの拡張機能でも実現できますが、
自身のスキルアップのため自力で作ってみました。

・携帯から操作できるよう画面のシンプル化
・画像作成する処理について最大同時に一つしか画像生成APIに投げられないようキュー管理させる
・画像生成について非同期で実行しつつ、順次実行できるようタスク管理させる
・全タスクに対して1分毎に状況確認して、生成完了して24H経過したものに対し、タスクと生成画像の削除を実施する
・任意のタスクと生成画像の削除を実施できること
・画像について、ブラウザからの閲覧と一括DLができること
・タスク実行履歴から入力画面への再反映
・PNG表示画面に、メタデータ表示も追加してどんなプロンプトで作成されたか参照できるようにする。

画面

Screenshot 2024-08-15 20.00.58.png

Screenshot 2024-08-15 20.01.28.png

ソースページ

事前作業

StableDiffuionを立ち上げたPCを用意し、APIを有効にしていること。

モデルは"animagine(3.1)"を入れてください。

VAEは"XL_VAE_C(f1)"を入れてください。

StableDiffusion APIから画像生成してみる。

animagineページ

VAEページ

使用方法

git clone https://github.com/naritomo08/createai_public.git
cd createapi_public
rm -rf .git
docker-compose up -d
以下のURLでサイトアクセス
http://localhost

画像保管先
app/static/output
または結果画面からモーダル画像閲覧、入手可能

画像生成ログ
log_writer/output

サイトアクセスログ
nginx/nginx_logs

ソース編集時の注意

ソース編集のみでは反映されないため、必ず以下のコマンドを入れること。

docker-compose down
docker-compose build
docker-compose up -d

タスクを止める方法

タスクのリザルト画面または、すべてのタスク削除で
タスクを止めることができます。

StableDiffusion日本語対応化

サイトに日本語指示を出して画像生成できるアプリも作成しました。

上記のサイトに対し、日本語指示を入れたらChatGPT APIで
プロンプト変換して画像生成する機能をつけました。

構成図

raspik8s-AI画像生成アプリコンテナ.jpg

画面

Screenshot 2024-08-20 18.03.30.png

Screenshot 2024-08-20 18.03.55.png

Screenshot 2024-08-20 18.04.10.png

事前作業(Japanese対応版)

StableDiffuionを立ち上げたPCを用意し、APIを有効にしていること。

モデルは"animagine(3.1)"を入れてください。

VAEは"XL_VAE_C(f1)"を入れてください。

StableDiffusion APIから画像生成してみる。

animagineページ

VAEページ

ChatGPT API keyも以下のページからあらかじめ入手してください。

使用方法(Japanese対応版)

git clone -b japanese https://github.com/naritomo08/createai_public.git
cd createapi_public
cp .env_ref .env
vi .env

以下の””の中にAPIキーを入力する。

OPENAI_API_KEY = ""

docker-compose up -d
以下のURLでサイトアクセス
http://localhost

画像保管先
app/static/output
または結果画面からモーダル画像閲覧、入手可能

画像生成ログ
log_writer/output

サイトアクセスログ
nginx/nginx_logs

その他注意点は同じなので割愛します。

おまけ

私的にはこれで画像生成に関する基本機能は実装できていますが、商用化するには後以下のハードルを超えればできそうですかね。
これ以上はキャパ超えるためやめますが。

・ユーザー認証(サービス加入者しか触らせない、枚数制限)
・利用モデルの商用利用確認
・決済機能実装(Stripe利用)

おわりに

本サイトは個人で活用しているサイトからソースを削減し、以下の機能など削っています

  • 入力するパターン(キャラや構図など)をスクリプト内に仕込んでおき、Web画面で選択して利用できる仕組み
  • 複数のModel/Loraを用意し、Web画面で選択して利用できる仕組み

実装するための種などかなりソース内に撒かれているので、個別に使いやすいものをつくってみてもいかがでしょうか。

この記事がStableDiffusionを扱う方の助けになればと思います。

7
2
26

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up

Comments

legitwhiz
@legitwhiz(sakamoto daisuke)

はじめまして。
記事を拝見させていただきました。
試してみようとリポジトリを確認しましたが、存在しなかったのですが削除されちゃいましたか?

0
naritomo08
@naritomo08(nari tomo)

ちょうど入れ直してました。
今ならまた入手できるはずです。

1
naritomo08
@naritomo08(nari tomo)

先ほどまで手直しをしていました。(動きには問題ないですが、画像生成タイムアウト時間設定など様々な環境への汎用性をもたせた設定を入れてました。)
この時間以降からご利用いただくか、問題があれば今の最新のものを入手し動かしてみてください。
バグや改善提案などあればissueなどでご報告受けられると嬉しいです。

0
naritomo08
@naritomo08(nari tomo)

以下の編集を実施しました。
・すべてのタスクリザルトにてタスクキャンセルボタンが出るようにする
・すべてのタスクキャンセルしたときにすべてのタスク動作が停止する

0
naritomo08
@naritomo08(nari tomo)

プログラム内で入れる標準プロンプトに問題があったため差し替えました。

0
naritomo08
@naritomo08(nari tomo)
(Edited)

日本語対応版について、以下の改良を実施
・何も入れていない場合はChatGPTへの問い合わせせず生成実施
・一度に生成する画像を1枚にし、リザルト画面で画像の閲覧が可能
・タスクを消すと画像も消える

0
naritomo08
@naritomo08(nari tomo)

複数画像作成機能を復活し、結果画面から画像参照できるようにしました。

0
naritomo08
@naritomo08(nari tomo)

初期バージョンにもボーダル機能つけました。
サイトから生成画面の参照が行えます。

0
naritomo08
@naritomo08(nari tomo)

スライドショー機能と一括DL機能をつけました。

0
naritomo08
@naritomo08(nari tomo)

スライドショーについて、ボタンの切り替えでは動作安定しないため、モーダル自体分けてスライドするものとしないものに分けました(JPGのみ)

0
naritomo08
@naritomo08(nari tomo)

ユーザーからリクエストを受ける部分について、Flaskからnginxに移行しました。

0
naritomo08
@naritomo08(nari tomo)

構成を見ると改良できそうなところやソースリファクタリングできそうなところはありますが、まずは致命的な問題はなさそうなのでこのままにしとこうかと。

0
naritomo08
@naritomo08(nari tomo)

PNG表示画面にて、使用パラメータ参照用にメタデータを表示する機能を追加しました。

0
naritomo08
@naritomo08(nari tomo)

1回に作成する枚数を制限しないと、レスポンスが大きくなりnginxからエラーが出るため、1回のタスクで作成する枚数の制限(50)かけました。

0
naritomo08
@naritomo08(nari tomo)

結果画面のパラメータを改行して見やすくしました。

0
naritomo08
@naritomo08(nari tomo)

更にメタデータについて扱いやすいよう、プロンプト、ネガティブプロンプト、その他設定で分離するようにしました。

0
naritomo08
@naritomo08(nari tomo)
(Edited)

pytestによるユニットテストも組み込みました。(使い方はGitHubReadme)
このシステム、家のK8Sに組み込んでおり、GitlabでのCICDで本ユニットテストが通らないとコンテナのビルドやデプロイができないようにしています。

0
naritomo08
@naritomo08(nari tomo)

久々の改修でモーダル表示の際、全画像データを取り込んで画像表示させる形式にしていましたが、これではモーダル呼び出し時に裏で画像呼び出しっぱなしになったり、正常に画面が出ないため、画面切り替え毎に画像を呼び出す形式に変更しました。

0
naritomo08
@naritomo08(nari tomo)
(Edited)

先ほど1000枚生成の動作確認したらリザルト画面へ移行できないことを確認。
事前に100枚までは表示は問題ないことを確認したので、これを1回のタスクの生成上限としました。

0
naritomo08
@naritomo08(nari tomo)

本サイトについて、1H以上開きっぱなしにすると画像生成時CSRFエラーが出るため、画像生成時にCSRFトークンを更新して動作するようにいたしました。

0
naritomo08
@naritomo08(nari tomo)

フロントエンドjavascriptに対し、リファクタリングを行いました。

0
naritomo08
@naritomo08(nari tomo)

画像生成時だけではなく、他のPOSTデータ送るところにも1H放置するとCSRFエラーで動かない現象が起こるため、すべてPOSTデータ送付時にCSRFトークン情報を更新し、それを使用するようにしました。

0
naritomo08
@naritomo08(nari tomo)

CSRFトークンをHTMLに埋め込まず、javascript処理の中で対応するものに書き換えました。
ここまでするほどセキュアな必要はないですが、セキュリティ強化の参考になりました。

0
naritomo08
@naritomo08(nari tomo)

一部ページ(resultページ)でCSRF埋め込みが見つかったため、修正しました。

0
naritomo08
@naritomo08(nari tomo)

かなりファイル分割しましたが、必要なHTMLに対し、必要javascript関数が動くように分割しました。
かなり動きが軽くなったような。

0
naritomo08
@naritomo08(nari tomo)

画像生成ログについて、ローテーションが機能していないため、修正を実施。
1週間で動くように設定。

0

Let's comment your feelings that are more than good

Qiita Advent Calendar is held!

Qiita Advent Calendar is an article posting event where you post articles by filling a calendar 🎅

Some calendars come with gifts and some gifts are drawn from all calendars 👀

Please tie the article to your calendar and let's enjoy Christmas together!

Being held Article posting campaign

7
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Login to continue?

Login or Sign up with social account

Login or Sign up with your email address