{"cells":[{"metadata":{},"cell_type":"markdown","source":"# TAU Vehicle Type Recognition Competition\n\n\nAgora iremos desenvolver um modelo para realizar a classificação dos dados. Dessa vez utilizaremos a biblioteca Keras.\nO objetivo é desenvolver um modelo inicial para então aprimorarmos a arquitetura para o próximo encontro."},{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import os\nfrom collections import defaultdict\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport tensorflow as tf\nimport seaborn as sns\nfrom PIL import Image # biblioteca para o processamento de imagens\nfrom tqdm import tqdm_notebook as tqdm # biblioteca para exibição de barra de progresso","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"O conjunto de dados de teste está presente na subpasta `testset` dentro da pasta `test` e não possui os rótulos, pois somente o Kaggle possui as anotações reais para fazer a avaliação do modelo.\n\nPara facilitar o desenvolvimento do modelo, vamos realizar uma etapa de pré-processamento dos dados para formatá-los em um DataFrame utilizando a biblioteca `pandas`."},{"metadata":{"trusted":true},"cell_type":"code","source":"root = '../input/vehicle/train/train'\ndata = []\nfor category in sorted(os.listdir(root)):\n    for file in sorted(os.listdir(os.path.join(root, category))):\n        data.append((category, os.path.join(root, category,  file)))\n\ndf = pd.DataFrame(data, columns=['class', 'file_path'])\ndf.head()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Adicionando as imagens ao dataframe\n"},{"metadata":{},"cell_type":"markdown","source":"## Amostragem\n\nDivisão dos dados de treino e teste"},{"metadata":{"trusted":true},"cell_type":"code","source":"from sklearn.model_selection import train_test_split\n\nX = df[\"file_path\"].values\nclasses = dict()\nfor i, _class in enumerate(df[\"class\"].unique()):\n    classes[_class] = i\ny = df[\"class\"].apply(lambda x: classes[x]).values\n\nX_train, X_test, Y_train, Y_test = train_test_split( \\\n     X, y, test_size=0.33, random_state=42)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"X_train.shape, X_test.shape, Y_train.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from tensorflow import keras\nfrom tensorflow.keras import layers\n\n# Model / data parameters\nimage_size = (320, 320)\nnum_classes = len(classes)\ninput_shape = image_size + (3,)\n\n\n# convert class vectors to binary class matrices\nY_train = keras.utils.to_categorical(Y_train, num_classes)\nY_test = keras.utils.to_categorical(Y_test, num_classes)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model = keras.Sequential(\n    [\n        keras.Input(shape=input_shape),\n        layers.Conv2D(32, kernel_size=(3, 3), activation=\"relu\"),\n        layers.MaxPooling2D(pool_size=(2, 2)),\n        layers.Conv2D(64, kernel_size=(3, 3), activation=\"relu\"),\n        layers.MaxPooling2D(pool_size=(2, 2)),\n        layers.Flatten(),\n        layers.Dropout(0.5),\n        layers.Dense(num_classes, activation=\"softmax\"),\n    ]\n)\n\nmodel.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"batch_size = 128\n\nmodel.compile(loss=\"categorical_crossentropy\", optimizer=\"adam\", metrics=[\"accuracy\"])\n\n# Executando uma época \n\nfor i in range(int(X_train.shape[0]/batch_size)):\n    x_train = np.array([np.array(tf.keras.preprocessing.image.load_img(x, target_size=image_size)) for x in X_train[i*batch_size:(i+1)*batch_size]])\n    y_train = Y_train[i*batch_size:(i+1)*batch_size]\n        \n    # Scale images to the [0, 1] range\n    x_train = x_train.astype(\"float32\") / 255\n    \n    ret = model.train_on_batch(x_train, y_train)\n    print(f\"Train loss: {ret[0]} \\t\\t accuracy:{ret[1]}\")\n\n# model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, validation_split=0.1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_loss = []\ntest_acc = []\nfor i in range(int(X_test.shape[0]/batch_size)):\n\n    x_test = np.array([np.array(tf.keras.preprocessing.image.load_img(x, target_size=image_size)) for x in X_test[i*batch_size:(i+1)*batch_size]])\n    x_test = x_test.astype(\"float32\") / 255\n    y_test = Y_test[i*batch_size:(i+1)*batch_size]\n    score = model.evaluate(x_test, y_test, verbose=0)\n    test_loss.append(score[0])\n    test_acc.append(score[1])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(f\"Test loss: {np.mean(test_loss)}\\t\\t accuracy:{np.mean(test_acc)}\")","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Desafios\n\n1) Melhorar a acurácia do modelo  Tentar arquiteturas diferentes ou adicionar mais camadas a rede.\n        \n2) Realizar o treinamento com mais épocas"}],"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}