{"cells":[{"metadata":{},"cell_type":"markdown","source":"# Preparação do ambiente\n\nImporta bibliotecas necessárias para o funcionamento do notebook"},{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import numpy as np \nimport pandas as pd\nimport tensorflow as tf\n\nfrom fastai.vision.all import *","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Define de onde os dados serão lidos"},{"metadata":{"trusted":true},"cell_type":"code","source":"df_train = pd.read_csv(\"../input/cassava-leaf-disease-classification/train.csv\")\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Carrega as imagens e mostra algumas delas"},{"metadata":{"trusted":true},"cell_type":"code","source":"path = Path('../input/cassava-leaf-disease-classification')\ndls = ImageDataLoaders.from_df(df_train, path=path, folder='train_images', item_tfms=Resize(224), valid_pct=0.1, seed=42, bs=64, batch_tfms=aug_transforms())\ndls.show_batch()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Cria o diretório models de onde os modelos serão lidos. Copia os modelos dos datasets para esses diretórios pois eles são somente leitura."},{"metadata":{"trusted":true},"cell_type":"code","source":"# Antes de rodar esta linha, é necessário fazer o upload do modelo treinado como se fosse um dataset\n# Clicar em \"+ Add data\" nas opções da esquerda e fazer o upload do modelo previamente gravado (aqui chamado meuModelo.pth)\n\n\n!mkdir -p models/\n#!cp -f \"../input/cassava-classification-fastai-train/saved_model-balanced.pth\" /kaggle/working/models/ #Best score\n!cp -f \"../input/cassava-classification-fastai-train/saved_model-v16.pth\" /kaggle/working/models/\n!cp -f \"../input/collabmodels/collab-v3.pth\" /kaggle/working/models/\n!cp -f \"../input/collabmodels/best_model_resnet50.pth\" /kaggle/working/models/","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Carregando o modelo\n\nCria a CNN. Observe que os parâmetros devem ser os mesmos do treinamento"},{"metadata":{"trusted":true},"cell_type":"code","source":"# Prepara o modelo e carregar\n\nlearn = cnn_learner(dls, resnet50, metrics=[error_rate,accuracy], pretrained=False,  path='/kaggle/working')\n#learn = learn.load(\"/kaggle/working/models/saved_model-balanced\")","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Carrega o modelo efetivamente"},{"metadata":{"trusted":true},"cell_type":"code","source":"learn.load(\"best_model_resnet50\")","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Predição\n\nLê o conjunto de testes"},{"metadata":{"trusted":true},"cell_type":"code","source":"# Aplicar o modelo no conjunto de teste\n\ntest_files = get_image_files('../input/cassava-leaf-disease-classification/test_images')\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Faz a predição "},{"metadata":{"trusted":true},"cell_type":"code","source":"test_dl = learn.dls.test_dl(test_files, with_label=True)\npred_probas, x, pred_classes = learn.get_preds(dl=test_dl, with_decoded=True) ","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Esse método classify foi uma possibilidade que eu testei e depois acabei não usando.\n\nA ideia era verificar as probabilidades de cada classe e se o modelo estivesse 'em dúvida' escolhesse uma outra classe, ou até mesmo a classe 3 (majoritária)"},{"metadata":{"trusted":true},"cell_type":"code","source":"def classify(tensor1):\n     #Ordena os valores do tensor1\n     values, indexes = tf.math.top_k(tensor1, k=5, sorted=True, name=None)\n     arr_values  = values.numpy()\n     arr_indexes = indexes.numpy()\n     first  = arr_values[0]\n     second = arr_values[1]\n     # Se a diferenca for pequena escolhe o primeiro, senao escolhe o segundo elemento\n     if ((first-second) > 0.2):\n         #print('Primeiro')\n         return arr_indexes[0]\n     else:\n         #print('Segundo')\n         #return arr_indexes[1]\n         return 3","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Cria o dataframe com os resultados"},{"metadata":{"trusted":true},"cell_type":"code","source":"\n\nimport os\n\nrows = []\nfor file, label, prob in zip(test_files, pred_classes, pred_probas):\n    #label_code = classify(prob)\n    row = {'image_id': os.path.basename(file), 'label': int(label)}\n    rows.append(row)\ndf = pd.DataFrame(rows)\n\n    ","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Mostra uma parte do dataframe para ver se o mesmo está correto"},{"metadata":{"trusted":true},"cell_type":"code","source":"df.head()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Gera o arquivo de submissão"},{"metadata":{"trusted":true},"cell_type":"code","source":"df.to_csv('./submission.csv', index=False)","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}