{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"_kg_hide-input":true,"_kg_hide-output":true},"cell_type":"code","source":"import numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\nimport os\nimport time\nimport random\nfrom os import listdir, makedirs\nfrom os.path import join, exists, expanduser\nfrom tqdm import tqdm\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import roc_auc_score\n\nimport torch\nfrom torchvision import transforms\nfrom torch.utils.data import DataLoader, Dataset\nimport torchvision.models as models\nimport torch.nn as nn\nimport torch.nn.functional as F\nimport torch.optim as optim\nfrom torch.autograd import Variable\n\nfrom PIL import Image\nimport cv2\nimport matplotlib.pyplot as plt\n%matplotlib inline","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":true},"cell_type":"code","source":"import random \nseed = 520\nrandom.seed(seed)\nnp.random.seed(seed)\ntorch.manual_seed(seed)\ntorch.cuda.manual_seed_all(seed)\ntorch.backends.cudnn.benchmark = True\nuse_gpu = True","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"87bdcb49eb4dcf5fbdd59cf75335d1ff263e14fd"},"cell_type":"code","source":"labels = pd.read_csv('../input/train_labels.csv')\nsub = pd.read_csv('../input/sample_submission.csv')\ntrain_path = '../input/train/'\ntest_path = '../input/test/'","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"58b3c4c7c911d81e91d4fea4571462b33d6462a0"},"cell_type":"code","source":"print(f'{len(os.listdir(\"../input/train\"))} pictures in train.')\nprint(f'{len(os.listdir(\"../input/test\"))} pictures in test.')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"c29363bc2cafb342d83d4bdb271b5266ba06277d"},"cell_type":"code","source":"def mask(img):\n    HSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)\n    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)\n    ret, mask = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU)  #方法选择为THRESH_OTSU\n    \n    HSV[:,:,0]=cv2.add(HSV[:,:,0], np.zeros(np.shape(HSV[:,:,0]), dtype=np.uint8), mask=mask)\n    HSV[:,:,1]=cv2.add(HSV[:,:,1], np.zeros(np.shape(HSV[:,:,1]), dtype=np.uint8), mask=mask)\n    return HSV\n\nfig = plt.figure(figsize=(25, 4))\n# display 20 images\ntrain_imgs = os.listdir(train_path)\nfor idx, img in enumerate(np.random.choice(train_imgs, 10)):\n    ax = fig.add_subplot(2, 20//2, idx+1, xticks=[], yticks=[])\n    im = Image.open(train_path + img)\n    plt.imshow(im)\n    ax = fig.add_subplot(2, 20//2, idx+11, xticks=[], yticks=[])\n    im = mask(cv2.imread(train_path + img))\n    plt.imshow(im)\n    lab = labels.loc[labels['id'] == img.split('.')[0], 'label'].values[0]\n    ax.set_title(f'Label: {lab}')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"8abdfe55d316eda6b72192d41a96977ef49b776f"},"cell_type":"code","source":"labels.label.value_counts()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"cb7413045bc59c951086faf2f6d8e0a389db607d"},"cell_type":"code","source":"train, val = train_test_split(labels, stratify=labels.label, test_size=0.1)\nlen(val),len(train)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"2e069326ffa6d377ba61b07b57f7373b09111af4"},"cell_type":"code","source":"class MyDataset(Dataset):\n    def __init__(self, df_data, data_dir = './', transform=None):\n        super().__init__()\n        self.df = df_data.values\n        self.data_dir = data_dir\n        self.transform = transform\n\n    def __len__(self):\n        return len(self.df)\n    \n    def __getitem__(self, index):\n        img_name,label = self.df[index]\n        img_path = os.path.join(self.data_dir, img_name+'.tif')\n        image = mask(cv2.imread(img_path))\n        if self.transform is not None:\n            image = self.transform(image)\n        return image, label","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"0fd83f322714fa87aeb1bec5636fc85afec7d606"},"cell_type":"code","source":"batch_size = 128\n\ntrans_train = transforms.Compose([transforms.ToPILImage(),\n                                  transforms.Pad(64, padding_mode='reflect'),\n                                  transforms.RandomHorizontalFlip(), \n                                  transforms.RandomVerticalFlip(),\n                                  transforms.RandomRotation(20), \n                                  transforms.ToTensor(),\n                                  transforms.Normalize(mean=[0.5, 0.5, 0.5],std=[0.5, 0.5, 0.5])])\n\ntrans_valid = transforms.Compose([transforms.ToPILImage(),\n                                  transforms.Pad(64, padding_mode='reflect'),\n                                  transforms.ToTensor(),\n                                  transforms.Normalize(mean=[0.5, 0.5, 0.5],std=[0.5, 0.5, 0.5])])\n\ndataset_train = MyDataset(df_data=train, data_dir=train_path, transform=trans_train)\ndataset_valid = MyDataset(df_data=val, data_dir=train_path, transform=trans_valid)\n\nloader_train = DataLoader(dataset = dataset_train, batch_size=batch_size, shuffle=True, num_workers=0)\nloader_valid = DataLoader(dataset = dataset_valid, batch_size=batch_size//2, shuffle=False, num_workers=0)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"0794f2046c27595e2921342af8e80185370ee3df"},"cell_type":"code","source":"model = models.resnet34(pretrained=True)\n#for name,param in model.named_parameters():\n#    print(\"\\t\",name)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"9a5fbb8a9146d40e2c79eb4a476958502a246f36"},"cell_type":"code","source":"for para in list(model.parameters()):\n    para.requires_grad=False\nfor para in list(model.layer3.parameters()):\n    para.requires_grad=True\nfor para in list(model.layer4.parameters()):\n    para.requires_grad=True    ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"7857c121d41ece0ec484ba9d05a73dcb1fdf7e34"},"cell_type":"code","source":"num_ftrs = model.fc.in_features\nmodel.fc = nn.Sequential(\n    nn.Dropout(0.5),\n    nn.Linear(num_ftrs, 2)\n)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"ad4ac8af829134c499a2c1e17f46e546bd95132c"},"cell_type":"code","source":"if use_gpu:\n    model = model.cuda()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"8bec3107464a26fc745cd85372fe7f1151d667fb","_kg_hide-output":true,"_kg_hide-input":true,"scrolled":true},"cell_type":"code","source":"params_to_update = []\nfor name,param in model.named_parameters():\n    if param.requires_grad == True:\n        params_to_update.append(param)\n        print(\"\\t\",name)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"4c59e541a9550185414f5ab5895e15086eaed9fc"},"cell_type":"code","source":"num_epochs = 6\nearly_stopping = 4","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"8f46d459956eded28f97fd0f044308f6b54f67eb"},"cell_type":"code","source":"criterion = nn.BCEWithLogitsLoss()\n# specify optimizer (stochastic gradient descent) and learning rate = 0.001\noptimizer = optim.Adam(params_to_update, lr=0.001)\n#scheduler = CyclicLR(optimizer, base_lr=lr, max_lr=0.01, step_size=5, mode='triangular2')\nscheduler = optim.lr_scheduler.StepLR(optimizer, step_size=2, gamma=0.25)\n\nbest_val_acc = 0\nbest_epoch = 0\nepoch_since_best = 0\n\nfor epoch in range(num_epochs):\n    at = time.time()\n    scheduler.step()\n    model.train()\n    train_acc = []\n    train_loss = []\n    for i, data in enumerate(loader_train):\n        if i%10 == 0:\n            print('.',end='')\n        inputs, labels = data\n        if use_gpu:\n            inputs, labels = inputs.cuda(), labels.cuda()\n        optimizer.zero_grad()\n        outputs = model(inputs)        \n        loss = criterion(outputs[:,1], labels.float())\n        loss.backward()\n        optimizer.step()\n        a = labels.data.cpu().numpy()\n        b = outputs[:,-1].detach().cpu().numpy()\n        train_acc.append(roc_auc_score(a, b))\n        train_loss.append(loss.item())\n            \n    model.eval()\n    valid_acc = []\n    val_loss = []\n    for _, data in enumerate(loader_valid):\n        inputs, labels = data\n        if use_gpu:\n            inputs, labels = inputs.cuda(), labels.cuda()\n        optimizer.zero_grad()\n        outputs = model(inputs)\n        loss = criterion(outputs[:,1], labels.float())\n        a = labels.data.cpu().numpy()\n        b = outputs[:,-1].detach().cpu().numpy()\n        valid_acc.append(roc_auc_score(a, b))\n        val_loss.append(loss.item())\n    \n    print()\n    bt = time.time()\n    print('[Epoch %d] train loss %.6f train acc %.6f  valid loss %.6f valid acc %.6f  time %.6f' % (\n        epoch, np.mean(train_loss), np.mean(train_acc), np.mean(val_loss), np.mean(valid_acc),bt-at))\n    \n    valid_acc = np.mean(valid_acc)\n    if valid_acc > best_val_acc:\n        best_val_acc = valid_acc\n        best_epoch = epoch\n        epoch_since_best = 0\n        print('save model...')\n        torch.save(model.state_dict(), 'model.pth')\n        print('saved.')\n    else:\n        epoch_since_best += 1\n        \n    if epoch_since_best > early_stopping:\n        break\n            \nprint('Finished Training')\nprint('best_epoch: %d, best_val_acc %.6f' % (best_epoch, best_val_acc))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"105991aa0265aa60b7842ff667f4944d0cca0be2"},"cell_type":"code","source":"trans_train = transforms.Compose([trainsforms.ToPILImage(),\n                                  transforms.Pad(64, padding_mode='reflect'),\n                                  transforms.ToTensor(),\n                                  transforms.Normalize(mean=[0.5, 0.5, 0.5],std=[0.5, 0.5, 0.5])])\n\ntrans_valid = transforms.Compose([trainsforms.ToPILImage(),\n                                  transforms.Pad(64, padding_mode='reflect'),\n                                  transforms.ToTensor(),\n                                  transforms.Normalize(mean=[0.5, 0.5, 0.5],std=[0.5, 0.5, 0.5])])\n\ndataset_train = MyDataset(df_data=train, data_dir=train_path, transform=trans_train)\ndataset_valid = MyDataset(df_data=val, data_dir=train_path, transform=trans_valid)\n\nloader_train = DataLoader(dataset = dataset_train, batch_size=batch_size, shuffle=True, num_workers=0)\nloader_valid = DataLoader(dataset = dataset_valid, batch_size=batch_size//2, shuffle=False, num_workers=0)\n\noptimizer = optim.Adam(params_to_update, lr=0.0001)\nscheduler = optim.lr_scheduler.StepLR(optimizer, step_size=2, gamma=0.25)\n\nfor epoch in range(6,10):\n    at = time.time()\n    scheduler.step()\n    model.train()\n    train_acc = []\n    train_loss = []\n    for i, data in enumerate(loader_train):\n        if i%10 == 0:\n            print('.',end='')\n        inputs, labels = data\n        if use_gpu:\n            inputs, labels = inputs.cuda(), labels.cuda()\n        optimizer.zero_grad()\n        outputs = model(inputs)        \n        loss = criterion(outputs[:,1], labels.float())\n        loss.backward()\n        optimizer.step()\n        a = labels.data.cpu().numpy()\n        b = outputs[:,-1].detach().cpu().numpy()\n        train_acc.append(roc_auc_score(a, b))\n        train_loss.append(loss.item())\n            \n    model.eval()\n    valid_acc = []\n    val_loss = []\n    for _, data in enumerate(loader_valid):\n        inputs, labels = data\n        if use_gpu:\n            inputs, labels = inputs.cuda(), labels.cuda()\n        optimizer.zero_grad()\n        outputs = model(inputs)\n        loss = criterion(outputs[:,1], labels.float())\n        a = labels.data.cpu().numpy()\n        b = outputs[:,-1].detach().cpu().numpy()\n        valid_acc.append(roc_auc_score(a, b))\n        val_loss.append(loss.item())\n    \n    print()\n    bt = time.time()\n    print('[Epoch %d] train loss %.6f train acc %.6f  valid loss %.6f valid acc %.6f  time %.6f' % (\n        epoch, np.mean(train_loss), np.mean(train_acc), np.mean(val_loss), np.mean(valid_acc),bt-at))\n    \n    valid_acc = np.mean(valid_acc)\n    if valid_acc > best_val_acc:\n        best_val_acc = valid_acc\n        best_epoch = epoch\n        epoch_since_best = 0\n        print('save model...')\n        torch.save(model.state_dict(), 'model.pth')\n        print('saved.')\n    else:\n        epoch_since_best += 1\n        \n    if epoch_since_best > early_stopping:\n        break\n            \nprint('Finished Training')\nprint('best_epoch: %d, best_val_acc %.6f' % (best_epoch, best_val_acc))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"3a2982f44a221ae76ca2aa293ea96f6ed12a8ec8"},"cell_type":"code","source":"dataset_valid = MyDataset(df_data=sub, data_dir=test_path, transform=trans_valid)\nloader_test = DataLoader(dataset = dataset_valid, batch_size=32, shuffle=False, num_workers=0)\n\nmodel.eval()\n\npreds = []\nfor batch_i, (data, target) in tqdm(enumerate(loader_test)):\n    data, target = data.cuda(), target.cuda()\n    output = model(data)\n\n    pr = output[:,1].detach().cpu().numpy()\n    for i in pr:\n        preds.append(i)\n\nsub['label'] = preds\nsub.to_csv('sub.csv', index=False)","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.6","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":1}