カテゴリー
Raspberry Pi

1日64人! Raspberry Pi で 様々な人物画像を自動生成 – Stable Diffusion

Raspberry Pi 上のBashスクリプトで自動的にプロンプトを組み合わせて、1日当たり60人以上の様々な人物画像を自動生成する方法について説明します。

本稿を読む前のご注意

本稿で生成する人物画像の中には、実在する人物に似た画像や、倫理的に不適切な画像、不快な印象を与える画像が含まれる場合があります。
また、身体的に似た個性や事情を持つ方々に対して差別感を与える場合があります。一例として個性的な目鼻口の形状や配置、体型、指の形状や本数、性的強調や非強調(具体的には中性的な男性)を持つ人物画像を生成するケースが存在します。差別する意図はありませんので、ご容赦ください。

人物の画像の生成例

本稿では、自動的に人物画像のプロンプトを生成するBashスクリプトを紹介します。下図は正方形の解像度440×440で生成した8人の画像です。一見すると、写真のように見えると思います。

Automatic1111 Stable Diffusion Web UI
解像度 = 440×440, Steps = 20
モデル = japaneseStyleRealistic_v20

Raspberry Pi 5 RAM 16GBモデルでの生成時間は、1枚あたり約17分、1日84枚の生成が可能です(4GBモデルは後述)。

測定回数RAM最大(平均)使用量画像生成時間
1回目(初回)10705 MB (5796 MB)1135 秒 (約 19 分)
2回目10705 MB (6375 MB)1070 秒 (約 18 分)
3回目11956 MB (6592 MB)964 秒 (約 16 分)
4回目11956 MB (6680 MB)997 秒 (約 17 分)
5回目11956 MB (6746 MB)994 秒 (約 17 分)
Raspberry Pi 5 16GB RAM でのメモリ使用量と生成時間

下図は縦長のポートレート風の解像度384×512、Step数24での結果の一例です。やや品質が劣化するようです。

Automatic1111 Stable Diffusion Web UI
解像度 = 384×512, Steps = 24
モデル = japaneseStyleRealistic_v20

生成時間は1枚あたり約22分、1日65枚の生成が可能です。

測定回数RAM最大(平均)使用量画像生成時間
1回目(初回)9241 MB (6791 MB)1330 秒 (約 22 分)
2回目8202 MB (5253 MB)1327 秒 (約 22 分)
3回目8202 MB (5255 MB)1331 秒 (約 22 分)
4回目8202 MB (5254 MB)1331 秒 (約 22 分)
5回目8202 MB (5253 MB)1329 秒 (約 22 分)
Raspberry Pi 5 16GB RAM でのメモリ使用量と生成時間

解像度を512×512に増やしつつ22分で生成できるように、Step数を20にすると、より自然な画像が得られました。

正方形の方が自然な画像が生成できた
解像度 = 512×512, Steps = 20
モデル = japaneseStyleRealistic_v20
スクリプト = ex10_sd_practical.sh

Bashスクリプトでプロンプト生成

本稿では、画像生成に Stable Diffusion Web UI を用い、そのプロンプトの生成に Bashスクリプトを使用しました。

Bashスクリプトでプロンプトを自動生成

モデルまかせで人物を生成

人物の特徴を指示せずに生成すれば学習モデル任せで様々な人物を生成することが出来ます。国籍や性別を指定しない以下のプロンプトを使ってみます。

  • a human, photo quality
  • detailed portrait

下図は生成結果です。日本人に近い女性が生成されました。

プロンプト「a human, photo quality」で、人物画像を生成
解像度 = 512×512, Steps = 20, Seed番号 = (0 1 2 3 4 5 6 7)
モデル = japaneseStyleRealistic_v20
プロンプト「detailed portrait」で、人物画像を生成
解像度 = 512×512, Steps = 20, Seed番号 = (0 1 2 3 4 5 6 7)
モデル = japaneseStyleRealistic_v20

性別や顔という指示がないにもかかわらず、全て女性の顔のクローズアップになることから、女性の顔を多く学習したモデルだと推測できます。また、国籍を指定していないので、日本人らしさに揺れが出ています。

単一プロンプトで日本人を生成

下図はプロンプトに「Japanese」等を、ネガティブ・プロンプトとして「low quality」等を入れて生成した例です。

プロンプト「A highly detailed, realistic portrait of Japanese, wears fashionable clothes, slightly natural smile, in a modern apartment.」、ネガティブ・プロンプト「low quality, blurry, nsfw, traditional Japanese clothes.」で、日本人の人物画像を生成
解像度 = 512×512, Steps = 32, Seed番号 = (0 1 2 3 4 5 6 7)
モデル = japaneseStyleRealistic_v20

