カテゴリー
Raspberry Pi

Raspberry Pi 上から Bashスクリプトで Stable Diffusion を制御する

Raspberry Pi 上に Stable Diffusion をインストールし、Bashスクリプトで画像生成プロンプトを生成し、Web UI の API を使って画像生成AIの制御を行います。

Bashスクリプトで画像生成

本稿では、Bashスクリプトで画像生成AI用のプロンプトを作成してみます。各種AIエンジンの制御に使われる言語はPythonが主流です。PCをはじめとするハードウェア、ソフトウェア、アプリケーションとの連携に不可欠なライブラリが豊富だからです。

そういったことが得意な言語が、もう一つあります。それはBashスクリプトです。しかも、普段のコマンド操作と同じ操作で、応用できます。

Raspberry Pi を使って画像生成AIの実験を行っている様子

生成した画像の一例

まずは、Raspberry Pi で生成した画像の一例から紹介します。

下図は Stable Diffusion の基本モデル SD1.5 による9枚の生成例です。解像度512×256の画像1枚につき約6分の生成時間を要しました。基本モデルなので見劣りします。とはいえ、フォトフレームに表示する風景画であれば、利用可能な範囲でしょう。

基本モデル SD1.5 による9枚の風景画 ※1枚当たり6分の生成時間を要する

また、学習を追加したモデルに変更すると、同じ生成条件であっても、より自然な画像を生成することも可能です。

学習モデルの変更で、より自然な画像生成が可能

とくに人物については、モデルの利用で実写と見間違うような自然な画像を生成することができます。

人物の生成には、人物用のモデルを使用する(一例としてjapaneseStyleRealistic_v20)

画像生成実験システムの構成

本例では Raspberry Pi で画像生成を行います。クラウド側のAIを使用しないので、画像生成するときのインターネット接続が不要です。フォトフレームとして単体で動かせるほか、完全にローカルな環境でシステムを構築することができます。ただし、システムのインストールにはインターネットが必要です。

Bashスクリプトで画像生成AIを制御する。画像生成するときのインターネット接続は不要

必要な機材

Raspberry Pi 4 以上で動作します。ただし、本稿で紹介する画像の生成には 5GB ~ 9GB を使用します。このため、RAM 4GB モデルや 8GB モデルだとメモリの節約が必要です(後述)。

本稿で使用する Raspberry Pi 5 model B RAM 16GB

マイクロSDカードは、ソフトウェアのインストール用に8.8GB、Swap領域8GB、モデル追加1件につき5GBほどの容量が必要です。したがって、32GB以上の高耐久(ドライブレコーダー用)を用意してください。

  • Raspberry Pi 5 model B(RAM 8GB か 16GB を推奨)
  • マイクロSDカード 32GB以上(高耐久品)
  • 周辺機器(ACアダプタ、モニタ、キーボード、LAN環境など)
32GB以上の高耐久(ドライブレコーダー用)のマイクロSDカードを使用する
メンディングテープを貼っておくとカードを取り出しやすい

Stable Diffusionのインストール方法

AUTOMATIC1111 のStable Diffusion web UI をインストールする

本稿では、AUTOMATIC1111 のStable Diffusion web UI を使用します。Stable Diffusion に GUI や拡張性を追加して一般のユーザーが使える形にした標準的なソフトウェアです。

インストールも、ほぼ自動で実行できます。ただし、Pythonのバージョンや、メモリの制限、Raspberry Piが NVIDIA の GPU を搭載していないなどの部分に留意する必要があります。

以下、インストール手順の説明です。

Python3.11をインストールする

Bookwarmをインストールする

Python のバージョンは 3.11 を使用します。筆者が知る限り、最も手軽な方法は Raspberry Pi OS Bookworm の 2025/11/24版を使用することです。

Bookwarm 2025-11-24 Lite版:https://downloads.raspberrypi.com/raspios_oldstable_lite_arm64/images/raspios_oldstable_lite_arm64-2025-11-24

Bookwarm 2025-11-24 デスクトップ版:
https://downloads.raspberrypi.com/raspios_oldstable_arm64/images/raspios_oldstable_arm64-2025-11-24

Lite版はデスクトップ環境が含まれません。起動後、CLI(コマンド・ライン・インターフェース)で操作します。RAM 16GB モデルの場合はデスクトップ版で大丈夫です。しかし、RAM 8GB モデルの場合は、生成時間が長くなることがあるので、CLIに慣れている方はLite版を使ってください。RAM 4GB モデルではLite版が必須で、Lite版でも生成時間が長くなります。

