from google.colab import drive
drive.mount('/content/drive/')
Dataset from: http://maviintelligence.com/
# Pickle para los datasets
import pickle
# Librerias para manejo de imagenes y matrices
import math
import random
import pandas as pd
import numpy as np
import scipy
from scipy import ndimage
import time
import matplotlib.pyplot as plt
from PIL import Image
import imageio
import cv2
from __future__ import absolute_import, division, print_function, unicode_literals
# Librerias TensorFlow y tf.keras para manejo del modelo
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Activation, Flatten, Conv2D, MaxPooling2D
from keras.models import model_from_json
from keras.models import load_model
from tensorflow.python.framework import ops
# Librerias para matriz de confusion y metricas
from sklearn.metrics import confusion_matrix
from sklearn.metrics import accuracy_score
from sklearn.metrics import precision_score
from sklearn.metrics import recall_score
from sklearn.metrics import f1_score
print("Version de TensorFlow: "+str(tf.__version__))
etiquetasTest = pd.read_excel('/content/drive/My Drive/ia/Dataset/test.xlsx',header=None, index_col=None)
arregloTest = np.array(etiquetasTest)
etiquetasTrain = pd.read_excel('/content/drive/My Drive/ia/Dataset/train.xlsx',header=None, index_col=None)
arregloTrain = np.array(etiquetasTrain)
#IMAGENES TRAIN A ARRAY
#Resolucion imagen (res x res)
res = 100
#Cantidad de imagenes
n = np.size(arregloTrain,axis=0)
lista_bikes_x_train = []
lista_bikes_y_train = []
#test_bikes_x = np.array([])
#test_bikes_y = np.array([])
for i in range(0,n):
numeroImagen = arregloTrain[i][1]
etiquetaImagen = arregloTrain[i][0]
# Nombre de cada imagen, debe ser tipo bycX.png, con X = numero de imagen
my_image = "byc"+str(numeroImagen)+".png"
# Ruta completa
fname = "/content/drive/My Drive/ia/Dataset/Maviintelligence Bicyle Dataset/train/" + my_image
# Transforma la imagen a arreglo
image = cv2.imread(fname)
#image = np.array(imageio.imread(fname))
# Cambia el tamano
resize_image = cv2.resize(image, (res, res))
# Anade a las imagenes y a las etiquetas
lista_bikes_x_train.append(resize_image)
lista_bikes_y_train.append(etiquetaImagen)
#plt.imshow(resize_image)
#resize_image.shape
#IMAGENES TESTEO A ARRAY
#Resolucion imagen (res x res)
res = 100
#Cantidad de imagenes
n = np.size(arregloTest,axis=0)
lista_bikes_x_test = []
lista_bikes_y_test = []
#test_bikes_x = np.array([])
#test_bikes_y = np.array([])
for i in range(0,n):
numeroImagen = arregloTest[i][1]
etiquetaImagen = arregloTest[i][0]
# Nombre de cada imagen, debe ser tipo bycX.png, con X = numero de imagen
my_image = "byc"+str(numeroImagen)+".png"
# Ruta completa
fname = "/content/drive/My Drive/ia/Dataset/Maviintelligence Bicyle Dataset/test/" + my_image
# Transforma la imagen a arreglo
image = cv2.imread(fname)
#image = np.array(imageio.imread(fname))
# Cambia el tamano
resize_image = cv2.resize(image, (res, res))
# Anade a las imagenes y a las etiquetas
lista_bikes_x_test.append(resize_image)
lista_bikes_y_test.append(etiquetaImagen)
#plt.imshow(resize_image)
#resize_image.shape
# El pickle = version anterior (color)
# El pickle con 1 en nombre = version ultima (ByN)
pickle_out = open("train_X.pickle", "wb")
pickle.dump(lista_bikes_x_train, pickle_out)
pickle_out.close()
pickle_out = open("train_Y.pickle", "wb")
pickle.dump(lista_bikes_y_train, pickle_out)
pickle_out.close()
pickle_out = open("test_X.pickle", "wb")
pickle.dump(lista_bikes_x_test, pickle_out)
pickle_out.close()
pickle_out = open("test_Y.pickle", "wb")
pickle.dump(lista_bikes_y_test, pickle_out)
pickle_out.close()
!mv /content/train_X.pickle /content/drive/My\ Drive/ia/Dataset
!mv /content/test_X.pickle /content/drive/My\ Drive/ia/Dataset
!mv /content/train_Y.pickle /content/drive/My\ Drive/ia/Dataset
!mv /content/test_Y.pickle /content/drive/My\ Drive/ia/Dataset
trainX = pickle.load(open("/content/drive/My Drive/ia/Dataset/train_X.pickle", "rb"))
trainY = pickle.load(open("/content/drive/My Drive/ia/Dataset/train_Y.pickle", "rb"))
testX = pickle.load(open("/content/drive/My Drive/ia/Dataset/test_X.pickle", "rb"))
testY = pickle.load(open("/content/drive/My Drive/ia/Dataset/test_Y.pickle", "rb"))
class_names = ['ruta', 'urbana', 'montana', 'doble', 'no_es']
total = []
# Se anaden las imagenes totales a lista total
for i in range(len(trainX)):
total.append([trainX[i], trainY[i]])
for i in range(len(testX)):
total.append([testX[i], testY[i]])
# Se mezclan para no tener patrones previos
random.shuffle(total)
X = []
Y = []
for etiquetada in total:
X.append(etiquetada[0])
Y.append(etiquetada[1])
print("Total de imagenes: "+str(len(X)))
# Conversion de datasets cargados en arreglos numpy para su manejo matricial.
X_np = np.array(X)
Y_np = np.array(Y)
# Resolucion
res = 100
# Proporcion
proptrain = 85
proptest = 15
# Normalizar
X_np = X_np/255.0
# Total de datos
train_total = X_np.shape[0]
# Particion
indice = int(train_total*(proptrain/100))
trainX1 = X_np[0:indice]
trainY1 = Y_np[0:indice]
testX1 = X_np[indice:]
testY1 = Y_np[indice:]
train_total = X_np.shape[0]
print ("Numero de datos total = " + str(train_total))
print ("Numero de ejemplos de entrenamiento = " + str(int(train_total*proptrain/100)))
print ("Numero de ejemplos de testeo = " + str(int(train_total*proptest/100)))
print ("Proporción train/total = "+str(proptrain)+"%")
print ("Proporción test/total = "+str(proptest)+"%")
print ("Forma de las imagenes X (shape): " + str(X_np.shape))
print ("Forma de las etiquetas Y (shape): " + str(Y_np.shape))
index1 = 1500
plt.imshow(X[index1])
print("Clase: "+str(Y[index1])+" : "+class_names[Y[index1]])
print(X[index1].shape)
# Inicializa un modelo de tipo Secuencial:
model = Sequential()
# 3 capas convolucionales para el filtrado:
# 1 capa con funcion de activacion ReLu para entrada de datos y pooling para
# filtrar valores mas significativos
model.add(Conv2D(32, (3, 3), input_shape = X_np.shape[1:]))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2,2)))
# 1 capa con funcion de activacion ReLu y pooling para filtrar valores mas
# significativos
model.add(Conv2D(64, (3, 3)))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2,2)))
# 1 capa con funcion de activacion ReLu, pooling y dropout activado para
# "apagar" neuronas durante el entrenamiento, evitando overfitting
model.add(Conv2D(64, (3, 3)))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.25))
# 1 capa de formato para aplanar los datos
model.add(Flatten())
# 2 capas ocultas con función de activación ReLu completamente conectadas
model.add(Dense(128))
model.add(Activation("relu"))
model.add(Dense(128))
model.add(Activation("relu"))
# Una capa de salida con funcion de activacion SoftMax
model.add(Dense(5))
model.add(Activation("softmax"))
# El optimizador para el backward sera ADAM por su eficiencia
model.compile(loss="sparse_categorical_crossentropy",
optimizer="adam",
metrics=["accuracy"])
# Se entrena el modelo y se obtienen los resultados:
# validation_split corresponds to the percentage of images used for the validation phase compared to all the images
history = model.fit(trainX1, trainY1, batch_size=32, epochs=40, validation_split=0.17)
plt.plot(history.history['loss'])
plt.title('Grafica Loss vs Epochs')
plt.ylabel('loss (perdida)')
plt.xlabel('epoch (iteraciones)')
plt.legend(['train', 'test'], loc='upper left')
plt.show()
# summarize history for accuracy
plt.plot(history.history['accuracy'])
plt.title('Grafica Accuracy vs Epochs')
plt.ylabel('accuracy (exactitud)')
plt.xlabel('epoch (iteraciones')
plt.legend(['train', 'test'], loc='upper left')
plt.show()
#Se realiza predicciones sobre las imagenes de testeo
predictions = model.predict(testX1)
#Se crea un arreglo con las predicciones arrojadas por el modelo
prediccion=[]
for i in predictions:
prediccion.append(np.argmax(i))
matriz = confusion_matrix(testY1, prediccion, labels=[0, 1, 2,3,4])
y_pred = prediccion
y_true = testY1
print("\t\t\t MATRIZ DE CONFUSION")
print("\n\t\t\t\t[valor de prediccion]")
a = "\t\t\t"
for i in range(0, matriz.shape[0]):
a = a + str(class_names[i])+"\t"
print(a)
for i in range(0, matriz.shape[0]):
a = "\t\t%s\t"%(class_names[i])
for j in range(0, matriz.shape[1]):
a = a+ str(matriz[i][j]) + "\t"
print(a)
print(" [valor real]")
print("\nLa precision fue de: "+str(precision_score(y_true, y_pred, average = "macro")))
print("El recall o sensibilidad fue de: "+str(recall_score(y_true, y_pred, average = "macro")))
print("El f1 score fue de: "+str(f1_score(y_true, y_pred, average = "macro")))
#Evaluar la precisión
testX_np = np.array(testX1)
testY_np = np.array(testY1)
test_loss, test_acc = model.evaluate(testX_np, testY_np)
print('La exactitud o accuracy fue de:', test_acc)
print('La pérdida o loss fue de:', test_loss)
# Resolucion
res = 100
# Nombre de la imagen
my_image = "doble3.png"
# Ruta de la imagen
fname = "/content/" + my_image
# Lectura de la imagen en rgb
image = cv2.imread(fname)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# Cambio de tamano y normalizacion
resize_image = cv2.resize(image, (res, res))
resize_image = resize_image/255.
arregloMuestra = np.array([resize_image])
#my_image = resize_image.reshape(1, res*res*3).T
#Se realiza predicciones sobre las imagenes de testeo
predictions = model.predict(arregloMuestra)
clase_prediction = np.argmax(predictions[0])
plt.imshow(image)
#predic = np.squeeze(my_image_prediction)
print("El modelo predice: y = " + str(clase_prediction))
print(str(clase_prediction)+": bicicleta de tipo : "+str(class_names[clase_prediction]))
# Resolucion
res = 100
predicciones_prueba = []
numero = 0
for imagen in imagenes_prueba:
# Cambio de tamano y normalizacion
resize_image = cv2.resize(imagen, (res, res))
resize_image = resize_image/255.
arregloMuestra = np.array([resize_image])
#my_image = resize_image.reshape(1, res*res*3).T
#Se realiza predicciones sobre las imagenes de testeo
predictions = model.predict(arregloMuestra)
clase_prediction = np.argmax(predictions[0])
predicciones_prueba.append(clase_prediction)
numero+=1
print("Para la imagen "+str(numero)+":")
print("El modelo predice: y = " + str(clase_prediction))
print(str(clase_prediction)+": bicicleta de tipo : "+str(class_names[clase_prediction]))
plt.imshow(imagen)
plt.show()
#predic = np.squeeze(my_image_prediction)