1. 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
2. quem sou eu
http://isnotworking.com/
python desde '97
(o logotipo ainda era assim: )
engenheiro da computação
serpro'03
chemtech
3. busca visual de imagens
uma das técnicas: busca-através-de-exemplo
pode ser combinado com busca textual
8. 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
9. 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 = quot;/Volumes/media2/prj/tecweb-data/imgquot;
count = 0
p = re.compile(rquot;(d+)quot;)
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()
10. como usar: passos (3/3)
7. codificar cliente
import web
# simple isk-daemon test program
from xmlrpclib import ServerProxy
server = ServerProxy(quot;http://localhost:31128/RPCquot;)
urls = ('/(.*)', 'iskclient')
imgdir = quot;/Volumes/media2/imgquot;
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 quot;quot;quot;<html>Pesquisando em %d imagens as mais similares a
<img src='/static/%s.jpg'/><hr>quot;quot;quot; % (img_count, target_id)
for res in server.queryImgID(1,target_id, 16)[1:]:
print quot;quot;quot;<a href='/%d'><img border='0' src='/static/%s.jpg'/>
</a>quot;quot;quot; % (res[0],res[0])
print quot;</html>quot;
8. pronto! if __name__ == quot;__main__quot;: web.run(urls, globals())
11. 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