{"cells":[{"metadata":{},"cell_type":"markdown","source":"# CLASIFICACIÓN DE RAZAS DE PERROS"},{"metadata":{},"cell_type":"markdown","source":"![](https://img2.rtve.es/i/?w=1600&i=1493315930816.jpg)* "},{"metadata":{},"cell_type":"markdown","source":"# **Integrantes:**\n\n1. Hollman Esteban González Suárez 2172002\n2. Kevin Alonso Luna Bustos 2172022\n3. Jhoann Sebastian Martinez Oviedo 2171995"},{"metadata":{},"cell_type":"markdown","source":"# Contexto\nEl conjunto de datos de Stanford Dogs contiene imágenes de 120 razas de perros de todo el mundo. Este conjunto de datos se ha creado utilizando imágenes y anotaciones de ImageNet para la tarea de categorización detallada de imágenes. Originalmente se recopiló para la categorización de imágenes de grano fino, un problema desafiante ya que ciertas razas de perros tienen características casi idénticas o difieren en color y edad.\n\n# Contenido\nNúmero de categorías: 120\nNúmero de imágenes: 20.580\nAnotaciones: etiquetas de clase, cuadros delimitadores\n\n# Agradecimientos\nLa fuente de datos original se encuentra en http://vision.stanford.edu/aditya86/ImageNetDogs/ y contiene información adicional sobre las divisiones de entrenamiento / prueba y los resultados de referencia.\n\n# DATASET Usado\nSe uso la versión del dataset publicado por Dog-breed-identification en la plataforma de Kaggle."},{"metadata":{},"cell_type":"markdown","source":"# **Librerías a importar**"},{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import matplotlib.pyplot as plt\nimport os,shutil,math,scipy,cv2\nfrom tensorflow import keras\nimport tensorflow as tf\nimport seaborn as sns\nimport pandas as pd\nimport random as rn\nimport numpy as np\n\nfrom sklearn.utils import shuffle\nfrom sklearn.metrics import classification_report\nfrom sklearn.model_selection import train_test_split\n\nfrom PIL import Image\nfrom PIL import Image as pil_image\nfrom PIL import ImageDraw\n\nfrom tqdm import tqdm\nfrom skimage.io import imread\nfrom IPython.display import SVG\n\nfrom scipy import misc,ndimage\nfrom scipy.ndimage.interpolation import zoom\n\nfrom keras.utils.np_utils import to_categorical\nfrom keras import layers\nfrom keras.applications.vgg16 import VGG16,preprocess_input\nfrom keras.models import Sequential,Input,Model\nfrom keras.layers import Dense,Flatten,Dropout,Concatenate,GlobalAveragePooling2D,Lambda,ZeroPadding2D\nfrom keras.preprocessing.image import ImageDataGenerator\nfrom keras.optimizers import Adam,SGD","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# **DATASET**"},{"metadata":{"trusted":true},"cell_type":"code","source":"#Dirección de los ficheros\nlabels = pd.read_csv('/kaggle/input/dog-breed-identification/labels.csv')\ntrain_dir = '/kaggle/input/dog-breed-identification/train'\ntest_dir = '/kaggle/input/dog-breed-identification/test'","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#Razas de perros\ndogs_breeds = ['scottish_deerhound','maltese_dog','entlebucher','pomeranian','labrador_retriever','basenji','airedale','leonberg','blenheim_spaniel','siberian_husky']\nD = []\nZ = []\nimgsize = 150   \ndef label_assignment(img):\n    img = img.rsplit( \".\", 1 )[ 0 ]\n    label = \"\".join(labels[labels.id == img].breed.unique())\n    return label\n\ndef resize_dataset(data_dir):\n    for img in tqdm(os.listdir(data_dir)):\n        label = label_assignment(img)\n        if label in dogs_breeds:\n            path = os.path.join(data_dir,img)\n            img = cv2.imread(path,cv2.IMREAD_COLOR)\n            img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)\n            img = cv2.resize(img,(imgsize,imgsize))\n            D.append(np.array(img))\n            Z.append(str(label))\n\n        \nresize_dataset(train_dir)\nresize_dataset(test_dir)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df = pd.DataFrame()\ndf['breed'] = Z\nprint(df['breed'].value_counts())\nprint('\\n#Total Load Image:   '+str(len(df.breed)))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Cantidad de Imagenes de Cada Raza Seleccionada\n\n- scottish_deerhound\n- maltese_dog\n- entlebucher\n- pomeranian\n- labrador_retriever\n- basenji\n- airedale\n- leonberg\n- blenheim_spaniel\n- siberian_husky "},{"metadata":{"trusted":true},"cell_type":"code","source":"#function to show bar length\ndef barw(ax): \n    for p in ax.patches:\n        val = p.get_width() #height of the bar\n        x = p.get_x() + p.get_width() # x-position \n        y = p.get_y() + p.get_height()/2 #y-position\n        ax.annotate(round(val,2),(x,y))\n        \n#finding top dog brands\nplt.figure(figsize = (15, 4))\nlab = labels[labels['breed'].isin(dogs_breeds)].breed\nax0 = sns.countplot(y=lab,order=lab.value_counts().index)\nbarw(ax0)\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#Se crean dos diccionarios para pasar las clases de forma numerica a texto.\nclass_dogs_breeds = {'scottish_deerhound': 0,'maltese_dog': 1,'entlebucher': 2,'pomeranian': 3,'labrador_retriever': 4,'basenji': 5,'airedale': 6,'leonberg': 7,'blenheim_spaniel': 8,'siberian_husky': 9}\nclass_dogs_breeds2 = {0:'scottish_deerhound',1:'maltese_dog',2:'entlebucher',3:'pomeranian',4:'labrador_retriever',5:'basenji',6:'airedale',7:'leonberg',8:'blenheim_spaniel',9:'siberian_husky'}\n\nT = [class_dogs_breeds[item] for item in Z]\nY = to_categorical(T,10)\nX = np.array(D)\nX = X/255\n\nx_train,x_test,y_train,y_test = train_test_split(X,Y,test_size=0.2,random_state=42)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Imagenes Aleatoria de las Razas de Perros"},{"metadata":{"trusted":true},"cell_type":"code","source":"fig,ax=plt.subplots(5,2)\nfig.set_size_inches(20,20)\nfor i in range(5):\n    for j in range (2):\n        l=rn.randint(0,len(Z))\n        ax[i,j].imshow(X[l])\n        ax[i,j].set_title('Dog: '+Z[l])\n        \nplt.tight_layout()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# MODELO VGG16 (RED NEURONAL)"},{"metadata":{},"cell_type":"markdown","source":"![](https://qph.fs.quoracdn.net/main-qimg-e657c195fc2696c7d5fc0b1e3682fde6)* "},{"metadata":{},"cell_type":"markdown","source":"![](https://mlux9brz2apw.i.optimole.com/y1pDtVQ-TuEH2CPN/w:600/h:344/q:auto/https://kgptalkie.com/wp-content/uploads/2020/09/image-102.png)","attachments":{}},{"metadata":{"trusted":true},"cell_type":"code","source":"base_model = VGG16(include_top=False,\n                  input_shape = (imgsize,imgsize,3),\n                  weights = 'imagenet')\n\nfor layer in base_model.layers:\n    layer.trainable = False\n    \nfor layer in base_model.layers:\n    print(layer,layer.trainable)\n\nmodel = Sequential()\nmodel.add(base_model)\nmodel.add(GlobalAveragePooling2D())\nmodel.add(Dropout(0.5))\nmodel.add(Dense(10,activation='softmax'))\nmodel.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"path = os.path.join('../input/dog-breed-identification/test/00102ee9d8eb90812350685311fe5890.jpg')\nimg = cv2.imread(path,cv2.IMREAD_COLOR)\nimg = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)\nimg = cv2.resize(img,(imgsize,imgsize))\nx = img_to_array(img)\nx = x.reshape((1,) + x.shape)\ndatagen1 = ImageDataGenerator(rotation_range=30, fill_mode='nearest')\ndatagen2 = ImageDataGenerator(width_shift_range=0.2, height_shift_range=0.2)\ndatagen3 = ImageDataGenerator(horizontal_flip=True, vertical_flip=False)\ndatagen4 = ImageDataGenerator(zoom_range=0.3)\ndatagen5 = ImageDataGenerator(\n        rotation_range=10,  \n        zoom_range = 0.1, \n        width_shift_range=0.2,  \n        height_shift_range=0.2, \n        horizontal_flip=True,  \n        vertical_flip=False) \n\naug_iter1 = datagen1.flow(x, batch_size=1)\naug_iter2 = datagen2.flow(x, batch_size=1)\naug_iter3 = datagen3.flow(x, batch_size=1)\naug_iter4 = datagen4.flow(x, batch_size=1)\naug_iter5 = datagen5.flow(x, batch_size=1)\n\nimage1 = next(aug_iter1)[0].astype('uint8')\nimage2 = next(aug_iter2)[0].astype('uint8')\nimage3 = next(aug_iter3)[0].astype('uint8')\nimage4 = next(aug_iter4)[0].astype('uint8')\nimage5 = next(aug_iter5)[0].astype('uint8')\n\n# plot image\nfig,ax=plt.subplots(2,3)\nfig.set_size_inches(10,10)\nax[0,0].imshow(img)\nax[0,1].imshow(image5)\nax[0,2].imshow(image1)\nax[1,0].imshow(image2)\nax[1,1].imshow(image3)\nax[1,2].imshow(image4)\nax[0,0].set_title('ORIGINAL IMAGE')\nax[0,1].set_title('DISTORTED')\nax[0,2].set_title('ROTATION')\nax[1,0].set_title('WIDTH AND HEIGHT SHIFT')\nax[1,1].set_title('HORIZONTAL FLIP')\nax[1,2].set_title('ZOOM RANGE')\n        \nplt.tight_layout()\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.compile(\n    loss='categorical_crossentropy',\n    optimizer='adam',\n    metrics=['accuracy']\n)\n\nhistory = model.fit_generator(\n    augs_gen.flow(x_train,y_train, batch_size=16),\n    validation_data  = (x_test,y_test),\n    epochs = 20\n)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"plt.plot(history.history['accuracy'], linestyle='-.', color='g')\nplt.plot(history.history['val_accuracy'], linestyle='--', color='y')\nplt.title('ACCURACY MODEL')\nplt.ylabel('ACCURACY')\nplt.xlabel('EPOCH')\nplt.legend(['TEST', 'TRAIN'], loc='upper left')\n\nplt.show()\n\nplt.plot(history.history['loss'], linestyle='-.', color='g')\nplt.plot(history.history['val_loss'], linestyle='--', color='y')\nplt.title('LOSS MODEL')\nplt.ylabel('LOSS')\nplt.xlabel('EPOCH')\nplt.legend(['TEST', 'TRAIN'], loc='upper left')\n\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"list_img = np.random.randint(0,x_test.shape[0]-1,size=10)\nfor i,img_test in enumerate(x_test[list_img]):\n    x = np.expand_dims(img_test, axis=0)\n    predictions = model.predict(x)\n\n    print(\"valor predicho:\",  np.argmax(predictions))\n    print('raza predicha: ', class_dogs_breeds2[np.argmax(predictions)])\n    print(\"max prob: \", np.max(predictions))\n    print(\"ground truth: \", np.argmax(y_test[list_img[i]]))\n    print('raza ground truth: ', class_dogs_breeds2[np.argmax(y_test[list_img[i]])])\n    plt.imshow(img_test)\n    plt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from sklearn.ensemble import RandomForestClassifier\nfrom sklearn.naive_bayes import GaussianNB\nfrom sklearn.tree import DecisionTreeClassifier\nfrom sklearn.model_selection import KFold, cross_val_score\nfrom sklearn.metrics import *\nfrom sklearn.decomposition import PCA\nfrom sklearn.pipeline import Pipeline\nfrom sklearn.svm import SVC\nX1 = [X[i].flatten() for i in range(X.shape[0])]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"s = cross_val_score(GaussianNB(), X1, T, cv=KFold(5, shuffle=True), scoring=make_scorer(accuracy_score))\nprint(\"accuracy %.3f (+/- %.5f)\"%(np.mean(s), np.std(s))) ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"s = cross_val_score(RandomForestClassifier(), X1, T, cv=KFold(5, shuffle=True), scoring=make_scorer(accuracy_score))\nprint( \"accuracy %.3f (+/- %.5f)\"%(np.mean(s), np.std(s)))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"p = Pipeline(((\"pca\", PCA(n_components=70)), (\"classifier\", SVC(kernel='rbf')) ))\ns = cross_val_score(p, X1, T, cv=KFold(5, shuffle=True), scoring=make_scorer(accuracy_score))\nprint( \"accuracy %.3f (+/- %.5f)\"%(np.mean(s), np.std(s)))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"p = Pipeline(((\"pca\", PCA(n_components=80)), (\"classifier\", RandomForestClassifier() )))\ns = cross_val_score(p, X1, T, cv=KFold(5, shuffle=True), scoring=make_scorer(accuracy_score))\nprint( \"accuracy %.3f (+/- %.5f)\"%(np.mean(s), np.std(s)))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"p = Pipeline(((\"pca\", PCA(n_components=40)), (\"classifier\", DecisionTreeClassifier(max_depth = 10) )))\ns = cross_val_score(p, X1, T, cv=KFold(5, shuffle=True), scoring=make_scorer(accuracy_score))\nprint( \"accuracy %.3f (+/- %.5f)\"%(np.mean(s), np.std(s)))","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat":4,"nbformat_minor":4}