Bag of Words

Bag of Words obtiene las características de una imagen, es decir, las formas, texturas, etc., como palabras [1]. Así, se describe la imagen en función de la frecuencia de cada una de estas palabras o características.

En este notebook entrenaremos un clasificador con la técnica Bag of Words. Lo cual se compone, brevemente explicado, de los siguientes pasos:

  1. Crear el conjunto de entrenamiento.
  2. Crear vocabulario.
    1. Extracción de características.
    2. Construcción del vocabulario mediante Clustering
  3. Entrenar el clasificador.

In [9]:
%matplotlib inline 
import numpy as np
import matplotlib.pyplot as plt

1. Cargamos el conjunto de entrenamiento

La manera en la que cargamos el conjunto de entrenamiento podemos observarlo en el Jupyter Notebook 1_Train_Set_Load.

2. Crear vocabulario

La manera en la que creamos el voacabulario podemos observarlo en el Jupyter Notebook 2A_Daisy_Features y 2B_Clustering.


In [ ]:
path = '../rsc/obj/'

mini_kmeans_path = path + 'mini_kmeans.sav'

mini_kmeans = pickle.load(open(mini_kmeans_path, 'rb'))

3. Obtención de Bag of Words


In [ ]:
trainInstances = []
for imgFeatures in train_features:
    # extrae pertenencias a cluster
    pertenencias = mini_kmeans.predict(imgFeatures)
    # extrae histograma
    bovw_representation, _ = np.histogram(pertenencias, bins=500, range=(0,499))
    # añade al conjunto de entrenamiento final
    trainInstances.append(bovw_representation)
trainInstances = np.array(trainInstances)

Entrenamiento de un clasificador


In [ ]:
from sklearn import svm


classifier = svm.SVC(kernel='linear', C=0.01)
y_pred = classifier.fit(trainInstances, y_train)

In [ ]:
import pickle # Módulo para serializar

path = '../rsc/obj/'

svm_BoW_path = path + 'svm_BoW.sav'

pickle.dump(classifier, open(svm_BoW_path, 'wb'))