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

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

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

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

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

Twitter にあげた変遷動画の様子

動作環境 & 仕様

動画を作成する手順は以下のとおりです。

作成手順

  1. 合成する各世代の画像ファイルをダウンロード
  2. 各世代を示す文字列の入った画像を作成(XXXXgen)
  3. 各世代の画像ファイルに対応する文字列画像をオーバレイ
  4. 各画像ファイルを動画結合

Windows 上で動く Linux である WSL2 環境で作っています。bash などシェルが動く環境であれば問題ないでしょう。画像の生成、合成には ImageMagick パッケージ、画像の動画への変換には ffmpeg を用いています。

1. 各世代の画像ファイルダウンロード

こちらの手順については省略します。数千枚の画像を機械的にクロールして取得することはサーバに負担をかけ、迷惑になるかもしれないので、ここでは紹介しません。(そもそも 2021/01/26 現在は公開されていません)

各世代の第 1 位の画像を取得してくるとファイル名として

  • 1_0.png
  • 2_0.png
  • 3_0.png
  • 99_0.png
  • 100_0.png
  • 101_0.png

といった形で取得できます。

プロモーション広告

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 世代までできているようです。

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