So-net無料ブログ作成
  • ブログをはじめる
  • ログイン
前の8件 | -

ランダムに沢山のカラフルな文字を描画するHTML5 Canvasプログラム。 [HTML5 ジェネレーティヴ アート]

Canvas Area.
Canvas_Character Generator_(2019_01_09)_1.png ランダム文字描画プログラムで生成した文字アート画像。

" Draw " ボタンを押すとランダムに沢山のカラフルな文字を生成、描画します。
" HTML5 " の " Canvas " 要素で描画しています。
Canvas内を色付きの文字で埋め尽くすだけの、とても単純なプログラムですが、中々にアートに見えます。

当該プログラムのソース コードは御自由に切り貼りして利用して下さって結構です。

" Yahoo!ボックス " サーヴィスにソース コードのhtml ファイルをアップロードして公開させて頂きます。
次のリンク先のページにある " ダウンロード " ボタンを押すと当プログラムのhtml ファイルをダウンロード出来ます。

[ソース コード]
Yahoo!ボックス: https://yahoo.jp/box/w6qS-t



nice!(0)  コメント(0) 

数式を書くのに便利な "LibreOffice Writer" [ソフトウェア]

数式を書くには、オープン ソースのドキュメント編集アプリケーション ソフトウェアである " LibreOffice Writer " が手軽でとても良いですね。

素早く数式を書く事が出来ますし、数式を書いたドキュメントをPDF ファイルとしてエクスポートして、オープンソースの画像編集アプリケーション ソフトウェアである " GIMP " で画像として編集出来ます。
Mathematical Expression_1_(2019_01_08)_resized_1 白色の背景に黒色の文字で幾つかの関数が書かれた画像。
https://c1.staticflickr.com/5/4877/46599110382_485f6d3159_o.png
これがLibreOffice Writerに数式オブジェクトとして幾つかの関数を書いて画像化した例です。
・ロジスティック関数(Logistic Function)
・シグモイド関数(Sigmoid Function)
・ハイパボリック タンジェント(Hyperbolic Tangent | tanh x)
・Swish関数(Swish Function)

"LibreOffice" のウェブサイトのURL:
https://ja.libreoffice.org

nice!(1)  コメント(0) 

最高の超解像AIを実験、公開。 [超解像プログラム]

2018年12月27日現在、最高峰と思われる超解像AI プログラムが、 " SRGAN " (及びその派生型)です。
オリジナルのSRGANは2016年9月に論文が発表されたものです。

SRGANは " Super-Resolution Generative Adversarial Networks " の事で、GANを利用した超解像を学習させます。
写真や絵などの入力画像を縦横4倍、画素数にして16倍まで非常に綺麗に拡大出来ます。
昔よく使われていた " Bicubic補間法 " などでは復元出来なかった細部の情報を説得力のある形で推定、復元出来ます。

通常のGANではGenerator(生成器)とDiscriminator(識別器)をそれぞれ学習させます。
Generatorは、より本物に近い画像を生成出来るように、ネットワークのパラメーターを更新して行きます。
Discriminatorは、入力画像が本物の画像なのか、それともGeneratorが生成した画像なのかをより正確に弁別出来るように、ネットワークのパラメーターを更新して行きます。
パラメーターの更新は誤差逆伝播法(backpropagation)に基づいて行われます。

私はGitHubにて公開されている " srgan " をfork及びcloneして変更を施しました。
この " srgan " はTensorFlowTensorLayerによる実装となっています。
以下に私がforkして改造したSRGANのGitHub リポジトリーへのリンクを載せます。


[GitHub リポジトリー]
私が改造した " SRGAN " の "GitHub" リポジトリーのURL:
https://github.com/ImpactCrater/srgan


[変更点1: Group Normalization]
元のSRGANではBatch Normalization層が使われていましたが、Batch Normalizationは各チャンネル間の関連性が無視されてしまいます。
すると複数のチャンネル間の関連性による特徴が損なわれてしまいます。
また、バッチ サイズが小さい場合には正規化が巧く作用しないという弱点があります。
結果として、出力画像に白色の靄のようなアーティファクトが出現してしまうという問題がありました。
これを避ける為、Generator及びDiscriminatorに於いて、全てのBatch Normalization層を除去し、Residual Unitの直前に単一のGroup Normalization層を導入致しました。
Group Normalizationでは、バッチ単位ではなく、チャンネルを幾つかのグループに分割し、チャンネルのグループ毎に正規化します。
これにより、バッチ数が少なくても正規化が効きます。
また、各チャンネル間の関連性も保たれます。
因みに全チャンネルに跨って正規化するLayer Normalizationの場合は、余り役立たないにも関わらず大きな値を示すチャンネルがあった際に、他の全てのチャンネルの値を圧縮されてしまいます。

