{"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_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"from fastai.vision.all import *\nfrom skimage import measure\nfrom skimage.transform import rescale, resize\nfrom skimage.util import crop, montage\nfrom skimage.morphology import label, square, dilation, watershed\nfrom skimage.io import imsave\n\n\nfrom tqdm.notebook import trange, tqdm\nfrom PIL import Image","metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","execution":{"iopub.status.busy":"2021-08-30T14:42:57.800824Z","iopub.execute_input":"2021-08-30T14:42:57.801196Z","iopub.status.idle":"2021-08-30T14:43:02.020812Z","shell.execute_reply.started":"2021-08-30T14:42:57.801165Z","shell.execute_reply":"2021-08-30T14:43:02.019828Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\ndf= pd.read_csv('../input/cropped-imges-and-masks/crops_with_ships.csv')\n","metadata":{"execution":{"iopub.status.busy":"2021-08-30T14:43:02.023154Z","iopub.execute_input":"2021-08-30T14:43:02.023637Z","iopub.status.idle":"2021-08-30T14:43:02.359604Z","shell.execute_reply.started":"2021-08-30T14:43:02.023600Z","shell.execute_reply":"2021-08-30T14:43:02.358580Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"##### len(df)","metadata":{"execution":{"iopub.status.busy":"2021-08-28T22:54:57.50229Z","iopub.execute_input":"2021-08-28T22:54:57.502683Z","iopub.status.idle":"2021-08-28T22:54:57.511352Z","shell.execute_reply.started":"2021-08-28T22:54:57.502648Z","shell.execute_reply":"2021-08-28T22:54:57.510113Z"}}},{"cell_type":"markdown","source":"### Tratamiento del CSV\nComo podemos observar, en el CSV va a aparecer una entrada por barco, por lo tanto, cuando aparece más de un barco en la misma imagen, ésta aparecerá tantas veces en el csv como barcos contenga. Vamos a agrupar todos los barcos de la imagen en una sola entrada, agrupando por ImageId y uniendo encoded pixels con un espacio de separación. Además de ello, para mayor facilidad en el entrenamiento posterior añadiremos un nuevo campo que llamaremos \"has_ship\" que vale 1 en caso de contener barcos y 0 en caso de no contenerlos. https://blog.softhints.com/python-detect-prevent-typeerror/","metadata":{}},{"cell_type":"code","source":"def image_open(img_path):\n    return np.array(Image.open(img_path))\n\ndef apply_mask(image,mask):\n    imax,jmax=mask.shape\n    image_masked=np.copy(image)\n    for i in range(imax):\n        for j in range(jmax):\n            if mask[i,j]==1:\n                image_masked[i,j,[0,0]]=170\n    return image_masked\n","metadata":{"execution":{"iopub.status.busy":"2021-08-30T14:43:02.361159Z","iopub.execute_input":"2021-08-30T14:43:02.361659Z","iopub.status.idle":"2021-08-30T14:43:02.370852Z","shell.execute_reply.started":"2021-08-30T14:43:02.361563Z","shell.execute_reply":"2021-08-30T14:43:02.369524Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Clasificación\nEmpezar entrenando un modelo que clasifique las imágenes de entrada etiquetándolas como imágenes que contenen barcos e imagenes que no contienen barcos. Debido a que el dataset contienen muchás más imágenes que no contienen barcos, primero utilizarémos este modelo para **eliminar todas las imágnes que no contengan barcos posibles** para, posteriormente, utilizar un segundo modelo **entrenado exclusivemente para la segmentación en imagénes que contengan barcos**. \n","metadata":{}},{"cell_type":"code","source":"def get_x(r): return os.path.join('../input/cropped-imges-and-masks/croppedmasks/crops',r['img_name'])\ndef get_y(r): return r['has_ships']\n\n","metadata":{"execution":{"iopub.status.busy":"2021-08-30T14:43:02.373231Z","iopub.execute_input":"2021-08-30T14:43:02.374222Z","iopub.status.idle":"2021-08-30T14:43:02.382839Z","shell.execute_reply.started":"2021-08-30T14:43:02.374176Z","shell.execute_reply":"2021-08-30T14:43:02.381479Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dblock= DataBlock(blocks=(ImageBlock,CategoryBlock),get_x=get_x, get_y=get_y)\ndls=dblock.dataloaders(df, bs=64)\n","metadata":{"execution":{"iopub.status.busy":"2021-08-30T14:43:02.388107Z","iopub.execute_input":"2021-08-30T14:43:02.388586Z","iopub.status.idle":"2021-08-30T14:44:52.254325Z","shell.execute_reply.started":"2021-08-30T14:43:02.388552Z","shell.execute_reply":"2021-08-30T14:44:52.253173Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dls.train.show_batch(max_n=4,unique=True)","metadata":{"execution":{"iopub.status.busy":"2021-08-30T14:44:52.256528Z","iopub.execute_input":"2021-08-30T14:44:52.257069Z","iopub.status.idle":"2021-08-30T14:44:52.937595Z","shell.execute_reply.started":"2021-08-30T14:44:52.257022Z","shell.execute_reply":"2021-08-30T14:44:52.936155Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dls.valid.show_batch(max_n=4)","metadata":{"execution":{"iopub.status.busy":"2021-08-30T14:44:52.939101Z","iopub.execute_input":"2021-08-30T14:44:52.939604Z","iopub.status.idle":"2021-08-30T14:44:53.959356Z","shell.execute_reply.started":"2021-08-30T14:44:52.939557Z","shell.execute_reply":"2021-08-30T14:44:53.958196Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dls.show_batch(nrows=2,ncols=4)","metadata":{"execution":{"iopub.status.busy":"2021-08-30T14:44:53.960947Z","iopub.execute_input":"2021-08-30T14:44:53.961629Z","iopub.status.idle":"2021-08-30T14:44:55.509474Z","shell.execute_reply.started":"2021-08-30T14:44:53.961558Z","shell.execute_reply":"2021-08-30T14:44:55.503135Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"learn=cnn_learner(dls,resnet34, metrics=accuracy,loss_func=CrossEntropyLossFlat())\n\n","metadata":{"execution":{"iopub.status.busy":"2021-08-30T14:44:55.511639Z","iopub.execute_input":"2021-08-30T14:44:55.512094Z","iopub.status.idle":"2021-08-30T14:45:00.367727Z","shell.execute_reply.started":"2021-08-30T14:44:55.512044Z","shell.execute_reply":"2021-08-30T14:45:00.366509Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"learn.lr_find()","metadata":{"execution":{"iopub.status.busy":"2021-08-30T14:45:00.369631Z","iopub.execute_input":"2021-08-30T14:45:00.370064Z","iopub.status.idle":"2021-08-30T14:45:34.126013Z","shell.execute_reply.started":"2021-08-30T14:45:00.370003Z","shell.execute_reply":"2021-08-30T14:45:34.124689Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"learn.fine_tune(15, base_lr=2e-3,freeze_epochs=1)","metadata":{"execution":{"iopub.status.busy":"2021-08-30T14:45:34.127784Z","iopub.execute_input":"2021-08-30T14:45:34.128321Z","iopub.status.idle":"2021-08-30T15:17:51.123470Z","shell.execute_reply.started":"2021-08-30T14:45:34.128274Z","shell.execute_reply":"2021-08-30T15:17:51.119447Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"learn.save('Resnet34_256_crops')\n","metadata":{"execution":{"iopub.status.busy":"2021-08-30T15:17:51.125391Z","iopub.status.idle":"2021-08-30T15:17:51.126676Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#deberías hacer esto para cargar los pesos aprendidos\n#learn.load('Resnet34')","metadata":{"execution":{"iopub.status.busy":"2021-08-30T15:17:51.128370Z","iopub.status.idle":"2021-08-30T15:17:51.129538Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"learn.show_results()","metadata":{"execution":{"iopub.status.busy":"2021-08-30T15:17:51.131317Z","iopub.status.idle":"2021-08-30T15:17:51.132529Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"learn.recorder.plot_loss()","metadata":{"execution":{"iopub.status.busy":"2021-08-30T15:17:51.134246Z","iopub.status.idle":"2021-08-30T15:17:51.135356Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}