Beruflich Dokumente
Kultur Dokumente
En este artículo, presentaré varias técnicas para que dé los primeros pasos hacia
el desarrollo de un algoritmo que podría usarse para un problema clásico
de clasificación de imágenes: detectar la raza de un perro a partir de una
imagen.
Al final de este artículo, habremos desarrollado un código que aceptará cualquier
imagen proporcionada por el usuario como entrada y devolverá una estimación de
la raza del perro. Además, si se detecta un ser humano, el algoritmo proporcionará
una estimación de la raza de perro que más se asemeja.
Las primeras capas de la red pueden detectar características simples como líneas,
círculos, bordes. En cada capa, la red puede combinar estos hallazgos y aprender
continuamente conceptos más complejos a medida que profundizamos en las
capas de la red neuronal.
La capa convolucional (o capa Conv) es el núcleo de lo que hace una red neuronal
convolucional. La capa Conv consiste en un conjunto de filtros. Cada filtro se
puede considerar como un cuadrado pequeño (con un ancho y una altura fijos)
que se extiende a través de la profundidad total del volumen de entrada.
Durante cada pasada, el filtro ‘se desplaza’ en el ancho y la altura del volumen de
entrada. Este proceso da como resultado un mapa de activación bidimensional que
proporciona las respuestas de ese filtro en cada posición espacial.
Para evitar un ajuste excesivo, las capas de agrupación se utilizan para aplicar la
reducción de muestreo no lineal en los mapas de activación. En otras palabras,
agrupar capas es agresivo al descartar información, pero puede ser útil si se usa de
forma adecuada. Una capa Pooling a menudo seguiría una o dos Capas Conv en la
arquitectura CNN.
import
cv2
import matplotlib.pyplot as plt
%matplotlib inline
from
keras.applications.resnet50
import ResNet50
from keras.preprocessing import image
from tqdm import tqdm
def paths_to_tensor(img_paths):
list_of_tensors = [path_to_tensor(img_path) for
img_path in tqdm(img_paths)]
return np.vstack(list_of_tensors)
from
keras.applications.resnet50
import preprocess_input,
decode_predictions
def ResNet50_predict_labels(img_path):
# returns prediction vector for image located at
img_path
img = preprocess_input(path_to_tensor(img_path))
return np.argmax(ResNet50_model.predict(img))
### Obtain
bottleneck
features
from
another
pre-
trained
CNN.
bottleneck_features = np.load('bottleneck_features/DogResnet50Data.npz')
train_DogResnet50 = bottleneck_features['train']
valid_DogResnet50 = bottleneck_features['valid']
test_DogResnet50 = bottleneck_features['test']
Resnet50_model.summary()
_______________________________________________________
____ Layer (type) Output Shape Param #
=======================================================
========== global_average_pooling2d_3 ( (None, 2048) 0
_______________________________________________________
__________ dense_3 (Dense) (None, 133) 272517
=======================================================
========== Total params: 272,517 Trainable params: 272,517 Non-trainable
params: 0
_______________________________________________________
__________
Como podemos ver en el resultado del código anterior, ¡terminamos con una red
neuronal con 272.517 parámetros!
Resnet50_model.fit(train_DogResnet50, train_targets,
validation_data=(valid_DogResnet50, valid_targets),
epochs=20, batch_size=20, callbacks=[checkpointer])
### Load
the model
weights
with the
best
validation
loss.
Resnet50_model.load_weights('saved_models/weights.best.ResNet50.hdf5')
¡Estamos listos para tomar el algoritmo para dar un giro! Probemos el algoritmo
en algunas imágenes de muestra:
En una nota final, observé que el algoritmo es propenso a errores a menos que sea
una toma clara de frente con muy poco ruido / información adicional sobre la
imagen. Por lo tanto, necesitamos hacer que el algoritmo sea más robusto al ruido.
El aumento de imagen puede ser útil para resolver esto, que es un tema que trataré
en un artículo futuro.