参照:
"ニューラルネットの新しい正規化手法 Group Normalization の高速な実装と学習実験 | ALBERT Official Blog" のURL:
https://blog.albert2005.co.jp/2018/09/05/group_normalization/


[変更点2: Swish活性化関数]
活性化関数ReLU (Rectified Linear Unit | ramp function)から " Swish " に変更致しました。

ReLU(x)=max(0, x)

Swish(x)=x*Sigmoid(a*x)
Sigmoid(x)=1/(1+e^(-a*x))

TensorFlowでは tf.nn.swish(x) が使えます。

Swish関数及びその導関数は、ReLUと異なり、原点に於いて連続で、非単調性の関数です。
また、Swish関数はReLUと異なり、負の値も出力されます。


[変更点3: ネットワーク増大]
GeneratorとDiscriminatorのResidual Blockの数を増加させました。
また、Generatorのフィルターの数を増加させました。
計算時間が増えてしまいましたが、表現力が増強されます。


[変更点4: Relativisitic GAN]
Relativisitic GANという方式を採用致しました。
Relativisitic GANでは、Discriminator本物の高解像度画像(real)データがGeneratorの生成画像(fake)データよりも本物らしい確率が1に近付くように学習します。
Generatorは逆に、自身の生成画像(fake)データが本物の高解像度画像(real)データよりも本物らしい確率が1に近付くように学習します。
最小化問題にする為に、確率の出力値の自然対数を取ります。
log(1)=0 が目標となります。
Relativistic GANは他の方法よりも安定した学習が可能で結果も高品質であるとの事です。
SRGAN_Loss Function_(2019_01_16)_1_cropped_1 "Relativistic Standard GAN" の2つの損失関数の曲線のグラフが描かれている。 2つの曲線はy軸について左右対称である。
https://c1.staticflickr.com/5/4830/31813237887_8b38ede2ce_o.png
Relativisitic Standard GANでは、Discriminator及びGeneratorのAdam optimizerがこの損失関数の値を最小化しようと切磋琢磨します。

SRGAN_SS_(2019_01_20)_3_edited_1 "Relativistic Standard GAN" の損失値の折れ線グラフが上下2段に分けられて描かれている。
https://c2.staticflickr.com/8/7869/46085701114_4f766a9aa6_o.png
Relaticistic Standard SRGANの学習の様子。
損失値が0.7周辺で安定して学習が進んでいます。
g_gan_lossはMSE loss及びVGG lossと合算する為に1/10にしてあります。

参照:
論文アーカイヴ ウェブサイトの "Relativistic Discriminator" に関するページのURL:
https://arxiv.org/abs/1807.00734


[変更点5: 画像の読み込み]
学習させる画像群について、指定したディレクトリー以下にあるサブディレクトリーまで再帰的に検索して読み込むようにしました。
画像はepoch毎にランダムにシャッフルされ、ランダムな位置でクロップされます。
全画像ファイル数がミニバッチの数で割り切れない場合には、不足分は既存の学習用画像の中からランダムに再度読み込まれます。
また、学習中にも画像を次々に追加出来るようにしました。
指定したディレクトリー以下に、画像ファイルもしくは画像ファイルが入ったフォルダーを放り込むだけで、次のepoch開始時に読み込まれます。


[更なる画質向上について]
JPEGなどの圧縮ノイズ低減の学習は行わせていません。
もし圧縮ノイズなどの画質劣化を除去させたい場合は、OpenCVを追加し、 " main.py " を編集して、学習用画像を縮小する際にランダムにJPEG圧縮させるコードを追加してみて下さい。
以下はJPEG圧縮するコードの例です。
encode_parameters = [int(cv2.IMWRITE_JPEG_QUALITY), quality]
result, encoded_image = cv2.imencode('.jpg', image, encode_parameters)

" quality " には圧縮の品質を1から100で入力します。数値が高いほど低圧縮、高品質、数値が低いほど高圧縮、低品質です。
" result " は成功の真偽値です。
これにより圧縮前後の対応関係を学習出来るようになる筈です。
加えて、ガウス暈しもランダムで加えると、シャープネスを上げる事も出来るでしょう。


[プログラムの実行について]
このプログラムで学習を実行するには24GB以上のメモリーが必要です。
CPUまたはNVIDIAのGPUによるCUDAで実行出来ます。
4,000枚の高解像度画像を用いて低目な性能のCPUで実行する場合、第1段階のGeneratorの学習処理に24時間以上、第2段階のGANの学習処理に1週間以上の時間が掛かります。
高性能なCPUであれば1/4以下、高性能なGPUによるCUDAでしたら、おそらく1/10から1/100くらいの時間で完了します。


因みに私の環境ではヴィデオ カードのVRAMの容量が足りないのでCPUだけで学習させます。
TensorFlowのバイナリーはSSE4.1, SSE4.2, AVXが利用できないので、TensorFlowをCPU拡張命令のSSE4.1, SSE4.2, AVXを使用するオプション付きでビルドしました。
" -march=native " の " --config=opt " なので自動的に拡張命令対応となります。


私の実行環境は、以下の通りです。

・CPU: Intel Core i7-3770T
・Memory: DDR3 SDRAM 8GB * 4 = 32[GB]
・Video Card: Palit GeForce GTX 750 KalmX (Fanless)
・HDD: 3[TB], 7200[rpm], Cache 64[MB]
・OS: Ubuntu 16.04 LTS

・CUDA 9.0.176
・Python 3.5
・OpenJDK 1.8.0_191
・Bazel 0.18.0
・TensorFlow 1.12.0-rc0 (build from source)
・TensorLayer 1.11.1
・easydict
・tkinter



[Wasserstein GAN]
以下は余談となりますが、私は実験で、Sigmoid cross entropyを用いた損失関数ではなく、Wasserstein距離を用いた損失関数を利用する、 " WGAN " (Wasserstein GAN)の方式も試しました。
WGAN方式では真贋判定のDiscriminatorではないので、 " Critic " (批評家、評論家という意味)と呼ぶようです。
WGANでは、Criticはデータ分布とGeneratorの出力分布間のWasserstein距離をより正確に近似するように学習し、Generatorは2つの分布間のWasserstein距離をより小さくするように学習します。

より具体的には、Generatorは自身が生成した画像(fake)をCriticに見せた際のCriticの出力値(logits_fake)を最大化しようとします。
Criticは本物の高解像度画像(real)を見た時の出力値(logits_real)とGeneratorの生成画像(fake)を見た時の出力値(logits_fake)の差(Wasserstein距離)を最大化しようとします。
これを最小化問題にする為に両方の式の符号を反転します。
以下はTensorFlowでのWGANの例です。
generator_loss = - tf.reduce_mean( logits_fake )
critic_loss =  - (tf.reduce_mean( logits_real ) - tf.reduce_mean( logits_fake ))

generator_optimizer = tf.train.RMSPropOptimizer( learning_rate ).minimize( generator_loss, generator_variables )
critic_optimizer = tf.train.RMSPropOptimizer( learning_rate ).minimize( critic_loss, critic_variables )

上記は実際のコードと同一ではありませんが、概ねこの様な形となります。

" SRGAN_Wasserstein " では、Discriminatorの出力層のシグモイド活性化関数が除去されています。
WGANではAdam optimizerだと学習が不安定になるのでRMSProp optimizerが代わりに使用されます。


SRGANの学習にWasserstein距離を用いる場合、CriticがLipschitz連続な関数である必要があるそうです。
その為にCriticに対して以下の方法を試しました。

1: 損失関数に重みのL2ノルムを加算するweight decay(荷重減衰)を使用。

2: 勾配の値自体を強制的に小さな制限値で刈り込むgradient clippingを使用。
勾配を計算させた後、勾配の値を+-1.0で刈り込みます。

3: 原始的な方法ですがweight値を強制的に小さな制限値で刈り込むweight clippingを使用。
この方法はweight値が二極化してしまい、Criticの表現力が少し低下する問題があります。

上記のどの方法も、勾配爆発と勾配消失に陥り、うまく学習が進みませんでした。
強いて言えば、Weight Clippingが最も良好でしたが、それでも100時間を超えた頃から損失値が暴れ始め、途中で終了させました。

nice!(1)  コメント(0) 

ピーマンの写真と餡蜜の写真。 [写真とカメラ]

Bell Pepper_(2018_12_15)_1_resized_1 皿に置かれた2個の緑色のピーマンを撮影した写真。 頭を上向きにして置かれている。
https://c1.staticflickr.com/5/4908/46274087342_24fd4ae77c_o.png
艷やかな緑色のピーマンを撮影した写真です。

Bell Pepper_(2018_12_15)_2_resized_1 皿に置かれた2個の緑色のピーマンを撮影した写真。 頭を下向きにして置かれている。
https://c1.staticflickr.com/5/4904/32452322698_507c70ec2a_o.png

