{"cells":[{"metadata":{},"cell_type":"markdown","source":"# Laboratorio 4: Clasificación de imagenes\n* Javier Jo\n* Eric Mendoza\n* Marlon Fuentes\n___"},{"metadata":{},"cell_type":"markdown","source":"## Preparación del entorno de ejecución"},{"metadata":{},"cell_type":"markdown","source":"### Carga de librerías"},{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"_kg_hide-output":true},"cell_type":"code","source":"%reload_ext autoreload\n%autoreload 2\n%matplotlib inline\n\nimport seaborn as sns\ncolor = sns.color_palette()\nsns.set_style('darkgrid')\n\nfrom fastai import *\nfrom fastai.vision import *\nimport pandas as pd\nimport matplotlib.pyplot as plt\n\nfrom sklearn.metrics import cohen_kappa_score","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Función para calcular el coeficiene utilizado de comparación\ndef quadratic_kappa(y_hat, y):\n    return torch.tensor(cohen_kappa_score(torch.round(y_hat), y, weights='quadratic'),device='cuda:0')","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Carga de data\nSe tomó como ejemplo de carga de data el método utilizado en este [notebook](https://www.kaggle.com/carlolepelaars/efficientnetb5-with-keras-aptos-2019) de Carlo Lepelaars y por eso e forkeó al inicio."},{"metadata":{"trusted":true},"cell_type":"code","source":"import os\nos.listdir('../input')\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def seed_everything(seed):\n    random.seed(seed)\n    os.environ['PYTHONHASHSEED'] = str(seed)\n    np.random.seed(seed)\n    torch.manual_seed(seed)\n    torch.cuda.manual_seed(seed)\n    torch.backends.cudnn.deterministic = True\n\nSEED = 999\nseed_everything(SEED)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"base_image_dir = os.path.join('..', 'input/aptos2019-blindness-detection/')\ntrain_dir = os.path.join(base_image_dir,'train_images/')\ndf = pd.read_csv(os.path.join(base_image_dir, 'train.csv'))\ndf['path'] = df['id_code'].map(lambda x: os.path.join(train_dir,'{}.png'.format(x)))\ndf = df.drop(columns=['id_code'])\ndf = df.sample(frac=1).reset_index(drop=True) #shuffle dataframe\ndf.head","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## 1. Análisis exploratorio"},{"metadata":{},"cell_type":"markdown","source":"### Tamaño de dataset\nSe cuenta con la siguiente cantidad de imagenes para entrenar los modelos."},{"metadata":{"trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"len_df = len(df)\nprint(len_df)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Distribución de variable respuesta\nComo se observa en la siguiente gráfica, se tiene una gran cantidad de imagenes con diagnóstico 0. Esto no es beneficioso para realizar las pruebas, sin embargo, por consejo de la profesora Lynette, se considera utilizar los datasets de otros concursos de Kaggle."},{"metadata":{"trusted":true},"cell_type":"code","source":"f, ax = plt.subplots(figsize=(10, 6))\nsns.countplot(df['diagnosis'])\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Dimensiones de imagen\nPara poder análizar las imagenes en un tiempo considerable y de manera significativa, la imagen a procesaro no debe estar como nos es entregada. Por ejemplo, la siguiente imagen tiene dimensiones demasiado grandes."},{"metadata":{"trusted":true},"cell_type":"code","source":"from PIL import Image\nim = Image.open(df['path'][1])\nplt.imshow(np.asarray(im))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"width, height = im.size\nprint(\"Dimensiones %s, %s\" % (width,height)) ","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Redimensionamiento de dataset\nSe desea que todas las imagenes tengan la misma cantidad de luz, estén con la misma orientación y tengan el mismo zoom. Se aplicarán las siguientes transformaciones."},{"metadata":{"trusted":true},"cell_type":"code","source":"batch = 64\ndimension = 224\ntrans = get_transforms(do_flip=True, flip_vert=True, max_rotate=360, max_warp=0, max_zoom=1.1, max_lighting=0.1, p_lighting=0.5)\nsrc = (ImageList.from_df(df=df,path='./',cols='path').split_by_rand_pct(0.2).label_from_df(cols='diagnosis', label_cls=FloatList))\ndata = (src.transform(trans, size=dimension, resize_method=ResizeMethod.SQUISH, padding_mode='zeros').databunch(bs=batch, num_workers=4).normalize(imagenet_stats))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## 2. Modelo de redes neuronales simples\nAhora que se tiene normalizado el dataset, se utilizará un modelo de redes neuronales simple, en el que se utilizará la librería fastai."},{"metadata":{"trusted":true},"cell_type":"code","source":"simple_model = cnn_learner(data, base_arch=models.resnet50, metrics = [quadratic_kappa])","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Se quiere utilizar los parámetros óptimos para la red neuronal, por lo cual se procede a buscar el *learning rate* que minimice el *loss*."},{"metadata":{"trusted":true},"cell_type":"code","source":"simple_model.lr_find()\nsimple_model.recorder.plot(suggestion=True)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Como se observa en la gráfica anterior, el *loss* se minimiza alrededor de 1e-02, por lo que se utilizará ese valor para el learning rate en el entrenamiento."},{"metadata":{"trusted":true},"cell_type":"code","source":"simple_model.fit_one_cycle(4,max_lr = 1e-2)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## 3. Modelo de deep learning"},{"metadata":{},"cell_type":"markdown","source":"## 4. Comparación de algoritmos\nPara comparar los modelos se utilizará el Cohen's quadratically weighted kappa, que es el que se utiliza en la competencia de Kaggle para ver qué tan bueno es el modelo. Por lo tanto, procedemos a mostrar los coeficientes obtenidos para cada uno."},{"metadata":{},"cell_type":"markdown","source":"### Modelo neuronal simple"},{"metadata":{},"cell_type":"markdown","source":"### Deep Learning"},{"metadata":{},"cell_type":"markdown","source":"### Conclusión\nDebido a la "}],"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":1}