末尾が「img.xz」のファイルをダウンロード後、Raspberry Pi Imager を使って、そのファイルをマイクロSDカード(32GB以上)に書き込み、作成したマイクロSDカードを Raspberry Pi 5 model B に差し込んでください。

ソフトウェアのインストール(1)

AUTOMATIC1111を始動するためのインストール

複雑なインストールは全て AUTOMATIC1111 が実行してくれます。とはいえ、AUTOMATIC1111 を始動するためのインストールが必要です(jqは筆者のスクリプトで使用)。

下記を実行してください。

$ sudo apt update
$ sudo apt install wget git python3-pip libgl1 jq
$ cd
$ git clone http://github.com/AUTOMATIC1111/stable-diffusion-webui

次に、Stable Diffusionの起動オプションを設定します。設定ファイルは Bashスクリプトです。下記のファイルをエディタで開き、環境変数 COMMANDLINE_ARGS を定義してください。

Stable Diffusionの起動設定ファイル:
~/stable-diffusion-webui/webui-user.sh

export COMMANDLINE_ARGS="--skip-torch-cuda-test --no-half --listen --api"

Raspberry Pi で使用する可能性のある主なオプションを下表に示します。必要に応じて、上記のダブルクォート内に追加してください。先頭のハイフン(-)は2つ連続で記入します。

– -skip-torch-cuda-testGPUのテストを省略
(CPU処理なので必須)
– -no-halfFP16演算を使用しない
(ARM CPUで必須)
– -listenLANからWeb UIへのアクセス許可
– -api本稿で利用するAPIの有効化
– –nowebuiWeb UIの無効化(RAM節約)
– –lowramRAM消費を抑えるオプション
(8GB以下のモデルに必要)
– –opt-sub-quad-attentionRAM消費を抑えつつ速度改善
メモリーを節約したい場合は、「lowram」と「opt-sub-quad-attention」を追加する。先頭の「- -」は、マイナス記号2つ連続で入力する

メモリー(RAM)不足対策

Raspberry Pi 4 や 5 の 4GB モデルや 8GB モデルの場合、メモリ不足対策が必要です。一例として、オプション設定lowram、RAM圧縮、SDカードへのスワップ機能を使用します。

  • オプション設定
    設定 = webui-user.sh のCOMMANDLINE_ARGSに lowram、opt-sub-quad-attention を追加(先頭にマイナス2つ付与する)
  • RAM圧縮
    インストール = sudo apt install zram-tools
    設定 = /etc/default/zramswap に ALGO=lz4、PERCENT=75
    反映 = Raspberry Pi OSの再起動 sudo reboot
  • RAMスワップ機能
    設定 = CONF_SWAPSIZE=4096、CONF_MAXSWAP=8192
    反映 = sudo systemctl restart dphys-swapfile
    使用制限 = echo 10 | sudo tee /proc/sys/vm/swappiness

下記は、4GB モデルの Raspberry Pi を使った画像生成中のRAMの圧縮・スワップ状態の一例です。

$ swapon --show
NAME       TYPE      SIZE USED PRIO
/dev/zram0 partition   3G 2.9G  100
/var/swap  file        4G 1.3G   -2

8GBモデルの場合は、かえって生成速度が低下することもあるので、必要に応じて加減してください(生成画像による)。

ソフトウェアのインストール(2)

AUTOMATIC1111 による自動インストール

ここからは、AUTOMATIC1111 による自動インストールです。環境にもよりますが、全てのインストールを行うのに数時間を要します(Raspberry Pi 5 16GB 使用時)。

下記のBashスクリプトを実行してください。

$ cd ~/stable-diffusion-webui
$ ./webui.sh

自動的に設定ファイルの webui-user.sh を実行し、Pythonの仮想環境を生成し、仮想環境上で launch.py を実行します。

また、 launch.py は、必要なソフトウェアのダウンロードとインストールを自動的に行います。なお、最も時間がかかるのは、約5GBの標準モデルSD 1.5「v1-5-pruned-emaonly.safetensors」のダウンロードです。

AUTOMATIC1111 による自動インストールが完了するまで待つ

ダウンロードが終わると、下記のメッセージが表示されます。ここでポート番号7860を確認してください(7861になることもあります)。

Running on local URL:  http://0.0.0.0:7860

インターネット・ブラウザで「http://(IPアドレス):7860/」にアクセスすると、下図のような画面が表示され、Stable Diffusion web UI が利用できるようになります。OSがLite版の場合は、PCなどからアクセスしてみてください。

