Explicação da evolução dos Moves!

15:55:00 0 Comments



Murilo Queiroz, cientista da computação, mestre em engenharia eletrônica e pesquisador da Vetta Labs / Igenesis, escreveu um excelente artigo explicando porque o Kinect é a tecnologia mais impressionante do ano, com um nível de detalhe que você não encontra em lugar nenhum!
Confiram!


Em novembro a Microsoft lançará o Kinect, o novo acessório para o videogame Xbox 360. Com o Kinect, o jogador será capaz de controlar os jogos apenas com o próprio corpo, sem precisar de absolutamente mais nada. Do ponto de vista estritamente técnico, o Kinect é o acessório mais revolucionário da história dos videogames e provavelmente um dos produtos tecnológicos mais excitantes do ano.

Entretanto não se vê tanto entusiasmo por aí. Depois do sucesso estrondoso do Wii, jogar com o corpo títulos como boliche ou tênis já não é mais novidade. E, recentemente, a Sony lançou o Move, para o Playstation 3, que tecnicamente é um Wiimote levemente melhorado. Afinal, o que o Kinect tem de tão diferente ?

Procurando por aí não se encontra uma boa explicação. Aliás, eu não achei nenhuma explicação técnica correta de como o Kinect funciona. Pelo contrário: achei reportagens publicadas em veículos conceituados que estão totalmente erradas com relação ao funcionamento do Kinect!

Aliás, minha primeira hipótese relacionada ao funcionamento do Kinect estava errada também: achei que fosse uma time-of-flight camera baseada na tecnologia da 3DV, uma empresa israelense adquirida pela Microsoft. Para minha surpresa, fui corrigido pessoalmente pelo próprio Alex Kipman, o brasileiro diretor de incubação da Microsoft e principal responsável pelo Kinect. Não admira quase todo mundo achar que se trata de mais uma cópia do Wii, como o Playstation Move…

Assim, resolvi explicar, tintim por tintim, o que é o Kinect, por que ele é diferente de qualquer coisa que você já viu antes e por que eu digo que “usar o Kinect só para videogame é a coisa mais boba que alguém poderia fazer”. Prepare-se porque o artigo é longo, mas vale a pena!

Wii e Move

O Wii e o Move funcionam de forma muito parecida. Você tem um emissor de luz infravermelha (no Wii, preso à TV; no Move, no controle do jogador) e uma câmera de vídeo tradicional. A câmera enxerga a luz infravermelha e com isso detecta onde o jogador está apontando o controle. Isso pode ser feito de forma 2D e, assim, o resultado final é uma posição na tela, como se fosse um mouse, ou em 3D, usando métodos de triangulação para detectar a distância do controle até a tela. Usando acelerômetros dentro do controle você consegue perceber a inclinação dele e, dessa forma, consegue – com uma precisão razoável – saber não só a posição em que o controle está, mas também onde ele está apontando.

Essa tecnologia existe há muito anos. A própria Sony lançou algo parecido para o Playstation 2, o EyeToy, cujo nome remete à câmera usada pelo Move no Playstation 3. No final dos anos 1980 foi lançado um acessório que funcionava basicamente da mesma forma e que populou os sonhos de uma geração inteira, a Power Glove, para o Nintendo 8-bits, mas que infelizmente não funcionava muito bem, parcialmente por ser baseada em ultrassom e não luz infravermelha.

powerglove2
Nintendo Power Glove, o ancestral do Wiimote

A antiga Power Glove, o Wii e o Move retornam informações limitadas e semelhantes. Todos retornam informação a respeito de um ou dois pontos no espaço; o que muda são os graus de liberdade (DOF, de degrees of freedom) retornados para o ponto.

O ideal é que você tenha seis graus de liberdade, ou seja, que o sistema saiba não só a posição espacial do controle (as coordenadas x,y,z do controle), mas também os três ângulos (rollpitchyaw),  que determinam para onde ele está inclinado. O Move e o Wiimotion Plus retornam isso, o que é bem bacana; a Power Glove, nos 1980s, já retornava x,y,z, yaw e roll, ou seja, 5DOF.



O problema desses sistemas é que mesmo quando funcionam perfeitamente eles se restringem à posição (mesmo que com 6DOF) apenas do controle propriamente dito.

