Um cientista explica o Microsoft Kinect, Parte II
November 2, 2010 10:48 am Mundos Virtuais, Processamento de Sinais, Reconhecimento de Faces, Robótica, Visão ComputacionalA recepção ao meu primeiro artigo explicando a tecnologia por trás do Kinect, o novo acessório da Microsoft sendo lançado essa semana, foi surpreendente, em vários aspectos. O primeiro foi a enorme quantidade de visitantes, comentários e elogios, o que obviamente me deixou muito feliz…
O segundo aspecto, entretanto, foi mais interessante e inesperado: o diretor de incubação da Microsoft Alex Kipman, responsável pelo desenvolvimento do Kinect (e brasileiro!), leu o artigo! E, para minha surpresa, explicou que eu estava enganado com relação à tecnologia usada para obter os resultados surpreendentes que descrevi no artigo anterior, e me apontou no caminho certo.
A minha primeira reação foi a de ficar com vergonha: afinal de contas dei uma explicação que fazia muito sentido mas que não estava totalmente correta, e para uma audiência enorme. Vergonha ou não, só existe uma alternativa correta nesse caso, que é assumir o engano e corrigir a informação, o que é o que faço hoje. Alguns amigos me consolaram dizendo que qualquer cientista erra, e esse é o único jeito de continuar aprendendo, e concordo com eles! Além do mais, é inegável que ser corrigido pelo próprio Alex Kipman é no mínimo algo bem empolgante!
O que continua valendo?
Expliquei no artigo anterior que 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 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 (ou seja, entrega um mapa de profundidade, como apontou o nic nos comentários do primeiro artigo). A partir desse mapa ele detecta a posição do corpo inteiro da pessoa que está em frente à câmera. Essa é a grande inovação, e a explicação continua valendo! O que muda é como esse mapa é construído, e quem desenvolveu o sensor.
Um conto de duas empresas israelenses
No artigo anterior eu disse que a tecnologia usada no Kinect veio da empresa israelense 3DV, que produzia a ZCam, uma câmera TOF (time-of-flight) que entrega um mapa de profundidade como o que era necessário. A 3DV foi comprada pela Microsoft há algum tempo. Pouco depois foi anunciado o Project Natal, que virou o Kinect, e mais tarde comunicaram que a tecnologia dele era de uma empresa israelense que fazia câmeras 3D…
Meu engano foi assumir que a empresa israelense era a 3DV! Na verdade a Microsoft comprou a 3DV, mas com interesse no seu portfólio de patentes. conforme explicado no venturebeat.com. Como eu assumi que a tecnologia usada era a da 3DV, eu expliquei como funcionava a câmera dela, a ZCam, que é uma câmera TOF…
Mas o sensor do Kinect foi desenvolvido pela Microsoft, internamente, numa parceria com uma outra empresa israelense que produzia câmeras que retornam mapas de profundidade, a PrimeSense (foi aqui o Alex Kipman me corrigiu). Essa informação muda completamente a minha hipótese, porque a PrimeSense usa um outro método para detectar a profundidade na cena, baseado em luz estruturada (structured light)! E o Kinect não é idêntico aos produtos da própria PrimeSense, pois o sensor em si foi projetado especificamente para as necessidades da Microsoft.
O sensor de profundidade da PrimeSense
Explicada a confusão, posso explicar como funciona o sensor da PrimeSense. Como disse, o sensor do Kinect não é exatamente o mesmo sensor da PrimeSense, então pode ser que algum detalhe seja diferente do que vai ser descrito aqui, mas o princípio é simples de entender a partir de um pequeno exemplo.
Vamos começar por 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.
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! Não é preciso o hardware dedicado caro da 3DV, que descrevi no artigo anterior, em que cada “pixel” tem o equivalente a um cronômetro para medir o tempo de vôo. Provavelmente o custo foi a principal razão por terem escolhido a PrimeSense ao invés da 3DV, aliás.
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.
Alguns aspectos ainda não estão claros para mim: 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 usado. Mas isso não afeta o entendimento de como o processo funciona.

