{"cells":[{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"import numpy as np\nimport os\nimport pandas as pd\nfrom fastai.vision.all import *","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"set_seed(42) #números gerados aleatoriamento","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"dataset_path = Path('../input/cassava-leaf-disease-classification')\nos.listdir(dataset_path)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df = pd.read_csv(dataset_path/'train.csv')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df['path'] = train_df['image_id'].map(lambda x:dataset_path/'train_images'/x)\ntrain_df = train_df.drop(columns=['image_id'])\ntrain_df = train_df.sample(frac=1).reset_index(drop=True) #shuffle dataframe\ntrain_df.head(10)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df['label'].hist(figsize = (10, 5))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Doenças Possíveis:\n\nCassava Bacterial Blight (CBB) Cassava Brown Streak Disease (CBSD) Cassava Green Mottle (CGM) Cassava Mosaic Disease (CMD) Healthy\n\nA doença \"Cassava Mosaic Disease (CMD)\"é a mais comum"},{"metadata":{"trusted":true},"cell_type":"code","source":"item_tfms = RandomResizedCrop(460, min_scale=0.75, ratio=(1.,1.))\nbatch_tfms = [*aug_transforms(size=384, max_warp=0), Normalize.from_stats(*imagenet_stats)]\nbs=12","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"dls = ImageDataLoaders.from_df(train_df, \n                               splitter=RandomSplitter(0.2, seed=42),#Um número real entre 0 e 1 indicando a fração do conjunto de teste dos dados\n                               label_col=0, #label da primeira coluna do database\n                               fn_col=1, #filename/path da segunda coluna do DataFrame\n                               bs=bs, #passa o tamanho do batch \n                               item_tfms=item_tfms, \n                               batch_tfms=batch_tfms) ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#este bloco importa o modelo resnet50 para o local correto, já que não é possível enviar sem a internet ativada\nif not os.path.exists('/root/.cache/torch/hub/checkpoints/'):\n        os.makedirs('/root/.cache/torch/hub/checkpoints/')\n!cp '../input/resnet50/resnet50.pth' '/root/.cache/torch/hub/checkpoints/resnet50-19c8e357.pth'","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"learn = cnn_learner(dls, resnet50, metrics=[error_rate, accuracy]).to_native_fp16()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"FP16: esta conversão pode ajudar a reduzir o requisito de memória gpu.\nMixup: ajuda a regularizar o modelo, pois é forçado a aprender não apenas um único rótulo de uma imagem, mas uma combinação de rótulos.\n"},{"metadata":{"trusted":true},"cell_type":"code","source":"learn.freeze()\nlearn.fine_tune(1, cbs=[MixUp(0.5)])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"learn.save('estagio-1')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"learn = learn.load('estagio-1')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"learn.unfreeze()\nlearn.fine_tune(6, cbs=[MixUp(0.5)])","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Observou-se que apartir de 8 épocas o modelo não estava aumentando a acurácia, logo\nreduzi para 6 épocas."},{"metadata":{"trusted":true},"cell_type":"code","source":"learn.recorder.plot_loss()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Acima,verificamos a perca do nosso modelo Treinamento/Validação.\nO eixo x representa as épocas e y acurácia.\nLogo econtramos uma estabilidade diminuindo para 6 épocas.\n"},{"metadata":{"trusted":true},"cell_type":"code","source":"learn = learn.to_native_fp32()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"learn.save('estagio-2')","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Verificamos a perda, e colocamos o modelo de volta no fp32 e agora podemos exportar o modelo se quisermos usar mais tarde."},{"metadata":{"trusted":true},"cell_type":"code","source":"learn.export()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#interp = ClassificationInterpretation.from_learner(learn)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#interp.plot_confusion_matrix()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"sample_df = pd.read_csv(dataset_path/'sample_submission.csv')\nsample_df.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"_sample_df = sample_df.copy()\n_sample_df['path'] = _sample_df['image_id'].map(lambda x:dataset_path/'test_images'/x)\n_sample_df = _sample_df.drop(columns=['image_id'])\ntest_dl = dls.test_dl(_sample_df)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_dl.show_batch()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Agora vamos passar o dataloader para o modelo e obter previsões. Usaremos uma técnica de inferência comum conhecida como aumento do tempo de teste (previsões médias ao passar em várias versões aumentadas da imagem de teste). Isso também é implementado no fastai. Vamos fazer 8x TTA"},{"metadata":{"trusted":true},"cell_type":"code","source":"preds, _ = learn.tta(dl=test_dl, n=8, beta=0)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"sample_df['label'] = preds.argmax(dim=-1).numpy()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"sample_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}