O Kinect, por sua vez, entrega informação 3D da cena inteira. Para cada pixel da imagem é possível obter a distância daquele pixel até a câmera, efetivamente produzindo um mapa de profundidade. A forma de obter esse mapa é que a principal inovação do Kinect.

Visão 3D Tradicional

A visão 3D tradicional, que também existe há muitos anos e não funciona lá muito bem, imita a forma com que animais enxergam. Cada um dos nossos olhos vê uma imagem ligeiramente diferente (basta fechar alternadamente cada olho para perceber isso; é o que chamamos de paralaxe). O cérebro combina essas duas imagens e nos dá a percepção 3D. Se você entrega uma imagem ligeiramente diferente para cada olho, você consegue essa mesma percepção 3D, e é isso que se fazem nos cinemas e TVs 3D, que voltaram à moda recentemente. Chamamos essa técnica de visão estereoscópica (áudio estéreo é o que manda som diferente para cada ouvido; imagem estéreo faz a mesma coisa, mas com os olhos).

No caso da visão, você usa duas câmeras para obter essas imagens diferentes, e um software calcula a posição 3D dos objetos baseada nas diferenças entre essas duas imagens. O problema é que dependendo da posição do objeto você precisa mudar o ângulo entre as duas câmeras, e o seu foco; e mesmo se você mantém isso fixo é bastante difícil obter um modelo 3D realmente bom.

stereo vision robot

Um pequeno robô com visão estereoscópica

Visão 3D do Kinect

Pássaros voam batendo as asas, mas isso não significa que essa seja a forma mais eficiente de fazer isso. A visão estéreo usa duas câmeras, imitando nossos dois olhos, mas assim como um avião voa mais longe, mais alto e mais rápido que qualquer pássaro, é possível fazer visão 3D muito melhor de forma radicalmente diferente do que ocorre na natureza.

Imagine um projetor comum, como os que são usados em cinema e home theaters, ou mesmo um retroprojetor dos antigos, que usam transparências. Esse projetor é usado para projetar um quadriculado uniforme. Se você coloca o projetor perto da parede, o quadriculado aparece pequeno, com cada quadradinho ocupando pouco espaço. Similarmente, se você projeta numa parede bem distante, os quadrados aparecem enormes.

Se você entra na frente do projetor, o quadriculado é projetado em seu corpo. A parte do quadriculado que acerta você aparece de um tamanho, e a parte que acerta a parede lá no fundo aparece de outro… Ou seja, se você mede, na imagem da câmera, o tamanho de cada quadradinho do quadriculado, você sabe, baseado no tamanho dele, a que distância ele está! O quadriculado é luz estruturada, ou seja, luz com uma estrutura bem definida que permite que você descubra informações sobre a cena baseado na forma como essa luz é refletida.



Note que você pode detectar a profundidade não só com o tamanho do quadradinho (esse é só um exemplo didático), mas também observando, por exemplo, como linhas que deveriam ser retas são distorcidas ao serem projetas em superfícies curvas.

Phase2
Luz estruturada projetada em superfície irregular

Um ponto difícil é que você precisa de uma óptica bem precisa: quanto mais resolução tem o quadriculado, mais exata a sua medida. Para enxergar o quadriculado, você precisa de uma câmera de alta resolução e para medir em tempo real o tamanho de todos os quadradinhos, você precisa de hardware e software dedicados, numa arquitetura paralela.

No Kinect o quadriculado é projetado com luz infravermelha, invisível, logo, você não percebe. Qualquer câmera digital comum detecta infravermelho: se você filmar com seu celular um controle remoto comum de TV funcionando você consegue enxergar o LED infravermelho dele piscando toda vez que você aperta uma tecla. Isso é uma vantagem enorme, porque isso implica que com uma câmera de infravermelho comum você consegue enxergar o quadriculado!

Mas isso não significa que o Kinect seja simplesmente uma câmera de  infravermelho comum, porque o processamento em tempo real necessário para extrair o mapa de profundidade a partir da imagem do quadriculado é bem sofisticado. Ele usa um sensor (CCD) comum, mas tem bastante coisa por trás.

Content 89.8