Galantucci, L. M. , Percoco, G. and Dal Maso, U. 'Coded targets and hybrid grids for photogrammetric 3D digitisation of human faces', Virtual and Physical Prototyping, 3:3, 167 - 176
Quem estiver interessado em maiores detalhes pode ler as patentes da Prime Sense, como por exemplo:
Conclusão
O fato do sensor do Kinetic usar luz estruturada desenvolvida em conjunto com a PrimeSense, ou uma câmera TOF da 3DV não muda o meu entusiasmo. O interessante, como já expliquei, é ter um mapa de profundidade em tempo real, de baixíssimo custo. O aprendizado de máquina usado para extrair informações de postura corporal a partir do mapa continua o mesmo, e as muitas aplicações que uma tecnologia assim tem também.
A comparação de preço que fiz com a SwissRanger SR4000 da Mesa Imaging agora não é mais tão justa, já que câmeras TOF são mesmo bem mais caras que câmeras baseadas em luz estruturada. Mas comparar, por exemplo, a resolução do mapa de profundidade e a velocidade com que ele é produzido continua válido.
Uma vez mais, gostaria de agradecer a todos os leitores pela atenção, e de me desculpar com eles pelo engano. Um agradecimento especial, é claro, vai para o leitor mais ilustre, o Alex Kipman, e pela atenção e gentileza dele ao me corrigir. Espero que a leitura tenha sido divertida!




muriloq » Blog Archive » Um Cientista Explica o Microsoft Kinect, Parte II :
Date: November 2, 2010 @ 10:57 am
[...] http://blog.vettalabs.com/2010/11/02/um-cientista-explica-o-microsoft-kinect-parte-ii/ [...]
Everson Vargas da Luz :
Date: November 2, 2010 @ 12:28 pm
Ótima matéria, o fato da MS ficar atenda a artigos bons como esse mostra o quanto eles estão levando a sério não só no mundo mas Brasil também a linha de produtos para diversão, fico muito feliz com isso e pode ter certeza que isso influenciou a minha nova compra do Xbox 360.
Forte abraço e vou continuar acompanhando suas novas matérias.
Matheus Moreira :
Date: November 2, 2010 @ 12:31 pm
murilo, aceito suas desculpas não porque a explicação do funcionamento das câmeras tof valeu o engano!
se não fosse isso saberíamos apenas sobre o método da luz estruturada.
muito bons os dois artigos, e é interessante saber quanto esforço uma empresa emprega para entregar um equipamento bacana para seus consumidores.
SauloSan :
Date: November 2, 2010 @ 2:04 pm
Esse tipo de leitura me deixa mais interessado no Kinect. Porque os lauch games dele não interessam tanto por si sós.
Pensar nas outras muitas aplicações que ele pode ter é que é o interessante da coisa!
Tweets that mention Tecnologia. Inteligente. » Blog Archive » Um cientista explica o Microsoft Kinect, Parte II -- Topsy.com :
Date: November 2, 2010 @ 3:06 pm
[...] This post was mentioned on Twitter by EversonVargas da Luz, jagripino. jagripino said: Um cientista explica o Kinect, parte II: http://blog.vettalabs.com/2010/11/02/um-cientista-explica-o-microsoft-kinect-parte-ii/ [...]
Schroeder :
Date: November 2, 2010 @ 5:18 pm
A ciência também dá suas girinadas, Murilo. hehehehe
Elton Carvalho :
Date: November 6, 2010 @ 6:36 pm
Podemos enxergar o padrão usando óculos de visão noturna:
http://www.joystiq.com/2010/11/05/kinect-night-vision-goggles-video/ (link via Kentaro Mori)
Talvez uma outra forma de detectar o padrào seria fotografando a sala no escuro com o Kinectic ligado, usando uma camera barata.
frangossauro :
Date: November 12, 2010 @ 7:08 am
Heya, se junte a nós no openkinect. Está uma combinação unica de pesquisadores alto-niveis, hackers insanos e gente apaixonada.
https://groups.google.com/group/openkinect/?pli=1