{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":19989,"databundleVersionId":1160143,"sourceType":"competition"}],"dockerImageVersionId":30646,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport os","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-02-13T15:22:23.128845Z","iopub.execute_input":"2024-02-13T15:22:23.129552Z","iopub.status.idle":"2024-02-13T15:22:23.133718Z","shell.execute_reply.started":"2024-02-13T15:22:23.129520Z","shell.execute_reply":"2024-02-13T15:22:23.132776Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import random\nfrom PIL import Image, ImageDraw\nfrom collections import Counter\nimport matplotlib.pyplot as plt\nfrom sklearn.model_selection import train_test_split\n\nimport torch\nimport torchvision\nfrom torchvision import transforms as T\nfrom torchvision.models.detection.faster_rcnn import FastRCNNPredictor","metadata":{"execution":{"iopub.status.busy":"2024-02-13T15:22:23.141375Z","iopub.execute_input":"2024-02-13T15:22:23.141683Z","iopub.status.idle":"2024-02-13T15:22:23.147866Z","shell.execute_reply.started":"2024-02-13T15:22:23.141651Z","shell.execute_reply":"2024-02-13T15:22:23.146967Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train = pd.read_csv(\"/kaggle/input/global-wheat-detection/train.csv\")","metadata":{"execution":{"iopub.status.busy":"2024-02-13T15:22:23.149432Z","iopub.execute_input":"2024-02-13T15:22:23.149757Z","iopub.status.idle":"2024-02-13T15:22:23.342519Z","shell.execute_reply.started":"2024-02-13T15:22:23.149724Z","shell.execute_reply":"2024-02-13T15:22:23.341723Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train.head()","metadata":{"execution":{"iopub.status.busy":"2024-02-13T15:22:23.344048Z","iopub.execute_input":"2024-02-13T15:22:23.344362Z","iopub.status.idle":"2024-02-13T15:22:23.355757Z","shell.execute_reply.started":"2024-02-13T15:22:23.344313Z","shell.execute_reply":"2024-02-13T15:22:23.354792Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"a = list(map(float, train[\"bbox\"][0][1:-1].split(\",\")))[0]","metadata":{"execution":{"iopub.status.busy":"2024-02-13T15:22:23.356841Z","iopub.execute_input":"2024-02-13T15:22:23.357425Z","iopub.status.idle":"2024-02-13T15:22:23.366271Z","shell.execute_reply.started":"2024-02-13T15:22:23.357396Z","shell.execute_reply":"2024-02-13T15:22:23.365580Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pd.Series([train[\"bbox\"][i][1:-1].split(\",\")[0] for i in range(147)])","metadata":{"execution":{"iopub.status.busy":"2024-02-13T15:22:23.368865Z","iopub.execute_input":"2024-02-13T15:22:23.369130Z","iopub.status.idle":"2024-02-13T15:22:23.382483Z","shell.execute_reply.started":"2024-02-13T15:22:23.369106Z","shell.execute_reply":"2024-02-13T15:22:23.381517Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"len(train[\"bbox\"])","metadata":{"execution":{"iopub.status.busy":"2024-02-13T15:22:23.383406Z","iopub.execute_input":"2024-02-13T15:22:23.383692Z","iopub.status.idle":"2024-02-13T15:22:23.394989Z","shell.execute_reply.started":"2024-02-13T15:22:23.383669Z","shell.execute_reply":"2024-02-13T15:22:23.394197Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"x1 = pd.Series([float(train[\"bbox\"][i][1:-1].split(\",\")[0]) for i in range(147793)], name=\"x1\")\ny1 = pd.Series([float(train[\"bbox\"][i][1:-1].split(\",\")[1]) for i in range(147793)], name=\"y1\")\nw = pd.Series([float(train[\"bbox\"][i][1:-1].split(\",\")[2]) for i in range(147793)], name=\"w\")\nh = pd.Series([float(train[\"bbox\"][i][1:-1].split(\",\")[3]) for i in range(147793)], name=\"h\")","metadata":{"execution":{"iopub.status.busy":"2024-02-13T15:22:23.396385Z","iopub.execute_input":"2024-02-13T15:22:23.396731Z","iopub.status.idle":"2024-02-13T15:22:29.754557Z","shell.execute_reply.started":"2024-02-13T15:22:23.396684Z","shell.execute_reply":"2024-02-13T15:22:29.753627Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df = pd.concat([train[\"image_id\"], x1, y1, w, h], axis=1)","metadata":{"execution":{"iopub.status.busy":"2024-02-13T15:22:29.756177Z","iopub.execute_input":"2024-02-13T15:22:29.756565Z","iopub.status.idle":"2024-02-13T15:22:29.763962Z","shell.execute_reply.started":"2024-02-13T15:22:29.756529Z","shell.execute_reply":"2024-02-13T15:22:29.763062Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df.head()","metadata":{"execution":{"iopub.status.busy":"2024-02-13T15:22:29.765290Z","iopub.execute_input":"2024-02-13T15:22:29.765588Z","iopub.status.idle":"2024-02-13T15:22:29.782253Z","shell.execute_reply.started":"2024-02-13T15:22:29.765563Z","shell.execute_reply":"2024-02-13T15:22:29.781245Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df[\"x2\"] = df[\"x1\"] + df[\"w\"]\ndf[\"y2\"] = df[\"y1\"] + df[\"h\"]","metadata":{"execution":{"iopub.status.busy":"2024-02-13T15:22:29.783685Z","iopub.execute_input":"2024-02-13T15:22:29.783977Z","iopub.status.idle":"2024-02-13T15:22:29.795971Z","shell.execute_reply.started":"2024-02-13T15:22:29.783951Z","shell.execute_reply":"2024-02-13T15:22:29.794937Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df.drop([\"w\",\"h\"], axis = 1, inplace=True)","metadata":{"execution":{"iopub.status.busy":"2024-02-13T15:22:29.800687Z","iopub.execute_input":"2024-02-13T15:22:29.801071Z","iopub.status.idle":"2024-02-13T15:22:29.810249Z","shell.execute_reply.started":"2024-02-13T15:22:29.801044Z","shell.execute_reply":"2024-02-13T15:22:29.809240Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df.head()","metadata":{"execution":{"iopub.status.busy":"2024-02-13T15:22:29.811410Z","iopub.execute_input":"2024-02-13T15:22:29.811752Z","iopub.status.idle":"2024-02-13T15:22:29.832273Z","shell.execute_reply.started":"2024-02-13T15:22:29.811722Z","shell.execute_reply":"2024-02-13T15:22:29.831180Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"unique_imgs = df.image_id.unique()","metadata":{"execution":{"iopub.status.busy":"2024-02-13T15:22:29.833915Z","iopub.execute_input":"2024-02-13T15:22:29.834253Z","iopub.status.idle":"2024-02-13T15:22:29.854835Z","shell.execute_reply.started":"2024-02-13T15:22:29.834226Z","shell.execute_reply":"2024-02-13T15:22:29.853038Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"unique_imgs","metadata":{"execution":{"iopub.status.busy":"2024-02-13T15:22:29.856117Z","iopub.execute_input":"2024-02-13T15:22:29.856752Z","iopub.status.idle":"2024-02-13T15:22:29.862480Z","shell.execute_reply.started":"2024-02-13T15:22:29.856726Z","shell.execute_reply":"2024-02-13T15:22:29.861538Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### Custom Dataset","metadata":{}},{"cell_type":"code","source":"class CustDat(torch.utils.data.Dataset):\n    def __init__(self, df, unique_imgs, indices):\n        self.df = df\n        self.unique_imgs = unique_imgs\n        self.indices = indices\n        \n    def __len__(self):\n        return len(self.indices)\n    \n    def __getitem__(self, idx):\n        image_name = self.unique_imgs[self.indices[idx]]\n        boxes = self.df[self.df.image_id == image_name].values[:, 1:].astype(\"float\")\n        img = Image.open(\"/kaggle/input/global-wheat-detection/train/\"+image_name+\".jpg\").convert(\"RGB\")\n        labels = torch.ones((boxes.shape[0]), dtype = torch.int64)\n        target = {}\n        target[\"boxes\"] = torch.tensor(boxes)\n        target[\"label\"] = labels\n        \n        return T.ToTensor()(img), target","metadata":{"execution":{"iopub.status.busy":"2024-02-13T15:22:29.863608Z","iopub.execute_input":"2024-02-13T15:22:29.863876Z","iopub.status.idle":"2024-02-13T15:22:29.872433Z","shell.execute_reply.started":"2024-02-13T15:22:29.863853Z","shell.execute_reply":"2024-02-13T15:22:29.871598Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_ids, val_ids = train_test_split(range(unique_imgs.shape[0]), test_size = 0.1)","metadata":{"execution":{"iopub.status.busy":"2024-02-13T15:22:29.873648Z","iopub.execute_input":"2024-02-13T15:22:29.873902Z","iopub.status.idle":"2024-02-13T15:22:29.882026Z","shell.execute_reply.started":"2024-02-13T15:22:29.873881Z","shell.execute_reply":"2024-02-13T15:22:29.881164Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def custom_collate(data):\n    return data","metadata":{"execution":{"iopub.status.busy":"2024-02-13T15:22:29.883217Z","iopub.execute_input":"2024-02-13T15:22:29.883614Z","iopub.status.idle":"2024-02-13T15:22:29.895376Z","shell.execute_reply.started":"2024-02-13T15:22:29.883586Z","shell.execute_reply":"2024-02-13T15:22:29.894529Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_d1 = torch.utils.data.DataLoader(CustDat(df, unique_imgs, train_ids),\n                                      batch_size=16,\n                                      shuffle=True,\n                                      collate_fn=custom_collate,\n                                      pin_memory=True if torch.cuda.is_available() else False)\n\nval_d1 = torch.utils.data.DataLoader(CustDat(df, unique_imgs, val_ids),\n                                      batch_size=8,\n                                      shuffle=False,\n                                      collate_fn=custom_collate,\n                                      pin_memory=True if torch.cuda.is_available() else False)","metadata":{"execution":{"iopub.status.busy":"2024-02-13T15:22:29.896483Z","iopub.execute_input":"2024-02-13T15:22:29.896745Z","iopub.status.idle":"2024-02-13T15:22:29.907077Z","shell.execute_reply.started":"2024-02-13T15:22:29.896723Z","shell.execute_reply":"2024-02-13T15:22:29.906284Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = torchvision.models.detection.fasterrcnn_resnet50_fpn(pretrained=True)\nnum_classes = 2\nin_features = model.roi_heads.box_predictor.cls_score.in_features\nmodel.roi_heads.box_predictor = FastRCNNPredictor(in_features, num_classes)","metadata":{"execution":{"iopub.status.busy":"2024-02-13T15:22:29.908487Z","iopub.execute_input":"2024-02-13T15:22:29.908741Z","iopub.status.idle":"2024-02-13T15:22:30.590643Z","shell.execute_reply.started":"2024-02-13T15:22:29.908719Z","shell.execute_reply":"2024-02-13T15:22:30.586706Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"device = torch.device(\"cuda\") if torch.cuda.is_available() else \"cpu\"","metadata":{"execution":{"iopub.status.busy":"2024-02-13T15:22:30.591810Z","iopub.execute_input":"2024-02-13T15:22:30.592497Z","iopub.status.idle":"2024-02-13T15:22:30.598331Z","shell.execute_reply.started":"2024-02-13T15:22:30.592471Z","shell.execute_reply":"2024-02-13T15:22:30.597242Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"device","metadata":{"execution":{"iopub.status.busy":"2024-02-13T15:22:30.599369Z","iopub.execute_input":"2024-02-13T15:22:30.599725Z","iopub.status.idle":"2024-02-13T15:22:30.611557Z","shell.execute_reply.started":"2024-02-13T15:22:30.599690Z","shell.execute_reply":"2024-02-13T15:22:30.609598Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"optimizer = torch.optim.SGD(model.parameters(), lr=0.001)\nnum_epochs = 5","metadata":{"execution":{"iopub.status.busy":"2024-02-13T15:22:30.612959Z","iopub.execute_input":"2024-02-13T15:22:30.613277Z","iopub.status.idle":"2024-02-13T15:22:30.621897Z","shell.execute_reply.started":"2024-02-13T15:22:30.613247Z","shell.execute_reply":"2024-02-13T15:22:30.620903Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.to(device)\nfor epoch in range(num_epochs):\n    epoch_loss = 0\n    for data in train_d1:\n        imgs = []\n        targets = []\n        for d in data:\n            imgs.append(d[0].to(device))\n            targ = {}\n            targ[\"boxes\"] = d[1][\"boxes\"].to(device)\n            targ[\"labels\"] = d[1][\"label\"].to(device)\n            targets.append(targ)\n        loss_dict = model(imgs, targets)\n        loss = sum(v for v in loss_dict.values())\n        epoch_loss += loss.cpu().detach().numpy()\n        optimizer.zero_grad()\n        loss.backward()\n        optimizer.step()\n    print(epoch_loss)","metadata":{"execution":{"iopub.status.busy":"2024-02-13T15:33:10.019450Z","iopub.execute_input":"2024-02-13T15:33:10.019847Z","iopub.status.idle":"2024-02-13T16:20:12.915619Z","shell.execute_reply.started":"2024-02-13T15:33:10.019818Z","shell.execute_reply":"2024-02-13T16:20:12.914542Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.eval()\ndata = iter(val_d1).__next__()","metadata":{"execution":{"iopub.status.busy":"2024-02-13T16:20:12.917549Z","iopub.execute_input":"2024-02-13T16:20:12.917856Z","iopub.status.idle":"2024-02-13T16:20:13.318013Z","shell.execute_reply.started":"2024-02-13T16:20:12.917830Z","shell.execute_reply":"2024-02-13T16:20:13.316993Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"img = data[0][0]","metadata":{"execution":{"iopub.status.busy":"2024-02-13T16:20:13.319278Z","iopub.execute_input":"2024-02-13T16:20:13.320108Z","iopub.status.idle":"2024-02-13T16:20:13.324050Z","shell.execute_reply.started":"2024-02-13T16:20:13.320079Z","shell.execute_reply":"2024-02-13T16:20:13.323116Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"img = data[0][0]\nboxes = data[0][1][\"boxes\"]\nlabels = data[0][1][\"label\"]","metadata":{"execution":{"iopub.status.busy":"2024-02-13T16:20:13.326775Z","iopub.execute_input":"2024-02-13T16:20:13.327235Z","iopub.status.idle":"2024-02-13T16:20:13.335244Z","shell.execute_reply.started":"2024-02-13T16:20:13.327198Z","shell.execute_reply":"2024-02-13T16:20:13.334507Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"output = model([img.to(device)])","metadata":{"execution":{"iopub.status.busy":"2024-02-13T16:27:31.188493Z","iopub.execute_input":"2024-02-13T16:27:31.189510Z","iopub.status.idle":"2024-02-13T16:27:31.458522Z","shell.execute_reply.started":"2024-02-13T16:27:31.189465Z","shell.execute_reply":"2024-02-13T16:27:31.457730Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"output","metadata":{"execution":{"iopub.status.busy":"2024-02-13T16:27:33.183210Z","iopub.execute_input":"2024-02-13T16:27:33.184031Z","iopub.status.idle":"2024-02-13T16:27:33.277000Z","shell.execute_reply.started":"2024-02-13T16:27:33.183998Z","shell.execute_reply":"2024-02-13T16:27:33.275982Z"},"collapsed":true,"jupyter":{"outputs_hidden":true},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"out_bbox = output[0][\"boxes\"]\nout_scores = output[0][\"scores\"]","metadata":{"execution":{"iopub.status.busy":"2024-02-13T16:27:39.385680Z","iopub.execute_input":"2024-02-13T16:27:39.386044Z","iopub.status.idle":"2024-02-13T16:27:39.390646Z","shell.execute_reply.started":"2024-02-13T16:27:39.386016Z","shell.execute_reply":"2024-02-13T16:27:39.389681Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"keep = torchvision.ops.nms(out_bbox, out_scores, 0.45)","metadata":{"execution":{"iopub.status.busy":"2024-02-13T16:28:37.777558Z","iopub.execute_input":"2024-02-13T16:28:37.778421Z","iopub.status.idle":"2024-02-13T16:28:37.785133Z","shell.execute_reply.started":"2024-02-13T16:28:37.778380Z","shell.execute_reply":"2024-02-13T16:28:37.784161Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"out_bbox.shape, keep.shape","metadata":{"execution":{"iopub.status.busy":"2024-02-13T16:28:39.455002Z","iopub.execute_input":"2024-02-13T16:28:39.455357Z","iopub.status.idle":"2024-02-13T16:28:39.461194Z","shell.execute_reply.started":"2024-02-13T16:28:39.455315Z","shell.execute_reply":"2024-02-13T16:28:39.460258Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"im = (img.permute(1, 2, 0).cpu().detach().numpy() * 255).astype(\"uint8\") ","metadata":{"execution":{"iopub.status.busy":"2024-02-13T16:28:42.408990Z","iopub.execute_input":"2024-02-13T16:28:42.410100Z","iopub.status.idle":"2024-02-13T16:28:42.418728Z","shell.execute_reply.started":"2024-02-13T16:28:42.410054Z","shell.execute_reply":"2024-02-13T16:28:42.417909Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"im","metadata":{"execution":{"iopub.status.busy":"2024-02-13T16:28:44.136920Z","iopub.execute_input":"2024-02-13T16:28:44.137839Z","iopub.status.idle":"2024-02-13T16:28:44.144629Z","shell.execute_reply.started":"2024-02-13T16:28:44.137798Z","shell.execute_reply":"2024-02-13T16:28:44.143679Z"},"collapsed":true,"jupyter":{"outputs_hidden":true},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"vsample = Image.fromarray(im)","metadata":{"execution":{"iopub.status.busy":"2024-02-13T16:28:47.103505Z","iopub.execute_input":"2024-02-13T16:28:47.104125Z","iopub.status.idle":"2024-02-13T16:28:47.130611Z","shell.execute_reply.started":"2024-02-13T16:28:47.104092Z","shell.execute_reply":"2024-02-13T16:28:47.129741Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"draw = ImageDraw.Draw(vsample)\nfor box in boxes:\n    draw.rectangle(list(box), fill=None, outline = \"red\")\nvsample","metadata":{"execution":{"iopub.status.busy":"2024-02-13T16:43:06.105823Z","iopub.execute_input":"2024-02-13T16:43:06.106202Z","iopub.status.idle":"2024-02-13T16:43:06.504786Z","shell.execute_reply.started":"2024-02-13T16:43:06.106171Z","shell.execute_reply":"2024-02-13T16:43:06.503298Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}