Detectando um rosto em um banco de dados de imagens faciais

110

Estou trabalhando em um pequeno projeto que envolve os rostos dos usuários do twitter através de suas fotos de perfil.

Um problema que encontrei é que, depois de filtrar todas as imagens, exceto as fotos nítidas, uma porcentagem pequena, mas significativa, dos usuários do twitter usa uma foto de Justin Bieber como foto de perfil.

Para filtrá-los, como posso saber programaticamente se uma foto é de Justin Bieber?

ʞɔıu
fonte
17
Qual é a sua plataforma de desenvolvimento? Isso pode ser feito facilmente no .NET porque é superior a todos os outros ambientes de programação. Basta chamar a função Page.EradicateBieber (). A Microsoft previu essa necessidade e a forneceu graciosamente para nós imediatamente no .NET 4.5. (Aqueles de vocês em versões mais antigas terão de esperar.) (Isto é, naturalmente, todos tongue-in-cheek.)
32
Acho que posso afirmar com segurança que o SO não precisa de uma [justin-bieber]tag.
22411 skaffman
2
Posso afirmar com segurança que as pessoas gastam mais votos positivos nos comentários e nesta pergunta do que na opção mais próxima (aquela que merece os votos).
20
Um filtro de áudio Justin Bieber seria bom também

Respostas:

49

Uma idéia melhor pode ser descartar todas as imagens que aparecem no feed de mais de um usuário - não é necessário reconhecimento.

PPPPPP
fonte
2
Sim, talvez defina um limite de 2-4 possíveis duplicações (para lidar com o caso do bebê recém-nascido) antes de rejeitar uma foto. Depende do que você vai fazer com as fotos, eu acho.
Mark Bessey
3
Solução simples e elegante. +1.
Robert Harvey
13
As pessoas poderiam usar imagens diferentes da mesma pessoa.
Rebecca Chernoff
(+1) em Rebecca e (-1) @ PPPPPP: Isso apenas muda o problema.
Steffen
4
Eles poderiam, mas na maioria dos casos, eles escolheriam um conjunto de imagens relativamente pequeno, portanto provavelmente ainda funcionaria. Casos extremos sejam condenados - pelo que você sabe, minha foto é do meu tio de qualquer maneira.
precisa saber é o seguinte
16

Sinto que http://www.tineye.com/commercial_api pode ser a solução aqui. Simplesmente jogue a imagem do perfil do Twitter no Tineye, veja se ele retorna imagens (e URLs associadas) que podem ser claramente identificadas (ou pontuadas automaticamente usando uma lógica simples de contagem de palavras) como relacionadas a (ou de) aquele pequeno saco de * *.

Simples!

Benjamin Howarth
fonte
1
O Google anunciou recentemente a pesquisa de imagens: youtube.com/watch?v=t99BfDnBZcI Ainda não sei se ela possui uma API, mas isso pode ser uma alternativa.
Petrichor
11

Como você pode filtrar apenas aquelas que são fotos de retrato nítidas, presumo que você tenha algum método de geração de recursos para transformar as imagens brutas em recursos úteis para fins de aprendizado de máquina. Se isso for verdade, você pode tentar treinar um algoritmo de classificação (existem muitos: redes neurais etc.) alimentando o algoritmo com um monte de fotos conhecidas de Bieber, bem como um monte de conhecidos não-Biebers. Depois de treinar o modelo, ele pode ser usado para prever se uma nova imagem é Bieber ou não.

Esse tipo de técnica de aprendizado supervisionado exige que você tenha dados onde saiba a resposta correta (Bieber ou não), mas provavelmente esses podem ser encontrados em uma pesquisa de imagens do Google. Também exige que você tenha os tipos certos de recursos e não sei o suficiente sobre processamento de imagem ou seu algoritmo para saber se isso é uma grande desvantagem.

Michael McGowan
fonte
2
Infelizmente, a etapa de geração de recursos é a mais difícil e a mais importante :(.
steffen
@steffen Há alguma sugestão de que o OP esteja mexendo com as faces, portanto, tenha algum gerador de descritor.
@mpq: Não duvidei que, no entanto, se o OP não possui um recurso por pixel, ele precisa encontrar um nível de agregação significativo. Eu não diminuí o voto, só queria apontar para a complexidade que está por trás dessa resposta (que é, é claro, correta).
steffen 15/02
1
Certo, a etapa de geração de recursos é a parte mais difícil. Eu estava assumindo que o OP poderia fazer isso, já que ele já tem algum mecanismo para processar as imagens. Mesmo que ele faça isso, eles podem ser apenas recursos úteis para detectar rosto / não rosto em vez de Bieber / não Bieber ... isso realmente depende dos recursos.
Michael McGowan
7

Você pode usar um método como eigenfaces, http://en.wikipedia.org/wiki/Eigenface . A seguir, é apresentado um bom passo a passo do procedimento, além de links para diferentes implementações.

http://www.pages.drexel.edu/~sis26/Eigenface%20Tutorial.htm

A partir daqui, é comum usar isso em uma abordagem de classificação, treinar um modelo e prever casos. Você pode fazer isso treinando várias celebridades conhecidas e, se prever um rosto do twitter como um dos modelos de celebridades treinados, remova-o. Semelhante a este http://blog.cordiner.net/2010/12/02/eigenfaces-face-recognition-matlab/

Isso sofre alterações constantes. Em breve, haverá um novo Justin Bieber que não estará em seu modelo treinado, então você não poderá prever. Há também um caso como Whitney Houston, que você nunca pensou em adicioná-la antes, mas ela pode ser uma imagem comum por respeito e admiração por algumas semanas. Você não terá o lado negativo de fotos de bebês, como mencionado acima. Para superar esses problemas, você poderia usar mais uma abordagem de cluster hierárquico. Removendo os primeiros conjuntos de clusters que estão muito próximos se atingirem um determinado nível de suporte, seu primeiro cluster possui 15 itens antes da construção de um segundo. Agora você não precisa se preocupar com quem está no seu modelo de treinamento, mas vai cair na questão das fotos do bebê.

darrelkj
fonte
3

Você precisa criar um algoritmo para detectar a qual pessoa essa imagem está se referindo. Você pode criar um modelo com base em diferentes imagens de retrato de personalidade famosa e usar classificadores para garantir que essa imagem esteja se referindo a uma imagem da sua base de dados. Você precisa usar um determinado classificador com base nos diferentes parâmetros desejados para o rosto, como a distância entre os olhos ou outros parâmetros para aumentar a precisão do seu modelo. Há também análise da pele. O mais importante é construir um bom classificador. Este método pode ser vulnerável.

Mas também há um projeto muito bom trabalhando no reconhecimento de faces http://opencv-code.com/Opencv_Face_Detection

404Dreamer_ML
fonte
1
AFAIK OpenCV eo site ligado só implementam rosto detecção (ehere na imagem é um rosto humano?), Que é apenas um primeiro passo na direção do rosto reconhecimento (cujo rosto é?)
f3lix
2

Você pode tentar o hash sensível à localidade .

Xodarap
fonte
1
O KNN comum não é muito bom para rostos. Mostrou-se que as faces se encontram em uma variedade não linear de ~ 25 dimensões das imagens.
bayerj