{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load in \n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the \"../input/\" directory.\n# For example, running this (by clicking run or pressing Shift+Enter) will list the files in the input directory\n\nimport os\nprint(os.listdir(\"../input\"))\n\n# Any results you write to the current directory are saved as output.","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","collapsed":true,"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":false},"cell_type":"code","source":"import os\nimport random\nimport cv2\nimport time\nimport numpy as np\nimport pandas as pd\nimport torch\nimport torch.nn as nn\nimport torchvision.transforms as transforms\nfrom collections import OrderedDict\nfrom torchvision.models import resnet18, resnet34\nfrom torch.utils.data import Dataset, DataLoader\n\nos.chdir('/kaggle/input/pretrainedmodels/models')\nfrom senet import *\nos.chdir('/kaggle/working/')\n\n\n########################################################################################################################\ndef get_model(config, num_classes=196):\n    model_name = config.MODEL\n    f = globals().get(model_name)\n\n    if model_name.startswith('resnet'):\n        model = f(pretrained=False)\n        model.avgpool = nn.AdaptiveAvgPool2d(1)\n        in_features = model.fc.in_features\n        model.fc = nn.Linear(in_features, num_classes)\n    else:\n        model = f(num_classes=1000, pretrained=None)\n        model.avg_pool = nn.AdaptiveAvgPool2d(1)\n        in_features = model.last_linear.in_features\n        model.last_linear = nn.Linear(in_features, num_classes)\n\n    print('model name:', model_name)\n    return model\n\n\nclass CarDataset(Dataset):\n    def __init__(self, config, transform=None):\n        self.config = config\n        self.transform = transform\n        self.frame = pd.read_csv('/kaggle/input/2019-3rd-ml-month-with-kakr/test.csv')\n\n    def __len__(self):\n        return self.frame.shape[0]\n\n    def __getitem__(self, idx):\n        image = cv2.imread(os.path.join('/kaggle/input/2019-3rd-ml-month-with-kakr/test', self.frame[\"img_file\"][idx]), 1)\n        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)\n\n        x1, y1, x2, y2 = self.frame.iloc[idx][1:5]\n        image = image[y1:y2 + 1, x1:x2 + 1]\n\n        if image.shape[0] / image.shape[1] > 0.536:\n            w_offset = int(((image.shape[0] / 0.536) - image.shape[1]) / 2)\n            image = np.pad(image, ((0, 0), (w_offset, w_offset), (0, 0)), 'constant', constant_values=(0))\n        else:\n            h_offset = int(((image.shape[1] * 0.536) - image.shape[0]) / 2)\n            image = np.pad(image, ((h_offset, h_offset), (0, 0), (0, 0)), 'constant', constant_values=(0))\n\n        image = cv2.resize(image, (self.config.IMG_W, self.config.IMG_H))\n\n        if self.transform is not None:\n            image = self.transform(image)\n\n        return image\n\n\ndef get_dataloader(config, transform=None):\n    dataset = CarDataset(config, transform)\n\n    dataloader = DataLoader(dataset,\n                             shuffle=False,\n                             batch_size=config.BATCH_SIZE,\n                             num_workers=config.NUM_WORKERS,\n                             pin_memory=True)\n\n    return dataloader\n\n\nclass Normalize:\n    \"\"\"\n    normalize data to -1 ~ 1. channelwise! (c, h, w)\n    \"\"\"\n    def __call__(self, data):\n        smooth = 1e-6\n        # for i in range(data.shape[0]):\n        #     data[i] = (data[i] - np.min(data[i]) + smooth) / (np.max(data[i]) - np.min(data[i]) + smooth)\n\n        data = (data - np.min(data) + smooth) / (np.max(data) - np.min(data) + smooth)\n        data = data * 2 - 1\n\n        return data\n\n\nclass ToTensor:\n    \"\"\"\n    convert ndarrays to Tensors.\n    \"\"\"\n    def __call__(self, data):\n        data = np.transpose(data, (2, 0, 1))\n        data = torch.from_numpy(data).float()\n        return data\n\n\nclass HorizontalFlip:\n    def __call__(self, data):\n        return data[:,::-1]\n\n########################################################################################################################\n\n\ndef inference(model, dataloader):\n    model.eval()\n\n    output = []\n    with torch.no_grad():\n        start = time.time()\n        for i, images in enumerate(dataloader):\n            images = images.cuda()\n            logits = model(images)\n\n            preds = logits.detach().cpu().numpy()\n            # print(preds.shape)\n\n            output.append(preds)\n\n            del images, logits, preds\n            torch.cuda.empty_cache()\n\n            end = time.time()\n            print('[%2d/%2d] time: %.2f' % (i, len(dataloader), end - start))\n\n    output = np.concatenate(tuple(output), axis=0)\n    return output\n\n\ndef run(config):\n    model = get_model(config).cuda()\n\n    checkpoint = torch.load(config.CHECKPOINT)\n\n    state_dict_old = checkpoint['state_dict']\n    state_dict = OrderedDict()\n    # delete 'module.' because it is saved from DataParallel module\n    for key in state_dict_old.keys():\n        if key.startswith('module.'):\n            state_dict[key[7:]] = state_dict_old[key]\n        else:\n            state_dict[key] = state_dict_old[key]\n\n    model.load_state_dict(state_dict)\n\n    # TTA\n    test_loader = get_dataloader(config, transform=transforms.Compose([Normalize(),\n                                                                       ToTensor()]))\n    out = inference(model, test_loader)\n\n    test_loader_flip = get_dataloader(config, transform=transforms.Compose([HorizontalFlip(),\n                                                                            Normalize(),\n                                                                            ToTensor()]))\n    out_flip = inference(model, test_loader_flip)\n\n    output = out + out_flip\n    print('tta flip inference finished. shape:', output.shape)\n\n    return output\n\n\ndef seed_everything():\n    seed = 2019\n    random.seed(seed)\n    np.random.seed(seed)\n    torch.manual_seed(seed)\n    torch.backends.cudnn.benchmark = False\n    torch.backends.cudnn.deterministic = True\n\n\ndef main():\n    import warnings\n    warnings.filterwarnings(\"ignore\")\n    seed_everything()\n\n    config_0 = Config(checkpoint='/kaggle/input/5foldresnext/epoch_0032_0.9493.pth')\n    fold_0 = run(config_0)\n\n    config_1 = Config(checkpoint='/kaggle/input/5foldresnext/epoch_0033_0.9435.pth')\n    fold_1 = run(config_1)\n\n    config_2 = Config(checkpoint='/kaggle/input/5foldresnext/epoch_0049_0.9309.pth')\n    fold_2 = run(config_2)\n\n    config_3 = Config(checkpoint='/kaggle/input/5foldresnext/epoch_0053_0.9428.pth')\n    fold_3 = run(config_3)\n\n    config_4 = Config(checkpoint='/kaggle/input/5foldresnext/epoch_0054_0.9437.pth')\n    fold_4 = run(config_4)\n\n    final = fold_0 + fold_1 + fold_2 + fold_3 + fold_4\n    final = np.argmax(final, axis=1) + 1\n\n    submission = pd.read_csv('/kaggle/input/2019-3rd-ml-month-with-kakr/sample_submission.csv')\n    submission['class'] = final\n    submission.to_csv('submission.csv', index=False)\n\n    print('success!')\n\n\nclass Config():\n    def __init__(self, checkpoint='/kaggle/input/5fold-resnext/epoch_0032_0.9493.pth', model='se_resnext50_32x4d'):\n        self.CHECKPOINT = checkpoint\n        self.MODEL = model\n        self.IMG_H = 256\n        self.IMG_W = 480\n        self.BATCH_SIZE = 128\n        self.NUM_WORKERS = 2\n\n\nif __name__ == '__main__':\n    main()\n","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.4","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":1}