見出し画像

Stable Diffusion で作成したPNGファイルのサブネイルとプロンプト情報を一覧表形式で表示させてみた Ubuntu + exiftool + convert + perl

絵は描けないけど好きな私。AIで画像を生成して楽しんでいます。最近は流行りの Stable Diffusion を使って夜な夜な画像を生成していますが、作成した画像の数が結構数が溜まってきました。AIを使って画像を生成する際には、様々な条件やプロンプトを指定する必要があります。好みの画像にするには良い結果が得られた画像の条件を参考にして次の条件を決めていくのですが、その条件は生成されたPNGファイルにメタデータとして登録されています。そのため、次の画像生成時にその条件を読み出して活用しています。ただ、画像の数が多くなると1つずつ画像を確認するのは結構めんどい。それで少し工夫することにしました。
今回は、貯めた画像のプロンプトや設定条件を一覧表で表示する仕組みを考案しました。サムネイル画像とテキストデータをhtmlで記述してブラウザで表示させることができるようにしました。

サンプル画像

処理の主な流れ

(1)ファイル選択(zenity)
(2)exiftool でメタデータをテキスト抽出
(3)perl でテキストのメタデータからプロンプト情報など整理
(4)convert でサムネイル生成
(5)perlでhtml生成
(6)chromeで表示

作った bash スクリプトを下記に示す。

#!/bin/sh
# Create a list or table of PNG files generated with Stable Diffusion, including thumbnails and prompts.

PNGFILE=$(zenity --file-selection --multiple --separator='\n' --filename="/home/hoge/ピクチャ/Stable_Diffusion"  --title "pngデータを選択" )
echo $PNGFILE > /home/hoge/tmp/pngfile_list.txt

pngfile_list_path="/home/hoge/tmp/pngfile_list.txt"
rm /home/hoge/tmp/sd_png.txt

while IFS= read -r line || [[ -n "$line" ]]; do

    /usr/bin/exiftool -Filename -Parameters "$line" | \
	/home/hoge/perl/disp_stable_diffusion_png_tab_sep_mul_exiftool.pl \
	    >> /home/hoge/tmp/sd_png.txt
    thumbdir=$(echo "$line" | /home/hoge/perl/png_dirname.pl)
    thumbname=$(echo "$line" | /home/hoge/perl/png_filename.pl)
    if [ ! -d $thumbdir ] ; then
	mkdir $thumbdir
    fi
    pngthumbname="${thumbdir}/${thumbname}"
    /usr/bin/convert "$line" -resize "100x100^" "$pngthumbname"

done < "$pngfile_list_path"

cp -f /home/hoge/tmp/sd_png.txt "$thumbdir"
cat "${thumbdir}/sd_png.txt" | /home/hoge/perl/png_list_stable_diffusion.pl > "${thumbdir}/sd_png_list.html"
/usr/bin/google-chrome "${thumbdir}/sd_png_list.html"

上記 bash スクリプトについての説明
ファイル選択は zenity を普通に使うだけなので説明は割愛。exiftool は余計な情報を表示させないようオプション( -Filename -Parameters) を指定する。exiftool は複数の画像ファイルを指定できるが、大量に指定した場合の挙動に不安があったので、今回は1つずつ画像ファイルを読み出して処理している。exiftool のテキスト出力はそのままでも読めるが、ここでは自作の perl スクリプト「disp_stable_diffusion_png_tab_sep_mul_exiftool.pl」に流し込んで Seed値やサンプラー、プロンプトなどの設定値をタブ区切りのテキストにしてファイルに保存する。それと同時に convert を使ってサムネイル用の画像も生成する。これらの処理を選択した画像の数だけ繰り返したあと、自作の「png_list_stable_diffusion.pl」でHTMLコードを生成し Google chrome を起動して表示させている。

PNGメタ情報から Stable Diffusion で使うプロンプト等を取り出すスクリプト

(disp_stable_diffusion_png_tab_sep_mul_exiftool.pl)
この perl スクリプトは前述の bash スクリプト中で使用している。コードは以下。処理の順番とか最適ではない部分があるかもしれないが、これは元々 pngcheck 用に書いたコードを exiftool 用に改変したことが原因。普通のテキスト処理なので特筆すべきものはない。手順くらいは参考になるかな。

HTMLコード生成

(png_list_stable_diffusion.pl)
この perl スクリプトも前述の bash スクリプト中で使用している。これも普通のテキスト処理なので特筆すべきものはない。手順だけ参考にしてください。

その他の perl コード

(png_dirname.pl, png_filename.pl)
この perl スクリプトも前述の bash スクリプト中で使用している。サムネイルやHTMLの保存先を生成。

作っていて気づいたこと

ChatGPTさんにPNGのメタデータをコマンドラインでテキスト出力する方法を聞いたら、 pngcheck と exiftool を教えてくれた。 pngcheck の方が使いやすそうだったので最初は pngcheck でスクリプトを書き始めたが、テストの際、pngcheck では一部のPNGファイルからメタデータを抽出できないことがわかり、 exiftool に切り替えた。某投稿サイトでメタデータが表示できないことが時々あるが、もしかしたら pngcheck を使っているのかもしれない。
また、今回作成したスクリプトは Stable Diffusion を AUTOMATIC1111 で使って生成したPNG画像を対象にしている。
当初、一覧表はスプレッドシートにしようと思っていた。Ubuntu なので候補は libreoffice calc か Google スプレッドシートになるが、セルに画像を表示させることができなかった(超めんどそう)。仕方がないので力技でHTMLにしたが、思ったより簡単にできたのでこれでよしとした。ただ・・・

課題

前述の png_list_stable_diffusion.pl 1ページにすべて表示させる単純なコードなので画像の数が多すぎるとブラウザが対応できず結果的に表示ができない。

おまけ

夜な夜な生成している怪しげな画像たち


いいなと思ったら応援しよう!