この場合も、女性ばかりが生成されました。

同一画像生成を再現するSeed番号

Seed番号は、生成時に使用する乱数の種です。同じSeed番号を使用することで、同一画像を再現することが出来ます。

下図は、それぞれ左から右にSeed番号0~7で生成した画像です(上記の3例を含む)。縦方向の人物を比較すると面影が残っていることが分かるでしょう。

左から右にSeed番号0~7で生成した画像の例。縦方向の人物を比較すると面影がある

同一画像を再現してみよう

ここで、下図と同じ画像を生成する方法を説明します。まず、どちらかの画像をダウンロードしてください。

Seed番号 = 2219582464
Seed番号 = 2806322056

次に、ダウンロードした画像を、Stable Diffusion のタブ[PNG Info]画面のSourceエリアにドラッグ&ドロップします。右側にプロンプトやSeed番号が表示されるので確認してください。

Stable Diffusion の[PNG Info]画面を選択し、画像を読み込み、[Send to txt2img]ボタンでプロンプトなどのパラメータを取り込む
Seed番号 = 2219582464

画面中央付近の[Send to txt2img]ボタンを押すと、画像生成用txt2img用のパラメータとして流用できます。タブ[txt2img]で元の画面に切り替え、[Generate]ボタンで画像生成を開始します。下図のように、ほぼ同じ画像が生成できました。

取り込んだプロンプトやSeed番号などから同じ画像が生成できた
Seed番号 = 2219582464

性別、年齢を指示する

通常、画像生成には目的があります。目的に相応しい人物を生成するには、プロンプトの調整が必要です。

下図は同一人物に見える人物に対して、プロンプトで性別や、年齢を指示した場合の一例です。背景や服装は似ていますが、左側の人物よりも右側の方が若く見えると思います。

プロンプトで性別、年齢を制御したときの一例
解像度 = 440×440, Steps = 20, Seed番号 = 0
モデル = japaneseStyleRealistic_v20

前述のとおりjapaneseStyleRealistic_v20は女性の顔のクローズアップ画像を多く学習しています。このため、プロンプトによる指示に追従しやすいです。下図は4人の女性についてプロンプト「20-years-old」の有無を比較した一例です。

プロンプト”20-years-old”で年齢を制御したときの一例
解像度 = 440×440, Steps = 20, Seed = (1 2 3 4)
モデル = japaneseStyleRealistic_v20

Bashスクリプトでプロンプトを組み合わせる

以上から、様々な人物を生成するBashスクリプトには、以下のような条件を付与することにしました。

  • 国籍(初期値=”Japanese”)
  • 性別と年齢(男/女、”20-years-old”の有無など)
  • 服装(6種類からランダム)
  • 背景(6種類からランダム)
  • Seedはランダム(-1を指定)
  • その他(約20分で生成できる範囲で高画質化)

後述のインストール方法にしたがってセットアップ後、下記を実行すれば、上記の条件で自動的に人物画像を生成します。

  • ex10_sd_practical.sh(RAM 8GB/16GBモデル用)
  • ex10_sd_practical_4g.sh(RAM 4GBモデル用)

本ブログ内で紹介した人物画像は、これらのBashスクリプトのプロンプトや生成条件を調整して作成しました。

Bashスクリプトの内容

上記のBashスクリプト内では変数nationalityと、配列変数humans、clothes、scenesを定義しています。下記はその一部です。

nationality="Japanese"
humans=(
    "a ${nationality} masculine man with short hair, no makeup"
    "a ${nationality} woman"
)
clothes=(
    "buisiness suit"
    "light business attire"
)
scenes=(
    "in a modern apartment"
    "in a office"
)

また、プロンプト生成時は、これらをランダムで組み合わせます。下記は生成用プロンプトの抜粋です。

get_prompt(){
    echo -n "An upper-body portrait photograph of "
    echo -n "(${humans[$(( $RANDOM % humans_num ))]}, "
    echo -n "wears ${clothes[$(( $RANDOM % clothes_num ))]}), "
    echo -n "${scenes[$(( $RANDOM % scenes_num ))]}, "
    echo -n "professional DSLR photography. "
}

本稿で使用するRapsberry Pi

Rasberry Pi 5 Model B RAM 16GB

Stable Diffusion Web UI の実行にはメモリー 8GB 以上を要します。このため、RAM容量が 4GB や 8GB のモデルでは、メモリー不足対策が必要です。RAM 4GBモデルでは、仮想メモリにSSDドライブを使用します。