Ilustração do design de referência da PrimeSense, parceira da Microsoft no desenvolvimento do Kinect
E esse é o segredo. O Kinect tem duas câmeras, o que faz muita gente achar que ele usa visão estereoscópica. Na verdade uma das câmeras é totalmente tradicional, colorida, como uma webcam qualquer.

A outra câmera é usada para capturar a imagem do padrão projetado com luz infravermelha e, usando hardware dedicado, as distorções do padrão são interpretadas como variações na distância do objeto. O vídeo produzido ao final do processo é em preto e branco; quanto mais próximo o objeto em uma dada região, mais branco ele aparece.

Assim o vídeo da segunda câmera do Kinect é um modelo 3D extremamente detalhado da imagem capturada – superior ao que você consegue com visão estéreo comum.

Exemplo de mapa de profundidade

Alguns aspectos ainda não estão claros: o padrão exato usado, por exemplo (não precisa ser necessariamente um quadriculado; linhas paralelas podem ser usadas, ou mesmo padrões bem sofisticados que codificam mais informação), a resolução desse padrão (e consequentemente a resolução do mapa de profundidade) e outros detalhes do algoritmo.

Há quem especule inclusive que talvez o padrão seja dinâmico e mude conforme as condições do ambiente. Mas isso não afeta o entendimento de como o processo funciona.

Durante o processo de desenvolvimento do Kinect, a Microsoft adquiriu ou estabeleceu parcerias com diversas empresas que produziam produtos de visão 3D.

Algumas delas, como a 3DV, foram compradas pelo seu portfólio de patentes. O sensor de profundidade do Kinect foi baseado na tecnologia da PrimeSense, mas customizado pela própria Microsoft para alcançar os objetivos esperados.

E a Microsoft fez o quê?

Se a tecnologia de visão 3D veio da PrimeSense, qual a contribuição da Microsoft ? Obter o mapa de profundidade é só metade do problema: para um jogo você precisa interpretar esse modelo de forma eficiente, ou seja, você precisa detectar o quê daquela imagem 3D corresponde a uma ou mais pessoas e exatamente em que posição elas estão. É como um OCR, que pega uma fotografia de um jornal e detecta cada letra, retornando o texto que está efetivamente escrito lá.

Fazer isso num modelo 3D é um problema extremamente difícil. Pense na enorme variação entre as pessoas: há altos e baixos, magros e gordos, crianças, adultos, cachorro passando na frente, mesinhas de centro na sala… O problema não é mais confundir o objeto com o fundo (coisa que acontece com câmeras 2D, que detectam pessoas baseadas na diferença de cor). É ver aquela “escultura de cubinhos” e interpretar que é uma pessoa fazendo o V da vitória.

Aprendizado de Máquina

Para isso, a Microsoft usou técnicas de aprendizado de máquina (que, aliás, é uma das minhas áreas de pesquisa). A ideia é relativamente simples: ao invés de escrever um programa que resolve o problema, você escreve um programa que aprende a resolver o problema analisando milhares de exemplos.

Técnicas comuns de captura de movimentos usam uma roupa cheia de marcadores especiais para detectar a posição do corpo do autor, que é o que queremos fazer com o Kinect. Então, simultaneamente filmamos o ator usando a técnica antigausando o Kinect, e damos os dados de posição corporal obtidos pela primeira técnica e o vídeo do Kinect para o algoritmo de aprendizado.

andy1
Andy Serkis interpretando o Gollum, de O Senhor dos Anéis

Com muito, muito esforço científico e muitos exemplos desse tipo, o programa é capaz de aprender como detectar a posição do corpo a partir da imagem 3D vinda do Kinect. Além disso, algumas regras ajudam: sabemos que o tamanho das partes do corpo da pessoa não muda, por exemplo, e sabemos que joelhos e cotovelos não abrem mais de 180 graus.

Nesse ponto os pesquisadores da Microsoft usaram outro recurso interessante: compraram uma quantidade gigantesca de dados de captura de movimentos usados em filmes e jogos antigos e processaram esses dados para inferir regras como as que mencionei acima.

