{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import json\n", "import os\n", "\n", "hardpos_path = os.path.join('/data2/projects/VRIS/llama3', 'verb_ext_text_example_refzom.json')\n", "with open(hardpos_path, 'r', encoding='utf-8') as f:\n", " hardpos_json = json.load(f)\n" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "57624\n", "loading dataset ref-zom into memory...\n", "loading dataset split final\n", "creating index...\n", "index created.\n", "DONE (t=11.10s)\n" ] } ], "source": [ "print(len(hardpos_json.keys()))\n", "\n", "from refer.refer_zom import ZREFER\n", "refer = ZREFER('/data2/dataset/COCO2014/', 'ref-zom', 'final')\n" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2327 {'2327': []}\n", "{'sent_ids': [2327], 'file_name': 'COCO_train2014_000000318556.jpg', 'ann_id': [], 'ref_id': 2327, 'image_id': 318556, 'split': 'train', 'source': 'zero', 'sentences': [{'tokens': ['Cooking', 'table', 'in', 'background'], 'raw': 'Cooking table in background', 'sent_id': 2327, 'sent': 'Cooking table in background'}]}\n", "2328 {'2328': []}\n", "{'sent_ids': [2328], 'file_name': 'COCO_train2014_000000116100.jpg', 'ann_id': [], 'ref_id': 2328, 'image_id': 116100, 'split': 'train', 'source': 'zero', 'sentences': [{'tokens': ['An', 'elephant', 'that', 'has', \"it's\", 'trunk', 'and', 'all', 'four', 'feet', 'in', 'the', 'water.'], 'raw': \"An elephant that has it's trunk and all four feet in the water.\", 'sent_id': 2328, 'sent': \"An elephant that has it's trunk and all four feet in the water.\"}]}\n", "2329 {'2329': ['carrying plates of pizza']}\n", "{'sent_ids': [2329], 'file_name': 'COCO_train2014_000000538480.jpg', 'ann_id': [], 'ref_id': 2329, 'image_id': 538480, 'split': 'train', 'source': 'zero', 'sentences': [{'tokens': ['Man', 'in', 'a', 'black', 'shirt', 'carrying', 'plates', 'of', 'pizza.'], 'raw': 'Man in a black shirt carrying plates of pizza.', 'sent_id': 2329, 'sent': 'Man in a black shirt carrying plates of pizza.'}]}\n", "2330 {'2330': ['holding']}\n", "{'sent_ids': [2330], 'file_name': 'COCO_train2014_000000476220.jpg', 'ann_id': [], 'ref_id': 2330, 'image_id': 476220, 'split': 'train', 'source': 'zero', 'sentences': [{'tokens': ['The', 'stuffed', 'pig', 'that', 'the', 'blond', 'boy', 'is', 'holding'], 'raw': 'The stuffed pig that the blond boy is holding', 'sent_id': 2330, 'sent': 'The stuffed pig that the blond boy is holding'}]}\n", "2331 {'2331': []}\n", "{'sent_ids': [2331], 'file_name': 'COCO_train2014_000000299675.jpg', 'ann_id': [], 'ref_id': 2331, 'image_id': 299675, 'split': 'train', 'source': 'zero', 'sentences': [{'tokens': ['The', 'MacBook', 'Pro', 'box.'], 'raw': 'The MacBook Pro box.', 'sent_id': 2331, 'sent': 'The MacBook Pro box.'}]}\n", "2332 {'2332': []}\n", "{'sent_ids': [2332], 'file_name': 'COCO_train2014_000000032275.jpg', 'ann_id': [], 'ref_id': 2332, 'image_id': 32275, 'split': 'train', 'source': 'zero', 'sentences': [{'tokens': ['A', 'purple', 'brick', 'building', 'with', 'a', 'black', 'and', 'blue', 'parking', 'meter.', ''], 'raw': 'A purple brick building with a black and blue parking meter. ', 'sent_id': 2332, 'sent': 'A purple brick building with a black and blue parking meter. '}]}\n", "2333 {'2333': ['being wrapped around']}\n", "{'sent_ids': [2333], 'file_name': 'COCO_train2014_000000025470.jpg', 'ann_id': [], 'ref_id': 2333, 'image_id': 25470, 'split': 'train', 'source': 'zero', 'sentences': [{'tokens': ['The', 'lighter', 'colored', 'giraffe', 'whose', 'neck', 'is', 'wrapped', 'around', 'the', 'other', 'giraffes'], 'raw': 'The lighter colored giraffe whose neck is wrapped around the other giraffes', 'sent_id': 2333, 'sent': 'The lighter colored giraffe whose neck is wrapped around the other giraffes'}]}\n", "2334 {'2334': ['reaching for a frisbee']}\n", "{'sent_ids': [2334], 'file_name': 'COCO_train2014_000000513461.jpg', 'ann_id': [], 'ref_id': 2334, 'image_id': 513461, 'split': 'train', 'source': 'zero', 'sentences': [{'tokens': ['A', 'man', 'wearing', 'white', 'and', 'blue', 'shorts,', 'reaching', 'for', 'a', 'frisbee.'], 'raw': 'A man wearing white and blue shorts, reaching for a frisbee.', 'sent_id': 2334, 'sent': 'A man wearing white and blue shorts, reaching for a frisbee.'}]}\n", "2335 {'2335': []}\n", "{'sent_ids': [2335], 'file_name': 'COCO_train2014_000000285579.jpg', 'ann_id': [], 'ref_id': 2335, 'image_id': 285579, 'split': 'train', 'source': 'zero', 'sentences': [{'tokens': ['A', 'motorbike', 'occupied', 'by', 'two', 'men', 'dressed', 'like', 'teddy', 'bear.'], 'raw': 'A motorbike occupied by two men dressed like teddy bear.', 'sent_id': 2335, 'sent': 'A motorbike occupied by two men dressed like teddy bear.'}]}\n", "2336 {'2336': []}\n", "{'sent_ids': [2336], 'file_name': 'COCO_train2014_000000266366.jpg', 'ann_id': [], 'ref_id': 2336, 'image_id': 266366, 'split': 'train', 'source': 'zero', 'sentences': [{'tokens': ['left', 'portion', 'of', 'sandwich', 'closest', 'to', 'pickle'], 'raw': 'left portion of sandwich closest to pickle', 'sent_id': 2336, 'sent': 'left portion of sandwich closest to pickle'}]}\n", "2337 {'2337': ['leaning over']}\n", "{'sent_ids': [2337], 'file_name': 'COCO_train2014_000000321194.jpg', 'ann_id': [], 'ref_id': 2337, 'image_id': 321194, 'split': 'train', 'source': 'zero', 'sentences': [{'tokens': ['A', 'man', 'in', 'white', 'leaning', 'over.'], 'raw': 'A man in white leaning over.', 'sent_id': 2337, 'sent': 'A man in white leaning over.'}]}\n" ] } ], "source": [ "for idx, key in enumerate(hardpos_json) :\n", " print(key, hardpos_json[key])\n", " print(refer.Refs[int(key)])\n", " \n", " if idx == 10 :\n", " break" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "57624\n" ] } ], "source": [ "ref_ids = refer.getRefIds(split='train')\n", "print(len(ref_ids))" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "dict_values([['standing next to', 'being held'], ['standing in front']])\n" ] } ], "source": [ "pos_sents = hardpos_json['9914'].values()\n", "print(pos_sents)\n" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "dict_values([['standing next to', 'being held'], ['standing in front']])\n", "[['standing next to', 'being held'], ['standing in front']]\n", "['standing next to', 'being held']\n", "[101, 100, 100, 102]\n" ] } ], "source": [ "from bert.tokenization_bert import BertTokenizer\n", "import random\n", "pos_sents = hardpos_json['9914'].values()\n", "print(pos_sents)\n", "pos_sents = [s for s in pos_sents if s is not None]\n", "print(pos_sents)\n", "pos_sent_picked = random.choice(list(pos_sents))\n", "print(pos_sent_picked)\n", "\n", "\n", "attention_mask = [0] * 20\n", "padded_input_ids = [0] * 20\n", "tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')\n", "\n", "input_ids = tokenizer.encode(text=pos_sent_picked, add_special_tokens=True)\n", "input_ids = input_ids[:20]\n", "print(input_ids)\n" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/seunghoon/.conda/envs/lavt/lib/python3.9/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", " from .autonotebook import tqdm as notebook_tqdm\n", "/home/seunghoon/.conda/envs/lavt/lib/python3.9/site-packages/timm/models/layers/__init__.py:48: FutureWarning: Importing from timm.models.layers is deprecated, please import via timm.layers\n", " warnings.warn(f\"Importing from {__name__} is deprecated, please import via timm.layers\", FutureWarning)\n" ] } ], "source": [ "import datetime\n", "import argparse\n", "import os\n", "import time\n", "\n", "import torch\n", "import torch.utils.data\n", "from torch import nn\n", "\n", "from functools import reduce\n", "import operator\n", "from bert.modeling_bert import BertModel\n", "import torchvision\n", "from lib import segmentation\n", "\n", "import transforms as T\n", "import utils\n", "import numpy as np\n", "\n", "import torch.nn.functional as F\n", "\n", "import gc\n", "from collections import OrderedDict\n" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Image size: 480\n" ] } ], "source": [ "# python -m torch.distributed.launch \\\n", "# --nproc_per_node 4 \\\n", "# --master_port ${LOCALHOST} \\\n", "# train.py \\\n", "# --model lavt_one \\\n", "# --dataset refcocog \\\n", "# --splitBy umd \\\n", "# --model_id gref_umd \\\n", "# --batch-size 8 \\\n", "# --lr 0.00005 \\\n", "# --wd 1e-2 \\\n", "# --output-dir ./models/gref_umd/lavt_test_lr \\\n", "# --swin_type base \\\n", "# --pretrained_swin_weights ./pretrained_weights/swin_base_patch4_window12_384_22k.pth \\\n", "# --epochs 40 \\\n", "# --img_size 480 2>&1 | tee ./models/gref_umd/lavt_test_lr\n", "import argparse\n", "from utils import init_distributed_mode\n", "\n", "def get_parser():\n", " parser = argparse.ArgumentParser(description=\"Model Training Configuration\")\n", " parser.add_argument('--batch_size', default=8, type=int)\n", " parser.add_argument('--output_dir', default='./models/gref_umd/lavt_test_dset', type=str)\n", " parser.add_argument('--pretrained_swin_weights', default='./pretrained_weights/swin_base_patch4_window12_384_22k.pth', type=str)\n", " parser.add_argument('--dataset', default='refcocog', type=str)\n", " parser.add_argument('--splitBy', default='umd', type=str)\n", " parser.add_argument('--model', default='lavt_one', type=str)\n", "\n", " parser.add_argument('--amsgrad', action='store_true',\n", " help='if true, set amsgrad to True in an Adam or AdamW optimizer.')\n", " parser.add_argument('-b', '--batch-size', default=8, type=int)\n", " parser.add_argument('--bert_tokenizer', default='bert-base-uncased', help='BERT tokenizer')\n", " parser.add_argument('--ck_bert', default='bert-base-uncased', help='pre-trained BERT weights')\n", " #parser.add_argument('--dataset', default='refcoco', help='refcoco, refcoco+, or refcocog')\n", " parser.add_argument('--ddp_trained_weights', action='store_true',\n", " help='Only needs specified when testing,'\n", " 'whether the weights to be loaded are from a DDP-trained model')\n", " parser.add_argument('--device', default='cuda:0', help='device') # only used when testing on a single machine\n", " parser.add_argument('--epochs', default=40, type=int, metavar='N', help='number of total epochs to run')\n", " parser.add_argument('--fusion_drop', default=0.0, type=float, help='dropout rate for PWAMs')\n", " parser.add_argument('--img_size', default=480, type=int, help='input image size')\n", " parser.add_argument(\"--local_rank\", type=int, help='local rank for DistributedDataParallel')\n", " parser.add_argument('--lr', default=0.00005, type=float, help='the initial learning rate')\n", " parser.add_argument('--mha', default='', help='If specified, should be in the format of a-b-c-d, e.g., 4-4-4-4,'\n", " 'where a, b, c, and d refer to the numbers of heads in stage-1,'\n", " 'stage-2, stage-3, and stage-4 PWAMs')\n", " #parser.add_argument('--model', default='lavt', help='model: lavt, lavt_one')\n", " parser.add_argument('--model_id', default='lavt', help='name to identify the model')\n", " parser.add_argument('--output-dir', default='./checkpoints/', help='path where to save checkpoint weights')\n", " parser.add_argument('--pin_mem', action='store_true',\n", " help='If true, pin memory when using the data loader.')\n", " parser.add_argument('--print-freq', default=10, type=int, help='print frequency')\n", " parser.add_argument('--refer_data_root', default='./refer/data/', help='REFER dataset root directory')\n", " parser.add_argument('--resume', default='', help='resume from checkpoint')\n", " parser.add_argument('--split', default='test', help='only used when testing')\n", " #parser.add_argument('--splitBy', default='unc', help='change to umd or google when the dataset is G-Ref (RefCOCOg)')\n", " parser.add_argument('--swin_type', default='base',\n", " help='tiny, small, base, or large variants of the Swin Transformer')\n", " parser.add_argument('--wd', '--weight-decay', default=1e-2, type=float, metavar='W', help='weight decay',\n", " dest='weight_decay')\n", " parser.add_argument('--window12', action='store_true',\n", " help='only needs specified when testing,'\n", " 'when training, window size is inferred from pre-trained weights file name'\n", " '(containing \\'window12\\'). Initialize Swin with window size 12 instead of the default 7.')\n", " parser.add_argument('-j', '--workers', default=8, type=int, metavar='N', help='number of data loading workers')\n", "\n", " parser.add_argument('--metric_learning', default=True, type=bool, help='whether to use metric learning')\n", " parser.add_argument('--exclude_multiobj', default=True, type=bool, help='whether to exclude multi-object images')\n", " parser.add_argument('--metric_mode', default='both', type=str, help='both : add hp and hn')\n", " parser.add_argument('--hn_prob', default=0.5, type=float, help='negative sample prob')\n", " \n", " return parser\n", "\n", "parser = get_parser()\n", "args = parser.parse_args([])\n", "print('Image size: {}'.format(str(args.img_size)))" ] }, { "cell_type": "code", "execution_count": 107, "metadata": {}, "outputs": [], "source": [ "import os\n", "import sys\n", "import json\n", "import torch.utils.data as data\n", "import torch\n", "from torchvision import transforms\n", "from torch.autograd import Variable\n", "import numpy as np\n", "from PIL import Image\n", "import torchvision.transforms.functional as TF\n", "import random\n", "\n", "from bert.tokenization_bert import BertTokenizer\n", "\n", "import h5py\n", "from refer.refer import REFER\n", "\n", "from args import get_parser\n", "\n", "# Dataset configuration initialization\n", "# parser = get_parser()\n", "# args = parser.parse_args()\n", "\n", "\n", "class ReferDataset(data.Dataset):\n", "\n", " def __init__(self,\n", " args,\n", " image_transforms=None,\n", " target_transforms=None,\n", " split='train',\n", " eval_mode=False):\n", "\n", " self.classes = []\n", " self.image_transforms = image_transforms\n", " self.target_transform = target_transforms\n", " self.split = split\n", " self.refer = REFER(args.refer_data_root, args.dataset, args.splitBy)\n", "\n", " self.max_tokens = 20\n", "\n", " ref_ids = self.refer.getRefIds(split=self.split)\n", " img_ids = self.refer.getImgIds(ref_ids)\n", "\n", " all_imgs = self.refer.Imgs\n", " self.imgs = list(all_imgs[i] for i in img_ids)\n", " self.ref_ids = ref_ids\n", "\n", " self.input_ids = []\n", " self.attention_masks = []\n", " self.tokenizer = BertTokenizer.from_pretrained(args.bert_tokenizer)\n", "\n", " # for metric learning\n", " self.ROOT = '/data2/projects/seunghoon/VerbRIS/VerbCentric_CY/datasets/VRIS'\n", " self.metric_learning = args.metric_learning\n", " self.exclude_multiobj = args.exclude_multiobj\n", " self.metric_mode = args.metric_mode\n", " self.exclude_position = False\n", "\n", " if self.metric_learning:\n", " self.hardneg_prob = args.hn_prob \n", " self.multi_obj_ref_ids = self._load_multi_obj_ref_ids()\n", " self.hardpos_meta, self.hardneg_meta = self._load_metadata()\n", " else:\n", " self.hardneg_prob = 0.0\n", " self.multi_obj_ref_ids = None\n", " self.hardpos_meta, self.hardneg_meta = None, None\n", "\n", "\n", " self.eval_mode = eval_mode\n", " # if we are testing on a dataset, test all sentences of an object;\n", " # o/w, we are validating during training, randomly sample one sentence for efficiency\n", " for r in ref_ids:\n", " ref = self.refer.Refs[r]\n", "\n", " sentences_for_ref = []\n", " attentions_for_ref = []\n", "\n", " for i, (el, sent_id) in enumerate(zip(ref['sentences'], ref['sent_ids'])):\n", " sentence_raw = el['raw']\n", " attention_mask = [0] * self.max_tokens\n", " padded_input_ids = [0] * self.max_tokens\n", "\n", " input_ids = self.tokenizer.encode(text=sentence_raw, add_special_tokens=True)\n", "\n", " # truncation of tokens\n", " input_ids = input_ids[:self.max_tokens]\n", "\n", " padded_input_ids[:len(input_ids)] = input_ids\n", " attention_mask[:len(input_ids)] = [1]*len(input_ids)\n", "\n", " sentences_for_ref.append(torch.tensor(padded_input_ids).unsqueeze(0))\n", " attentions_for_ref.append(torch.tensor(attention_mask).unsqueeze(0))\n", "\n", " self.input_ids.append(sentences_for_ref)\n", " self.attention_masks.append(attentions_for_ref)\n", "\n", "\n", " def _tokenize(self, sentence):\n", " attention_mask = [0] * self.max_tokens\n", " padded_input_ids = [0] * self.max_tokens\n", "\n", " input_ids = self.tokenizer.encode(text=sentence, add_special_tokens=True)\n", " # truncation of tokens\n", " input_ids = input_ids[:self.max_tokens]\n", " padded_input_ids[:len(input_ids)] = input_ids\n", " attention_mask[:len(input_ids)] = [1]*len(input_ids)\n", "\n", " return torch.tensor(padded_input_ids), torch.tensor(attention_mask)\n", " \n", " def _plot(self, img, target):\n", " import matplotlib.pyplot as plt\n", "\n", " # If img is a PyTorch tensor, convert it to a NumPy array and adjust shape\n", " if isinstance(img, torch.Tensor):\n", " img = img.cpu().numpy()\n", " if img.shape[0] == 3: # Shape is (channels, height, width)\n", " img = img.transpose(1, 2, 0) # Now shape is (height, width, channels)\n", "\n", " # Ensure target is a NumPy array\n", " if isinstance(target, torch.Tensor):\n", " target = target.cpu().numpy()\n", " if target.ndim == 3 and target.shape[0] == 1: # Shape is (1, height, width)\n", " target = target.squeeze(0) # Now shape is (height, width)\n", "\n", " plt.imshow(img)\n", " plt.imshow(target, alpha=0.5)\n", " plt.show()\n", "\n", "\n", " def _load_multi_obj_ref_ids(self):\n", " # Load multi-object reference IDs based on configurations\n", " if not self.exclude_multiobj and not self.exclude_position :\n", " return None\n", " elif self.exclude_position:\n", " multiobj_path = os.path.join(self.ROOT, 'multiobj_ov2_nopos.txt')\n", " elif self.exclude_multiobj :\n", " multiobj_path = os.path.join(self.ROOT, 'multiobj_ov3.txt')\n", " with open(multiobj_path, 'r') as f:\n", " return [int(line.strip()) for line in f.readlines()]\n", "\n", " def _load_metadata(self):\n", " # Load metadata for hard positive verb phrases, hard negative queries\n", " if 'op2' in self.metric_mode :\n", " hardpos_path = os.path.join(self.ROOT, 'hardpos_verbphrase_op2_1024upd.json') \n", " else :\n", " hardpos_path = os.path.join(self.ROOT, 'hardpos_verbphrase_0906upd.json')\n", " # do not use hardneg_path\n", " hardneg_path = os.path.join(self.ROOT, 'hardneg_verb.json')\n", "\n", " with open(hardpos_path, 'r', encoding='utf-8') as f:\n", " hardpos_json = json.load(f)\n", " if \"hardpos_only\" in self.metric_mode :\n", " hardneg_json = None\n", " else : \n", " with open(hardneg_path, 'r', encoding='utf-8') as q:\n", " hardneg_json = json.load(q)\n", " return hardpos_json, hardneg_json\n", "\n", " def get_classes(self):\n", " return self.classes\n", "\n", " def __len__(self):\n", " return len(self.ref_ids)\n", "\n", " def __getitem__(self, index):\n", " this_ref_id = self.ref_ids[index]\n", " this_img_id = self.refer.getImgIds(this_ref_id)\n", " this_img = self.refer.Imgs[this_img_id[0]]\n", "\n", " img = Image.open(os.path.join(self.refer.IMAGE_DIR, this_img['file_name'])).convert(\"RGB\")\n", "\n", " ref = self.refer.loadRefs(this_ref_id)\n", " #print(ref)\n", "\n", " ref_mask = np.array(self.refer.getMask(ref[0])['mask'])\n", " annot = np.zeros(ref_mask.shape)\n", " annot[ref_mask == 1] = 1\n", "\n", " annot = Image.fromarray(annot.astype(np.uint8), mode=\"P\")\n", "\n", " if self.image_transforms is not None:\n", " # resize, from PIL to tensor, and mean and std normalization\n", " img, target = self.image_transforms(img, annot)\n", "\n", " pos_sent = None\n", " neg_sent = None\n", " pos_attn_mask = None\n", " neg_attn_mask = None\n", " choice_sent = None\n", "\n", " if self.eval_mode:\n", " embedding = []\n", " att = []\n", " for s in range(len(self.input_ids[index])):\n", " e = self.input_ids[index][s]\n", " a = self.attention_masks[index][s]\n", " embedding.append(e.unsqueeze(-1))\n", " att.append(a.unsqueeze(-1))\n", "\n", " tensor_embeddings = torch.cat(embedding, dim=-1)\n", " attention_mask = torch.cat(att, dim=-1)\n", " else: # train phase\n", " choice_sent = np.random.choice(len(self.input_ids[index]))\n", " tensor_embeddings = self.input_ids[index][choice_sent]\n", " attention_mask = self.attention_masks[index][choice_sent]\n", "\n", " # print(\"object id: \", this_ref_id)\n", " # print(\"sentence ids: \", self.input_ids[index])\n", " # for i in range(len(self.input_ids[index])):\n", " # print(\"object sentences: \", self.tokenizer.decode(self.input_ids[index][i].squeeze(0).tolist()))\n", " # # plot selected refid\n", " # self._plot(img, target)\n", "\n", " pos_sent, neg_sent = None, None\n", " pos_attn_mask, neg_attn_mask = None, None\n", " pos_mask = [[1, ]] # (GT, pos) 초기화\n", " neg_mask = [[0, ]] # (GT, neg) 초기화\n", "\n", " if self.metric_learning:\n", " if self.metric_mode in ['hardpos_only', 'hardpos_only_rev'] or self.hardneg_prob == 0.0:\n", " pos_sent_dict = self.hardpos_meta.get(str(this_ref_id), {})\n", " pos_sents = []\n", " for sent_list in pos_sent_dict.values():\n", " pos_sents.extend(sent_list)\n", " if pos_sents:\n", " pos_sent = random.choice(pos_sents)\n", " pos_sent, pos_attn_mask = self._tokenize(pos_sent)\n", " else:\n", " if random.random() < self.hardneg_prob:\n", " neg_sent_dict = self.hardneg_meta.get(str(this_ref_id), {})\n", " neg_sents = []\n", " for sent_list in neg_sent_dict.values():\n", " neg_sents.extend(sent_list)\n", " if neg_sents:\n", " neg_sent = random.choice(neg_sents)\n", " neg_sent, neg_attn_mask = self._tokenize(neg_sent)\n", " else:\n", " pos_sent_dict = self.hardpos_meta.get(str(this_ref_id), {})\n", " pos_sents = []\n", " for sent_list in pos_sent_dict.values():\n", " pos_sents.extend(sent_list)\n", " if pos_sents:\n", " pos_sent = random.choice(pos_sents)\n", " #print(\"original pos sentence: \", pos_sent)\n", " pos_sent, pos_attn_mask = self._tokenize(pos_sent)\n", " if pos_sent is None and len(self.input_ids[index]) > 1:\n", " to_select = list(range(len(self.input_ids[index])))\n", " to_select.remove(choice_sent)\n", " choice_sent = np.random.choice(to_select)\n", " pos_sent = self.input_ids[index][choice_sent]\n", " pos_attn_mask = self.attention_masks[index][choice_sent]\n", " #print(\"pos sent does not exist, use other sentence : \", self.tokenizer.decode(pos_sent.squeeze(0).tolist()))\n", "\n", " # concat tensors\n", " if img.dim() == 3:\n", " img = img.unsqueeze(0) # [1, C, H, W]\n", " if target.dim() == 2:\n", " target = target.unsqueeze(0) # [1, H, W]\n", " if tensor_embeddings.dim() == 1:\n", " tensor_embeddings = tensor_embeddings.unsqueeze(0) # [1, max_tokens]\n", " if attention_mask.dim() == 1:\n", " attention_mask = attention_mask.unsqueeze(0) # [1, max_tokens]\n", " if pos_sent is not None and pos_sent.dim() == 1:\n", " pos_sent = pos_sent.unsqueeze(0)\n", " if neg_sent is not None and neg_sent.dim() == 1:\n", " neg_sent = neg_sent.unsqueeze(0)\n", " if pos_attn_mask is not None and pos_attn_mask.dim() == 1:\n", " pos_attn_mask = pos_attn_mask.unsqueeze(0)\n", " if neg_attn_mask is not None and neg_attn_mask.dim() == 1:\n", " neg_attn_mask = neg_attn_mask.unsqueeze(0)\n", "\n", "\n", " # print(\"index: \", self.input_ids[index])\n", " # print(\"choice_sent: \", choice_sent)\n", " # print(\"tensor_embeddings: \", tensor_embeddings)\n", " # print(\"original sentence: \", self.tokenizer.decode(tensor_embeddings.squeeze(0).tolist()))\n", " # print(\"pos_sent: \", pos_sent)\n", " # print(\"neg_sent: \", neg_sent)\n", " # print(\"pos_attn_mask: \", pos_attn_mask)\n", " # print(\"neg_attn_mask: \", neg_attn_mask)\n", " # print(img.shape, target.shape, tensor_embeddings.shape, attention_mask.shape, pos_mask, neg_mask)\n", "\n", " if (pos_sent is not None) and (neg_sent is not None):\n", " img = torch.stack([img, img, img], dim=0)\n", " target = torch.stack([target, target, target], dim=0)\n", " tensor_embeddings = torch.stack([tensor_embeddings, pos_sent, neg_sent], dim=0)\n", " attention_mask = torch.stack([attention_mask, pos_attn_mask, neg_attn_mask], dim=0)\n", " pos_mask = [[1, 1, 0]]\n", " neg_mask = [[0, 0, 1]]\n", " elif (pos_sent is not None and not neg_sent) or (neg_sent is not None and not pos_sent):\n", " img = torch.stack([img, img], dim=0)\n", " target = torch.stack([target, target], dim=0)\n", " tensor_embeddings = torch.stack([tensor_embeddings, pos_sent], dim=0) if (pos_sent is not None) \\\n", " else torch.stack([tensor_embeddings, neg_sent], dim=0)\n", " attention_mask = torch.stack([attention_mask, pos_attn_mask], dim=0) if (pos_attn_mask is not None) \\\n", " else torch.stack([attention_mask, neg_attn_mask], dim=0)\n", " pos_mask = [[1, int(pos_sent is not None)]]\n", " neg_mask = [[0, int(neg_sent is not None)]]\n", " else:\n", " pass\n", " return img, target, tensor_embeddings, attention_mask, pos_mask, neg_mask\n" ] }, { "cell_type": "code", "execution_count": 108, "metadata": {}, "outputs": [], "source": [ "def get_dataset(image_set, transform, args):\n", " #from data.dataset_refer_bert import ReferDataset\n", " ds = ReferDataset(args,\n", " split=image_set,\n", " image_transforms=transform,\n", " target_transforms=None\n", " )\n", " num_classes = 2\n", "\n", " return ds, num_classes\n", "\n", "def get_transform(args):\n", " transforms = [T.Resize(args.img_size, args.img_size),\n", " T.ToTensor(),\n", " T.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])\n", " ]\n", "\n", " return T.Compose(transforms)\n", "\n", "\n", "def criterion(input, target):\n", " weight = torch.FloatTensor([0.9, 1.1]).cuda()\n", " return nn.functional.cross_entropy(input, target, weight=weight)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "loading dataset refcocog into memory...\n", "Split by umd!\n", "creating index...\n", "index created.\n", "DONE (t=6.64s)\n" ] } ], "source": [ "dataset, num_classes = get_dataset(\"train\",\n", " get_transform(args=args),\n", " args=args)\n", "train_sampler = torch.utils.data.distributed.DistributedSampler(dataset, num_replicas=1, rank=0,\n", " shuffle=True)\n" ] }, { "cell_type": "code", "execution_count": 118, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/seunghoon/.conda/envs/lavt/lib/python3.9/site-packages/torchvision/transforms/functional.py:417: UserWarning: Argument 'interpolation' of type int is deprecated since 0.13 and will be removed in 0.15. Please use InterpolationMode enum.\n", " warnings.warn(\n", "/home/seunghoon/.conda/envs/lavt/lib/python3.9/site-packages/torchvision/transforms/functional.py:417: UserWarning: Argument 'interpolation' of type int is deprecated since 0.13 and will be removed in 0.15. Please use InterpolationMode enum.\n", " warnings.warn(\n", "/home/seunghoon/.conda/envs/lavt/lib/python3.9/site-packages/torchvision/transforms/functional.py:417: UserWarning: Argument 'interpolation' of type int is deprecated since 0.13 and will be removed in 0.15. Please use InterpolationMode enum.\n", " warnings.warn(\n", "/home/seunghoon/.conda/envs/lavt/lib/python3.9/site-packages/torchvision/transforms/functional.py:417: UserWarning: Argument 'interpolation' of type int is deprecated since 0.13 and will be removed in 0.15. Please use InterpolationMode enum.\n", " warnings.warn(\n", "/home/seunghoon/.conda/envs/lavt/lib/python3.9/site-packages/torchvision/transforms/functional.py:417: UserWarning: Argument 'interpolation' of type int is deprecated since 0.13 and will be removed in 0.15. Please use InterpolationMode enum.\n", " warnings.warn(\n", "/home/seunghoon/.conda/envs/lavt/lib/python3.9/site-packages/torchvision/transforms/functional.py:417: UserWarning: Argument 'interpolation' of type int is deprecated since 0.13 and will be removed in 0.15. Please use InterpolationMode enum.\n", " warnings.warn(\n", "/home/seunghoon/.conda/envs/lavt/lib/python3.9/site-packages/torchvision/transforms/functional.py:417: UserWarning: Argument 'interpolation' of type int is deprecated since 0.13 and will be removed in 0.15. Please use InterpolationMode enum.\n", " warnings.warn(\n", "/home/seunghoon/.conda/envs/lavt/lib/python3.9/site-packages/torchvision/transforms/functional.py:417: UserWarning: Argument 'interpolation' of type int is deprecated since 0.13 and will be removed in 0.15. Please use InterpolationMode enum.\n", " warnings.warn(\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "torch.Size([2, 1, 20])\n", "torch.Size([2, 1, 20])\n", "torch.Size([2, 1, 20])\n", "torch.Size([2, 1, 20])torch.Size([2, 1, 20])torch.Size([2, 1, 20])torch.Size([3, 1, 20])\n", "\n", "\n", "\n", "torch.Size([2, 1, 20])torch.Size([2, 1, 20])torch.Size([2, 1, 20])torch.Size([3, 1, 20])torch.Size([2, 1, 20])\n", "\n", "\n", "\n", "\n", "torch.Size([1, 20])torch.Size([3, 1, 20])torch.Size([2, 1, 20])torch.Size([2, 1, 20])torch.Size([2, 1, 20])\n", "\n", "\n", "\n", "torch.Size([3, 1, 20])\n", "torch.Size([2, 1, 20])torch.Size([1, 20])torch.Size([2, 1, 20])torch.Size([1, 20])\n", "torch.Size([2, 1, 20])\n", "\n", "\n", "\n", "torch.Size([2, 1, 20])torch.Size([2, 1, 20])\n", "torch.Size([2, 1, 20])torch.Size([2, 1, 20])torch.Size([3, 1, 20])torch.Size([1, 20])\n", "\n", "torch.Size([3, 1, 20])\n", "\n", "\n", "\n", "torch.Size([2, 1, 20])\n", "torch.Size([2, 1, 20])torch.Size([2, 1, 20])torch.Size([2, 1, 20])torch.Size([2, 1, 20])\n", "torch.Size([2, 1, 20])\n", "\n", "\n", "\n", "torch.Size([2, 1, 20])torch.Size([3, 1, 20])\n", "torch.Size([2, 1, 20])torch.Size([2, 1, 20])torch.Size([2, 1, 20])torch.Size([2, 1, 20])\n", "\n", "torch.Size([2, 1, 20])\n", "\n", "\n", "torch.Size([2, 1, 20])\n", "torch.Size([2, 1, 20])\n", "torch.Size([2, 1, 20])torch.Size([2, 1, 20])\n", "torch.Size([2, 1, 20])torch.Size([2, 1, 20])\n", "torch.Size([2, 1, 20])\n", "\n", "torch.Size([2, 1, 20])\n", "\n", "torch.Size([2, 1, 20])\n", "\n", "torch.Size([3, 1, 20])\n", "torch.Size([2, 1, 20])torch.Size([3, 1, 20])\n", "torch.Size([3, 1, 20])\n", "\n", "torch.Size([3, 1, 20])\n", "torch.Size([2, 1, 20])\n", "torch.Size([2, 1, 20])\n", "torch.Size([3, 1, 20])\n", "\n", "torch.Size([2, 1, 20])\n", "torch.Size([2, 1, 20])torch.Size([2, 1, 20])\n", "\n", "torch.Size([2, 1, 20])\n" ] }, { "ename": "TypeError", "evalue": "Caught TypeError in DataLoader worker process 0.\nOriginal Traceback (most recent call last):\n File \"/home/seunghoon/.conda/envs/lavt/lib/python3.9/site-packages/torch/utils/data/_utils/worker.py\", line 302, in _worker_loop\n data = fetcher.fetch(index)\n File \"/home/seunghoon/.conda/envs/lavt/lib/python3.9/site-packages/torch/utils/data/_utils/fetch.py\", line 52, in fetch\n return self.collate_fn(data)\n File \"/tmp/ipykernel_2235050/518736739.py\", line 10, in custom_collate\n tensor_embeddings = torch.cat(*tensor_embeddings, dim=0)\nTypeError: cat() received an invalid combination of arguments - got (Tensor, Tensor, Tensor, Tensor, Tensor, Tensor, Tensor, Tensor, dim=int), but expected one of:\n * (tuple of Tensors tensors, int dim, *, Tensor out)\n * (tuple of Tensors tensors, name dim, *, Tensor out)\n\n", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", "Cell \u001b[0;32mIn[118], line 36\u001b[0m\n\u001b[1;32m 30\u001b[0m data_loader \u001b[38;5;241m=\u001b[39m torch\u001b[38;5;241m.\u001b[39mutils\u001b[38;5;241m.\u001b[39mdata\u001b[38;5;241m.\u001b[39mDataLoader(\n\u001b[1;32m 31\u001b[0m dataset, batch_size\u001b[38;5;241m=\u001b[39margs\u001b[38;5;241m.\u001b[39mbatch_size,\n\u001b[1;32m 32\u001b[0m sampler\u001b[38;5;241m=\u001b[39mtrain_sampler, num_workers\u001b[38;5;241m=\u001b[39margs\u001b[38;5;241m.\u001b[39mworkers, \n\u001b[1;32m 33\u001b[0m collate_fn\u001b[38;5;241m=\u001b[39mcustom_collate, pin_memory\u001b[38;5;241m=\u001b[39margs\u001b[38;5;241m.\u001b[39mpin_mem, drop_last\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n\u001b[1;32m 35\u001b[0m \u001b[38;5;66;03m# single sample from dataloader\u001b[39;00m\n\u001b[0;32m---> 36\u001b[0m img, target, tensor_embeddings, attention_mask, pos_mask, neg_mask \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mnext\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;28;43miter\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mdata_loader\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 38\u001b[0m \u001b[38;5;28mprint\u001b[39m(img\u001b[38;5;241m.\u001b[39mshape, target\u001b[38;5;241m.\u001b[39mshape, tensor_embeddings\u001b[38;5;241m.\u001b[39mshape, attention_mask\u001b[38;5;241m.\u001b[39mshape, pos_mask, neg_mask)\n", "File \u001b[0;32m~/.conda/envs/lavt/lib/python3.9/site-packages/torch/utils/data/dataloader.py:652\u001b[0m, in \u001b[0;36m_BaseDataLoaderIter.__next__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 649\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_sampler_iter \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 650\u001b[0m \u001b[38;5;66;03m# TODO(https://github.com/pytorch/pytorch/issues/76750)\u001b[39;00m\n\u001b[1;32m 651\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_reset() \u001b[38;5;66;03m# type: ignore[call-arg]\u001b[39;00m\n\u001b[0;32m--> 652\u001b[0m data \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_next_data\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 653\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_num_yielded \u001b[38;5;241m+\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;241m1\u001b[39m\n\u001b[1;32m 654\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_dataset_kind \u001b[38;5;241m==\u001b[39m _DatasetKind\u001b[38;5;241m.\u001b[39mIterable \u001b[38;5;129;01mand\u001b[39;00m \\\n\u001b[1;32m 655\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_IterableDataset_len_called \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mand\u001b[39;00m \\\n\u001b[1;32m 656\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_num_yielded \u001b[38;5;241m>\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_IterableDataset_len_called:\n", "File \u001b[0;32m~/.conda/envs/lavt/lib/python3.9/site-packages/torch/utils/data/dataloader.py:1347\u001b[0m, in \u001b[0;36m_MultiProcessingDataLoaderIter._next_data\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 1345\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 1346\u001b[0m \u001b[38;5;28;01mdel\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_task_info[idx]\n\u001b[0;32m-> 1347\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_process_data\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdata\u001b[49m\u001b[43m)\u001b[49m\n", "File \u001b[0;32m~/.conda/envs/lavt/lib/python3.9/site-packages/torch/utils/data/dataloader.py:1373\u001b[0m, in \u001b[0;36m_MultiProcessingDataLoaderIter._process_data\u001b[0;34m(self, data)\u001b[0m\n\u001b[1;32m 1371\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_try_put_index()\n\u001b[1;32m 1372\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(data, ExceptionWrapper):\n\u001b[0;32m-> 1373\u001b[0m \u001b[43mdata\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mreraise\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1374\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m data\n", "File \u001b[0;32m~/.conda/envs/lavt/lib/python3.9/site-packages/torch/_utils.py:461\u001b[0m, in \u001b[0;36mExceptionWrapper.reraise\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 457\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m:\n\u001b[1;32m 458\u001b[0m \u001b[38;5;66;03m# If the exception takes multiple arguments, don't try to\u001b[39;00m\n\u001b[1;32m 459\u001b[0m \u001b[38;5;66;03m# instantiate since we don't know how to\u001b[39;00m\n\u001b[1;32m 460\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mRuntimeError\u001b[39;00m(msg) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m--> 461\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m exception\n", "\u001b[0;31mTypeError\u001b[0m: Caught TypeError in DataLoader worker process 0.\nOriginal Traceback (most recent call last):\n File \"/home/seunghoon/.conda/envs/lavt/lib/python3.9/site-packages/torch/utils/data/_utils/worker.py\", line 302, in _worker_loop\n data = fetcher.fetch(index)\n File \"/home/seunghoon/.conda/envs/lavt/lib/python3.9/site-packages/torch/utils/data/_utils/fetch.py\", line 52, in fetch\n return self.collate_fn(data)\n File \"/tmp/ipykernel_2235050/518736739.py\", line 10, in custom_collate\n tensor_embeddings = torch.cat(*tensor_embeddings, dim=0)\nTypeError: cat() received an invalid combination of arguments - got (Tensor, Tensor, Tensor, Tensor, Tensor, Tensor, Tensor, Tensor, dim=int), but expected one of:\n * (tuple of Tensors tensors, int dim, *, Tensor out)\n * (tuple of Tensors tensors, name dim, *, Tensor out)\n\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "torch.Size([2, 1, 20])\n", "torch.Size([3, 1, 20])torch.Size([2, 1, 20])\n", "torch.Size([2, 1, 20])\n", "\n", "torch.Size([2, 1, 20])torch.Size([3, 1, 20])\n", "\n", "torch.Size([2, 1, 20])torch.Size([3, 1, 20])\n", "\n", "torch.Size([3, 1, 20])torch.Size([3, 1, 20])\n", "\n", "torch.Size([2, 1, 20])torch.Size([2, 1, 20])\n", "\n", "torch.Size([2, 1, 20])torch.Size([2, 1, 20])\n", "torch.Size([2, 1, 20])\n", "torch.Size([3, 1, 20])\n", "torch.Size([2, 1, 20])\n", "torch.Size([2, 1, 20])\n", "torch.Size([3, 1, 20])\n", "\n", "torch.Size([3, 1, 20])torch.Size([2, 1, 20])\n", "\n", "torch.Size([2, 1, 20])torch.Size([2, 1, 20])\n", "\n", "torch.Size([2, 1, 20])torch.Size([2, 1, 20])\n", "\n", "torch.Size([3, 1, 20])torch.Size([3, 1, 20])\n", "\n", "torch.Size([2, 1, 20])torch.Size([2, 1, 20])\n", "\n", "torch.Size([2, 1, 20])torch.Size([2, 1, 20])\n", "\n", "torch.Size([2, 1, 20])\n", "torch.Size([2, 1, 20])\n", "torch.Size([2, 1, 20])\n", "torch.Size([2, 1, 20])\n", "torch.Size([2, 1, 20])\n", "torch.Size([2, 1, 20])\n", "torch.Size([2, 1, 20])\n", "torch.Size([3, 1, 20])\n", "torch.Size([3, 1, 20])\n", "torch.Size([3, 1, 20])\n", "torch.Size([3, 1, 20])\n", "torch.Size([1, 20])\n", "torch.Size([3, 1, 20])\n", "torch.Size([3, 1, 20])\n", "torch.Size([2, 1, 20])torch.Size([2, 1, 20])\n", "\n", "torch.Size([2, 1, 20])torch.Size([2, 1, 20])\n", "\n", "torch.Size([2, 1, 20])torch.Size([2, 1, 20])\n", "\n", "torch.Size([2, 1, 20])\n", "torch.Size([2, 1, 20])\n", "torch.Size([3, 1, 20])\n", "torch.Size([3, 1, 20])\n", "torch.Size([2, 1, 20])\n", "torch.Size([2, 1, 20])\n", "torch.Size([3, 1, 20])\n", "torch.Size([3, 1, 20])\n", "torch.Size([2, 1, 20])\n", "torch.Size([2, 1, 20])\n", "torch.Size([3, 1, 20])\n", "torch.Size([3, 1, 20])\n", "torch.Size([3, 1, 20])\n", "torch.Size([3, 1, 20])\n", "torch.Size([2, 1, 20])\n", "torch.Size([2, 1, 20])\n", "torch.Size([2, 1, 20])\n", "torch.Size([2, 1, 20])\n", "torch.Size([1, 20])\n", "torch.Size([2, 1, 20])\n", "torch.Size([3, 1, 20])\n" ] } ], "source": [ "from torch.nn.utils.rnn import pad_sequence\n", "\n", "def custom_collate(batch):\n", " imgs, targets, tensor_embeddings, attention_masks, pos_masks, neg_masks = zip(*batch)\n", " imgs = torch.cat([img for img in imgs], dim=0)\n", " targets = torch.cat([tgt for tgt in targets], dim=0)\n", " \n", " tensor_embeddings = torch.cat([t_e for t_e in tensor_embeddings], dim=0)\n", " attention_masks = torch.cat([a_m for a_m in attention_masks], dim=0)\n", "\n", " # Handle pos_masks\n", " if any(pos_mask is not None for pos_mask in pos_masks):\n", " pos_masks = [mask if mask is not None else torch.zeros_like(tensor_embeddings[0]) for mask in pos_masks]\n", " pos_masks = pad_sequence(pos_masks, batch_first=True, padding_value=0)\n", " else:\n", " pos_masks = None\n", "\n", " # Handle neg_masks\n", " if any(neg_mask is not None for neg_mask in neg_masks):\n", " neg_masks = [mask if mask is not None else torch.zeros_like(tensor_embeddings[0]) for mask in neg_masks]\n", " neg_masks = pad_sequence(neg_masks, batch_first=True, padding_value=0)\n", " else:\n", " neg_masks = None\n", "\n", " return imgs, targets, tensor_embeddings, attention_masks, pos_masks, neg_masks\n", "\n", "\n", "data_loader = torch.utils.data.DataLoader(\n", " dataset, batch_size=args.batch_size,\n", " sampler=train_sampler, num_workers=args.workers, \n", " collate_fn=custom_collate, pin_memory=args.pin_mem, drop_last=True)\n", "\n", "# single sample from dataloader\n", "img, target, tensor_embeddings, attention_mask, pos_mask, neg_mask = next(iter(data_loader))\n", "\n", "print(img.shape, target.shape, tensor_embeddings.shape, attention_mask.shape, pos_mask, neg_mask)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[{'image_id': 391435, 'split': 'train', 'sentences': [{'tokens': ['the', 'reflection', 'of', 'the', 'man', 'shaving'], 'raw': 'the reflection of the man shaving', 'sent_id': 13437, 'sent': 'the reflection of the man shaving'}, {'tokens': ['image', 'of', 'a', 'man', 'shaving', 'on', 'a', 'laptop', 'screen'], 'raw': 'image of a man shaving on a laptop screen', 'sent_id': 13438, 'sent': 'image of a man shaving on a laptop screen'}], 'file_name': 'COCO_train2014_000000391435_1709050.jpg', 'category_id': 1, 'ann_id': 1709050, 'sent_ids': [13437, 13438], 'ref_id': 45871}][{'image_id': 421848, 'split': 'train', 'sentences': [{'tokens': ['the', 'tallest', 'giraffe', 'among', 'the', 'two'], 'raw': 'The tallest giraffe among the two', 'sent_id': 82708, 'sent': 'the tallest giraffe among the two'}, {'tokens': ['the', 'tallest', 'of', 'two', 'giraffes'], 'raw': 'The tallest of two giraffes.', 'sent_id': 82709, 'sent': 'the tallest of two giraffes'}], 'file_name': 'COCO_train2014_000000421848_596471.jpg', 'category_id': 25, 'ann_id': 596471, 'sent_ids': [82708, 82709], 'ref_id': 36770}]\n", "[{'image_id': 13468, 'split': 'train', 'sentences': [{'tokens': ['a', 'sandwich', 'right', 'of', 'another'], 'raw': 'A sandwich right of another.', 'sent_id': 5866, 'sent': 'a sandwich right of another'}, {'tokens': ['sandwich', 'half', 'furthest', 'to', 'right'], 'raw': 'sandwich half furthest to right', 'sent_id': 5867, 'sent': 'sandwich half furthest to right'}], 'file_name': 'COCO_train2014_000000013468_310040.jpg', 'category_id': 54, 'ann_id': 310040, 'sent_ids': [5866, 5867], 'ref_id': 7280}][{'image_id': 181054, 'split': 'train', 'sentences': [{'tokens': ['a', 'man', 'in', 'a', 'white', 'shirt', 'with', 'a', 'woman', 'buttoning', 'it', 'up'], 'raw': 'A man in a white shirt with a woman buttoning it up.', 'sent_id': 68075, 'sent': 'a man in a white shirt with a woman buttoning it up'}, {'tokens': ['a', 'man', 'in', 'a', 'white', 'shirt', 'looks', 'nervous', 'as', 'an', 'older', 'woman', 'buttons', 'him', 'up'], 'raw': 'A man in a white shirt looks nervous as an older woman buttons him up.', 'sent_id': 68076, 'sent': 'a man in a white shirt looks nervous as an older woman buttons him up'}], 'file_name': 'COCO_train2014_000000181054_484268.jpg', 'category_id': 1, 'ann_id': 484268, 'sent_ids': [68075, 68076], 'ref_id': 48236}]\n", "\n", "\n", "[{'image_id': 569919, 'split': 'train', 'sentences': [{'tokens': ['the', 'spoon', 'next', 'to', 'the', 'pizza'], 'raw': 'The spoon next to the pizza.', 'sent_id': 97107, 'sent': 'the spoon next to the pizza'}, {'tokens': ['a', 'metal', 'spoon', 'on', 'a', 'plate', 'on', 'a', 'table'], 'raw': 'A metal spoon on a plate on a table.', 'sent_id': 97108, 'sent': 'a metal spoon on a plate on a table'}], 'file_name': 'COCO_train2014_000000569919_703521.jpg', 'category_id': 50, 'ann_id': 703521, 'sent_ids': [97107, 97108], 'ref_id': 42368}][{'image_id': 129359, 'split': 'train', 'sentences': [{'tokens': ['a', 'white', 'dish', 'with', 'some', 'kind', 'of', 'sauce', 'in', 'it', 'along', 'with', 'a', 'silver', 'spoon'], 'raw': 'A white dish with some kind of sauce in it along with a silver spoon', 'sent_id': 97230, 'sent': 'a white dish with some kind of sauce in it along with a silver spoon'}, {'tokens': ['a', 'cup', 'of', 'food', 'with', 'a', 'spoon'], 'raw': 'A cup of food with a spoon.', 'sent_id': 97231, 'sent': 'a cup of food with a spoon'}], 'file_name': 'COCO_train2014_000000129359_1039869.jpg', 'category_id': 51, 'ann_id': 1039869, 'sent_ids': [97230, 97231], 'ref_id': 42420}][{'image_id': 2964, 'split': 'train', 'sentences': [{'tokens': ['bottle', 'of', '14', 'hands', 'wine'], 'raw': 'bottle of 14 Hands wine', 'sent_id': 44379, 'sent': 'bottle of 14 hands wine'}, {'tokens': ['a', 'bottle', 'of', 'wine', 'that', 'says', '14', 'hands', 'and', 'has', 'a', 'purple', 'horse', 'on', 'it'], 'raw': 'A bottle of wine that says 14 hands and has a purple horse on it.', 'sent_id': 44380, 'sent': 'a bottle of wine that says 14 hands and has a purple horse on it'}], 'file_name': 'COCO_train2014_000000002964_91245.jpg', 'category_id': 44, 'ann_id': 91245, 'sent_ids': [44379, 44380], 'ref_id': 22056}]\n", "\n", "\n", "[{'image_id': 330683, 'split': 'train', 'sentences': [{'tokens': ['a', 'black', 'cow', 'alongside', 'a', 'brown', 'cow'], 'raw': 'A black cow alongside a brown cow.', 'sent_id': 78006, 'sent': 'a black cow alongside a brown cow'}, {'tokens': ['a', 'black', 'cow', 'standing', 'between', 'another', 'black', 'cow', 'and', 'a', 'brown', 'cow'], 'raw': 'A black cow standing between another black cow and a brown cow', 'sent_id': 78007, 'sent': 'a black cow standing between another black cow and a brown cow'}], 'file_name': 'COCO_train2014_000000330683_76006.jpg', 'category_id': 21, 'ann_id': 76006, 'sent_ids': [78006, 78007], 'ref_id': 34980}]\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/home/seunghoon/.conda/envs/lavt/lib/python3.9/site-packages/torchvision/transforms/functional.py:417: UserWarning: Argument 'interpolation' of type int is deprecated since 0.13 and will be removed in 0.15. Please use InterpolationMode enum.\n", " warnings.warn(\n", "/home/seunghoon/.conda/envs/lavt/lib/python3.9/site-packages/torchvision/transforms/functional.py:417: UserWarning: Argument 'interpolation' of type int is deprecated since 0.13 and will be removed in 0.15. Please use InterpolationMode enum.\n", " warnings.warn(\n", "/home/seunghoon/.conda/envs/lavt/lib/python3.9/site-packages/torchvision/transforms/functional.py:417: UserWarning: Argument 'interpolation' of type int is deprecated since 0.13 and will be removed in 0.15. Please use InterpolationMode enum.\n", " warnings.warn(\n", "/home/seunghoon/.conda/envs/lavt/lib/python3.9/site-packages/torchvision/transforms/functional.py:417: UserWarning: Argument 'interpolation' of type int is deprecated since 0.13 and will be removed in 0.15. Please use InterpolationMode enum.\n", " warnings.warn(\n", "/home/seunghoon/.conda/envs/lavt/lib/python3.9/site-packages/torchvision/transforms/functional.py:417: UserWarning: Argument 'interpolation' of type int is deprecated since 0.13 and will be removed in 0.15. Please use InterpolationMode enum.\n", " warnings.warn(\n", "/home/seunghoon/.conda/envs/lavt/lib/python3.9/site-packages/torchvision/transforms/functional.py:417: UserWarning: Argument 'interpolation' of type int is deprecated since 0.13 and will be removed in 0.15. Please use InterpolationMode enum.\n", " warnings.warn(\n", "/home/seunghoon/.conda/envs/lavt/lib/python3.9/site-packages/torchvision/transforms/functional.py:417: UserWarning: Argument 'interpolation' of type int is deprecated since 0.13 and will be removed in 0.15. Please use InterpolationMode enum.\n", " warnings.warn(\n", "/home/seunghoon/.conda/envs/lavt/lib/python3.9/site-packages/torchvision/transforms/functional.py:417: UserWarning: Argument 'interpolation' of type int is deprecated since 0.13 and will be removed in 0.15. Please use InterpolationMode enum.\n", " warnings.warn(\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[{'image_id': 263823, 'split': 'train', 'sentences': [{'tokens': ['the', 'umpire', 'behind', 'the', 'plate'], 'raw': 'the umpire behind the plate', 'sent_id': 9335, 'sent': 'the umpire behind the plate'}, {'tokens': ['umpire', 'wearing', 'blue'], 'raw': 'umpire wearing blue', 'sent_id': 9336, 'sent': 'umpire wearing blue'}], 'file_name': 'COCO_train2014_000000263823_2160611.jpg', 'category_id': 1, 'ann_id': 2160611, 'sent_ids': [9335, 9336], 'ref_id': 8614}]\n", "[{'image_id': 170366, 'split': 'train', 'sentences': [{'tokens': ['the', 'boy', 'in', 'the', 'suit'], 'raw': 'The boy in the suit.', 'sent_id': 96474, 'sent': 'the boy in the suit'}, {'tokens': ['a', 'young', 'man', 'with', 'brown', 'hair', 'in', 'a', 'black', 'suit', ',', 'with', 'a', 'black', 'hat', 'with', 'sunglasses', 'resting', 'on', 'it'], 'raw': 'A young man with brown hair in a black suit, with a black hat with sunglasses resting on it', 'sent_id': 96475, 'sent': 'a young man with brown hair in a black suit , with a black hat with sunglasses resting on it'}], 'file_name': 'COCO_train2014_000000170366_484717.jpg', 'category_id': 1, 'ann_id': 484717, 'sent_ids': [96474, 96475], 'ref_id': 42104}][{'image_id': 181316, 'split': 'train', 'sentences': [{'tokens': ['the', 'racket', 'held', 'by', 'a', 'girl', 'wearing', 'dark', 'skirt'], 'raw': 'The racket held by a girl wearing dark skirt.', 'sent_id': 14001, 'sent': 'the racket held by a girl wearing dark skirt'}, {'tokens': ['a', 'racket', 'being', 'held', 'by', 'the', 'girl', 'in', 'the', 'black', 'skirt'], 'raw': 'A racket being held by the girl in the black skirt.', 'sent_id': 14002, 'sent': 'a racket being held by the girl in the black skirt'}], 'file_name': 'COCO_train2014_000000181316_655443.jpg', 'category_id': 43, 'ann_id': 655443, 'sent_ids': [14001, 14002], 'ref_id': 45890}]\n", "\n", "[{'image_id': 96723, 'split': 'train', 'sentences': [{'tokens': ['a', 'number', 'of', 'books', 'on', 'a', 'shelf'], 'raw': 'A number of books on a shelf.', 'sent_id': 35543, 'sent': 'a number of books on a shelf'}, {'tokens': ['a', 'bunch', 'of', 'books', 'on', 'a', 'shelf'], 'raw': 'A bunch of books on a shelf.', 'sent_id': 35544, 'sent': 'a bunch of books on a shelf'}], 'file_name': 'COCO_train2014_000000096723_1139765.jpg', 'category_id': 84, 'ann_id': 1139765, 'sent_ids': [35543, 35544], 'ref_id': 18668}]\n", "[{'image_id': 273951, 'split': 'train', 'sentences': [{'tokens': ['a', 'white', 'woman', 'skier', 'with', 'a', 'colorful', 'hat', 'sitting', 'between', 'two', 'men', 'skiers'], 'raw': 'A white woman skier with a colorful hat sitting between two men skiers.', 'sent_id': 34676, 'sent': 'a white woman skier with a colorful hat sitting between two men skiers'}, {'tokens': ['a', 'blonde', 'woman', 'in', 'red'], 'raw': 'A blonde woman in red', 'sent_id': 34677, 'sent': 'a blonde woman in red'}], 'file_name': 'COCO_train2014_000000273951_509586.jpg', 'category_id': 1, 'ann_id': 509586, 'sent_ids': [34676, 34677], 'ref_id': 18328}][{'image_id': 387527, 'split': 'train', 'sentences': [{'tokens': ['a', 'banana', 'to', 'the', 'far', 'left', 'of', 'the', 'fruit', 'bowl'], 'raw': 'A banana to the far left of the fruit bowl.', 'sent_id': 65272, 'sent': 'a banana to the far left of the fruit bowl'}, {'tokens': ['the', 'farthest', 'banana', 'away', 'from', 'the', 'camera'], 'raw': 'The farthest banana away from the camera.', 'sent_id': 65273, 'sent': 'the farthest banana away from the camera'}], 'file_name': 'COCO_train2014_000000387527_1043422.jpg', 'category_id': 52, 'ann_id': 1043422, 'sent_ids': [65272, 65273], 'ref_id': 30094}][{'image_id': 103510, 'split': 'train', 'sentences': [{'tokens': ['the', 'carrots'], 'raw': 'the carrots', 'sent_id': 63484, 'sent': 'the carrots'}, {'tokens': ['a', 'group', 'of', 'fresh', 'baby', 'carrots'], 'raw': 'A group of fresh baby carrots.', 'sent_id': 63485, 'sent': 'a group of fresh baby carrots'}], 'file_name': 'COCO_train2014_000000103510_1063832.jpg', 'category_id': 57, 'ann_id': 1063832, 'sent_ids': [63484, 63485], 'ref_id': 29390}]\n", "\n", "\n", "[{'image_id': 427633, 'split': 'train', 'sentences': [{'tokens': ['the', 'back', 'side', 'of', 'a', 'multi', 'light', 'traffic', 'light'], 'raw': 'The back side of a multi light traffic light.', 'sent_id': 52260, 'sent': 'the back side of a multi light traffic light'}, {'tokens': ['a', 'stoplight', 'faces', 'to', 'the', 'right'], 'raw': 'A stoplight faces to the right.', 'sent_id': 52261, 'sent': 'a stoplight faces to the right'}], 'file_name': 'COCO_train2014_000000427633_2172860.jpg', 'category_id': 10, 'ann_id': 2172860, 'sent_ids': [52260, 52261], 'ref_id': 25098}]\n", "[{'image_id': 350083, 'split': 'train', 'sentences': [{'tokens': ['giraffe', 'to', 'left', 'of', 'other'], 'raw': 'giraffe to left of other', 'sent_id': 33055, 'sent': 'giraffe to left of other'}, {'tokens': ['the', 'slightly', 'shorter', 'giraffe'], 'raw': 'the slightly shorter giraffe', 'sent_id': 33056, 'sent': 'the slightly shorter giraffe'}], 'file_name': 'COCO_train2014_000000350083_599600.jpg', 'category_id': 25, 'ann_id': 599600, 'sent_ids': [33055, 33056], 'ref_id': 46695}]\n", "[{'image_id': 287519, 'split': 'train', 'sentences': [{'tokens': ['a', 'man', 'with', 'cream', '&', 'black', 'colored', 'shirt', 'and', 'short', 'trousers', 'walking', 'behind', 'a', 'police', 'man'], 'raw': 'a man with cream & black colored shirt and short trousers walking behind a police man', 'sent_id': 99833, 'sent': 'a man with cream & black colored shirt and short trousers walking behind a police man'}, {'tokens': ['a', 'guy', 'wearing', 'a', 'short', 'sleeve', 'shirt', 'with', 'an', 'interesting', 'design'], 'raw': 'a guy wearing a short sleeve shirt with an interesting design', 'sent_id': 99834, 'sent': 'a guy wearing a short sleeve shirt with an interesting design'}], 'file_name': 'COCO_train2014_000000287519_2206490.jpg', 'category_id': 1, 'ann_id': 2206490, 'sent_ids': [99833, 99834], 'ref_id': 43469}]\n", "[{'image_id': 54141, 'split': 'train', 'sentences': [{'tokens': ['a', 'speed', 'boat', 'on', 'a', 'lake'], 'raw': 'A speed boat on a lake.', 'sent_id': 67100, 'sent': 'a speed boat on a lake'}, {'tokens': ['a', 'speedboat', 'pulling', 'a', 'wake', 'boarder', 'behind', 'it'], 'raw': 'A speedboat pulling a wake boarder behind it', 'sent_id': 67101, 'sent': 'a speedboat pulling a wake boarder behind it'}], 'file_name': 'COCO_train2014_000000054141_180852.jpg', 'category_id': 9, 'ann_id': 180852, 'sent_ids': [67100, 67101], 'ref_id': 48196}]\n", "[{'image_id': 156296, 'split': 'train', 'sentences': [{'tokens': ['a', 'woman', 'in', 'rain', 'boots', 'trying', 'to', 'fix', 'her', 'umbrella'], 'raw': 'A woman in rain boots trying to fix her umbrella.', 'sent_id': 9312, 'sent': 'a woman in rain boots trying to fix her umbrella'}, {'tokens': ['the', 'woman', 'with', 'the', 'black', 'umbrella'], 'raw': 'The woman with the black umbrella.', 'sent_id': 9313, 'sent': 'the woman with the black umbrella'}], 'file_name': 'COCO_train2014_000000156296_518143.jpg', 'category_id': 1, 'ann_id': 518143, 'sent_ids': [9312, 9313], 'ref_id': 8608}][{'image_id': 402212, 'split': 'train', 'sentences': [{'tokens': ['a', 'colorful', 'toy', 'van', 'in', 'the', 'street'], 'raw': 'a colorful toy van in the street', 'sent_id': 14596, 'sent': 'a colorful toy van in the street'}, {'tokens': ['colorful', 'truck'], 'raw': 'Colorful truck.', 'sent_id': 14597, 'sent': 'colorful truck'}], 'file_name': 'COCO_train2014_000000402212_396551.jpg', 'category_id': 8, 'ann_id': 396551, 'sent_ids': [14596, 14597], 'ref_id': 45911}]\n", "[{'image_id': 521796, 'split': 'train', 'sentences': [{'tokens': ['shelf', 'in', 'camper'], 'raw': 'Shelf in camper.', 'sent_id': 70798, 'sent': 'shelf in camper'}], 'file_name': 'COCO_train2014_000000521796_1978969.jpg', 'category_id': 78, 'ann_id': 1978969, 'sent_ids': [70798], 'ref_id': 48359}]\n", "[{'image_id': 136953, 'split': 'train', 'sentences': [{'tokens': ['a', 'man', 'wearing', 'a', 'striped', 'shirt', 'and', 'black', 'pants'], 'raw': 'A man wearing a striped shirt and black pants.', 'sent_id': 21168, 'sent': 'a man wearing a striped shirt and black pants'}, {'tokens': ['a', 'man', 'in', 'a', 'striped', 'shirt'], 'raw': 'A man in a striped shirt.', 'sent_id': 21169, 'sent': 'a man in a striped shirt'}], 'file_name': 'COCO_train2014_000000136953_530897.jpg', 'category_id': 1, 'ann_id': 530897, 'sent_ids': [21168, 21169], 'ref_id': 13173}]\n", "[{'image_id': 179209, 'split': 'train', 'sentences': [{'tokens': ['the', 'large', 'truck', 'in', 'the', 'very', 'back'], 'raw': 'the large truck in the very back', 'sent_id': 45782, 'sent': 'the large truck in the very back'}, {'tokens': ['large', 'multiwheeled', 'truck', 'behind', 'a', 'truck', 'full', 'of', 'bananas'], 'raw': 'Large multiwheeled truck behind a truck full of bananas.', 'sent_id': 45783, 'sent': 'large multiwheeled truck behind a truck full of bananas'}], 'file_name': 'COCO_train2014_000000179209_2054261.jpg', 'category_id': 8, 'ann_id': 2054261, 'sent_ids': [45782, 45783], 'ref_id': 22607}]\n", "\n", "[{'image_id': 175565, 'split': 'train', 'sentences': [{'tokens': ['the', 'couch', ',', 'a', 'lady', 'sitted', 'on', 'it'], 'raw': 'the couch, a lady sitted on it.', 'sent_id': 1112, 'sent': 'the couch , a lady sitted on it'}], 'file_name': 'COCO_train2014_000000175565_99716.jpg', 'category_id': 63, 'ann_id': 99716, 'sent_ids': [1112], 'ref_id': 5449}]\n", "[{'image_id': 168217, 'split': 'train', 'sentences': [{'tokens': ['brown', 'and', 'pink', 'teddy', 'bears'], 'raw': 'Brown and pink teddy bears.', 'sent_id': 4409, 'sent': 'brown and pink teddy bears'}, {'tokens': ['a', 'brown', 'teddy', 'bear', 'with', 'a', 'morose', 'expression', 'sits', 'in', 'front', 'of', 'a', 'pink', 'teddy', 'bear', 'with', 'an', 'identical', 'expression'], 'raw': 'A brown teddy bear with a morose expression sits in front of a pink teddy bear with an identical expression.', 'sent_id': 4410, 'sent': 'a brown teddy bear with a morose expression sits in front of a pink teddy bear with an identical expression'}], 'file_name': 'COCO_train2014_000000168217_1162820.jpg', 'category_id': 88, 'ann_id': 1162820, 'sent_ids': [4409, 4410], 'ref_id': 6702}]\n", "[{'image_id': 413164, 'split': 'train', 'sentences': [{'tokens': ['a', 'table', 'with', 'a', 'white', 'tablecloth', 'on', 'it'], 'raw': 'A table with a white tablecloth on it', 'sent_id': 19497, 'sent': 'a table with a white tablecloth on it'}], 'file_name': 'COCO_train2014_000000413164_1092064.jpg', 'category_id': 67, 'ann_id': 1092064, 'sent_ids': [19497], 'ref_id': 12539}]\n", "[{'image_id': 30387, 'split': 'train', 'sentences': [{'tokens': ['the', 'man', 'all', 'way', 'at', 'the', 'end', 'of', 'the', 'line', 'who', 'is', 'barely', 'visible'], 'raw': 'The man all way at the end of the line who is barely visible.', 'sent_id': 12240, 'sent': 'the man all way at the end of the line who is barely visible'}, {'tokens': ['a', 'man', 'who', 'is', 'mostly', 'covered', 'up', 'by', 'the', 'arms', 'of', 'another', 'man'], 'raw': 'A man who is mostly covered up by the arms of another man.', 'sent_id': 12241, 'sent': 'a man who is mostly covered up by the arms of another man'}], 'file_name': 'COCO_train2014_000000030387_1706152.jpg', 'category_id': 1, 'ann_id': 1706152, 'sent_ids': [12240, 12241], 'ref_id': 9755}]\n", "[{'image_id': 347263, 'split': 'train', 'sentences': [{'tokens': ['woman', 'wearing', 'black', 'showing', 'someone', 'a', 'technique'], 'raw': 'Woman wearing black showing someone a technique', 'sent_id': 68299, 'sent': 'woman wearing black showing someone a technique'}, {'tokens': ['woman', 'with', 'sunglasses', 'on', 'her', 'head', 'is', 'cutting', 'a', 'roast', 'in', 'the', 'kitchen'], 'raw': 'woman with sunglasses on her head is cutting a roast in the kitchen', 'sent_id': 68300, 'sent': 'woman with sunglasses on her head is cutting a roast in the kitchen'}], 'file_name': 'COCO_train2014_000000347263_556785.jpg', 'category_id': 1, 'ann_id': 556785, 'sent_ids': [68299, 68300], 'ref_id': 31255}][{'image_id': 492325, 'split': 'train', 'sentences': [{'tokens': ['a', 'beer', 'which', 'is', 'standing'], 'raw': 'A beer which is standing', 'sent_id': 13351, 'sent': 'a beer which is standing'}, {'tokens': ['a', 'bear', 'that', 'is', 'sitting', 'up'], 'raw': 'A bear that is sitting up.', 'sent_id': 13352, 'sent': 'a bear that is sitting up'}], 'file_name': 'COCO_train2014_000000492325_588117.jpg', 'category_id': 23, 'ann_id': 588117, 'sent_ids': [13351, 13352], 'ref_id': 10175}]\n", "\n", "[{'image_id': 409706, 'split': 'train', 'sentences': [{'tokens': ['paper', 'being', 'drawn', 'on'], 'raw': 'paper being drawn on', 'sent_id': 84661, 'sent': 'paper being drawn on'}, {'tokens': ['drawing', 'book'], 'raw': 'drawing book', 'sent_id': 84662, 'sent': 'drawing book'}], 'file_name': 'COCO_train2014_000000409706_1140323.jpg', 'category_id': 84, 'ann_id': 1140323, 'sent_ids': [84661, 84662], 'ref_id': 37505}]\n", "[{'image_id': 526922, 'split': 'train', 'sentences': [{'tokens': ['a', 'bus', 'that', 'says', 'sebastian', 'el', 'gde'], 'raw': 'A bus that says Sebastian El GDE.', 'sent_id': 77013, 'sent': 'a bus that says sebastian el gde'}, {'tokens': ['the', 'r1', 'bus'], 'raw': 'The R1 bus.', 'sent_id': 77014, 'sent': 'the r1 bus'}], 'file_name': 'COCO_train2014_000000526922_248285.jpg', 'category_id': 6, 'ann_id': 248285, 'sent_ids': [77013, 77014], 'ref_id': 34577}]\n", "[{'image_id': 26274, 'split': 'train', 'sentences': [{'tokens': ['a', 'silver', 'van', 'with', 'people', 'facing', 'it'], 'raw': 'A silver van with people facing it.', 'sent_id': 61777, 'sent': 'a silver van with people facing it'}], 'file_name': 'COCO_train2014_000000026274_136004.jpg', 'category_id': 3, 'ann_id': 136004, 'sent_ids': [61777], 'ref_id': 28715}][{'image_id': 65842, 'split': 'train', 'sentences': [{'tokens': ['orange', 'sitting', 'in', 'boiling', 'wate', 'with', 'a', 'crack', 'on', 'the', 'side', 'and', 'a', 'white', 'spot', 'on', 'top'], 'raw': 'Orange sitting in boiling wate with a crack on the side and a white spot on top.', 'sent_id': 90770, 'sent': 'orange sitting in boiling wate with a crack on the side and a white spot on top'}, {'tokens': ['a', 'single', 'lemon', 'in', 'a', 'boiling', 'pot', 'with', 'five', 'lemons', 'surrounding'], 'raw': 'A single lemon in a boiling pot with five lemons surrounding.', 'sent_id': 90771, 'sent': 'a single lemon in a boiling pot with five lemons surrounding'}], 'file_name': 'COCO_train2014_000000065842_1050797.jpg', 'category_id': 55, 'ann_id': 1050797, 'sent_ids': [90770, 90771], 'ref_id': 49234}]\n", "\n", "[{'image_id': 315831, 'split': 'train', 'sentences': [{'tokens': ['donut', 'with', 'pink', 'frosting', 'and', 'sprinkles'], 'raw': 'Donut with pink frosting and sprinkles.', 'sent_id': 16573, 'sent': 'donut with pink frosting and sprinkles'}, {'tokens': ['a', 'purple', 'donut'], 'raw': 'A purple donut.', 'sent_id': 16574, 'sent': 'a purple donut'}], 'file_name': 'COCO_train2014_000000315831_1573196.jpg', 'category_id': 60, 'ann_id': 1573196, 'sent_ids': [16573, 16574], 'ref_id': 11418}]\n", "[{'image_id': 34404, 'split': 'train', 'sentences': [{'tokens': ['person', 'on', 'left', 'cut', 'off'], 'raw': 'person on left cut off', 'sent_id': 29208, 'sent': 'person on left cut off'}, {'tokens': ['the', 'skiir', 'standing', 'up'], 'raw': 'the skiir standing up', 'sent_id': 29209, 'sent': 'the skiir standing up'}], 'file_name': 'COCO_train2014_000000034404_467515.jpg', 'category_id': 1, 'ann_id': 467515, 'sent_ids': [29208, 29209], 'ref_id': 16214}]\n", "[{'image_id': 427523, 'split': 'train', 'sentences': [{'tokens': ['horse', 'on', 'the', 'left', 'in', 'the', 'right', 'hand', 'picture'], 'raw': 'horse on the left in the right hand picture', 'sent_id': 19348, 'sent': 'horse on the left in the right hand picture'}, {'tokens': ['horse', 'on', 'the', 'left'], 'raw': 'horse on the left', 'sent_id': 19349, 'sent': 'horse on the left'}], 'file_name': 'COCO_train2014_000000427523_54859.jpg', 'category_id': 19, 'ann_id': 54859, 'sent_ids': [19348, 19349], 'ref_id': 12482}]\n", "[{'image_id': 231963, 'split': 'train', 'sentences': [{'tokens': ['a', 'black', ',', 'green', 'and', 'red', 'train', 'car', 'stopped', 'on', 'the', 'tracks', 'to', 'the', 'right', 'of', 'a', 'train', 'engine'], 'raw': 'A black, green and red train car stopped on the tracks to the right of a train engine.', 'sent_id': 91692, 'sent': 'a black , green and red train car stopped on the tracks to the right of a train engine'}, {'tokens': ['the', 'back', 'of', 'the', 'train', 'leaving'], 'raw': 'The back of the train leaving', 'sent_id': 91693, 'sent': 'the back of the train leaving'}], 'file_name': 'COCO_train2014_000000231963_169754.jpg', 'category_id': 7, 'ann_id': 169754, 'sent_ids': [91692, 91693], 'ref_id': 40250}][{'image_id': 399922, 'split': 'train', 'sentences': [{'tokens': ['purse', 'on', 'front', 'mans', 'back'], 'raw': 'purse on front mans back', 'sent_id': 96153, 'sent': 'purse on front mans back'}, {'tokens': ['a', 'beige', 'satchel'], 'raw': 'a beige satchel.', 'sent_id': 96154, 'sent': 'a beige satchel'}], 'file_name': 'COCO_train2014_000000399922_1176815.jpg', 'category_id': 31, 'ann_id': 1176815, 'sent_ids': [96153, 96154], 'ref_id': 41986}]\n", "\n", "[{'image_id': 269045, 'split': 'train', 'sentences': [{'tokens': ['a', 'see', 'through', 'table'], 'raw': 'a see through table', 'sent_id': 36678, 'sent': 'a see through table'}, {'tokens': ['a', 'grilled', 'table', 'near', 'the', 'person', 'with', 'a', 'laptop'], 'raw': 'A grilled table near the person with a laptop', 'sent_id': 36679, 'sent': 'a grilled table near the person with a laptop'}], 'file_name': 'COCO_train2014_000000269045_1612853.jpg', 'category_id': 67, 'ann_id': 1612853, 'sent_ids': [36678, 36679], 'ref_id': 19074}]\n", "[{'image_id': 419297, 'split': 'train', 'sentences': [{'tokens': ['a', 'white', 'truck', 'filled', 'with', 'luggage'], 'raw': 'A white truck filled with luggage', 'sent_id': 50699, 'sent': 'a white truck filled with luggage'}, {'tokens': ['a', 'white', 'color', 'truck'], 'raw': 'A white color truck.', 'sent_id': 50700, 'sent': 'a white color truck'}], 'file_name': 'COCO_train2014_000000419297_1370937.jpg', 'category_id': 8, 'ann_id': 1370937, 'sent_ids': [50699, 50700], 'ref_id': 24467}]\n", "[{'image_id': 153609, 'split': 'train', 'sentences': [{'tokens': ['a', 'gentleman', 'wearing', 'a', 'suit', ',', 'looking', 'down', ',', 'and', 'walking', 'with', 'his', 'hands', 'on', 'his', 'hips'], 'raw': 'A gentleman wearing a suit, looking down, and walking with his hands on his hips.', 'sent_id': 102251, 'sent': 'a gentleman wearing a suit , looking down , and walking with his hands on his hips'}, {'tokens': ['a', 'man', 'in', 'a', 'black', 'suit', 'walking'], 'raw': 'A man in a black suit walking.', 'sent_id': 102252, 'sent': 'a man in a black suit walking'}], 'file_name': 'COCO_train2014_000000153609_462146.jpg', 'category_id': 1, 'ann_id': 462146, 'sent_ids': [102251, 102252], 'ref_id': 44392}][{'image_id': 61498, 'split': 'train', 'sentences': [{'tokens': ['a', 'man', 'in', 'a', 'blue', 'shirt'], 'raw': 'A man in a blue shirt.', 'sent_id': 72219, 'sent': 'a man in a blue shirt'}, {'tokens': ['blue', 'shirt', 'boy'], 'raw': 'blue shirt boy', 'sent_id': 72220, 'sent': 'blue shirt boy'}], 'file_name': 'COCO_train2014_000000061498_500279.jpg', 'category_id': 1, 'ann_id': 500279, 'sent_ids': [72219, 72220], 'ref_id': 48407}]\n", "\n", "[{'image_id': 334714, 'split': 'train', 'sentences': [{'tokens': ['a', 'long', 'narrow', 'multi', '-', 'colored', 'kite', 'to', 'the', 'left', 'of', 'two', 'other', 'kites', 'of', 'the', 'same', 'colors'], 'raw': 'A long narrow multi-colored kite to the left of two other kites of the same colors.', 'sent_id': 29361, 'sent': 'a long narrow multi - colored kite to the left of two other kites of the same colors'}, {'tokens': ['a', 'side', 'of', 'the', 'kite', 'that', 'is', 'closest', 'to', 'the', 'man', 'in', 'black'], 'raw': 'A side of the kite that is closest to the man in black.', 'sent_id': 29362, 'sent': 'a side of the kite that is closest to the man in black'}], 'file_name': 'COCO_train2014_000000334714_623960.jpg', 'category_id': 38, 'ann_id': 623960, 'sent_ids': [29361, 29362], 'ref_id': 16269}]\n", "[{'image_id': 233111, 'split': 'train', 'sentences': [{'tokens': ['a', 'tennis', 'player', 'with', 'his', 'right', 'foot', 'balanced', 'on', 'its', 'toes'], 'raw': 'A tennis player with his right foot balanced on its toes.', 'sent_id': 94813, 'sent': 'a tennis player with his right foot balanced on its toes'}, {'tokens': ['a', 'man', 'in', 'a', 'blue', 'shirt', 'holding', 'a', 'tennis', 'racket'], 'raw': 'A man in a blue shirt holding a tennis racket.', 'sent_id': 94814, 'sent': 'a man in a blue shirt holding a tennis racket'}], 'file_name': 'COCO_train2014_000000233111_510824.jpg', 'category_id': 1, 'ann_id': 510824, 'sent_ids': [94813, 94814], 'ref_id': 49423}]\n", "[{'image_id': 333324, 'split': 'train', 'sentences': [{'tokens': ['a', 'man', 'in', 'a', 'red', 'outfit', 'is', 'jumping', 'to', 'catch', 'a', 'frisbee'], 'raw': 'A man in a red outfit is jumping to catch a frisbee.', 'sent_id': 15405, 'sent': 'a man in a red outfit is jumping to catch a frisbee'}, {'tokens': ['a', 'man', 'jumping', 'for', 'a', 'frisbee'], 'raw': 'a man jumping for a frisbee', 'sent_id': 15406, 'sent': 'a man jumping for a frisbee'}], 'file_name': 'COCO_train2014_000000333324_424995.jpg', 'category_id': 1, 'ann_id': 424995, 'sent_ids': [15405, 15406], 'ref_id': 10961}]\n", "[{'image_id': 500390, 'split': 'train', 'sentences': [{'tokens': ['a', 'girl', 'playing', 'football', 'in', 'the', 'ground'], 'raw': 'A girl playing football in the ground.', 'sent_id': 26349, 'sent': 'a girl playing football in the ground'}, {'tokens': ['girl', 'running', 'with', 'hands', 'up'], 'raw': 'Girl running with hands up', 'sent_id': 26350, 'sent': 'girl running with hands up'}], 'file_name': 'COCO_train2014_000000500390_556949.jpg', 'category_id': 1, 'ann_id': 556949, 'sent_ids': [26349, 26350], 'ref_id': 15132}]\n", "[{'image_id': 282359, 'split': 'train', 'sentences': [{'tokens': ['a', 'man', 'wearing', 'a', 'black', 'shirt', 'holding', 'a', 'tennis', 'racket'], 'raw': 'A man wearing a black shirt holding a tennis racket.', 'sent_id': 81458, 'sent': 'a man wearing a black shirt holding a tennis racket'}, {'tokens': ['a', 'young', 'man', 'in', 'a', 'black', 'shirt', 'and', 'gray', 'shorts'], 'raw': 'A young man in a black shirt and gray shorts.', 'sent_id': 81459, 'sent': 'a young man in a black shirt and gray shorts'}], 'file_name': 'COCO_train2014_000000282359_440734.jpg', 'category_id': 1, 'ann_id': 440734, 'sent_ids': [81458, 81459], 'ref_id': 36299}]\n", "[{'image_id': 377339, 'split': 'train', 'sentences': [{'tokens': ['black', 'suitcase', 'girl', 'is', 'sitting', 'in'], 'raw': 'black suitcase girl is sitting in', 'sent_id': 2283, 'sent': 'black suitcase girl is sitting in'}, {'tokens': ['a', 'suitcase', 'with', 'a', 'girl', 'sitting', 'in', 'it'], 'raw': 'A suitcase with a girl sitting in it', 'sent_id': 2284, 'sent': 'a suitcase with a girl sitting in it'}], 'file_name': 'COCO_train2014_000000377339_1186330.jpg', 'category_id': 33, 'ann_id': 1186330, 'sent_ids': [2283, 2284], 'ref_id': 5899}][{'image_id': 429215, 'split': 'train', 'sentences': [{'tokens': ['a', 'crown', 'of', 'broccoli', 'on', 'a', 'blue', 'plate', 'with', 'carrots', 'and', 'potatoes'], 'raw': 'A crown of broccoli on a blue plate with carrots and potatoes.', 'sent_id': 11008, 'sent': 'a crown of broccoli on a blue plate with carrots and potatoes'}, {'tokens': ['broccoli', 'on', 'a', 'plate'], 'raw': 'Broccoli on a plate.', 'sent_id': 11009, 'sent': 'broccoli on a plate'}], 'file_name': 'COCO_train2014_000000429215_1059094.jpg', 'category_id': 56, 'ann_id': 1059094, 'sent_ids': [11008, 11009], 'ref_id': 45758}]\n", "\n", "[{'image_id': 568492, 'split': 'train', 'sentences': [{'tokens': ['back', 'of', 'chair', 'with', 'women', 'in', 'hooded', 'jacket'], 'raw': 'BACK OF CHAIR WITH WOMEN IN HOODED JACKET', 'sent_id': 62788, 'sent': 'back of chair with women in hooded jacket'}, {'tokens': ['wooden', 'chair', 'with', 'person', 'in', 'red', 'coat', 'getting', 'off', 'of', 'it'], 'raw': 'wooden chair with person in red coat getting off of it', 'sent_id': 62789, 'sent': 'wooden chair with person in red coat getting off of it'}], 'file_name': 'COCO_train2014_000000568492_375813.jpg', 'category_id': 62, 'ann_id': 375813, 'sent_ids': [62788, 62789], 'ref_id': 48006}]\n", "[{'image_id': 183100, 'split': 'train', 'sentences': [{'tokens': ['a', 'red', 'handle', 'for', 'a', 'pair', 'of', 'shears', 'on', 'a', 'table'], 'raw': 'A red handle for a pair of shears on a table.', 'sent_id': 64588, 'sent': 'a red handle for a pair of shears on a table'}, {'tokens': ['scissors', 'with', 'red', 'handle'], 'raw': 'scissors with red handle', 'sent_id': 64589, 'sent': 'scissors with red handle'}], 'file_name': 'COCO_train2014_000000183100_2146842.jpg', 'category_id': 87, 'ann_id': 2146842, 'sent_ids': [64588, 64589], 'ref_id': 29813}]\n", "[{'image_id': 159109, 'split': 'train', 'sentences': [{'tokens': ['pizza', 'with', 'only', 'sausage', 'and', 'cheese', 'on', 'it'], 'raw': 'Pizza with only sausage and cheese on it.', 'sent_id': 20557, 'sent': 'pizza with only sausage and cheese on it'}, {'tokens': ['a', 'frozen', 'pepperoni', 'pizza', 'on', 'a', 'baking', 'sheet'], 'raw': 'A frozen pepperoni pizza on a baking sheet.', 'sent_id': 20558, 'sent': 'a frozen pepperoni pizza on a baking sheet'}], 'file_name': 'COCO_train2014_000000159109_1072198.jpg', 'category_id': 59, 'ann_id': 1072198, 'sent_ids': [20557, 20558], 'ref_id': 12943}][{'image_id': 99599, 'split': 'train', 'sentences': [{'tokens': ['a', 'woman', 'wearing', 'a', 'bracelet', 'helps', 'put', 'candles', 'on', 'a', 'cake'], 'raw': 'A woman wearing a bracelet helps put candles on a cake.', 'sent_id': 6577, 'sent': 'a woman wearing a bracelet helps put candles on a cake'}, {'tokens': ['person', 'wearing', 'a', 'silver', 'bracelet', 'and', 'a', 'silver', 'ring'], 'raw': 'Person wearing a silver bracelet and a silver ring.', 'sent_id': 6578, 'sent': 'person wearing a silver bracelet and a silver ring'}], 'file_name': 'COCO_train2014_000000099599_191383.jpg', 'category_id': 1, 'ann_id': 191383, 'sent_ids': [6577, 6578], 'ref_id': 7554}]\n", "\n", "[{'image_id': 198406, 'split': 'train', 'sentences': [{'tokens': ['a', 'bird', 'stands', 'on', 'the', 'road'], 'raw': 'A bird stands on the road.', 'sent_id': 59907, 'sent': 'a bird stands on the road'}, {'tokens': ['a', 'bird', 'is', 'standing', 'on', 'the', 'road', 'and', 'watching', 'the', 'other', 'bird', 'sitting', 'near'], 'raw': 'A bird is standing on the road and watching the other bird sitting near', 'sent_id': 59908, 'sent': 'a bird is standing on the road and watching the other bird sitting near'}], 'file_name': 'COCO_train2014_000000198406_43102.jpg', 'category_id': 16, 'ann_id': 43102, 'sent_ids': [59907, 59908], 'ref_id': 47881}]\n", "[{'image_id': 321173, 'split': 'train', 'sentences': [{'tokens': ['a', 'part', 'of', 'the', 'table', 'to', 'the', 'right', 'of', 'the', 'plate'], 'raw': 'A part of the table to the right of the plate.', 'sent_id': 83151, 'sent': 'a part of the table to the right of the plate'}], 'file_name': 'COCO_train2014_000000321173_390269.jpg', 'category_id': 67, 'ann_id': 390269, 'sent_ids': [83151], 'ref_id': 36932}]\n", "[{'image_id': 40901, 'split': 'train', 'sentences': [{'tokens': ['man', 'washing', 'his', 'hands', 'in', 'a', 'public', 'restroom'], 'raw': 'Man washing his hands in a public restroom.', 'sent_id': 57105, 'sent': 'man washing his hands in a public restroom'}, {'tokens': ['man', 'watching', 'his', 'hands', ',', 'not', 'his', 'reflection'], 'raw': 'Man watching his hands, not his reflection.', 'sent_id': 57106, 'sent': 'man watching his hands , not his reflection'}], 'file_name': 'COCO_train2014_000000040901_512279.jpg', 'category_id': 1, 'ann_id': 512279, 'sent_ids': [57105, 57106], 'ref_id': 26951}]\n", "[{'image_id': 286482, 'split': 'train', 'sentences': [{'tokens': ['green', 'suitcase'], 'raw': 'green suitcase', 'sent_id': 37373, 'sent': 'green suitcase'}, {'tokens': ['a', 'green', 'suitcase', 'with', 'two', 'other', 'luggage', 'pieces', 'stacked', 'atop', 'it'], 'raw': 'A green suitcase with two other luggage pieces stacked atop it.', 'sent_id': 37374, 'sent': 'a green suitcase with two other luggage pieces stacked atop it'}], 'file_name': 'COCO_train2014_000000286482_1184941.jpg', 'category_id': 33, 'ann_id': 1184941, 'sent_ids': [37373, 37374], 'ref_id': 19349}][{'image_id': 40094, 'split': 'train', 'sentences': [{'tokens': ['the', 'cat', 'that', 'is', 'the', 'lowest', 'on', 'the', 'couch'], 'raw': 'The cat that is the lowest on the couch.', 'sent_id': 54410, 'sent': 'the cat that is the lowest on the couch'}, {'tokens': ['the', 'cat', 'on', 'the', 'left'], 'raw': 'the cat on the left', 'sent_id': 54411, 'sent': 'the cat on the left'}], 'file_name': 'COCO_train2014_000000040094_52880.jpg', 'category_id': 17, 'ann_id': 52880, 'sent_ids': [54410, 54411], 'ref_id': 25939}]\n", "\n", "[{'image_id': 61209, 'split': 'train', 'sentences': [{'tokens': ['an', 'elephant', 'with', '2', 'white', 'tusks'], 'raw': 'An elephant with 2 white tusks.', 'sent_id': 14679, 'sent': 'an elephant with 2 white tusks'}, {'tokens': ['the', 'elephant', 'on', 'the', 'right', 'side', 'of', 'the', 'picture', 'that', 'seems', 'to', 'be', 'looking', 'into', 'the', 'camera'], 'raw': 'The elephant on the right side of the picture that seems to be looking into the camera.', 'sent_id': 14680, 'sent': 'the elephant on the right side of the picture that seems to be looking into the camera'}], 'file_name': 'COCO_train2014_000000061209_584430.jpg', 'category_id': 22, 'ann_id': 584430, 'sent_ids': [14679, 14680], 'ref_id': 45915}][{'image_id': 276806, 'split': 'train', 'sentences': [{'tokens': ['a', 'woman', 'that', 'is', 'waiting', 'for', 'a', 'slice', 'of', 'cake'], 'raw': 'A woman that is waiting for a slice of cake.', 'sent_id': 87859, 'sent': 'a woman that is waiting for a slice of cake'}, {'tokens': ['a', 'woman', 'wearing', 'a', 'brown', 'jacket', 'sitting', 'beside', 'a', 'younger', 'woman'], 'raw': 'A woman wearing a brown jacket sitting beside a younger woman.', 'sent_id': 87860, 'sent': 'a woman wearing a brown jacket sitting beside a younger woman'}], 'file_name': 'COCO_train2014_000000276806_487475.jpg', 'category_id': 1, 'ann_id': 487475, 'sent_ids': [87859, 87860], 'ref_id': 38745}]\n", "\n", "[{'image_id': 412101, 'split': 'train', 'sentences': [{'tokens': ['the', 'chair', 'at', 'the', 'bottom', 'right'], 'raw': 'the chair at the bottom right', 'sent_id': 42865, 'sent': 'the chair at the bottom right'}, {'tokens': ['the', 'black', 'plastic', 'chair', 'that', 'is', 'farthest', 'away', 'from', 'the', 'kitchen'], 'raw': 'The black plastic chair that is farthest away from the kitchen.', 'sent_id': 42866, 'sent': 'the black plastic chair that is farthest away from the kitchen'}], 'file_name': 'COCO_train2014_000000412101_103736.jpg', 'category_id': 62, 'ann_id': 103736, 'sent_ids': [42865, 42866], 'ref_id': 21474}]\n", "[{'image_id': 397132, 'split': 'train', 'sentences': [{'tokens': ['a', 'blue', 'minivan', 'beside', 'a', 'garbage', 'truck', 'on', 'a', 'street'], 'raw': 'a blue minivan beside a garbage truck on a street', 'sent_id': 82000, 'sent': 'a blue minivan beside a garbage truck on a street'}, {'tokens': ['blue', 'minivan', 'moving', 'on', 'the', 'street', 'with', 'other', 'vehicles'], 'raw': 'Blue minivan moving on the street with other vehicles.', 'sent_id': 82001, 'sent': 'blue minivan moving on the street with other vehicles'}], 'file_name': 'COCO_train2014_000000397132_353337.jpg', 'category_id': 3, 'ann_id': 353337, 'sent_ids': [82000, 82001], 'ref_id': 36513}]\n", "[{'image_id': 168879, 'split': 'train', 'sentences': [{'tokens': ['a', 'giraffe', 'on', 'right', 'side'], 'raw': 'a giraffe on right side', 'sent_id': 63328, 'sent': 'a giraffe on right side'}], 'file_name': 'COCO_train2014_000000168879_595571.jpg', 'category_id': 25, 'ann_id': 595571, 'sent_ids': [63328], 'ref_id': 29326}]\n", "[{'image_id': 287239, 'split': 'train', 'sentences': [{'tokens': ['a', 'toddler', 'with', 'blonde', 'hair', 'and', 'blue', 'eyes', 'who', 'has', 'a', 'brush', 'upon', 'their', 'head'], 'raw': 'a toddler with blonde hair and blue eyes who has a brush upon their head.', 'sent_id': 25368, 'sent': 'a toddler with blonde hair and blue eyes who has a brush upon their head'}, {'tokens': ['a', 'blonde', '-', 'haired', 'small', 'child'], 'raw': 'A blonde-haired small child.', 'sent_id': 25369, 'sent': 'a blonde - haired small child'}], 'file_name': 'COCO_train2014_000000287239_469385.jpg', 'category_id': 1, 'ann_id': 469385, 'sent_ids': [25368, 25369], 'ref_id': 14777}][{'image_id': 180559, 'split': 'train', 'sentences': [{'tokens': ['a', 'man', 'in', 'blue', 'shirt', 'and', 'blue', 'hat', 'who', 'just', 'threw', 'a', 'frisbee'], 'raw': 'A man in blue shirt and blue hat who just threw a frisbee', 'sent_id': 93684, 'sent': 'a man in blue shirt and blue hat who just threw a frisbee'}, {'tokens': ['a', 'man', 'with', 'a', 'cap', 'is', 'trying', 'to', 'catch', 'a', 'frisbee'], 'raw': 'a man with a cap is trying to catch a Frisbee', 'sent_id': 93685, 'sent': 'a man with a cap is trying to catch a frisbee'}], 'file_name': 'COCO_train2014_000000180559_521030.jpg', 'category_id': 1, 'ann_id': 521030, 'sent_ids': [93684, 93685], 'ref_id': 41030}][{'image_id': 204792, 'split': 'train', 'sentences': [{'tokens': ['a', 'sheep', 'being', 'help', 'by', 'the', 'lady', 'in', 'the', 'black', 'shit', ';', 'left', 'side', 'of', 'the', 'picture'], 'raw': 'a sheep being help by the lady in the black shit; left side of the picture', 'sent_id': 1907, 'sent': 'a sheep being help by the lady in the black shit ; left side of the picture'}, {'tokens': ['the', 'animal', 'being', 'petted', 'by', 'the', 'blonde', 'lady'], 'raw': 'The animal being petted by the blonde lady.', 'sent_id': 1908, 'sent': 'the animal being petted by the blonde lady'}], 'file_name': 'COCO_train2014_000000204792_61249.jpg', 'category_id': 20, 'ann_id': 61249, 'sent_ids': [1907, 1908], 'ref_id': 5743}]\n", "\n", "\n", "[{'image_id': 516596, 'split': 'train', 'sentences': [{'tokens': ['a', 'man', 'wearing', 'glasses', 'eating', 'a', 'huge', 'hero'], 'raw': 'a man wearing glasses eating a huge hero', 'sent_id': 38413, 'sent': 'a man wearing glasses eating a huge hero'}, {'tokens': ['a', 'man', 'wearing', 'glasses', 'eating', 'a', 'sandwich'], 'raw': 'a man wearing glasses eating a sandwich', 'sent_id': 38414, 'sent': 'a man wearing glasses eating a sandwich'}], 'file_name': 'COCO_train2014_000000516596_424086.jpg', 'category_id': 1, 'ann_id': 424086, 'sent_ids': [38413, 38414], 'ref_id': 19743}]\n", "[{'image_id': 28085, 'split': 'train', 'sentences': [{'tokens': ['pink', 'color', 'donuts', 'in', 'front', 'of', 'a', 'brown', 'colored', 'one'], 'raw': 'pink color donuts in front of a brown colored one', 'sent_id': 56205, 'sent': 'pink color donuts in front of a brown colored one'}, {'tokens': ['a', 'pink', 'color', 'ring', 'chocolate', 'iced', 'doughnut', 'in', 'front', 'of', 'the', 'brown', 'color'], 'raw': 'A PINK COLOR RING CHOCOLATE ICED DOUGHNUT IN FRONT OF THE BROWN COLOR', 'sent_id': 56206, 'sent': 'a pink color ring chocolate iced doughnut in front of the brown color'}], 'file_name': 'COCO_train2014_000000028085_1078993.jpg', 'category_id': 60, 'ann_id': 1078993, 'sent_ids': [56205, 56206], 'ref_id': 26602}]\n", "[{'image_id': 219633, 'split': 'train', 'sentences': [{'tokens': ['a', 'light', 'brown', 'dog', 'standing', 'next', 'to', 'a', 'dark', 'brown', 'dog'], 'raw': 'A light brown dog standing next to a dark brown dog.', 'sent_id': 79238, 'sent': 'a light brown dog standing next to a dark brown dog'}, {'tokens': ['the', 'lightest', 'color', 'dog', 'that', 'is', 'on', 'the', 'right'], 'raw': 'The lightest color dog that is on the right.', 'sent_id': 79239, 'sent': 'the lightest color dog that is on the right'}], 'file_name': 'COCO_train2014_000000219633_15879.jpg', 'category_id': 18, 'ann_id': 15879, 'sent_ids': [79238, 79239], 'ref_id': 35444}]\n", "[{'image_id': 110002, 'split': 'train', 'sentences': [{'tokens': ['large', 'zebra', 'left', 'of', 'screen'], 'raw': 'large zebra left of screen', 'sent_id': 100858, 'sent': 'large zebra left of screen'}, {'tokens': ['zebra', 'in', 'front', 'of', 'all', 'the', 'others'], 'raw': 'Zebra in front of all the others.', 'sent_id': 100859, 'sent': 'zebra in front of all the others'}], 'file_name': 'COCO_train2014_000000110002_589620.jpg', 'category_id': 24, 'ann_id': 589620, 'sent_ids': [100858, 100859], 'ref_id': 43849}]\n", "[{'image_id': 217460, 'split': 'train', 'sentences': [{'tokens': ['large', 'pizza', 'with', 'all', 'toppings'], 'raw': 'large pizza with all toppings', 'sent_id': 14009, 'sent': 'large pizza with all toppings'}, {'tokens': ['a', 'pizza', 'with', 'olives', ',', 'mushrooms', ',', 'artichokes', ',', 'and', 'ham'], 'raw': 'A pizza with olives, mushrooms, artichokes, and ham.', 'sent_id': 14010, 'sent': 'a pizza with olives , mushrooms , artichokes , and ham'}], 'file_name': 'COCO_train2014_000000217460_1077159.jpg', 'category_id': 59, 'ann_id': 1077159, 'sent_ids': [14009, 14010], 'ref_id': 10427}][{'image_id': 324336, 'split': 'train', 'sentences': [{'tokens': ['a', 'man', 'standing', 'outside', 'with', 'an', 'umbrella'], 'raw': 'A man standing outside with an umbrella.', 'sent_id': 61801, 'sent': 'a man standing outside with an umbrella'}, {'tokens': ['a', 'lady', 'wearing', 'specs', 'and', 'holding', 'black', 'umbrella'], 'raw': 'A lady wearing specs and holding black umbrella', 'sent_id': 61802, 'sent': 'a lady wearing specs and holding black umbrella'}], 'file_name': 'COCO_train2014_000000324336_1734772.jpg', 'category_id': 1, 'ann_id': 1734772, 'sent_ids': [61801, 61802], 'ref_id': 28726}]\n", "[{'image_id': 10495, 'split': 'train', 'sentences': [{'tokens': ['a', 'baby', 'elephant', 'under', 'a', 'big', 'elephant'], 'raw': 'A baby elephant under a big elephant.', 'sent_id': 2010, 'sent': 'a baby elephant under a big elephant'}, {'tokens': ['a', 'baby', 'elephant', 'walking', 'with', 'its', 'mother'], 'raw': 'A baby elephant walking with its mother.', 'sent_id': 2011, 'sent': 'a baby elephant walking with its mother'}], 'file_name': 'COCO_train2014_000000010495_1821437.jpg', 'category_id': 22, 'ann_id': 1821437, 'sent_ids': [2010, 2011], 'ref_id': 5786}]\n", "\n", "[{'image_id': 279753, 'split': 'train', 'sentences': [{'tokens': ['a', 'man', 'in', 'a', 'red', 'shirt', 'and', 'black', 'pants'], 'raw': 'A man in a red shirt and black pants', 'sent_id': 97009, 'sent': 'a man in a red shirt and black pants'}], 'file_name': 'COCO_train2014_000000279753_535460.jpg', 'category_id': 1, 'ann_id': 535460, 'sent_ids': [97009], 'ref_id': 42327}]\n", "[{'image_id': 427395, 'split': 'train', 'sentences': [{'tokens': ['a', 'purple', 'toothbrush'], 'raw': 'A purple toothbrush.', 'sent_id': 10965, 'sent': 'a purple toothbrush'}, {'tokens': ['purple', 'toothbrush', 'with', 'green', 'bristles'], 'raw': 'Purple toothbrush with green bristles.', 'sent_id': 10966, 'sent': 'purple toothbrush with green bristles'}], 'file_name': 'COCO_train2014_000000427395_342229.jpg', 'category_id': 90, 'ann_id': 342229, 'sent_ids': [10965, 10966], 'ref_id': 9269}][{'image_id': 63217, 'split': 'train', 'sentences': [{'tokens': ['a', 'boat', 'in', 'the', 'water', 'with', 'the', 'words', 'u', '.', 's', '.', 'coast', 'guard', 'on', 'the', 'side'], 'raw': 'a boat in the water with the words U.S. Coast Guard on the side', 'sent_id': 78927, 'sent': 'a boat in the water with the words u . s . coast guard on the side'}, {'tokens': ['a', 'red', 'and', 'white', 'us', 'coast', 'guard', 'ship'], 'raw': 'A red and white US Coast Guard Ship.', 'sent_id': 78928, 'sent': 'a red and white us coast guard ship'}], 'file_name': 'COCO_train2014_000000063217_179804.jpg', 'category_id': 9, 'ann_id': 179804, 'sent_ids': [78927, 78928], 'ref_id': 35324}]\n", "\n", "[{'image_id': 17520, 'split': 'train', 'sentences': [{'tokens': ['a', 'man', 'wearing', 'a', 'checkered', 'shirt', 'walking', 'and', 'talking', 'on', 'the', 'phone'], 'raw': 'A man wearing a checkered shirt walking and talking on the phone.', 'sent_id': 56923, 'sent': 'a man wearing a checkered shirt walking and talking on the phone'}, {'tokens': ['man', 'wearing', 'a', 'plaid', 'shirt'], 'raw': 'man wearing a plaid shirt.', 'sent_id': 56924, 'sent': 'man wearing a plaid shirt'}], 'file_name': 'COCO_train2014_000000017520_196780.jpg', 'category_id': 1, 'ann_id': 196780, 'sent_ids': [56923, 56924], 'ref_id': 26881}]\n", "[{'image_id': 137203, 'split': 'train', 'sentences': [{'tokens': ['a', 'woman', 'in', 'red', 'is', 'trying', 'to', 'catch', 'a', 'pink', 'frisbee'], 'raw': 'A woman in red is trying to catch a pink frisbee', 'sent_id': 100490, 'sent': 'a woman in red is trying to catch a pink frisbee'}, {'tokens': ['a', 'woman', 'in', 'a', 'red', 'shirt', 'and', 'jean', 'shorts', 'about', 'to', 'catch', 'a', 'frisbee'], 'raw': 'A woman in a red shirt and jean shorts about to catch a Frisbee.', 'sent_id': 100491, 'sent': 'a woman in a red shirt and jean shorts about to catch a frisbee'}], 'file_name': 'COCO_train2014_000000137203_459492.jpg', 'category_id': 1, 'ann_id': 459492, 'sent_ids': [100490, 100491], 'ref_id': 49657}]\n", "[{'image_id': 34674, 'split': 'train', 'sentences': [{'tokens': ['the', 'horse', 'of', 'the', 'man', 'without', 'a', 'hat'], 'raw': 'The horse of the man without a hat', 'sent_id': 47889, 'sent': 'the horse of the man without a hat'}, {'tokens': ['horse', 'being', 'ridden', 'by', 'the', 'man', 'without', 'a', 'hat'], 'raw': 'Horse being ridden by the man without a hat.', 'sent_id': 47890, 'sent': 'horse being ridden by the man without a hat'}], 'file_name': 'COCO_train2014_000000034674_56042.jpg', 'category_id': 19, 'ann_id': 56042, 'sent_ids': [47889, 47890], 'ref_id': 23399}]\n", "[{'image_id': 293975, 'split': 'train', 'sentences': [{'tokens': ['a', 'white', 'laptop', 'comuter'], 'raw': 'A white laptop comuter.', 'sent_id': 48293, 'sent': 'a white laptop comuter'}, {'tokens': ['white', 'laptop'], 'raw': 'white laptop', 'sent_id': 48294, 'sent': 'white laptop'}], 'file_name': 'COCO_train2014_000000293975_1099887.jpg', 'category_id': 73, 'ann_id': 1099887, 'sent_ids': [48293, 48294], 'ref_id': 23543}]\n", "[{'image_id': 323705, 'split': 'train', 'sentences': [{'tokens': ['a', 'clock', 'face', 'where', 'all', 'the', 'numbers', 'are', 'displayed'], 'raw': 'A clock face where all the numbers are displayed.', 'sent_id': 8682, 'sent': 'a clock face where all the numbers are displayed'}, {'tokens': ['clock', 'facing', 'the', 'front'], 'raw': 'clock facing the front.', 'sent_id': 8683, 'sent': 'clock facing the front'}], 'file_name': 'COCO_train2014_000000323705_335093.jpg', 'category_id': 85, 'ann_id': 335093, 'sent_ids': [8682, 8683], 'ref_id': 8358}]\n", "[{'image_id': 416819, 'split': 'train', 'sentences': [{'tokens': ['a', 'zebra', 'with', 'his', 'back', 'to', 'the', 'camera'], 'raw': 'A zebra with his back to the camera', 'sent_id': 56637, 'sent': 'a zebra with his back to the camera'}, {'tokens': ['zebra', 'turn', 'the', 'head', 'left', 'hand', 'side'], 'raw': 'Zebra turn the head left hand side', 'sent_id': 56638, 'sent': 'zebra turn the head left hand side'}], 'file_name': 'COCO_train2014_000000416819_591965.jpg', 'category_id': 24, 'ann_id': 591965, 'sent_ids': [56637, 56638], 'ref_id': 26766}]\n", "[{'image_id': 522298, 'split': 'train', 'sentences': [{'tokens': ['a', 'pink', 'umbrella'], 'raw': 'A pink umbrella.', 'sent_id': 54683, 'sent': 'a pink umbrella'}, {'tokens': ['the', 'red', 'umbrella'], 'raw': 'the red umbrella', 'sent_id': 54684, 'sent': 'the red umbrella'}], 'file_name': 'COCO_train2014_000000522298_283547.jpg', 'category_id': 28, 'ann_id': 283547, 'sent_ids': [54683, 54684], 'ref_id': 26042}]\n", "[{'image_id': 427756, 'split': 'train', 'sentences': [{'tokens': ['a', 'man', 'standing', 'with', 'blue', 'striped', 'shirt'], 'raw': 'A man standing with blue striped shirt.', 'sent_id': 62696, 'sent': 'a man standing with blue striped shirt'}, {'tokens': ['a', 'man', 'in', 'black', 'jeans', 'and', 'blue', 'and', 'black', 'striped', 'shirt', 'holding', 'wii', 'in', 'hand', 'standing', 'in', 'front', 'of', 'tv'], 'raw': 'A man in black jeans and blue and black striped shirt holding wii in hand standing in front of TV.', 'sent_id': 62697, 'sent': 'a man in black jeans and blue and black striped shirt holding wii in hand standing in front of tv'}], 'file_name': 'COCO_train2014_000000427756_490450.jpg', 'category_id': 1, 'ann_id': 490450, 'sent_ids': [62696, 62697], 'ref_id': 29075}][{'image_id': 405136, 'split': 'train', 'sentences': [{'tokens': ['a', 'woman', 'in', 'a', 'sleeveless', 'shirt', 'is', 'sitting', 'in', 'the', 'passenger', 'seat', 'watching', 'a', 'horse'], 'raw': 'A woman in a sleeveless shirt is sitting in the passenger seat watching a horse', 'sent_id': 12514, 'sent': 'a woman in a sleeveless shirt is sitting in the passenger seat watching a horse'}, {'tokens': ['a', 'person', 'sitting', 'next', 'to', 'the', 'driver'], 'raw': 'A person sitting next to the driver', 'sent_id': 12515, 'sent': 'a person sitting next to the driver'}], 'file_name': 'COCO_train2014_000000405136_188388.jpg', 'category_id': 1, 'ann_id': 188388, 'sent_ids': [12514, 12515], 'ref_id': 9851}]\n", "\n", "[{'image_id': 16465, 'split': 'train', 'sentences': [{'tokens': ['a', 'man', 'in', 'a', 'white', 'soccer', 'uniform'], 'raw': 'A man in a white soccer uniform.', 'sent_id': 31029, 'sent': 'a man in a white soccer uniform'}, {'tokens': ['the', 'player', 'wearing', 'the', 'white', 'clothes'], 'raw': 'The player wearing the white clothes.', 'sent_id': 31030, 'sent': 'the player wearing the white clothes'}], 'file_name': 'COCO_train2014_000000016465_477891.jpg', 'category_id': 1, 'ann_id': 477891, 'sent_ids': [31029, 31030], 'ref_id': 16909}]\n", "[{'image_id': 326685, 'split': 'train', 'sentences': [{'tokens': ['a', 'blurry', 'shot', 'of', 'people', 'riding', 'a', 'scooter', 'in', 'the', 'rain'], 'raw': 'a blurry shot of people riding a scooter in the rain', 'sent_id': 19396, 'sent': 'a blurry shot of people riding a scooter in the rain'}, {'tokens': ['top', 'right', 'blurry', 'motorcyclist', 'going', 'out', 'of', 'frame'], 'raw': 'top right blurry motorcyclist going out of frame.', 'sent_id': 19397, 'sent': 'top right blurry motorcyclist going out of frame'}], 'file_name': 'COCO_train2014_000000326685_1713145.jpg', 'category_id': 1, 'ann_id': 1713145, 'sent_ids': [19396, 19397], 'ref_id': 12499}]\n", "[{'image_id': 326685, 'split': 'train', 'sentences': [{'tokens': ['green', '&', 'white', 'scooter', 'that', 'women', 'are', 'riding', 'in', 'rain'], 'raw': 'Green & white scooter that women are riding in rain', 'sent_id': 98188, 'sent': 'green & white scooter that women are riding in rain'}, {'tokens': ['white', 'color', 'motor', 'cycle'], 'raw': 'white color motor cycle', 'sent_id': 98189, 'sent': 'white color motor cycle'}], 'file_name': 'COCO_train2014_000000326685_147911.jpg', 'category_id': 4, 'ann_id': 147911, 'sent_ids': [98188, 98189], 'ref_id': 42804}][{'image_id': 316667, 'split': 'train', 'sentences': [{'tokens': ['a', 'bench', 'that', 'is', 'laying', 'on', 'the', 'ground'], 'raw': 'A bench that is laying on the ground', 'sent_id': 15264, 'sent': 'a bench that is laying on the ground'}, {'tokens': ['a', 'bench', 'on', 'which', 'the', 'guy', 'is', 'operating', 'the', 'skate', 'board'], 'raw': 'A bench on which the guy is operating the skate board', 'sent_id': 15265, 'sent': 'a bench on which the guy is operating the skate board'}], 'file_name': 'COCO_train2014_000000316667_1394952.jpg', 'category_id': 15, 'ann_id': 1394952, 'sent_ids': [15264, 15265], 'ref_id': 10907}]\n", "\n", "[{'image_id': 60170, 'split': 'train', 'sentences': [{'tokens': ['a', 'baby', 'elephant'], 'raw': 'A baby elephant', 'sent_id': 50475, 'sent': 'a baby elephant'}, {'tokens': ['an', 'elephant', 'that', 'is', 'relatively', 'small'], 'raw': 'An elephant that is relatively small.', 'sent_id': 50476, 'sent': 'an elephant that is relatively small'}], 'file_name': 'COCO_train2014_000000060170_582132.jpg', 'category_id': 22, 'ann_id': 582132, 'sent_ids': [50475, 50476], 'ref_id': 24381}]\n", "[{'image_id': 546366, 'split': 'train', 'sentences': [{'tokens': ['tennis', 'player', 'holding', 'racquet'], 'raw': 'tennis player holding racquet', 'sent_id': 1541, 'sent': 'tennis player holding racquet'}, {'tokens': ['a', 'woman', 'wearing', 'white'], 'raw': 'a woman wearing white.', 'sent_id': 1542, 'sent': 'a woman wearing white'}], 'file_name': 'COCO_train2014_000000546366_2150776.jpg', 'category_id': 1, 'ann_id': 2150776, 'sent_ids': [1541, 1542], 'ref_id': 45385}][{'image_id': 191994, 'split': 'train', 'sentences': [{'tokens': ['pizza', 'in', 'a', 'tray', 'ready', 'to', 'eat'], 'raw': 'pizza in a tray ready to eat', 'sent_id': 67556, 'sent': 'pizza in a tray ready to eat'}, {'tokens': ['a', 'sandwich', 'with', 'vegetables', 'on', 'a', 'white', 'bread', 'in', 'a', 'carrier'], 'raw': 'A sandwich with vegetables on a white bread in a carrier.', 'sent_id': 67557, 'sent': 'a sandwich with vegetables on a white bread in a carrier'}], 'file_name': 'COCO_train2014_000000191994_1539809.jpg', 'category_id': 51, 'ann_id': 1539809, 'sent_ids': [67556, 67557], 'ref_id': 30964}]\n", "\n", "[{'image_id': 239803, 'split': 'train', 'sentences': [{'tokens': ['a', 'teen', 'in', 'a', 'black', 'coat', 'to', 'the', 'right', 'of', 'two', 'other', 'teens'], 'raw': 'A teen in a black coat to the right of two other teens.', 'sent_id': 64376, 'sent': 'a teen in a black coat to the right of two other teens'}, {'tokens': ['a', 'young', 'gentleman', 'wearing', 'a', 'black', 'leather', 'jacket'], 'raw': 'A young gentleman wearing a black leather jacket', 'sent_id': 64377, 'sent': 'a young gentleman wearing a black leather jacket'}], 'file_name': 'COCO_train2014_000000239803_2166462.jpg', 'category_id': 1, 'ann_id': 2166462, 'sent_ids': [64376, 64377], 'ref_id': 29734}]\n", "[{'image_id': 235646, 'split': 'train', 'sentences': [{'tokens': ['the', 'giraffe', 'whose', 'head', 'is', 'not', 'visible'], 'raw': 'The giraffe whose head is not visible', 'sent_id': 50286, 'sent': 'the giraffe whose head is not visible'}, {'tokens': ['body', 'of', 'a', 'giraffe', 'stading', 'to', 'the', 'upper', 'right', 'of', 'the', 'group', 'against', 'the', 'fence'], 'raw': 'Body of a giraffe stading to the upper right of the group against the fence', 'sent_id': 50287, 'sent': 'body of a giraffe stading to the upper right of the group against the fence'}], 'file_name': 'COCO_train2014_000000235646_1414611.jpg', 'category_id': 25, 'ann_id': 1414611, 'sent_ids': [50286, 50287], 'ref_id': 24303}][{'image_id': 176385, 'split': 'train', 'sentences': [{'tokens': ['there', 'is', 'nobody', 'riding', 'this', 'skateboard'], 'raw': 'There is nobody riding this skateboard.', 'sent_id': 24280, 'sent': 'there is nobody riding this skateboard'}, {'tokens': ['a', 'skateboard', 'alone', 'on', 'the', 'ground'], 'raw': 'A skateboard alone on the ground.', 'sent_id': 24281, 'sent': 'a skateboard alone on the ground'}], 'file_name': 'COCO_train2014_000000176385_645613.jpg', 'category_id': 41, 'ann_id': 645613, 'sent_ids': [24280, 24281], 'ref_id': 14373}]\n", "\n", "[{'image_id': 131007, 'split': 'train', 'sentences': [{'tokens': ['black', 'chair', 'in', 'corner'], 'raw': 'black chair in corner', 'sent_id': 98162, 'sent': 'black chair in corner'}, {'tokens': ['a', 'black', 'recliner', 'chair'], 'raw': 'a black recliner chair', 'sent_id': 98163, 'sent': 'a black recliner chair'}], 'file_name': 'COCO_train2014_000000131007_115747.jpg', 'category_id': 63, 'ann_id': 115747, 'sent_ids': [98162, 98163], 'ref_id': 42794}]\n", "[{'image_id': 155995, 'split': 'train', 'sentences': [{'tokens': ['a', 'child', 'baseball', 'player', 'throwing', 'a', 'pitch', 'to', 'a', 'batter'], 'raw': 'A child baseball player throwing a pitch to a batter.', 'sent_id': 15351, 'sent': 'a child baseball player throwing a pitch to a batter'}, {'tokens': ['the', 'pitcher'], 'raw': 'the pitcher', 'sent_id': 15352, 'sent': 'the pitcher'}], 'file_name': 'COCO_train2014_000000155995_525361.jpg', 'category_id': 1, 'ann_id': 525361, 'sent_ids': [15351, 15352], 'ref_id': 10939}][{'image_id': 514025, 'split': 'train', 'sentences': [{'tokens': ['a', 'large', 'blue', 'and', 'white', 'crane', 'standing', 'on', 'the', 'dock'], 'raw': 'a large blue and white crane standing on the dock', 'sent_id': 43870, 'sent': 'a large blue and white crane standing on the dock'}, {'tokens': ['a', 'bird', 'that', 'is', 'standing', 'on', 'the', 'dock', 'with', 'long', 'legs', 'and', 'a', 'scrunched', 'up', 'neck'], 'raw': 'A bird that is standing on the dock with long legs and a scrunched up neck.', 'sent_id': 43871, 'sent': 'a bird that is standing on the dock with long legs and a scrunched up neck'}], 'file_name': 'COCO_train2014_000000514025_36534.jpg', 'category_id': 16, 'ann_id': 36534, 'sent_ids': [43870, 43871], 'ref_id': 21856}]\n", "[{'image_id': 485705, 'split': 'train', 'sentences': [{'tokens': ['middle', 'banana', 'in', 'the', 'bunch'], 'raw': 'middle banana in the bunch', 'sent_id': 30403, 'sent': 'middle banana in the bunch'}, {'tokens': ['the', 'bottom', 'banana', 'in', 'the', 'right', 'hand', 'picture'], 'raw': 'the bottom banana in the right hand picture', 'sent_id': 30404, 'sent': 'the bottom banana in the right hand picture'}], 'file_name': 'COCO_train2014_000000485705_1043190.jpg', 'category_id': 52, 'ann_id': 1043190, 'sent_ids': [30403, 30404], 'ref_id': 16660}]\n", "\n", "[{'image_id': 308758, 'split': 'train', 'sentences': [{'tokens': ['a', 'man', 'wearing', 'a', 'chef', 'jacket'], 'raw': 'a man wearing a chef jacket', 'sent_id': 30897, 'sent': 'a man wearing a chef jacket'}, {'tokens': ['man', 'preparing', 'a', 'dish'], 'raw': 'Man preparing a dish', 'sent_id': 30898, 'sent': 'man preparing a dish'}], 'file_name': 'COCO_train2014_000000308758_196341.jpg', 'category_id': 1, 'ann_id': 196341, 'sent_ids': [30897, 30898], 'ref_id': 16860}][{'image_id': 54194, 'split': 'train', 'sentences': [{'tokens': ['a', 'lady', 'with', 'black', 'long', 'hair', 'in', 'a', 'yellow', 'shirt', ',', 'putting', 'butter', 'on', 'a', 'bread'], 'raw': 'a lady with black long hair in a yellow shirt, putting butter on a bread', 'sent_id': 52248, 'sent': 'a lady with black long hair in a yellow shirt , putting butter on a bread'}, {'tokens': ['a', 'woman', 'in', 'yellow', 'with', 'a', 'knife', 'in', 'her', 'hand', 'buttering', 'her', 'sub', 'sandwich'], 'raw': 'A woman in yellow with a knife in her hand buttering her sub sandwich.', 'sent_id': 52249, 'sent': 'a woman in yellow with a knife in her hand buttering her sub sandwich'}], 'file_name': 'COCO_train2014_000000054194_233992.jpg', 'category_id': 1, 'ann_id': 233992, 'sent_ids': [52248, 52249], 'ref_id': 25093}]\n", "\n", "[{'image_id': 563447, 'split': 'train', 'sentences': [{'tokens': ['the', 'kid', 'wearing', 'glasses'], 'raw': 'the kid wearing glasses', 'sent_id': 46806, 'sent': 'the kid wearing glasses'}, {'tokens': ['a', 'short', 'girl', 'standing', 'next', 'to', 'a', 'short', 'horse', 'wearing', 'a', 'belt', 'buckle', 'and', 'glasses'], 'raw': 'A short girl standing next to a short horse wearing a belt buckle and glasses', 'sent_id': 46807, 'sent': 'a short girl standing next to a short horse wearing a belt buckle and glasses'}], 'file_name': 'COCO_train2014_000000563447_186920.jpg', 'category_id': 1, 'ann_id': 186920, 'sent_ids': [46806, 46807], 'ref_id': 22985}]\n", "[{'image_id': 404592, 'split': 'train', 'sentences': [{'tokens': ['a', 'man', 'sitting', 'on', 'a', 'couch', 'between', 'two', 'other', 'people'], 'raw': 'A man sitting on a couch between two other people.', 'sent_id': 37227, 'sent': 'a man sitting on a couch between two other people'}, {'tokens': ['a', 'man', 'with', 'black', 'hair', 'wearing', 'a', 'black', 'shirt', 'and', 'holding', 'an', 'apple', 'laptop', 'between', 'a', 'man', 'and', 'a', 'woman'], 'raw': 'A man with black hair wearing a black shirt and holding an apple laptop between a man and a woman.', 'sent_id': 37228, 'sent': 'a man with black hair wearing a black shirt and holding an apple laptop between a man and a woman'}], 'file_name': 'COCO_train2014_000000404592_203428.jpg', 'category_id': 1, 'ann_id': 203428, 'sent_ids': [37227, 37228], 'ref_id': 19287}]\n", "[{'image_id': 36041, 'split': 'train', 'sentences': [{'tokens': ['a', 'girl', 'uitting', 'the', 'bike', 'with', 'boy', 'friend'], 'raw': 'A GIRL UITTING THE BIKE WITH BOY FRIEND', 'sent_id': 75019, 'sent': 'a girl uitting the bike with boy friend'}, {'tokens': ['the', 'girl', 'on', 'the', 'red', 'scooter'], 'raw': 'The girl on the red scooter', 'sent_id': 75020, 'sent': 'the girl on the red scooter'}], 'file_name': 'COCO_train2014_000000036041_199362.jpg', 'category_id': 1, 'ann_id': 199362, 'sent_ids': [75019, 75020], 'ref_id': 33798}]\n", "[{'image_id': 58105, 'split': 'train', 'sentences': [{'tokens': ['upside', 'down', 'chair'], 'raw': 'upside down chair', 'sent_id': 15047, 'sent': 'upside down chair'}, {'tokens': ['the', 'upside', 'down', 'chair'], 'raw': 'The upside down chair.', 'sent_id': 15048, 'sent': 'the upside down chair'}], 'file_name': 'COCO_train2014_000000058105_1587145.jpg', 'category_id': 62, 'ann_id': 1587145, 'sent_ids': [15047, 15048], 'ref_id': 10822}]\n", "[{'image_id': 309386, 'split': 'train', 'sentences': [{'tokens': ['a', 'food', 'on', 'tabule'], 'raw': 'a food on tabule', 'sent_id': 62106, 'sent': 'a food on tabule'}, {'tokens': ['a', 'table', 'with', 'pizza', 'slices', 'and', 'beer', 'on', 'it'], 'raw': 'A table with pizza slices and beer on it.', 'sent_id': 62107, 'sent': 'a table with pizza slices and beer on it'}], 'file_name': 'COCO_train2014_000000309386_1091316.jpg', 'category_id': 67, 'ann_id': 1091316, 'sent_ids': [62106, 62107], 'ref_id': 28845}][{'image_id': 419062, 'split': 'train', 'sentences': [{'tokens': ['a', 'medium', 'elephant', 'on', 'the', 'left'], 'raw': 'a medium elephant on the left', 'sent_id': 73909, 'sent': 'a medium elephant on the left'}, {'tokens': ['elephant', 'on', 'shore'], 'raw': 'elephant on shore', 'sent_id': 73910, 'sent': 'elephant on shore'}], 'file_name': 'COCO_train2014_000000419062_580921.jpg', 'category_id': 22, 'ann_id': 580921, 'sent_ids': [73909, 73910], 'ref_id': 33380}]\n", "\n", "[{'image_id': 325837, 'split': 'train', 'sentences': [{'tokens': ['a', 'glass', 'window', 'pain', 'behind', 'a', 'man', \"'\", 's'], 'raw': \"a glass window pain behind a man's\", 'sent_id': 68994, 'sent': \"a glass window pain behind a man ' s\"}, {'tokens': ['a', 'window', 'right', 'behind', 'the', 'man', \"'\", 's', 'head'], 'raw': \"a window right behind the man's head\", 'sent_id': 68995, 'sent': \"a window right behind the man ' s head\"}], 'file_name': 'COCO_train2014_000000325837_1732077.jpg', 'category_id': 1, 'ann_id': 1732077, 'sent_ids': [68994, 68995], 'ref_id': 31514}]\n", "[{'image_id': 258727, 'split': 'train', 'sentences': [{'tokens': ['a', 'sheep', 'eating', 'grass', 'facing', 'away', 'from', 'the', 'camera', 'and', 'closer', 'to', 'the', 'building'], 'raw': 'A sheep eating grass facing away from the camera and closer to the building.', 'sent_id': 95715, 'sent': 'a sheep eating grass facing away from the camera and closer to the building'}, {'tokens': ['there', 'is', 'one', 'sheep', 'is', 'eating', 'grass', 'infront', 'of', 'a', 'home'], 'raw': 'There is one sheep is eating grass infront of a home', 'sent_id': 95716, 'sent': 'there is one sheep is eating grass infront of a home'}], 'file_name': 'COCO_train2014_000000258727_62432.jpg', 'category_id': 20, 'ann_id': 62432, 'sent_ids': [95715, 95716], 'ref_id': 41806}]\n", "[{'image_id': 15262, 'split': 'train', 'sentences': [{'tokens': ['a', 'fork', 'on', 'a', 'plate'], 'raw': 'A fork on a plate', 'sent_id': 21138, 'sent': 'a fork on a plate'}, {'tokens': ['a', 'silver', 'fork'], 'raw': 'a silver fork', 'sent_id': 21139, 'sent': 'a silver fork'}], 'file_name': 'COCO_train2014_000000015262_1889611.jpg', 'category_id': 48, 'ann_id': 1889611, 'sent_ids': [21138, 21139], 'ref_id': 13163}]\n", "[{'image_id': 62336, 'split': 'train', 'sentences': [{'tokens': ['the', 'man', 'in', 'the', 'black', 'pullover', 'jacket', 'sitting', 'on', 'the', 'right'], 'raw': 'the man in the black pullover jacket sitting on the right', 'sent_id': 36534, 'sent': 'the man in the black pullover jacket sitting on the right'}, {'tokens': ['a', 'man', 'in', 'a', 'black', 'jacket', 'with', 'his', 'eyes', 'closed', ',', 'drinking', 'from', 'a', 'glass', 'of', 'wine'], 'raw': 'A man in a black jacket with his eyes closed, drinking from a glass of wine', 'sent_id': 36535, 'sent': 'a man in a black jacket with his eyes closed , drinking from a glass of wine'}], 'file_name': 'COCO_train2014_000000062336_1716597.jpg', 'category_id': 1, 'ann_id': 1716597, 'sent_ids': [36534, 36535], 'ref_id': 19021}]\n", "torch.Size([8, 3, 480, 480])\n", "torch.Size([8, 480, 480])\n", "torch.Size([8, 1, 20])\n", "torch.Size([8, 1, 20])\n", "tensor([[1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]])\n" ] } ], "source": [ "# sample datas\n", "for i, (img, target, tensor_embeddings, attention_mask) in enumerate(data_loader):\n", " print(img.shape)\n", " print(target.shape)\n", " print(tensor_embeddings.shape)\n", " print(attention_mask.shape)\n", " print(attention_mask[0])\n", " break" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "image/png": "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vvrqK8V40/T0dMTGxuLDDz8s93bDwsKwefNm7N69G3Z2dopxr/b29rC2toa9vT3GjBmDKVOmwMHBARKJBBMnToSfnx9nLCAiIiKqZrQKsoIgYMaMGZgxY4bKMkdHR63Hx65YsQIA4O/vr9S+Zs0ajBo1CgDw7bffwsTEBIMHD0ZBQQF69uyJ5cuXa7U/IiIiIjJeWgXZZxUUFODhw4dwcnKChYVFhbYlimKpfaysrLBs2TIsW7asQvsiIiIiIuOm9Stq4+PjERAQADs7O3h4eChmF0hLS0P37t1x8OBBnRVJRERERPQ8rYLsuXPn0LlzZ9y8eRMhISFKy5ydnfH48WOsW7dOJwUSEREREamjVZD9/PPP4ebmhkuXLmH+/PkqQwK6d++O06dP66RAIiIiIiJ1tAqyx44dw9ixY2FrawtBEFSWe3h4ICkpqcLFERERERFpolWQzc/PL/GFB2V9GwMRERERkba0CrINGjRAXFycxuWHDx+Gj4+P1kUREREREZVGqyA7YsQIbNiwQWlmguIhBosWLUJkZCTeeust3VRIRERERKSGVvPIfvjhh4iKikLPnj3h7e0NQRAQHh6OBw8eICUlBYGBgfi///s/XddKRERERKSg1R1ZCwsLREVF4ZtvvoG1tTWsrKxw7do11K5dGwsXLsTevXthYqL1FLVERERERKXS+s1eZmZmCA8PR3h4uC7rISIiIiIqE942JSIiIiKjVKY7sjExMVptvEuXLlqtR0RERERUmjIFWX9/f7UvPtBEFEUIgoDCwkKtCyMiIiIiKkmZguyaNWsquw4iIiIionIpU5ANDQ2t7DqIiIiIiMqFD3sRERERkVHSevotANi6dSt27tyJW7duAQDq16+P1157DUOHDtVJcUREREREmmgVZHNzczFw4EAcPnwYoiiiZs2aAIAzZ85g69at+PHHHxEREYEaNWroslYiIiIiIgWthhZ8+umnOHToECZOnIikpCRkZGQgIyMDSUlJmDhxIo4cOYJPP/1U17USERERESloFWR/++03DBkyBEuWLIGLi4ui3cXFBUuWLMHgwYPx22+/6axIIiIiIqLnaRVkpVIpunXrpnF5QEAApFKp1kUREREREZVGqyDbvHlzXL9+XePy69evo1mzZloXRURERERUGq0e9po7dy5ee+01+Pv7o1+/fkrLdu/ejZ9//hm7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CIKAwsLCChdIRERERKSOVkF20qRJWL16NXr37o2AgAA4Ojrqui4iIiIiohJpFWR37tyJN954A5s2bdJ1PUREREREZaLVw175+fnw9/fXcSlERERERGWnVZB99dVXcf36dV3XQkRERERUZloF2fnz52PNmjU4e/asrushIiIiIiqTMo2RHT16tEpb3bp10b59e/j5+aF+/fowNTVVWi4IAlavXq2bKomIiIiInlOmIFvSm7xOnDiBEydOqLQzyBIRERFRZSpTkJXL5ZVdBxERERFRufAVtURERERklBhkiYiIiMgoafVChICAgBKXC4IAa2treHh4ICgoCAMGDIAgCFoVSERERESkjlZB9tatW3j8+DEePHgAAKhZsyYAIDMzEwDg5OQEuVyOP//8Ez/++CM6duyIffv2oUaNGjopmoiIiIhIq6EFR48ehY2NDaZOnYrU1FRkZGQgIyMDqamp+PDDD1GjRg2cPXsWDx8+xJQpU3D8+HF88cUXuq6diIiIiKoxrYJseHg4OnbsiAULFsDJyUnR7uTkhIULF8LPzw/h4eFwcHDA119/jT59+uD333/XWdFERERERFoF2cOHD6Nz584al3fu3BmHDx9WfO7Rowf+/fdfbXZFRERERKSW1rMWXLlypcRloij+bycmJrC2ttZ2V0REREREKrQKsj169MCKFSuwZcsWlWW//vorVq5cicDAQEVbfHw86tWrp3WRRERERETP0yrILl68GE5OTnjzzTdRt25d+Pv7w9/fH3Xr1sXIkSNRu3ZtLFq0CACQn5+PO3fuICQkpNTtxsTEoF+/fnBzc4MgCNi1a5fSclEU8fnnn8PV1RXW1tbo0aMHrl+/rs0hEBEREZGR0yrIenp64p9//sEHH3wAiUSCv/76C3/99Rfs7OzwwQcf4J9//oGnpycAwMrKCocPH0Z4eHip283NzUWLFi2wbNkytcsXLlyI7777DitXrsRff/2FGjVqoGfPnsjPz9fmMIiIiIjIiGk1jywAODg4YOHChVi4cKHOiunVqxd69eqldpkoiliyZAk+++wzDBgwAACwfv161KlTB7t27cLw4cN1VgcRERERGT6tg+yLlpiYiJSUFPTo0UPRZm9vj3bt2uHUqVMag2xBQQEKCgoUn6VSKQBAJpNBJpNVbtFkUIqvN687GTJ+Tw0Hr4VmVfXcGONxGWrN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ZI8cOVLZdRARERERlUuZgmzXrl1x9+5dODk5caYCIiIiIjIIZX7Yy8vLCzt37qzMWoiIiIiIyqzMQVbd+FgiIiIiIn3RavotIiIiIiJ9Y5AlIiIiIqNUpoe9ih07dgxPnz4tc39Ov0VERERElaVcQfann37CTz/9VGo/URQ5jywRERERVapyBdlx48ahffv2lVULEREREVGZlSvIdu7cGSNGjKisWoiIiIiIyowPexERERGRUWKQJSIiIiKjxCBLREREREapzGNk5XJ5ZdZBRERERFQuvCNLREREREaJQZaIiIiIjBKDLBEREREZJQZZIiIiKrNCuYjTiRkAgNOJGSiUi3quiKozBlkiIiIqk8iLyei04DBGrzsDABi97gw6LTiMyIvJeq6MqisGWSIiIipV5MVkjN8Yj+SsfKX2lKx8jN8YzzBLesEgS0RERCUqlIuYvScB6gYRFLfN3pPAYQb0wjHIEhERUYlOJ2ao3Il9lgggOStfMXaW6EVhkCUiIqISpWVrDrHa9CPSFQZZIiIiKpGznZVO+xHpCoMsERERlaitlwNc7a0gaFguAHC1t0JbL4cXWRYRgywRERGVzNREwMx+PgCgEmaLP8/s5wNTE01Rl6hyMMgSERFRqYJ9XbFiZCu42CsPH3Cxt8KKka0Q7Ouqp8qoOjPTdwFERERkHIJ9XRHo44LYG2l4eDkWv4S2QfuGzrwTS3rDO7JERERUZqYmgmIsbFsvB4ZY0isGWSIiIiIySgyyRERERGSUGGSJiIiIyCgxyBIRERGRUWKQJSIiIiKjxCBLREREREaJQZaIiIiIjBKDLBEREREZJQZZIiIiIjJKDLJEREREZJQYZImIiIjIKDHIEhEREZFRYpAlIiIiIqPEIEtERERERolBloiIiIiMEoMsERERERklBlkiIiIiMkoMskRERERklBhkiYiIiMgoMcgSERERkVFikCUiIiIio8QgS0RERERGiUGWiIiIiIwSgywRERERGSUGWSIiIiIySgyyRERERGSUGGSJiIiIyCgxyBIRERGRUWKQJSIiIiKjxCBLREREREaJQZaIiIiIjBKDLBEREREZJQZZIiIiIjJKDLJEREREZJQYZImIiIjIKDHIEhEREZFRYpAlIiIiIqPEIEtERERERolBloiIiIiMEoMsERERERklBlkiIiIiMkoMskRERERk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cdtltXz5cgQFBeGll16ChYUFXF1dMXLkSNy+fVvR58mTJ3ByckLHjh3VbuPrr7+GIAiIiYlRtBUUFOCrr75C06ZNYWVlhZo1a6Jfv374+++/ldYtHpqydu1aLFu2THEuvvnmGwDApUuXMGTIELz00kuwtLSEi4sLunXrhj/++EMnx09E+sGhBURkUARBwPz58xEYGIgvv/wSixcv1vk+QkNDYWtri08++QQPHjzAokWL0LNnT8yZMwcfffQRxo8fj9GjR2P16tV499134ePjg06dOiltIz4+Htu3b8fYsWMREhKCI0eO4LvvvsPFixcRFRUFE5Oi+wRZWVno0KED7t69i9GjR6Np06ZITk7G8uXL0a5dO5w9exaenp5K2/7www8hk8kwduxYSCQSNG7cuMTjefPNN7F161YEBgZi/PjxSElJwbJly+Dn54djx46hZcuW6NKlCzZs2IDw8HDUrl0bn376KQCgefPmOjmn33zzDdq3b4/3338fDg4OuHjxIn7++WccPnwYFy5cgKOjIywsLBAaGopFixbh6tWrKsf1yy+/4OWXX0aXLl0AADKZDMHBwTh58iTeeustTJgwAVlZWVi1ahU6duyImJgYvPrqq0rbWLJkCdLT0zF27Fi4uLjA3d0d6enpCAgIAAC899578PT0xMOHD3H27Fn89ddf6NOnj07OARHpgUhEZACOHDkiAhC//vprURRFMTAwULS0tBRv376t6ANA7NOnj9J6AMTQ0FCV7a1Zs0YEIB45ckTRNnPmTBGA2LdvX1Eulyvaly5dKgIQ7ezsxLt37yra09LSREtLS3H48OEq+wQg7ty5U6n9/fffFwGIv/76q1KblZWVeO7cOaW+t2/fFu3s7JRqL6755ZdfFnNzc9WfqOccOHBABCAOHTpU6ZjOnTsnmpqaip06dVLq7+npKXbt2rVM2xZF9edcnZycHJW2gwcPigDEBQsWKNquXr0qAhCnTp2q1Pf48eMqfRcvXiwCECMjI5X6ZmVlie7u7krHUfz9qVWrlpiamqrUf/fu3SIA8bfffiv1OIjIuHBoAREZpAULFuDJkyeYMWOGzrf9/vvvQxAExefOnTsDAPr37w93d3dFu5OTExo3bozr16+rbKNx48YYOHCgUtvHH38MANi5cyeAojGamzZtQpcuXfDSSy/h4cOHij81atRA+/btceDA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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "from matplotlib.ticker import MaxNLocator, FormatStrFormatter\n", "\n", "# Data from the table\n", "models = ['eqV2-S', 'eqV2-M', 'eqV2-L'] \n", "layers = [2, 4, 8, 3, 6, 12, 5, 10, 20]\n", "original_layers = [8, 12, 20]\n", "original_throughput = [9.4, 7.4, 4.9]\n", "ours_throughput = [40.4, 28.7, 16.8, 31.6, 22.3, 13.9, 24.1, 15.8, 9.4]\n", "\n", "# Create the plot\n", "fig, ax = plt.subplots(figsize=(8, 6))\n", "ax.scatter(original_layers, original_throughput, label='Original')\n", "ax.scatter(layers, ours_throughput, label='Ours')\n", "ax.set_xscale('log', base=2)\n", "ax.set_yscale('log',base=2)\n", "ax.set_title('Throughput Comparison', fontsize=16)\n", "ax.set_xlabel('Number of Layers', fontsize=13)\n", "ax.set_ylabel('Throughput (samples/sec)', fontsize=13)\n", "ax.legend(fontsize=12)\n", "\n", "# Set the tick locator and formatter to show integer values\n", "ax.xaxis.set_major_locator(MaxNLocator(integer=True))\n", "ax.xaxis.set_major_formatter(FormatStrFormatter('%.0f'))\n", "ax.yaxis.set_major_locator(MaxNLocator(integer=True))\n", "ax.yaxis.set_major_formatter(FormatStrFormatter('%.0f'))\n", "ax.grid(True)\n", "\n", "plt.show()" ] } ], "metadata": { "kernelspec": { "display_name": "lavt", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.21" } }, "nbformat": 4, "nbformat_minor": 2 }