Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Searching Images in Elasticsearch using Luminoth

Searching Images in Elasticsearch using Luminoth

Agustín Azzinnari

July 26, 2018
Tweet

More Decks by Agustín Azzinnari

Other Decks in Programming

Transcript

  1. Visión por Computadora ¿Qué puedo hacer con una imagen? Hay

    un gato. 4 (millones de sumas y multiplicaciones después…) (y muchos kWh gastados después...) (y mucho tiempo después...)
  2. Visión por Computadora De clasificación a detección Clasificación Hay un

    gato en la foto 6 Localización Hay un gato en la foto y está acá Detección Hay dos gatos en la foto y están acá y acá
  3. Visión por Computadora ¿Qué ve una computadora? Una matriz muy

    muy grande. Millones de entradas. 7 rojo verde azul 1280 720
  4. Visión por Computadora Aprendizaje automático Clásico Extraigo features de las

    imágenes y las paso por un algoritmo de clasificación. Deep learning Paso la imagen directamente por un algoritmo de clasificación más complejo. 9 Modelo Estadístico
  5. Visión por Computadora Redes neuronales Redes neuronales para clasificación, surge

    en los 80. Utilización de convoluciones en estas redes (Yann LeCun, 1989), para crear redes neuronales convolucionales. 10 Lector de dígitos en cheques. LeNet-5, Yann LeCun, 1998.
  6. Visión por Computadora Convoluciones Filtro que mira una región pequeña

    de la imagen y detecta un determinado patrón. 11 Los encadeno y detecto patrones más complejos.
  7. Arrastro cada filtro por la imagen para producir un mapa

    de activaciones. Visión por Computadora La operación Convolución 12 Source: https://github.com/vdumoulin/conv_arithmetic Uso más filtros para detectar patrones sobre los mapas de activación (patrones sobre patrones sobre patrones…).
  8. Resultado de una capa convolucional 13 Visión por Computadora ...

    Imagen original 1280 x 720 x 3 1280 x 720 x 1 1280 x 720 x 64
  9. Resumiendo información: Max Pooling 14 Visión por Computadora ... ...

    1280 x 720 x 64 640 x 360 x 64 Regiones de 2x2 se convierten 1x1 (max en c/u/)
  10. Cómo se ve el max pooling 15 Visión por Computadora

    Resumen de la información de distintas regiones de la imagen.
  11. Visión por Computadora Preguntas ¿Cómo configuro los filtros/patrones a detectar?

    → Se aprenden mirando muchas imágenes. Son pesos comunes de una red (usando backpropagation). ¿Cuántos filtros tengo que usar por capa? → Hiperparámetro de la red (probar varios números y ver qué funciona mejor). 16 Source: https://cs231n.github.io/understanding-cnn/
  12. Luminoth ¿Qué es Luminoth? Librería/toolkit open-source para visión por computadora

    detección de objetos. 19 CLI tools Modelos pre-entrenados Cloud integration
  13. Luminoth Objetivos 20 Simple y pronto para usar Production ready

    Open source Código legible Extensible y modular
  14. $ pip install luminoth $ lumi predict video.mp4 -k car

    Found 1 files to predict. Neither checkpoint not config specified, assuming `accurate`. Predicting video.mp4 [#############] 100% fps: 5.9 Simplicidad como objetivo 21 Luminoth
  15. Luminoth Código abierto import sonnet as snt def RPN(snt.AbstractModule): def

    __init__(self, *args, name='rpn'): [...] # submodules init, config def _build(self, inputs): # TensorFlow code. return outputs 22 +
  16. $ lumi dataset transform --type pascal --data-dir /data/pascal --output /data/

    # Create tfrecords for optimizing data consumption. $ lumi train --config pascal-fasterrcnn.yml # Hours of training... $ tensorboard --logdir jobs/ # On another GPU/Machine/CPU. $ lumi eval --config pascal-fasterrcnn.yml # Checks for new checkpoints and writes logs. # Finally. $ lumi server web --config pascal-fasterrcnn.yml # Looks for checkpoint and loads it into a simple frontend/json API server. Ciclo de uso de Luminoth 23 Luminoth
  17. Luminoth Más opciones 25 $ pip install luminoth $ lumi

    --help Usage: lumi [OPTIONS] COMMAND [ARGS]... Options: -h, --help Show this message and exit. Commands: checkpoint Groups of commands to manage checkpoints cloud Groups of commands to train models in the cloud dataset Groups of commands to manage datasets eval Evaluate trained (or training) models predict Obtain a model's predictions server Groups of commands to serve models train Train models
  18. Subiendo y buscando imágenes Demo @app.route('/store/', methods=['POST']) def store_image(): #

    [...] Validation and retrieve `image` from POST data. # Perform the object detection (using Luminoth). objects = detect_objects(image) # [...] Generate a unique ID and store to disk. # Prepare the document and index to Elasticsearch. doc = { 'image_name': filename, 'image_id': image_id, 'objects': objects, } store_doc(doc) # Return the detected objects. return jsonify(doc) 27 https://github.com/nagitsu/imsearch/blob/master/api/api/app.py#L37 @app.route('/search/', methods=['POST']) def search_images(): # [...] Validation and retrieve `image` from POST data. s = search() qs = [] if 'term' in query: qs.append(Q('match', objects__label=query['term'])) # [...] Rest of the query building. if qs: s = s.filter( 'nested', path='objects', query=Q('bool', must=qs) ) s = s[offset:offset + limit] raw_hits = s.execute() hits = [hit.to_dict() for hit in raw_hits] return jsonify(result=hits, count=raw_hits.hits.total) https://github.com/nagitsu/imsearch/blob/master/api/api/app.py#L84
  19. Detectando objetos Demo from luminoth.tools.checkpoint import get_checkpoint_config from luminoth.utils.predicting import

    PredictorNetwork def load_detector(): config = get_checkpoint_config(settings.LUMI_CHECKPOINT) detector = PredictorNetwork(config) return detector def detect_objects(image): detector = load_detector() return detector.predict_image(image) 28 https://github.com/nagitsu/imsearch/blob/master/api/api/store.py [{ "label": "dog", "height": 376, "width": 326, "x": 12, "y": 30 }, { "label": "dog", "height": 319, "width": 304, "x": 280, "y": 74 }] N.B.: En el código detector se cachea y el formato de los objetos se modifica antes de devolver. Salida de ejemplo:
  20. Índice Demo from elasticsearch import Elasticsearch from elasticsearch_dsl import Search

    def store_doc(doc): es.index( index=settings.ES_INDEX, doc_type=DOC_TYPE, body=doc ) def search(): return Search( using=es, index=settings.ES_INDEX, doc_type=DOC_TYPE ) es = Elasticsearch([settings.ES_HOST], retry_on_timeout=True) 29 https://github.com/nagitsu/imsearch/blob/master/api/api/index.py { 'image_name': {'type': 'keyword'}, 'image_id': {'type': 'keyword'}, 'objects': { 'type': 'nested', 'properties': { 'label': {'type': 'text'}, 'width': {'type': 'integer'}, 'height': {'type': 'integer'}, 'x': {'type': 'integer'}, 'y': {'type': 'integer'}, } }, } Mapping: