「遺伝的アルゴリズムで最高にエッチな画像を生み出そう!!」という企画の変遷動画を作るシェルスクリプト

プログラムffmpeg,imagemagick,シェルスクリプト

2021 年の始めごろから遺伝的アルゴリズムを利用して、参加者投票を行うことでお題の画像を生成しようという試み「遺伝的アルゴリズムで最高にエッチな画像を生み出そう!!」が行われています。

2021/01/26 現在、7920 世代まできている

遺伝的アルゴリズムで画像生成する仕組みは企画ページを参照してもらうとして、そこでは各世代の 1 位から 5 位の画像を公開していました(2021/01/26 現在はデータ転送量の問題で非公開の模様)。その画像を拝借して各世代の時間変化(世代間変化)をアニメーションする動画を作ったので、作り方をまとめておきます。

プロモーション広告

2. 各世代を示す文字列の入った画像の作成

何世代の画像なのかわかりやすくするために、世代を示す数字を表示することにします。そのためにまず数字だけ入った画像を一旦生成します。下の画像は第 1 世代を示す “0001gen" という文字列を透過背景の左上に白文字で入れています。

今回提供されている画像の大きさは 200×250 サイズらしいので、その大きさに合わせて画像を生成します。

for num in `seq 1 6000`
do
    filename=`printf "num_%04d.png" ${num}`
    convert -size 200x250 -fill "#FFFFFF" -background none -pointsize 20 caption:`printf "%04dgen" ${num}` $filename
    echo $num
done

まず seq 1 6000 をつかって 1 から 6000 までループさせます。さらに 3 行目に printf コマンドを使うことで数字を 0 埋め 4 桁にしたファイル名を指定します。convert コマンドを使うことで左上に pointsize 20, #FFFFFF 色で fill した画像を生成しています。ファイル名は num_XXXX.png です。

3. 各世代を示す文字列画像を元画像にオーバレイ

先の画像と元の画像を組み合わせます。下のような画像を生成します。

for num in `seq 1 6000`
do
    formatnum=`printf "%04d" ${num}`
    composite ./num_${formatnum}.png ./${num}_0.png ./overnum_${formatnum}.png
    echo $num
done

ここでは composite コマンドを使用しています。オーバレイ合成した画像は overnum_XXXX.png というファイル名にしています。

4. 各画像ファイルを動画に結合

各世代を示す文字列をオーバレイした画像を動画に結合します。ffmpeg コマンドを利用します。

ffmpeg -r 45 -i ./overnum_%04d.png -vcodec libx264 -pix_fmt yuv420p -r 60 anim45fps.mp4

ここでは画像の読み込みフレーム数を 45 fps に設定し、最終的には 60 fps の動画として吐き出しています。Twitter にあげた動画が微妙に潰れているのはこの fps によるものな気がしますが、動画長さの問題でこのような数値を使っています。

プロモーション広告

まとめ

Linux シェルを用いて連続画像から動画を生成する方法の紹介でした。「遺伝的アルゴリズムで最高にエッチな画像を生み出そう!!」という企画はまだ続いており、この動画制作時には 5700 世代程度だったのですが、2021/01/26 現在では 7900 世代までできているようです。

動画には訳のわからないカラフルで無秩序な図形の集合体から段々と乳房のようなものが形成され、それが一旦消えてからまた現れ始めて、段々と体のようなものも生まれてくる……という非常に興味深い遷移をしているので、今後も注目したいと思います。