Crawler de caras
Antes que nada, un crawler es un programa para extraer datos automáticamente. Es decir que un crawler de caras sería para buscar caras.
Atención: este artículo tiene todo el cuento de porqué tuve que hacer esto podes saltearlo y directamente ir al código.
Hace poco lancé el sitio Quién es la voz teniendo en mente múltiples objetivos:
- Probar Qadwa en un entorno mas real.
- Jugar un poco con el SEO.
- Tener la posibilidad de administrar un Google AdSense.
- Y por último satisfacer lo que para mi es un gran vacío (que yo sepa es solo para mí, pero lo bueno de Internet es que siempre podes encontrar otro boludo loco como vos), poder ver en un mismo lugar imagen del personaje animado y foto del actor que le presta voz.
Si visitas al sitio te das cuenta que no me costo casi nada hacerlo, es muy simple. De entrada hacer un sitio simple no parece un desafío interesante pero resulto todo lo contrario. A los objetivos anteriores se agregaron dos
- Instalar algún servicio de satisfacción
- Crear un crawler para llenar la información
Para lo primero elegí UserVoice hay varias opciones interesantes pero me pareció la mas completa (y por lo que vi también era la mas popular).
Los crawlers son esas herramientas que buscan información para llenar bases de datos. Dicho de esta manera parece que ademas de ser ilegal son muy aburridos hacerlos. Bueno no se que tan legal son, pero si bastante aburridos.
Primer Crawler
No voy a hablar del crawler para extraer la información de las películas porque todos se imaginan como hacer ese. Voy a hablar del crawler para buscar fotos. En principio lo que se me ocurrió era buscar la imagen del actor en la wikipedia. Pero era muy simple y como estamos en verano necesité hacer algo mas complicado. Ahi fue cuando hice una aplicación que llama a la API de Flickr para buscar fotos. Después escribian un HTML donde podia ver todas las fotos, botón derecho guardar y listo.
Luego de comentarle esto a un compañero de laburo (Pato) me dijo apróximadamente “¿y por qué no haces un crawler que reconozca las caras y se guarde directamente?” (¿hace falta aclarar que hubo tono de burla?), a lo cual respondí que me parecía muy interesante que después de terminar mi propio microkernel lo iba a hacer (mentira, esto se me ocurrió ahora, ni me acuerdo que le dije pero fue algo como “ni a palos”).
Segundo Crawler
Mas allá del chiste la propuesta sonaba interesante. Nunca supe mucho de reconocimiento facial pero uno de mis libros de IA (Inteligencia Artificial e Ingeniería del Conocimiento) tiene unos últimos capítulos dedicados al tratamiento de imágenes así que me puse a investigar un poco si se podía hacer (de una manera simple).
Ahi fue donde me encontré con OpenCV una librería de visión artificial que liberó Intel. Después de leer fallidamente la documentación varias veces encontré un código de Detección de Caras para la OLPC de Nirav Patel desarrollado en Python que pude hacer funcionar y entender. Así que me puse las pilas y programé en Python este código que busca en Flickr imágenes y busca si las mismas tiene caras de frente.
Antes que nada los requerimientos son los paquetes de OpenCV para Python y la API de Flickr.
En Debian/Ubuntu con un simple:
# apt-get install python-opencv # easy_install flickrapi
debería funcionar.
Este es el código de python:
#!/usr/bin/python
import sys, os, urllib, flickrapi
from opencv.cv import *
from opencv.highgui import *
# Agregarle la API KEY de Flickr
FLICKR_API_KEY = ""
# Obtiene una cantidad menor o igual a limit de imagenes
# que contengan al menos una cara de frente
def getPhotosWithFaces(query, limit, api_key):
i = 0
flickr = flickrapi.FlickrAPI(api_key, cache=True)
photos = []
for photo in flickr.walk(text=query):
url = photoSourceUrl(photo)
file = "/tmp/" + photoName(photo)
urllib.urlretrieve(url, file)
image = cvLoadImage(file)
print "Image '" + photo.get("title") + "' (" + file + ")"
faces = detectObject(image)
if faces.total > 0:
print ".. has faces"
photos.append(url)
i = i + 1
if i >= limit:
break
return photos
# Arma la URL de la foto
def photoSourceUrl(photo):
farmId = photo.get("farm")
serverId = photo.get("server")
return "http://farm%s.static.flickr.com/%s/%s" % (farmId, serverId, photoName(photo))
# Arma el nombre de la foto
def photoName(photo):
photoId = photo.get("id")
secret = photo.get("secret")
return "%s_%s.jpg" % (photoId, secret)
# Devuelve todos los objetos (caras) encontrados
def detectObject(image):
grayscale = cvCreateImage(cvGetSize(image), 8, 1)
cvCvtColor(image, grayscale, CV_BGR2GRAY)
storage = cvCreateMemStorage(0)
cvClearMemStorage(storage)
cvEqualizeHist(grayscale, grayscale)
cascade = cvLoadHaarClassifierCascade('haarcascade_frontalface_alt.xml',
cvSize(1,1))
return cvHaarDetectObjects(grayscale, cascade, storage, 1.2, 2,
CV_HAAR_DO_CANNY_PRUNING, cvSize(100,100))
if __name__ == "__main__":
if len(sys.argv) < 3:
print "Usage: " + sys.argv[0] + " [Query] [Limit]"
exit()
query = sys.argv[1]
limit = int(sys.argv[2])
photos = getPhotosWithFaces(query, limit, FLICKR_API_KEY)
# imprime el array con las fotos validas
print photos
Descargalo (junto con el archivo Haar)
Noten que el código es muy simple.
Para usarlo simplemente deben darles permisos de ejecución a ese archivo y llamarlo seguido de la búsqueda y el límite de imágenes que quieren traer con cara.
$ ./facesfromflickr.py "Gente paseando animales" 10
Nota: baja las imágenes al directorio temporal (/tmp) pero no se encarga de borrarlas.
Tags: crawler, flickr, opencv, python, quien es la voz

