{"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\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 read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\n\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import matplotlib.pyplot as plt\nimport pydicom as dicom\nfrom skimage.transform import resize\ntrain='/kaggle/input/vinbigdata-chest-xray-abnormalities-detection/train'\narr=[]\nfor img in os.listdir(train):\n    ds = dicom.dcmread(os.path.join(train,img))\n    \n    data=ds.pixel_array\n    arr.append(data)\n    #resized_img = resize(data, (2500, 2500), anti_aliasing=True)\n    #print(resized_img.shape)\n    #print(label)\n    plt.imshow(data)\n    plt.show()\n    #print(len(arr))\n    break\n  \n    ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import pathlib\ntrain_csv_path=pathlib.\\\n        Path(\"../input/vinbigdata-chest-xray-abnormalities-detection/train.csv\")\nsample_sub_path=pathlib.\\\n        Path(\"../input/vinbigdata-chest-xray-abnormalities-detection/sample_submission.csv\")\n#dicom data\ntrain_data_path=pathlib.\\\n        Path(\"../input/vinbigdata-chest-xray-abnormalities-detection/train\")\ntest_data_path=pathlib.\\\n        Path(\"../input/vinbigdata-chest-xray-abnormalities-detection/test\")\n\n#pathの確認\nprint(pathlib.Path.exists(train_csv_path),\n      pathlib.Path.exists(train_data_path),\n      pathlib.Path.exists(test_data_path)\n     )","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from torchvision import transforms\nimport albumentations\nfrom skimage import data, exposure, img_as_float\ndata=arr[0]\n\ndata = exposure.equalize_hist(data)\nplt.imshow(data,'gray')\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"\nimg = exposure.equalize_adapthist(data/np.max(data))\nplt.figure(figsize = (7,7))\nplt.imshow(img, 'gray')\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from pydicom import dcmread\ndef read_xray(path, voi_lut = True, fix_monochrome = True):\n    dicom = pydicom.read_file(path)\n    \n    # VOI LUT (if available by DICOM device) is used to transform raw DICOM data to \"human-friendly\" view\n    if voi_lut:\n        data = apply_voi_lut(dicom.pixel_array, dicom)\n    else:\n        data = dicom.pixel_array\n               \n    # depending on this value, X-ray may look inverted - fix that:\n    if fix_monochrome and dicom.PhotometricInterpretation == \"MONOCHROME1\":\n        data = np.amax(data) - data\n    \n    data = data - np.min(data)\n        \n    return data","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"\n\n#transforms.Grayscale(3)\n\ntransform=transforms.Compose([\n        transforms.ToPILImage(),\n        transforms.Grayscale(3),\n        transforms.ToTensor(),\n        ]) ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def resize(image, boxes, width, height):\n    # 現在の高さと幅を取得しておく\n    c_height, c_width = image.shape[:2]\n    img = cv2.resize(image, (width, height))\n    \n    # 圧縮する比率(rate)を計算\n    r_width = width / c_width\n    r_height = width / c_height\n    \n    # 比率を使ってBoundingBoxの座標を修正\n    new_boxes = []\n    for box in boxes:\n        x,y,w,h=box\n        x = int(x * r_width)\n        y = int(y * r_height)\n        w = int(w * r_width)\n        h = int(h * r_height)\n        new_box =[x, y, w, h]\n        new_boxes.append(new_box)\n    return img, new_boxes","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df=pd.read_csv('/kaggle/input/vinbigdata-chest-xray-abnormalities-detection/train.csv')\ndf.fillna(0,inplace=True)\ndf.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from torch.utils.data import Dataset,DataLoader,random_split\nclass My_Dataset(Dataset):\n    def __init__(self,df,):\n        \n        #dataframeを格納する\n        self.df = df\n        self.image_ids=df[\"image_id\"].unique()\n        self.image_dir=pathlib.\\\n                    Path(\"../input/vinbigdata-chest-xray-abnormalities-detection/train\")\n        #columnsを設定する\n        self.box_col=[\"y_min\",\"y_min\",\"x_max\",\"y_max\"]\n        #transform\n        self.transform=transforms.Compose(\n            [\n            transforms.ToPILImage(),\n            transforms.Grayscale(3),\n            transforms.ToTensor(),\n            ]) \n\n    def __len__(self):\n        return len(self.image_ids)\n    \n    def __getitem__(self,index,transform=False):\n        \n        #train_data(dicom)よりrandomでdicomデータを取得\n        image_id=self.image_ids[index]\n        #print(image_id)\n        \n        #[dicom_data] #arrayに変換されて出力\n        image=read_xray(str(self.image_dir/image_id)+\".dicom\")\n\n        #Histogram normalization(type:ndarray)\n        image = exposure.equalize_hist(image)\n        \n        \n        #-----bboxが複数の可能性あり、複数のデータを取得する必要あり。-----\n        records = self.df[(self.df['image_id'] == image_id)]\n        records = records.reset_index(drop=True)\n        \n        if records.loc[0, \"class_id\"] == 0:\n            records = records.loc[[0], :]\n        #records = self.df.loc[self.df.image_id == img_path.split('.')[0],:].reset_index(drop = True)\n        \n        #-----bounding box-----\n        boxes = records[self.box_col].values.astype(np.float32)\n        #----area-----\n        #bbox:[x,y,w,h]とすると、(w-x)*(h-y)で出力される。\n        area = (boxes[:,2] - boxes[:,0]) * (boxes[:,3] - boxes[:,1])\n        area = area.astype(np.float32)\n        \n        #----labels-----\n        \"\"\"\n        0 - Aortic enlargement,1 - Atelectasis,2 - Calcification,3 - Cardiomegaly,4 - Consolidation,\n        5 - ILD,6 - Infiltration,7 - Lung Opacity,8 - Nodule/Mass,9 - Other lesion,10 - Pleural effusion,\n        11 - Pleural thickening,12 - Pneumothorax,13 - Pulmonary fibrosis\n        15に該当するのはNoneっぽい\n        \"\"\"\n        \n        labels = torch.tensor(records[\"class_id\"].values, dtype=torch.int64)\n        \n        # suppose all instances are not crowd\n        #iscrowd = torch.zeros((records.shape[0],), dtype=torch.int64)\n        \n        #元の画像データの画像サイズを取得する\n        \n        #-----[target]:dict-----\n        target = {}\n        target['boxes'] = torch.tensor(boxes)\n        target['labels'] = labels\n        target['image_id'] = torch.tensor([index])\n        #target['area'] = torch.tensor(area)\n        #target['iscrowd'] = iscrowd\n        target[\"image_row_shape\"]=torch.tensor(image.shape)\n        target[\"dicom_id\"]=image_id\n        \n        #Transoformed Image\n        #transform\n        #image_transformed=self.transform(image.astype(np.float32))\n        \n        #width,height=[512,512]でresizeする\n        width=512\n        height=512\n        image_resized,boxes_resized=resize(image,boxes,width, height)\n        #print(\"boxes_resized:\",boxes_resized)\n        target[\"boxes_resized\"]=torch.tensor(boxes_resized)\n        \n        #transform\n        image_transformed=self.transform(image_resized.astype(np.float32))\n        \n        return image_transformed, target","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def collate_fn(batch):\n    imgs, targets= list(zip(*batch))\n    imgs = torch.stack(imgs)\n   \n    targets = list(targets)\n   \n    return imgs,targets","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import torch\nimport cv2\nfrom torch.utils.data import Dataset,DataLoader,random_split\nimport pydicom\n\nfrom pydicom.pixel_data_handlers.util import apply_voi_lut\n\n\ndf.fillna(0,inplace=True)\ntrain_dataset=My_Dataset(df=df)\ntrain_dataloader=DataLoader(train_dataset,\n                            batch_size=3,shuffle=True, \n                            collate_fn= collate_fn)\n\n\nimage,target =next(iter(train_dataloader))\nprint(\"------image-----\")\nprint(\"image_tensor:\",image.shape)\nprint(\"-----target-----\")\nprint(target[0])\nprint(target[1])\nprint(target[2])\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train1=My_Dataset(df=df)\ntrain_dataloader1=DataLoader(train_dataset,\n                            shuffle=True, \n                            collate_fn= collate_fn)\n\ntrain_dataloader1","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"\nprint(df[\"class_id\"].unique())\nprint(len(df[\"class_id\"].unique()))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def draw_boundingbox(target):\n    \n    \n    #-----image-----\n    image_dir=pathlib.\\\n        Path(\"../input/vinbigdata-chest-xray-abnormalities-detection/train\")\n    image_id=target[\"dicom_id\"]\n    img=read_xray(str(image_dir/image_id)+\".dicom\")\n    \n    bboxes=target[\"boxes\"].detach().numpy().astype(int)\n   \n    print(\"bounding box:\",bboxes)\n        \n  \n    labels=target[\"labels\"].detach().numpy()\n    print(\"label:\",labels)\n        \n\n    for bbox,label in zip(bboxes,labels):\n\n        x = int(bbox[0])\n        y = int(bbox[1])\n        w = int(bbox[2])\n        h = int(bbox[3])\n        color = (0,255,0)\n        \n\n        cv2.putText(img,str(label), (x, y), cv2.FONT_HERSHEY_SIMPLEX, 1.5, color, 3)\n \n        cv2.rectangle(img, (x, y), (w, h), (0,255,0), 2)\n    \n    plt.figure(num=None, figsize=(5,5), dpi=80, facecolor='w', edgecolor='k')\n    plt.imshow(img,cmap=\"bone\")\n    plt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"for i in range(len(target)):\n    data=target[i]\n    draw_boundingbox(data)  ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def draw_boundingbox_resized(target):\n    image_dir=pathlib.\\\n        Path(\"../input/vinbigdata-chest-xray-abnormalities-detection/train\")\n\n    image_id=target[\"dicom_id\"]\n    img=read_xray(str(image_dir/image_id)+\".dicom\")\n    width,height=512,512\n    img=cv2.resize(img, (width, height))\n    \n    #-----bounding box-----\n    bboxes=target[\"boxes_resized\"].detach().numpy().astype(int)\n    #print(\"bounding_box:\\n\",bboxes)\n    print(\"bounding box:\",bboxes)\n        \n    #-----label name-----\n    labels=target[\"labels\"].detach().numpy()\n    print(\"label:\",labels)\n    #Plot Image with Bounding Box\n    for bbox,label in zip(bboxes,labels):\n\n        x = int(bbox[0])\n        y = int(bbox[1])\n        w = int(bbox[2])\n        h = int(bbox[3])\n        color = (0,0,255)\n        \n      \n        cv2.rectangle(img, (x, y), (w, h), (255,0,0), 1)\n        \n       \n        cv2.putText(img,str(label), (x, y), cv2.FONT_HERSHEY_SIMPLEX, 1.5, color, 1)\n    \n    plt.figure(num=None, figsize=(5,5), dpi=80, facecolor='w', edgecolor='k')\n    plt.imshow(img,cmap=\"bone\")\n    plt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"for i in range(len(target)):\n    draw_boundingbox_resized(target[i])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# from keras.preprocessing.image import ImageDataGenerator\n# datagen_train = ImageDataGenerator(\n#                         rotation_range=40,          \n#                         width_shift_range=0.2,   \n#                         height_shift_range=0.2,  \n#                         zoom_range=0.2,           \n#                         horizontal_flip=True,     \n#                         vertical_flip=False      \n#                                    )     \n\n# datagen_test =  ImageDataGenerator(validation_split = 0.2) ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"\n# for img in os.listdir(train):\n#     My_Dataset(img)\n    \n#     plt.imshow(data)\n#     plt.show()\n    \n#     break\n# My_Dataset('')\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# import tensorflow as tf\n# data_augmentation = tf.keras.Sequential([\n#   tf.keras.layers.experimental.preprocessing.RandomFlip(\"horizontal_and_vertical\"),\n#   tf.keras.layers.experimental.preprocessing.RandomRotation(0.2),\n# ])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import tensorflow as tf","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"\nfrom tensorflow.keras import Sequential\nfrom tensorflow.keras import layers\nfrom tensorflow.keras.layers import Conv2D,Dense\nmodel=Sequential()\nmodel.add(Conv2D(128,(5,5),strides=(2,2),input_shape=[512,512,3])),\nmodel.add(Dense(14))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.compile(optimizer='adam')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.summary()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.fit(target)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train=ImageDataGenerator(rescale=1/255)\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# train_dataset=train.flow_from_directory(\"../input/vinbigdata-chest-xray-abnormalities-detection/train/\",\n#                                        target_size=(512,512),\n#                                        batch_size=32,\n#                                        class_mode='categorical')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import torchvision\nmodel = torchvision.models.detection.fasterrcnn_resnet50_fpn(pretrained=True, pretrained_backbone=True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"device = torch.device('cuda') if torch.cuda.is_available() else torch.device('cpu')\ndevice","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"num_classes = len(df['class_id'].unique()) # here no_findings (14) == background class\nnum_classes","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# in_features = model.roi_heads.box_predictor.cls_score.in_features\n# in_features","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# model.roi_heads.box_predictor = FastRCNNPredictor(in_features, num_classes)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# model.train()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# from fastai.medical.imaging import *\n# items=get_dicom_files(train)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# xray_sample = items[101].dcmread()\n# xray_sample","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# img = read_xray(str(data))\n# img = exposure.equalize_hist(img)\n# plt.figure(figsize = (7,7))\n# plt.imshow(img, 'gray')\n# plt.show()\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# import pydicom\n# from pydicom.pixel_data_handlers.util import apply_voi_lut\n# from skimage import exposure\n\n\n# #[reference]\\\n# #https://www.kaggle.com/raddar/popular-x-ray-image-normalization-techniques\n\n# def read_xray(path, voi_lut = True, fix_monochrome = True):\n#     dicom = pydicom.read_file(path)\n    \n#     # VOI LUT (if available by DICOM device) is used to transform raw DICOM data to \"human-friendly\" view\n#     if voi_lut:\n#         data = apply_voi_lut(dicom.pixel_array, dicom)\n#     else:\n#         data = dicom.pixel_array\n               \n#     # depending on this value, X-ray may look inverted - fix that:\n#     if fix_monochrome and dicom.PhotometricInterpretation == \"MONOCHROME1\":\n#         data = np.amax(data) - data\n    \n#     data = data - np.min(data)\n        \n#     return data\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"\n# img = read_xray(str(xray_sample))\n# plt.figure(figsize=(7,7))\n# plt.imshow(img, 'gray')\n# plt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# xray_sample.PixelData[:200]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# xray_sample.pixel_array, xray_sample.pixel_array.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#xray_sample.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":" #data.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# import pandas as pd\n# train_df=pd.read_csv(\"../input/vinbigdata-chest-xray-abnormalities-detection/train.csv\")\n# train_df","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# class_name_ids = ['Aortic enlargement','Atelectasis','Calcification','Cardiomegaly','Consolidation','ILD','Infiltration','Lung Opacity','Nodule/Mass','Other lesion','Pleural effusion','Pleural thickening','Pneumothorax','Pulmonary fibrosis']\n# values = [0,1,2,3,4,5,6,7,8,9,10,11,12,13]\n# class_dictionary = dict(zip(class_name_ids, values))\n# print (class_dictionary)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# train_df['class_id'].value_counts(normalize = False, dropna = False)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# def Calculate_IoU(predicted_bound, ground_truth_bound):\n#     pxmin, pymin, pxmax, pymax = predicted_bound\n#     print(\"predicted bound cordinates are：({}, {}, {}, {})\".format(pxmin, pymin, pxmax, pymax))\n#     gxmin, gymin, gxmax, gymax = ground_truth_bound\n#     print(\"ground truth bound cordinates are：({}, {}, {}, {})\".format(gxmin, gymin, gxmax, gymax))\n    \n    \n\n#     parea = (pxmax - pxmin) * (pymax - pymin) \n#     garea = (gxmax - gxmin) * (gymax - gymin) \n#     print(\"parea：{}；garea：{}\".format(parea, garea))\n#     print('mark1')\n\n   \n#     xmin = max(pxmin, gxmin) # absicca of lower left vertex\n#     ymin = max(pymin, gymin) # lowe left vertex\n#     xmax = min(pxmax, gxmax) # absicca of top right vertex\n#     ymax = min(pymax, gymax) # top right coordinates\n#     print('mark2')\n#     #area of the rectangle\n#     w = xmax - xmin\n#     h = ymax - ymin\n#     if w <=0 or h <= 0:\n#         return 0,(0,0,0,0)\n#     print('mark3')\n#     area = w * h\n#     print(\"the intersaction cordinates are：\",xmin,ymin,xmax,ymax)\n#     print(\"area is：{}\".format(area))\n\n#     IoU = area / (parea + garea - area)\n\n#     return IoU,(xmin,ymin,xmax,ymax)\n \n# if __name__ == '__main__':\n#     IoU = Calculate_IoU( (-1, -1, 1, 1), (0, 0, 2, 2))\n#     print(\"iou：{}\".format(IoU))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# train_df.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# train_df","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"\n\"\"\"\nresults = pd.DataFrame(results)\nresults['class_id'].value_counts(normalize = False, dropna = False)\ntrain_df=results\ntrain_df\n\"\"\"\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"\"\"\"\n@misc{nguyen2020vindrcxr,\n      title={VinDr-CXR: An open dataset of chest X-rays with radiologist's annotations}, \n      author={Ha Q. Nguyen and Khanh Lam and Linh T. Le and Hieu H. Pham and Dat Q. Tran and Dung B. Nguyen and Dung D. Le and Chi M. Pham and Hang T. T. Tong and Diep H. Dinh and Cuong D. Do and Luu T. Doan and Cuong N. Nguyen and Binh T. Nguyen and Que V. Nguyen and Au D. Hoang and Hien N. Phan and Anh T. Nguyen and Phuong H. Ho and Dat T. Ngo and Nghia T. Nguyen and Nhan T. Nguyen and Minh Dao and Van Vu},\n      year={2020},\n      eprint={2012.15029},\n      archivePrefix={arXiv},\n      primaryClass={eess.IV}\n}\n\"\"\"\n","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}