「Prompt」欄にプロンプトを入力し、[Generate]ボタンで画像生成を実行できます。

終了するときは、Raspberry Pi のCLIで[Ctrl]+[C]を押下後、[Y][Enter]を入力します。

再度、起動する場合は「./webui.sh」を実行し、再度、数時間ほど、待ってください。失礼しました。嘘です。すでにインストールが完了していた場合は、約10秒くらいで起動します。

また、設定変更などによって、必要なソフトウェアが生じた場合は、自動で追加のインストールが行われます。

自動生成用Bashスクリプト

筆者が本稿用に作成した画像生成用のBashスクリプトについて説明します。

本稿用に作成した画像生成用のBashスクリプト(GitHub)

ダウンロード方法と実行方法

下記のコマンドでダウンロードできます。また、JSONから画像を抽出するのに jq コマンドを使用するので、インストールします。

$ cd
$ git clone https://bokunimo.net/git/bash/
$ sudo apt install jq

下記のコマンドで、Stable Diffusion web UI をバックグラウンドで起動し、筆者作成の Bashスクリプト を実行すると、画像生成を開始します。生成には約6分を要します(16 GBモデル時)。

$ cd ~/stable-diffusion-webui
$ ./webui.sh &
$ cd ~/bash/practical/stable_diffusion/
$ ./ex01_sd_basic.sh

生成が完了したら、同じフォルダ内に「ex01_sd_basic.png」が作成されます。下図は生成した画像の一例です(低品質です)。

Raspberry Pi で ex01_sd_basic.sh を実行し、約6分で生成した画像の一例

webui.shを停止するには、「fg⏎」を入力してから[Ctrl]+[C]を入力します。

画像生成用プロンプトを確認する

生成した画像をSrable Diffusion web UI の「PNG Info」にドラッグ&ドロップすると、生成プロンプトやモデル名などが表示されます。

画像の情報を Srable Diffusion web UI の「PNG Info」で確認する

本例では、以下の情報が得られました。

A professional landscape photograph of European scenery.
Steps: 10, Sampler: DPM++ 2M, Schedule type: Karras, CFG scale: 7.0, Seed: 1683735652, Size: 512x256, Model hash: 6ce0161689, Model: v1-5-pruned-emaonly, Version: v1.10.1

この情報には、プロンプト「A professional landscape photograph of European scenery.」や、「Steps: 10」、「Model: v1-5-pruned-emaonly」などが含まれます。

プロンプトとStepsは、ex01_sd_basic.sh 内で設定しました。Stepsを大きくすると品質が上がります。ただし、数値に比例して生成時間も増えます。

sampler="DPM++ 2M" 
scheduler="Karras" 
width=512 
height=256 
steps=10                    # 生成ステップ数(多いほど高品質)
cfg_scale=7
seed=-1
api_url="127.0.0.1:7860"
output_file="ex01_sd_basic.png"

# 画像生成用プロンプト
prompt="A professional landscape photograph of European scenery."

画像生成APIの制御方法

本スクリプトでは、curlコマンドで Srable Diffusion web UI のAPIにアクセスします。

下記のように、JSON形式の生成用パラメータをHTTP POST送信し、受信データ・ファイルresponse.jsonに保存します。

curl -o response.json \
    -X POST "http://"${api_url}"/sdapi/v1/txt2img" \
    -H "Content-Type: application/json" \
    -d "{
        \"prompt\": \"$prompt\",
        \"sampler_name\": \"$sampler\",
        \"scheduler\": \"$scheduler\",
        \"width\": $width,
        \"height\": $height,
        \"steps\": $steps,
        \"cfg_scale\": $cfg_scale,
        \"seed\": $seed
    }"

受信完了後、response.jsonに含まれる画像データをjqコマンドで抽出し、base64 –decode で復号化した画像ファイルを保存します。

image_base64=$(jq -r '.images[0]' response.json)
echo "$image_base64" | base64 --decode > "$output_file"

生成画像の画質を改善する

画質を改善する方法はいくつかありますが、最も手軽なのは学習モデルの変更です。下図は、風景用モデルを使用した一例です。

学習モデルにarchitecture_Urban_SDlife_Chiasedamme_V6.0を使用した生成例

上図は、architecture_Urban_SDlife_Chiasedamme_V6.0を使用して生成しました。使用するには、下記からモデルをダウンロードします。