A combinação de exemplos e regras desse tipo e o uso intensivo de quantidades obscenas de recursos computacionais ao longo de vários meses permitiram que o software aprendesse a detectar a posição do corpo de pessoas dos mais variados tamanhos, nas mais variadas posições e ações. O legal é que aprender o modelo requer muitíssimo esforço computacional, mas depois de aprendido executá-lo é algo bem leve – uma tarefa simples que pode ser feita por software, pelo próprio console de videogame. Daí não haver a necessidade do tal “processador extra no Kinect” de que alguns andaram reclamando.

Em termos de quantidade de dados e de pesquisadores envolvidos esse foi o maior projeto de aprendizado de máquina da história. E, não há como negar, o mérito disso tudo é da Microsoft.

O que mais ?

Além de duas câmeras e software sofisticado para detecção de posição do corpo em tempo real, a Microsoft também integrou ao Kinect microfones direcionais e um bom sistema de reconhecimento de voz. Esse sistema foi treinado (usando aprendizado de máquina, como no caso da posição do corpo) com vozes de milhares de pessoas diferentes, permitindo que ele detecte comandos simples de pessoas diferentes sem treinamento prévio para cada uma. Nada muito superior ao que já se encontra disponível em sistemas operacionais como o Windows 7 e o Mac OS X, mas um excelente complemento para o acessório.

A utilidade para jogos do Kinect vai muito além de “imitar o Wii”, como muita gente vive repetindo. A primeira diferença que nem sempre fica óbvia é que você não é obrigado a ficar de pé pulando e se sacudindo em frente à sua TV. O Kinect pode detectar a posição da sua cabeça e corpo enquanto você está sentado no sofá jogando confortavelmente com seu controle convencional.

Mas a ideia não era eliminar o controle ? Não necessariamente! Nenhum fã de first-person shooters (como Halo) ou simuladores de voo e corrida vai querer jogar dando tiros com o dedo ou fingindo que está com um volante imaginário nas mãos. Esses hardcore gamers vão jogar com controle, com mouse e teclado ou com um bom volante com force-feedback (eu não abro mão do meu Logitech), obviamente. Mas com o Kinect é possível rastrear a sua cabeça e mudar a imagem na tela conforme a posição dela, como se você tivesse efetivamente olhando para cima e para os lados, uma técnica chamada de Head Tracking.


Controle de Wii funcionando como sensor para Head Tracking. Um excelente exemplo do efeito pode ser visto a partir dos 2:28 deste vídeo.
Pode parecer esquisito, mas já é uma técnica usada por muitos jogadores sérios no PC, que usam dispositivos como o TrackIR. Poder olhar para cima ou para os lados enquanto se joga é algo que faz tanta diferença que qualquer um que já tenha usado um rastreador de cabeça não consegue deixá-lo de lado, mesmo o tradicional sendo uma arataca dependurada no seu fone de ouvido ou boné.

Só o TrackIR custa mais de US$ 120 e, com o Kinect, esse tipo de experiência estará disponível para qualquer um.



TrackIR em funcionamento
E essa é só mais uma possibilidade ligada a jogos. Eu, particularmente, estou mirando muito, muito mais longe: com câmeras 3D de baixíssimo custo vai finalmente ser possível desenvolver de forma rápida e robusta robôs que enxergam direito, por exemplo. Um carro com câmeras 3D nos pára-choques seria capaz de detectar automaticamente e em tempo real outros carros, pedestres, vagas (e inclusive estacionar automaticamente) de forma muitíssimo melhor do que o que existe hoje. Câmeras 3D instaladas estrategicamente permitiriam que você controle qualquer coisa através de gestos. E com alguma engenhosidade é possível digitalizar esculturas e criar modelos 3D automaticamente simplesmente filmando o objeto.

As possibilidades são inúmeras. É uma inovação que traz uma preciosidade tecnológica cara e extremamente poderosa para o grande público. Eu mal posso esperar para colocarmos as mãos no Kinect – não só para nos divertirmos como jogadores, mas também para inventar uma miríade de coisas interessantes, como cientistas e hackers.

Leonardo Soler

Retrogamer nas horas vagas. Mantém o Game Genius desde 2010 onde a internet ainda não tinha nem luz eletrica. Fã dos Power Rangers (até o PR no espaço). E é complicado o que é melhor, Final Fantasy VI ou Chrono Trigger. Google