20 Nuestros propio clasificador de imágenes (2)
- Hola a todos.Una vez finalizado el curso de google nos disponemos a crear nuestro propio clasificador de imágenes.En esta segunda entrada veremos en detalle el código implementado para poder entrenar nuestro modelo.
- Os dejo un vídeo donde explico que hace el código implementado con el objetivo de clasificar nuestros conjuntos de imágenes de perros y de gatos que descargamos en el capítulo anterior:
- Os dejo el código visto en el vídeo:
#importamos librerias necesarias
import sys
from PIL import Image
sys.modules['Image'] = Image
import os
from tensorflow.python.keras import optimizers #libreria optimizadores para entrenar modelo
from tensorflow.python.keras.preprocessing.image import ImageDataGenerator # libreria prepocesa imagenes
from tensorflow.python.keras.layers import Dropout, Flatten, Dense, Activation # Libreria para las capas
from tensorflow.python.keras.layers import Convolution2D, MaxPooling2D #capas donde hacemos convuliones
from tensorflow.python.keras.models import Sequential # libreria para redes neuronales secuenciales
from tensorflow.python.keras import backend as K
from tensorflow.python.keras import applications
K.clear_session() # limpiamos por si hubiera algo corriendo
datosEntrenamiento = './imagenes/entrenamiento' #ruta imagenes enetrenamiento
datosValidacion = './imagenes/validacion' # ruta imagenes validacion
longitud, altura = 224, 224
#longitud y altura de las imagenes.Le pongo 224 en el ancho y alto porque es lo que se espera el
#el modelo preentrenado
#reescalamos las imágenes para que los valores en vez de ir de 1 a 255(posibles valores pixel) vayan de 0 a 1.
#shear_range--> inclina imágenes
#horizontal_flip --> invierte imágenes
entDatagen = ImageDataGenerator(rescale=1. / 255,shear_range=0.2,zoom_range=0.2,horizontal_flip=True)
#en el grupo de validación simplemente reescalamos
validacionDatagen = ImageDataGenerator(rescale=1. / 255)
#carga las imágenes de entrenammiento y las procesa según la altura pasada y las clasifica en modo el modo categorical
Entrenamiento = entDatagen.flow_from_directory(datosEntrenamiento,
target_size=(altura, longitud),batch_size=32,class_mode='categorical')
#carga las imágenes de validación y las procesa según la altura pasada y las clasifica en modo el modo categorical
Validacion = validacionDatagen.flow_from_directory(datosValidacion,
target_size=(altura, longitud),
batch_size=32, class_mode='categorical')
#cargamo el modelo preentrenado
vgg=applications.vgg16.VGG16()
#vgg=applications.vgg16.VGG16()# Ejemplo del modelo
cnn=Sequential()
#cargamos las capas del modelo preentrenado en nuestro modelo secuencial y quitamos la última capa
for capa in vgg.layers:
cnn.add(capa)
cnn.layers.pop()
#queremos que solo se entrenna la capa que añadimos nosotros asi que le decimos layer.trainable=False
for layer in cnn.layers:
layer.trainable=False
#añadimos nuestra capa
cnn.add(Dense(2,activation='softmax'))
#compilamos nuestro modelo utilizando el optimizado de Adam
cnn.compile(loss='categorical_crossentropy',
optimizer=optimizers.Adam(lr=0.0004),
metrics=['accuracy'])
#utilizamos la función v para entrenar el algoritmo
cnn.fit_generator(Entrenamiento,steps_per_epoch=100,epochs=20,validation_data=Validacion,validation_steps=300)
#una vez entreando guardamos nuestro modelo
cnn.save('./modelo/modelo.h5')
cnn.save_weights('./modelo/pesos.h5')
import numpy as np
from tensorflow.keras.preprocessing.image import load_img, img_to_array
from tensorflow.python.keras.models import Sequential # libreria para redes neuronales secuenciales
from tensorflow.keras.models import load_model
from tensorflow.python.keras import applications
from tensorflow.python.keras.layers import Dense
longitud, altura = 224, 224
weights_model='./modelo/pesos.h5'
vgg=applications.vgg16.VGG16()
cnn=Sequential()
for capa in vgg.layers:
cnn.add(capa)
cnn.layers.pop()
for layer in cnn.layers:
layer.trainable=False
cnn.add(Dense(2,activation='softmax'))
cnn.load_weights(weights_model)
def predict(file):
x = load_img(file, target_size=(longitud, altura))
x = img_to_array(x)
x = np.expand_dims(x, axis=0)
array = cnn.predict(x)
result = array[0]
answer = np.argmax(result)
if answer == 0:
print("Gato")
elif answer == 1:
print("Perro")
return answer
No hay comentarios:
Publicar un comentario