{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import torch\nimport torch.nn.functional as F\nimport torch.nn as nn\nimport torch.utils.data as data\nimport torchvision\nimport torchvision.models as models\nimport numpy as np\nimport pandas as pd\nimport cv2\nimport pydicom\nfrom sklearn.utils import shuffle\nfrom torchvision.models.detection.faster_rcnn import FastRCNNPredictor\nimport albumentations as A\nfrom albumentations.pytorch.transforms import ToTensorV2\nfrom PIL import Image","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df = pd.read_csv('/kaggle/input/vinbigdata-chest-xray-abnormalities-detection/sample_submission.csv')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# class Dataset(torch.utils.data.Dataset):\n#     def __init__(self, df, transforms):\n#         self.transforms = transforms\n#         self.df = df\n\n#     def __getitem__(self, idx):\n\n#         img_path = '/kaggle/input/vinbigdata-chest-xray-abnormalities-detection/test/' \\\n#                     + self.df.iloc[idx]['image_id'] + '.dicom'\n#         dicom = pydicom.dcmread(img_path)\n#         dicom.BitsStored = 16\n#         img = dicom.pixel_array.astype('float32')\n#         if dicom.PhotometricInterpretation == \"MONOCHROME1\":\n#             img = np.amax(img) - img\n#         intercept = int(dicom.RescaleIntercept) if \"RescaleIntercept\" in dicom else 0.0\n#         slope = float(dicom.RescaleSlope) if \"RescaleSlope\" in dicom else 1.0\n#         img = (img * slope).astype('int16') + intercept\n#         img = np.stack([img, img, img])\n#         img = (img - img.min()) / (img.max() - img.min()) * 255.\n#         img = img.transpose(1, 2, 0)\n\n#         img = self.transforms(image=img)['image']\n#         return img\n\n#     def __len__(self):\n#         return len(self.df)\n\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"class Dataset(torch.utils.data.Dataset):\n    def __init__(self, df, transforms):\n        self.transforms = transforms\n        self.df = df\n\n    def __getitem__(self, idx):\n\n        img_path = '/kaggle/input/vinbigdata-test-jpg/' \\\n                    + self.df.iloc[idx]['image_id'] + '.jpg'\n        img = np.array(Image.open(img_path))\n        img = self.transforms(image=img)['image']\n        return img\n\n    def __len__(self):\n        return len(self.df)\n\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_transforms = A.Compose([\n                    A.Normalize(mean=(0, 0, 0), std=(1, 1, 1), max_pixel_value=255.0, p=1.0),\n                    ToTensorV2(p=1.0)\n                    ])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def collate_fn(batch):\n    images = [image for (image) in batch]\n    return images\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_dataset = Dataset(transforms=test_transforms, df=df)\ntest_dataloader = torch.utils.data.DataLoader(\n                                         dataset=test_dataset,\n                                         batch_size=16,\n                                         shuffle=False,\n                                         collate_fn=collate_fn,\n                                         num_workers=2\n                                         )","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"device = 'cuda:0' if torch.cuda.is_available() else 'cpu'","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model = torchvision.models.detection.fasterrcnn_resnet50_fpn(pretrained=False)\nnum_classes = 15\nin_features = model.roi_heads.box_predictor.cls_score.in_features\nmodel.roi_heads.box_predictor = FastRCNNPredictor(in_features, num_classes)\nmodel = model.to(device)\nmodel = nn.DataParallel(model)\nmodel.load_state_dict(torch.load('/kaggle/input/fasterrcnn-model/model_28.pth'))\nmodel = model.module","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model = model.eval()","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"y_preds = []\nfor b, x in enumerate(test_dataloader):\n    print(b)\n    x = [xi.to(device) for xi in x]\n    with torch.no_grad():\n        output = model(x)\n    for i, output_i in enumerate(output):\n        scores = output_i['scores']\n        labels = output_i['labels']\n        boxes = output_i['boxes']\n        labels = labels[scores > 0.5]\n        boxes = boxes[scores > 0.5]\n        scores = scores[scores > 0.5]\n        if len(labels) == 0 or labels[0] == 0:\n            y_preds.append('14 1 0 0 1 1')\n        else:\n            y_pred = []\n            for j in range(len(labels)):\n                box = list(map(str, boxes[j].cpu().numpy()))\n                y_pred += [f\"{labels[j].item()-1} {scores[j].item()} {' '.join(box)}\"]\n            y_preds.append(' '.join(y_pred))\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df['PredictionString'] = y_preds\ndf.to_csv('submission.csv', index=False)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"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":4,"nbformat_minor":4}