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

We'll deliver articles that match you.

You can read useful information later.

5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ファインチューニングした自前のStableDiffusionを公開するWebアプリを作ってみた

Last updated at Posted at 2022-09-18

自前の画像生成AI(ファインチューニングした自前のStableDiffusionなど)を公開できる簡単なWebアプリを作ってみました。
ここでは、今流行りのStable Diffusion をGoogle Colaboratoryでバックエンドで動かし、Webサイトで画像生成の結果を表示できるようにしました。

今回作ったwebアプリはこちら
image.png

Your Colab URI にSDを実行するサーバのエンドポイントを入力して、生成したい画像のテキストを入力、そしてGenerateで生成できます。

なお、画像生成AIを実行できるサーバー(バックエンド)があれば、Colabratoryでなくても、誰でもこのWebアプリを利用可能となっています。

この記事の流れ
・Stable Diffutionのファインチューニングで自前の画像生成AIモデル作成
・作成したモデルをWebAPIで呼び出せるようにFlaskサーバ(バックエンド)を立てる
・サーバのエンドポイントを今回作成したwebアプリに入力して、画像生成をする

なお、今回作成したnotebookとwebアプリはgithubにて公開しています。

今回使うnotebookのリポジトリ↓

ダウンロー&解凍後、SDworkspeceをGoogleDriveのマイドライブ直下にアップロードしてください。

webアプリのソースコードのリポジトリ↓

Stable Diffutionのファインチューニング

まずはオリジナル(っぽい)のStable Diffutionを作るため、ファインチューニングをします。
このサイトをすんごく参考にしました。

今回は石川県の伝統工芸の九谷焼をStable Diffutionに学習させました。
(なぜ九谷焼なのか。。。)

九谷焼(くたにやき)は、石川県南部の金沢市、小松市、加賀市、能美市で生産される色絵の磁器。

ファインチューニングのための画像収集

訓練データとなる九谷焼の写真は、Googleの画像検索でヒットしたものを11枚用意。
こんな感じの写真。
image.png

画像が準備できたら、集めた画像を先ほどGoogle DriveにアップロードしたSDworkspaceの中のimagesにアップロードします。画像の名前は重複していなければなんでも良いです。
なお、imagesにはこの九谷焼の画像がサンプルで入っていますので削除してください。

My Drive
└─.SDworkspace
    └─.images
     ├─ image1.png
     ├─ image2.png
     .
     .
     .

画像の解像度を512×512にする

先ほどGoogle Drive にアップロードしたsd_fintuningを開いてください。

はじめに、次のコードを実行しGoogle Driveにマウント。

実行する際、ランタイムタイプは必ずGPUを選択すること

image.png

そして、次のコードを実行。

image.png

すると、SDworkspace/my_conceptに解像度が512×512になった画像たちが保存されます。

これで準備完了。

ファインチューニング

今回使うフレームワークをインストールする。

image.png

そしたら、このフレームワークを使うためのアクセストークンをHugging Faceで作成する。
作成したら次のコードを実行して、アクセストークンを入力する。

image.png

こんな感じのが出れば成功。
image.png

次に、必要なモジュールをimportする。
image.png

そして、モデルを指定する次のコードを実行する。
image.png

次のコードのパラメータを自分がファインチューニングする対象に合わせて変更します。

「what_to_teach」「placeholder_token」「initializer_token」この三つを各自のファインチューニングの対象に合わせて変更します
what_to_teach : 学習内容
placeholder_token : 新しい概念を表す単語
initializer_token : 新しい概念が何であるかを要約する単語

image.png

このコードも実行。
image.png
image.png

あとは次のコードを実行してしばらくするとファインチューニングが開始。
自分のランタイム環境(無料バージョン)だと3-4時間くらいで終わりました。
image.png

これで、自前のオリジナルなStable Diffutionを準備完了です。
次の章では、このオリジナルなSDを実行するAPIサーバをColaboratoryで立てます。

今開いているコラボラトリーは閉じます。

自前のオリジナルSDを実行するサーバーを立てる(バックエンド側)

次にGoogle Drive にアップロードしたtext2image-colabAPIを開いてください。

今回はFlaskでサーバを立てて、json形式で推論結果を返すWebAPIを作りました。
さっきとは違うColabratoryを作成します。

Stable Diffutionを実行する準備

さっきと同じように、GoogleDriveにマウント→アクセストークン入力→ライブラリインポート→推論モデル準備が必要になります。

image.png

これでStable Diffutionを実行する準備完了。あとは、Flaskでサーバを立てるだけ。

Flaskでサーバを立てる

Stable Diffutionを実行する準備をしたColabolatryの続きで、Flaskでサーバを立てます。
今回はngrokでサーバを公開します。

必要なパッケージをインストール。
image.png

インストールできたら、次を実行します。
image.png

実行すると以下のようにURLが出力されます。
image.png
これが今回使うバックエンドのエンドポイントとなります。
今回は https://565b-35-223-175-181.ngrok.io がエンドポイントとなります。

このエンドポイントは実行するたびに変わります。

あとは、Flaskでサーバを立ち上るだけでバックエンド側は完了です。

image.png

このバックエンド側の処理は、GETでパラメータpromptを受け取り、promptを入力としてStable Diffutionで画像を生成、その後base64でエンコードしてjson形式でレスポンスを返します。
こんな感じのjsonで、生成した4枚の画像を返します。

{images:
  [base64/image, 
   base64/image,
   base64/image,
   base64/image]
}

最後に、先ほどのエンドポイントを今回私が作成したWebアプリのURIに貼り付けて、生成したい画像のテキストを入力しGenerateボタンを押すだけで、生成できます。

Generateボタンを押した後、Colabolatryに以下のようなプログレスバーが出力されていれば正常に実行されています。

数分後にwebアプリの方に結果の画像が表示されます。

試しに次のテキストで生成してみた結果こんな画像が生成されました。

a plate drawn birds, <kutani-ware>

image.png

九谷焼でファインチューニングされていない本家のSDで同じものを生成してみた結果がこちら。
image.png

比較すると、今回ファインチューニングしたSDの方が鮮やかな色彩で優雅な紋章(wikipedia丸コピ)が目立つようなお皿を生成してるのがわかります。

オリジナルSDをこのサイトで公開する

公開する際には、このエンドポイントをURLのパラメータに入れておけば、自動でURIが入力された状態になります。
今回の場合、https://565b-35-223-175-181.ngrok.io がエンドポイントでしたので、https://tex2img-colab-atworks.web.app の後に/?uri=https://565b-35-223-175-181.ngrok.io を加えてURLを公開します。つまり次のようになります。

https://tex2img-colab-atworks.web.app/?uri=https://565b-35-223-175-181.ngrok.io

Colaboratoryのセッション時間

COlaboratoryは無料版で90分しかセッションを維持できないので、今回のFlaskのAPIサーバは90分間しか公開できないです。。(セッションを維持できれば最大で12時間)
常時稼働したい場合は、自分でGPUのサーバを立てたり、GCPなりでGPUが使えるサーバを用意しましょう。

5
3
0

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

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!

5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?