From 91a20b6515d3ccd5a3df1cf45313bab605cf85c7 Mon Sep 17 00:00:00 2001 From: brennop Date: Tue, 15 Nov 2022 19:46:10 -0300 Subject: [PATCH 1/7] 2022-11-15 --- files/blog/art.md | 69 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 files/blog/art.md diff --git a/files/blog/art.md b/files/blog/art.md new file mode 100644 index 0000000..9444a97 --- /dev/null +++ b/files/blog/art.md @@ -0,0 +1,69 @@ +--- +title: AI vai dominar o mundo +date: 2022-11-15 +--- + +2022 tem sido um ano intenso com muitas coisas importantes (guerra, eleições, +etc.). Mas algo que ocorreu e não será lembrado é que esse ano é o ponto de +virada para arte generativa. + +Desde de abril quando Dall-E 2 foi anunciado eu tenho acompanhado esse espaço. +Eu lembro até hoje quando isso ocorreu. Eu estava numa aula de IIA (que +coincidência) quando li o anúncio. Meu queixo caiu. Aquilo foi uma das coisas +mais fantásticas que eu já tinha visto. + +Mal sabia eu o que ocorreria nos próximos meses. Não só os modelos evoluíram +numa taxa assustadora, também ficaram bem mais acessíveis. + +## Domesticando a IA + +Agora chegou a hora legal. A IA foi treinada em muitas fotos do mundo real, mas +nenhuma nossa :cry:. Sem problemas, os pesquisadores do Google [resolveram isso +pra gente](https://dreambooth.github.io/). Vamos nos introduzir a IA. + +### 1. Monte seu dataset + +Primeiro de tudo, tenha uma conta do Google com bastante espaço sobrando no +drive. Bastante significa alguns gigabytes. Cada modelo pesa 2GB + alguns +arquivos necessários para rodar a inferência. + +Agora, abra sua galeria e selecione umas boas fotos suas. Eu sei que vai ser +difícil já que você não sabe tirar foto. Mas se vira aí e selecione umas 20-30 +fotos. Agora vão algumas dicas pra melhorar o seu dataset: + +- Quanto mais variado melhor. Pegue fotos com locais variados, dia e noite, + roupas diferentes, e mais importante, ângulos e emoções diferentes. +- Pegue fotos de boa qualidade. Se não tiver muitas, use algum _upscaler_ [^up]. +- Evite fotos que obstruam o seu rosto. + +No fim, renomeie todos os arquivos para um _token_ de instância. Esse token é +uma palavra que usaremos para pedir pra AI te desenhar. Sugiro usar um +apelido/username. Eu usei `brennop` por exemplo. + +### 2. Treine a máquina + +> Esses passos foram feitos no dia que escrevi esse post, então podem estar +> desatualizados. + +Agora vamos treinar. Esse é o [link do colab](https://colab.research.google.com/github/TheLastBen/fast-stable-diffusion/blob/main/fast-DreamBooth.ipynb). +Se nunca usou um colab, basta rodar os passos em sequência com o botão de play. + +### 3. Se desenhe + +Essa é a parte mais difícil (e mais divertida). Dominar o modelo de text (CLIP) +é um desafio por si só. Mas vou dar algumas dicas aqui para garantir que ele +gere um pouco do que você quer. + +## Previsões + +O futuro adeus pertence. Mas mesmo assim vou me arriscar e datar esse post. Aqui +vão alguns dos meus sentimentos para o futuro. + +TODO + +### 1. A internet será consumida pela IA + +### 2. Nossa percepção da realidade vai mudar + +### 3. Nossa percepção de nós mesmos vai mudar + From b2e1936fa48305ebd0eb66d75d34c0f7dfdad0e6 Mon Sep 17 00:00:00 2001 From: brennop Date: Tue, 15 Nov 2022 20:07:52 -0300 Subject: [PATCH 2/7] 2022-11-15 --- files/blog/art.md | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/files/blog/art.md b/files/blog/art.md index 9444a97..2666140 100644 --- a/files/blog/art.md +++ b/files/blog/art.md @@ -13,7 +13,19 @@ coincidência) quando li o anúncio. Meu queixo caiu. Aquilo foi uma das coisas mais fantásticas que eu já tinha visto. Mal sabia eu o que ocorreria nos próximos meses. Não só os modelos evoluíram -numa taxa assustadora, também ficaram bem mais acessíveis. +numa taxa assustadora, também ficaram bem mais acessíveis. [Vários](imagen) +[novos](midjourney) [modelos](outro do google) surgiram, cada um aprendendo com +o anterior. + +## titulo + +Mas isso tudo mudou quando o Stable Diffusion foi liberado ao público. +mas com um diferencial: os criadores liberaram os pesos. Isso quer dizer que nós +meros mortais podemos reproduzir os resultados em casa, sem ter uma empresa +como gatekeeper do uso da tecnologia. + +Isso liberou a caixa de pandora. Rapidamente a comunidade começou a utilizar e +melhorar o programa. ## Domesticando a IA @@ -61,9 +73,11 @@ vão alguns dos meus sentimentos para o futuro. TODO -### 1. A internet será consumida pela IA +### 1. Os modelos vão melhorar + +### 2. A internet será consumida pela IA -### 2. Nossa percepção da realidade vai mudar +### 3. Nossa percepção da realidade vai mudar -### 3. Nossa percepção de nós mesmos vai mudar +### 4. Nossa percepção de nós mesmos vai mudar From 39de4aaa7483917a3cb2bd9cafc2e3a2e88b071b Mon Sep 17 00:00:00 2001 From: brennop Date: Thu, 17 Nov 2022 12:37:57 -0300 Subject: [PATCH 3/7] 2022-11-17 --- files/blog/art.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/files/blog/art.md b/files/blog/art.md index 2666140..51f53e4 100644 --- a/files/blog/art.md +++ b/files/blog/art.md @@ -60,12 +60,32 @@ apelido/username. Eu usei `brennop` por exemplo. Agora vamos treinar. Esse é o [link do colab](https://colab.research.google.com/github/TheLastBen/fast-stable-diffusion/blob/main/fast-DreamBooth.ipynb). Se nunca usou um colab, basta rodar os passos em sequência com o botão de play. +Antes de começar a rodar, crie uma conta no [Hugging Face](https://huggingface.co). +Depois de criada, vá em `Settings -> Access Tokens -> New token`. Agora acesse +[esse link](https://huggingface.co/runwayml/stable-diffusion-v1-5) e clique no +grande botão no meio da tela dizendo pra ~vender seus direitos pro google~ +concordar com os termos. + +Vamos preencher os campos. Os que não souber não precisa preencher: + +- `Huggingface_Token`: o token que acabmos de criar +- `Session_name`: sugiro usar o mesmo nome que deu para as imagens +- `Contains_faces`: selecione a opção apropriada +- `Training_Steps`: geralmente n de fotos * 100. +- `Save_Checkpoint_Every_n_Steps`: recomendo ativar caso tenha bastante espaço + sobrando no seu drive. Caso o colab falhe não vai precisar começar do zero + +Agora basta rodar cada célula em sequência até que tenha um ✓ em cada uma. A +parte de treino vai demorar (algo em torno de 2 horas) então tenha paciência. + ### 3. Se desenhe Essa é a parte mais difícil (e mais divertida). Dominar o modelo de text (CLIP) é um desafio por si só. Mas vou dar algumas dicas aqui para garantir que ele gere um pouco do que você quer. +TODO + ## Previsões O futuro adeus pertence. Mas mesmo assim vou me arriscar e datar esse post. Aqui From e38d3fdbf23390c037bd0edec6a569a1b39c2efb Mon Sep 17 00:00:00 2001 From: brennop Date: Mon, 10 Apr 2023 17:35:39 -0300 Subject: [PATCH 4/7] add minecraft draft --- files/blog/minecraft.md | 102 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 files/blog/minecraft.md diff --git a/files/blog/minecraft.md b/files/blog/minecraft.md new file mode 100644 index 0000000..36fb75d --- /dev/null +++ b/files/blog/minecraft.md @@ -0,0 +1,102 @@ +# Meu próprio Minecraft + +É estranho pensar que fazem mais de 10 anos que eu criei meu primeiro mundo no +Minecraft. Depois desse tempo todo ainda não consigo descrever como era. Parecia +algo grande de mais, e mesmo assim era uma experiência acolhedora. + +Esse jogo foi definitivamente uma parte importante da minha vida. Não só pelos +amigos que fiz ou pelas horas que passei, mas porque foi a primeira vez que +programei. [1] E agora, quase completando minha graduação em Computação, eu +decidi completar o ciclo. + +Minecraft não é um jogo complexo. É simples na verdade. O que faz parecer +complexo na verdade é a emergência [2], mas não vou entrar nesse mérito. Essa +simplicidade foi talvez razão do seu sucesso, mas também permitiu muitos clones. +A ideia de um mundo de voxels, gerado proceduralmente, com texturas retrô não é +tão difícil de copiar. E foi isso que decidi fazer: minha cópia. + +Muitos dos clone existentes simplesmente usam uma engine como Unity para +~~trapacear~~ facilitar o trabalho. Eu queria ter a experiência completa então +descartei usar uma engine já de início. A linguagem que eu decidi usar foi Lua, +minha linguagem preferida. Só que até agora só sabia fazer jogos 2D usando o +framework LÖVE [3]. Como eu faço 3D então? + +# Matrizes + +LÖVE é incrivelmente versátil. Tem suporte a várias funcionalidades, incluindo +texturas, vértices, shaders. Acontece que é tudo que precisa para fazer 3D, +desde que saiba multiplicar matrizes. 3D não é nada mais do que um vértices de 3 +dimensões (x, y, z). Podemos pegar esses vértices e multiplicá-los por uma +matriz de transformação, pra mover, dimensionar e rotacionar. Chamamos essa +matriz de Model. Esses vértices são vistos por uma câmera. Ao contrário da nossa +intuição, quando andamos para frente em um jogo 3D, não é a câmera que se move +para frente, e sim o mundo que vai para trás. Para fazer isso, podemos construir +uma matriz com a posição da câmera, e vetores dizendo para onde é a frente e +para onde é cima. Para mover o mundo basta multiplicar. Chamamos essa matriz de +View. Até agora tudo bem, mas nossa tela é 2D, então precisamos projetar esses +vértices transformados de 3 dimensões para 2. Fazemos isso com, adivinha, uma +matriz. Essa matriz codifica o campo de visão e outras informações e chamamos +ela de Projection. + +No fim, temos essa equação: + +v′=P⋅V⋅M⋅v + +E isso é tudo que precisamos para ver 3D num framework 2D. + +```glsl uniform mat4 projectionMatrix; uniform mat4 viewMatrix; uniform mat4 +modelMatrix; + +vec4 position( mat4 transform_projection, vec4 vertexPosition ) { return +projectionMatrix * viewMatrix * modelMatrix * vertexPosition; } ``` + +# Cubos e cubos + +![A demo mais antiga da minha +engine](Meu%20pro%CC%81prio%20Minecraft%20048fd2bdb634446d981f6b3d6876cb69/1680822611.png) + +A demo mais antiga da minha engine + +Desenhar um cubo é fácil. O problema é desenhar milhares deles. Pra fazer isso, +Minecraft divide o mundo em *chunks*, ou pedacinhos de 16x256x16. Isso não só +alivia para a GPU desenhar o mundo, mas também facilita fazer as atualizações de +cada frame. + +Nossa versão não é diferente. Dividimos o mundo em pedaços de 16x48x16. Esses +*chunks* são primeiramente gerados aleatoriamente. Pra fazer isso usamos ruído +*Perlin*, que LOVE convenientemente fornece pra gente. + +```lua height = height + love.math.noise(x * frequency, z * frequency) * +amplitude max = max + amplitude amplitude = amplitude / 2 frequency = frequency +* 2 ``` + +Depois que uma *chunk* é gerada, precisamos gerar uma *mesh* para ela. Uma +*mesh* é simplesmente uma coleção de vértices. Esse *mesh* é então enviado para +a GPU para ser desenhado. + +Existem vários algoritmos para *meshing* eficiente, mas aqui só passamos por +todos os blocos do *chunk* verificando se cada face é visível (não está +obstruída). Se sim, adicionamos ao nosso *mesh*. Mas isso precisa ser feito 16 * +16 * 48 * 6 vezes por *chunk*, o que geralmente é bem lento. Então, ao invés de +encontrar um algoritmo melhor, eu só delego isso para uma thread. Então +lunarcraft é multithread 🙂. + +Durante esse processo, calculamos para cada vértice sua coordenada de textura, +seu vetor normal, para cálculos de iluminação, e o seu *ambient occlusion* [4]. +O resultado é um belo pedacinho de mundo. + +![1680823684.png](Meu%20pro%CC%81prio%20Minecraft%20048fd2bdb634446d981f6b3d6876cb69/1680823684.png) + +--- + +[1]: +[https://www.minecraftforum.net/forums/mapping-and-modding-java-edition/minecraft-mods/1284429-1-2-5-simple-guns-mod-beta-1-2](https://www.minecraftforum.net/forums/mapping-and-modding-java-edition/minecraft-mods/1284429-1-2-5-simple-guns-mod-beta-1-2) +/ [https://archive.is/05f90](https://archive.is/05f90) + +[2]: +[https://pt.wikipedia.org/wiki/Emergência](https://pt.wikipedia.org/wiki/Emerg%C3%AAncia) + +[3]: Love2d.org + +[4]: +[https://0fps.net/2013/07/03/ambient-occlusion-for-minecraft-like-worlds/](https://0fps.net/2013/07/03/ambient-occlusion-for-minecraft-like-worlds/) From c0fed1189cf282766c655b0df2d881e761e87880 Mon Sep 17 00:00:00 2001 From: brennop Date: Mon, 17 Apr 2023 10:36:29 -0300 Subject: [PATCH 5/7] some changes --- files/blog/minecraft.md | 56 +++++++++++++++++++++++------------------ 1 file changed, 31 insertions(+), 25 deletions(-) diff --git a/files/blog/minecraft.md b/files/blog/minecraft.md index 36fb75d..34e9026 100644 --- a/files/blog/minecraft.md +++ b/files/blog/minecraft.md @@ -13,20 +13,22 @@ Minecraft não é um jogo complexo. É simples na verdade. O que faz parecer complexo na verdade é a emergência [2], mas não vou entrar nesse mérito. Essa simplicidade foi talvez razão do seu sucesso, mas também permitiu muitos clones. A ideia de um mundo de voxels, gerado proceduralmente, com texturas retrô não é -tão difícil de copiar. E foi isso que decidi fazer: minha cópia. +tão difícil de copiar. E foi isso que decidi fazer: uma cópia pra chamar de +minha. -Muitos dos clone existentes simplesmente usam uma engine como Unity para -~~trapacear~~ facilitar o trabalho. Eu queria ter a experiência completa então -descartei usar uma engine já de início. A linguagem que eu decidi usar foi Lua, -minha linguagem preferida. Só que até agora só sabia fazer jogos 2D usando o -framework LÖVE [3]. Como eu faço 3D então? +Muitos dos clones existentes usam uma engine como Unity para ~~trapacear~~ +facilitar o trabalho. Eu queria ter a experiência completa, ou seja, no engine. +A linguagem que eu decidi usar foi Lua, minha linguagem preferida. Só que até +agora só sabia fazer jogos 2D com LÖVE [3]. Como eu faço 3D então? # Matrizes LÖVE é incrivelmente versátil. Tem suporte a várias funcionalidades, incluindo texturas, vértices, shaders. Acontece que é tudo que precisa para fazer 3D, desde que saiba multiplicar matrizes. 3D não é nada mais do que um vértices de 3 -dimensões (x, y, z). Podemos pegar esses vértices e multiplicá-los por uma +dimensões (x, y, z). + +Podemos pegar esses vértices e multiplicá-los por uma matriz de transformação, pra mover, dimensionar e rotacionar. Chamamos essa matriz de Model. Esses vértices são vistos por uma câmera. Ao contrário da nossa intuição, quando andamos para frente em um jogo 3D, não é a câmera que se move @@ -44,18 +46,19 @@ v′=P⋅V⋅M⋅v E isso é tudo que precisamos para ver 3D num framework 2D. -```glsl uniform mat4 projectionMatrix; uniform mat4 viewMatrix; uniform mat4 -modelMatrix; +```glsl +uniform mat4 projectionMatrix; +uniform mat4 viewMatrix; +uniform mat4 modelMatrix; -vec4 position( mat4 transform_projection, vec4 vertexPosition ) { return -projectionMatrix * viewMatrix * modelMatrix * vertexPosition; } ``` +vec4 position( mat4 transform_projection, vec4 vertexPosition ) { + return projectionMatrix * viewMatrix * modelMatrix * vertexPosition; +} +``` # Cubos e cubos -![A demo mais antiga da minha -engine](Meu%20pro%CC%81prio%20Minecraft%20048fd2bdb634446d981f6b3d6876cb69/1680822611.png) - -A demo mais antiga da minha engine +![A demo mais antiga da minha engine]() Desenhar um cubo é fácil. O problema é desenhar milhares deles. Pra fazer isso, Minecraft divide o mundo em *chunks*, ou pedacinhos de 16x256x16. Isso não só @@ -66,9 +69,11 @@ Nossa versão não é diferente. Dividimos o mundo em pedaços de 16x48x16. Esse *chunks* são primeiramente gerados aleatoriamente. Pra fazer isso usamos ruído *Perlin*, que LOVE convenientemente fornece pra gente. -```lua height = height + love.math.noise(x * frequency, z * frequency) * -amplitude max = max + amplitude amplitude = amplitude / 2 frequency = frequency -* 2 ``` +```lua +height = height + love.math.noise(x * frequency, z * frequency) * amplitude +max = max + amplitude +amplitude = amplitude / 2 frequency = frequency * 2 +``` Depois que uma *chunk* é gerada, precisamos gerar uma *mesh* para ela. Uma *mesh* é simplesmente uma coleção de vértices. Esse *mesh* é então enviado para @@ -85,18 +90,19 @@ Durante esse processo, calculamos para cada vértice sua coordenada de textura, seu vetor normal, para cálculos de iluminação, e o seu *ambient occlusion* [4]. O resultado é um belo pedacinho de mundo. -![1680823684.png](Meu%20pro%CC%81prio%20Minecraft%20048fd2bdb634446d981f6b3d6876cb69/1680823684.png) +![1680823684.png]() + +# + +Para a gameplay, precisamos de mais matemática. --- -[1]: -[https://www.minecraftforum.net/forums/mapping-and-modding-java-edition/minecraft-mods/1284429-1-2-5-simple-guns-mod-beta-1-2](https://www.minecraftforum.net/forums/mapping-and-modding-java-edition/minecraft-mods/1284429-1-2-5-simple-guns-mod-beta-1-2) +[1]: [https://www.minecraftforum.net/forums/mapping-and-modding-java-edition/minecraft-mods/1284429-1-2-5-simple-guns-mod-beta-1-2](https://www.minecraftforum.net/forums/mapping-and-modding-java-edition/minecraft-mods/1284429-1-2-5-simple-guns-mod-beta-1-2) / [https://archive.is/05f90](https://archive.is/05f90) -[2]: -[https://pt.wikipedia.org/wiki/Emergência](https://pt.wikipedia.org/wiki/Emerg%C3%AAncia) +[2]: [https://pt.wikipedia.org/wiki/Emergência](https://pt.wikipedia.org/wiki/Emerg%C3%AAncia) [3]: Love2d.org -[4]: -[https://0fps.net/2013/07/03/ambient-occlusion-for-minecraft-like-worlds/](https://0fps.net/2013/07/03/ambient-occlusion-for-minecraft-like-worlds/) +[4]: [https://0fps.net/2013/07/03/ambient-occlusion-for-minecraft-like-worlds/](https://0fps.net/2013/07/03/ambient-occlusion-for-minecraft-like-worlds/) From c843698fbfd44ce35f8640bf092f369158473a2f Mon Sep 17 00:00:00 2001 From: brennop Date: Mon, 17 Apr 2023 10:56:17 -0300 Subject: [PATCH 6/7] 2023-04-17 --- files/blog/minecraft.md | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/files/blog/minecraft.md b/files/blog/minecraft.md index 34e9026..2e6d207 100644 --- a/files/blog/minecraft.md +++ b/files/blog/minecraft.md @@ -1,4 +1,7 @@ -# Meu próprio Minecraft +--- +title: Meu próprio Minecraft +date: 2023-04-10 +--- É estranho pensar que fazem mais de 10 anos que eu criei meu primeiro mundo no Minecraft. Depois desse tempo todo ainda não consigo descrever como era. Parecia @@ -76,15 +79,14 @@ amplitude = amplitude / 2 frequency = frequency * 2 ``` Depois que uma *chunk* é gerada, precisamos gerar uma *mesh* para ela. Uma -*mesh* é simplesmente uma coleção de vértices. Esse *mesh* é então enviado para -a GPU para ser desenhado. - -Existem vários algoritmos para *meshing* eficiente, mas aqui só passamos por -todos os blocos do *chunk* verificando se cada face é visível (não está -obstruída). Se sim, adicionamos ao nosso *mesh*. Mas isso precisa ser feito 16 * -16 * 48 * 6 vezes por *chunk*, o que geralmente é bem lento. Então, ao invés de -encontrar um algoritmo melhor, eu só delego isso para uma thread. Então -lunarcraft é multithread 🙂. +*mesh* é simplesmente uma coleção de vértices que é enviado para a GPU para ser +desenhado. + +Existem vários algoritmos para *meshing* eficiente. Aqui só iteramos pelos +blocos checando se cada face é visível (não está obstruída). Mas isso precisa ser +feito 16 * 16 * 48 * 6 vezes por *chunk*. Isso é terrívelmente lento :crying:. +Então eu decide apelar para a thread. Dessa forma, a renderização não fica esperando +o mundo ser gerado. Durante esse processo, calculamos para cada vértice sua coordenada de textura, seu vetor normal, para cálculos de iluminação, e o seu *ambient occlusion* [4]. From 6699c5de89a48b7c8ffa6daba2aa5065afb9cebe Mon Sep 17 00:00:00 2001 From: brennop Date: Tue, 2 May 2023 17:52:48 -0300 Subject: [PATCH 7/7] 2023-05-02 --- files/blog/minecraft.md | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/files/blog/minecraft.md b/files/blog/minecraft.md index 2e6d207..9aaa0f5 100644 --- a/files/blog/minecraft.md +++ b/files/blog/minecraft.md @@ -29,19 +29,12 @@ agora só sabia fazer jogos 2D com LÖVE [3]. Como eu faço 3D então? LÖVE é incrivelmente versátil. Tem suporte a várias funcionalidades, incluindo texturas, vértices, shaders. Acontece que é tudo que precisa para fazer 3D, desde que saiba multiplicar matrizes. 3D não é nada mais do que um vértices de 3 -dimensões (x, y, z). - -Podemos pegar esses vértices e multiplicá-los por uma -matriz de transformação, pra mover, dimensionar e rotacionar. Chamamos essa -matriz de Model. Esses vértices são vistos por uma câmera. Ao contrário da nossa -intuição, quando andamos para frente em um jogo 3D, não é a câmera que se move -para frente, e sim o mundo que vai para trás. Para fazer isso, podemos construir -uma matriz com a posição da câmera, e vetores dizendo para onde é a frente e -para onde é cima. Para mover o mundo basta multiplicar. Chamamos essa matriz de -View. Até agora tudo bem, mas nossa tela é 2D, então precisamos projetar esses -vértices transformados de 3 dimensões para 2. Fazemos isso com, adivinha, uma -matriz. Essa matriz codifica o campo de visão e outras informações e chamamos -ela de Projection. +dimensões (x, y, z). A gente pega esse vértice e multiplica por uma matriz de +transformação. Essa matriz pode mover, dimensionar e rotacionar o vértice. + +Esse vértice é visto do ponto de vista de uma câmera, que é representada por +outra matriz, a matriz de visão, que codifica a posição e a orientação da +câmera. Por fim, temos a matriz de projeção, pra projetar o ponto 3D na tela 2D. No fim, temos essa equação: