SlideShare uma empresa Scribd logo
1 de 11
Baixar para ler offline
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 = 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()
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())
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

Mais conteúdo relacionado

Mais procurados

Mecanismo de Busca com Node.js + MongoDB
Mecanismo de Busca com Node.js + MongoDBMecanismo de Busca com Node.js + MongoDB
Mecanismo de Busca com Node.js + MongoDBLuiz Duarte
 
DevDay - O elo perdido: sincronizando webapps
DevDay - O elo perdido: sincronizando webappsDevDay - O elo perdido: sincronizando webapps
DevDay - O elo perdido: sincronizando webappsSuissa
 
Exercício da lógica (16 ao 25)
Exercício da lógica (16 ao 25)Exercício da lógica (16 ao 25)
Exercício da lógica (16 ao 25)gabimonteiro1455555
 
TDC2016SP - Trilha Node.Js
TDC2016SP - Trilha Node.JsTDC2016SP - Trilha Node.Js
TDC2016SP - Trilha Node.Jstdc-globalcode
 
Desenvolvendo com Node.JS - Mongoose + MongoDB + Vue.JS
Desenvolvendo com Node.JS - Mongoose + MongoDB + Vue.JSDesenvolvendo com Node.JS - Mongoose + MongoDB + Vue.JS
Desenvolvendo com Node.JS - Mongoose + MongoDB + Vue.JSRomulo Fagundes
 
Sexy Specs on XCode with MacRuby and Rspec (Lightning Talk)
Sexy Specs on XCode with MacRuby and Rspec (Lightning Talk)Sexy Specs on XCode with MacRuby and Rspec (Lightning Talk)
Sexy Specs on XCode with MacRuby and Rspec (Lightning Talk)Ricardo Valeriano
 

Mais procurados (6)

Mecanismo de Busca com Node.js + MongoDB
Mecanismo de Busca com Node.js + MongoDBMecanismo de Busca com Node.js + MongoDB
Mecanismo de Busca com Node.js + MongoDB
 
DevDay - O elo perdido: sincronizando webapps
DevDay - O elo perdido: sincronizando webappsDevDay - O elo perdido: sincronizando webapps
DevDay - O elo perdido: sincronizando webapps
 
Exercício da lógica (16 ao 25)
Exercício da lógica (16 ao 25)Exercício da lógica (16 ao 25)
Exercício da lógica (16 ao 25)
 
TDC2016SP - Trilha Node.Js
TDC2016SP - Trilha Node.JsTDC2016SP - Trilha Node.Js
TDC2016SP - Trilha Node.Js
 
Desenvolvendo com Node.JS - Mongoose + MongoDB + Vue.JS
Desenvolvendo com Node.JS - Mongoose + MongoDB + Vue.JSDesenvolvendo com Node.JS - Mongoose + MongoDB + Vue.JS
Desenvolvendo com Node.JS - Mongoose + MongoDB + Vue.JS
 
Sexy Specs on XCode with MacRuby and Rspec (Lightning Talk)
Sexy Specs on XCode with MacRuby and Rspec (Lightning Talk)Sexy Specs on XCode with MacRuby and Rspec (Lightning Talk)
Sexy Specs on XCode with MacRuby and Rspec (Lightning Talk)
 

Semelhante a Busca Visual

isk-daemon: busca visual de imagens para todos
isk-daemon: busca visual de imagens para todosisk-daemon: busca visual de imagens para todos
isk-daemon: busca visual de imagens para todosRicardo Cabral
 
Aplicações rápidas para a Web com Django
Aplicações rápidas para a Web com DjangoAplicações rápidas para a Web com Django
Aplicações rápidas para a Web com DjangoFreedom DayMS
 
Integração Contínua com CruiseControl e phpUnderControl
Integração Contínua com CruiseControl e phpUnderControlIntegração Contínua com CruiseControl e phpUnderControl
Integração Contínua com CruiseControl e phpUnderControlManuel Lemos
 
Integracao Contínua com CruiseControl e phpUnderControl
Integracao Contínua com CruiseControl e phpUnderControlIntegracao Contínua com CruiseControl e phpUnderControl
Integracao Contínua com CruiseControl e phpUnderControlDiego Tremper
 
Mysql cluster quick start webinar
Mysql cluster quick start webinarMysql cluster quick start webinar
Mysql cluster quick start webinarhenriquesidney
 
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)Carlos Duarte do Nascimento
 
Desenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App EngineDesenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App EngineCampus Party Brasil
 
LambdaDay: Backbone.js
LambdaDay: Backbone.jsLambdaDay: Backbone.js
LambdaDay: Backbone.jsGiovanni Bassi
 
Como Perder Peso (no browser)
Como Perder Peso (no browser)Como Perder Peso (no browser)
Como Perder Peso (no browser)Zeno Rocha
 
Integração Contínua com CruiseControl e phpUnderControl
Integração Contínua com CruiseControl e phpUnderControlIntegração Contínua com CruiseControl e phpUnderControl
Integração Contínua com CruiseControl e phpUnderControlDiego Tremper
 
RubyConfBr 2015 - Rails & Javascript: faça isso direito
RubyConfBr 2015 - Rails & Javascript: faça isso direitoRubyConfBr 2015 - Rails & Javascript: faça isso direito
RubyConfBr 2015 - Rails & Javascript: faça isso direitoCezinha Anjos
 
Crawling - Coleta de dados na Web com PHP
Crawling - Coleta de dados na Web com PHP Crawling - Coleta de dados na Web com PHP
Crawling - Coleta de dados na Web com PHP Luis Gustavo Almeida
 
Integração Contínua com Cruise Control e phpUnderControl
Integração Contínua com Cruise Control e phpUnderControlIntegração Contínua com Cruise Control e phpUnderControl
Integração Contínua com Cruise Control e phpUnderControlDiego Tremper
 
Como medir a sua aplicação - Python Brasil 8
Como medir a sua aplicação - Python Brasil 8Como medir a sua aplicação - Python Brasil 8
Como medir a sua aplicação - Python Brasil 8Mauro Baraldi
 
Desenvolvimento Mobile com Ruby
Desenvolvimento Mobile com RubyDesenvolvimento Mobile com Ruby
Desenvolvimento Mobile com RubyRodrigo Martins
 

Semelhante a Busca Visual (20)

isk-daemon: busca visual de imagens para todos
isk-daemon: busca visual de imagens para todosisk-daemon: busca visual de imagens para todos
isk-daemon: busca visual de imagens para todos
 
Implementação de
Implementação de Implementação de
Implementação de
 
Aplicações rápidas para a Web com Django
Aplicações rápidas para a Web com DjangoAplicações rápidas para a Web com Django
Aplicações rápidas para a Web com Django
 
Python Para Maemo
Python Para MaemoPython Para Maemo
Python Para Maemo
 
Aplicacoes Rapidas Para Web Com Django
Aplicacoes Rapidas Para Web Com DjangoAplicacoes Rapidas Para Web Com Django
Aplicacoes Rapidas Para Web Com Django
 
Ruby On Rails Regis
Ruby On Rails RegisRuby On Rails Regis
Ruby On Rails Regis
 
Integração Contínua com CruiseControl e phpUnderControl
Integração Contínua com CruiseControl e phpUnderControlIntegração Contínua com CruiseControl e phpUnderControl
Integração Contínua com CruiseControl e phpUnderControl
 
Integracao Contínua com CruiseControl e phpUnderControl
Integracao Contínua com CruiseControl e phpUnderControlIntegracao Contínua com CruiseControl e phpUnderControl
Integracao Contínua com CruiseControl e phpUnderControl
 
Mysql cluster quick start webinar
Mysql cluster quick start webinarMysql cluster quick start webinar
Mysql cluster quick start webinar
 
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
 
Desenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App EngineDesenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App Engine
 
LambdaDay: Backbone.js
LambdaDay: Backbone.jsLambdaDay: Backbone.js
LambdaDay: Backbone.js
 
Como Perder Peso (no browser)
Como Perder Peso (no browser)Como Perder Peso (no browser)
Como Perder Peso (no browser)
 
Integração Contínua com CruiseControl e phpUnderControl
Integração Contínua com CruiseControl e phpUnderControlIntegração Contínua com CruiseControl e phpUnderControl
Integração Contínua com CruiseControl e phpUnderControl
 
RubyConfBr 2015 - Rails & Javascript: faça isso direito
RubyConfBr 2015 - Rails & Javascript: faça isso direitoRubyConfBr 2015 - Rails & Javascript: faça isso direito
RubyConfBr 2015 - Rails & Javascript: faça isso direito
 
Crawling - Coleta de dados na Web com PHP
Crawling - Coleta de dados na Web com PHP Crawling - Coleta de dados na Web com PHP
Crawling - Coleta de dados na Web com PHP
 
Integração Contínua com Cruise Control e phpUnderControl
Integração Contínua com Cruise Control e phpUnderControlIntegração Contínua com Cruise Control e phpUnderControl
Integração Contínua com Cruise Control e phpUnderControl
 
Como medir a sua aplicação - Python Brasil 8
Como medir a sua aplicação - Python Brasil 8Como medir a sua aplicação - Python Brasil 8
Como medir a sua aplicação - Python Brasil 8
 
Pythonbrasil8
Pythonbrasil8Pythonbrasil8
Pythonbrasil8
 
Desenvolvimento Mobile com Ruby
Desenvolvimento Mobile com RubyDesenvolvimento Mobile com Ruby
Desenvolvimento Mobile com Ruby
 

Mais de gsroma

Python Pythononcampus Uva 060609
Python Pythononcampus Uva 060609Python Pythononcampus Uva 060609
Python Pythononcampus Uva 060609gsroma
 
Why I Love Python V2
Why I Love Python V2Why I Love Python V2
Why I Love Python V2gsroma
 
Amora: A mobile remote assistant
Amora: A mobile remote assistantAmora: A mobile remote assistant
Amora: A mobile remote assistantgsroma
 
Integração de aplicações em
Integração de aplicações emIntegração de aplicações em
Integração de aplicações emgsroma
 
Computação Gráfica em Python
Computação Gráfica em PythonComputação Gráfica em Python
Computação Gráfica em Pythongsroma
 
Python Na Informática Para Biodiversidade
Python Na Informática Para BiodiversidadePython Na Informática Para Biodiversidade
Python Na Informática Para Biodiversidadegsroma
 
Por que Python?
Por que Python?Por que Python?
Por que Python?gsroma
 
Integrando C com Python
Integrando C com PythonIntegrando C com Python
Integrando C com Pythongsroma
 
Pound & Varnish - Cache e Balanceamento de Carga
Pound & Varnish - Cache e Balanceamento de CargaPound & Varnish - Cache e Balanceamento de Carga
Pound & Varnish - Cache e Balanceamento de Cargagsroma
 
ZEO/RelStorage/PostgreSQL
ZEO/RelStorage/PostgreSQLZEO/RelStorage/PostgreSQL
ZEO/RelStorage/PostgreSQLgsroma
 

Mais de gsroma (10)

Python Pythononcampus Uva 060609
Python Pythononcampus Uva 060609Python Pythononcampus Uva 060609
Python Pythononcampus Uva 060609
 
Why I Love Python V2
Why I Love Python V2Why I Love Python V2
Why I Love Python V2
 
Amora: A mobile remote assistant
Amora: A mobile remote assistantAmora: A mobile remote assistant
Amora: A mobile remote assistant
 
Integração de aplicações em
Integração de aplicações emIntegração de aplicações em
Integração de aplicações em
 
Computação Gráfica em Python
Computação Gráfica em PythonComputação Gráfica em Python
Computação Gráfica em Python
 
Python Na Informática Para Biodiversidade
Python Na Informática Para BiodiversidadePython Na Informática Para Biodiversidade
Python Na Informática Para Biodiversidade
 
Por que Python?
Por que Python?Por que Python?
Por que Python?
 
Integrando C com Python
Integrando C com PythonIntegrando C com Python
Integrando C com Python
 
Pound & Varnish - Cache e Balanceamento de Carga
Pound & Varnish - Cache e Balanceamento de CargaPound & Varnish - Cache e Balanceamento de Carga
Pound & Varnish - Cache e Balanceamento de Carga
 
ZEO/RelStorage/PostgreSQL
ZEO/RelStorage/PostgreSQLZEO/RelStorage/PostgreSQL
ZEO/RelStorage/PostgreSQL
 

Busca Visual

  • 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
  • 4. busca visual de imagens  usar:  para encontrar:
  • 5. : 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
  • 6. como usar   arquitetura
  • 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