Um cientista explica o Microsoft Kinect, Parte II
A 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!
November 2, 2010 by Murilo Queiroz Mundos Virtuais, Processamento de Sinais, Reconhecimento de Faces, Robótica, Visão Computacional 9 Comentários













