busca visual
DESCRIPTION
Ricardo CabralTRANSCRIPT
BUSCA VISUAL DE IMAGENS PARA TODOS
APRESENTAÇÃO DO SOFTWARE OPENSOURCE ISK-DAEMON E TECNOLOGIAS
ENVOLVIDAS NA SUA CRIAÇÃO
PyConBrasil 2008 Ricardo Niederberger Cabral
quem sou eu
http://isnotworking.com/ python desde '97
(o logotipo ainda era assim: ) engenheiro da computação
serpro '03 chemtech
busca visual de imagens
uma das técnicas: busca-através-de-exemplo pode ser combinado com busca textual
busca visual de imagens
usar:
para encontrar:
: o que é
biblioteca (1) extensão C++ indexar buscar
servidor (2) expõe essa biblioteca para clientes remotos
arquitetura (3) como resolver esse problema?
histórico: app desktop: '03 (http://imgseek.net/) servidor: '06
como usar
arquitetura
como usar: fluxo de dados
como usar: passos (1/3)
1. compilar a biblioteca para sua plataforma 1. g++ 2. python-dev 3. libmagick++
2. pre-requisitos servidor 1. twisted 2. simplejson 3. SOAPpy
3. # python setup.py install 4. escolher método para RPC
1. xml-rpc 2. soap 3. json-rpc 4. twisted PB
como usar: passos (2/3)
5. indexar coleção de imagens # isk-daemon imports from imgSeekLib.ImageDB import ImgDB import settings
# initialize image database imgDB = ImgDB(settings) imgDB.loadalldbs(os.path.expanduser(settings.databasePath))
def saveall(): imgDB.savealldbs(os.path.expanduser(settings.databasePath))
def main(): imgdir = "/Volumes/media2/prj/tecweb-data/img" count = 0 p = re.compile(r"(\d+)") for imgfile in os.listdir(imgdir): count += 1 if count > 1000: count = 0 saveall() m = p.search( imgfile ) nid = int(m.group()) if nid >= 2147483647: continue if not imgDB.isImageOnDB(1, nid): res = imgDB.addImage(1, os.path.join(imgdir,imgfile), nid) saveall()
if __name__ == '__main__': main()
como usar: passos (3/3)
7. codificar cliente
8. pronto!
import web # simple isk-daemon test program from xmlrpclib import ServerProxy
server = ServerProxy("http://localhost:31128/RPC") urls = ('/(.*)', 'iskclient') imgdir = "/Volumes/media2/img" img_count = server.getDbImgCount(1)
class iskclient: def GET(self, target_id):
if not target_id: target_id = -1 target_id = int(target_id)
print """<html>Pesquisando em %d imagens as mais similares a <img src='/static/%s.jpg'/><hr>""" % (img_count, target_id) for res in server.queryImgID(1,target_id, 16)[1:]: print """<a href='/%d'><img border='0' src='/static/%s.jpg'/> </a>""" % (res[0],res[0]) print "</html>"
if __name__ == "__main__": web.run(urls, globals())
do que é feito
twisted: biblioteca para comunicação orientada a eventos
swig: gerador de wrappers de código nativo GWT: compilador java -> javascript, usado na
interface administrativa json-rpc: protocolo para chamadas remotas libMagick: biblioteca para manipulação de
imagens