おじさん、絵とか写真をコンピュータの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;
}
---------------
0 件のコメント:
コメントを投稿