Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
103 changes: 103 additions & 0 deletions files/blog/art.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
---
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. [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. <intro>
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

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.

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
vão alguns dos meus sentimentos para o futuro.

TODO

### 1. Os modelos vão melhorar

### 2. A internet será consumida pela IA

### 3. Nossa percepção da realidade vai mudar

### 4. Nossa percepção de nós mesmos vai mudar

103 changes: 103 additions & 0 deletions files/blog/minecraft.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
---
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
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: uma cópia pra chamar de
minha.

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). 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:

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]()

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 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].
O resultado é um belo pedacinho de mundo.

![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)
/ [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/)