In [ ]:
from __future__ import print_function
from ipywidgets import interact, interactive, fixed, interact_manual
import ipywidgets as widgets

%matplotlib inline
#Importamos nuestros módulos y clases necesarias
import Image_Classifier as img_clf
import Labeled_Image as li
import classifiers as clfs

from skimage import io
from skimage.color import rgb2gray
from skimage.transform import rescale

import matplotlib.pyplot as plt

In [ ]:
from IPython.display import display
import fileupload
import os
import PIL.Image
import io as io2
import numpy as np

# Inicializamos la clase que se encarga de clasificar imagenes 
clf = img_clf.Image_Classifier(clfs.classifiers.get('svm'))
lbl_img = li.Labeled_Image(clf)

''' Función que se encarga de aplicar las operaciones 
necesarias para convertir los datos obtenidos del FileUpload
en una imagen'''
def imageConverter(change):
        ch = change['owner']
        image = io2.BytesIO(ch.data)
        image = PIL.Image.open(image)
        image = np.array(image)
        return rgb2gray(image)

'''Función mediante la que indicamos el clasificador
con el que clasificaremos la imagen'''
def set_classifier_wrapper(classifier_index):
    clf.set_classifier(clfs.classifiers[classifier_index][0],
                       is_probs_classifier = clfs.classifiers[classifier_index][1])
    
'''Función que nos permite mostrar la imagen'''
def plotter_wrapper():
    lbl_img.boxes_generator_with_nms()
    lbl_img.plotter()

''' Función mediante la que escogemos la imagen'''
def _upload(lbl_img):

    _upload_widget = fileupload.FileUploadWidget()

    def _cb(change):
        image = imageConverter(change)
        lbl_img.set_image(image)
        #lbl_img.predict()
        
    _upload_widget.observe(_cb, names='data')
    display(_upload_widget)
    
'''Función que nos permite mostrar la imagen'''
def rescale_image_selector(lbl_img, rescale_coef):
    if lbl_img.get_original_image() is not None:
        lbl_img.image_rescale(rescale_coef)

def patch_size_selector(Ni, Nj):
    clf.set_patch_size((Ni,Nj))

clf_button = widgets.Button(description="Clasificar")

def on_button_clicked(b):
    # Etiquetamos imagen
    lbl_img.predict()
    # Y la mostramos
    plotter_wrapper()
    
#clf_button.on_click(on_button_clicked)#, clf)

def step_size_selector(istep, jstep):
    clf.set_istep(istep)
    clf.set_jstep(jstep)

def probabilities_selector(probs):
    lbl_img.set_probs(probs)
    lbl_img.predict()
    plotter_wrapper()

def alfa_selector(alfa):
    lbl_img.set_alfa(alfa)

In [ ]:
# Mostramos el widget que permita elegir el clasificador
interact(set_classifier_wrapper, classifier_index = list(clfs.classifiers.keys()));

# Mostramos el widget que permita elegir la imagen a clasificar
_upload(lbl_img)

# Permitimos escoger el rescalado de la imagen, por defecto 1
interact(rescale_image_selector, rescale_coef=(0.3,1,0.001), lbl_img=fixed(lbl_img))

# Permitimos escoger el tamaño de alto y ancho para
# las subdivisiones de la ventana
#interact(patch_size_selector, Ni=(0,100), Nj=(0,100))

# Permitimos escoger el tamaño del salto
# en las subdivisiones de la imagen
interact(step_size_selector, istep=(0,100), jstep=(0,100))

interact(alfa_selector, alfa=(0,1,0.001))

# Por ultimo, mostramos la imagen y permitimos que muestre las ventanas 
# en función de las probabilidades
interact_manual(probabilities_selector, probs=(0.5,1,0.001))

# LLamar al clasificador
#display(clf_button)