Anmitsu_(2018_12_18)_1_resized_1 やや椀形の更に盛られた餡蜜を撮影した写真。
https://c1.staticflickr.com/5/4915/46312873282_fcc1ce1611_o.png
こちらは梅林堂で買った美味しい餡蜜(あんみつ)です。
私は求肥(ぎゅうひ)が大好きなのです。

これらの写真もいつものように、SRGANの人工ニューラル ネットワークに食べさせます。

nice!(3)  コメント(0) 

東京、丸の内のビルディングの写真と、樹木の幹の写真。 [写真とカメラ]

Tokyo_(2018_12_14)_1_resized_1 東京、 "丸の内" のビルディングを撮影した写真。 幾棟かの天空を突くような高層ビルヒングが並んでいる。
東京駅の近く、 " 丸の内 " の景観を撮影した写真です。
綺麗な高層ビルディング街ですね。

Trunk_(2018_12_14)_1_resized_1 樹木の幹を撮影した写真。 樹皮は鱗状になっており、左下には緑色の蔦の葉が見える。
https://c1.staticflickr.com/5/4891/46261458462_e8ce10127b_o.png
上野恩賜公園周辺の樹木の幹を撮影した写真です。

nice!(2)  コメント(0) 

クッキーの写真と、切り花を撮影した写真。 [写真とカメラ]

Cream Sandwich Cookie_(2018_12_11)_2_resized_1 クリーム サンドウィッチ クッキーを撮影した写真。 上下の茶色のクッキーの間にクリームが挟まれている。
https://c1.staticflickr.com/5/4836/44457480010_bd8c90c2a1_o.png
クリーム サンドウィッチ クッキーを撮影した写真です。
SRGANという人工知能の人工ニューラル ネットワークに食べさせました。

Flower_(2018_12_12)_2_resized_1 左から順に、紫色と黄色と淡いピンク色の切り花と、赤色の小振りな実の生っている植物が黒い紙の上に上向きに寝かされて並べて置かれた様子を撮影した写真。
https://c1.staticflickr.com/5/4918/45564656944_990b624f21_o.png
花や実はとても美しく、艶めいています。

Flower_(2018_12_12)_1_resized_1手前から順に、紫色と黄色と淡いピンク色の切り花が黒い紙の上に左向きに寝かされて並べて置かれた様子を撮影した写真。
https://c1.staticflickr.com/5/4810/32416494958_39b81f41e3_o.png
テクスチャーが美しいですね。

nice!(4)  コメント(0) 

ランダム ノイズによる自動生成アート画像。 [プログラミング]

コマンドライン インターフェイスの素晴らしき画像操作アプリケーション ソフトウェアである " ImageMagick " にてカラフルな模様自動生成致しました。
0000 カラフルな斑模様。 雲の様な斑模様と複雑な色の境界線が重なり合っている。
https://c1.staticflickr.com/5/4871/32378951038_c8d9c9bf70_o.png

0001 カラフルな斑模様。 雲の様な斑模様と複雑な色の境界線が重なり合っている。
https://c1.staticflickr.com/5/4861/45527344404_356946988f_o.png
パターンは上下左右が繋がっているので、タイル状に並べても継ぎ目が出来ません。 Perlin noise (パーリン ノイズ)的なパターンの応用です。

簡単に言うと、半径が2^0から2^7までのガウス暈しを適用したランダム ノイズの複数のレイヤーを合成して生成したものです。

何百枚でも連続自動生成出来ますが、1枚生成するのに多少の時間が掛かります。
ImageMagickの " -clone, +clone, -delete, +delete " などを使用して処理を効率化しています。

暈し半径を大きくすると、16bit/チャンネルの精度で処理していても、色の境界線が誤差により不自然にギザギザしてしまいますので、半径32画素以上の暈しは、半径32画素分のガウス暈しを複数回適用して処理しております。

今回生成した画像を数十枚 " SRGAN " という4倍超解像AIの人工ニューラル ネットワークに食べさせます。

" ImageMagick " の使用方法の解説ウェブサイトのURL:
http://www.imagemagick.org/Usage/