風景用(architecture_Urban_SDlife_Chiasedamme_V6.0):
https://civitai.com/models/128280/architectureurbansdlifechiasedammev60

ダウンロードした拡張子safetensorのモデルは、モデル保存用のフォルダに保存してください。Web UI の「Stable Diffusion checkpoint」のプルダウンメニューから選択できるようになります。プルダウンメニューに表示されないときは、すぐ右にあるRefreshボタンを押してください。

モデル保存用フォルダ:
~/stable-diffusion-webui/models/Stable-diffusion/

学習モデル(checkpoint)の切り替え

architecture_Urban_SDlife_Chiasedamme_V6.0は、事前な風景だけでなく、人工的な建物の描写能力に長けたモデルです。風景全般の生成に役立つでしょう。

architecture_Urban_SDlife_Chiasedamme_V6.0を使った生成例(steps=10)

建物のディテールを高めたいときは、ex01_sd_basic.sh 内のsteps=15以上に変更します。概ね比例して、生成時間も増加します。steps=15で10分、steps=40で25分くらいです(RAM 16 GBの場合)。

architecture_Urban_SDlife_Chiasedamme_V6.0を使った生成例(steps=15)

ただし、stepsを増やしすぎると、余計な処理を行うことがあるので、大きければ良いというものでもありません。

architecture_Urban_SDlife_Chiasedamme_V6.0を使った生成例(steps=40)

Promptを自動生成する

Srable Diffusion web UI の制御方法が分かれば、プロンプトの自動生成は簡単です。

風景画像用プロンプトの自動生成

ex02_sd_scenery.sh は、風景を示すプロンプトと、現在の月、現在時刻の時を組み合わせてプロンプトを自動生成し、Srable Diffusion web UI に渡すサンプル・プログラムです。

webui.sh を実行した状態で、下記を実行してください。

$ cd ~/bash/practical/stable_diffusion/
$ ./ex02_sd_scenery.sh 

現在の季節や時刻に応じた風景画像を連続生成します。停止は、[Ctrl]+[C]です。

実行した季節や時刻に応じた風景画像を生成する

下記はプロンプト生成部です。変数sceneries、month_unit、hour_unit内に、それぞれ風景、月、時間を代入しておき、プロンプトに組み込みます。

prompt=""
prompt+="A professional landscape photograph of scenery, "
prompt+="realistic DSLR quality, suitable for a calendar. "
prompt+="(A European "${sceneries[$(( $RANDOM % sceneries_num ))]}" "
prompt+=${month_unit}" "${hour_unit}"), "
prompt+="balanced cinematic composition with depth of field, natural colors, "
prompt+="wide-angle view, high resolution, realistic photo style. "

学習モデルの変更で画質向上する

もちろん、学習モデルの変更で画質の向上も可能です。下図は、 architecture_Urban_SDlife_Chiasedamme_V6.0 に変更した場合の一例です。

architecture_Urban_SDlife_Chiasedamme_V6.0 を使った生成例

次は人物の描画に長けた japaneseStyleRealistic_v20 に変更した場合の一例です。人物だけでなく、風景の生成も向上します。

学習モデルを変更して画質を改善した一例(japaneseStyleRealistic_v20)

人物画像の生成

次は、人物画像です。標準モデルv1-5-pruned-emaonlyで生成した画像の一例を下図に示します。一部の画像に、自然さを感じにくい部分があると思います。

標準モデル v1-5-pruned-emaonly は自然な人物画像を安定して生成することが苦手

※ご注意
本稿で示す「人物」とは全てAIによる生成画像であり、実在する人物を示すものではありません。また、上図の一例はAI生成能力を比較するためのものです。実在する人物に対する偏見や差別を意図したものではありません。「自然な人物」とは、あくまで平均的な人物像との比較表現であり、個性を否定する意図は一切ありません。もし、特定の人物画像や表現に対して不快な印象を持たれた方がいましたら、遠慮なく匿名にて連絡ください(ゲストブック ※匿名と明記ください)。

人物用の学習モデルで画質を向上する

モデルを変更することで、下図のような人物の自然な画像(個性に傾きが少ない画像)を生成できるようになります。

japaneseStyleRealistic_v20 を使用すれば、より自然な人物の画像が生成できる

学習モデル japaneseStyleRealistic_v20 は、下記からダウンロードし、フォルダ models → Stable-diffusion 内に保存します。

風景+人物用(japaneseStyleRealistic_v20):
https://civitai.com/models/56287/japanese-style-realistic-jsr

