{"cells":[{"cell_type":"markdown","metadata":{},"source":["# Bird Classification using ResNet34"]},{"cell_type":"markdown","metadata":{},"source":["## Importing the Libraries"]},{"cell_type":"code","execution_count":3,"metadata":{"execution":{"iopub.execute_input":"2023-01-18T14:04:36.473269Z","iopub.status.busy":"2023-01-18T14:04:36.472756Z","iopub.status.idle":"2023-01-18T14:04:36.482978Z","shell.execute_reply":"2023-01-18T14:04:36.481718Z","shell.execute_reply.started":"2023-01-18T14:04:36.473225Z"},"trusted":true},"outputs":[{"name":"stdout","output_type":"stream","text":["Device: cuda\n"]}],"source":["import torch\n","import torch.nn as nn\n","import torch.nn.functional as F\n","import torch.optim as optim\n","from torchvision import transforms as T\n","import numpy as np\n","import pandas as pd\n","from PIL import Image\n","import matplotlib.pyplot as plt\n","from tqdm import tqdm\n","import os\n","\n","BASE_DIR = \"/kaggle/input/100-bird-species\"\n","device = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n","print(\"Device:\", device)"]},{"cell_type":"markdown","metadata":{},"source":["Setting seed for reproducibility"]},{"cell_type":"code","execution_count":4,"metadata":{"execution":{"iopub.execute_input":"2023-01-18T14:04:36.486482Z","iopub.status.busy":"2023-01-18T14:04:36.485714Z","iopub.status.idle":"2023-01-18T14:04:36.492961Z","shell.execute_reply":"2023-01-18T14:04:36.491874Z","shell.execute_reply.started":"2023-01-18T14:04:36.486442Z"},"trusted":true},"outputs":[],"source":["seed = 42\n","def set_seed(seed):\n"," torch.manual_seed(seed)\n"," torch.backends.cudnn.deterministic = True\n"," torch.backends.cudnn.benchmark = False\n"," np.random.seed(seed)\n","\n","set_seed(seed)"]},{"cell_type":"markdown","metadata":{},"source":["## Loading the Dataset"]},{"cell_type":"markdown","metadata":{},"source":["The dataset is taken from [Kaggle](https://www.kaggle.com/datasets/gpiosenka/100-bird-species) and consists of 70,658 training, 2250 test and 2259 validation images of birds belonging to 450 different species. The images are of size 224x224x3(HxWxC). The `birds.csv` files consists of the class ID, file paths, labels, scientific label and the dataset[train, test, val] to which the image belongs to. The images are read using python `PIL` library and transforms are applied."]},{"cell_type":"code","execution_count":5,"metadata":{"execution":{"iopub.execute_input":"2023-01-18T14:04:36.495763Z","iopub.status.busy":"2023-01-18T14:04:36.494984Z","iopub.status.idle":"2023-01-18T14:04:36.922346Z","shell.execute_reply":"2023-01-18T14:04:36.921376Z","shell.execute_reply.started":"2023-01-18T14:04:36.495724Z"},"trusted":true},"outputs":[],"source":["paths_df = pd.read_csv(os.path.join(BASE_DIR, \"birds.csv\"))\n","paths_df.drop(46620, axis= 0, inplace=True) # The dataset as of 9-Jan-2023 contains a file that is \n","# present at the given index whose dimension is not 224x224. Removing the file to avoid unnecessary complexity in the code\n","labels = paths_df[\"class id\"].unique()\n","bird_name_map = {int(i): paths_df[paths_df[\"class id\"] == i][\"labels\"].values[0] for i in labels}"]},{"cell_type":"code","execution_count":6,"metadata":{"execution":{"iopub.execute_input":"2023-01-18T14:04:36.925610Z","iopub.status.busy":"2023-01-18T14:04:36.925039Z","iopub.status.idle":"2023-01-18T14:04:36.944752Z","shell.execute_reply":"2023-01-18T14:04:36.943733Z","shell.execute_reply.started":"2023-01-18T14:04:36.925570Z"},"trusted":true},"outputs":[{"data":{"text/html":["
\n"," | class id | \n","filepaths | \n","labels | \n","scientific label | \n","data set | \n","
---|---|---|---|---|---|
0 | \n","0 | \n","train/ABBOTTS BABBLER/001.jpg | \n","ABBOTTS BABBLER | \n","Malacocincla abbotti | \n","train | \n","
1 | \n","0 | \n","train/ABBOTTS BABBLER/002.jpg | \n","ABBOTTS BABBLER | \n","Malacocincla abbotti | \n","train | \n","
2 | \n","0 | \n","train/ABBOTTS BABBLER/003.jpg | \n","ABBOTTS BABBLER | \n","Malacocincla abbotti | \n","train | \n","
3 | \n","0 | \n","train/ABBOTTS BABBLER/004.jpg | \n","ABBOTTS BABBLER | \n","Malacocincla abbotti | \n","train | \n","
4 | \n","0 | \n","train/ABBOTTS BABBLER/005.jpg | \n","ABBOTTS BABBLER | \n","Malacocincla abbotti | \n","train | \n","