1. BUSCA VISUAL DE
IMAGENS PARA TODOS
APRESENTAÇÃO DO SOFTWARE
OPENSOURCE ISK-DAEMON E TECNOLOGIAS
ENVOLVIDAS NA SUA CRIAÇÃO
Ricardo Niederberger Cabral
PyConBrasil 2008
2. quem sou eu
http://isnotworking.com/
python desde '97
logotipo ainda era assim: )
(o
engenheiro da computação
'03
serpro
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)
compilar a biblioteca para sua plataforma
1.
g++
1.
python-dev
2.
libmagick++
3.
pre-requisitos servidor
2.
twisted
1.
simplejson
2.
SOAPpy
3.
# python setup.py install
3.
escolher método para RPC
4.
xml-rpc
1.
soap
2.
json-rpc
3.
twisted PB
4.
9. como usar: passos (2/3)
indexar coleção de imagens
5.
# 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)
codificar cliente
7.
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;
pronto! if __name__ == quot;__main__quot;: web.run(urls, globals())
8.
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