画像を生成する為のLinuxのコマンドを掲載致します。
ImageMagickはQ16 (内部16bit精度)ヴァージョンを事前にインストールして置いて下さい。
mkdirで作業ディレクトリーに " images " というフォルダーを作成し、そこへ生成画像を連番で保存するようになっております。
以下の全文をコピーして " 端末 " にペーストすると16枚の1024 x 1024画素の画像の生成を開始します。
mkdir -p ./{\
images,\
}
\
\
offset=0; \
counter=0; \
for i in `seq 1 16`; \
do \
\
convert \
\
\-size 1024x1024 xc: \
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x32 -auto-level \) \
\( +clone -channel G \
-virtual-pixel tile -blur 0x32 -auto-level \) \
+swap +delete \
\( +clone -channel G \
-virtual-pixel tile -blur 0x32 -auto-level \) \
+swap +delete \
\( +clone -channel G \
-virtual-pixel tile -blur 0x32 -auto-level \) \
+swap +delete \
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x32 -auto-level \) \
\( +clone -channel G \
-virtual-pixel tile -blur 0x32 -auto-level \) \
+swap +delete \
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x32 -auto-level \) \
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x16 -auto-level \) \
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x8 -auto-level \) \
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x4 -auto-level \) \
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x2 -auto-level \) \
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x1 -auto-level \) \
\
\( -clone 1,2 -compose softlight -composite \) \
\( -clone 1,9 -compose dissolve -define compose:args=50 -composite \) \
-delete 9 \
\
\( -clone 9,3 -compose softlight -composite \) \
\( -clone 9,10 -compose dissolve -define compose:args=25 -composite \) \
-delete 9,10 \
\
\( -clone 9,4 -compose softlight -composite \) \
\( -clone 9,10 -compose dissolve -define compose:args=12.5 -composite \) \
-delete 9,10 \
\
\( -clone 9,5 -compose softlight -composite \) \
\( -clone 9,10 -compose dissolve -define compose:args=6.25 -composite \) \
-delete 9,10 \
\
\( -clone 9,6 -compose softlight -composite \) \
\( -clone 9,10 -compose dissolve -define compose:args=3.125 -composite \) \
-delete 9,10 \
\
\( -clone 9,7 -compose softlight -composite \) \
\( -clone 9,10 -compose dissolve -define compose:args=1.5625 -composite \) \
-delete 9,10 \
\
\( -clone 9,8 -compose softlight -composite \) \
\( -clone 9,10 -compose dissolve -define compose:args=0.78125 -composite -equalize \) \
-delete 1-10 \
\
\
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x32 -auto-level \) \
\( +clone -channel G \
-virtual-pixel tile -blur 0x32 -auto-level \) \
+swap +delete \
\( +clone -channel G \
-virtual-pixel tile -blur 0x32 -auto-level \) \
+swap +delete \
\( +clone -channel G \
-virtual-pixel tile -blur 0x32 -auto-level \) \
+swap +delete \
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x32 -auto-level \) \
\( +clone -channel G \
-virtual-pixel tile -blur 0x32 -auto-level \) \
+swap +delete \
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x32 -auto-level \) \
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x16 -auto-level \) \
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x8 -auto-level \) \
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x4 -auto-level \) \
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x2 -auto-level \) \
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x1 -auto-level \) \
\
\( -clone 2,3 -compose softlight -composite \) \
\( -clone 2,10 -compose dissolve -define compose:args=50 -composite \) \
-delete 10 \
\
\( -clone 10,4 -compose softlight -composite \) \
\( -clone 10,11 -compose dissolve -define compose:args=25 -composite \) \
-delete 10,11 \
\
\( -clone 10,5 -compose softlight -composite \) \
\( -clone 10,11 -compose dissolve -define compose:args=12.5 -composite \) \
-delete 10,11 \
\
\( -clone 10,6 -compose softlight -composite \) \
\( -clone 10,11 -compose dissolve -define compose:args=6.25 -composite \) \
-delete 10,11 \
\
\( -clone 10,7 -compose softlight -composite \) \
\( -clone 10,11 -compose dissolve -define compose:args=3.125 -composite \) \
-delete 10,11 \
\
\( -clone 10,8 -compose softlight -composite \) \
\( -clone 10,11 -compose dissolve -define compose:args=1.5625 -composite \) \
-delete 10,11 \
\
\( -clone 10,9 -compose softlight -composite \) \
\( -clone 10,11 -compose dissolve -define compose:args=0.78125 -composite -equalize \) \
-delete 2-11 \
\
\
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x32 -auto-level \) \
\( +clone -channel G \
-virtual-pixel tile -blur 0x32 -auto-level \) \
+swap +delete \
\( +clone -channel G \
-virtual-pixel tile -blur 0x32 -auto-level \) \
+swap +delete \
\( +clone -channel G \
-virtual-pixel tile -blur 0x32 -auto-level \) \
+swap +delete \
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x32 -auto-level \) \
\( +clone -channel G \
-virtual-pixel tile -blur 0x32 -auto-level \) \
+swap +delete \
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x32 -auto-level \) \
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x16 -auto-level \) \
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x8 -auto-level \) \
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x4 -auto-level \) \
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x2 -auto-level \) \
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x1 -auto-level \) \
\
\( -clone 3,4 -compose softlight -composite \) \
\( -clone 3,11 -compose dissolve -define compose:args=50 -composite \) \
-delete 11 \
\
\( -clone 11,5 -compose softlight -composite \) \
\( -clone 11,12 -compose dissolve -define compose:args=25 -composite \) \
-delete 11,12 \
\
\( -clone 11,6 -compose softlight -composite \) \
\( -clone 11,12 -compose dissolve -define compose:args=12.5 -composite \) \
-delete 11,12 \
\
\( -clone 11,7 -compose softlight -composite \) \
\( -clone 11,12 -compose dissolve -define compose:args=6.25 -composite \) \
-delete 11,12 \
\
\( -clone 11,8 -compose softlight -composite \) \
\( -clone 11,12 -compose dissolve -define compose:args=3.125 -composite \) \
-delete 11,12 \
\
\( -clone 11,9 -compose softlight -composite \) \
\( -clone 11,12 -compose dissolve -define compose:args=1.5625 -composite \) \
-delete 11,12 \
\
\( -clone 11,10 -compose softlight -composite \) \
\( -clone 11,12 -compose dissolve -define compose:args=0.78125 -composite -equalize \) \
-delete 3-12 \
\
\
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x32 -auto-level \) \
\( +clone -channel G \
-virtual-pixel tile -blur 0x32 -auto-level \) \
+swap +delete \
\( +clone -channel G \
-virtual-pixel tile -blur 0x32 -auto-level \) \
+swap +delete \
\( +clone -channel G \
-virtual-pixel tile -blur 0x32 -auto-level \) \
+swap +delete \
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x32 -auto-level \) \
\( +clone -channel G \
-virtual-pixel tile -blur 0x32 -auto-level \) \
+swap +delete \
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x32 -auto-level \) \
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x16 -auto-level \) \
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x8 -auto-level \) \
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x4 -auto-level \) \
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x2 -auto-level \) \
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x1 -auto-level \) \
\
\( -clone 4,5 -compose softlight -composite \) \
\( -clone 4,12 -compose dissolve -define compose:args=50 -composite \) \
-delete 12 \
\
\( -clone 12,6 -compose softlight -composite \) \
\( -clone 12,13 -compose dissolve -define compose:args=25 -composite \) \
-delete 12,13 \
\
\( -clone 12,7 -compose softlight -composite \) \
\( -clone 12,13 -compose dissolve -define compose:args=12.5 -composite \) \
-delete 12,13 \
\
\( -clone 12,8 -compose softlight -composite \) \
\( -clone 12,13 -compose dissolve -define compose:args=6.25 -composite \) \
-delete 12,13 \
\
\( -clone 12,9 -compose softlight -composite \) \
\( -clone 12,13 -compose dissolve -define compose:args=3.125 -composite \) \
-delete 12,13 \
\
\( -clone 12,10 -compose softlight -composite \) \
\( -clone 12,13 -compose dissolve -define compose:args=1.5625 -composite \) \
-delete 12,13 \
\
\( -clone 12,11 -compose softlight -composite \) \
\( -clone 12,13 -compose dissolve -define compose:args=0.78125 -composite -equalize \) \
-delete 4-13 \
\
\
\
\
\
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x32 -auto-level \) \
\( +clone -channel G \
-virtual-pixel tile -blur 0x32 -auto-level \) \
+swap +delete \
\( +clone -channel G \
-virtual-pixel tile -blur 0x32 -auto-level \) \
+swap +delete \
\( +clone -channel G \
-virtual-pixel tile -blur 0x32 -auto-level \) \
+swap +delete \
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x32 -auto-level \) \
\( +clone -channel G \
-virtual-pixel tile -blur 0x32 -auto-level \) \
+swap +delete \
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x32 -auto-level \) \
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x16 -auto-level \) \
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x8 -auto-level \) \
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x4 -auto-level \) \
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x2 -auto-level \) \
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x1 -auto-level \) \
\
\( -clone 5,6 -compose softlight -composite \) \
\( -clone 5,13 -compose dissolve -define compose:args=50 -composite \) \
-delete 13 \
\
\( -clone 13,7 -compose softlight -composite \) \
\( -clone 13,14 -compose dissolve -define compose:args=25 -composite \) \
-delete 13,14 \
\
\( -clone 13,8 -compose softlight -composite \) \
\( -clone 13,14 -compose dissolve -define compose:args=12.5 -composite \) \
-delete 13,14 \
\
\( -clone 13,9 -compose softlight -composite \) \
\( -clone 13,14 -compose dissolve -define compose:args=6.25 -composite \) \
-delete 13,14 \
\
\( -clone 13,10 -compose softlight -composite \) \
\( -clone 13,14 -compose dissolve -define compose:args=3.125 -composite \) \
-delete 13,14 \
\
\( -clone 13,11 -compose softlight -composite \) \
\( -clone 13,14 -compose dissolve -define compose:args=1.5625 -composite \) \
-delete 13,14 \
\
\( -clone 13,12 -compose softlight -composite \) \
\( -clone 13,14 -compose dissolve -define compose:args=0.78125 -composite \) \
-delete 5-14 \
\
\( -clone 5 -level 50%,50% \) \
-delete 5 \
\
\
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x32 -auto-level \) \
\( +clone -channel G \
-virtual-pixel tile -blur 0x32 -auto-level \) \
+swap +delete \
\( +clone -channel G \
-virtual-pixel tile -blur 0x32 -auto-level \) \
+swap +delete \
\( +clone -channel G \
-virtual-pixel tile -blur 0x32 -auto-level \) \
+swap +delete \
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x32 -auto-level \) \
\( +clone -channel G \
-virtual-pixel tile -blur 0x32 -auto-level \) \
+swap +delete \
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x32 -auto-level \) \
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x16 -auto-level \) \
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x8 -auto-level \) \
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x4 -auto-level \) \
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x2 -auto-level \) \
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x1 -auto-level \) \
\
\( -clone 6,7 -compose softlight -composite \) \
\( -clone 6,14 -compose dissolve -define compose:args=50 -composite \) \
-delete 14 \
\
\( -clone 14,8 -compose softlight -composite \) \
\( -clone 14,15 -compose dissolve -define compose:args=25 -composite \) \
-delete 14,15 \
\
\( -clone 14,9 -compose softlight -composite \) \
\( -clone 14,15 -compose dissolve -define compose:args=12.5 -composite \) \
-delete 14,15 \
\
\( -clone 14,10 -compose softlight -composite \) \
\( -clone 14,15 -compose dissolve -define compose:args=6.25 -composite \) \
-delete 14,15 \
\
\( -clone 14,11 -compose softlight -composite \) \
\( -clone 14,15 -compose dissolve -define compose:args=3.125 -composite \) \
-delete 14,15 \
\
\( -clone 14,12 -compose softlight -composite \) \
\( -clone 14,15 -compose dissolve -define compose:args=1.5625 -composite \) \
-delete 14,15 \
\
\( -clone 14,13 -compose softlight -composite \) \
\( -clone 14,15 -compose dissolve -define compose:args=0.78125 -composite \) \
-delete 6-15 \
\
\( -clone 6 -level 50%,50% \) \
-delete 6 \
\
\
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x32 -auto-level \) \
\( +clone -channel G \
-virtual-pixel tile -blur 0x32 -auto-level \) \
+swap +delete \
\( +clone -channel G \
-virtual-pixel tile -blur 0x32 -auto-level \) \
+swap +delete \
\( +clone -channel G \
-virtual-pixel tile -blur 0x32 -auto-level \) \
+swap +delete \
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x32 -auto-level \) \
\( +clone -channel G \
-virtual-pixel tile -blur 0x32 -auto-level \) \
+swap +delete \
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x32 -auto-level \) \
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x16 -auto-level \) \
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x8 -auto-level \) \
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x4 -auto-level \) \
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x2 -auto-level \) \
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x1 -auto-level \) \
\
\( -clone 7,8 -compose softlight -composite \) \
\( -clone 7,15 -compose dissolve -define compose:args=50 -composite \) \
-delete 15 \
\
\( -clone 15,9 -compose softlight -composite \) \
\( -clone 15,16 -compose dissolve -define compose:args=25 -composite \) \
-delete 15,16 \
\
\( -clone 15,10 -compose softlight -composite \) \
\( -clone 15,16 -compose dissolve -define compose:args=12.5 -composite \) \
-delete 15,16 \
\
\( -clone 15,11 -compose softlight -composite \) \
\( -clone 15,16 -compose dissolve -define compose:args=6.25 -composite \) \
-delete 15,16 \
\
\( -clone 15,12 -compose softlight -composite \) \
\( -clone 15,16 -compose dissolve -define compose:args=3.125 -composite \) \
-delete 15,16 \
\
\( -clone 15,13 -compose softlight -composite \) \
\( -clone 15,16 -compose dissolve -define compose:args=1.5625 -composite \) \
-delete 15,16 \
\
\( -clone 15,14 -compose softlight -composite \) \
\( -clone 15,16 -compose dissolve -define compose:args=0.78125 -composite \) \
-delete 7-16 \
\
\( -clone 7 -level 50%,50% \) \
-delete 7 \
\
\
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x32 -auto-level \) \
\( +clone -channel G \
-virtual-pixel tile -blur 0x32 -auto-level \) \
+swap +delete \
\( +clone -channel G \
-virtual-pixel tile -blur 0x32 -auto-level \) \
+swap +delete \
\( +clone -channel G \
-virtual-pixel tile -blur 0x32 -auto-level \) \
+swap +delete \
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x32 -auto-level \) \
\( +clone -channel G \
-virtual-pixel tile -blur 0x32 -auto-level \) \
+swap +delete \
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x32 -auto-level \) \
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x16 -auto-level \) \
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x8 -auto-level \) \
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x4 -auto-level \) \
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x2 -auto-level \) \
\
\( -clone 0 -channel G +noise random \
-virtual-pixel tile -blur 0x1 -auto-level \) \
\
\( -clone 8,9 -compose softlight -composite \) \
\( -clone 8,16 -compose dissolve -define compose:args=50 -composite \) \
-delete 16 \
\
\( -clone 16,10 -compose softlight -composite \) \
\( -clone 16,17 -compose dissolve -define compose:args=25 -composite \) \
-delete 16,17 \
\
\( -clone 16,11 -compose softlight -composite \) \
\( -clone 16,17 -compose dissolve -define compose:args=12.5 -composite \) \
-delete 16,17 \
\
\( -clone 16,12 -compose softlight -composite \) \
\( -clone 16,17 -compose dissolve -define compose:args=6.25 -composite \) \
-delete 16,17 \
\
\( -clone 16,13 -compose softlight -composite \) \
\( -clone 16,17 -compose dissolve -define compose:args=3.125 -composite \) \
-delete 16,17 \
\
\( -clone 16,14 -compose softlight -composite \) \
\( -clone 16,17 -compose dissolve -define compose:args=1.5625 -composite \) \
-delete 16,17 \
\
\( -clone 16,15 -compose softlight -composite \) \
\( -clone 16,17 -compose dissolve -define compose:args=0.78125 -composite \) \
-delete 8-17 \
\
\( -clone 8 -level 50%,50% \) \
-delete 8 \
\
-delete 0 \
\
\
\
\
\
\
\( -clone 0,4 -compose softlight -composite -channel RGB -modulate 100,0 -auto-level \) \
\( -clone 1,5 -compose softlight -composite -channel RGB -modulate 100,0 -auto-level -channel red -negate \) \
\( -clone 2,6 -compose softlight -composite -channel RGB -modulate 100,0 -auto-level -channel green -negate \) \
\( -clone 3,7 -compose softlight -composite -channel RGB -modulate 100,0 -auto-level -channel blue -negate \) \
-delete 0-7 \
\
\( -clone 0,1 -compose dissolve -define compose:args=50 -composite -channel RGB \) \
\( -clone 2,3 -compose dissolve -define compose:args=50 -composite -channel RGB \) \
\( -clone 4,5 -compose dissolve -define compose:args=50 -composite -channel RGB -equalize \) \
-delete 0-5 \
\
./images/$( printf %04d $(( $counter + $offset )) ).png; \
\
counter=$(( $counter + 1 )); \
done
\


nice!(1)  コメント(0) 

「最も美しい女性の平均顔」を作成。 [コンテンツ]

[最も美しい女性の平均顔]
Most Beautiful Woman Face_Composited_1 とても美しい女性の顔の画像。
最も美しい女性の顔写真を約70枚ほど合成して、究極の「美人の平均顔」を作成してみました。
インターネット検索で出て来た「ファッション モデル」「女優」「歌手」などの美しい女性の顔写真を合成しました。

「美人」を検索してみると、やはりロシアウクライナなど、スラヴ系には美女が多いようでした。
沢山の美しい女性の顔写真を平均するとやはり非常に綺麗な顔になりますね。

ところで、遍く無作為抽出した多数の人の平均顔が美人顔であるという話をしばしば見掛けますが、今回は私が主観的に美人であると思う顔写真だけを選んで平均顔を作成致しましたので、私が思う「最も美しい顔」という事になります。

合成処理はオープンソースの画像編集アプリケーション ソフトウェアであるGIMPのモーフィング プラグインで行いました。
最後にGIMPでUnsharp Maskのフィルターを掛けて画像を鮮明化し、彩度とトーンカーヴを調整しました。

nice!(1)  コメント(0) 
前の8件 | -