quinta-feira, 18 de novembro de 2010

Um Cientista Explica o Microsoft Kinect

Fonte: Read Write Web Brasil

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



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, porque ele é diferente de qualquer coisa que você já viu antes, e porque 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 assim você 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.


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 (roll, pitch e yaw) 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 opter 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 de 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.

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.

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

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 idéia é 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 antiga e usando 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.

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 uma câmera convencional, uma câmera de tempo de vôo 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 idéia não era eliminar o controle ? Não necessariamente! Nenhum fã de first-person shooters (como Halo) ou simuladores de vôo 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 lado


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.

E essa é só mais uma possibilidade ligada a jogos. E

Nenhum comentário:

Postar um comentário

BlogBlogs.Com.Br