このモデルの特長は自然な日本人女性の画像生成です。このため、男性を指示しても女性が表示されることがあります。

自然な日本人女性の画像生成が得意な japaneseStyleRealistic_v20

日本人男性を画像生成したい場合は、 beautifulRealistic_v7 が良いでしょう。

人物用(beautifulRealistic_v7):
https://civitai.com/models/25494/beautiful-realistic-asians

自然な男性と女性の両方を生成する場合は beautifulRealistic_v7

どちらのモデルであっても西洋人の生成も可能です。やや東洋系の雰囲気が出ますが、私にとっては、むしろ自然な西洋人に見えます(筆者主観・偏見や差別を意図したものではありません)。

西洋人の男性と女性も生成可能な beautifulRealistic_v7

人物画像用プロンプトの自動生成

スクリプトは、ex10_sd_practical.sh です。webui.sh を実行した状態で、下記を実行してください。

$ cd ~/bash/practical/stable_diffusion/
$ ./ex10_sd_practical.sh 

生成には約22分の時間を要します(RAM 16GBモデル)。RAMの使用量が8GBを超えることがあります。RAM 8GBモデルの場合は、メモリーの節約と生成解像度を下げるといった対策が必要です。

[PR]書籍 Linux コマンド & シェルスクリプト入門

Linuxコマンドや Bashスクリプトの入門書を書かせていただきました。画像生成AIの応用記事はありませんが、少ない学習量でLinuxコマンドやBashスクリプトを使いこなすことを目標にした一冊です。興味がありましたら、下記から目次をご覧いただければと思います。

Raspberry Pi 5 4GB RAM モデルでの実行結果

本稿で紹介した画像生成には、5GB 以上のRAMを使用します。このため、RAM 4GB モデルの場合は RAM圧縮 とSDカードへのスワップが必須です。また、生成時間も長くなります。

解像度を384×256に下げる

下図は、RAM容量 4GB のモデルでの実行結果の一例です。生成時間短縮のため、解像度は384×256にしました。

RAM容量が 4GB のモデルでの実行結果

生成時間は 16GB モデルの60倍

OSにLite版を使用し、Stable Diffusion のオプションでメモリー節約を設定し、RAM圧縮を設定し、swappinessを10%まで下げたとしても、画像生成中にSDメモリーカードへのスワップが発生します。下記はの画像を Raspberry Pi 5 4GB RAM モデルで生成した時の生成時間です。16 GB モデルの約60倍の時間がかかりました。

生成回数生成時間16GB 比較
1回目6時間 53分83 倍
2回目5時間 22分64 倍
3回目4時間 31分54 倍
4回目5時間 04分61 倍

動作の様子はLEDで確認する

4GB RAMモデルでの画像生成中は、コマンドの実行も難しくなります。そこで、LEDの点滅具合で負荷を確認します。

スワップ動作時は、LEDが点灯している時だけ画像生成していると考えれば良い

生成中は、0.数秒~数秒の間隔でLEDが瞬時的に点灯し、消灯するような動作となります。

消灯しっぱなしの場合や、消灯している秒数が長い場合は、スワップのIO待ち時間の発生で、画像生成の方は進んでいないことを示しています。この場合、丸1日、かけても終了しません。解像度を下げてSDカードへのメモリスワップを低減してください。

なお、SDカードへの書き込み頻度が高いので、すぐにSDカードの書き換え寿命に至ってしまう場合もあります。スワップ先としては、ドライブレコーダー用の高耐久SDカードや、SSDなど、書き換え耐性の高いドライブの使用を推奨します。もしくは、より少ないメモリーで動作する Stable Diffusion を使用してください。

注意事項

画像生成AIは、実在する写真のような画像を生成することができます。このため、利用には社会のルールや規則を守ることはもちろんのこと、未だ規則化されていない部分の配慮も必要です。

とくに、偶発的に倫理性を損なう画像が生成される懸念や、偶発的に実在する人物に似た画像が生成される懸念、性別や容姿などに偏見や差別を含んでしまう懸念などがあります。筆者が作成したスクリプトにおいても、そういった画像が生成される場合がありますので、生成した画像の取り扱いには十分に注意してください。

また、自分自身の倫理観が社会とずれている部分や、時代とともに変わっている部分、配慮不足といったことも発生し得ます。

本稿の執筆時には、これらについて注意しながら作成しましたが、そのような点が残存する可能性がある点に、ご理解をいただけるよう、お願いいたします。もちろん、ご指摘いただければ、本稿の趣旨を損なわない範囲で修正いたします。

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