{"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":"%%capture\n!pip install timm","metadata":{"execution":{"iopub.execute_input":"2021-06-07T19:35:43.154289Z","iopub.status.busy":"2021-06-07T19:35:43.143785Z","iopub.status.idle":"2021-06-07T19:35:51.274409Z","shell.execute_reply":"2021-06-07T19:35:51.273201Z"},"papermill":{"duration":8.151319,"end_time":"2021-06-07T19:35:51.274576","exception":false,"start_time":"2021-06-07T19:35:43.123257","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import time\nfrom tqdm import tqdm_notebook as tqdm\n#import tqdm.notebook import tqdm\nimport cv2\nfrom PIL import Image\nimport numpy as np\nimport pandas as pd\nimport torch\nimport albumentations as A\nfrom albumentations.pytorch import ToTensorV2\nfrom torch.utils.data import DataLoader, Dataset\nfrom torch.optim import lr_scheduler\nimport timm\nimport warnings\nwarnings.filterwarnings('ignore')","metadata":{"execution":{"iopub.execute_input":"2021-06-07T19:35:51.29886Z","iopub.status.busy":"2021-06-07T19:35:51.298106Z","iopub.status.idle":"2021-06-07T19:35:55.001858Z","shell.execute_reply":"2021-06-07T19:35:55.000942Z"},"papermill":{"duration":3.717981,"end_time":"2021-06-07T19:35:55.001999","exception":false,"start_time":"2021-06-07T19:35:51.284018","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!ls -l ../input/bird-watch-spring-2022","metadata":{"execution":{"iopub.execute_input":"2021-06-07T19:35:55.029664Z","iopub.status.busy":"2021-06-07T19:35:55.024294Z","iopub.status.idle":"2021-06-07T19:35:55.665819Z","shell.execute_reply":"2021-06-07T19:35:55.665351Z"},"papermill":{"duration":0.654567,"end_time":"2021-06-07T19:35:55.665948","exception":false,"start_time":"2021-06-07T19:35:55.011381","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class args:\n    lr = 0.0001\n    epochs = 5\n    batch_size = 96\n    num_workers = 8\n    folds = 5","metadata":{"execution":{"iopub.execute_input":"2021-06-07T19:35:55.689472Z","iopub.status.busy":"2021-06-07T19:35:55.68899Z","iopub.status.idle":"2021-06-07T19:35:55.692695Z","shell.execute_reply":"2021-06-07T19:35:55.692227Z"},"papermill":{"duration":0.017035,"end_time":"2021-06-07T19:35:55.692802","exception":false,"start_time":"2021-06-07T19:35:55.675767","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"alldf = pd.read_csv('../input/bird-watch-spring-2022/train.csv')\n# Split the training dataset into a training and a validation\nvaldf = alldf[::args.folds]\ntrndf = alldf[~alldf.filename.isin(valdf.filename)]\n# Load our test data\ntstdf = pd.read_csv('../input/bird-watch-spring-2022/test.csv')\nmetadf = pd.read_csv('../input/bird-watch-spring-2022/metadata.csv')\nmetadf = metadf.set_index('label')\nprint(f'File shapes -- train : {trndf.shape}, valid : {valdf.shape}, test : {tstdf.shape}')\ntrndf.head()","metadata":{"execution":{"iopub.execute_input":"2021-06-07T19:35:55.718888Z","iopub.status.busy":"2021-06-07T19:35:55.71839Z","iopub.status.idle":"2021-06-07T19:35:55.795148Z","shell.execute_reply":"2021-06-07T19:35:55.794202Z"},"papermill":{"duration":0.093059,"end_time":"2021-06-07T19:35:55.795263","exception":false,"start_time":"2021-06-07T19:35:55.702204","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"imgnetmeans = [0.22363983, 0.18190407, 0.2523437 ]\nimgnetstds = [0.32451536, 0.2956294,  0.31335256]\n# Using albumentations, check some examples here : https://albumentations.readthedocs.io/en/latest/examples.html \ndef trntransforms():\n    return A.Compose([\n        A.HorizontalFlip(p=0.5),\n        A.Transpose(p=0.5),\n        ToTensorV2(),\n        ])\n\ndef tsttransforms():\n    return A.Compose([\n        ToTensorV2(),\n    ])\n\nclass BirdDataset(Dataset):\n    def __init__(self, df, mode, transform=None):\n        self.data = df\n        self.img_dir = '../input/bird-watch-spring-2022/'\n        self.transform = transform\n        self.mode = mode\n\n    def __len__(self):\n        return len(self.data)\n\n    def __getitem__(self, idx):\n        \n        fname = self.data.iloc[idx]['filename']\n        img_path = f'{self.img_dir}/{fname}'\n        image = cv2.imread(img_path)\n        if self.transform is not None:\n            image = self.transform(image = image)['image']\n        image = image.float() / 255.\n        label = -1 if self.mode=='test' else self.data.iloc[idx]['label']\n        \n        return image, label","metadata":{"execution":{"iopub.execute_input":"2021-06-07T19:35:55.825592Z","iopub.status.busy":"2021-06-07T19:35:55.824365Z","iopub.status.idle":"2021-06-07T19:35:55.827132Z","shell.execute_reply":"2021-06-07T19:35:55.826716Z"},"papermill":{"duration":0.02155,"end_time":"2021-06-07T19:35:55.827252","exception":false,"start_time":"2021-06-07T19:35:55.805702","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Define our dataset\ntrndataset = BirdDataset(trndf, 'train', trntransforms())\nvaldataset = BirdDataset(valdf, 'valid', tsttransforms())\ntstdataset = BirdDataset(tstdf, 'test', tsttransforms())","metadata":{"execution":{"iopub.execute_input":"2021-06-07T19:35:55.852296Z","iopub.status.busy":"2021-06-07T19:35:55.851626Z","iopub.status.idle":"2021-06-07T19:35:55.85396Z","shell.execute_reply":"2021-06-07T19:35:55.85432Z"},"papermill":{"duration":0.016776,"end_time":"2021-06-07T19:35:55.854442","exception":false,"start_time":"2021-06-07T19:35:55.837666","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Test the dataset\nimg, label = next(iter(trndataset))\nspecies = metadf.loc[label]['name']\nprint(f'Species : {species}')\n#Image.fromarray(img)\nimgviz = (img * 255).transpose(0, 2).numpy().astype(np.uint8)\nImage.fromarray(imgviz)","metadata":{"execution":{"iopub.execute_input":"2021-06-07T19:35:55.880072Z","iopub.status.busy":"2021-06-07T19:35:55.879331Z","iopub.status.idle":"2021-06-07T19:35:55.97922Z","shell.execute_reply":"2021-06-07T19:35:55.9788Z"},"papermill":{"duration":0.114321,"end_time":"2021-06-07T19:35:55.979324","exception":false,"start_time":"2021-06-07T19:35:55.865003","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"loaderargs = {'num_workers' : args.num_workers, 'batch_size':args.batch_size, 'pin_memory': False, 'drop_last': False}\ntrnloader = DataLoader(trndataset, shuffle = True, **loaderargs)\nvalloader = DataLoader(valdataset, shuffle = False, **loaderargs)\ntstloader = DataLoader(tstdataset, shuffle = False, **loaderargs)","metadata":{"execution":{"iopub.execute_input":"2021-06-07T19:35:56.009992Z","iopub.status.busy":"2021-06-07T19:35:56.009332Z","iopub.status.idle":"2021-06-07T19:35:56.011713Z","shell.execute_reply":"2021-06-07T19:35:56.012067Z"},"papermill":{"duration":0.019641,"end_time":"2021-06-07T19:35:56.012196","exception":false,"start_time":"2021-06-07T19:35:55.992555","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# creates efficientnet-b0 architecture\ndevice = torch.device(\"cuda:0\")\nmodel = timm.create_model('efficientnet_b2', pretrained = True)\nmodel = model.to(device)\noptimizer = torch.optim.Adam(model.parameters(), lr=args.lr)\n# Loss function\ncriterion = torch.nn.CrossEntropyLoss()\nscheduler = lr_scheduler.StepLR(optimizer, step_size=10)\nnum_epochs = args.epochs","metadata":{"execution":{"iopub.execute_input":"2021-06-07T19:35:56.050537Z","iopub.status.busy":"2021-06-07T19:35:56.049982Z","iopub.status.idle":"2021-06-07T19:36:02.013996Z","shell.execute_reply":"2021-06-07T19:36:02.013442Z"},"papermill":{"duration":5.988605,"end_time":"2021-06-07T19:36:02.014139","exception":false,"start_time":"2021-06-07T19:35:56.025534","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"since = time.time()\nfor epoch in range(num_epochs):\n    print('Epoch {}/{}'.format(epoch, num_epochs - 1))\n    scheduler.step()\n    model.train()\n    running_loss = 0.0\n    tk0 = tqdm(trnloader, total=int(len(trnloader)))\n    for step, batch in enumerate(tk0):\n        inputs = batch[0].to(device, dtype=torch.float)\n        labels = batch[1].to(device).long()\n        optimizer.zero_grad()\n        outputs = model(inputs)\n        loss = criterion(outputs, labels)\n        loss.backward()\n        optimizer.step()\n        running_loss += loss.item()\n        tk0.set_postfix(train_loss=(running_loss / (step+1)))\n        \n    valpreds = []\n    model.eval()\n    running_loss = 0.0\n    tkval = tqdm(valloader, total=int(len(valloader)))\n    for step, batch in enumerate(tkval):\n        inputs = batch[0].to(device, dtype=torch.float)\n        labels = batch[1].to(device).long()\n        with torch.no_grad():\n            outputs = model(inputs)\n            loss = criterion(outputs, labels)\n        valpreds .append(outputs)\n        running_loss += loss.item()\n        tkval.set_postfix(valid_loss=(running_loss / (step+1)))\n    preds = torch.cat(valpreds).argmax(1).detach().cpu().numpy()\n    print(f'Valid accuracy {(valdf.label.values == preds).mean():.4f}')","metadata":{"execution":{"iopub.execute_input":"2021-06-07T19:36:02.052918Z","iopub.status.busy":"2021-06-07T19:36:02.052069Z","iopub.status.idle":"2021-06-07T19:49:49.544628Z","shell.execute_reply":"2021-06-07T19:49:49.545058Z"},"papermill":{"duration":827.516887,"end_time":"2021-06-07T19:49:49.545225","exception":false,"start_time":"2021-06-07T19:36:02.028338","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Submit \ntstpreds = []\ntktst = tqdm(tstloader, total=int(len(tstloader)))\nfor step, batch in enumerate(tktst):\n    inputs = batch[0].to(device, dtype=torch.float)\n    with torch.no_grad():\n        outputs = model(inputs)\n        tstpreds.append(outputs)\npredicted_labels = torch.cat(tstpreds).argmax(1).detach().cpu().numpy()\ntstdf['label'] = predicted_labels","metadata":{"execution":{"iopub.execute_input":"2021-06-07T19:49:49.611266Z","iopub.status.busy":"2021-06-07T19:49:49.610339Z","iopub.status.idle":"2021-06-07T19:50:08.871844Z","shell.execute_reply":"2021-06-07T19:50:08.871363Z"},"papermill":{"duration":19.307635,"end_time":"2021-06-07T19:50:08.871976","exception":false,"start_time":"2021-06-07T19:49:49.564341","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"tstdf.to_csv('submission.csv', index = False)","metadata":{"execution":{"iopub.execute_input":"2021-06-07T19:50:08.915599Z","iopub.status.busy":"2021-06-07T19:50:08.9149Z","iopub.status.idle":"2021-06-07T19:50:09.050864Z","shell.execute_reply":"2021-06-07T19:50:09.050262Z"},"papermill":{"duration":0.159083,"end_time":"2021-06-07T19:50:09.050992","exception":false,"start_time":"2021-06-07T19:50:08.891909","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"papermill":{"duration":0.019615,"end_time":"2021-06-07T19:50:09.089968","exception":false,"start_time":"2021-06-07T19:50:09.070353","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"papermill":{"duration":0.018843,"end_time":"2021-06-07T19:50:09.128409","exception":false,"start_time":"2021-06-07T19:50:09.109566","status":"completed"},"tags":[]},"execution_count":null,"outputs":[]}]}