{"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":"%matplotlib inline\nimport os\nimport json\nfrom math import sin , cos , floor\nimport time\nimport tqdm\nimport torch\nimport numpy as np\nimport pandas as pd\nfrom PIL import Image\nimport torch.nn as nn\nimport torch.optim as optim\nimport torch.nn.functional as F\nimport matplotlib.pyplot as plt\nfrom torchvision import models, transforms\nfrom torch.utils.data import TensorDataset,DataLoader , Dataset\nimport cv2\nfrom sklearn.model_selection import train_test_split","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-09-23T04:10:56.581424Z","iopub.execute_input":"2022-09-23T04:10:56.582021Z","iopub.status.idle":"2022-09-23T04:10:59.788761Z","shell.execute_reply.started":"2022-09-23T04:10:56.581941Z","shell.execute_reply":"2022-09-23T04:10:59.787614Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_csv = pd.read_csv('../input/pku-autonomous-driving/train.csv')\n\ntest_csv  = pd.read_csv('../input/pku-autonomous-driving/sample_submission.csv')\n","metadata":{"execution":{"iopub.status.busy":"2022-09-23T04:10:59.795284Z","iopub.execute_input":"2022-09-23T04:10:59.798068Z","iopub.status.idle":"2022-09-23T04:10:59.932502Z","shell.execute_reply.started":"2022-09-23T04:10:59.798014Z","shell.execute_reply":"2022-09-23T04:10:59.931616Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_csv.iloc[0]['PredictionString']","metadata":{"execution":{"iopub.status.busy":"2022-09-23T04:10:59.937116Z","iopub.execute_input":"2022-09-23T04:10:59.939325Z","iopub.status.idle":"2022-09-23T04:10:59.956925Z","shell.execute_reply.started":"2022-09-23T04:10:59.939287Z","shell.execute_reply":"2022-09-23T04:10:59.955920Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def str2coords(s, names=['id', 'yaw', 'pitch', 'roll', 'x', 'y', 'z']):\n    coords = []\n    for l in np.array(s.split()).reshape([-1, 7]):\n        coords.append(dict(zip(names, l.astype('float'))))\n        if 'id' in coords[-1]:\n            coords[-1]['id'] = int(coords[-1]['id'])\n    return coords\ndef coord2string(coords):\n    s = []\n    for c in coords:\n        for n in range(7):\n            s.append(str(c[n]))\n    return ' '.join(s)\ndef rotate(x, angle):\n    x = x + angle\n    x = x - (x + np.pi) // (2 * np.pi) * 2 * np.pi\n    return x\ndef draw_obj(image, vertices, triangles):\n    for t in triangles:\n        coord = np.array([vertices[t[0]][:2], vertices[t[1]][:2], vertices[t[2]][:2]], dtype=np.int32)\n#         cv2.fillConvexPoly(image, coord, (0,0,255))\n        cv2.polylines(image, np.int32([coord]), 1, (255,255,255))\ndef euler_to_Rot(yaw, pitch, roll):\n    Y = np.array([[cos(yaw), 0, sin(yaw)],\n                  [0, 1, 0],\n                  [-sin(yaw), 0, cos(yaw)]])\n    P = np.array([[1, 0, 0],\n                  [0, cos(pitch), -sin(pitch)],\n                  [0, sin(pitch), cos(pitch)]])\n    R = np.array([[cos(roll), -sin(roll), 0],\n                  [sin(roll), cos(roll), 0],\n                  [0, 0, 1]])\n    return np.dot(Y, np.dot(P, R))    \n# map 3d bounding box into 2d\ncars = [\n        'baojun-310-2017','biaozhi-3008','biaozhi-liangxiang','bieke-yinglang-XT',\n        'biyadi-2x-F0','changanbenben','dongfeng-DS5','feiyate',\n        'fengtian-liangxiang','fengtian-MPV','jilixiongmao-2015','lingmu-aotuo-2009',\n        'lingmu-swift','lingmu-SX4-2012','sikeda-jingrui','fengtian-weichi-2006',\n        '037-CAR02','aodi-a6','baoma-330','baoma-530',\n        'baoshijie-paoche','bentian-fengfan','biaozhi-408','biaozhi-508',\n        'bieke-kaiyue','fute','haima-3','kaidilake-CTS',\n        'leikesasi','mazida-6-2015','MG-GT-2015','oubao',\n        'qiya','rongwei-750','supai-2016','xiandai-suonata',\n        'yiqi-benteng-b50','bieke','biyadi-F3','biyadi-qin',\n        'dazhong','dazhongmaiteng','dihao-EV','dongfeng-xuetielong-C6',\n        'dongnan-V3-lingyue-2011','dongfeng-yulong-naruijie','019-SUV','036-CAR01',\n        'aodi-Q7-SUV','baojun-510','baoma-X5','baoshijie-kayan',\n        'beiqi-huansu-H3','benchi-GLK-300','benchi-ML500','fengtian-puladuo-06',\n        'fengtian-SUV-gai','guangqi-chuanqi-GS4-2015','jianghuai-ruifeng-S3','jili-boyue',\n        'jipu-3','linken-SUV','lufeng-X8','qirui-ruihu',\n        'rongwei-RX5','sanling-oulande','sikeda-SUV','Skoda_Fabia-2011',\n        'xiandai-i25-2016','yingfeinidi-qx80','yingfeinidi-SUV','benchi-SUR',\n        'biyadi-tang','changan-CS35-2012','changan-cs5','changcheng-H6-2016',\n        'dazhong-SUV','dongfeng-fengguang-S560','dongfeng-fengxing-SX6'\n        ]\n    ","metadata":{"execution":{"iopub.status.busy":"2022-09-23T04:10:59.963310Z","iopub.execute_input":"2022-09-23T04:10:59.966000Z","iopub.status.idle":"2022-09-23T04:10:59.990198Z","shell.execute_reply.started":"2022-09-23T04:10:59.965971Z","shell.execute_reply":"2022-09-23T04:10:59.989061Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def projection(img , coord):\n    k = np.array([[2304.5479, 0,  1686.2379],\n           [0, 2305.8757, 1354.9849],\n           [0, 0, 1]], dtype=np.float32)\n\n    overlay = np.zeros_like(img)\n    regr = np.zeros([2710 , 3384 , 8] , dtype = 'float32')\n\n    for point in coord:\n        car_model = cars[int(point['id'])]\n        car_json = json.load(open('../input/pku-autonomous-driving/car_models_json/'+car_model+'.json'))\n        triangles = np.array(car_json['faces'])-1\n        vertices = np.array((car_json['vertices']))\n        vertices[: ,1] = -vertices[:,1] \n        yaw , pitch , roll = -point['pitch'], -point['yaw'], -point['roll']\n        \n        Rotation = np.zeros([3,4])\n        Rotation[:,:3] = euler_to_Rot(yaw , pitch , roll).T\n        x , y , z = point['x'] , point['y'] , point['z']\n        Rotation[:,3] = np.array([x,y,z])     \n        P = np.ones((vertices.shape[0],vertices.shape[1]+1))\n        P[:, :-1] = vertices\n        P = P.T\n        img_cor_points = np.dot(k, np.dot(Rotation, P))\n        img_cor_points = img_cor_points.T\n        img_cor_points[:, 0] /= img_cor_points[:, 2]\n        img_cor_points[:, 1] /= img_cor_points[:, 2]\n        draw_obj(overlay, img_cor_points, triangles)\n        regr_dict = point\n        regr_dict['id'] = 1\n        regr_dict['x'] , regr_dict['y'] , regr_dict['z'] = x/100 , y/100 , z/100\n        regr_dict['pitch_sin'] = sin(regr_dict['pitch'])\n        regr_dict['pitch_cos'] = cos(regr_dict['pitch'])\n        regr_dict['roll'] = rotate(regr_dict['roll'] , np.pi)\n        regr_dict.pop('pitch')\n        regr[overlay[:,:,0] != 0] = [regr_dict[n] for n in regr_dict]\n        \n        \n\n    return regr    \n ","metadata":{"execution":{"iopub.status.busy":"2022-09-23T04:10:59.993013Z","iopub.execute_input":"2022-09-23T04:10:59.993746Z","iopub.status.idle":"2022-09-23T04:11:00.012938Z","shell.execute_reply.started":"2022-09-23T04:10:59.993709Z","shell.execute_reply":"2022-09-23T04:11:00.011182Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"img_name = train_csv.iloc[45]['ImageId']  # 'ID_0a0980d15'\nimg = cv2.imread(f'../input/pku-autonomous-driving/train_images/{img_name}.jpg',cv2.COLOR_BGR2RGB)[:,:,::-1]\nplt.imshow(img)","metadata":{"execution":{"iopub.status.busy":"2022-09-23T04:11:00.018669Z","iopub.execute_input":"2022-09-23T04:11:00.021724Z","iopub.status.idle":"2022-09-23T04:11:02.251488Z","shell.execute_reply.started":"2022-09-23T04:11:00.021673Z","shell.execute_reply":"2022-09-23T04:11:02.250259Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(20,20))\nm = projection(img , str2coords(train_csv.iloc[45]['PredictionString']))\nplt.imshow(m[:,:,0])","metadata":{"execution":{"iopub.status.busy":"2022-09-23T05:10:55.471596Z","iopub.execute_input":"2022-09-23T05:10:55.472013Z","iopub.status.idle":"2022-09-23T05:10:57.740712Z","shell.execute_reply.started":"2022-09-23T05:10:55.471964Z","shell.execute_reply":"2022-09-23T05:10:57.739816Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class DataGenerator(Dataset):\n    def __init__(self,df,img_path,mask_path):\n        self.df = df\n        self.img_path = img_path\n        self.mask_path = mask_path\n        \n    def __getitem__(self,idx):\n        coordinates = str2coords(self.df.iloc[idx]['PredictionString'])\n        img_name = self.df.iloc[idx]['ImageId']\n        img = cv2.imread(os.path.join(self.img_path , img_name+'.jpg'))\n        mask = cv2.imread(os.path.join(self.mask_path , img_name+'.jpg'))\n        regr = projection(img , coordinates)\n        img = img[1430:, :, :]\n        img = cv2.resize(img, (3072//2, 1280//2))\n        regr = regr[1430:, :, :]\n        regr = cv2.resize(regr, (3072//2, 1280//2)) \n        if type(mask)==np.ndarray:\n            mask = mask[1430:, :, :]\n            mask = cv2.resize(mask, (3072//2, 1280//2))        \n        if type(mask)!=np.ndarray:\n            mask = np.zeros(2710*3384*3).reshape(2710,3384,3)\n            mask = mask[1430:, :, :]\n            mask = cv2.resize(mask, (3072//2, 1280//2))\n        img = np.array(img)/255\n        mask = np.array(mask)/255\n        img = torch.from_numpy(img).permute(2,0,1)\n        mask = torch.from_numpy(mask).permute(2,0,1)\n        regr = torch.from_numpy(regr).permute(2,0,1)\n        return img,mask,regr\n    \n    def __len__(self):\n        return len(self.df)        \n        \n        \n        \n        \n        ","metadata":{"execution":{"iopub.status.busy":"2022-09-23T04:11:05.300062Z","iopub.execute_input":"2022-09-23T04:11:05.301176Z","iopub.status.idle":"2022-09-23T04:11:05.314966Z","shell.execute_reply.started":"2022-09-23T04:11:05.301131Z","shell.execute_reply":"2022-09-23T04:11:05.314050Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"use_gpu = torch.cuda.is_available()\nif use_gpu:\n    print('GPU is available!')\n    device = \"cuda\"\n    pinMem = True\nelse:\n    print('GPU is not available!')\n    device = \"cpu\"\n    pinMem = False","metadata":{"execution":{"iopub.status.busy":"2022-09-23T04:11:05.316760Z","iopub.execute_input":"2022-09-23T04:11:05.317293Z","iopub.status.idle":"2022-09-23T04:11:05.392511Z","shell.execute_reply.started":"2022-09-23T04:11:05.317252Z","shell.execute_reply":"2022-09-23T04:11:05.391237Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df , val_df = train_test_split(train_csv,test_size=0.1,random_state=42)","metadata":{"execution":{"iopub.status.busy":"2022-09-23T04:11:05.395740Z","iopub.execute_input":"2022-09-23T04:11:05.396772Z","iopub.status.idle":"2022-09-23T04:11:05.406964Z","shell.execute_reply.started":"2022-09-23T04:11:05.396733Z","shell.execute_reply":"2022-09-23T04:11:05.406213Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"len(val_df)","metadata":{"execution":{"iopub.status.busy":"2022-09-23T04:11:05.408097Z","iopub.execute_input":"2022-09-23T04:11:05.409170Z","iopub.status.idle":"2022-09-23T04:11:05.416578Z","shell.execute_reply.started":"2022-09-23T04:11:05.409124Z","shell.execute_reply":"2022-09-23T04:11:05.415542Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_images_path = '../input/pku-autonomous-driving/train_images/'\ntrain_masks_path = '../input/pku-autonomous-driving/train_masks/'\ntest_images_path = '../input/pku-autonomous-driving/test_images/'\ntest_masks_path = '../input/pku-autonomous-driving/test_masks/'\n\ntrainDataset = DataGenerator(train_df,train_images_path,train_masks_path)\nvalDataset = DataGenerator(val_df,train_images_path,train_masks_path)\nbatch_size=8\n\ntrainDataLoader = DataLoader(trainDataset , batch_size = batch_size , shuffle = True, num_workers=2,pin_memory =True)\nvalDataLoader = DataLoader(valDataset, batch_size = batch_size, shuffle = True , num_workers = 2, pin_memory=True)\n\n","metadata":{"execution":{"iopub.status.busy":"2022-09-23T04:11:19.752794Z","iopub.execute_input":"2022-09-23T04:11:19.753213Z","iopub.status.idle":"2022-09-23T04:11:19.759818Z","shell.execute_reply.started":"2022-09-23T04:11:19.753178Z","shell.execute_reply":"2022-09-23T04:11:19.758231Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pip install segmentation-models-pytorch","metadata":{"execution":{"iopub.status.busy":"2022-09-23T04:11:21.941704Z","iopub.execute_input":"2022-09-23T04:11:21.942112Z","iopub.status.idle":"2022-09-23T04:11:38.495113Z","shell.execute_reply.started":"2022-09-23T04:11:21.942077Z","shell.execute_reply":"2022-09-23T04:11:38.493928Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import segmentation_models_pytorch as smp\nfrom segmentation_models_pytorch import Unet","metadata":{"execution":{"iopub.status.busy":"2022-09-23T04:11:38.498837Z","iopub.execute_input":"2022-09-23T04:11:38.499183Z","iopub.status.idle":"2022-09-23T04:11:40.666456Z","shell.execute_reply.started":"2022-09-23T04:11:38.499150Z","shell.execute_reply":"2022-09-23T04:11:40.665325Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = Unet(encoder_name='resnet18' , encoder_weights = 'imagenet' , classes=8 , activation = None)\nmode = model.to(device)\nprint(model)","metadata":{"execution":{"iopub.status.busy":"2022-09-23T04:11:40.668414Z","iopub.execute_input":"2022-09-23T04:11:40.668869Z","iopub.status.idle":"2022-09-23T04:11:48.669531Z","shell.execute_reply.started":"2022-09-23T04:11:40.668812Z","shell.execute_reply":"2022-09-23T04:11:48.668388Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def criterion(mask , pred_mask , regr,pred_regr,size_avg = True):\n    mask_loss = torch.nn.functional.binary_cross_entropy_with_logits(pred_mask , mask)\n    regr_loss = (torch.abs(pred_regr - regr).sum(1) * mask).sum(1).sum(1) / mask.sum(1).sum(1)   \n    regr_loss = regr_loss.mean(0)\n    total_loss = mask_loss + regr_loss\n    if not size_avg:\n        total_loss *= pred_regr.shape[0]    \n    return total_loss\noptimizer = optim.Adam(model.parameters(), lr=0.001)","metadata":{"execution":{"iopub.status.busy":"2022-09-23T04:11:48.671834Z","iopub.execute_input":"2022-09-23T04:11:48.672586Z","iopub.status.idle":"2022-09-23T04:11:48.680190Z","shell.execute_reply.started":"2022-09-23T04:11:48.672544Z","shell.execute_reply":"2022-09-23T04:11:48.679159Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"iterations = 5\ntrainLoss = []\nvalLoss = []\nstart = time.time()\n\nfor epoch in range(iterations):\n    epochStart = time.time()\n    runningLoss = 0   \n    model.train() # For training\n    for data in tqdm.notebook.tqdm(trainDataLoader):\n        inputs,mask,regr = data\n        inputs, mask ,regr = inputs.float().to(device), mask.float().to(device), regr.float().to(device) \n        \n        # Feed-forward input data through the network\n        outputs = model(inputs)\n        # Compute loss/error\n        loss = criterion(regr[:,0],outputs[:,0], regr[:,1:] , outputs[:,1:])      \n        # Initialize gradients to zero\n        optimizer.zero_grad()                  \n        # Backpropagate loss and compute gradients\n        loss.backward()\n        # Update the network parameters\n        optimizer.step()\n        # Accumulate loss per batch\n        runningLoss += loss.item()\n    avgTrainLoss = runningLoss/(3835 /batch_size)   \n    trainLoss.append(avgTrainLoss)\n  \n    \n    # Evaluating performance on test set for each epoch\n    model.eval() # For testing\n    val_runningLoss = 0\n    with torch.no_grad():\n        for data in tqdm.notebook.tqdm(valDataLoader):\n            inputs,mask,regr = data\n            inputs, mask,regr = inputs.float().to(device), mask.float().to(device), regr.float().to(device)         \n            outputs = model(inputs)       \n             # Compute loss/error\n            loss = criterion(regr[:,0],outputs[:,0], regr[:,1:] , outputs[:,1:],size_avg = False)      \n            # Accumulate loss per batch\n            val_runningLoss += loss.item() \n    avgValLoss = val_runningLoss/(427/batch_size)  \n    valLoss.append(avgValLoss)\n    # Plotting Loss vs Epochs\n    fig1 = plt.figure(1)        \n    plt.plot(range(epoch+1),trainLoss,'r--',label='train')        \n    plt.plot(range(epoch+1),valLoss,'g--',label='valid')        \n    if epoch==0:\n        plt.legend(loc='upper left')\n        plt.xlabel('Epochs')\n        plt.ylabel('Loss')     \n    \n    epochEnd = time.time()-epochStart\n    print('At Iteration: {:.0f} /{:.0f}  ;  Training Loss: {:.6f}; Time consumed: {:.0f}m {:.0f}s '\\\n          .format(epoch + 1,iterations,avgTrainLoss,epochEnd//60,epochEnd%60))\n    print('At Iteration: {:.0f} /{:.0f}  ;  Validation Loss: {:.6f} ; Time consumed: {:.0f}m {:.0f}s '\\\n          .format(epoch + 1,iterations,avgValLoss,epochEnd//60,epochEnd%60))\nend = time.time()-start\nprint('Training completed in {:.0f}m {:.0f}s'.format(end//60,end%60))","metadata":{"execution":{"iopub.status.busy":"2022-09-22T07:11:58.887575Z","iopub.execute_input":"2022-09-22T07:11:58.887931Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.load_state_dict(torch.load('../input/unetautonomous/Unetautonomous.pt'))","metadata":{"execution":{"iopub.status.busy":"2022-09-23T04:13:46.366604Z","iopub.execute_input":"2022-09-23T04:13:46.367027Z","iopub.status.idle":"2022-09-23T04:13:47.450948Z","shell.execute_reply.started":"2022-09-23T04:13:46.366993Z","shell.execute_reply":"2022-09-23T04:13:47.449927Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class TestDataset(Dataset):\n    def __init__(self,df,img_path,mask_path):\n        self.df = df\n        self.img_path = img_path\n        self.mask_path = mask_path\n        \n    def __getitem__(self,idx):\n        img_name = self.df.iloc[idx]['ImageId']\n        img = cv2.imread(os.path.join(self.img_path , img_name+'.jpg'))\n        mask = cv2.imread(os.path.join(self.mask_path , img_name+'.jpg'))\n        img = img[1430:, :, :]\n        img = cv2.resize(img, (3072//2, 1280//2))\n        if type(mask)==np.ndarray:\n            mask = mask[1430:, :, :]\n            mask = cv2.resize(mask, (3072//2, 1280//2))        \n        if type(mask)!=np.ndarray:\n            mask = np.zeros(2710*3384*3).reshape(2710,3384,3)\n            mask = mask[1430:, :, :]\n            mask = cv2.resize(mask, (3072//2, 1280//2))\n        img = np.array(img)/255\n        mask = np.array(mask)/255\n        img = torch.from_numpy(img).permute(2,0,1)\n        mask = torch.from_numpy(mask).permute(2,0,1)\n        return img,mask\n    \n    def __len__(self):\n        return len(self.df)    ","metadata":{"execution":{"iopub.status.busy":"2022-09-23T06:16:20.523198Z","iopub.execute_input":"2022-09-23T06:16:20.523611Z","iopub.status.idle":"2022-09-23T06:16:20.535180Z","shell.execute_reply.started":"2022-09-23T06:16:20.523576Z","shell.execute_reply":"2022-09-23T06:16:20.534160Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_df = pd.read_csv('../input/pku-autonomous-driving/sample_submission.csv')\n","metadata":{"execution":{"iopub.status.busy":"2022-09-23T06:16:25.486190Z","iopub.execute_input":"2022-09-23T06:16:25.486561Z","iopub.status.idle":"2022-09-23T06:16:25.500347Z","shell.execute_reply.started":"2022-09-23T06:16:25.486529Z","shell.execute_reply":"2022-09-23T06:16:25.499276Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"testDataset = TestDataset(test_df,test_images_path,test_masks_path)\ntestDataLoader = DataLoader(testDataset , batch_size = 1 , shuffle = True, num_workers=2,pin_memory =True)\n","metadata":{"execution":{"iopub.status.busy":"2022-09-23T06:16:28.535769Z","iopub.execute_input":"2022-09-23T06:16:28.536469Z","iopub.status.idle":"2022-09-23T06:16:28.541697Z","shell.execute_reply.started":"2022-09-23T06:16:28.536431Z","shell.execute_reply":"2022-09-23T06:16:28.540455Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"with torch.no_grad():\n    i=0\n    for data in tqdm.notebook.tqdm(testDataLoader):\n        inputs,mask = data\n        inputs, mask = inputs.float().to(device), mask.float().to(device)\n        outputs = model(inputs)\n        predict = torch.nn.Sigmoid()(outputs[0,0])\n        predict = predict.detach().cpu().numpy()\n        predict[predict >= 0.5] = 1\n        mask = cv2.cvtColor(mask[0].permute(1,2,0).detach().cpu().numpy() , cv2.COLOR_BGR2GRAY)\n        predict[mask == 1] = 0\n        predict[predict < 0.5] = 0\n        regr = outputs[0,1:].detach().cpu().numpy()\n        overlay = cv2.convertScaleAbs(predict)\n        contours , heirarchy = cv2.findContours(overlay, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE)\n        sub=[]\n        for c in contours:\n            pose = []\n            M = cv2.moments(c)\n            if M[\"m00\"] != 0:\n                cX = int(M['m10'] / M['m00'])\n                cY = int(M['m01'] / M['m00'])\n                pose.append(regr[0,cY,cX]) \n                pitch_sin = regr[5,cY,cX] / np.sqrt((regr[5,cY,cX])**2 + (regr[5,cY,cX])**2)\n                pitch_cos = regr[6,cY,cX] / np.sqrt((regr[6,cY,cX])**2 + (regr[6,cY,cX])**2)\n                pose.append(np.arccos(pitch_cos) * np.sign(pitch_sin))\n                pose.append(rotate(regr[1,cY,cX], -np.pi))\n                pose.append(regr[2,cY,cX]*100)\n                pose.append(regr[3,cY,cX]*100)\n                pose.append(regr[4,cY,cX]*100)\n                sub.append(pose)\n        lastsub = ''\n\n        for points in sub:\n            for p in points:\n                lastsub += ' ' + str(p)\n\n        lastsub = lastsub[1:]\n\n        test_df['PredictionString'][i] = lastsub\n        i += 1\n    \n    ","metadata":{"execution":{"iopub.status.busy":"2022-09-23T06:16:40.417951Z","iopub.execute_input":"2022-09-23T06:16:40.418324Z","iopub.status.idle":"2022-09-23T06:25:30.671288Z","shell.execute_reply.started":"2022-09-23T06:16:40.418292Z","shell.execute_reply":"2022-09-23T06:25:30.669982Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_df.iloc[75]['PredictionString']","metadata":{"execution":{"iopub.status.busy":"2022-09-23T06:30:22.219613Z","iopub.execute_input":"2022-09-23T06:30:22.220026Z","iopub.status.idle":"2022-09-23T06:30:22.226748Z","shell.execute_reply.started":"2022-09-23T06:30:22.219991Z","shell.execute_reply":"2022-09-23T06:30:22.225738Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_df.to_csv('submission.csv' , index =False)","metadata":{"execution":{"iopub.status.busy":"2022-09-23T06:27:32.844795Z","iopub.execute_input":"2022-09-23T06:27:32.845553Z","iopub.status.idle":"2022-09-23T06:27:32.888093Z","shell.execute_reply.started":"2022-09-23T06:27:32.845514Z","shell.execute_reply":"2022-09-23T06:27:32.887183Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#https://www.kaggle.com/code/ryunosukeishizaki/instance-segmentation-pipeline","metadata":{},"execution_count":null,"outputs":[]}]}