En este notebook creará un conjunto de imagenes con caras y no caras mediante las que obtendremos las características de HoG que nos servirán como conjunto de entrenamiento para nuestro clasificador.
Además, estas características serán serializadas para que podamos acceder a ellas las veces que deseemos evitando su procesamiento.
HoG es una técnica para la extracción de características, desarrollada en el contexto del procesamiento de imagenes, que involucra los siguientes pasos:
In [ ]:
from sklearn.datasets import fetch_lfw_people
faces = fetch_lfw_people()
positive_patches = faces.images
positive_patches.shape
In [2]:
# from skimage import io
# from skimage.color import rgb2gray
# positive_patches = list()
# path = "../imgaug/imgs/"
# for i in range(376):
# for j in range(63):
# image = io.imread(path+str(i)+str(j)+".jpg")
# positive_patches.append(rgb2gray(image))
Una vez obtenido nuestro conjunto de positivos, necesitamos obtener un conjunto de imagenes que no tengan caras. Para ello, la técnica que se utiliza en el notebook en el que me estoy basando es subdividir imágenes de mayor tamaño que no contengan caras. Y, así, obtener múltiples imágenes.
In [72]:
from skimage import feature, color, data, transform
imgs_to_use = ['camera', 'text', 'coins', 'moon',
'page', 'clock', 'immunohistochemistry',
'chelsea', 'coffee', 'hubble_deep_field']
images = [color.rgb2gray(getattr(data, name)())
for name in imgs_to_use]
In [73]:
import numpy as np
from sklearn.feature_extraction.image import PatchExtractor
def extract_patches(img, N, scale=1.0, patch_size=positive_patches[0].shape):
extracted_patch_size = tuple((scale * np.array(patch_size)).astype(int))
extractor = PatchExtractor(patch_size=extracted_patch_size,
max_patches=N, random_state=0)
patches = extractor.transform(img[np.newaxis])
if scale != 1:
patches = np.array([transform.resize(patch, patch_size)
for patch in patches])
return patches
negative_patches = np.vstack([extract_patches(im, 1000, scale)
for im in images for scale in [0.5, 1.0, 2.0]])
negative_patches.shape
# Alternativa
# negative_patches = np.vstack([extract_patches(im, 1000, scale, patch_size=(62,47))
# for im in images for scale in [0.5, 1.0, 2.0]])
# negative_patches.shape
Out[73]:
In [74]:
from itertools import chain
positive_patches = np.array(positive_patches)
print(negative_patches.shape, positive_patches.shape)
X_train = np.array([feature.hog(im)
for im in chain(positive_patches,
negative_patches)])
y_train = np.zeros(X_train.shape[0])
y_train[:positive_patches.shape[0]] = 1
In [75]:
import pickle # Módulo para serializar
path = '../../rsc/obj/'
X_train_path = path + 'X_train.sav'
y_train_path = path + 'y_train.sav'
pickle.dump(X_train, open(X_train_path, 'wb'))
pickle.dump(y_train, open(y_train_path, 'wb'))