diff --git a/files/blog/art.md b/files/blog/art.md new file mode 100644 index 0000000..51f53e4 --- /dev/null +++ b/files/blog/art.md @@ -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. +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 + diff --git a/files/blog/minecraft.md b/files/blog/minecraft.md new file mode 100644 index 0000000..9aaa0f5 --- /dev/null +++ b/files/blog/minecraft.md @@ -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/)