18-01-2010 at 15:34
Todo bien, pero puse Homero, y Bart en el buscador y no encontro nada :P
Proba con sphinx
http://quieneslavoz.com.ar/buscar?q=Bart
http://quieneslavoz.com.ar/buscar?q=Homero
18-01-2010 at 15:39
Por otro lado si estas testeando el seo.
Te faltan varias cosas.
Por un lado el interlinkeado en el sitio a otros personajes o peliculas, Esto es muy importante. Despues generar urls para las busquedas y darle fuerza a esos links de busqueda con interlinkeado desde los detalles de los personajes.
Por otro lado las urls deberian tener la palabra personaje, actor, o pelicula, para poder ganar posicionamiento en el long tail.
Un breadcrumb no estaria mal
inicio / pelicula /
Te faltan links!! el limite es 100 dale duro!!!
Que uno al azar te lleve a otra url no a la home.
18-01-2010 at 17:19
Fijate en películas que no esta la de los Simpsons y todavía no agregué series. O sea, no estan Los Simpsons todavía.
Gracias por los consejos del SEO, los voy a aplicar cuando pueda ;)
Igual lo mas importante de este post es el reconocimiento de rostros!! jaja
19-01-2010 at 11:05
Si, pero de reconocimiento facial no cazo un fulbo asi que no me importa :P
Recuerdo que labure para una empresa yankie que tenia el soft de reonocimiento facil mas preciso (era para los casinos de las vegas ), quizas tenga el fuente de ese codigo en mi mail. Pero lo dudo.
20-07-2010 at 23:32
Buy:Actos.Prevacid.Zovirax.Prednisolone.Human Growth Hormone.Retin-A.Synthroid.Accutane.Nexium.Zyban.Arimidex.100% Pure Okinawan Coral Calcium.Mega Hoodia.Valtrex.Lumigan.Petcam (Metacam) Oral Suspension….
29-08-2010 at 23:51
storage http://wdeskxxzr.ALLSTOCKSPORT.INFO/tag/volume+storage+Chicago/ : volume…
volume…