{"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":"import numpy as np\nimport torch\nimport torchvision\nimport torchvision.transforms as transforms\nimport glob\nfrom matplotlib import pyplot as plt\nimport cv2\nimport pandas as pd\nfrom sklearn.model_selection import train_test_split\nfrom PIL import Image\nfrom torch.nn import Flatten, Linear, ReLU, Conv2d,MaxPool2d","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!ls /kaggle/input/acc-german-traffic-sign-classification/GTSRB_Challenge/test/","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#device = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")\n#device","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Load data file names\ndata = []\ncnt = 0\nfor file_name in glob.glob('/kaggle/input/acc-german-traffic-sign-classification/GTSRB_Challenge/train/*/*.ppm'):\n    im_class = int(file_name.split('/')[-2])\n    data.append((im_class, file_name)) \ndata[0]","metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Split dataset\ntrain_data, val_data = train_test_split(data, test_size = 0.2)\nprint(f'train size is: {len(train_data)}')\nprint(f'val size is: {len(val_data)}')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"len(data)\ndata[0][0]\ndata[0][1]","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_y    = [data[0] for data in train_data]\ntrain_x    = [data[1] for data in train_data]\nval_y     = [data[0] for data in val_data]\nval_x     = [data[1] for data in val_data]","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class Dataset(torch.utils.data.Dataset):\n    def __init__(self, images, labels, transform = None):\n        self.labels   = labels\n        self.images = images\n        self.transform = transform\n    def __len__(self):\n        return len(self.images)\n    \n    def __getitem__(self, index):\n        i = self.images[index]\n        x = Image.open(i)\n        y = self.labels[index]\n        \n        if self.transform != None:\n            x = self.transform(x)\n    \n        return x,y","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"label_map = {\n    0: '20_speed',\n    1: '30_speed',\n    2: '50_speed',\n    3: '60_speed',\n    4: '70_speed',\n    5: '80_speed',\n    6: '80_lifted',\n    7: '100_speed',\n    8: '120_speed',\n    9: 'no_overtaking_general',\n    10: 'no_overtaking_trucks',\n    11: 'right_of_way_crossing',\n    12: 'right_of_way_general',\n    13: 'give_way',\n    14: 'stop',\n    15: 'no_way_general',\n    16: 'no_way_trucks',\n    17: 'no_way_one_way',\n    18: 'attention_general',\n    19: 'attention_left_turn',\n    20: 'attention_right_turn',\n    21: 'attention_curvy',\n    22: 'attention_bumpers',\n    23: 'attention_slippery',\n    24: 'attention_bottleneck',\n    25: 'attention_construction',\n    26: 'attention_traffic_light',\n    27: 'attention_pedestrian',\n    28: 'attention_children',\n    29: 'attention_bikes',\n    30: 'attention_snowflake',\n    31: 'attention_deer',\n    32: 'lifted_general',\n    33: 'turn_right',\n    34: 'turn_left',\n    35: 'turn_straight',\n    36: 'turn_straight_right',\n    37: 'turn_straight_left',\n    38: 'turn_right_down',\n    39: 'turn_left_down',\n    40: 'turn_circle',\n    41: 'lifted_no_overtaking_general',\n    42: 'lifted_no_overtaking_trucks'\n}","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"trainset = Dataset(train_x, train_y)\nimg, y = trainset[0]\nplt.imshow(img)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(label_map[y])\nimg","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"transform = transforms.Compose(\n    [transforms.Resize((32,32)),\n     transforms.ToTensor(),\n     transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5))]\n)\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"trainset = Dataset(train_x, train_y, transform=transform)\nvalset = Dataset(val_x, val_y, transform=transform)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_loader = torch.utils.data.DataLoader(trainset, batch_size=4,\n                                          shuffle=True, num_workers=2)\nval_loader = torch.utils.data.DataLoader(valset, batch_size=4,\n                                          shuffle=False, num_workers=2)\n\ndata_loaders = {'train':train_loader, 'val':val_loader} \nprint(data_loaders)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = torch.nn.modules.Sequential(Conv2d(in_channels=3, out_channels=10, kernel_size=3, padding=1, stride=1),\n                                    ReLU(),\n                                    MaxPool2d(2, 2),   # Filter size 2, stride 2\n                                    Conv2d(in_channels=10, out_channels=10, kernel_size=3, padding=1, stride=1),\n                                    ReLU(),\n                                    Conv2d(in_channels=10, out_channels=6, kernel_size=3, padding=1, stride=1),\n                                    ReLU(),\n                                    Flatten(),\n                                    Linear(6*16*16, 43)\n                                    )\nmodel = model.cuda()\noptimizer = torch.optim.Adam(model.parameters(), lr=1e-3)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print_every = 100\nnum_epochs = 12\n\nfor epoch in range(num_epochs):\n    print('Epoch number:', epoch)\n\n    # For each epoch, do training on the trainset\n    # Then evaluate the accuracy on the validation set\n    for phase in ['train', 'val']:# iterate on train then validate\n        print(phase)\n\n        if phase == 'train':\n            model.train()\n        else:\n            model.eval()\n\n        total_loss = 0\n        total_examples = 0\n        total_correct = 0\n\n        # Loop over training / validation data\n        for iteration, (X, y) in enumerate(data_loaders[phase]):\n            # Forward\n            X = X.cuda()\n            y = y.cuda()\n            scores = model(X)\n\n            # Backward\n            loss = torch.nn.functional.cross_entropy(scores, y)# TODO: Cross entropy\n            # Update the network only on training data\n            if phase == 'train':\n                # Backpropagate the loss\n                loss.backward()\n                # Then update the network parameters\n                with torch.no_grad():\n                    optimizer.step()\n                    optimizer.zero_grad()\n            # Accuracy\n            preds = torch.argmax(scores, dim=1)\n            num_correct = torch.sum(preds == y)        \n\n            # Print\n            total_loss += loss.item()\n            total_correct += num_correct.item()\n            total_examples += len(X)\n            if iteration % print_every == 0:\n                print(total_loss / total_examples, total_correct / total_examples)\n        ","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(total_correct / total_examples)\nprint(total_loss / total_examples)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"images= []\nfor img in glob.glob('/kaggle/input/acc-german-traffic-sign-classification/GTSRB_Challenge/test/*'):\n    images.append(img)\nimages[0]","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_loc = [x for x in images]\ntest_id  = [x.split('/')[-1] for x in images]\ntest_data_set = Dataset(test_loc, test_id , transform = transform)\ntest_loader   = torch.utils.data.DataLoader(test_data_set, batch_size=4,\n                                          shuffle=True, num_workers=2)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"    output = open('answer.csv', 'w+')\n    output.write('Filename,ClassID\\n')\n    \n    with torch.no_grad():\n        for iteration, (X, y) in enumerate(test_loader): \n            X = X.cuda()\n            scores = model(X)\n            preds = torch.argmax(scores, dim=1)  \n            for idd,cla in zip(y,preds):\n                output.write(f'{idd},{cla.item()}\\n') \n    output.close()\n    \n          ","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}