{"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":"markdown","source":"All training and test code is from Mr. Heng. I just modify a little.","metadata":{}},{"cell_type":"code","source":"import sys, os \n# sys.path.append('../input/hubmap-submit-06') \n# sys.path.append('../input/hubmap-submit-06/[third_party]')   \nsys.path.append('../input/segformer-model/segformer-mit-b2') \nsys.path.append('../input/segformer-model') \nsys.path.append('../input/timm-pytorch-image-models/pytorch-image-models-master')\n\n# from kaggle_hubmap_kv3 import *\nfrom model import *\nimport importlib\nfrom timeit import default_timer as timer\n\nimport torch\nimport torch.cuda.amp as amp\nimport torch.nn.functional as F\nprint('import ok\\n')\n\n#-- configure ---------------------------------------------\nimage_size = 512\n\norgan_threshold = {\n    'Hubmap': {\n        'kidney'        : 0.40,\n        'prostate'      : 0.40,\n        'largeintestine': 0.40,\n        'spleen'        : 0.40,\n        'lung'          : 0.10,\n    },\n    'HPA': {\n        'kidney'        : 0.50,\n        'prostate'      : 0.50,\n        'largeintestine': 0.50,\n        'spleen'        : 0.50,\n        'lung'          : 0.10,\n    },\n}\n\ndata_source =['Hubmap', 'HPA']\n# data_source =['HPA']\norgan = ['kidney', 'prostate', 'largeintestine', 'spleen', 'lung']\n\n\n#data_source =['Hubmap',]\norgan = ['lung']\n\n\n#submit_type  = 'local-cv'    \nsubmit_type  = 'local-test'    \n#submit_type  = 'kaggle'   ","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-05-10T07:32:25.570992Z","iopub.execute_input":"2023-05-10T07:32:25.572640Z","iopub.status.idle":"2023-05-10T07:32:30.154732Z","shell.execute_reply.started":"2023-05-10T07:32:25.572531Z","shell.execute_reply":"2023-05-10T07:32:30.153450Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"## dataset #####\nimport pandas as pd\n\n\nif (submit_type == 'local-test') or (submit_type == 'kaggle'):\n#     valid_file = '../input/hubmap-organ-segmentation/test.csv'\n#     tiff_dir   = '../input/hubmap-organ-segmentation/test_images'\n    valid_file = '../input/hubmap-organ-segmentation/test.csv'\n    tiff_dir   = '../input/hubmap-organ-segmentation/test_images'\n\nvalid_df = pd.read_csv(valid_file)\nvalid_df.loc[:,'img_area']=valid_df['img_height']*valid_df['img_width']#sort by biggest image first for memory debug\nvalid_df = valid_df.sort_values('img_area').reset_index(drop=True)\nprint('load valid_df ok')\n\n\ndef image_to_tensor(image, mode='rgb'):\n    if  mode=='bgr' :\n        image = image[:,:,::-1]\n    \n    x = image.transpose(2,0,1)\n    x = np.ascontiguousarray(x)\n    x = torch.tensor(x)\n    return x","metadata":{"execution":{"iopub.status.busy":"2023-05-10T07:32:30.160563Z","iopub.execute_input":"2023-05-10T07:32:30.163928Z","iopub.status.idle":"2023-05-10T07:32:30.201583Z","shell.execute_reply.started":"2023-05-10T07:32:30.163877Z","shell.execute_reply":"2023-05-10T07:32:30.200543Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def rle_encode(mask):\n    m = mask.T.flatten()\n    m = np.concatenate([[0], m, [0]])\n    run = np.where(m[1:] != m[:-1])[0] + 1\n    run[1::2] -= run[::2]\n    rle =  ' '.join(str(r) for r in run)\n    return rle","metadata":{"execution":{"iopub.status.busy":"2023-05-10T07:32:30.206209Z","iopub.execute_input":"2023-05-10T07:32:30.208792Z","iopub.status.idle":"2023-05-10T07:32:30.218330Z","shell.execute_reply.started":"2023-05-10T07:32:30.208753Z","shell.execute_reply":"2023-05-10T07:32:30.217205Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"## submission ##\nimport cv2\n\ndef do_local_validation():\n    print('\\tlocal validation ...')\n    \n    submit_df = pd.read_csv('submission.csv').fillna('')\n    submit_df = submit_df.sort_values('id')\n    truth_df  = valid_df.sort_values('id')\n    \n    lb_score = []\n    num = len(submit_df)\n    for i in range(num):\n        t_df = truth_df.iloc[i]\n        p_df = submit_df.iloc[i]\n        t = rle_decode(t_df.rle, t_df.img_height, t_df.img_width, 1)\n        p = rle_decode(p_df.rle, t_df.img_height, t_df.img_width, 1)\n        \n        dice = 2*(t*p).sum()/(p.sum()+t.sum())\n        lb_score.append(dice)\n        \n        if 0:\n            overlay = result_to_overlay(p, t)\n            image_show_norm('overlay', overlay, min=0, max=1, resize=0.10)\n            cv2.waitKey(1)\n\n    truth_df.loc[:,'lb_score']=lb_score\n    for organ in ['all', 'kidney', 'prostate', 'largeintestine', 'spleen', 'lung']:\n        if organ != 'all':\n            d = truth_df[truth_df.organ == organ]\n        else:\n            d = truth_df\n        print('\\t%f\\t%s\\t%f' % (len(d) / len(truth_df), organ, d.lb_score.mean()))\n        \n    \ndef load_net1(model):\n    model.load_state_dict(\n            torch.load('../input/checkpoint4hubmap/wcefortest/NA/00004914.model.pth', map_location=lambda storage, loc: storage) ['state_dict'],\n            strict=False)\n#     model.load_state_dict(\n#             torch.load('../input/hubmap-weight-for-summary/TCM/99/tcm_fold00_00003465.model.pth', map_location=lambda storage, loc: storage) ['state_dict'],\n#             strict=False)\n    model.cuda()\n    model.eval()\n        \n    print('ok!')\n    return model\ndef load_net2(model):\n    model.load_state_dict(\n            torch.load('../input/checkpoint4hubmap/wcefortest/NA/00005148.model.pth', map_location=lambda storage, loc: storage) ['state_dict'],\n            strict=False)\n    model.cuda()\n    model.eval()\n        \n    print('ok!')\n    return model\ndef load_net3(model):\n    model.load_state_dict(\n            torch.load('../input/checkpoint4hubmap/wcefortest/NA/00005382.model.pth', map_location=lambda storage, loc: storage) ['state_dict'],\n            strict=False)\n    model.cuda()\n    model.eval()\n        \n    print('ok!')\n    return model\ndef load_net4(model):\n    model.load_state_dict(\n            torch.load('../input/checkpoint4hubmap/wcefortest/NA/00005616.model.pth', map_location=lambda storage, loc: storage) ['state_dict'],\n            strict=False)\n    model.cuda()\n    model.eval()\n        \n    print('ok!')\n    return model\ndef load_net5(model):\n    model.load_state_dict(\n            torch.load('../input/checkpoint4hubmap/wcefortest/NA/00005850.model.pth', map_location=lambda storage, loc: storage) ['state_dict'],\n            strict=False)\n    model.cuda()\n    model.eval()\n        \n    print('ok!')\n    return model\n\n\n\nclass_dict = {\n    'kidney': 0,\n    'prostate': 1,\n    'largeintestine': 2,\n    'spleen': 3,\n    'lung': 4, \n}\n\ndef do_tta_batch(image, organ):\n    \n    batch = { #<todo> multiscale????\n        'image': torch.stack([\n            image,\n            torch.flip(image,dims=[1]),\n            torch.flip(image,dims=[2]),\n        ]),\n        'organ': torch.Tensor(\n            [[class_dict[organ]]]*3\n        ).long()\n    }\n    return batch\n\ndef undo_tta_batch(probability):\n    probability[0] = probability[0]\n    probability[1] = torch.flip(probability[1],dims=[1])\n    probability[2] = torch.flip(probability[2],dims=[2])\n    probability = probability.mean(0, keepdims=True)\n    probability = probability[0,0].float()\n    return probability\n\ndef do_submit(): \n    print('** submit_type  = %s *******************'%submit_type)\n    all_net = [load_net1(Net()), load_net2(Net()), load_net3(Net()), load_net4(Net()), load_net5(Net())]\n    result = []\n    start_timer = timer()\n    for i,d in valid_df.iterrows():\n        id = d['id']\n        if (d['data_source'] in data_source) and (d['organ'] in organ):\n            image_size = 768\n\n            tiff_file = tiff_dir +'/%d.tiff'%id\n            tiff = cv2.imread(tiff_file, cv2.IMREAD_COLOR)\n            tiff = cv2.cvtColor(tiff, cv2.COLOR_BGR2RGB)\n            tiff = tiff.astype(np.float32)/255\n            H,W,_ = tiff.shape\n            \n            if 0:\n                s = d.pixel_size/0.4 * (image_size/3000)\n                h = int(np.ceil(int(H*s)/32)*32)\n                w = int(np.ceil(int(W*s)/32)*32) \n                image = cv2.resize(tiff,dsize=(w,h),interpolation=cv2.INTER_LINEAR)\n            else: \n                #or just resize to h,w = 768\n                image = cv2.resize(tiff,dsize=(image_size,image_size),interpolation=cv2.INTER_LINEAR)\n            \n            image = image_to_tensor(image, 'rgb')\n            batch = { k:v.cuda() for k,v in do_tta_batch(image, d.organ).items() }\n    \n            use = 0\n            probability = 0\n            with torch.no_grad():\n                with amp.autocast(enabled = True):\n                    for net in all_net:\n                        net.output_type = ['inference']\n                        use += 1\n                        output = net(batch)#data_parallel(net, batch) #\n                        probability += \\\n                            F.interpolate(output['probability'], size=(d.img_height,d.img_width),\n                                          mode='bilinear',align_corners=False, antialias=True )\n                       \n                    probability = undo_tta_batch(probability/use)\n            #---\n            probability = probability.data.cpu().numpy()\n            p = probability>organ_threshold[d.data_source][d.organ] \n            rle = rle_encode(p)\n        else:\n            rle = ''\n        \n        #----\n        if 0: #debug\n            image = cv2.cvtColor(tiff, 4).astype(np.float32)/255 #cv2.COLOR_RGB2BGR=4\n            mask  = rle_decode(d.rle, d.img_height, d.img_width, 1) #None\n            overlay = result_to_overlay(image, mask, probability)\n            \n            #image_show('image',image, resize=0.25)\n            image_show('overlay',overlay, resize=0.25)\n            cv2.waitKey(0)\n            pass\n        \n        result.append({ 'id':id, 'rle':rle, })\n        # print('\\r', '\\tsubmit ... %3d/%3d %s'%(i, len(valid_df), time_to_str(timer() - start_timer,'sec')), end='',flush=True)\n    print('\\n')\n    \n    #---\n    submit_df = pd.DataFrame(result)\n    submit_df.to_csv('submission.csv',index=False)\n    print(submit_df)\n    print('\\tsubmit_df ok!')\n    print('')\n    \n#     if submit_type  == 'local-cv':\n#         do_local_validation()\n        \n#     if submit_type == 'local-test':\n#         import matplotlib.pyplot as plt \n#         m = tiff\n#         p = probability\n        \n#         plt.figure(figsize=(12, 7))\n#         plt.subplot(1, 3, 1); plt.imshow(m); plt.axis('OFF'); plt.title('image')\n#         plt.subplot(1, 3, 2); plt.imshow(p*255); plt.axis('OFF'); plt.title('mask')\n#         plt.subplot(1, 3, 3); plt.imshow(m); plt.imshow(p*255, alpha=0.4); plt.axis('OFF'); plt.title('overlay')\n#         plt.tight_layout()\n#         plt.show()\ndo_submit()","metadata":{"execution":{"iopub.status.busy":"2023-05-10T07:32:30.224738Z","iopub.execute_input":"2023-05-10T07:32:30.227393Z","iopub.status.idle":"2023-05-10T07:32:44.108523Z","shell.execute_reply.started":"2023-05-10T07:32:30.227353Z","shell.execute_reply":"2023-05-10T07:32:44.107352Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}