2021年5月28日金曜日

StyleGANをやってみた

 おじさん、絵とか写真をコンピュータのAIが勝手に作ってくれる、StyleGANを勉強してみました。

https://qiita.com/woodyZootopia/items/10e7e7cf96bfe1249f66


まえから自分で動かしてみたかったんだよね。


このStyleGANを使うと、今話題の新垣結衣の画像も生成できちゃうらしい。

http://cedro3.com/ai/search-for-yui/

なんという知識とGPUの無駄遣い。

StyleGANのベクトル空間に我々人類は住んでるんだね。


このStyleGANですが、昔はNVIDIAのGPUでしか動かなかったんですが、最近はCPUだけでも動くみたい。

さらに、Pytorchの学習済みのデータをC++で簡単に利用できるように変換してくれる、tensor4なるものがあって、それを使うとC++でもStyleGANを動かせます。

https://github.com/podgorskiy/tensor4


ここに、本当に動くのかあやしいStyleGANのC++実装があるのですが、これを修正して、きちんとおじさんのGPUがないWindowsで動くようにしてみました。

https://github.com/podgorskiy/StyleGANCpp


このtensor4を作った人すごいね。

他になんのライブラリも必要なく、StyleGANを数個のファイルだけでC++で動かすことができます。10分くらいでStyleGANをつくれちゃいます。


これはかなり面白い。

---------------

#include "tensor4.h"

#include "StyleGAN.h"

#include "numpy-like-randn.h"


#define STB_IMAGE_WRITE_IMPLEMENTATION

#include "stb_image_write.h"



int main()

{

int layers = 9;


// if loading compressed

//auto model = StyleGANLoad("StyleGAN.ct4", layers);


// if loading original

auto model = StyleGANLoad("StyleGAN.t4", layers, false);


{

auto rs = numpy_like::RandomState(4);

auto z = GenZ(rs);

auto w = GenW(model, z);

auto w_truncated = (w - t4::Unsqueeze<0>(model.dlatent_avg)) * 0.7f + t4::Unsqueeze<0>(model.dlatent_avg);

t4::tensor4f x;

t4::tensor3f img;

t4::tensor3f img2;

for (int i = 0; i < layers; ++i)

{

printf("layers=%d\n",i);

t4::tensor2f current_w = w;

if (i < 4)

{

current_w = w_truncated;

}

auto result = GenImage(model, x, current_w, i);

x = result.first;

img = result.second;

}


img2 = img * 0.5f + 0.5f;

float* p = img2.ptr();


for (int i = 0; i < 1024 * 1024*3; i++) {

float f;

f = p[i + 1024 * 1024 * 0];

if (f < 0)f = 0;

if (f >1)f = 1;

p[i + 1024 * 1024 * 0] = f;

}

unsigned char* a = new unsigned char[1024 * 1024 * 3];

for (int i = 0; i < 1024 * 1024 ; i++) {

a[i * 3 + 0] = (int)(p[i + 1024 * 1024 * 0] * 196.0);

a[i * 3 + 1] = (int)(p[i + 1024 * 1024 * 1] * 196.0);

a[i * 3 + 2] = (int)(p[i + 1024 * 1024 * 2] * 196.0);

}

stbi_write_png("aaa.png", 1024, 1024, 3, a, 1024 * 3);

delete[] a;

printf("saved\n");

}


return 0;

}

---------------


ということで写真をAIで生成してみました。


これ、本当にAIが生成したものなのでしょうか?
あまりに本物過ぎて合成なのか本物なのかわからないじゃないか!











0 件のコメント:

コメントを投稿