以上より、Raspberry Pi 4または5および、必要に応じてSSDドライブを準備してください。

  • Rasberry Pi 4 RAM 4GB + SSDドライブ
  • Rasberry Pi 4 RAM 8GB 単体 (または +SSDドライブ)
  • Rasberry Pi 5 RAM 4GB + SSDドライブ
  • Rasberry Pi 5 RAM 8GB 単体 (または +SSDドライブ)
  • Rasberry Pi 5 RAM 16GB 単体

4GBモデル+SSDでの生成例

下図は、Raspberry Pi 5 RAM 4GBモデル + SSDドライブで生成した画像です。画像の解像度は320×320に下げて、RAMの節約と生成速度の向上を図りました。

解像度 = 320×320, Steps = 20
モデル = japaneseStyleRealistic_v20
スクリプト = ex10_sd_practical_4g.sh
測定回数RAM最大(平均)使用量
MEM最大(平均)使用量
RAM 4GBモデル
画像生成時間
1回目(初回)1316 MB (1010 MB)
8878 MB (6786 MB)
1020 秒 (約 17 分)
2回目1441 MB (1060 MB)
8878 MB (6806 MB)
1041 秒 (約 17 分)
3回目1441 MB (1075 MB)
8879 MB (6812 MB)
1014 秒 (約 17 分)
4回目1463 MB (1100 MB)
8879 MB (6815 MB)
1038 秒 (約 17 分)
5回目1463 MB (1112 MB)
8879 MB (6823 MB)
1032 秒 (約 17 分)

縦長のポートレート風の解像度256×344だと、下図のような画像になりました。

Automatic1111 Stable Diffusion Web UI
解像度 = 256×344, Steps = 24
モデル = japaneseStyleRealistic_v20
測定回数RAM最大(平均)使用量
MEM最大(平均)使用量
RAM 4GBモデル
画像生成時間
1回目(初回)1641 MB (1115 MB)
8344 MB (6723 MB)
1197 秒 (約 20 分)
2回目1651 MB (1098 MB)
8345MB (6731 MB)
1179 秒 (約 20 分)
3回目1651 MB (1095 MB)
8345 MB (6733 MB)
1165 秒 (約 19 分)
4回目1651 MB (1096 MB)
8345 MB (6734 MB)
1173 秒 (約 20 分)
5回目1658 MB (1101 MB)
8409 MB (6743 MB)
1176 秒 (約 20 分)
Raspberry Pi 5 4GB RAM + SSD でのメモリ使用量と生成時間
Automatic1111 Stable Diffusion Web UI
解像度 = 256×344, Steps = 24
モデル = japaneseStyleRealistic_v20

インストール方法

当方の過去のブログを参照してください。

おまけ:Copilotとの比較

最後に、Copilotが生成した画像と比較してみます。下図の左側はStable Diffusionによる生成、右がCopilotです。

Copilotが生成した画像との比較
但し、比較しやすいように明るさを調整(Copilot側の明るさをアップ)

Copilotの方が解像度が高く、人物の顔の輪郭や頬の形状が自然です。背景の商品棚や小さく映った人物もリアルに生成されました。色違いのバッグのショルダーベルトも統一されています。

とはいえ、良く見ないと分からないレベルだと思います(主観)。

肖像権への配慮

本稿ではプロンプトのみで人物画像を生成していますが、実在する人物に似た画像が生成されてしまうことがあります。場合によっては、偶発的に実在の人物に酷似した画像が生成され、肖像権を侵害してしまうリスクもあります。侵害リスクへの備えとしては、以下の方法があります。

  • 実在の人物に似た画像を意図的に生成しない
  • 顔の特徴の指示を細かくし過ぎない
  • タレント業に紐づく用語や背景、ポーズは、なるべく使用しない
  • 実在の知人やタレントに似た画像が複数回、生成された場合は、プロンプトを見直す
  • プロンプトや生成条件、Seed値など生成履歴を残しておく(PNGファイルのEXIF情報を消さない)
  • 生成した画像から似たタレントを検索し、同一人物に見えないかどうかを確認する
  • 実在の知人やタレントに酷似した画像が生成されてしまった場合は、躊躇せずに削除する

なお、実在する人物に似た画像を生成する行為は、例え悪意が無かったとしても、ディープフェイクの生成を疑われ、犯罪行為とみなされるリスクがあります。また、PC内の画像がハッキングによって流出する可能性もあり得ます。

作らない、残さないを徹底しましょう。

by bokunimo.net

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

 - 
Chinese (Simplified)
 - 
zh-CN
Chinese (Traditional)
 - 
zh-TW
English
 - 
en
French
 - 
fr
German
 - 
de
Italian
 - 
it
Japanese
 - 
ja
Korean
 - 
ko
Russian
 - 
ru
Spanish
 - 
es